MySQL數據庫(4)----生成統計信息


  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表明,相應的計數結果就是其前面那些分組統計的匯總值。

  

 


免責聲明!

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



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