SQL Server那些年我们一齐开过之[分组查询]

分组查询

于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查询每个参加考试的学员的平均分

每个参加考试的学习者平均分,学员对应学员编号肯定为group
by的分组依据,平均分动avg()函数计算出来

select studentno as 学员编号,AVG(studentresult) as 平均分
from Result
group by StudentNo

 

–03查询各门课的平均分,并以降序排列

每门课的平均分,按降序排列,group
by的分租依据是subjectid(课程编号)平均分则利用avg()函数计算出来

用order by 平均分 desc 来进行降序排列

select subjectid as 课程编号 , SUM(studentresult) as 平均分
from Result
group by SubjectId
order by 平均分 desc

04查询每个学生与的有所考试的总分,并遵循降序排列

每个学员具有考试总分,按降序排列,group
by的分组依据是studentno(学生编号),总分利用sum()函数进行测算

末了采取order by总分desc来进行降序排序

select studentno as 学生编号 ,SUM(StudentResult) as 总分
from Result
group by StudentNo
order by 总分 desc

 
05询问每学期学时数过50的科目数

每学期学时过50底学科数,group
by的分组依据是gradeid(年级编号),现有一个限标准学常莫跳50,这里用where来界定他classhour>50

select * from Subject
select gradeid as 年级编号,COUNT(classhour) as 课程数
from Subject
where classhour>50
group by GradeId 

 

06查询各学期学生的平均年龄

各个学期学生的平均年龄,group
by的分组依据是studentno(学生编号),平均年龄用datediff()进行拍卖得出年龄,用avg()在进展处理,得出平均年龄.

select studentno as 学生编号,AVG(DATEDIFF(yy,birthday,GETDATE())) as 平均年龄
from Student
group by StudentNo

07查询北京地区的诸学期学生人数

北京地区的各个学期学生人数.group
by的分组依据是gradeid
,学生人数用count(studentno)得出学生人数,最后来只限标准,只询问北京地区的,用where进行限,address
like ‘%北京%’%代表擅自长度的字符.

select gradeid as 年级编号,COUNT(studentno) as 学生人数
from Student
where Address like '%北京%'
group by GradeId

 

08询问参加考试的生中平均分及格的学童记录,并依照成绩降序排列

参加考试的学员被平均分及格的学习者记录,按降序排列,group
by
分组依据是studentno,平均分用av(studentresult)进行计算产生平均分,having进行判断avg(studentresult)>60是否过关,在用order
by  平均分及格 desc进行降序排列.

select Studentno as 学生编号,AVG(Studentresult) as 平均分及格
from Result
group by StudentNo
having AVG(Studentresult)>=60
order by 平均分及格 desc

 

09查询考试日期呢2009年9月9如泣如诉的教程的合格平均分

考日期为2009年9月9号的课程的通关平均分,group by
的分组依据是学科编号,限定条件是考试日期呢2009年9月9哀号

where ExamDate>=’2009-9-9′ and  ExamDate<‘2009-9-10’.最后进行过滤及格平均分having
avg(studentresult)>=60.

select subjectid,AVG(studentresult) as 及格平均分
from Result
where ExamDate>='2009-9-9' and  ExamDate<'2009-9-10'
group by SubjectId
having AVG(StudentResult)>=60

 

10询问至少一涂鸦试验不合格的生学号,不及格次数

考试不合格的学生学号,不过关次数,先限定条件不沾边的学童成,在本学生学号进行分组,group
by studentno

select studentno as 学生编号,COUNT(1) as 次数
from Result
where StudentResult<60
group by StudentNo

 谢谢大家抽出宝贵的工夫来拘禁,希望对而具备助,如果认为写得还足以的乞求支持,加关注!如果起甚问题要发送到自我的邮箱

18813091329@163.com

QQ:2991635691

相关文章