mysql中統(tǒng)計常用聚合函數(shù)

每一次做統(tǒng)計,涉及到稍微復(fù)雜點的sql去問老大起暮,老大都會笑著說卖氨,這不都是mysql最基本的東西,你該回去給msyql補(bǔ)課了~~~趁清明節(jié)负懦,搞搞M厕唷!纸厉!

mysql中什么是聚合函數(shù)系吭?其實聚合函數(shù)還有一個定義:組函數(shù)!
在每一行集合上進(jìn)行操作颗品,對每一個組給出一個結(jié)果肯尺!

一沃缘、常用的組函數(shù):
avg:求平均值
count:統(tǒng)計行的數(shù)量
max:求最大值
min:求最小值
sum:求和

注意:
1、每組函數(shù)接收一個參數(shù)
2则吟、默認(rèn)情況下槐臀,組函數(shù)忽略值為null的行,不參與計算
3氓仲、使用關(guān)鍵字distinct剔除字段值重復(fù)的條數(shù)

一水慨、count函數(shù)使用demo數(shù)據(jù)

mysql> select * from salary_tab;
+--------+---------+
| userid | salary  |
+--------+---------+
|      1 | 1000.00 |
|      2 | 2000.00 |
|      3 | 3000.00 |
|      4 |    NULL |
|      5 | 1000.00 |
+--------+---------+
rows in set (0.00 sec)

mysql> use TENNIS
mysql> show tables;
+-------------------+
| Tables_in_TENNIS  |
+-------------------+
| COMMITTEE_MEMBERS |
| MATCHES           |
| PENALTIES         |
| PLAYERS           |
| TEAMS             |
+-------------------+
rows in set (0.00 sec)

(1)、count(*):返回表中滿足where條件的行的數(shù)量

mysql> select count(*) from salary_tab where salary='1000';
+----------+
| count(*) |
+----------+
|        2 |
+----------+

mysql> select count(*) from salary_tab;  #沒有條件寨昙,默認(rèn)統(tǒng)計表數(shù)據(jù)行數(shù)
+----------+
| count(*) |
+----------+
|        5 |
+----------+

(2)讥巡、count(列):返回列值非空的行的數(shù)量

mysql> select count(salary) from salary_tab;
+---------------+
| count(salary) |
+---------------+
|             4 |
+---------------+

(3)、count(distinct 列):返回列值非空的舔哪、并且列值不重復(fù)的行的數(shù)量

mysql> select count(distinct salary) from salary_tab;
+------------------------+
| count(distinct salary) |
+------------------------+
|                      3 |
+------------------------+

(4)欢顷、count(expr):根據(jù)表達(dá)式統(tǒng)計數(shù)據(jù)(to_days返回的是天數(shù),不懂可以查下)

mysql> select * from TT;
+------+------------+
| UNIT | DATE       |
+------+------------+
| a    | 2018-04-03 |
| a    | 2017-12-12 |
| b    | 2018-01-01 |
| b    | 2018-04-03 |
| c    | 2016-06-06 |
| d    | 2018-03-03 |
+------+------------+
rows in set (0.00 sec)

mysql> select UNIT as '單位',
    ->     COUNT(TO_DAYS(DATE)=TO_DAYS(NOW()) or null) as '今日統(tǒng)計',
    ->     COUNT(YEAR(DATE)=YEAR(NOW()) or null) as '今年統(tǒng)計'
    -> from TT
    -> group by UNIT;
+------+----------+----------+
| 單位  | 今日統(tǒng)計  | 今年統(tǒng)計  |
+------+----------+----------+
| a    |        1 |        1 |
| b    |        1 |        2 |
| c    |        0 |        0 |
| d    |        0 |        1 |
+------+----------+----------+
rows in set (0.00 sec)

二捉蚤、max和min使用demo

mysql> select max(salary) from salary_tab;
+-------------+
| max(salary) |
+-------------+
|     3000.00 |
+-------------+

mysql> select min(salary) from salary_tab;
+-------------+
| min(salary) |
+-------------+
|     1000.00 |
+-------------+

如果統(tǒng)計的列中只有NULL值抬驴,那么MAX和MIN就返回NULL

三、sum和avg函數(shù)---求和與求平均

@虑伞布持!注意:
表中列值為null的行不參與計算

mysql> select sum(salary) from salary_tab;
+-------------+
| sum(salary) |
+-------------+
|     7000.00 |
+-------------+

mysql> select avg(salary) from salary_tab;
+-------------+
| avg(salary) |
+-------------+
| 1750.000000 |
+-------------+

