



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL中EXISTS的用法 比如在Northwind数据库中 有一个查询为 SELECT c. CustomerID, CompanyName FROM Customers c WHERE EXISTS ( SELECT OrderID FROM Orders 0 WHERE 0.CustomerID = c.CustomerID ) ;这里面的EXISTS是如何运作呢?子查询返回的是OrderID字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢?EXISTS用于检查子查询是否至少会返回一行数据? 该子查询实际上并不返回任何数据,而是返回值True或False他所带的子查询一般直接用 SELECT * 因为给出列名也没多少意义。EXISTS指定一个子查询,检测行的存在。 (详见D )对于 EXISTS subquery 中的子查询subquery是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。 结果类型Boolean 。如果子查询包含行,则返回 TRUE。A、其实:EXISTS属于相关子查询,也就是说子查询的条件依赖于外层父查询的查个属性值。比如:SELECT SnameFROM StudentWHERE EXISTS ( SELECT * FROM C /*SC为课程表,Student为学生表*/ WHERE Sno=Student.Sno AND Cno =1);依赖也就是这一句“ Sno=Student.Sno”。这个查询过程不是一般的自下而上执行,他与外查询依赖,执行的时候是先从父查询中取一个元组(该元组是全属性的),然后根据条件 Sno=Student.Sno 处理内查询,得到结果。(详见D )然后进行父查询中取第二个元组,如此反复。EXISTS 的子查询,有一些是不能被其它形式的子查询等价替换的,但是所有 IN、比较运算符、ANY 和ALL 的子查询都能用带有EXISTS 的子查询等价替换。但是在做的时候,请考虑效率问题,哪种高效用啊种,这是优化问题。EXISTS只要知道内查询是否为空值就可以了,所以效率要比用IN的查询要高效一些。B、在子查询中使用 NULL 仍然返回结果集:这个例子在子查询中指定 NULL,并返回结果集,通过使用 EXISTS 仍取值为 TRUE。 SELECT CategoryNameFROM CategoriesWHERE EXISTS (SELECT NULL);C、比较使用 EXISTS 和 IN 的查询:这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。 例1:用EXISTS :SELECT DISTINCT pub_nameFROM publishersWHERE EXISTS( SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = business);用IN :SELECT DISTINCT pub_nameFROM publishersWHERE pub_id IN ( SELECT pub_id FROM titles WHERE type = business);任一查询的结果集: pub_name- Algodata InfosystemsNew Moon Books(2 row(s) affected)例2: 本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名: 用EXISTS :SELECT titleFROM titlesWHERE EXISTS ( SELECT * FROM publishers WHERE pub_id = titles.pub_id AND city LIKE B%);用IN :SELECT titleFROM titlesWHERE pub_id IN ( SELECT pub_id FROM publishers WHERE city LIKE B%);任一查询的结果集: title - The Busy Executives Database Guide Cooking with Computers: Surreptitious Balance Sheets You Can Combat Computer Stress! Straight Talk About Computers But Is It User Friendly? Secrets of Silicon Valley Net Etiquette Is Anger the Enemy? Life Without Fear Prolonged Data Deprivation: Four Case Studies Emotional Security: A New Algorithm (11 row(s) affected)D、进一步细究EXISTS和IN:若要判断某班是否存在一个名为小明的学生用IN :小明 IN (SELECT SNAMEFROM STUDENT);其中(select sname from student) 返回的是一个全班姓名的集合,in用于判断小明是否为此集合中的一个数据;用EXISTS :EXISTS (SELECT *FROM STUDENTWHERE SNAME=小明);这两个函数是差不多的, 但是由于优化方案的不同, 通常NOT EXISTS要比NOT IN 要快。因为NOT EXISTS可以使用结合算法而NOT IN就不行了,而EXISTS则不如IN快, 因为这时候IN可能更多的使用结合算法。SELECT * FROM 表A WHERE EXISTS(SELECT * FROM 表B WHERE 表B.id = 表A.id );相当于 SELECT * FROM 表A WHERE id IN (SELECT id FROM 表B );对于表A的每一条数据,都执行select * from 表B where
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚协议范例:财产分割与子女抚养权协议书
- 珠海日式花园施工方案
- 高端科技公司内部员工股权回购与转让协议
- 家用净水器租赁与水质安全风险评估及维护服务协议
- 生态园区物业管理合同续签及可持续发展协议
- 集中供热系统运行评估方案
- 旅游包团合同中的行程安排、费用承担及安全保障
- 浙二护理考试题库及答案
- 离婚协议共同债务分割与子女赡养金支付协议
- 桥梁工程破桩头施工与桥梁结构检测合同范本
- 《数据库系统概论》教案
- 小学学校“十五五”(2026-2030)发展规划
- 2025一建《建设工程项目管理》考前十页纸(完整版)
- 红楼梦第34回课件
- GB/T 43355-2023塑料和其他无孔材料表面抗病毒活性的测定
- 生产作业管理讲义
- 诗和词的区别课件
- 战现场急救技术教案
- 内蒙古电网介绍
- 气力输送计算
- 公共关系学授课教案
评论
0/150
提交评论