根據(jù)以往的MySQL使用經(jīng)驗總結(jié)了一些常用模型岗钩。
一鱼响、 “最”值問題
- 全局最值:使用聚合函數(shù)如
max、min
- 組中最值:在1的基礎(chǔ)上搭配
group by
- 組間最值:
- 法一:在2的基礎(chǔ)上搭配
having
药版,使用some/any/all
實現(xiàn)組的比較 - 法二: 在2的基礎(chǔ)上使用子查詢
- 法一:在2的基礎(chǔ)上搭配
where 的篩選粒度為每一條記錄韭畸,過濾行;having的篩選粒度為每一組砾莱,過濾組
二瑞筐、排序問題
- 全局排序:
- 法一:
order by a, b
- 法二:使用開窗函數(shù),
rank() over(partition by … order by …)
- 法三:自聯(lián)結(jié)生成笛卡爾積腊瑟,通過
where
實現(xiàn)字段值篩選聚假,借助group by块蚌、count
獲得排名列
- 法一:
- 組內(nèi)排序(不聚合):
group by
搭配開窗函數(shù),同上 - 前n問題:
- 法一:在開窗函數(shù)基礎(chǔ)上比較
rank
值 - 法二:在 笛卡爾積基礎(chǔ)上比較
having count(col) <=n
值
- 法一:在開窗函數(shù)基礎(chǔ)上比較
三膘格、連續(xù)問題
- 連續(xù)n次問題:n表錯位聯(lián)結(jié)峭范,行滿足 id,id+1瘪贱,id+2…同時滿足該行對應(yīng)的n個表的值相等(where)
- 連續(xù)n次>值:在1基礎(chǔ)上選取
- 連續(xù)n次>值>關(guān)系:在1基礎(chǔ)上使用where
四纱控、重復(fù)問題
- 去除全局重復(fù)值:
select distinct x
- 去除組內(nèi)重復(fù)值:
count distinct y
五、比較問題
- 組比較:
having
搭配搭配聚合函數(shù) - 行比較:聯(lián)結(jié)后使用
where
- 行與組的比較:
- 法一:聚合后與表聯(lián)結(jié)菜秦,然后使用
where
甜害,可用 - 法二:聚合后放入
where
子查詢中 - 法三:直接使用開窗函數(shù),然后進(jìn)行同行比較球昨,開窗函數(shù)需要建立新列
- 法一:聚合后與表聯(lián)結(jié)菜秦,然后使用
六尔店、分組問題
- 查詢多種聚合值:直接通過普通聚合函數(shù)實現(xiàn)
- 需要查詢多種聚合值,同時每種聚合值還需要組內(nèi)篩選:在查詢的聚合函數(shù)中添加條件(嵌套子查詢或
case when
) - 查詢一種聚合值:直接使用聚合函數(shù)或在此基礎(chǔ)上用
having
過濾組