group by,order by以及group by..order by的使用总结

前言

  • sql 语句的关键词执行顺序:(注意select 与order by的执行顺序)
    from>where>group by>having>select>order by

group by的使用

  • 分组方法:按指定的一列或多列值分组,值相等的为一组。
    1.使用聚合函数count,sum,avg,max,min。未对查询结果分组,聚合函数将作用于整个查询结果。对查询结果分组后,集函数将分别作用于每个组。
    有如下数据表:
    例1.1 对整个的表进行count
SELECT cno,count(sno) from sc

例1.2 对每个分组进行count

SELECT cno,count(sno) from sc group by cno
  1. 使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性(比如:sno)和聚集函数(比如:count())
    例:
select sno,count(cno) from sc group by sno

结果:
在这里插入图片描述
3.多个属性进行分组(可翻译为:每个…每个…)
例:

select cno,grade,count(cno) from sc group by cno,grade

在这里插入图片描述
以上统计的是每门课程每一个分数值有多少个(人)。
4. group by 后接having一同使用,使用having对 只有满足HAVING短语指定条件的才输出。(注意是对组的筛选)
例:查询选修了3门以上课程的学生学号

select sno from sc group by sno having count(cno)>3

在这里插入图片描述
5.注意having与where的使用区别:

  • WHERE子句作用于基表或视图,从中选择满足条件的元组,而HAVING短语作用于,从中选择满足条件的
    例子:查询选修了3门以上课程,且所有课程成绩都高于60分的学生学号及课程数
select sno , count(cno)
from sc 
where grade > 60  
group by sno having count(cno) > 3

在这里插入图片描述

order by的使用

  • 作用:使用order by,一般是用来,依照查询结果的某一列(或多列)属性,进行排序。对于含有NULL的数据,为了好记忆,可以把null值看做无穷大,因为不知道具体为多少。然后去考虑排序,asc升序null肯定在最后,而desc降序,null肯定在最前面。
    例1:单列排序
select * from s order by sno desc

在这里插入图片描述
2.多个属性列排序

  • 选择多个列属性进行排序,然后排序的顺序是,从左到右,依次排序。
select * from s  
order by sname desc, sage desc

在这里插入图片描述

group by 与order by 共同使用(重点)

例:需要查询每个人领取的最高奖励并且从大到小排序
原始表
在这里插入图片描述
1.错误实现:

SELECT id, uid, money, datatime FROM qipa_reward GROUP BY uid ORDER BY money DESC

在这里插入图片描述
而用户id3的最高奖励为1730,所以以上并不对。原因是:这是因为group by 和 order by 一起使用时,会先使用group by 分组,并取出分组后的第一条数据,所以后面的order by 排序时根据取出来的第一条数据来排序的,但是第一条数据不一定是分组里面的最大数据。
2. 方法一:先排序,再分组,使用子查询

SELECT
	r.id,
	r.uid,
	r.money,
	r.datatime 
FROM
	( SELECT id, uid, money, datatime FROM qipa_reward ORDER BY money DESC ) r 
GROUP BY
	r.uid 
ORDER BY
	r.money DESC;

在这里插入图片描述
方法二:如果不需要取得整条记录,则可以使用 max()
注意该方法的使用前提:不需要取得整条记录。看一下结果就明白:

SELECT id, uid, money, datatime, MAX(money) FROM qipa_reward GROUP BY uid ORDER BY MAX(money) DESC;

结果为:
在这里插入图片描述
从以上结果可以看出:使用max()取得的记录,money字段和max(money)字段不一致,这是因为这里只是取出了该uid的最大值,但是该最大值对应的整条记录没有取出来。
如果需要取得整条记录,则不能使用这种方法,可以使用子查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值