SQL单值与多值子查询的应用举例.pptVIP

  • 25
  • 0
  • 约2.07千字
  • 约 9页
  • 2016-11-03 发布于湖北
  • 举报
SQL单值与多值子查询的应用举例

什么是子查询 子查询是指一条SELECT语句作为另一条SQL语句的一部分,也就是说如果一个查询返回一个单值或一列值并嵌套在SELECT、INSERT、UPDATE或DELETE语句中,则称之为子查询,包含子查询的外层SELECT语句称为主查询或外层查询,内层的SELECT语句称为子查询或内部查询。 一个子查询还可以嵌套任意数量的子查询,但子查询必须用圆括号括起来。 子查询的分类 子查询分嵌套子查询和相关子查询两种: (1)嵌套子查询 嵌套子查询的执行不依赖于外层查询(主查询),其执行过程为:先执行子查询(只执行一次),其结果不显示,仅将子查询的一个单值或者一列多值作为外部查询的条件使用,然后执行外部查询并显示查询结果。 (2)相关子查询 相关子查询就是子查询的执行依赖于外部查询,子查询根据外查询提供的数据进行查询,再将结果返回给外部查询。 单值子查询的应用 单值子查询通过集合函数或者通过WHERE条件可以得到单个值,外部查询可以在条件表达式中使用该值进行比较运算。 select * from 成绩表 where 分数 (select avg(分数) from 成绩表 ) 就是单值子查询的例子。 训练: 查询“成绩表”中考试成绩等于最高分的成绩记录。 提示:1) max (分数) 可以获取最高分; 2) 等于最高分的成绩可能有多个并列。 多值嵌套子查询的应用 若子查询返回数据表的一列值,外查询可以使用列表包含运算符in或not in与返回的该列多值进行比较。 例:根据“成绩表”的记录,查询分数高于80分的学生姓名。 分析:学生姓名不在“成绩表”中 (1)数据准备 检查数据表中的数据或创建数据表并添加数据 select * from 学生表 Create table学生表 (学号 char(8),姓名 varchar(8)) Insert 学生表 values 张三) Insert 学生表 values 李四) Insert 学生表 values 王五) Insert 学生表 values 赵六) Insert 学生表 values 陈亮) Insert 学生表 values 张芳) 注:成绩表的数据准备见”SQL子查询简单应用” (2)“成绩表”中可以查询分数高于80分的学生的学号 select 学号 from 成绩表 where 分数80 (3)在学生表中可以查询(由于分数80 分别06209005) Select 姓名 from 学生表 where 学号= or 学号= or 学号= = select 姓名 from 学生表 where 学号 in06209003 (4)合并成复合语句 select 姓名 from 学生表 where 学号 in (select 学号 from 成绩表 where 分数80) (5)训练:显示所有姓张的学生的成绩记录。 嵌套子查询归纳 嵌套子查询的执行不依赖于外层查询,其执行过程为:先执行子查询(只执行一次),其结果不显示,仅将子查询的一个单值或者一列多值作为外部查询的条件使用,然后执行外部查询并显示查询结果。 嵌套子查询扩展 列表运算符ANY与包含运算符IN功能大致相同,IN可以独立进行相等(包含)比较,而ANY必须与比较运算符配合使用,但可以进行任何比较。 列表比较的条件表达式格式: 表达式 比较运算符 ANY (子查询的一列值) 表达式 比较运算符 ALL (子查询的一列值) 该条件将表达式与子查询返回的一整列值逐一比较: 只要有一个比较成立:ANY结果为TRUE(相当于或运算)。 只有全部比较都成立:ALL结果为TRUE(相当于与运算)。 在SQL-92标准中还可以使用SOME运算符与ANY 等效。 SELECT * FROM 学生表 WHERE 学号=ANY( SELECT 学号 FROM 成绩表 WHERE 分数80) 注意:其中 “=ANY”可用“in”代替;“ALL”可用“not in ”代替。 举例:根据“成绩表”的记录,查询“成绩表”中没有成绩记录的学生记录。 SELECT * FROM 学生表 WHERE 学号ALL( SELECT 学号 FROM 成绩表 ) 注意:其中 “ALL”可用“not in”代替。 SELECT * FROM 学生表 WHERE 学号 not in ( SELECT 学号 FROM 成绩表 ) 训练:在“成绩表”和“学

文档评论(0)

1亿VIP精品文档

相关文档