在mysql中group by分組查詢我們經常會用到,并且還同時會與having合用,下面我介紹group by用法與having合用注意事項,希望此教程對各位朋友有所幫助。
group by函數應該的使用應該是SELECT 列表中指定的每一列也必須出現在 GROUP BY 子句中,除非這列是用于聚合函數,但是今天幫同事調試一個mysql中的group by函數,讓我大跌眼鏡,當時感覺不可思議,然后回來做了個簡化版試驗,試驗過程如下:
mysql表結構,代碼如下:
- 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)
插入數據,代碼如下:
- 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 | --Vevb.com
- | 3 | 2 | 1111 |
- +——+———-+——-+
- 3 rows in set (0.00 sec)
在本試驗中,一共select id,count(1),aa,結果group by按照規則,除了聚合函數(count(1))外,其他兩列(id,aa)都應該包含在group by中,可是試驗只是包含了id。
對試驗結果的說明
1、包含在group by后面的id列的count(1)統計數據為正確的
2、按照正常思維,aa的數據不能展示出來,可是mysql選擇了展示表中aa數據的第一條
3、上述2也是個人猜測,暫時未查到官方相關說明
mysql group by having 用法
group by就是按照不同的字段進行分組,數值可以實現匯總,例如數據庫中有A表,包括學生,學科,成績三個字段,數據庫結構為:
- 學生 學科 成績
- 張三 語文 80
- 張三 數學 100
- 李四 語文 70
- 李四 數學 80
- 李四 英語 80
那么 ,select 學生,sum(成績) from A group by 學生;得到如下結果:
- 學生 成績
- 張三 180
- 李四 230
如果考慮having,語句寫成:
select 學生,sum(成績) from A group by 學生 having 成績=80;
得到結果就是這樣的:
- 學生 成績
- 張三 80
- 李四 160
用having比 JOIN ON 相對好理解一些,簡單一些,mysql中group by having 用法需要注意的事項:
GROUP BY:group by 有一個原則,就是 select 后面的所有列中,沒有使用聚合函數的列,必須出現在 group by后面,比如如下代碼:
select name,sum(point) from table_name
這樣sql語句會報錯,必須寫成如下代碼:
select name,sum(point) from table_name GROUP BY name
HAVING
把 HAVING 加入 SQL 的原因是,WHERE 無法應用于合計函數,而如果沒有 HAVING,就無法測試結果條件,代碼如下:
- select name,sum(point)
- from table_name GROUP BY name
- HAVING sum(point)>1000
having通常和group by聯合使用.
新聞熱點
疑難解答