mysql> select avg(ifnull(salary,0)) from salary_tab;
+-----------------------+
| avg(ifnull(salary,0)) |
+-----------------------+
|           1400.000000 |
+-----------------------+

要想列值為NULL的行也參與組函數(shù)的計算,必須使用IFNULL函數(shù)對NULL值做轉(zhuǎn)換

二陕悬、SELECT分組:

1题暖、SELECT分組的基本格式

select [聚合函數(shù)] 字段名 from 表名 [where 查詢條件] [group by 字段名] [having 過濾條件]

(1)、group by子句:

根據(jù)給定列或者表達(dá)式的每一個不同的值將表中的行分成不同的組捉超,使用組函數(shù)返回每一組的統(tǒng)計信息

規(guī)則:

①出現(xiàn)在SELECT子句中的單獨的列胧卤,必須出現(xiàn)在GROUP BY子句中作為分組列

②分組列可以不出現(xiàn)在SELECT子句中

③分組列可出現(xiàn)在SELECT子句中的一個復(fù)合表達(dá)式中

④如果GROUP BY后面是一個復(fù)合表達(dá)式,那么在SELECT子句中拼岳,它必須整體作為一個表達(dá)式的一部分才能使用枝誊。

1)指定一個列進(jìn)行分組

mysql> select salary,count(*) from salary_tab
    -> where salary>=2000
    -> group by salary;   
+---------+----------+
| salary  | count(*) |
+---------+----------+
| 2000.00 |        1 |
| 3000.00 |        1 |
+---------+----------+

2)指定多個分組列,‘大組中再分小組’

mysql> select userid,count(salary) from salary_tab
    -> where salary>=2000
    -> group by salary,userid;   
+--------+---------------+
| userid | count(salary) |
+--------+---------------+
|      2 |             1 |
|      3 |             1 |
+--------+---------------+

3)根據(jù)表達(dá)式分組

mysql> select year(payment_date),count(*)
    -> from PENALTIES
    -> group by year(payment_date);
+--------------------+----------+
| year(payment_date) | count(*) |
+--------------------+----------+
|               1980 |        3 |
|               1981 |        1 |
|               1982 |        1 |
|               1983 |        1 |
|               1984 |        2 |
+--------------------+----------+
rows in set (0.00 sec)

4)帶有排序的分組:如果分組列和排序列相同惜纸,則可以合并group by和order by子句

mysql> select teamno,count(*)
    -> from MATCHES
    -> group by teamno
    -> order by teamno desc;
+--------+----------+
| teamno | count(*) |
+--------+----------+
|      2 |        5 |
|      1 |        8 |
+--------+----------+
rows in set (0.00 sec)

mysql> select teamno,count(*)
    -> from MATCHES
    -> group by teamno desc;  #可以把desc(或者asc)包含到group by子句中簡化
+--------+----------+
| teamno | count(*) |
+--------+----------+
|      2 |        5 |
|      1 |        8 |
+--------+----------+
rows in set (0.00 sec)

2叶撒、GROUP_CONCAT()函數(shù)

函數(shù)的值等于屬于一個組的指定列的所有值,以逗號隔開耐版,并且以字符串表示祠够。

例1:對于每個球隊,得到其編號和所有球員的編號

mysql> select teamno,group_concat(playerno)
    -> from MATCHES
    -> group by teamno;
+--------+------------------------+
| teamno | group_concat(playerno) |
+--------+------------------------+
|      1 | 6,6,6,44,83,2,57,8     |
|      2 | 27,104,112,112,8       |
+--------+------------------------+
rows in set (0.01 sec)

如果沒有g(shù)roup by子句粪牲,group_concat返回一列的所有值

例2:得到所有的罰款編號列表

mysql> select group_concat(paymentno)
    -> from PENALTIES;
+-------------------------+
| group_concat(paymentno) |
+-------------------------+
| 1,2,3,4,5,6,7,8         |
+-------------------------+
row in set (0.00 sec)

4哪审、HAVING子句:對分組結(jié)果進(jìn)行過濾

注意:

不能使用WHERE子句對分組后的結(jié)果進(jìn)行過濾

不能在WHERE子句中使用組函數(shù),僅用于過濾行

因為WHERE子句比GROUP BY先執(zhí)行虑瀑,而組函數(shù)必須在分完組之后才執(zhí)行湿滓,且分完組后必須使用having子句進(jìn)行結(jié)果集的過濾滴须。

SELECT   select_expr [, select_expr ...]

   FROM  table_name

   [WHERE where_condition]

   [GROUP BY {col_name | expr} [ASC | DESC], ... [WITH ROLLUP]]

