1.簡單分組
GroupBy什么就Select什么
SELECT Name,Score
From StudentScore
GROUP BY Name,Score
2.聚合函數(MAX SUM AVG COUNT)
(1)計算
1.表的全部字段都可以用聚合函數,但是篩選聚合函數的結果要用Having關鍵字
2.聚合函數默認排除Null值
ID | Name | Score |
1 | 小蘇 | 100 |
2 | 小蘇 | 92 |
3 | 小蘇 | 80 |
4 | 小軍 | 50 |
5 | 小軍 | NULL |
6 | 小軍 | 62 |
7 | 小紅 | 98 |
8 | 小紅 | 85 |
9 | 小紅 | 90 |
SELECTName,SUM(Score) AS AllScore,AVG(Score) AS AverageScore,MAX(Score) AS MaxScore,MIN(Score) AS MinScore,Count(Score) As ExamCount,COUNT(CASE WHEN Score >= 60 THEN 1 END) AS PassedCount
FROM StudentScore
GROUP BY Name;
?查詢結果(結論:聚合函數默認排除Null值):
(2)條數查詢
1.現代數據庫中,COUNT(1) 和 COUNT(*) 查詢結果一致,效率一致
2.Count(字段) 查的是?該分組?中這個字段?≠? NULL 的條數
3.Count(非分組字段) 中,重復的非 NULL 值都會被算進去,COUNT(DISTINCT 非分組字段) 則計算的是非NULL非重復的條數,簡而言之,COUNT里面加DISTINCT,結果會更少
SELECTName -- 分組字段1,Score -- 分組字段2,Count(Name) As NameCount -- 該分組中 Name ≠ NULL 的條數,Count(Score) As ScoreCount-- 該分組中 Score ≠ NULL 的條數,COUNT(1) -- 該分組中的條數(不看字段的值),COUNT(*) -- 該分組中的條數(不看字段的值)
FROM StudentScore
GROUP BY Name,Score;
【不分組全查】
SELECT COUNT(1) FROM StudentScore; --不分組,查全表條數
3.非聚合字段查詢
【錯誤的寫法】根據標題一,Group字段 和 Select字段 不一致會報錯(但是我想顯示出Score)
SELECT Name, Age, ScoreFROM PERSONGROUP BY Name, Age;
【方法一】取分組的MAX值
SELECT Name, Age, MAX(SCORE) AS ScoreFROM PERSONGROUP BY Name, Age;
【方法二】子查詢(不推薦,不一定是唯一的)
SELECT Name,Age,(SELECT SCORE FROM SCORETABLE WHERE NAME=NAME) AS ScoreFROM PERSONGROUP BY Name,Age
4.聚合結果字段、別名字段查詢
【引入】
SELECT ID,NAME,MAX(SCORE),(SELECT Code FROM TABLE2 WHERE ID = ID) AS Code
FROM TABLE
WHERE Code=500 AND SCORE > 60
GROUP BYID,NAME
這個SQL是不對的,不能對聚合函數和別名字段直接篩選,且ID=ID有歧義,解決方案有兩個:
(1)SQL外包一層
SELECT * FROM (你的SQL) AS SubQuery WHERE 你的SQL的條件
SELECT *
FROM (SELECT ID,NAME,MAX(SCORE) AS MaxScore,(SELECT Code FROM TABLE2 WHERE ID = T.ID) AS Code --注意這里ID = T.ID 的 T 指代表名很重要FROM TABLE TGROUP BY ID, NAME
) AS SubQuery
WHERE Code = 500 AND MaxScore > 60;
--【注】包完之后一定要 'AS SubQuery',否則報錯
(2)Having關鍵字
對于?聚合函數的結果?用?Having?篩選,對于別名字段在?子查詢SQL?中過濾
SELECT ID,NAME,MAX(SCORE) AS MaxScore,(SELECT Code FROM TABLE2 WHERE ID = T.ID AND Code = 500) AS Code --注意這里ID = T.ID 的 T 指代表名很重要
FROM TABLE T
GROUP BY ID, NAME
HAVING MAX(SCORE) > 60;
--【注】HAVING SCORE > 60 是不對的。