分組查詢GROUP BY的使用與SQL執(zhí)行順序的講解
在SQL中使用GROUP BY來(lái)對(duì)SELECT的結(jié)果進(jìn)行數(shù)據(jù)分組,在具體使用GROUP BY之前需要知道一些重要的規(guī)定。
- 1、GROUP BY子句可以包含任意數(shù)目的列。也就是說(shuō)可以在組里再分組,為數(shù)據(jù)分組提供更細(xì)致的控制。
- 2、如果在GROUP BY子句中指定多個(gè)分組,數(shù)據(jù)將在最后指定的分組上匯總。
- 3、GROUP BY子句中列出的每個(gè)列都必須是檢索列或有效的表達(dá)式(但不能是聚集函數(shù))。如果在SELECT中使用了表達(dá)式,則必須在GROUP BY子句中指定相同的表達(dá)式。不能使用別名。
- 4、出了聚集計(jì)算語(yǔ)句外,SELECT語(yǔ)句中的每一列都必須在GROUP BY子句中給出。
- 5、如果分組列中有NULL值,則NULL將作為一個(gè)分組返回。如果有多行NULL值,它們將分為一組。
- 6、GROUP BY子句必須在WHERE子句之后,ORDER BY之前。
過(guò)濾分組
對(duì)分組過(guò)于采用HAVING子句。HAVING子句支持所有WHERE的操作。HAVING與WHERE的區(qū)別在于WHERE是過(guò)濾行的,而HAVING是用來(lái)過(guò)濾分組。
另一種理解WHERE與HAVING的區(qū)別的方法是,WHERE在分組之前過(guò)濾,而HAVING在分組之后以每組為單位過(guò)濾。
分組與排序
一般在使用GROUP BY子句時(shí),也應(yīng)該使用ORDER BY子句。這是保證數(shù)據(jù)正確排序的唯一方法。
SQL SELECT語(yǔ)句的執(zhí)行順序:
- 1、from子句組裝來(lái)自不同數(shù)據(jù)源的數(shù)據(jù);
- 2、where子句基于指定的條件對(duì)記錄行進(jìn)行篩選;
- 3、group by子句將數(shù)據(jù)劃分為多個(gè)分組;
- 4、使用聚集函數(shù)進(jìn)行計(jì)算;
- 5、使用having子句篩選分組;
- 6、計(jì)算所有的表達(dá)式;
- 7、使用order by對(duì)結(jié)果集進(jìn)行排序;
- 8、select 集合輸出。
舉個(gè)例子吧
select 考生姓名, max(總成績(jī)) as max總成績(jī) from tb_Grade where 考生姓名 is not null group by 考生姓名 having max(總成績(jī)) > 600 order by max總成績(jī)
在上面的示例中 SQL 語(yǔ)句的執(zhí)行順序如下:
- 1、首先執(zhí)行 FROM 子句, 從 tb_Grade 表組裝數(shù)據(jù)源的數(shù)據(jù)
- 2、執(zhí)行 WHERE 子句, 篩選 tb_Grade 表中所有數(shù)據(jù)不為 NULL 的數(shù)據(jù)
- 3、執(zhí)行 GROUP BY 子句, 把 tb_Grade 表按 "學(xué)生姓名" 列進(jìn)行分組
- 4、計(jì)算 max() 聚集函數(shù), 按 "總成績(jī)" 求出總成績(jī)中最大的一些數(shù)值
- 5、執(zhí)行 HAVING 子句, 篩選課程的總成績(jī)大于 600 分的.
- 6、執(zhí)行 ORDER BY 子句, 把最后的結(jié)果按 "Max 成績(jī)" 進(jìn)行排序.
注:如果使用了連接join和on,則會(huì)在where執(zhí)行之前先執(zhí)行on,然后執(zhí)行join,接著才去執(zhí)行where。
附:
MySQL中的聚集函數(shù):
- 1、count()返回某列的行數(shù)
- 2、avg()返回某列的平均值
- 3、max()返回某列的最大值
- 4、min()返回某列的最小值
- 5、sum()返回某列的和
- 6、distinct 去除重復(fù)值
注:avg()忽略值為null的行,count(*)時(shí)統(tǒng)計(jì)所有行,count(列)時(shí)忽略為null的行
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
如何解決mysqlimport: Error: 13, Can''t get stat of 的問(wèn)題
本篇文章是對(duì)解決mysqlimport: Error: 13, Can't get stat of問(wèn)題的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Mysql占用過(guò)高CPU時(shí)的優(yōu)化手段(必看)
下面小編就為大家?guī)?lái)一篇Mysql占用過(guò)高CPU時(shí)的優(yōu)化手段(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03MySql創(chuàng)建帶解釋的表及給表和字段加注釋的實(shí)現(xiàn)代碼
這篇文章主要介紹了MySql創(chuàng)建帶解釋的表以及給表和字段加注釋的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12MySQL兩種刪除用戶語(yǔ)句的區(qū)別(delete user和drop user)
這篇文章主要介紹了MySQL兩種刪除用戶語(yǔ)句的區(qū)別(delete user和drop user),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-11-11Can’t open file:''[Table]mytable.MYI''
也許很多人遇到過(guò)類似Can’t open file: ‘[Table]mytable.MYI’ 這樣的錯(cuò)誤信息,卻不知道怎么解決他,下面我們做個(gè)介紹,2011-01-01MySQL啟動(dòng)連接的命令以及與PHP程序連接的基本語(yǔ)法
這篇文章主要介紹了MySQL啟動(dòng)連接的命令以及與PHP程序連接的基本語(yǔ)法,簡(jiǎn)單講述了PHP中調(diào)用MySQL的方法,需要的朋友可以參考下2015-11-11MySQL利用profile分析慢sql詳解(group left join效率高于子查詢)
最近因?yàn)橐粋€(gè)用了子查詢的sql語(yǔ)句查詢很慢,嚴(yán)重影響了性能,所以需要進(jìn)行優(yōu)化,下面這篇文章主要跟大家介紹了關(guān)于MySQL利用profile分析慢sql的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2017-03-03