[HAVING where_condition]

!_窗隆扔水!having子語句與where子語句區(qū)別:

where子句在分組前對記錄進(jìn)行過濾;

having子句在分組后對記錄進(jìn)行過濾

mysql> select salary,count(*) from salary_tab
    -> where salary>=2000
    -> group by salary
    -> having count(*)>=0;
+---------+----------+
| salary  | count(*) |
+---------+----------+
| 2000.00 |        1 |
| 3000.00 |        1 |
+---------+----------+

1)HAVING可以單獨使用而不和GROUP BY配合,如果只有HAVING子句而沒有GROUP BY朝氓,表中所有的行分為一組

2)HAVING子句中可以使用組函數(shù)

3)HAVING子句中的列魔市,要么出現(xiàn)在一個組函數(shù)中,要么出現(xiàn)在GROUP BY子句中(否則出錯)

mysql> select town,count(*)
    -> from PLAYERS
    -> group by town
    -> having birth_date>'1970-01-01';
ERROR 1054 (42S22): Unknown column 'birth_date' in 'having clause'
mysql> select town,count(*)
    -> from PLAYERS
    -> group by town
    -> having town in ('Eltham','Midhurst');
+----------+----------+
| town     | count(*) |
+----------+----------+
| Eltham   |        2 |
| Midhurst |        1 |
+----------+----------+
rows in set (0.00 sec)

基本就這么多了赵哲、待德、、以后再補(bǔ)充

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枫夺,一起剝皮案震驚了整個濱河市将宪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌橡庞,老刑警劉巖较坛,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扒最,居然都是意外死亡丑勤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門吧趣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來法竞,“玉大人,你說我怎么就攤上這事强挫∽Υ” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵纠拔,是天一觀的道長。 經(jīng)常有香客問我泛豪,道長稠诲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任诡曙,我火速辦了婚禮臀叙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘价卤。我一直安慰自己劝萤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布慎璧。 她就那樣靜靜地躺著床嫌,像睡著了一般跨释。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厌处,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天鳖谈,我揣著相機(jī)與錄音,去河邊找鬼阔涉。 笑死缆娃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瑰排。 我是一名探鬼主播贯要,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼椭住!你這毒婦竟也來了崇渗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤函荣,失蹤者是張志新(化名)和其女友劉穎显押,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傻挂,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡乘碑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了金拒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兽肤。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绪抛,靈堂內(nèi)的尸體忽然破棺而出资铡,到底是詐尸還是另有隱情,我是刑警寧澤幢码,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布笤休,位于F島的核電站,受9級特大地震影響症副,放射性物質(zhì)發(fā)生泄漏店雅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一贞铣、第九天 我趴在偏房一處隱蔽的房頂上張望闹啦。 院中可真熱鬧,春花似錦辕坝、人聲如沸窍奋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琳袄。三九已至江场,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挚歧,已是汗流浹背扛稽。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留滑负,地道東北人在张。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像矮慕,于是被迫代替她去往敵國和親帮匾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. SQL 簡介 SQL 的目標(biāo) 理想情況下痴鳄,數(shù)據(jù)庫語言應(yīng)允許用戶: 建立數(shù)據(jù)庫和關(guān)系結(jié)構(gòu) 完成基本數(shù)據(jù)管理任務(wù)...
    板藍(lán)根plank閱讀 2,333評論 0 11
  • (一)幾個數(shù)據(jù)庫相關(guān)的概念 1.數(shù)據(jù)庫 數(shù)據(jù)庫: 保存有組織數(shù)據(jù)的容器瘟斜。 數(shù)據(jù)的所有存儲、檢索痪寻、管理和處理實際上是...
    快樂的小飛熊閱讀 519評論 0 1
  • 平庸的人生來平庸螺句,聰明的人一出生就倍受關(guān)注! 相信人人生而平等的人永遠(yuǎn)看不清現(xiàn)實橡类,永遠(yuǎn)只會活在自己編織的美夢里蛇尚,但...
    小荊妹妹閱讀 130評論 0 0
  • 接昨天的。 《白鹿原》里有一個安排讓我覺得挺有意思的顾画。很多人都和白鹿有關(guān)系取劫。先是白嘉軒發(fā)現(xiàn)了真正的白鹿精靈,并且把...
    Bast閱讀 453評論 0 1
  • 大部分女生都是浪漫主義者惦银,都希望能找到一個三觀一致的TA。 那么所謂的三觀一致末誓,簡單來說就是能吃到一起扯俱,聊到一起,...
    陽光書屋閱讀 259評論 0 1