該篇文章主要是對mysql的查漏補缺,該篇包括:
- 排序和限制
- 聚合
- 表聯(lián)結
- 子查詢與聯(lián)合
排序和限制
使用關鍵字 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表示要查詢的記錄行數(shù)松捉。默認offset_start=0,所以可以這么寫(limit 100,即offset_start=0;row_count=100)涩赢;
-
limit
經(jīng)常與order by
一起使用進行記錄的分頁顯示戈次; -
limit
屬于MySQL擴展SQL92的語法,在其他數(shù)據(jù)庫上并不能通用筒扒。
聚合
使用關鍵字聚合函數(shù)(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表示聚合函數(shù),如sum(field)/count(1)/max(field)/min(field);
-
group by
表示要進行分類聚合的字段冰蘑; -
with rollup
和泌,表示對分類聚合的結果進行再匯總; -
having
表示對分類后的結果再進行條件過濾祠肥。
舉例
例一
# 在用戶表上武氓,統(tǒng)計各個部門的人數(shù)
select department,count(1)
from users
group by department
department | count(1) |
---|---|
人事部 | 5 |
研發(fā)部 | 10 |
總裁 | 3 |
例二
# 統(tǒng)計各個部門人數(shù),又要統(tǒng)計總人數(shù)
select department,count(1)
from users
group by department
with rollup;
department | count(1) |
---|---|
人事部 | 5 |
研發(fā)部 | 10 |
總裁 | 3 |
null | 18 |
例三
# 統(tǒng)計人數(shù)大于5的部門
select department,count(1)
from users
group by department
having count(1)>5;
department | count(1) |
---|---|
研發(fā)部 | 10 |
表聯(lián)結
使用關鍵詞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
說明
- 表連接分為
內聯(lián)結
和外聯(lián)結
剂桥,他們之間主要區(qū)別:內聯(lián)結僅選擇兩張表中互相匹配的記錄忠烛,而外聯(lián)結會包含其他不匹配的記錄; - 外聯(lián)結分為
左聯(lián)結
和右聯(lián)結
权逗;左聯(lián)結包含所有左邊表中的記錄甚至右邊表中沒有和它匹配的記錄况木,右聯(lián)結相反垒拢。
子查詢與聯(lián)合
使用關鍵字in/not in
、=/!=
火惊、exists/not exists
求类、union
、union all
屹耐。
# 子查詢形如
select * from table1
where department in(select department
from table2
where where_condition)
#聯(lián)合
select * from table1
union [all]
select * from table2
...
union [all]
select * from tablen;
說明
- 子查詢可以轉化為表聯(lián)結尸疆;
- 表聯(lián)結在很多情況下要優(yōu)于子查詢;
- union和union all的主要區(qū)別是union all 把結果集直接合并在一起惶岭,有可能有重復記錄寿弱;union 是把union all的結果進行一次distinct,去除重復記錄后的結果。