到現(xiàn)在為止,你只學(xué)習(xí)了如何根據(jù)特定的條件從表中取出一條或多條記錄。但是,假如你想對一個表中的記錄進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。例如,如果你想統(tǒng)計(jì)存儲在表中的一次民意測驗(yàn)的投票結(jié)果。或者你想知道一個訪問者在你的站點(diǎn)上平均花費(fèi)了多少時間。要對表中的任何類型的數(shù)據(jù)進(jìn)行統(tǒng)計(jì),都需要使用集合函數(shù)。你可以統(tǒng)計(jì)記錄數(shù)目,平均值,最小值,最大值,或者求和。當(dāng)你使用一個集合函數(shù)時,它只返回一個數(shù),該數(shù)值代表這幾個統(tǒng)計(jì)值之一。
這些函數(shù)的最大特點(diǎn)就是經(jīng)常和GROUP BY語句配合使用,需要注意的是集合函數(shù)不能和非分組的列混合使用。
行列計(jì)數(shù)
計(jì)算查詢語句返回的記錄行數(shù)
直接計(jì)算函數(shù)COUNT(*)的值,例如,計(jì)算pet表中貓的只數(shù):
MySQL>SELECT count(*) FROM pet WHERE species=’cat’;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
統(tǒng)計(jì)字段值的數(shù)目
例如,計(jì)算pet表中species列的數(shù)目:
mysql> SELECT count(species) FROM pet;
+----------------+
| count(species) |
+----------------+
| 9 |
+----------------+
如果相同的種類出現(xiàn)了不止一次,該種類將會被計(jì)算多次。如果你想知道種類為某個特定值的寵物有多少個,你可以使用WHERE子句,如下例所示:
mysql> SELECT COUNT(species) FROM pet WHERE species='cat' ;
注意這條語句的結(jié)果:
+----------------+
| COUNT(species) |
+----------------+
| 2 |
+----------------+
這個例子返回種類為'cat'的作者的數(shù)目。如果這個名字在表pet中出現(xiàn)了兩次,則次函數(shù)的返回值是2。 而且它和上面提到過的語句的結(jié)果是一致的:
SELECT count(*) FROM pet WHERE species=’cat’
實(shí)際上,這兩條語句是等價的。
假如你想知道有多少不同種類的的寵物數(shù)目。你可以通過使用關(guān)鍵字DISTINCT來得到該數(shù)目。如下例所示:
mysql> SELECT COUNT(DISTINCT species) FROM pet;
+-------------------------+
| COUNT(DISTINCT species) |
+-------------------------+
| 5 |
+-------------------------+
如果種類'cat'出現(xiàn)了不止一次,它將只被計(jì)算一次。關(guān)鍵字DISTINCT 決定了只有互不相同的值才被計(jì)算。
通常,當(dāng)你使用COUNT()時,字段中的空值將被忽略。
另外,COUNT()函數(shù)通常和GROUP BY子句配合使用,例如可以這樣返回每種寵物的數(shù)目:
mysql> SELECT species,count(*) FROM pet GROUP BY species;
+---------+----------+
| species | count(*) |
+---------+----------+
| bird | 2 |
| cat | 2 |
| dog | 3 |
| hamster | 1 |
| snake | 1 |
+---------+----------+
計(jì)算字段的平均值
需要計(jì)算這些值的平均值。使用函數(shù)AVG(),你可以返回一個字段中所有值的平均值。
假如你對你的站點(diǎn)進(jìn)行一次較為復(fù)雜的民意調(diào)查。訪問者可以在1到10之間投票,表示他們喜歡你站點(diǎn)的程度。你把投票結(jié)果保存在名為vote的INT型字段中。要計(jì)算你的用戶投票的平均值,你需要使用函數(shù)AVG():
SELECT AVG(vote) FROM opinion
這個SELECT語句的返回值代表用戶對你站點(diǎn)的平均喜歡程度。函數(shù)AVG()只能對數(shù)值型字段使用。這個函數(shù)在計(jì)算平均值時也忽略空值。
再給出一個實(shí)際例子,例如我們要計(jì)算pet表中每種動物年齡的平均值,那么使用AVG()函數(shù)和GROUP BY子句:
mysql> SELECT species,AVG(CURDATE()-birth) FROM pet GROUP BY species;
返回的結(jié)果為:
+---------+----------------------+
| species | AVG(CURDATE()-birth) |
+---------+----------------------+
| bird | 34160 |
| cat | 74959.5 |
| dog | 112829.66666667 |
| hamster | 19890 |
| snake | 49791 |
+---------+----------------------+
計(jì)算字段值的和
假設(shè)你的站點(diǎn)被用來出售某種商品,已經(jīng)運(yùn)行了兩個月,是該計(jì)算賺了多少錢的時候了。假設(shè)有一個名為orders的表用來記錄所有訪問者的定購信息。要計(jì)算所有定購量的總和,你可以使用函數(shù)SUM():
SELECT SUM(purchase_amount) FROM orders
函數(shù)SUM()的返回值代表字段purchase_amount中所有值的總和。字段purchase_amount的數(shù)據(jù)類型也許是DECIMAL類型,但你也可以對其它數(shù)值型字段使用函數(shù)SUM()。
用一個不太恰當(dāng)?shù)睦诱f明,我們計(jì)算pet表中同種寵物的年齡的總和:
mysql> SELECT species,SUM(CURDATE()-birth) FROM pet GROUP BY species;
你可以查看結(jié)果,與前一個例子對照:
+---------+----------------------+
| species | SUM(CURDATE()-birth) |
+---------+----------------------+
| bird | 68320 |
| cat | 149919 |
| dog | 338489 |
| hamster | 19890 |
| snake | 49791 |
+---------+----------------------+
計(jì)算字段值的極值
求字段的極值,涉及兩個函數(shù)MAX()和MIN()。
例如,還是pet表,你想知道最早的動物出生日期,由于日期最早就是最小,所以可以使用MIN()函數(shù):
mysql> SELECT MIN(birth) FROM pet;
+------------+
| MIN(birth) |
+------------+
| 1989-05-13 |
+------------+
但是,你只知道了日期,還是無法知道是哪只寵物,你可能想到這樣做:
SELECT name,MIN(birth) FROM pet;
但是,這是一個錯誤的SQL語句,因?yàn)榧虾瘮?shù)不能和非分組的列混合使用,這里name列是沒有分組的。所以,你無法同時得到name列的值和birth的極值。
MIN()函數(shù)同樣可以與GROUP BY子句配合使用,例如,找出每種寵物中最早的出生日期:
mysql> SELECT species,MIN(birth) FROM pet GROUP BY species;
下面是令人滿意的結(jié)果:
+---------+------------+
| species | MIN(birth) |
+---------+------------+
| bird | 1997-12-09 |
| cat | 1993-02-04 |
| dog | 1989-05-13 |
| hamster | 1999-03-30 |
| snake | 1996-04-29 |
+---------+------------+
另一方面,如果你想知道最近的出生日期,就是日期的最大值,你可以使用MAX()函數(shù),如下例所示:
mysql> SELECT species,MAX(birth) FROM pet GROUP BY species;
+---------+------------+
| species | MAX(birth) |
+---------+------------+
| bird | 1998-09-11 |
| cat | 1994-03-17 |
| dog | 1990-08-31 |
| hamster | 1999-03-30 |
| snake | 1996-04-29 |
+---------+------------+
總結(jié)
在本節(jié)中,介紹了一些典型的集合函數(shù)的用法,包括計(jì)數(shù)、均值、極值和總和,這些都是SQL語言中非常常用的函數(shù)。
這些函數(shù)之所以稱之為集合函數(shù),是因?yàn)樗鼈儜?yīng)用在多條記錄中,所以集合函數(shù)最常見的用法就是與GROUP BY子句配合使用,最重要的是集合函數(shù)不能同未分組的列混合使用。
新聞熱點(diǎn)
疑難解答
圖片精選