SQL基礎-匯總統計及GROUP BY


一、匯總統計

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的后面;

image

比如:
    如何統計不同的交易所的總的買入金額?

    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子句順序

image


最簡單的SQL語句:

SELECT 1;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM