为什么要在MySQL中使用EXISTS()函数?

t30tvxxf  于 2022-12-26  发布在  Mysql
关注(0)|答案(3)|浏览(245)

我有这样的疑问:

SELECT * FROM mytable t1
  WHERE t1.id = :id AND
        EXISTS(SELECT 1 FROM t2 WHERE t2.post_id = :id)

当我删除EXISTS()函数时,代码仍然可以工作:

SELECT * FROM mytable t1
  WHERE t1.id = :id AND
        (SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1)

我为什么要这么写?它有什么好处?

zzlelutf

zzlelutf1#

简而言之:

  • EXISTS在找到第一个结果时返回,而不是获取所有匹配的记录(因此,当有多个记录匹配条件时,它的效率更高)
  • EXISTS在语义上是正确的。
  • 当在第二个查询中有一个列名而不是1,并且该列包含NULLFALSE0等时,MySQL将隐式地将其转换为FALSE,这将导致错误的结果。
  • EXISTS实际上是由ANSI标准定义的,而第二种形式不是。(第二种查询在其他DBMS中可能会失败)

另外,当您使用EXISTS时,使用*也可以,因为它检查是否存在匹配的记录,而不是值。

n3ipq98p

n3ipq98p2#

我将展示EXISTS的用例。http://sqlfiddle.com/#!9/066db1/1

  • 请注意,一本书可以由多位作者共同撰写 *

原始结果:

| author |          books |
|--------|----------------|
|    A 1 | Book 1, Book 2 |
|    A 2 |         Book 3 |
|    A 3 | Book 1, Book 4 |

使用具有WHERE条件的帐簿1进行过滤:

| author |  books |
|--------|--------|
|    A 1 | Book 1 |
|    A 3 | Book 1 |

使用手册1和EXISTS进行过滤:

|author  |          books |
|--------|----------------|
|    A 1 | Book 2, Book 1 |
|    A 3 | Book 1, Book 4 |

查询:

SELECT 
  a.name AS author,
  group_concat(b.content SEPARATOR ", ") AS books
FROM
  books b
INNER JOIN bookAuthors ba ON
  ba.bookID = b.id
INNER JOIN authors a ON
  a.id = ba. authorID
WHERE
  EXISTS (
    SELECT
      1
    FROM
      bookAuthors
    WHERE
      bookAuthors.authorID = a.id
      AND bookAuthors.bookID = 1
  )
GROUP BY
  a.name;
gwo2fgha

gwo2fgha3#

如果子查询返回任何行,则EXISTS子查询为TRUE,NOT EXISTS子查询为FALSE。
当你使用... (SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1)时,你要么在成功时返回1,要么在没有东西时返回NULL,这分别被认为是TrueFalse
使用Exists更专业,因为:
传统上,EXISTS子查询以SELECT * 开头,但它也可以以SELECT 5或SELECT column1或任何其他开始,MySQL忽略了这样的子查询中的SELECT列表,因此没有区别。
返回TrueFalse的方法最好。
MySQL Dev site引用

相关问题