一个select...From...Where查询语句块可以嵌套在另一个select...From...Where查询块的Where子句
中,称为嵌套查询。外层查询称为父查询,主查询。内层查询称为子查询,从查询。
子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。子查询中不能有order by分组语句。
先处理子查询,再处理父查询。 
----------------------------

1。 简单嵌套查询 
     查询选修课程号为'101'并且成绩高于学生号为'9501101'的所有学生的成绩.
select * from sclass 
where cno='101' and degree>=
(select degree from sclass where sno='9501101'and cno='101') 
select * from 成绩表
where 课程成绩<=
(select 课程成绩 from 成绩表 where 学号='20020001'and 课程代号='2002030002')
----------------------------
2。 带[not] in的嵌套查询 
    查询有选修了课程的学生。
select sno,sname from student 
where sno in(Select distinct sno from sclass)
查询没有选修了课程的学生。
select sno,sname from student 
where sno not in(Select distinct sno from sclass)

select 学生表.学号,学生表.姓名,成绩表.课程成绩,成绩表.课程代号 from 学生表,成绩表
where 学生表.学号=成绩表.学号
and 学生表.院系名称 in(Select distinct 院系名称 from 学生表) 
        ----------------------------
3。 带 some | any | all 的嵌套查询
语法:
scalar_expression{=|<>|!=|>|>=|!>|<|<=|!<}
{some|any|ALL}(子查询)
SOME是SQL中的逻辑运算符号,如果在一系列比较中,有些为TRUE,那么就为TRUE。
     ANY 是SQL中的逻辑运算符号,如果在一系列比较中,任何一个为TRUE,那么就为TRUE。
ALL 是SQL中的逻辑运算符号,如果在一系列比较中,全部都为TRUE,那么就为TRUE。

带any的嵌套查询和some的嵌套查询功能是一样的。
早期的SQL仅仅允许使用any,后来的版本为了和英语的any相区分,引入了some,
同时还保留了any关键词。
select degree from sclass where cno='101'
go
select * 
from sclass 
where cno='101' and degree >some|any(select degree from sclass where cno='101')
go
select sno from sclass where cno='101'
go
select * 
from student
where sno=some|any(select sno from sclass where cno='101')
go
select 学生表.学号,学生表.姓名,学生表.院系名称,成绩表.课程代号,成绩表.课程成绩
from 成绩表,学生表
where 成绩表.学号=学生表.学号
and 学生表.院系名称 =some|any(select 院系名称 from 学生表 where 性别='女')
select 学生表.学号,学生表.姓名,学生表.院系名称,成绩表.课程代号,成绩表.课程成绩
from 成绩表,学生表
where 成绩表.学号=学生表.学号
and 成绩表.课程成绩 <all(select 课程成绩 from 成绩表 where 课程代号='2002030001')

select emp.empno,emp.ename,emp.job,emp.sal 
from scott.emp 
where sal >some|any(select sal from scott.emp where job='MANAGER'); 
    带any的查询过程等价于两步的执行过程。 
     (1)执行“select sal from scott.emp where job='MANAGER'”,其结果如图4.22所示。 
      
     (2)查询到3个薪水值2975、2850和2450,父查询执行下列语句。 
        select emp.empno,emp.ename,emp.job,emp.sal from scott.emp 
where sal >2975 or sal>2850 or sal>2450;
        SELECT emp.empno,emp.ename,emp.job,emp.sal 
FROM scott.emp 
where sal >all(select sal from scott.emp where job='MANAGER'); 
        带all的嵌套查询与【some】的步骤相同。 
     (1)子查询,结果如图4.22所示。 
     (2)父查询执行下列语句。 
     SELECT emp.empno,emp.ename,emp.job,emp.sal 
FROM scott.emp 
WHERE sal >2975 and sal>2850 and sal>2450; 
----------------------------

4。 带exists的嵌套查询
EXISTS是SQL中的逻辑运算符号,如果子查询包含一些行,那么就为TRUE。
语法为:exists 子查询
子查询是一个受限的SELECT语句,不允许有COMPUTE子句和INTO关键字。
exists为存在之意,它只查找满足条件的哪些记录,一旦找到第一个匹配的记录后,就马上停止查找

SELECT column1 FROM table1 WHERE EXISTS ( SELECT column1 FROM table2 WHERE table1.column1 
= table2.column1 );
select * from student
where exists(select * from sclass where sclass.sno=student.sno)
select * from 学生表
where exists(select * from 成绩表 where 成绩表.学号=学生表.学号)

SELECT emp.empno,emp.ename,emp.job,emp.sal 
FROM scott.emp,scott.dept 
WHERE exists (SELECT * FROM scott.emp WHERE scott.emp.deptno=scott.dept.deptno); 
----------------------------

5。交并差操作:
交操作的嵌套查询: 
     交操作就是集合中交集的概念。属于集合A且属于集合B的元素总和就是交集。    
     (select deptno from scott.emp) intersect (select deptno from scott.dept);    
并操作的嵌套查询: 
     并操作就是集合中并集的概念。属于集合A或集合B的元素总和就是并集。 
