數據說明: 對錶進行聚合查詢 聚合函數: COUNT:計算表中的記錄數(行數)。 SUM:計算表中數值列的數據合計值。 AVG:計算表中數值列的數據平均值。 MAX:求出表中任意列中數據的最大值。 MIN:求出表中任意列中數據的最小值。 COUNT函數的結果根據參數的不同而不同。COUNT(*)會得 ...
數據說明:
+-----------+------------+---------------+--------------+--------------+------------+
| shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka | torokubi |
+-----------+------------+---------------+--------------+--------------+------------+
| 0001 | T恤 | 衣服 | 1000 | 500 | 2009-09-20 |
| 0002 | 打孔器 | 辦公用品 | 500 | 320 | 2009-09-11 |
| 0003 | 運動T恤 | 衣服 | 4000 | 2800 | NULL |
| 0004 | 菜刀 | 廚房用具 | 3000 | 2800 | 2009-09-20 |
| 0005 | 高壓鍋 | 廚房用具 | 6800 | 5000 | 2009-01-15 |
| 0006 | 叉子 | 廚房用具 | 500 | NULL | 2009-09-20 |
| 0007 | 擦菜板 | 廚房用具 | 880 | 790 | 2008-04-28 |
| 0008 | 圓珠筆 | 辦公用品 | 100 | NULL | 2009-11-11 |
+-----------+------------+---------------+--------------+--------------+------------+
8 rows in set (0.00 sec)
對錶進行聚合查詢
聚合函數:
COUNT:計算表中的記錄數(行數)。
SUM:計算表中數值列的數據合計值。
AVG:計算表中數值列的數據平均值。
MAX:求出表中任意列中數據的最大值。
MIN:求出表中任意列中數據的最小值。
COUNT函數的結果根據參數的不同而不同。COUNT(*)會得到包含NULL的數據行數,而COUNT(<列名>)會得到NULL之外的數據行數。
聚合函數會將NULL排除在外。但COUNT(*)例外,並不會排除NULL。
MAX/MIN函數幾乎適用所有數據類型的列。SUM/AVG函數只適用數字類型的列。
想要計算值得種類時,可以在COUNT函數的參數中使用DISTINCT。
在聚合函數的參數中使用DISTINCT,可以刪除重覆數據。
對錶進行分組
SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui;
+---------------+----------+
| shohin_bunrui | COUNT(*) |
+---------------+----------+
| 辦公用品 | 2 |
| 廚房用具 | 4 |
| 衣服 | 2 |
+---------------+----------+
GOOUP BY 就像切分表的一把刀。
子句的書寫順序:
SELECTàFROMàWHEREàGROUP BY
SQL子句的順序不能改變,也不能互相替換。
SELECT shiire_tanka, COUNT(*)
FROM Shohin
GROUP BY shiire_tanka;
+--------------+----------+
| shiire_tanka | COUNT(*) |
+--------------+----------+
| NULL | 2 |
| 320 | 1 |
| 500 | 1 |
| 790 | 1 |
| 2800 | 2 |
| 5000 | 1 |
+--------------+----------+
聚合鍵中包含NULL時,在結果中會以“不確定”行(空行)的形式表現出來。
GROUP BY 和WHERE並用時, SELECT語句的執行順序如下:
FROM---WHERE---GROUP BY---SELECT
使用聚合函數時,SELECT字句中只能存在以下三種元素:
- 常數
- 聚合函數
- GROUP BY字句中指定的列明(也就是聚合鍵)
GROUP BY子句中不能夠使用SELECT子句中定義的別名。
因為SELECT子句在GROUP BY子句之後執行。
GROUP BY子句結果的顯示是無序的。
只有SELECT和HAVING子句(以及ORDER BY字句)中能夠使用聚合函數。
為聚合函數結果指定條件
HAVING子句:
SELECT <列名1>, <列名2>, <列名3>, …
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, …
HAVING <分組結果對應的條件>
使用HAVING子句時SELECT語句的順序:
SELECT---FROM---WHERE---GROUP BY---HAVING
HAVING子句要寫在GROUP BY子句之後,在DBMS內部的執行順序也排在GROUP BY子句之後。
SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) = 2;
in_bunrui | COUNT(*) |
+---------------+----------+
| 辦公用品 | 2 |
| 衣服 | 2 |
+---------------+----------+
SELECT shohin_bunrui, AVG(hanbai_tanka)
FROM Shohin
GROUP BY shohin_bunrui
HAVING AVG(hanbai_tanka) >= 2500;
ohin_bunrui | AVG(hanbai_tanka) |
+---------------+-------------------+
| 廚房用具 | 2795.0000 |
| 衣服 | 2500.0000 |
+---------------+-------------------+
HAVING字句中能夠使用的3種要素如下:
- 常數
- 聚合函數
- GROUP BY子句中指定的列名(即聚合鍵)
WHERE子句 = 指定行所對應的條件
HAVING子句 = 指定組所對應的條件
對查詢結構進行排序
ORDER BY子句:
SELECT <列名1>, <列名2>, <列名3>, …
FROM <表名>
ORDER BY <排序基準列1>, <排序基準列1>,…
不論何種情況,ORDER BY子句都需要寫在SELECT語句的末尾。這是因為對數據進行排序的操作必須在結果即將返回時執行。
子句的書寫順序:
SELECT---FROM---WHERE---GROUP BY ---HAVING---ORDER BY
未指定ORDER BY子句中排序時會預設使用升序進行排序。ASC升序,DESC降序。
排序鍵中包含NULL時,會在開頭或末尾進行彙總。(MySQL中,升序會在開頭彙總,降序會在末尾彙總)
使用HAVING子句時SELECT語句的執行順序:
FROM---WHERE---GROUP BY---HAVING---SELECT---ORDER BY
SELECT子句的執行順序在GROUP BY子句之後,ORDER BY子句之前。因此在執行GROUP BY子句時,SELECT語句中定義的別名無法別識別。對於SELECT子句之後執行GROUP BY子句來說,就沒有這樣的問題了。
在ORDER BY子句中可以使用SELECT子句中為使用的列和聚合函數.
SELECT shohin_mei, hanbai_tanka, shiire_tanka
FROM Shohin
ORDER BY shohin_id;
+------------+--------------+--------------+
| shohin_mei | hanbai_tanka | shiire_tanka |
+------------+--------------+--------------+
| T恤 | 1000 | 500 |
| 打孔器 | 500 | 320 |
| 運動T恤 | 4000 | 2800 |
| 菜刀 | 3000 | 2800 |
| 高壓鍋 | 6800 | 5000 |
| 叉子 | 500 | NULL |
| 擦菜板 | 880 | 790 |
| 圓珠筆 | 100 | NULL |
+------------+--------------+--------------+
SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui
ORDER BY COUNT(*);
+---------------+----------+
| shohin_bunrui | COUNT(*) |
+---------------+----------+
| 辦公用品 | 2 |
| 衣服 | 2 |
| 廚房用具 | 4 |
+---------------+----------+