一、匯總統計
1、聚集函數
COUNT() 計算總數
SUM() 求和
MAX() 最大值
MIN() 最小值
AVG() 平均值
2、聚集函數使用
總共有多少名學生? SELECT COUNT(*) FROM student; 所有學生的數學成績總和? SELECT SUM(score) FROM student; 所有學生的數學成績最高分? SELECT MAX(score) FROM student; 所有學生的數學成績最低分? SELECT MIN(score) FROM student; 所有學生的數學成績平均分? SELECT AVG(score) FROM student; ### 有多少名學生? SELECT COUNT(*) FROM student; 219 另一種寫法: SELECT COUNT(score) FROM student; 219 SELECT COUNT(student_id) FROM student; 219 SELECT COUNT(1) FROM student; 219 SELECT COUNT('ABC') FROM student; 219 SELECT COUNT(teacher_id) FROM student; 205 COUNT(teacher_id) 忽略掉了值為null的行; 同樣忽略值為NULL的行: SELECT MAX(score) FROM student; SELECT MIN(score) FROM student; SELECT SUM(score) FROM student; SELECT AVG(score) FROM student; count(*) 與count(1)比較: 如果你的數據表沒有主鍵,那么count(1)比count(*)快 如果有主鍵的話,那主鍵(聯合主鍵)作為count的條件也比count(*)要快 如果你的表只有一個字段的話那count(*)就是最快的啦 count(*) count(1) 兩者比較。主要還是要count(1)所相對應的數據字段。 如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因為count(*),自動會優化指定到那一個字段。所以沒必要去count(?),用count(*),sql會幫你完成優化的。 AVG(score) 等價於SUM(score)/COUNT(score)
3、分組匯總統計
關鍵字:GROUP BY 比如: 如何獲取每個班級的數學成績平均分(因為學生太多,這里先不計算成績在80分以下的學生),以便比較不同班級的成績? SELECT class_id,avg(score) FROM student WHERE score > 80 GROUP BY class_id; 注意:SELECT里除了使用聚集函數返回的字段外,其他所有的字段都必須原樣出現在GROUP BY的后面;
比如: 如何統計不同的交易所的總的買入金額? SELECT left(stock_code,2),sum(price*volume) FROM t_stock_trans_dtl WHERE opt_typ = '買入' GROUP BY left(stock_code,2); 比如: 如何統計不同的交易所的不同交易類型的總的交易金額? #根據多個字段分組 SELECT left(stock_code,2),opt_typ,sum(price*volume) FROM t_stock_trans_dtl GROUP BY left(stock_code,2),opt_typ; GROUP BY會將NULL值的行,分到同一組計算統計值; SELECT teacher_id,count(*) FROM student GROUP BY teacher_id;
二、匯總統計
1、過濾分組結果
關鍵字:GROUP BY + HAVING having關鍵字專門用來對group by進行指定條件; having和where比較: having:過濾分組,在GROUP BY后執行; where:過濾行,在GROUP BY前執行; 比如: 如何獲取教授15名以上學名的老師? SELECT teacher_id,count(*) FROM student GROUP BY teacher_id HAVING count(*) > 15; 比如: 如何獲取數學成績平均分在70分及以上的班級? SELECT class_id,avg(score) FROM student GROUP BY class_id HAVING avg(score) >= 70;
2、排序分組結果
比如: 如何獲取每個班級的數學成績平均分(不計算數學成績在80分以下的學生),然后以平均分從高到低排序? 使用關鍵字:GROUP BY + ORDER BY #會先執行where,再進行order by SELECT class_id,avg(score) FROM student WHERE score > 80 GROUP BY class_id ORDER BY avg(score) DESC; 如果每次查詢都想得到確定的排序結果,則必須使用ORDER BY!
3、SELECT子句順序
最簡單的SQL語句:
SELECT 1;