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 = '女'