关于子查询.ppt

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于子查询

6.1.7 子查询 在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。 子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句内,或其它子查询中 子查询的 SELECT 查询总是使用圆括号括起来 一、条件子查询 这类子查询嵌套在 SELECT、INSERT、UPDATE、DELETE 语句的 WHERE 或 HAVING 子句内 先执行内层子查询,再逐层向外执行 只显示最外层查询的结果 包括子查询的语句通常采用以下格式中的一种 WHERE 列名 [NOT] IN (子查询) WHERE 表达式 比较运算符 [ANY|ALL] (子查询) WHERE [NOT] EXISTS (子查询) 带比较运算符的子查询指父查询与子查询之间用比较运算符连接, 当用户能确切知道内层查询返回的是单个值时,可用、、=、=、=、运算符 例1 查询与“刘晨”在同一个系学习的学生 题目分解: 1. 查出刘晨所在的系 2.查询这个系的学生姓名和系名 3.是除了刘晨以外的学生 例1 查询与“刘晨”在同一个系学习的学生 题目分解: 1. 查出刘晨所在的系 2.查询这个系的学生姓名和系名 3.是除了刘晨以外的学生 例1 查询与“刘晨”在同一个系学习的学生 SELECT Sno, Sname, Sdept FROM Student WHERE Sdept = (SELECT Sdept FROM Student WHERE Sname=‘刘晨’) and Sname ! = ‘刘晨’ 使用嵌套查询时 确定需要查询的表 并分解问题 例2 查询成绩不低于90的学生的学号姓名 SELECT Sno, Sname FROM Student WHERE Sno IN ( SELECT DISTINCT Sno FROM SC WHERE Grade = 90) 例6-62 查询与法人“华顺达水泥股份有限公司”的经济性质相同的法人名称 例6-63 查询在“工商银行北京A支行”贷过款的法人名称 例6-64 查询没有贷过款的法人代码、名称和其经济性质 例6-65 查询没有在“工商银行北京B支行”银行贷过款的法人代码、法人名称及其经济性质 例6-66 查询与法人“华顺达水泥股份有限公司”的经济性质相同的法人名称 每个企业的经济性质是唯一的 例2. 查询‘C01’课程考试成绩最高的学生的姓名 分析 要取到“最高”成绩,意味着需要用聚合函数,也就不可能用这样的语句: SELECT sno,MAX(Grade) FROM SC WHERE Cno = ‘C01‘ 例2. 查询‘C01’课程考试成绩最高的学生的姓名 分析 3.姓名在Student表中可得,需要知道学号 2.满足条件的学号,需要从SC中查出,条件是知道成绩(而且最高成绩是唯一的) 1. 指定课程的最高成绩值,从SC中查出 例2. 查询‘C01’课程考试成绩最高的学生的姓名 SELECT Sname FROM Student WHERE Sno IN ( SELECT Sno FROM SC WHERE Grade = ( SELECT MAX(Grade) FROM SC WHERE Cno = ‘C01’) and cno = ‘C01’) 例6-67 查询在银行“B111B”贷款金额最高的法人的名称、经济性质和注册资金 例6-68查询在银行“B111B”贷款且贷款金额高于此银行的平均贷款额的法人的代码、贷款日期和贷款金额 二、相关子查询 相关子查询在子查询的Where子句中关联外部表 可以用EXISTS( )函数引导 EXISTS代表存在量词,带EXISTS函数的子查询不返回结果数据,只产生逻辑真值和逻辑假值。 例1.查询选修了C01课程的学生姓名 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno = Student.Sno AND Cno = ‘C01’) 注1:处理过程为:先外后内;由外层的值决定内层的结果;内层执行次数由外层结果数决定。 注2: 由于EXISTS的子查询只能返回真或假值,因此在这里给出列名无意义。所以在有EXISTS的子查询中,其目标列表达式通常都用*。 上句的处理过程为: 1.找外层表Student表的第一行,根据其Sno值处理内

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档