mysql select符合查询_数据库select group by 和having语句 多表连接查询 复合查询

1.SELECT --group by 子句

cc2ca80c94ea9580873f54e5cbeeab36.png

group by子句按照指定的列column_name对表数据进行分组

group by 后面跟的列也叫分组特性列

使用group by后,能选择的列  通常只能包括分组特性列和聚合函数

聚合函数  ???

1.按照班号分组,列出学生表中的班号 (注意:按照班号进行分组,班号就不会有重复值)

select cno from stugroup bycno;cno分组特性列

b1d655922375307a0780804882237555.png

2.按照班号分组,列出学生表中的班号,还要列出学生姓名

select sname,cno from stu group by cno;

查询报错

注意:学生有20人,姓名一共20行记录,班号分组去重后有4行记录,20行无法与4行拼接在一起

使用group by后,能选择的列通常只能包括分组特性列和聚合函数

除非用group_concat字符串聚合函数把每个班的学生姓名变成字符串,每个班一行:

select cno,group_concat(sname) from stu group by cno;

232530b5b22619ea14dae4d6f8f1f518.png

3.按照班号分组,列出学生表中的班号,统计每个班的平均身高,平均体重,人数,最高分,不包括未分班的那些同学

select cno 班号,avg(height) 平均身高,avg(weight) 平均体重,count(*) 人数,max(score) 最高分 from stu where cno is not null group by cno;

e42844251660fbb28d6b02071e6cfb9a.png

4.先按照班号分组,再按照性别分组,列出学生表中的班号和性别,统计出每个班男女生的平均身高,平均体重,人数,最高分,不包括未分班的那些同学,结果先按班号,再按照男女s的顺序排序

select cno 班号,sex 性别,avg(height) 平均身高,avg(weight) 平均体重,count(*) 人数,max(score) 最高分 from stuwhere cno is not nullgroup bycno,sex order by cno,sex desc;

264d572fb73e338336390194a7a571a5.png

5.按照学生出生年份分组,统计出所有学生每个年份的人数,最高分,最低分,按照年份排序

select year(birth) 出生年份,count(sno) 人数,max(score) 最高分, min(score) 最低分 from stu group by year(birth) order by 1;+分组特性列和函数

0bcea854cb13e7248821436421e5f50a.png

2.SELECT - HAVING子句

33133a3756b5133f43ab78dc5b9439e1.png

HAVING子句是对group by产生的结果集的过滤

HAVING子句可以对分组特性列column_name进行过滤,也可以对聚合函数(aggregate_function(列))的值进行过滤

1.按照学生出生年份分组,统计出所有学生每个出生年份的人数,最高分,最低分,按照年份排序,并从结果中找出人数超过2个,并且最高分有超过700分的年份分组

select year(birth) 出生年份,count(sno) 人数,max(score) 最高分, min(score) 最低分 from stu group by year(birth) having count(*)>2 and max(score)>700 order by 1;

分组特性列+分组函数having有 where没有

ff67466e048371ff3f64cc2435817374.png

2.已分班的学生中,哪些班学生的平均身高超过175,列出其班号和人数

select cno 班号,count(*) 人数 from stu where cno is not null group by cno having avg(height)>175 order by 1;

cee19b122144ce522f9131bfcbc34ba8.png

已分班的学生中,哪些班的学生每个人的体重都超过50公斤,列出其班号和人数

select cno 班号,count(*) 人数 from stu where cno is not null group by cno having min(weight)>50 order by 1;

ae5f3e8bdad2d7b97d77e8414e83a99d.png

统计1班的学生人数,列出班号和人数

select cno 班号,count(*) 人数 from stu group by cno having cno=1;

0a56fb49dd6f9f7c3d3615ff45e4235d.png

或者

select 1 班号,count(*) 人数 from stu where cno=1;

第一种方法先使用group by统计,再用having过滤统计结果,统计了和1班不相干的其他班级的人数,浪费了系统CPU资源,效率低;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值