▲ count(*)
創(chuàng)新互聯(lián)專注于樂都網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供樂都營(yíng)銷型網(wǎng)站建設(shè),樂都網(wǎng)站制作、樂都網(wǎng)頁(yè)設(shè)計(jì)、樂都網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造樂都網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供樂都網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
統(tǒng)計(jì)查詢結(jié)果集返回的行數(shù).
▲ count(ve)
統(tǒng)計(jì)值表達(dá)式返回的非空值的個(gè)數(shù).
▲ count(distinct ve)
統(tǒng)計(jì)值表達(dá)式返回的非空不同值的個(gè)數(shù).
▲ sum(ve)
統(tǒng)計(jì)值表達(dá)式返回的非空值的和.
▲ sum(distinct ve)
統(tǒng)計(jì)值表達(dá)式返回的非空不同值的和.
▲ avg(ve)
統(tǒng)計(jì)值表達(dá)式返回的非空值的平均值.
▲ avg(distinct ve)
統(tǒng)計(jì)值表達(dá)式返回的非空不同值的平均值.
▲ max(ve)
統(tǒng)計(jì)值表達(dá)式返回的非空值的最大值.
▲ min(ve)
統(tǒng)計(jì)值表達(dá)式返回的非空值的最小值.
由group by子句來實(shí)現(xiàn)的.
語法:
(1)分組的引入
(2)分組定義
指定某列或某些列作為劃分的依據(jù),比較這些列值是否相同,具有相同列值的行放在同一組,這樣就可以將最初的結(jié)果集劃分為若干個(gè)子集,每個(gè)子集稱為一個(gè)分組.
一般來說有多少個(gè)不同的列值就可以分為多少組.
語法:
指定某列或計(jì)算列作為統(tǒng)計(jì)的對(duì)象,將統(tǒng)計(jì)函數(shù)作用在該對(duì)象上,統(tǒng)計(jì)函數(shù)按照分組自動(dòng)對(duì)每一分組的列值進(jìn)行統(tǒng)計(jì),每一分組返回一個(gè)統(tǒng)計(jì)后的結(jié)果.
(1)MYSQL對(duì)GROUP BY的非ANSI標(biāo)準(zhǔn)擴(kuò)展
是由having子句來實(shí)現(xiàn)的.
語法:
(1)having子句中的子查詢
/*語法:
select 分組函數(shù) 列(要求出現(xiàn)在group by的后面)
from 表
【where 篩選條件】
group by 分組的列表
[order by 子句]
注意:查詢列表必須特殊,要求是分組函數(shù)和group by 后出現(xiàn)的字段
特點(diǎn):
1.分組查詢中篩選條件分為兩類:
數(shù)據(jù)源 位置 關(guān)鍵字
分組前篩選 原始表 group by子句的前面 where
分組后篩選 分組后的結(jié)果集 group by子句的后面 having
1.分組函數(shù)做條件肯定是放在having子句中
2.能用分組前篩選的,優(yōu)先考慮使用分組前篩選
2.group by 子句支持單個(gè)字段、多個(gè)字段分組(用逗號(hào)隔開沒有順序要求)表達(dá)式或函數(shù)(用的較少)
3.也可以添加排序(放在整個(gè)group by子句之后)
*/
count(1),其實(shí)就是計(jì)算一共有多少符合條件的行。
1并不是表示第一個(gè)字段,而是表示一個(gè)固定值。
其實(shí)就可以想成表中有這么一個(gè)字段,這個(gè)字段就是固定值1,count(1),就是計(jì)算一共有多少個(gè)1.
同理,count(2),也可以,得到的值完全一樣,count('x'),count('y')都是可以的。一樣的理解方式。在你這個(gè)語句理都可以使用,返回的值完全是一樣的。就是計(jì)數(shù)。
count(*),執(zhí)行時(shí)會(huì)把星號(hào)翻譯成字段的具體名字,效果也是一樣的,不過多了一個(gè)翻譯的動(dòng)作,比固定值的方式效率稍微低一些。
mysql
與
oracle
中分組、聚合函數(shù)的區(qū)別!
今天需要這樣一句
sql
:先用
group by
進(jìn)行分組,然后利用聚合函數(shù)
count
或者
sum
進(jìn)行計(jì)算,并顯示
其它的輔助信息。
在
mysql
環(huán)境中,我模擬如下環(huán)境:
CREATE TABLE `room` (
`rid` varchar(5) default NULL,
`rname` varchar(5) default NULL,
`pid` int(11) default NULL,
`seq` int(11) NOT NULL auto_increment,
PRIMARY KEY
(`seq`)
) ENGINE=InnoDB DEFAULT
CHARSET=utf8
房間表,
seq
房間入住序號(hào)
(主鍵)
,
rname
為房間名,這里不考慮第三范式
情景:人住房間,
統(tǒng)計(jì)某個(gè)房間某個(gè)人住的次數(shù)
用戶表,客人的信息
查詢每門科目的前3名。
對(duì)于查詢的結(jié)果,一般有兩種情況。
表所有數(shù)據(jù)為:
情況1:對(duì)于分?jǐn)?shù)相同的人,其后面的人 緊跟著名次排,直到排夠名次3,就不再往后取了。
情況2:對(duì)于分?jǐn)?shù)相同的人,若當(dāng)前相同名次的人數(shù)大于或等于 3, 則相同分?jǐn)?shù)其后面的人不再參于top3了。
在情況2中 ,為什么”李四 - java“ 這行沒有了呢?
可以這樣理解,在情況2中相當(dāng)于使用了 名次空缺 , 分?jǐn)?shù)相同的人其后面那個(gè)人,的名次為 前面的人數(shù)+1 , 這里的 ”李四-java“這行,他的名次應(yīng)當(dāng)是 5 , 所有top3自然取不到 ”李四-java“這行。
情況2和情況 寫法都是對(duì)應(yīng)的, 需要注意的是 并列名次,后面的人 是否需要保持名次空缺。那么統(tǒng)計(jì)的時(shí)候就需要根據(jù)情況去重。
參考鏈接:
當(dāng)用select*from 表名 group by ‘字段名1’ 將選出來的內(nèi)容將按照字段1分組,其他列不盡相同,會(huì)以最前面的內(nèi)容顯示:
GROUP BY 后面可以跟多個(gè)列名,表示以多列作為分組依據(jù):
mysql select `name`,`date`,count(*) from `employee_tbl` group by `name`,date;
+------+---------------------+----------+
| name | date? ? ? ? ? ? ? ? | count(*) |
+------+---------------------+----------+
| 小麗 | 2016-04-19 15:26:02 |? ? ? ? 1 |
| 小明 | 2016-04-04 15:26:54 |? ? ? ? 1 |
| 小明 | 2016-04-11 15:26:40 |? ? ? ? 1 |
| 小明 | 2016-04-22 15:25:33 |? ? ? ? 1 |
| 小王 | 2016-04-07 15:26:14 |? ? ? ? 1 |
| 小王 | 2016-04-20 15:25:47 |? ? ? ? 1 |
+------+---------------------+----------+
6 rows in set (0.05 sec)
group by 后可以跟with? rollup,表示在進(jìn)行分組統(tǒng)計(jì)的基礎(chǔ)上再次進(jìn)行匯總統(tǒng)計(jì)(在每個(gè)分組下都會(huì)有統(tǒng)計(jì)匯總):
mysql select*from r;
+------+-----+------+
| name | cat | fish |
+------+-----+------+
| 小明 | x? | 1? ? |
| 小明 | x? | 2? ? |
| 小明 | x? | 4? ? |
| 小明 | y? | 2? ? |
| 小明 | y? | 2? ? |
| 小明 | z? | 1? ? |
| 小紅 | x? | 1? ? |
| 小紅 | x? | 3? ? |
| 小紅 | y? | 1? ? |
| 小紅 | y? | 2? ? |
| 小青 | y? | 3? ? |
| 小青 | z? | 2? ? |
| 小青 | z? | 1? ? |
+------+-----+------+
13 rows in set (0.05 sec)
mysql select name,cat,fish,count(*) from r group by name with rollup;
+------+-----+------+----------+
| name | cat | fish | count(*) |
+------+-----+------+----------+
| 小紅 | x? | 1? ? |? ? ? ? 4 |
| 小明 | x? | 1? ? |? ? ? ? 6 |
| 小青 | y? | 3? ? |? ? ? ? 3 |
| NULL | y? | 3? ? |? ? ? 13 |
+------+-----+------+----------+
4 rows in set (0.05 sec)
mysql select name,cat,fish,count(*) from r group by name,cat with rollup;
+------+------+------+----------+
| name | cat? | fish | count(*) |
+------+------+------+----------+
| 小紅 | x? ? | 1? ? |? ? ? ? 2 |
| 小紅 | y? ? | 1? ? |? ? ? ? 2 |
| 小紅 | NULL | 1? ? |? ? ? ? 4 |
| 小明 | x? ? | 1? ? |? ? ? ? 3 |
| 小明 | y? ? | 2? ? |? ? ? ? 2 |
| 小明 | z? ? | 1? ? |? ? ? ? 1 |
| 小明 | NULL | 1? ? |? ? ? ? 6 |
| 小青 | y? ? | 3? ? |? ? ? ? 1 |
| 小青 | z? ? | 2? ? |? ? ? ? 2 |
| 小青 | NULL | 2? ? |? ? ? ? 3 |
| NULL | NULL | 2? ? |? ? ? 13 |
+------+------+------+----------+
11 rows in set (0.06 sec)
mysql select name,cat,fish,count(*) from r group by name,cat,fish with rollup;
+------+------+------+----------+
| name | cat? | fish | count(*) |
+------+------+------+----------+
| 小紅 | x? ? | 1? ? |? ? ? ? 1 |
| 小紅 | x? ? | 3? ? |? ? ? ? 1 |
| 小紅 | x? ? | NULL |? ? ? ? 2 |
| 小紅 | y? ? | 1? ? |? ? ? ? 1 |
| 小紅 | y? ? | 2? ? |? ? ? ? 1 |
| 小紅 | y? ? | NULL |? ? ? ? 2 |
| 小紅 | NULL | NULL |? ? ? ? 4 |
| 小明 | x? ? | 1? ? |? ? ? ? 1 |
| 小明 | x? ? | 2? ? |? ? ? ? 1 |
| 小明 | x? ? | 4? ? |? ? ? ? 1 |
| 小明 | x? ? | NULL |? ? ? ? 3 |
| 小明 | y? ? | 2? ? |? ? ? ? 2 |
| 小明 | y? ? | NULL |? ? ? ? 2 |
| 小明 | z? ? | 1? ? |? ? ? ? 1 |
| 小明 | z? ? | NULL |? ? ? ? 1 |
| 小明 | NULL | NULL |? ? ? ? 6 |
| 小青 | y? ? | 3? ? |? ? ? ? 1 |
| 小青 | y? ? | NULL |? ? ? ? 1 |
| 小青 | z? ? | 1? ? |? ? ? ? 1 |
| 小青 | z? ? | 2? ? |? ? ? ? 1 |
| 小青 | z? ? | NULL |? ? ? ? 2 |
| 小青 | NULL | NULL |? ? ? ? 3 |
| NULL | NULL | NULL |? ? ? 13 |
+------+------+------+----------+
23 rows in set (0.07 sec)
mysql select name,cat,fish,sum(fish) from r group by name with rollup;
+------+-----+------+-----------+
| name | cat | fish | sum(fish) |
+------+-----+------+-----------+
| 小紅 | x? | 1? ? |? ? ? ? 7 |
| 小明 | x? | 1? ? |? ? ? ? 12 |
| 小青 | y? | 3? ? |? ? ? ? 6 |
| NULL | y? | 3? ? |? ? ? ? 25 |
+------+-----+------+-----------+
4 rows in set (0.05 sec)
mysql select name,cat,fish,sum(fish) from r group by name,cat with rollup;
+------+------+------+-----------+
| name | cat? | fish | sum(fish) |
+------+------+------+-----------+
| 小紅 | x? ? | 1? ? |? ? ? ? 4 |
| 小紅 | y? ? | 1? ? |? ? ? ? 3 |
| 小紅 | NULL | 1? ? |? ? ? ? 7 |
| 小明 | x? ? | 1? ? |? ? ? ? 7 |
| 小明 | y? ? | 2? ? |? ? ? ? 4 |
| 小明 | z? ? | 1? ? |? ? ? ? 1 |
| 小明 | NULL | 1? ? |? ? ? ? 12 |
| 小青 | y? ? | 3? ? |? ? ? ? 3 |
| 小青 | z? ? | 2? ? |? ? ? ? 3 |
| 小青 | NULL | 2? ? |? ? ? ? 6 |
| NULL | NULL | 2? ? |? ? ? ? 25 |
+------+------+------+-----------+
11 rows in set (0.06 sec)
mysql select name,cat,fish,sum(fish) from r group by name,cat,fish with rollup;
+------+------+------+-----------+
| name | cat? | fish | sum(fish) |
+------+------+------+-----------+
| 小紅 | x? ? | 1? ? |? ? ? ? 1 |
| 小紅 | x? ? | 3? ? |? ? ? ? 3 |
| 小紅 | x? ? | NULL |? ? ? ? 4 |
| 小紅 | y? ? | 1? ? |? ? ? ? 1 |
| 小紅 | y? ? | 2? ? |? ? ? ? 2 |
| 小紅 | y? ? | NULL |? ? ? ? 3 |
| 小紅 | NULL | NULL |? ? ? ? 7 |
| 小明 | x? ? | 1? ? |? ? ? ? 1 |
| 小明 | x? ? | 2? ? |? ? ? ? 2 |
| 小明 | x? ? | 4? ? |? ? ? ? 4 |
| 小明 | x? ? | NULL |? ? ? ? 7 |
| 小明 | y? ? | 2? ? |? ? ? ? 4 |
| 小明 | y? ? | NULL |? ? ? ? 4 |
| 小明 | z? ? | 1? ? |? ? ? ? 1 |
| 小明 | z? ? | NULL |? ? ? ? 1 |
| 小明 | NULL | NULL |? ? ? ? 12 |
| 小青 | y? ? | 3? ? |? ? ? ? 3 |
| 小青 | y? ? | NULL |? ? ? ? 3 |
| 小青 | z? ? | 1? ? |? ? ? ? 1 |
| 小青 | z? ? | 2? ? |? ? ? ? 2 |
| 小青 | z? ? | NULL |? ? ? ? 3 |
| 小青 | NULL | NULL |? ? ? ? 6 |
| NULL | NULL | NULL |? ? ? ? 25 |
+------+------+------+-----------+
23 rows in set (0.07 sec)
————————————————
MySQL中使用 GROUP BY 對(duì)數(shù)據(jù)進(jìn)行分組,GROUP BY從字面意義上理解就是根據(jù)'BY'指定的規(guī)則對(duì)數(shù)據(jù)進(jìn)行分組, 所謂分組就是將一個(gè)'數(shù)據(jù)集'劃分成若干個(gè)'子區(qū)域',然后針對(duì)若干個(gè)'小區(qū)域'進(jìn)行數(shù)據(jù)處理 ?;菊Z法形式為:
字段值為進(jìn)行分組時(shí)所依據(jù)的列名稱, “HAVING 條件表達(dá)式” 指定滿足表達(dá)式限定條件的結(jié)果將被顯示。
GROUP BY關(guān)鍵字通常和集合函數(shù)一起使用,例如:MAX()、MIN()、COUNT()、SUM()、AVG()。即把數(shù)據(jù)分為多個(gè)邏輯組,并對(duì)每個(gè)組進(jìn)行集合計(jì)算。
WHERE 子句過濾行,在數(shù)據(jù)分組前過濾;HAVING 子句過濾分組,在數(shù)據(jù)分組后過濾。WHERE排除的行不包括在分組里,且HAVING支持所有WHERE操作符。
使用GROUP BY可以對(duì)多個(gè)字段進(jìn)行分組,根據(jù)多字段的值來進(jìn)行層次分組,分組從左到右。
注意事項(xiàng):