`

SQL 中 exists 的用法

    博客分类:
  • SQL
sql 
阅读更多
有一个查询如下:
SELECT c.CustomerId, CompanyName 
FROM Customers c 
WHERE EXISTS( 
    SELECT OrderID FROM Orders o 
    WHERE o.CustomerID = cu.CustomerID) 
这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢?
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
EXISTS 指定一个子查询,检测行的存在。语法:EXISTS subquery。参数 subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。结果类型为 Boolean,如果子查询包含行,则返回 TRUE。
在子查询中使用 NULL 仍然返回结果集
这个例子在子查询中指定 NULL,并返回结果集,通过使用 EXISTS 仍取值为 TRUE。
SELECT CategoryName
FROM Categories
WHERE EXISTS (SELECT NULL)
ORDER BY CategoryName ASC
比较使用 EXISTS 和 IN 的查询
这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
    (SELECT *
    FROM titles
    WHERE pub_id = publishers.pub_id
    AND type = \'business\')

SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
    (SELECT pub_id
    FROM titles
    WHERE type = \'business\')
比较使用 EXISTS 和 = ANY 的查询
本示例显示查找与出版商住在同一城市中的作者的两种查询方法:第一种方法使用 = ANY,第二种方法使用 EXISTS。注意这两种方法返回相同的信息。
SELECT au_lname, au_fname
FROM authors
WHERE exists
    (SELECT *
    FROM publishers
    WHERE authors.city = publishers.city)

SELECT au_lname, au_fname
FROM authors
WHERE city = ANY
    (SELECT city
    FROM publishers)
比较使用 EXISTS 和 IN 的查询
本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:
SELECT title
FROM titles
WHERE EXISTS
    (SELECT *
    FROM publishers
    WHERE pub_id = titles.pub_id
    AND city LIKE \'B%\')

SELECT title
FROM titles
WHERE pub_id IN
    (SELECT pub_id
    FROM publishers
    WHERE city LIKE \'B%\')
使用 NOT EXISTS
NOT EXISTS 的作用与 EXISTS 正相反。如果子查询没有返回行,则满足 NOT EXISTS 中的 WHERE 子句。本示例查找不出版商业书籍的出版商的名称:
SELECT pub_name
FROM publishers
WHERE NOT EXISTS
    (SELECT *
    FROM titles
    WHERE pub_id = publishers.pub_id
    AND type = \'business\')
ORDER BY pub_name
又比如以下 SQL 语句:
select distinct 姓名 from xs
where not exists (
select * from kc
where not exists (
select * from xs_kc
where 学号=xs.学号 and 课程号=kc.课程号
)
把最外层的查询xs里的数据一行一行的做里层的子查询。
中间的 exists 语句只做出对上一层的返回 true 或 false,因为查询的条件都在 where 学号=xs.学号 and 课程号=kc.课程号这句话里。每一个 exists 都会有一行值。它只是告诉一层,最外层的查询条件在这里成立或都不成立,返回的时候值也一样回返回上去。直到最高层的时候如果是 true(真)就返回到结果集。为 false(假)丢弃。
where not exists
select * from xs_kc
where 学号=xs.学号 and 课程号=kc.课程号
这个 exists 就是告诉上一层,这一行语句在我这里不成立。因为他不是最高层,所以还要继续向上返回。
select distinct 姓名 from xs where not exists (这里的 exists 语句收到上一个为 false 的值。他在判断一下,结果就是为 true(成立),由于是最高层所以就会把这行的结果(这里指的是查询条件)返回到结果集。
几个重要的点:
最里层要用到的醒询条件的表比如:xs.学号、kc.课程号等都要在前面的时候说明一下select * from kc,select distinct 姓名 from xs
不要在太注意中间的exists语句.
把exists和not exists嵌套时的返回值弄明白

本文取自:http://www.nowamagic.net/database/db_Exists.php
分享到:
评论

相关推荐

    sql中exists的用法

    SQL 中 EXISTS 的用法简介 exists 是 SQL 中最常用的子查询操作符之一,用于检测子查询是否返回至少一个记录。exists 的使用场景非常广泛,包括对多表之间的关系进行查询、检测记录的存在性等。 在 SQL 中,exists...

    sql exists和not exists用法

    ### SQL EXISTS 和 NOT EXISTS 的用法详解 在SQL查询中,`EXISTS`与`NOT EXISTS`是非常实用的子查询操作符,它们主要用于检测是否存在满足一定条件的数据行。相较于`IN`、`NOT IN`等操作,`EXISTS`与`NOT EXISTS`...

    sql server2005 exists使用方法

    ### SQL Server 2005 EXISTS 使用方法详解 #### 一、EXISTS 子句概述 在 SQL Server 2005 中,`EXISTS` 是一个非常实用的子句,用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,则 `EXISTS` ...

    SQL中exists的用法[借鉴].pdf

    SQL EXISTS 的用法详解 EXISTS 是 SQL 中的一个子句,用于判断是否存在满足条件的记录。它通常与 SELECT、FROM、WHERE 等子句结合使用,以实现复杂的查询操作。 EXISTS 的用法 EXISTS 子句的基本格式为:`EXISTS...

    浅析SQL中WHERE EXISTS子查询.pdf

    本文将重点剖析WHERE EXISTS子查询的语法、执行流程及使用离散数学知识辅助解决复杂查询的实现方法。 WHERE EXISTS子查询是SELECT语句中的一种常用的查询方式,它可以将一个查询块嵌入到另一个查询块中,以便实现...

    sql in,exists,not in,not exists区别

    IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...

    exists SQL用法详解、exists和not exists的常用示例

    在SQL查询中,`EXISTS`和`NOT EXISTS`是两个非常重要的子查询操作符,它们主要用于判断子查询是否返回结果。本篇文章将详细介绍这两个关键字的用法,并通过实例进行解析。 首先,`EXISTS`的语法是:主查询中的条件...

    if exists 用法

    if exists用法,里面包含各种需要用到if exists的情况。

    关系代数中“除法”运算与SQL中带有exists子查询的对比教学.pdf

    此外,这种教学方法还可以帮助学生理解除法运算背后的逻辑,以及exists子查询如何在实际的SQL查询中实现复杂的逻辑判断。 根据文档内容,在讲解关系代数除法运算时,需要注意的是将关系R和S中相对应的Y属性的含义...

    详解SQL EXISTS 运算符

    理解`EXISTS`和`NOT EXISTS`的用法对于优化SQL查询非常重要,因为它们通常比使用`IN`或`JOIN`操作符更有效率,特别是在处理大量数据时。`EXISTS`主要关注记录是否存在,而不需要返回具体的值,这使得它在处理复杂...

    sql case when exists not exists in not in

    在SQL查询中,`CASE WHEN`、`EXISTS`、`NOT EXISTS`以及`IN`和`NOT IN`是常用的操作符,它们用于处理复杂的条件判断和数据筛选。这些概念对于理解和编写高效的SQL语句至关重要,尤其是在数据分析和数据库管理中。 `...

    exists用法说明.doc

    ### EXISTS用法 `EXISTS`子句的基本形式是: ```sql SELECT column1, column2, ... FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE condition) ``` 在这个结构中,外部查询(`table1`)的结果将根据内部...

    经典SQL查询总结关于Exists,not Exists.in ,not in效率的说明。

    本文将深入探讨 SQL 中 `EXISTS`, `NOT EXISTS`, `IN`, `NOT IN` 的使用场景及效率问题。 #### 一、Exists 和 Not Exists 的效率说明 **Exists** 和 **Not Exists** 子句通常用于检查子查询是否返回任何行,它们...

    SQL中Exists的用法

    在SQL查询中,`EXISTS` 是一个重要的逻辑运算符,主要用于检查子查询是否至少返回一行数据。它不关心子查询实际返回的具体数据...了解并熟练掌握 `EXISTS` 的用法对于提升SQL查询效率和编写更高效的查询语句至关重要。

    SQL中exists的使用方法

    在SQL中,`EXISTS` 是一个非常重要的子句,用于判断子查询是否能返回至少一行数据。这个关键字不关心子查询返回的具体数据,而仅仅关注是否有数据存在。`EXISTS` 子句通常与 `WHERE` 子句一起使用,以过滤满足特定...

    sqlserver exists,not exists的用法

    在SQL Server中,`EXISTS` 和 `NOT EXISTS` 是两个非常重要的子查询操作符,它们用于检查子查询是否返回任何行。理解这两个操作符的用法对于编写高效的查询至关重要。 1. `EXISTS` 操作符: `EXISTS` 用于测试子...

    SQL复习-EXISTS谓词

    在SQL查询中,EXISTS谓词是一个非常关键的子句,用于判断子查询是否返回至少一行数据。这个知识点对于数据库查询优化和复杂条件筛选至关重要。本文将深入探讨EXISTS谓词的工作原理、用法以及其与IN和JOIN操作符的...

Global site tag (gtag.js) - Google Analytics