分组查询
在SQL Server中使用的分组查询是ORDER BY子句,使用ORDER BY子句要同聚合函数配合使用才能完成分组查询,在SELECT查询的字段中如果字段没有使用聚合函数就必须出现在ORDER BY子句中(即SELECT后边的字段名要么出现在聚合函数中,要么在ORDER BY子句中使用)
使用group by进行分组查询
在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:
*被分组的列
*为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数
注意:group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
HAVING子句与WHERE子句的区别
HAVING子句和WHERE子句的相似之处在于,它也定义搜索条件。但与WHERE子句不同,HAVING子句与组有关,而不是与单个的行有关。
1、如果指定了GROUP BY子句,那么HAVING子句定义的搜索条件将作用于这个GROUP BY子句创建的那些组。
2、如果指定WHERE子句,而没有指定GROUP BY子句,那么HAVING子句定义的搜索条件将作用于WHERE子句的输出,并把这个输出看作是一个组。
3、如果既没有指定GROUP BY子句也没有指定WHERE子句,那么HAVING子句定义的搜索条件将作用于FROM子句的输出,并把这个输出看作是一个组。
4、在SELECT语句中,WHERE和HAVING子句的执行顺序不同。上面SELECT语句的执行步骤可知,WHERE子句只能接收来自FROM子句的输入,而HAVING子句则可以接收来自GROUP BY子句、WHERE子句和FROM子句的输入。
S-TQL语句执行顺序
select 5:投影 ,映射为对应的列
from 1:定位到表
where 2:进行分组前的第一次筛选
group by 3:分组
having 4:对分组后的数据进行第二次筛选
order by 6:对映射出的结果进行排序
注意:where后面不能加聚合函数
三个顺序:
01where:对表中记录进行筛选(分组前)
02group by 分组依据
03having 对分组后的数据进行筛选
见到having,之前必须有group by,因为having是对分组后的数据进行筛选
三者使用顺序不可颠倒
eg:
myschool数据库中有四张表,分别为student(学生表)result(成绩表)subject(科目表)grade(年级表)
01查询每个年级的总学时数,并按照升序排列
题目是每个年级的总学时数,每个年级肯定做为group by的分组依据,总学时则利用sum()函数
至于order by后也可以跟SUM(classhour).写总学时数的目的是为了更详细的理解语句的执行顺序
select gradeid as 年级编号,SUM(classhour) as 总学时数
from Subject
group by GradeId
order by 总学时数
02查询每个参加考试的学员的平均分