分組查詢GROUP BY的使用與SQL執行順序的講解
阿新 • • 發佈:2020-01-09
在SQL中使用GROUP BY來對SELECT的結果進行資料分組,在具體使用GROUP BY之前需要知道一些重要的規定。
- 1、GROUP BY子句可以包含任意數目的列。也就是說可以在組裡再分組,為資料分組提供更細緻的控制。
- 2、如果在GROUP BY子句中指定多個分組,資料將在最後指定的分組上彙總。
- 3、GROUP BY子句中列出的每個列都必須是檢索列或有效的表示式(但不能是聚集函式)。如果在SELECT中使用了表示式,則必須在GROUP BY子句中指定相同的表示式。不能使用別名。
- 4、出了聚集計算語句外,SELECT語句中的每一列都必須在GROUP BY子句中給出。
- 5、如果分組列中有NULL值,則NULL將作為一個分組返回。如果有多行NULL值,它們將分為一組。
- 6、GROUP BY子句必須在WHERE子句之後,ORDER BY之前。
過濾分組
對分組過於採用HAVING子句。HAVING子句支援所有WHERE的操作。HAVING與WHERE的區別在於WHERE是過濾行的,而HAVING是用來過濾分組。
另一種理解WHERE與HAVING的區別的方法是,WHERE在分組之前過濾,而HAVING在分組之後以每組為單位過濾。
分組與排序
一般在使用GROUP BY子句時,也應該使用ORDER BY子句。這是保證資料正確排序的唯一方法。
SQL SELECT語句的執行順序:
- 1、from子句組裝來自不同資料來源的資料;
- 2、where子句基於指定的條件對記錄行進行篩選;
- 3、group by子句將資料劃分為多個分組;
- 4、使用聚集函式進行計算;
- 5、使用having子句篩選分組;
- 6、計算所有的表示式;
- 7、使用order by對結果集進行排序;
- 8、select 集合輸出。
舉個例子吧
select 考生姓名,max(總成績) as max總成績 from tb_Grade where 考生姓名 is not null group by 考生姓名 having max(總成績) > 600 order by max總成績
在上面的示例中 SQL 語句的執行順序如下:
- 1、首先執行 FROM 子句,從 tb_Grade 表組裝資料來源的資料
- 2、執行 WHERE 子句,篩選 tb_Grade 表中所有資料不為 NULL 的資料
- 3、執行 GROUP BY 子句,把 tb_Grade 表按 "學生姓名" 列進行分組
- 4、計算 max() 聚集函式,按 "總成績" 求出總成績中最大的一些數值
- 5、執行 HAVING 子句,篩選課程的總成績大於 600 分的.
- 6、執行 ORDER BY 子句,把最後的結果按 "Max 成績" 進行排序.
注:如果使用了連線join和on,則會在where執行之前先執行on,然後執行join,接著才去執行where。
附:
MySQL中的聚集函式:
- 1、count()返回某列的行數
- 2、avg()返回某列的平均值
- 3、max()返回某列的最大值
- 4、min()返回某列的最小值
- 5、sum()返回某列的和
- 6、distinct 去除重複值
注:avg()忽略值為null的行,count(*)時統計所有行,count(列)時忽略為null的行
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結