SQL子查询和嵌套查询_第1页
SQL子查询和嵌套查询_第2页
SQL子查询和嵌套查询_第3页
SQL子查询和嵌套查询_第4页
SQL子查询和嵌套查询_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

什么是嵌套查询 嵌套查询是指在一个外层查询中包含有另一个内层查询 即一个 SQL 查询语句块可以 嵌套在另一个查询块的 WHERE 子句中 其中外层查询称为父查询 主查询 内层查询也 称为子查询 从查询 什么是子查询 子查询是 SELECT 语句内的另外一条 SELECT 语句 而且常常被称为内查询或是内 SELECT 语句 SELECT INSERT UPDATE 或 DELETE 命令中允许是一个表达式的地 方都可以包含子查询 子查询甚至可以包含在另外一个子查询中 1 语法 子查询的句法如下 SELECT ALL DISTINCT FROM WHERE GROUP BY HAVING 2 语法规则 1 子查询的 SELECT 查询总使用圆括号括起来 2 不能包括 COMPUTE 或 FOR BROWSE 子句 3 如果同时指定 TOP 子句 则可能只包括 ORDER BY 子句 4 子查询最多可以嵌套 32 层 个别查询可能会不支持 32 层嵌套 5 任何可以使用表达式的地方都可以使用子查询 只要它返回的是单个值 6 如果某个表只出现在子查询中而不出现在外部查询中 那么该表中的列就无法包 含在输出中 3 语法格式 1 WHERE 查询表达式 NOT IN 子查询 2 WHERE 查询表达式 比较运算符 ANY ALL 子查询 3 WHERE NOT EXISTS 子查询 简单嵌套查询 嵌套查询内层子查询通常作为搜索条件的一部分呈现在 WHERE 或 HAVING 子句中 例如 把一个表达式的值和一个由子查询生成的一个值相比较 这个测试类似于简单比较 测试 子查询比较测试用到的运算符是 子查询比较测试把一个表 达式的值和由子查询的产生的一个值进行比较 返回比较结果为 TRUE 的记录 下面在 student 表中 查询 课程成绩 96 分的同学信息 在查询分析器中输入 的 SQL 语句如下 use student select from student where 学号 select 学号 from grade where 课程成绩 96 实现的过程如图 1 所示 图 1 成绩大于 90 分的同学信息 子查询 select 学号 from grade where 课程成绩 96 的查询结果是 B003 即是一 个值 子查询过程如下 1 从 grade 表中查询出 课程成绩 96 的学生学号为 B003 2 从学生表中查询出 学号 是 B003 的学生信息 带 IN 的嵌套查询 带 IN 的嵌套查询语法格式为 WHERE 查询表达式 IN 子查询 一些嵌套内层的子查询会产生一个值 也有一些子查询会返回一列值 即子查询不能 返回带几行和几列数据的表 原因在于子查询的结果必须适合外层查询的语句 当子查询 产生一系列值时 适合用带 IN 的嵌套查询 把查询表达式单个数据和由子查询产生的一系列的数值相比较 如果数值匹配一系列 值中的一个 则返回 TRUE 下面在 student 和 grade 表中 查询参加考试的同学信息 在查询分析器中输入 的 SQL 语句如下 use student select from student where 学号 in select 学号 from grade 实现的过程如图 1 所示 图 1 参加考试的同学信息 子查询 select 学号 from grade 的结果如图 2 所示 图 2 子查询结果 子查询生成 grade 表中学号列的数值 WHERE 子句检查主查询记录中的值是否与 子查询结果中的数值匹配 匹配返回 TRUE 值 由于主查询记录的 B006 的学号值与子 查询结果的数值不匹配 所以查询结果不显示学号为 B006 的记录信息 带 IN 的内层嵌套还可以是多个值的列表 例如 查询 年龄 是 22 21 24 的学生信息 SQL 语句如下 use student select from student where 年龄 in 21 22 24 带 NOT IN 的嵌套查询 NOT IN 的嵌套查询语法格式 WHERE 查询表达式 NOT IN 子查询 NOT IN 和 IN 的查询过程相类似 在 course 和 grade 表中 查询没有考试的课程信息 SQL 语句如下 use student select from course where 课程代号 not in select 课程代号 from grade where 课程代号 is not null 实现的过程如图 1 所示 图 1 没有考试的课程信息 查询过程是用主查询中 课程代号 的值与子查询结果中的值比较 不匹配返回真值 由于主查询中的 k05 和 k06 的课程代号值与子查询的结果的数据不匹配 返回真值 所以查询结果显示课程代号为 k05 和 k06 的课程信息 子查询存在 NULL 值时 避免使用 NOT IN 因为当子查询的结果包括了 NULL 值的 列表时 把 NULL 值当成一个未知数据 不会存在查询值不在列表中的记录 下面在 student 和 grade 表中 查询没参加考试的同学 程序运行的结果如图 2 所示 图 2 没参加考试的同学信息 SQL 语句如下 use student select from student where 学号 not in select 学号 from grade 由于子查询的结果包括了 NULL 值 所以最终的查询结果只有空值 正确查询的 SQL 语句如下 use student select from student where 学号 not in select 学号 from grade where 学号 is not null 实现的过程如图 3 所示 图 3 正确的没参加考试的同学信息 综上所述 当嵌套子查询中存 NULL 值 避免使用 NOT IN 带 SOME 的嵌套查询 SQL 支持 3 种定量比较谓词 SOME ANY 和 ALL 它们都是判断是否任何或全部返 回值都满足搜索要求的 其中 SOME 和 ANY 谓词是存在量的 只注重是否有返回值满足 搜索要求 这两种谓词含义相同 可以替换使用 下面在 student 表中 查询 年龄 小于平均年龄的所有学生信息 在查询分析器 中输入的 SQL 语句如下 use student select from student where 年龄 some select avg 年龄 from student 实现的过程如图 1 所示 图 1 用 SOME 查询 年龄 小于平均年龄的学生 SOME 是把每一行指定的列值与子查询的结果进行比较 如果哪行的比较结果为真 满足条件就返回该行 本实例的嵌套的子查询结果就是一个数值 然后 student 学生表 的每一条记录的年龄列值与之相比较 满足就返回行 带 ANY 的嵌套查询 ANY 属于 SQL 支持的 3 种定量谓词之一 且和 SOME 完全等价 即能用 SOME 的地 方完全可以使用 ANY 使用 ANY 解决上述示例 在查询分析器中输入的 SQL 语句如下 use student select from student where 年龄 any select avg 年龄 from student 实现的过程如图 1 所示 图 1 用 ANY 查询 年龄 小于平均年龄的学生 SQL 中定量谓词不支持反操作 也就是说 不能在 ANY 或者 SOME 前加 NOT 关键字 但可以用 号表示否定 下面在 student 表中 查询 年龄 不等于平均年龄的所有学生信息 在查询分析 器中输入的 SQL 语句如下 use student select from student where 年龄any select avg 年龄 from student 实现的过程如图 2 所示 图 2 年龄不等于平均年龄的学生 带 ALL 的嵌套查询 ALL 谓词的使用方法和 ANY 或者 SOME 谓词一样 也是把列值与子查询结果进行比 较 但是它不要求任意结果值的列值为真 而是要求所有列的查询结果都为真 否则就不 返回行 下面查询除了这些 课程代号 的课程信息 这些 课程代号 是指相应的 课程成 绩 大于 90 分的 课程代号 在查询分析器中输入的 SQL 语句如下 use student select from course where 课程代号 all select 课程代号 from grade where 课程成绩 90 实现的过程如图 1 所示 图 1 带 ALL 的嵌套查询 SQL 的这几个定量谓词 都可以使用 6 种比较运算符中的任何运算符 带 EXISTS 的嵌套查询 EXISTS 谓词只注重子查询是否返回行 如果子查询返回一个或多个行 谓词返回为真 值 否则为假 EXISTS 搜索条件并不真正地使用子查询的结果 它仅仅测试子查询是否 产生任何结果 用带 in 的嵌套查询也可以用带 EXISTS 的嵌套查询改写 下面把用带 IN 的嵌套查询写的例子改为用 EXISTS 书写的嵌套查询 在查询分析器中 输入的 SQL 语句如下 use student select from student where exists select 学号 from grade where student 学号 grade 学号 实现的过程如图 1 所示 图 1 查询参加考试的学生信息 EXISTS 谓词子查询中的 SELECT 子句中可使用任何列名 也可使用任意多个列 这 种谓词只注重是否返回行 而不注重行的内容 用户可以规定任何列名或者只使用一个星 号 例如上述例子的 SQL 语句和下面的 SQL 语句完全等价 use student select from student where exists select from grade where student 学号 grade 学号 NOT E

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论