mysql中group by與having合用注意事項分享
group by函數(shù)應該的使用應該是SELECT 列表中指定的每一列也必須出現(xiàn)在 GROUP BY 子句中,除非這列是用于聚合函數(shù),但是今天幫同事調(diào)試一個mysql中的group by函數(shù),讓我大跌眼鏡,當時感覺不可思議,然后回來做了個簡化版試驗,試驗過程如下:
mysql表結(jié)構(gòu)
mysql> desc t;
+——-+————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————–+——+—–+———+——-+
| id | int(11) | YES | | 0 | |
| name | varchar(100) | YES | | NULL | |
| aa | varchar(45) | YES | | NULL | |
+——-+————–+——+—–+———+——-+
3 rows in set (0.01 sec)
插入數(shù)據(jù)
mysql> select * from t;
+——+——+——-+
| id | name | aa |
+——+——+——-+
| 1 | aaaa | bbbb |
| 1 | 1111 | 2222 |
| 1 | 2222 | 33333 |
| 1 | 2222 | 44444 |
| 2 | 2222 | 44444 |
| 2 | 2222 | 1111 |
| 3 | 2222 | 1111 |
| 1 | 2222 | 44444 |
| 1 | 2222 | 44444 |
| 1 | 2222 | 44444 |
| 3 | 2222 | aaaa |
+——+——+——-+
11 rows in set (0.00 sec)
group by 查詢語句
mysql> select id,count(1) ,aa from t group by id;
+——+———-+——-+
| id | count(1) | aa |
+——+———-+——-+
| 1 | 7 | bbbb |
| 2 | 2 | 44444 |
| 3 | 2 | 1111 |
+——+———-+——-+
3 rows in set (0.00 sec)
在本試驗中,一共select id,count(1),aa,結(jié)果group by按照規(guī)則,除了聚合函數(shù)(count(1))外,其他兩列(id,aa)都應該包含在group by中,可是試驗只是包含了id。
對試驗結(jié)果的說明
1、包含在group by后面的id列的count(1)統(tǒng)計數(shù)據(jù)為正確的
2、按照正常思維,aa的數(shù)據(jù)不能展示出來,可是mysql選擇了展示表中aa數(shù)據(jù)的第一條
3、上述2也是個人猜測,暫時未查到官方相關說明
mysql group by having 用法
group by就是按照不同的字段進行分組,數(shù)值可以實現(xiàn)匯總
例如數(shù)據(jù)庫中有A表,包括學生,學科,成績?nèi)齻€字段
數(shù)據(jù)庫結(jié)構(gòu)為
學生 學科 成績
張三 語文 80
張三 數(shù)學 100
李四 語文 70
李四 數(shù)學 80
李四 英語 80
那么
select 學生,sum(成績) from A group by 學生;
得到如下結(jié)果
學生 成績
張三 180
李四 230
==============================================================
如果考慮having
語句寫成:
select 學生,sum(成績) from A group by 學生 having 成績=80;
得到結(jié)果就是這樣的
學生 成績
張三 80
李四 160
用having比 JOIN ON 相對好理解一些,簡單一些。
mysql中group by having 用法需要注意的事項:
GROUP BY:
group by 有一個原則,就是 select 后面的所有列中,沒有使用聚合函數(shù)的列,必須出現(xiàn)在 group by后面。
比如:
select name,sum(point) from table_name
這樣sql語句會報錯,必須寫成:
select name,sum(point) from table_name GROUP BY name
HAVING
把 HAVING 加入 SQL 的原因是,WHERE 無法應用于合計函數(shù),而如果沒有 HAVING,就無法測試結(jié)果條件。
select name,sum(point)
from table_name GROUP BY name
HAVING sum(point)>1000
having通常和group by聯(lián)合使用.
相關文章
MySQL中Binary Log二進制日志文件的基本操作命令小結(jié)
這篇文章主要介紹了MySQL中Binary Log二進制日志文件的基本操作小結(jié),包括利用二進制日志恢復數(shù)據(jù)的方法,需要的朋友可以參考下2015-12-12
Mysql性能調(diào)優(yōu)之max_allowed_packet使用及說明
這篇文章主要介紹了Mysql性能調(diào)優(yōu)之max_allowed_packet使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
在阿里云的CentOS環(huán)境中安裝配置MySQL的教程
這篇文章主要介紹了在阿里云的CentOS環(huán)境中安裝配置MySQL的教程,注意一下文章開頭所提到的系統(tǒng)自帶MariaDB的問題,需要的朋友可以參考下2015-12-12
遠程連接mysql報錯“Host?xxx?is?not?allowed?to?connect?to?th
這篇文章主要給大家介紹了關于遠程連接mysql報錯“Host?xxx?is?not?allowed?to?connect?to?this?MySQL?server“的解決辦法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-07-07

