MySQL最有用的一項功能就是,能夠對大量原始數據進行歸納統計。
1.在一組值里把各個唯一的值找出來,這是一項典型的統計工作,可以使用DISTINCT 關鍵字清楚查詢結果里重復出現的行。例如,下面的查詢可以查看 student 表里所有的性別:
mysql> SELECT DISTINCT sex FROM student; +-----+ | sex | +-----+ | M | | F | +-----+ 2 rows in set (0.00 sec)
2. 另一種統計形式是計數,需要使用COUNT()函數。如果使用 COUNT(*),那么計算出來的結果將是查詢所選取到的行數。如果查詢語句沒有帶 WHERE 子句,那么它會查詢所有行,因此,COUNT(*) 計算出來的結果就是表的行數。
(i)下面這個查詢可以顯示出 student 表里有多少行:
mysql> SELECT COUNT(*) FROM student; +----------+ | COUNT(*) | +----------+ | 6 | +----------+ 1 row in set (0.00 sec)
(ii)下面這個查詢可以查看 student 表里有多少不同的性別:
mysql> SELECT COUNT(DISTINCT sex) FROM student; +---------------------+ | COUNT(DISTINCT sex) | +---------------------+ | 2 | +---------------------+ 1 row in set (0.00 sec)
(iii)如果查詢語句帶有 WHERE 子句,那么COUNT(*) 計算出來的結果就是該語句匹配到了多少行。下面這個查詢可以顯示出 student 表中有多少 Female:
mysql> SELECT COUNT(*) FROM student WHERE sex='F'; +----------+ | COUNT(*) | +----------+ | 2 | +----------+ 1 row in set (0.00 sec)
(iv)COUNT(*) 函數會統計所有被查詢到的行數,與之相對的是,COUNT(列名)只會統計所有非NULL值的數目。下面這個查詢展示了這兩個函數的區別:
mysql> SELECT COUNT(DISTINCT sex) ,COUNT(name),COUNT(student_id) FROM student; +---------------------+-------------+-------------------+ | COUNT(DISTINCT sex) | COUNT(name) | COUNT(student_id) | +---------------------+-------------+-------------------+ | 2 | 6 | 6 | +---------------------+-------------+-------------------+ 1 row in set (0.00 sec)
(v)另外,還可以使用 GROUP BY 語句分別統計男、女學生的人數:
mysql> SELECT sex , COUNT(*) FROM student GROUP BY sex; +-----+----------+ | sex | COUNT(*) | +-----+----------+ | F | 2 | | M | 4 | +-----+----------+ 2 rows in set (0.00 sec)
(vi) 如果不是想用LIMIT子句來限制查詢結果中的記錄條數,而是想把COUNT() 的某些特定值找出來,那么需要用到HAVING子句。該子句與WHERE相類似,他們都可以用來設定輸出行所必須滿足的查詢條件。與WHERE子句不同的是,它可以引用像COUNT()那樣的匯總函數輸出的結果。下面的查詢顯示了 student 表中個數超過3個的那種性別:
mysql> SELECT sex,COUNT(*) AS count FROM student -> GROUP BY sex HAVING count> 3 ORDER BY count DESC; +-----+-------+ | sex | count | +-----+-------+ | M | 4 | +-----+-------+ 1 row in set (0.00 sec)
一般情況下,帶有HAVING子句的查詢語句,特別適合於查找在某個數據列里重復出現的值。也可以用於查找不重復出現的值,此時使用 HAVING count=1 即可。
(vii) 除了 COUNT() 外,還有其他幾個匯總函數,函數 MIN()、MAX()、SUM()和 AVG() 可分別用於確定某個數據列的最小值、最大值、總計和平均值。甚至可以在同一個查詢語句里使用它們。下面這個查詢可以顯示了這幾個函數的用法:
mysql> SELECT -> MIN(student_id) as minimum, -> MAX(student_id) as maximum, -> MAX(student_id)- MIN(student_id) +1 as span, -> SUM(student_id) as total, -> AVG(student_id) as average, -> COUNT(student_id) as count -> FROM student; +---------+---------+------+-------+---------+-------+ | minimum | maximum | span | total | average | count | +---------+---------+------+-------+---------+-------+ | 1 | 6 | 6 | 21 | 3.5000 | 6 | +---------+---------+------+-------+---------+-------+ 1 row in set (0.00 sec)
(viii) 如果想要生成額外的輸出行,顯示出"統計結果的統計",那么還需要增加一條 WITH ROLLUP 子句。它會讓 MySQL 計算各分組行的“超集”值。如下實例:
mysql> SELECT sex , count(*) as count FROM student GROUP BY sex WITH ROLLUP; +-----+-------+ | sex | count | +-----+-------+ | F | 2 | | M | 4 | | NULL | 6 | +-----+-------+ 3 rows in set (0.00 sec)
分組列里的NULL表明,相應的計數結果就是其前面那些分組統計的匯總值。