服務端命令SQL
在資料庫系統中,SQL語句不區分大小寫(建議用大寫)
SQL語句可單行或多行書寫,以“;”結尾
關鍵詞不能跨多行或簡寫
用空格和縮排來提高語句的可讀性
子句通常位於獨立行,便於編輯,提高可讀性
註釋:
SQL標準:
/*註釋內容*/ 多行註釋
— 註釋內容 單行註釋,注意有空格
MySQL註釋:
#
SQL優化
查詢時,能不要*就不用*,儘量寫全欄位名
大部分情況連線效率遠大於子查詢
多表連線時,儘量小表驅動大表,即小表 join 大表
在千萬級分頁時使用limit
對於經常使用的查詢,可以開啟快取
多使用explain和profile分析查詢語句
檢視慢查詢日誌,找出執行時間長的sql語句優化
sql查詢:單表查詢和多表查詢
兩張表合併:橫向合併、縱向合併
縱向合併:兩張表挑出相同的欄位進行合併(注意順序)
範例
SQL查詢範例
1、給表的欄位名新增別名
select stuid as 學生編號,name 姓名,gender 性別 from students;
2、查詢年齡大於40的
select * from students where age >40;
3、查詢年齡大於20小於40的
select * from students where age < 40 and age > 20;
select * from students where age between 20 and 40;(這種是包含)
4、查詢以姓名以X開頭的
select * from students where name like `x%`;
5、查詢欄位中為空值得資訊
select * from students where classid is null;
6、查詢欄位值不為空得資訊
select * from students where classid is not null;
7、查詢報1,2,6班得學生資訊
select * from students where classid in (1,2,6);
8、查詢年齡,並去掉重複得年齡
select distinct age from students;
9、查詢年齡,去掉重複並排序
select distinct age from students order by age;(預設正序)
select distinct age from students order by age desc;(倒敘)
10、統計students表總共有多少行
select count(*) from students;
11、統計age年齡的總和
select sum(age) from students;
12、統計年齡最大的
select max(age) from students;
13、統計男女平均年齡
select gender,avg(age) from students group by gender;
14、分別統計每班的女生男生平均成績(gender性別classid班級age成績)
select gender,classid,avg(age) from students group by gender, classid;
15、基於上條再統計女生的最大年齡
select gender,max(age) from students group by gender having gender=`f`;
備註:分完組後再條件用having不能用where
16、按照課程統計沒課考試最好的成績
select courseid,max(score) as 最好成績 from scores group by courseid;
17、取排序的前3名
select age from students order by age desc limit 3;
18、基於排序跳過2個顯示3個
select age from students order by age desc limit 2,3;
多表
1、縱向合併兩張表 select stuid as id,name,age,gender from students union select tid,name,age,gender from teachers; 2、基於上條查詢 查詢age欄位大於50的資訊 select * from (select stuid as id,name,age,gender from students union select tid,name,age,gender from teachers)as b where b.age >50; 備註:利用了子查詢
子查詢:
查詢比平均年齡大的資訊 select name,age from students where age >(select avg(age) from students);
交叉連結
兩張表交叉連結組合 select * from students cross join teachers;
內連線
取兩張表的交集實現查詢出學生對應的老師 select s.name as 學生name,t.name as 老師name from students as s inner join teachers as t on s.teacherid=t.tid; 備註:因為兩種表有相同的欄位,為了群分開給它加別名as,
左外連結
兩張表A 和 B , 取A表和B表的與A表相關的部分,A加B的一部分 select stuid,s.name,s.age,s.gender,classid,teacherid,tid,t.name,t.age,t.gender from students as s left join teachers as t on s.teacherid=t.tid;
有這樣一個表emp
公司人員資訊,即對應的領導–(leaderid領導編號)
id | name | leaderid |
1 | xiaoming | null |
2 | wanger | 1 |
3 | zhangsan | 2 |
4 | lisi | 3 |
現在有這樣一個需求,查詢每個人員對應的領導是誰
把emp表當作兩張表來處理,自連結
select e.name as emp,l.name as leader from emp as e left outer join emp as l on e.leaderid=1.id;