mysql中having和group by命令使用详解

作者:袖梨 2022-11-14

利用 Mysql 中的的聚合函数 count(*) 可以实现这个功能,例如需要查询 user 表中 name 出现次数最多的记录,可以先按照 group by name 分组,用 count 算出分组里的条数,再按照 count 排序,SQL语句如下:

select name,count(*) from user group by name order by count(*) DESC limit 1;

不加limit限制将返回按照name重复次数排列的数据。

在使用聚合函数之前,我们可以通过 where 对查询加限制条件,那么如果在 group by 之后我们要对分组里面的数据再加限制条件怎么办呢?答案是利用 having。

having 子句可以让我们筛选成组后的各组数据。

where 子句在聚合前先筛选记录,也就是说作用在 GROUP BY 子句和 HAVING 子句前。而 having 子句是在聚合后对组记录进行筛选。

having 子句出现的数据必须在 group by 之后,order by 之后。

对 name 按照出现次数排序之后,我们还想只查出名字里面含有 lin 的数据,可以这样写:


select name ,count(*) from user group by name having name like '%lin%' order by couny(*) DESC;

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

例子

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

相关文章

精彩推荐