【瞎老弟mysql】11-为分组聚合设置筛选条件

本文介绍了在MySQL中如何使用分组聚合(GROUP BY)配合HAVING子句来筛选满足特定条件的分组。通过创建数据表`Student`并插入数据,展示了如何查询各性别的数量,以及如何找到平均年龄大于20岁的性别组。同时,对比了WHERE和HAVING的用法,强调HAVING必须在GROUP BY之后使用,并在适当场景下推荐使用WHERE以提高效率。
摘要由CSDN通过智能技术生成

前情回顾

之前在初级篇中,我们已经了解过了分组聚合。不过,仅仅是分组聚合不能解决这样一个问题,比如说,我希望找出平均年龄在20岁以上的组,因此,我们还需要可以为分组聚合的结果指定条件。

首先,我们还是按照惯例,先创建一个数据表。

create table Student(
    id int not null auto_increment,
    name varchar(50) not null,
    gender enum('男', '女', '不便透露'),
    age tinyint,
    primary key(id)
);

然后,我们为这个数据表中插入一些数据。

insert into Student values
    (0, '瞎老弟', '男', 18),
    (0, '瞎老妹', '女', 12),
    (0, '瞎宝宝', '不便透露', 1),
    (0, '孙先生', '男', 34),
    (0, '韩老师', '男', 28),
    (0, '陈大妈', '女', 38),
    (0, '李学长', '男', 19);

通过having为分组聚合指定条件

select <列1>, <列2>...

        from <表名>

        group by <列1>, <列2>...

        having <条件>

从使用方法中,我们可以看出,首先需要使用group by,然后才能使用having,在having中,可以使用聚合函数,而在之前我们常使用的where中,不可以使用聚合函数。

比如说,我们希望得到所有性别分别对应的人数,应该这样做

select gender, count(*)
    from Student
    group by gender;

如果,我们要为他添加条件,比如说,找到只有1个人的组,那么应该加上having

select gender, count(*)
    from Student
    group by gender
    having count(*) = 1;

或者,我们通过性别对所有人进行分组,并且找到所有平均年龄大于20的组,应该这样做

select gender, avg(age)
    from Student
    group by gender
    having avg(age) > 20;

having和where的异同

首先,我们要注意where和having使用顺序上的不同

where必须要在group by之前使用

having必须要在group by之后使用

有些时候,使用having和where的效果是一样的

比如说,我们对性别进行分组,然后找到性别为男性的这一组。这种情况下,并不需要在where或者having中,使用到聚合函数

如果,我们通过where来完成,需要这样做

select gender, avg(age)
    from Student
    where gender = '男'
    group by gender;

如果,我们通过having来完成,需要这样做

select gender, avg(age)
    from Student
    group by gender
    having gender = '男';

这两段代码,虽然使用上所有不同,但是其运行结果,是完全一致的。那么,在这种情况下,也就是当where和having都能够完成相同任务的情况下,建议要使用where,不要使用having。

点击查看瞎老弟mysql系列全部文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值