MySQL中group by与having合用注意事项分享

2022-11-12 09:33:08
内容摘要
这篇文章主要为大家详细介绍了MySQL中group by与having合用注意事项分享,具有一定的参考价值,可以用来参考一下。 对此感兴趣的朋友,看看idc笔记做的技术笔记! group by函数应
文章正文

这篇文章主要为大家详细介绍了MySQL中group by与having合用注意事项分享,具有一定的参考价值,可以用来参考一下。

对此感兴趣的朋友,看看idc笔记做的技术笔记!

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 |
| 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联合使用.

注:关于MySQL中group by与having合用注意事项分享的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!