全面解析SQL嵌套子查询
[ ]嵌套查询是SQL语句的扩展,也是结构化查询的精髓。本文结合若干实例,从四个方面全面解析了嵌套查询的使用方法和使用技巧。
[关键词]SQL 语句;全面解析;嵌套;子查询
在一个SQL语句的WHERE 子句或HAVING 子句中嵌套另一个SELECT 语句的查询称为嵌套查询,又称子查询。子查询是SQL 语句的扩展,也是结构化查询的精髓所在。熟练地掌握SQL嵌套子查询的使用是每个数据库管理员必需的基本能力。本文结合一些实例,深入浅出地讲解了SQL嵌套查询的几种应用情况。
1 子查询使用原则
(1)一个子查询必须放在圆括号中。
(2)将子查询放在比较条件的右边以增加可读性。子查询不能包含 ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句, 并且如果指定了它就必须放在主 SELECT 语句的最后。
(3)在子查询中可以使用两种比较条件:单行运算符和多行运算符。
2 使用谓词[not]in的子查询
(1)格式:select  from  where  in(select  )
(2)语句执行顺序:通常从内层到外层,即子查询为不相关子查询。这里的不相关子查询指与父查询不相关,先于父查询运行。查询除了不相关子查询还有相关子查询,相关子查询指的是子查询要以父表为条件,这个在 [not]exists 查询中将会使用到。
(3)书写语句方法:逐步替换法。
实例1:查询选修课程名为数据库的学生姓名
分析:sname — sno;Sno—cno;Cno—cname
第一步:求课程名为数据库的课程号。Select cno from c where cname=‘数据库’,查询结果为课程号集合,设为A
第二步:查询选修课程名为数据库的学生学号exists子查询,相当于课程号在A中的学生学号。Select sno from SC where cno in A,替换为:select sno from SC where cno in (select cno from c where cname=‘数据库’),查询结果为学号集合,设为B
第三步:查询选修课程名为数据库的学生姓名,相当于查询在B中的学生姓名。Select sname from S where sno in B,替换为:Select sname from S where sno in(select sno from SC where cno in(select cno from c where cname=‘数据库’)),也可以用连接查询来实现(但不是所有的嵌套查询都能转换为连接查询)Select sname from S,C,SC,where s.sno=sc.sno and sco=co and cname=‘数据库’。
3 使用比较运算符θ的查询
格式:select   from   where   θ(select   )
单值 θ单值
实例2:查询比学号为0102学生年龄大的学生。Select * from s where sage>(select sage from s where sno=0102)
4 使用谓词any或者all的查询
格式:select  from   where   θ{any/all}(select   )
注意:anyall必须与比较运算符配合使用
单值 θ{any/all}集合
>any 大于子查询结果中的某个值 相当于 >min
>all大于子查询结果中的所有值 相当于 >max
any 不等于子查询结果中的某个值 无意义
all 不等于子查询结果中的所有值相当于not in
实例3:查询比信息系所有学生年龄大的学生姓名
Select sname from S where sage>=all(select sage from S where sdept=‘信息’)
Select sname from S where sage>=(select max(sage) from S where sdept=‘信息’)
实例4:查询平均成绩最高的学生学号
方案1:Select sno from SC where avg(grade)>=all(select avg(grade) from SC group by sno)
方案2:Select sno from SC where avg(grade)>=(select max(avg(grade)) from SC group by sno) 在执行的过程中会发现方案2是错误的,这是因为集函数是不能嵌套的。
从以上实例可以看出,嵌套查询可以将一系列简单查询构成复杂查询,增强查询能力。以层层嵌套的方式构造查询充分体现了SQL“结构化的特点。因此,掌握好SQL嵌套查询可以轻易的处理好现实查询中复杂的查询问题,提高查询工作效率。
参考文献:
[1]谷震离.基于SQL查询语句的查询优化方法[J].计算机时代,2005(2).
[2]何成万,姚峰.SQL生成器的设计与实现[J].计算机工程与设计,2006(11).

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。