您的位置:首页 > 数据库

SQL server 2012之数据查询(5)— 对查询结果排序、分组、建立新表等操作

2019-05-02 11:08 633 查看

1.order by子句

在应用中经常要对查询结果排序输出,select语句中的order by子句可用于对查询结果按照一个或多个字段的值进行升序(asc)或降序(desc)排序,一般情况下升序可以省略asc,降序desc不能省略。
其语法为:

order by <排序项> [asc | desc][,...n]

例1、 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。

select sno,grade
from sc
where cno = '3'
order by grade desc;

注意:对于空值,排序时显示的次序由具体系统实现来决定。例如按升序排,含空值的元组最后显示;按降序排,空值的元组则最先显示。各个系统的实现可以不同,只要保持一致就行。

例2、 查询全体学生情况,查询结果按照所在系的系号升序排列,同一系中的学生按照年龄降序排列。

select *
from student
order by sdept,sage desc

注意:不能对数据类型为text或image的列使用order by。同样,在order by 列表中也不允许使用子查询、集合和常量表达式;不过可以使用在select子句中出现的集合或表达式的别名。

例3、 查询所有课程的Cno,Cname,Cpno,Ccredit和学时(学时= Ccredit *18)),结果按(课程号、课程名、先行课、学分和学时显示,并按照学时的降序排列。

select cno 课程号 ,cname 课程名,cpno 先行课,ccredit 学分,学时 = ccredit*18
from course
order by 学时 desc

2.使用聚合函数

为了进一步方便用户,增强检索功能,SQL提供了许多聚集函数,主要有:

函数说明:参数all指对所有的值进行聚合函数运算,all是默认值。distinct指对所有不重复非空值进行聚合函数运算。<列名>可以是除text、image或ntext以外的任何类型的表达式。其中count(* )不需要任何参数,不能与distinct一起使用。在聚集函数遇到空值时,除count(*)外,都跳过空值而只处理非空值。

例4、 查询学生总人数

select count(*)
from student

例5、 查询参加选修学生的个数

select count(distinct sno) as 选课学生人数
from sc

例6、 计算1号课程的学生平均成绩

select avg(grade) as 1号课程平均成绩
from sc
where cno = '1'

注意:where子句中是不能用聚合函数作为条件表达式的,聚集函数只能用于select子句和group by中的having子句中。

3.对查询结果分组

select语句的group by子句用于将查询结果表按某一列或多列的值进行分组,值相等的为一组;
对查询结果分组的主要目的:为了细化聚合函数的作用对象。如果未对查询结果分组,聚合函数将作用于整个查询结果,分组后将作用于每一个组,即每一个组都有一个函数值。

例7、 求各个课程号及相应的选课人数

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

注:使用group by子句之后,select子句中的列表只能包含在group by中指出的列或在聚合函数中的指定的列。

例8、 统计student表中各院系男生和女生的人数

select sdept,ssex,count(*) as 人数
from student
group by ssex,sdept

3.使用having子句

如果使用GROUP BY子句分组后,还可以按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,那么使用HAVING 子句来指定筛选条件。
在SELECT语句中,当where、group by与having子句都被使用时,要注意他们的作用和执行顺序;

  • where用于筛选由from指定的数据对象;
  • group by用于对where的结果进行分组;
  • hving则是对group by以后的分组数据进行过滤。

例9 查询人数大于500的院系的学生数量

select sdept count(*) as 人数
from student
group by sdept
having count(*) >= 500

练习
1、查找男生人数超过20位的系(专业)名;
2、查看平均成绩在60以上的各个课程号和平均成绩。

1.
select sdept
from student
where ssex = '男'
group by sdept
having count(*) >= 20

2.
select cno,avg(grade) as 平均成绩
from sc
group by cno
having avg(grade)>=60

4.为查询建立新表

在查询语句执行完毕以后,查询的结果集通常是暂时显示在查询语句的下方,无法保存。如果想要保留查询的结果集,并把它保存成表的形式,可以使用INTO子句来完成。
INTO子句是与SELECT子句配合使用的,所以其语法格式如下:

select <select_list>
[into new_table]   //new_table新表的名字,中英文都可以
[from{table_source}{,...n}]
[where <search_condition>]

例10、 从student表中查询所有女学生基本信息,并生成一个新的“女生信息”表

select *
into 女生信息
from student
where ssex = '女'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