排序输出
** 使用ORDER BY子句可以对查询结果进行排序。**
语法格式: ORDER BY <列名> [ASC|DESC] , <列名>[ASC|DESC]
注意:如果在order by子句中使用多个列进行排序,则这些列在该子句中出现的顺序决定了对结果集进行排序的方式。
按班级升序列出“学生信息表”中学生信息,同一个班级的再按年 龄由小到大 排序
select * from dbo.学生信息表
order by ClName,year(getdate()) - year(Birthdate)
重定向输出
可以使用 into 子句把查询结果放到一个新表中
语法格式:
select [列名1,列名2…列名n ] INTO 新表名
from 表名
[ where 表达式]
查询“学生信息表”中全体男同学的学号、姓名、年龄和所在班级,并将结果保存到新表newstudent中
select StID 学号,StName 姓名,year(getdate()) - year(Birthdate) 年龄,ClName 班级 into newstudent
from dbo.学生信息表
where StSex = '男'
分组与筛选
① 分组
使用group by 子句可以实现分组统计,但是必须与聚合函数配合使用。
- 语法格式:
– SELECT [列名列表1], 汇总表达式
– FROM 表名
– GROUP BY 列名列表2
–说明:列名列表1与列名列表2,二者相同。*
分别统计学生选课表中每门课程的课程编号和平均成绩
一般但语句中出现每一个中的啥,就把着每一个先进行分组
select Cno ,avg(Score) 平均成绩 from dbo.学生选课表
group by Cno
② 筛选
使用HAVING筛选子句可以为分组和聚合查询指定查询条件,功能与where子句类似。
语法格式:select [列名列表1],聚合函数(列名)
– from 表名
– [group by 列名列表]
– [having 条件表达式]
查询学生选课表中学生平均成绩大于85的课程的课程编号和平均成绩。(先查出来,然后才能筛选)
select Cno 课程号,avg(Score) 平均成绩 from dbo.学生选课表
group by Cno
having avg(Score) > 85--having是在分组查询之后才被执行,是最后一步
注意:
对于分组统计查询 ,SELECT子句的属性列表有什么特点?
-获取数据的列名列表与参与分组的列名列表,二者必须相同。
WHERE 与 HAVING两者的区别?
①二者都为查询数据指定查询条件。
②where子句必须在group by子句之前,having子句必须在group by子句之后。
③where 子句中条件表达式不能包含聚合函数,having子句中条件表达式可以包含聚合函数。