mysql排序以及分组查询巩固(含题型)

Order by 的使用

升序:asc;
降序:desc降序;
如果不指定asc或者desc,结果集默认按ASC进行排序;
语法格式:

select字段名1,字段名2,….
From 表名
Orderby字段名1[asc|desc],字段名2[asc|desc]…

查询sc表的内容,要求按照成绩降序排列;
order by:排序
语法结构:order by+该字段 [asc|desc]:asc(升序排列,省略) desc(降序排列,desc不能升序)

select * from sc order by degree desc;

(1)order by 可以对单个列进行排序

例1:查询sc表的内容,并按照成绩降序排列;
例2:查询student表里的sbirthday字段,并按照年龄进行降序排序;

select sbirthday from student order by sbirthday asc;
select sbirthday from student order by timestampdiff(year,sbirthday,now()) desc;

(2)order by对多个列进行排序

例1:查询sc表内容,按照课程递增、成绩递减进行排序;

select * from sc order by cno asc,degree desc;

可以发现:那个字段在前面,先按照那个字段进行排序;然后再进行第二个字段排序优先规则:哪个字段在前面,先排序哪个字段;再去排后面的字段;

例2:查询teaching表,按照课程号(cno)递增、学期(cterm)递增进行排序;

select * from teaching order by cno asc,cterm asc;

使用顺序:
Order by 当结果集出来之后就可以进行排序,即:where → group by → having → order by
limit(限制条目)在语句的最后,起到限制的作用

分组查询

一个电器销售电销售洗衣机、冰箱、电视剧等,到了月份需要分类统计洗衣机、冰箱、电视机销售总数。像这种,对数据进行统计按照一定的类别进行统计,我们都需要使用分组查询;

分组查询:group by,需要注意的是,group by 通常是和聚合函sum、avg、count一块使用;
问题1:查询sc表每个学生的平均成绩

select avg(degree) from sc;

问题2:查询sc表里每门课程的平均的成绩;

select avg(degree) from sc group by cno;

问题3:查询student表里每个系有多少名学生;

select count(*) from student group by sdept;

问题4:查询student表里男生和女生分别有多少人;

select count(*) from student group by ssex;

多个字段进行分组

例1:查询每个系男生、女生分别有多少人?

select sdept,ssex,count(*) from student group by sdept,ssex;

例2:查询每个系,每个班分别有男生和女生多少人?

select sdept,classno,ssex,count(*) from student group by sdept,classno,ssex;

group by 字句也和where条件语句结合在一起使用。当结合在一起时,where在前,group by 在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组 ;
注意点:
1.where肯定在group by 之前
2.where后的条件表达式里不允许使用聚合函数,而having可以。
逻辑:where子句先筛选,筛选后再用这个group by进行分组;
位置上一致: where-group by

group by和where子句一块使用

例1:查询每个系男生有多少人?

select sdept,ssex,count(*) from student where ssex="男" group by sdept;

where 先进行筛选,然后group by 再进行分组;

例2:查询每个系年龄不大于40岁的有多少人;

select count(*) from student 
where timestampdiff(year,sbirthday,now())<=40 
group by sdept;

select sdept,count(*) from student where 
timestampdiff(year,sbirthday,now())<=40 
group by sdept;

题型综合

1、查询sc表里每门课程的选修人数;
分组查询的关键点:找到分组字段
count:统计有多少行,每一行记录代表一个人

select cno,count(*) from sc group by cno;

2、查询sc表里每个学生的总成绩;

select sno,sum(degree) from sc group by sno;
select sum(degree) from sc;

3、查询teacher表里每个系分别有多少男老师和女老师;
group by:不仅单个字段进行分组,一次性可以对多个字段进行分组

select tdept,tsex,count(*) from teacher group by tdept,tsex;

4、查询teacher表里每个系年龄不超过50岁的女老师有多少人;

select tdept,count(*) from teacher 
where timestampdiff(year,tbirthday,now())<=50 and tsex="女" 
group by tdept;

5、查询teacher表里男老师和女老师分别有多少人

select tsex,count(*) from teacher group by tsex;

6、查询student表里每个系每个专业分别有多少男生和女生?(注:其中student表里speciality字段表示专业)
group by 字段1,字段2,…字段n;

select sdept,speciality,ssex,count(*) from student group by sdept,speciality,ssex;

7、查询student表里每个专业年龄在32-40岁的女学生有多少人

select speciality,count(*) from student 
where timestampdiff(year,sbirthday,now()) between 32 and 40 and ssex="女" 
group by speciality;

8、查询sc表里学号在2007010101-2007030111之间的每个学生的平均成绩,并按照平均成绩降序排列;

select sno,avg(degree) from sc 
where sno between 2007010101 and 2007030111 
group by sno 
order by avg(degree) desc;

9、查询student表里信息工程系,软件工程系,计算机工程系学生分别有多少人,并按照人数升序排列;

select sdept,count(*) from student 
where sdept in("信息工程系","软件工程系","计算机工程系") 
group by sdept;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侬本多情。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值