(教学课件)数据库.ppt

  1. 1、本文档共196页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
相关子查询 在相关子查询中,子查询的执行依赖于外部查询,多数情况下是在子查询的WHERE子句中引用了外部查询的表。相关子查询的执行过程与前面所讲的查询完全不同,前面介绍的子查询在整个查询过程中只执行一次,而相关子查询中的子查询需要重复地执行。 相关子查询 相关子查询的执行过程是:子查询为外部查询的每一行执行一次,外部查询将子查询引用的外部字段的值传给子查询,进行子查询操作;外部查询根据子查询得到的结果或结果集返回满足条件的结果行;外部表的每一行都将做相同的处理。 相关子查询 【例4-27】 查询Books表中大于该类图书价格平均值的图书信息。(光盘:\源文件\第4章\例4-27) 相关子查询 与前面介绍过的子查询不同,该语句中的子查询无法独立于外部查询而得到解决。该子查询需要一个“类编号”值,而该值是个变量,随SQL Server检查Books表中的不同行而改变。下面详细说明该查询的执行过程: 相关子查询 先将Books表的第一条记录的“类编号”的值“13”代入到子查询中,则子查询变为如下形式: SELECT AVG(价格) FROM Books AS b WHERE 类编号=13 相关子查询 子查询的结果为该类图书的平均价格,如本例为20.9750,所以外部查询变为: SELECT 图书名,作者,出版社,类编号,价格 FROM Books As a WHERE 价格20.9750 相关子查询 如果WHERE条件为TRUE,则第一条记录包括在结果集中,否则不在结果集中。对Books表中的所有行运行相同的过程,最后形成一个结果集。 相关子查询 相关子查询 在子查询中,还可以通过运算符EXISTS来判断子查询的结果是否为空表。如果子查询的结果集不为空,EXISTS返回TRUE;否则返回FALSE。使用NOT EXIST时其返回值与EXISTS刚好相反。 相关子查询 【例4-28】 利用EXISTS查询所有支付过罚金的读者的信息。(光盘:\源文件\第4章\例4-28) 在查询分析器中输入并运行上述代码,其执行结果如下图所示。 使用EXISTS运算符的相关子查询 相关子查询 本例中由EXISTS引出的子查询属于相关子查询,该查询与下面用IN表示的非相关的子查询返回的结果一样: USE Library GO SELECT * 相关子查询 FROM Readers WHERE 读者编号 IN ( SELECT 读者编号 FROM BorrowHistory WHERE 支付罚金0 ) GO 相关子查询 另外,使用联接也可以实现【例4-28】中的查询,而且联接还可以同时显示来自多个表中的字段,代码如下: USE Library GO SELECT a.读者编号,a.姓名,b.图书编号,b.支付罚金 相关子查询 FROM Readers AS a JOIN BorrowHistory AS b ON a.读者编号=b.读者编号 WHERE b.支付罚金0 GO 在查询分析器中输入并运行上述代码,其执行结果如下图所示。 内联接 内联接有以下两种语法格式。 第一种格式:SELECT 列名列表FROM 表名l [INNER] JOIN 表名2 ON 表名1.列名=表名2.列名 第二种格式:SELECT 列名列表 FROM 表名l,表名2 WHERE 表名1.列名=表名2.列名 内联接 参数说明如下所示。 内联接是系统默认的联接,INNER选项可以省略。 内联接 若SELECT子句中有同名列,则必须用“表名.列名”来表示。为了方便使用,可以给表名定义别名。别名是在FROM子句中指定的,格式为“表名 AS 别名”或“表名 别名”。若为表指定了别名,则只能用“别名.列名”来表示同名列,不能用“表名.列名”表示。 内联接 【例4-20】 用内联接方法联接tl和t2两表,不去除重复列(读者编号)。观察联接后的结果集与交叉联接有何区别(光盘:\源文件\第4章\例4-20)。 内联接 USE Library GO SELECT * FROM t1 JOIN t2 ON t1.读者编号=t2.读者编号 GO 内联接 在查询分析器中输入并运行上述代码,其执行结果如下图。可以看到只有满足联接条件的记录才被拼接到结果集中,结果集是两个表中记录的交集。 有重复列的内联接 内联接 【例4-21】 用内联接方法联接tl和t2两表,去除重复列(读者编号)(光盘:\源文件\第4章\例4-21)。 内联接 USE Library GO SELECT a.读者编号,姓名,已借册数 FROM t1 a JOIN t2 b ON a.读者编号=b.读者编号 GO 内联接 在查询分析器中输入并运行上述代码,其执行结果如下图。可以看出结果集中不含重复列(读者编

文档评论(0)

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

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

1亿VIP精品文档

相关文档