表
sno | s_name | gender | speciality |
---|---|---|---|
1001 | 张三 | 男 | 计算机 |
1002 | 李四 | 男 | 计算机 |
1003 | 王五 | 女 | 会计 |
1004 | 赵六 | 男 | 物流管理 |
1005 | 麦赖 | 女 | 商务英语 |
1006 | 孙七 | 女 | 物流管理 |
1007 | 周八 | 男 | 物联网 |
1008 | 吴九 | 女 | 通信工程 |
1009 | 郑十 | 男 | 网络工程 |
分组查询GroupBy+Group_concat
在数据库中,通过 group by 将查询结果按照1个或多个字段进行分组,字段值相同的为一组
Group_concat可以将分组的结果保存成集合
- 根据
speciality
分组,查看每组里的姓名 - 代码示例:
SELECT speciality, GROUP_CONCAT(s_name) FROM students GROUP BY speciality;
运行结果:
- 根据
gender
分组,查看每组里的姓名 - 代码示例:
SELECT gender, GROUP_CONCAT(s_name) FROM students GROUP BY gender;
运行结果:
分组查询+聚合函数
根据speciality
分组,使用聚合函数count()
计算组里的人数
代码示例:
SELECT speciality, GROUP_CONCAT(s_name), COUNT(*) FROM students GROUP BY speciality;
运行结果:
分组查询+having
- having 用来分组查询后指定条件来输出查询结果
- having 和 where 一样,但 having 只能作用于 group by
根据speciality
分组,查看性别为男的信息
代码示例:
SELECT speciality, gender, GROUP_CONCAT(s_name), COUNT(*) FROM students
GROUP BY speciality,gender
HAVING gender='男';
运行结果:
注意: having后面存在的字段必须含在分组筛选后的数据里
where和having的区别
having 和 where 的区别:
- where是在分组前对数据过滤,having是在分组后对数据过滤
- having后面可以接聚合函数,where不行
- where是对分组前记录的条件,如果某行记录没有满足where子句的条件,那么这行记录不会参加分组;而having是对分组后数据的约束