重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
/*語法:
創新互聯主要從事網站設計、網站制作、網頁設計、企業做網站、公司建網站等業務。立足成都服務湖南,10多年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:18980820575
select 分組函數 列(要求出現在group by的后面)
from 表
【where 篩選條件】
group by 分組的列表
[order by 子句]
注意:查詢列表必須特殊,要求是分組函數和group by 后出現的字段
特點:
1.分組查詢中篩選條件分為兩類:
數據源 位置 關鍵字
分組前篩選 原始表 group by子句的前面 where
分組后篩選 分組后的結果集 group by子句的后面 having
1.分組函數做條件肯定是放在having子句中
2.能用分組前篩選的,優先考慮使用分組前篩選
2.group by 子句支持單個字段、多個字段分組(用逗號隔開沒有順序要求)表達式或函數(用的較少)
3.也可以添加排序(放在整個group by子句之后)
*/
count(1),其實就是計算一共有多少符合條件的行。
1并不是表示第一個字段,而是表示一個固定值。
其實就可以想成表中有這么一個字段,這個字段就是固定值1,count(1),就是計算一共有多少個1.
同理,count(2),也可以,得到的值完全一樣,count('x'),count('y')都是可以的。一樣的理解方式。在你這個語句理都可以使用,返回的值完全是一樣的。就是計數。
count(*),執行時會把星號翻譯成字段的具體名字,效果也是一樣的,不過多了一個翻譯的動作,比固定值的方式效率稍微低一些。
查詢每門科目的前3名。
對于查詢的結果,一般有兩種情況。
表所有數據為:
情況1:對于分數相同的人,其后面的人 緊跟著名次排,直到排夠名次3,就不再往后取了。
情況2:對于分數相同的人,若當前相同名次的人數大于或等于 3, 則相同分數其后面的人不再參于top3了。
在情況2中 ,為什么”李四 - java“ 這行沒有了呢?
可以這樣理解,在情況2中相當于使用了 名次空缺 , 分數相同的人其后面那個人,的名次為 前面的人數+1 , 這里的 ”李四-java“這行,他的名次應當是 5 , 所有top3自然取不到 ”李四-java“這行。
情況2和情況 寫法都是對應的, 需要注意的是 并列名次,后面的人 是否需要保持名次空缺。那么統計的時候就需要根據情況去重。
參考鏈接:
MySQL GROUP BY 子句
GROUP BY 語句根據一個或多個列對結果集進行分組。在分組的列上我們可以使用 COUNT, SUM, AVG,等函數。
具體語法參考:
from 樹懶學堂 - 一站式數據知識平臺