該篇文章主要是對mysql的查漏補缺,該篇包括:
- 排序和限制
- 聚合
- 表聯結
- 子查詢與聯合
排序和限制
使用關鍵字 order by
和limit
;
//排序
select *
from tablename
[where condition]
[order by field1 [desc/asc],field2 [desc/asc],...,fieldn [desc/asc]]複製程式碼
說明:
order by
後面可以跟多個不同的排序欄位,並且每一個排序欄位可以有不同的排序順序;- 如果排序欄位的值一樣,則相同的欄位按照第二個排序欄位進行排序。
\\限制查詢
select ... [limit offset_start,row_count]複製程式碼
說明
- offset_start表示記錄起始偏移值,row_count表示要查詢的記錄行數。預設offset_start=0,所以可以這麼寫(limit 100,即offset_start=0;row_count=100);
limit
經常與order by
一起使用進行記錄的分頁顯示;limit
屬於MySQL擴充套件SQL92的語法,在其他資料庫上並不能通用。
聚合
使用關鍵字聚合函式(sum/count/max/min等)
、group by
、with rollup
、having
等。
select [field1,...,fieldn] fun_name
from tablename
[where where_condition]
[group by field1,...,field2 [with rollup]]
[having where_condition]複製程式碼
說明
- fun_name表示聚合函式,如sum(field)/count(1)/max(field)/min(field);
group by
表示要進行分類聚合的欄位;with rollup
,表示對分類聚合的結果進行再彙總;having
表示對分類後的結果再進行條件過濾。
舉例
例一
# 在使用者表上,統計各個部門的人數
select department,count(1)
from users
group by department複製程式碼
department | count(1) |
---|---|
人事部 | 5 |
研發部 | 10 |
總裁 | 3 |
例二
# 統計各個部門人數,又要統計總人數
select department,count(1)
from users
group by department
with rollup;複製程式碼
department | count(1) |
---|---|
人事部 | 5 |
研發部 | 10 |
總裁 | 3 |
null | 18 |
例三
# 統計人數大於5的部門
select department,count(1)
from users
group by department
having count(1)>5;複製程式碼
department | count(1) |
---|---|
研發部 | 10 |
表聯結
使用關鍵詞join
、left join
、right join
、on
等
select t1.feild1...
from table1 t1 [left/right] join table2 t2
on t1.fieldn = t2.fieldm
where where_condition複製程式碼
說明
- 表連線分為
內聯結
和外聯結
,他們之間主要區別:內聯結僅選擇兩張表中互相匹配的記錄,而外聯結會包含其他不匹配的記錄; - 外聯結分為
左聯結
和右聯結
;左聯結包含所有左邊表中的記錄甚至右邊表中沒有和它匹配的記錄,右聯結相反。
子查詢與聯合
使用關鍵字in/not in
、=/!=
、exists/not exists
、union
、union all
。
# 子查詢形如
select * from table1
where department in(select department
from table2
where where_condition)
#聯合
select * from table1
union [all]
select * from table2
...
union [all]
select * from tablen;複製程式碼
說明
- 子查詢可以轉化為表聯結;
- 表聯結在很多情況下要優於子查詢;
- union和union all的主要區別是union all 把結果集直接合並在一起,有可能有重複記錄;union 是把union all的結果進行一次distinct,去除重複記錄後的結果。