本文目錄一覽:
mysql進階5:分組查詢
/*語法:
select 分組函數 列(要求出現在group by的後面)
from 表
【where 篩選條件】
group by 分組的列表
[order by 子句]
注意:查詢列表必須特殊,要求是分組函數和group by 後出現的字段
特點:
1.分組查詢中篩選條件分為兩類:
數據源 位置 關鍵字
分組前篩選 原始表 group by子句的前面 where
分組後篩選 分組後的結果集 group by子句的後面 having
1.分組函數做條件肯定是放在having子句中
2.能用分組前篩選的,優先考慮使用分組前篩選
2.group by 子句支持單個字段、多個字段分組(用逗號隔開沒有順序要求)表達式或函數(用的較少)
3.也可以添加排序(放在整個group by子句之後)
*/
count(1),其實就是計算一共有多少符合條件的行。
1並不是表示第一個字段,而是表示一個固定值。
其實就可以想成表中有這麼一個字段,這個字段就是固定值1,count(1),就是計算一共有多少個1.
同理,count(2),也可以,得到的值完全一樣,count(‘x’),count(‘y’)都是可以的。一樣的理解方式。在你這個語句理都可以使用,返回的值完全是一樣的。就是計數。
count(*),執行時會把星號翻譯成字段的具體名字,效果也是一樣的,不過多了一個翻譯的動作,比固定值的方式效率稍微低一些。
MySQL分組、排序
上一篇聚合函數末尾處使用了GROUP BY,但沒有做具體的介紹,這一篇就主要介紹一下GROUP BY的使用方法。順便介紹一下對分組查詢的過濾關鍵詞HAVING的用法。
在MySQL中,GROUP BY關鍵詞可以根據一個或多個字段對查詢結果進行分組,類似於Excel中的數據透視表。可以單獨使用,但一般情況下都是結合聚合函數來使用的。
語法格式如下:
下面演示都是基於這一張簡單的省份對應大區的表格。
【單獨使用GROUP BY】
單獨使用GROUP BY關鍵字時,查詢結果會只顯示每個分組的第一條記錄。
根據省份表裏面的大區進行聚合,查詢全國共分成了幾個大區,SQL語句如下↓
【GROUP BY結合聚合函數】
5個聚合函數上一篇已經詳細介紹了用法,GROUP BY和聚合函數結合使用也是最頻繁的,下面就繼續使用省份表來求每個大區有多少個省份,對應的聚合函數就是COUNT函數,SQL語句如下↓
【GROUP BY結合GROUP_CONCAT】
這還是一個很有用的功能,GROUP_CONCAT() 函數會把每個分組的字段值都合併成一行顯示出來。
下面繼續使用省份表,把每個大區對應的省份放在一行展示,用分號分開,SQL語句如下↓
【GROUP BY結合WITH ROLLUP】
WITH POLLUP關鍵詞用來在所有記錄的最後加上一條記錄,這條記錄是上面所有記錄的總和,SQL語句如下↓
【GROUP BY結合HAVING】
在MySQL中,可以使用HAVING關鍵字對分組後的數據進行過濾。
使用 HAVING 關鍵字的語法格式如下:
HAVING關鍵詞和WHERE關鍵詞都可以用來過濾數據,且HAVING支持WHERE關鍵詞中所有的操作符和語法。但是WHERE和HAVING關鍵字也存在以下幾點差異:
下面篩選一下省份數量在7個及以上的大區,SQL語句如下↓
【GROUP BY結合ORDER BY】
聚合後的數據,一半情況下也是需要進行排序的,通過ORDER BY對聚合查詢結果進行排序,對省份數量按從大到小進行排序,SQL語句如下↓
End
◆ PowerBI開場白
◆ Python高德地圖可視化
◆ Python不規則條形圖
MySQL 怎樣分組查詢
mysql
與
oracle
中分組、聚合函數的區別!
今天需要這樣一句
sql
:先用
group by
進行分組,然後利用聚合函數
count
或者
sum
進行計算,並顯示
其它的輔助信息。
在
mysql
環境中,我模擬如下環境:
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
房間入住序號
(主鍵)
,
rname
為房間名,這裡不考慮第三範式
情景:人住房間,
統計某個房間某個人住的次數
用戶表,客人的信息
CREATE TABLE `user1` (
`ID` int(11) NOT NULL auto_increment,
`USERNAME` varchar(50) default ”,
`PASSWORD` varchar(50) default ”,
PRIMARY KEY
(`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
Mysql
中語句如下:
select count(u.username)
,
r.rname
,r.rid,r.pid
from room r,user1 u
where r.pid=u.id
group by r.rid,r.pid
這裡
r.rname
並沒有出現在
group by
子句、聚合函數中,但是
MYSQL
中仍然能夠執行、列
出數據。
但是,在
ORACLE
中,卻不能!
!
!
!
Oracle
環境中:
/*
—
顯示:
Ora-00979 not a ORDER BY expression
—
因為:
order by
後邊的
c.channel_code
不在
ORDER BY
子句中
select count(c.channel_name),m.media_name
from channel c,media m
where c.media_code = m.media_code
group by c.media_code,m.media_name
order by
c.channel_code
—
顯示:
Ora-00979 not a GROUP BY expression
—
因為:
group by
或者聚合函數中沒有包含
c.channel_name
select count(c.channel_name),m.media_name,
c.channel_name
from channel c,media m
原創文章,作者:HBFT1,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/129287.html