Mysql 查询语句(四)

Mysql 查询语句(四)

分组—group by

语法:
select … from 表名 group by 字段名
分组大多与聚合函数一起用,单独使用用处不大!

--示例:
--按照性别分组,查询所有的性别
select name from students group by gender;
--此处查询语句是错的,这里报错输出的结果是叫target list,就是我们需要的那个信息,就是select后面跟着的字段由于开启了ONLY_FULL_GROUP_BY的设置,所以如果一个字段没有在target list和group by字段中同时出现,或者是聚合函数的值的话,那么这条sql查询是被mysql认为非法的,会报错误。
--我们要想查询出来,那么这个字段需要同时在target list和group by字段中出现,这里我们可以使用gender字段
select gender from students group by gender;

--计算每种性别中的人数
select gender, count(*) from students group by gender;
--这里我们可以使用我们之前所有的聚合函数,我们以最大值做例子
--计算每种性别中的最大年龄
select gender, max(age) from students group by gender;
--关于其他的聚合函数,我们就不做演示了,可以自己试一试!

在这里插入图片描述
在这里插入图片描述

关于其他的聚合函数,我们就不做演示了,可以自己试一试!

需求:此时我们能知道每个组里有多少数据,但是呢我们不知到里面都有谁,比如说我们知道按性别分组,男性有五人,女性有七人,中性有一人,保密有一人,但是我们想要知道魅族里有那些人,具体是谁,这里我们就需要用到一个方法啦

group_concat(…)

--示例:
--查询同种性别中的姓名
select gender,group_concat(name) from students group by gender;

在这里插入图片描述

这里我们又有了一个新需求,我们只想要性别为男性的所有人的姓名
这里就时加了一个条件,所以我们可以用到条件查询where,那么where加在哪里呢?我们之前的条件查询时where都是加在表名后的,所以这里我们仍然可以加在表名(students)后。

示例:
--给所有性别分组,查询性别为男性的所有人的姓名
select gender,group_concat(name) from students where gender=1 group by gender;

在这里插入图片描述
这里我们又双叒叕有了一个新需求,我们想要性别为男性的所有人的姓名,每个人的年龄、id等信息
那么我们又该怎样做呢?这里我们用了group_concat(…),我们可直接在group_concat()里加我么你想要的信息就行了。

示例:
--给所有性别分组,查询性别为男性的所有人的姓名,包括年龄、ID等信息
select gender,group_concat(name, age, id) from students where gender=1 group by gender;

在这里插入图片描述
这里我们可以看到红色方框里的数字都是连在一起的,那么我们怎么知道那个时年龄,那个是ID呢?
group_concat()里面不仅仅可以添加字段名,我么你也可以加上空格(" ",),下划线(_)等,这样我们就可以分开了。下面我们来实现下:

--给所有性别分组,查询性别为男性的所有人的姓名,包括年龄、ID等信息
select gender,group_concat(name, ' ', age, ' ', id) from students where gender=1 group by gender;
select gender,group_concat(name, '_', age, '_', id) from students where gender=1 group by gender;

在这里插入图片描述
这样我们可以清楚的看到表中信息啦!

不好意思,我们又双叒叕有一个新需求,😂,难道我们分组后只能显示所有分组吗?能不能不显示某些分组,答案当然是可以的,这里我们有需要用到另外一个东西啦,它就是having,having的一大特点就是对分组进行条件判断,而不是对结果。

--查询平均年龄超过30岁的性别,以及组里人的姓名
select gender, group_concat(name) from students group by gender having avg(age)>30;

在这里插入图片描述
我们怎么知道这两组的平均年龄是不是大于30呢,我么你加上年龄来验证下,同时我们也加上另外两个组的信息一起来验证下。

select gender, group_concat(name), avg(age) from students group by gender having avg(age)>30;
select gender, group_concat(name), avg(age) from students group by gender;

在这里插入图片描述

这里我们验证后,没有问题!
那么问题来了,where 和 having 的区别在那里呢,where 是对表的数据进行条件判断,而having是对查出来的结果分组后的数据进行条件判断。而不是对原表进行判断。

这些就是分组的内容啦,下次介绍排序,分页等内容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值