(select id,sno from student) union (select id,sno from sclass);
      (select deptno from scott.emp) union (select deptno from scott.dept);     
     
   差操作的嵌套查询: 
     差操作就是集合中差集的概念。属于集合A且不属于集合B的元素总和就是差集。 
     (select deptno from scott.dept) minus (select deptno from scott.emp); 
       《并、交和差操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。》 
----------------------------
总结:
性能:
子查询很重要的一个方面就是性能表现。便利性是有代价的,
它取决于你所使用的表和声明的大小,数量和复杂性,还有你可能会允许你的
应用软件做处理工作。每一个查询在被主查询作为资源使用之前,
都将被完整地单独处理。如果可能的话,创造性地使用JOIN声明可以以较少的
滞后时间提供出相同的信息。
技巧:
子查询除非能确保内层select只返回一个行的值,否则应在外层where子句中用
一个in限定符,即要返回多个值,要用in或者not in哦,所以当在编译过程中出
现“子查询只返回一个值”的错误时,就要考虑是不是要用in和not in

T-SQL查询语句(二):嵌套查询的更多相关文章

  1. 超实用的SQL语句之嵌套查询

    嵌套查询 什么是嵌套查询 . 嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询. ...

  2. Sql Server系列:嵌套查询

    嵌套查询是指一个查询语句嵌套在另一个查询语句内部的查询.嵌套查询也就子查询,在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或多个表.子查询中可以使用比较运 ...

  3. SQL基础--查询之二--连接查询

    SQL基础--查询之二--连接查询

  4. SQL系列(二)—— 查询(select)

    在开始之前先了解下SQL中的操作分类.根据与数据库不同操作的交互,对数据不同的处理类型,可以将SQL分为四种:插入.删除.修改.查询.本篇文章中主要介绍查询操作.其实查询操作也是日常应用使用最为频繁且 ...

  5. Mysql的查询语句(联合查询、连接查询、子查询等)

    Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...

  6. mysql 存储过程:提供查询语句并返回查询执行影响的行数

    mysql 存储过程:提供查询语句并返回查询执行影响的行数DELIMITER $$ DROP PROCEDURE IF EXISTS `p_get_select_row_number`$$ CREAT ...

  7. MySQL进阶 9: 联合查询 - 查询语句1 union 查询语句2 union ...

    #进阶 : 联合查询 /* union 联合 合并: 将多条查询语句的结果合并成一个结果 语法: 查询语句1 union 查询语句2 union ... 应用语境: 要查询的结果来自多个表,但查询的列 ...

  8. SQL简单嵌套查询与非嵌套查询的比较(MSSQL2005)

    某天的工作是修复某个项目的bug,接着就发现,其sql极其混乱,有非常多的left join和in操作,还有嵌套查询(只有一个表的嵌套查询).不知道看到过哪里的资料说,嵌套查询速度慢,于是我把全部嵌套 ...

  9. [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. C语言学习之路,第一篇章。

    看的书是 C  primer plus  ,这本书好评很多, 学过C#,没有精通,了解Java,所以看这本书会很容易上手,编译器用的是VC++6.0,因为VS2010好像不支持C99标准,有些代码功能 ...

  2. linux添加静态路由表,重新启动继续有效

    在日常使用中.要么server于.有两个地址,两块网卡的配置,访问不同网段.这样的情况是非常普遍的现象.但,我们需要添加到路由表中的一个额外的,以确定通过正确的网关发送的数据包,并interface能 ...

  3. Redis MSET的极限在哪里

    ·背景 Redis以"快.准.狠"而著称,除了其主-从模式略失光彩(主从模式更多是被以讹传讹,3.0依旧在测试中),大部分的应用可谓尖兵利器.在一些常规写的时候,MSET和HMSE ...

  4. Android学习之 WebView使用小结

    这段时间基于项目须要 在开发中与WebView的接触比較多,前段时间关于HTML5规范尘埃落定的消息出如今各大IT社区头版上,更有人说:HTML5将颠覆原生App开发 尽管我不太认同这一点 可是关于H ...

  5. WaitHandle、AutoResetEvent、ManualResetEvent

    多线程中的锁系统(三)-WaitHandle.AutoResetEvent.ManualResetEvent 介绍 本章主要说下基于内核模式构造的线程同步方式,事件,信号量. 目录 一:理论 二:Wa ...

  6. C#实现接口xml序列化与反序列化

    C#实现接口xml序列化与反序列化   C#中接口无法被xml序列化,提示不支持.百度和bing也搜不到,只好自己动手写了 原理上肯定支持,.Net自己的xml序列化有一个IXmlSerializab ...

  7. C# 解析bt种子

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...

  8. Linux Kernel的Makefile与Kconfig文件的语法

    https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt Introduction ------------ The c ...

  9. TODOList项目

    [ 爱上Swift]十二期:TODOList项目   好久没有写Swift甚是想念,Swift,Xcode都比较稳定了写个程序熟悉一下,当然时间原因都是小Demo,废话不多说先上图. 下面是跑起来之后 ...

  10. CSS3教程:box-sizing属性的理解border、padding与容器宽度的关系

    说到 IE 的 bug,一个臭名昭著的例子是它对于“盒模型”的错误解释:在 IE5.x 以及 Quirks 模式的 IE6/7 中,将 border 与 padding 都包含在 width 之内.这 ...