目录

  • 前言
  • 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

结果:

GROUP BY怎么执行索引的 group by sort by_数据


3.多个属性进行分组(可翻译为:每个…每个…)

例:

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

GROUP BY怎么执行索引的 group by sort by_数据_02


以上统计的是每门课程每一个分数值有多少个(人)。

4. group by 后接having一同使用,使用having对 只有满足HAVING短语指定条件的才输出。(注意是对组的筛选)

例:查询选修了3门以上课程的学生学号

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

GROUP BY怎么执行索引的 group by sort by_数据库_03


5.注意having与where的使用区别:

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

GROUP BY怎么执行索引的 group by sort by_数据_04

order by的使用

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

GROUP BY怎么执行索引的 group by sort by_数据库_05


2.多个属性列排序

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

GROUP BY怎么执行索引的 group by sort by_GROUP BY怎么执行索引的_06

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

例:需要查询每个人领取的最高奖励并且从大到小排序

原始表

GROUP BY怎么执行索引的 group by sort by_hive_07


1.错误实现:

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

GROUP BY怎么执行索引的 group by sort by_GROUP BY怎么执行索引的_08


而用户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;

GROUP BY怎么执行索引的 group by sort by_sql_09


方法二:如果不需要取得整条记录,则可以使用 max()

注意该方法的使用前提:不需要取得整条记录。看一下结果就明白:

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

结果为:

GROUP BY怎么执行索引的 group by sort by_数据库_10


从以上结果可以看出:使用max()取得的记录,money字段和max(money)字段不一致,这是因为这里只是取出了该uid的最大值,但是该最大值对应的整条记录没有取出来。

如果需要取得整条记录,则不能使用这种方法,可以使用子查询。