`
wangchongbiao
  • 浏览: 53270 次
  • 性别: Icon_minigender_1
  • 来自: 河北、沧州
社区版块
存档分类
最新评论

exists的简单理解

    博客分类:
  • SQL
阅读更多

转自:http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html

 

比如在Northwind数据库中有一个查询为

 

SELECT c.CustomerId,CompanyName FROM Customers c
WHERE EXISTS(
SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 

 
这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢?

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。

语法: EXISTS subquery
参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。
结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。

例表A:TableIn 例表B:TableEx


(一). 在子查询中使用 NULL 仍然返回结果集

 

select * from TableIn where exists(select null)

 
等同于: select * from TableIn

(二). 比较使用 EXISTS 和 IN 的查询。注意两个查询返回相同的结果。

 

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)

 

(三). 比较使用 EXISTS 和 = ANY 的查询。注意两个查询返回相同的结果。

 

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME);
select * from TableIn where ANAME=ANY(select BNAME from TableEx);

 

NOT EXISTS 的作用与 EXISTS 正好相反。如果子查询没有返回行,则满足了 NOT EXISTS 中的 WHERE 子句。

结论:
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接 着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形 成一张我们要的虚表。
WHERE关键字后面的是条件表达式。条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。
分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针找到第一条记录,接着找到WHERE关键字计算它的条件 表达式,如果为真那么把这条记录装到一个虚表当中,指针再指向下一条记录。如果为假那么指针直接指向下一条记录,而不进行其它操作。一直检索完整个表,并 把检索出来的虚拟表返回给用户。EXISTS是条件表达式的一部分,它也有一个返回值(true或false)。

在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。

 

INSERT INTO TableIn (ANAME,ASEX)
SELECT top 1 '张三', '男' FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7);

 

EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

分享到:
评论

相关推荐

    sql server2005 exists使用方法

    1. **简单的 EXISTS 示例**: ```sql SELECT database_items FROM database_name WHERE EXISTS ( -- 条件 SELECT * FROM another_table WHERE another_table.id = database_name.id ); ``` 上述查询检查...

    in和exists性能解析

    因此,理解并灵活运用这两种子句,对于提高数据库查询效率至关重要。 通过以上分析,我们不难看出,在Oracle中,`IN`与`EXISTS`各有千秋,合理选择能够显著提升查询性能。在设计数据库查询时,开发者应综合考虑数据...

    sql case when exists not exists in not in

    而`IN`和`NOT IN`在处理简单条件时较为直观,但如果与子查询结合,可能会导致全表扫描,影响性能。 在进行SQL晋级学习时,理解并熟练掌握这些操作符的用法至关重要。通过不断地实践和优化,能够编写出更高效、更...

    Delphi演示FileExists函数的用法.rar

    总的来说,`FileExists`是Delphi编程中一个简单但至关重要的函数,对于任何涉及到文件操作的程序,理解和正确使用它都是必不可少的。通过实际的示例和练习,开发者能够更好地掌握其用法,提高程序的稳定性和用户体验...

    转 关于List<T>中的Exists 和Contains的区别

    本文将深入探讨`Exists`和`Contains`这两个方法,它们都是用来检查`List&lt;T&gt;`中是否存在特定元素,但有各自的特点和适用场景。 首先,`Contains`方法是`List&lt;T&gt;`类中直接提供的一个成员,它接受一个类型为T的参数,...

    前端开源库-exists-case

    `exists-case`的使用非常简单,只需要引入库并调用相应的方法。例如,以下代码展示了如何在项目中使用它: ```javascript const existsCase = require('exists-case'); // 检查文件是否存在,区分大小写 ...

    SQL SERVER中关于exists 和 in的简单分析

    - 对于简单的 `IN` 查询,特别是当 `IN` 后面的列表较小且有序时,`IN` 可能会更快,因为它可以直接比较索引。 4. **选择合适的方法** 在编写SQL查询时,应该根据具体的数据规模、表结构和索引情况来选择合适的...

    node.js中的fs.exists方法使用说明

    总的来说,`fs.exists`是Node.js中一个简单的但非常有用的工具,尽管现在推荐使用更现代的API,但它在旧代码库和教育环境中仍然常见。理解它的工作原理对于开发和维护Node.js应用是非常有益的。

    Determine if a Directory Exists

    以下是一个简单的VB6代码示例,演示如何确定一个目录是否存在: ```vb Option Explicit Private Sub Command1_Click() Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") If fso....

    关于in and inner/outer join and exists

    这些概念在数据库设计和数据检索中至关重要,理解并熟练运用它们能显著提高查询效率。 1. **IN**: `IN` 操作符用于在查询中指定一个值列表,筛选出列值匹配列表中任意值的行。例如: ```sql SELECT * FROM ...

    oracle中not exists对外层查询的影响详解

    2. 使用`IN`或`NOT IN`:对于简单的条件,`IN`或`NOT IN`子句可能会更高效,尤其是当子查询返回少量记录时。 3. 考虑索引:为子查询涉及的列创建合适的索引,可以提高查询效率。 4. 分析和优化子查询:确保子查询...

    mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录

    为了减小日志文件的大小,可以考虑切换到简单恢复模型,或者在删除操作完成后立即截断日志并收缩文件。然而,这些操作必须谨慎进行,因为它们可能会影响数据库的恢复能力。 对于分批删除策略,当删除条件复杂时,如...

    sql not in 与not exists使用中的细微差别

    上面两个简单的Sql,我们从表面理解,查询的最终结果应该是一样的,但实际结果却和我们想象的不一样 第一条sql查询的结果有一条数据 第二条sql查询的结果却为空  原因: not exists的子查询,对于子查询不返回行和...

    SQL练习5 – SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)

    最后,【3.64】的查询是一个简单的结合条件,它同时筛选出计算机科学系(Sdept='CS')和年龄不大于19岁的学生。这个查询并没有使用嵌套,但展示了如何使用`AND`操作符结合多个条件。 总结来说,嵌套查询在SQL中扮演...

    File-Exists:这个简单的程序在打开之前确定文件是否存在。 使用文件类exists方法,如果为真,程序将继续,如果为假则退出

    总的来说,理解并正确使用`java.io.File`类的`exists()`方法是Java程序员必备的技能之一。它可以帮助我们在处理文件时避免意外错误,提高程序的稳定性和用户体验。通过对这个简单程序的学习,我们可以加深对Java文件...

    php+ajax+json的简单实例

    在这个“php+ajax+json的简单实例”中,我们将深入理解这三个技术是如何协同工作的。 首先,PHP(Hypertext Preprocessor)是一种服务器端的脚本语言,主要用于开发Web应用程序。它能够处理用户提交的数据,生成...

    VB 检测文件是否存在

    在VB(Visual Basic)编程中,检测文件是否存在是常见的任务,这对于文件操作、数据存储或程序功能的实现至关重要。下面将详细介绍如何使用VB来...在编写涉及文件操作的VB程序时,理解并熟练运用这些方法是非常重要的。

    FileExistsError: [Errno 17] File exists: ‘/data1/XXX/val_processed/ct/’

    这种方法简单且直接,适合那些明确知道是否需要创建新目录的情况。 2. **异常处理法:** 使用`try/except`语句捕获可能出现的`OSError`,其中`OSError`包含了`FileExistsError`。如果`os.mkdir()`引发异常,程序...

    struts2实现上传下载,简单易理解

    总的来说,Struts2通过提供拦截器和Action支持,使得实现文件上传和下载功能变得相对简单。理解这一过程对于任何使用Struts2进行Web开发的程序员都至关重要。在实际应用中,还需要考虑安全性问题,如防止非法文件...

    java实现简单登录注册系统

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个简单的登录注册系统。...通过学习这个系统,你可以掌握Java中的核心概念,如...通过实践这个项目,你可以加深对Java基础的理解,并为更复杂的系统打下坚实的基础。

Global site tag (gtag.js) - Google Analytics