文章目录
- 一、子查询
- 嵌套子查询
- 相关子查询
- 二、查询运算
- 并运算union
- 交运算intersect
- 差运算except
- 三、函数的使用
- if语句
- while语句
- case语句
- 四、总结
前言
高级子查询是对查询更灵活的运用,学会了高级查询将对数据库使用有很大的帮助。
一、子查询
1、子查询简介
在SQL语言中,一个select-from-where语句称为一个查询块。如果一个select语句嵌套在另一个select、insert、update或delete语句中,则称之为子查询或内层查询。
包含子查询的语句则称为主查询或父查询,一个子查询可以嵌套在另一个子查询中,这样就可以形成:父查询->子查询->子查询......
where子句中的子查询通常有如下几种形式:
where <列名> (not) in (子查询)
where <列名> (>=) <= (子查询)
where <列名> exists (子查询)
下面分别介绍上述几种形式的子查询。
2、嵌套子查询
嵌套子查询指在内层查询中不关联外层查询的子查询,在where下面的这种子查询,要么返回一个单值,要么返回一个值的列表,嵌套子查询的信息传递是单项的,子查询只向外传递信息。
形式如下:
select *from 表
where 列名 (not) in
( select * from ...)
例如:select *from 表
where sno in(子查询)
子查询 求sno 张三、sno李四...
现在有学生表如下:
查询与李晨是同一个系的学生
基本思路:查找结果是学生信息,条件是在where中寻找相同的系,子查询条件是和李晨相同的系,则在子查询中查询所有和李晨相同系的系名即可
select * from student
where dept in
(select dept from student
where sname = '李晨'
)
查找考试成绩大于等于90岁的学生的学号和姓名
基本思路:
方法1:首先应从sc表中找出所有成绩大于等于90的学生学号,然后再根据这些学号在student表中查找出对应的学生学号和姓名,此方法不连接表
方法2:直接连接sc表 设置条件为grade>=90
select sno ,sname from student
where sno in
(select sno from sc
where grade>=90
)
3、相关子查询
相关子查询与嵌套子查询的主要区别在于信息传递,嵌套子查询的信息传递是单向的,子查询向外传递信息。相关子查询的信息传递是双向的,子查询给外层查询传递信息,外层查询也向子查询传递信息。
相关子查询的执行过程可分为3个步骤:
1、从外层查询获取一条记录,并将该记录信息传递给内层查询
2、内层查询根据外层查询传递的值执行查询操作
3、内层查询将执行结果传回给外层查询,外层查询利用返回值完成对当前记录的处理
SC表如下:
由于内层查询和外层查询使用的是同一张表,而且内、外层查询都需要从对方处获取信息,因此需要为表取别名以区分是外层查询的表还是内层查询的表
查询每门课程中考试成绩低于该门课程的平均成绩的学生的课程号、学号和成绩
分析:要的东西是:课程号、学号和成绩,条件是考试成绩低于--课程平均成绩
则子查询为:课程平均成绩
select cno,sno,grade from sc sc1
where grade <
( select avg(grade) from sc sc2
where sc1.cno = sc2.cno
)
二、查询运算
SQL支持对查询结果再进行并、交、差运算。每个运算都有属于自己的关键字。
1、并运算
并运算可将两个或多个查询语句的结果集 合并为一个结果集,并运算关键字为:union,可以让两个表或多个表以行的形式合并,之前的join on是以列的形式合并。
如示意图所示:
并运算的语法格式如下:
select 语句1
union
select 语句2
......
规定:两个语句的列数必须相同,列数的数据类型必须相同或兼容
union all 保留重复的数据行,union 不保留重复数据行
course表和course2表如下:
合并course表和course2表
select *from course
union
select *from course2
由于限定列数和类型相同,所以对表的要求很高
2、交运算
交运算是返回同时在两个集合中出现的记录,即返回两个查询结果列值相同的记录,其关键词为:intersect
course表和course2表如下:
查询同时出现在course表和course2表中的记录
select *from course
intersect
select *from course2
3、差运算
差运算是返回一个表中有但另一个表中没有的记录,实现差运算的关键词为:except
course表和course2表如下:
查询在course1表中有但在course2表中没有的记录
select *from course
except
select *from course2
查询在course2表中有但在course1表中没有的记录
select *from course2
except
select *from course
三、函数的使用
在使用SQL语句编程时,经常需要按照指定的条件进行控制转移或重复执行某些操作,这个过程可以通过流程控制语句来实现!
流程控制语句用于控制程序的流程,一般分为三类:顺序,分支和循环。SQL Server也提供了对这三种流程控制的支持!!!
1、if分支语句
if~else语句用于构造分支选择结构,是最基本的选择结构,可以利用if~else语句对一个条件进行测试,并根据测试结果执行相应的操作!!!
声明一个整形变量@grade,给该变量赋值为88,并判断如果@grade大于等于90,则显示“优”,如果@grade在80~89之间则显示“良”,如果小于80则显示其他
declare @grade int
set @grade = 88
if @grade>=90
print '优'
else if @grade between 80 and 89
print '良'
else
print '其他'
2、while语句
while语句用于设置重复执行的语句块,例如遍历某个重复代码。如果嵌套了两个或多个while循环,则内层的break将会退出到下一个外层循环。
用while循环实现计算5000减1、减2、减3、......一直减到50的结果,并显示最终结果
declare @i int,@sum int
set @i=1
set @sum=5000
while @i<=50
begin
set @sum = @sum-@i
set @i = @i+1
end
print @sum
3、case语句
case表达式是一种多分支表达式,它可以根据条件列表的值返回多个可能的结果表达式中的一个。
case表达式可用在任何允许使用表达式的地方,但它不是一个完整的SQL语句,因此不能单独执行,只能作为可以单独执行的语句的一部分来使用。
学生表如下:
查询学生表的考试情况,列出学号、姓名和成绩,同时对成绩进行如下处理:
如果成绩大于等于90分,则在查询结果中显示“优”;
如果成绩在80到89分之间,则在查询结果中显示“良”;
如果成绩在70到79分之间,则在查询结果中显示“中”;
如果成绩在60到69分之间,则在查询结果中显示“及格”;
如果成绩在60分以下,则查询结果中显示“不及格。
select id,name,grade,
case
when grade >=90 then '优'
when grade between 80 and 89 then '良'
when grade between 70 and 79 then '中'
when grade between 60 and 69 then '及格'
when grade <60 then '不及格'
end as 成绩
from student
四、总结
本章主要介绍了SQK Server 查询语句的高级使用,以及一系列辅助查询的小知识点。首先介绍了子查询的嵌套子查询,只返回一个值或一个列表,并且传递由内到外是单项的,相关子查询是内外相互影响,是双向的。子查询大概有三种形式,要么in ,要么比值符号,要么exists存在的意思。
往后介绍了并运算union:两个表合在一起去掉重复的,交运算intersect:两张表重复的部分,差运算except:一张表有另一张表没有的部分。最后介绍了几种函数语句的使用。
总体只介绍了这些东西的基本语法,并没有很深入的探讨,先打好基础了解大概,以后遇到真正的问题能够更快更好的学习,慢慢加深数据库的知识,可以积少成多,一步一步的走下去!!!