SQL操作指南二(聚合查詢GROUP BY、HAVING、ORDER BY)

聚合查詢

  • 聚合函數
    COUNT:計算表中的記錄數(行數);
    SELECT COUNT (<列名>)
    FROM <表名>;
    SUM:計算表中數值列的數據合計值;
    SELECT SUM(<列名>)
    FROM <表名>;
    AVG:計算表中數值列的數據平均值;
    SELECT AVG(<列名>)
    FROM <表名>;
    MAX:求出表中任意列中數據的最大值;
    SELECT MAX(<列名>)
    FROM <表名>;
    MIN:求出表中任意列中數據的最小值;
    SELECT MIN(<列名>)
    FROM <表名>;
    *使用聚合函數刪除重復值(DISTINCT)
    SELECT COUNT/SUM/AVG/MAX/MIN (DISTINCT <列名>)
    FROM <表名>;

對表進行分組(GROUP BY)

示例:將shop_typle的進行分組計數
SELECT shop_typle,COUNT(shop_typle)
FROM shop_list
GROUP BY shop_list;
輸出結果:

+------------+-------------------+
| shop_typle | count(shop_typle) |
+------------+-------------------+
| 衣服       |                 2 |
| 工具       |                 1 |
| 廚房用具   |                 1 |
+------------+-------------------+

子句的順序:1.SELECT → 2.FROM → 3.WHERE → 4.GROUP BY
NULL的值以空行進行展示。

  • 使用WHERE進行限定分組
    示例:限定在”衣服“類別中將商品名進行分類
    select shop_name,count(*)
    from shop_list
    where shop_typle='衣服'
    group by shop_name;
    輸出結果:
+-----------+----------+
| shop_name | count(*) |
+-----------+----------+
| T恤衫     |        1 |
| 運動T恤   |        1 |
+-----------+----------+
2 rows in set

注意:
1.SELECT的列名必須包含在GROUP BY的列名中,或者必須在聚合鍵中使用;
2.在GROUP BY 子句中不能使用SELECT子句中定義的別名;
3.GROUP BY 子句顯示的結果是無序的;
4.WHERE子句不能使用聚合函數(只有SELECT子句和HAVING子句(以及ORDER BY子句)中能夠使用聚合函數;

為聚合結果指定條件(HAVING)

與WHERE不同,WHERE只能指定記錄行的條件,而不能指定組的條件(例如,”數據行數為兩行“,”平均值為500“等),HAVING子句可以辦到為聚合結果指定條件。
HAVING子句語法:
SELECT <列1>,<列2>,<列3>,……
FROM <表名>
GROUP BY <列1>,<列2>,<列3>
HAVING <分組結果對應的條件>;
HAVING子句示例(篩選出shop_typle計數為2的結果):

select shop_typle,count(*)
from shop_list
group by shop_typle
having count(*)=2;

輸出結果:

+------------+----------+
| shop_typle | count(*) |
+------------+----------+
| 衣服       |        2 |
+------------+----------+
1 row in set

HAVING子句的構成要素 :
1.常數;
2.聚合函數;
3.GROUP BY 子句指定的列名(即聚合鍵);


對查詢結果進行排序(ORDER BY)

  • ORDED BY 子句
    使用SELECT抽取數據時,數據的顯示是無序的,想要得到有序的數據,那么我們就需要使用ORDER BY子句進行排序。
    ORDED BY 子句語法:
    SELECT <列1>,<列2>,<列3>,......
    FROM <表名>
    ORDER BY <排序基準1>,<排序基準2>,.....
    ORDED BY 子句(商品的銷售單價升序排列):
 SELECT shop_id,shop_name,shop_typle,sell_price,buy_price,register_date
 FROM shop_list
 ORDER BY sell_price;

輸出結果:

+---------+-----------+------------+------------+-----------+---------------+
| shop_id | shop_name | shop_typle | sell_price | buy_price | register_date |
+---------+-----------+------------+------------+-----------+---------------+
| 0002    | 打孔器    | 工具       |        600 |       100 | 2009-10-20    |
| 0001    | T恤衫     | 衣服       |       1000 |       500 | 2009-09-20    |
| 0004    | 菜刀      | 廚房用具   |       3000 |      2800 | 2009-09-20    |
| 0003    | 運動T恤   | 衣服       |       4000 |      2800 | NULL          |
+---------+-----------+------------+------------+-----------+---------------+
4 rows in set
  • 指定升序或者降序
    ORDER BY 子句默認是進行升序的,如果要進行降序排列,可以在子句結尾加上DESC。
    ORDER BY子句降序示例(按照銷售單價降序排列):
 SELECT shop_id,shop_name,shop_typle,sell_price,buy_price,register_date
 FROM shop_list
 ORDER BY sell_price DESC;

輸出結果:

+---------+-----------+------------+------------+-----------+---------------+
| shop_id | shop_name | shop_typle | sell_price | buy_price | register_date |
+---------+-----------+------------+------------+-----------+---------------+
| 0003    | 運動T恤   | 衣服       |       4000 |      2800 | NULL          |
| 0004    | 菜刀      | 廚房用具   |       3000 |      2800 | 2009-09-20    |
| 0001    | T恤衫     | 衣服       |       1000 |       500 | 2009-09-20    |
| 0002    | 打孔器    | 工具       |        600 |       100 | 2009-10-20    |
+---------+-----------+------------+------------+-----------+---------------+
4 rows in set
  • 指定多個排序鍵
    如果某列的兩個數值相同,相同的數值沒有特定的指定,則這兩個數值相對是無序的,如果想要將這兩個值再排序的話,就需要再添加一個排序鍵。
    示例(將購買價格(buy_price)相同的商品通過商品ID(shop_id)進行再排序):
SELECT shop_id,shop_name,shop_typle,sell_price,buy_price,register_date
FROM shop_list
ORDED BY buy_price,shop_id;

輸出結果:

+---------+-----------+------------+------------+-----------+---------------+
| shop_id | shop_name | shop_typle | sell_price | buy_price | register_date |
+---------+-----------+------------+------------+-----------+---------------+
| 0002    | 打孔器    | 工具       |        600 |       100 | 2009-10-20    |
| 0001    | T恤衫     | 衣服       |       1000 |       500 | 2009-09-20    |
| 0003    | 運動T恤   | 衣服       |       4000 |      2800 | NULL          |
| 0004    | 菜刀      | 廚房用具   |       3000 |      2800 | 2009-09-20    |
+---------+-----------+------------+------------+-----------+---------------+
4 rows in set

注意:
1.ORDER BY子句中會優先使用左側的鍵,如果存在相同的值,則接著參考右邊的鍵;
2.排序鍵中包含NULL時,會在開頭或者結尾匯總;
3.ORDER BY子句中可以使用別名;
4.ORDER BY子句可以使用SELECT子句中未使用的列和聚合函數;
5.ORDER BY子句可以使用列編號排序(列編號指SELECT子句中的列從左到右的順序進行排序所對應的編號(1,2,3,4....))如:ORDER BY 3 DESC,1;,使用編號可能會使代碼閱讀變得復雜以及在列數較多的情況下容易出錯,所以不建議使用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容