我时常看到这些用法,但似乎都可以通过正常的联接或子查询同样好甚至更好地完成。
我认为它们是误导性的(与常规联接和子查询相比,它们很难准确可视化),常常被误解(例如,在 EXISTS / NOT EXISTS
子查询中使用 SELECT *
会表现出与 SELECT 1
相同的行为),在我有限的经验中,执行速度较慢。
有人能描述和/或提供一个最适合它们的示例或者没有其他选择而必须使用它们的情况吗?请注意,由于它们的执行和性能可能与平台相关,我特别关心它们在MySQL中的使用。
我时常看到这些用法,但似乎都可以通过正常的联接或子查询同样好甚至更好地完成。
我认为它们是误导性的(与常规联接和子查询相比,它们很难准确可视化),常常被误解(例如,在 EXISTS / NOT EXISTS
子查询中使用 SELECT *
会表现出与 SELECT 1
相同的行为),在我有限的经验中,执行速度较慢。
有人能描述和/或提供一个最适合它们的示例或者没有其他选择而必须使用它们的情况吗?请注意,由于它们的执行和性能可能与平台相关,我特别关心它们在MySQL中的使用。
我时常看到这些内容被使用,但它们似乎都可以通过正常的JOIN或子查询同样甚至更好地完成。
虽然这篇文章涉及SQL Server
,但它可能会有你感兴趣的内容:
简而言之,JOIN
是集合操作,而EXISTS
是谓词。
换句话说,这些查询:
SELECT *
FROM a
JOIN b
ON some_condition(a, b)
对比
SELECT *
FROM a
WHERE EXISTS
(
SELECT NULL
FROM b
WHERE some_condition(a, b)
)
它们不同:前者可以从a
返回多条记录,而后者则不能。
它们的对应物,NOT EXISTS
与LEFT JOIN / IS NULL
, 在逻辑上是相同的,但在性能上不同。
实际上,在SQL Server
中,前者可能更有效:
如果主查询返回的行数比你想要查找的表少得多。例如:
SELECT st.State
FROM states st
WHERE st.State LIKE 'N%' AND EXISTS(SELECT 1 FROM addresses a WHERE a.State = st.State)
SELECT st.State FROM states st STRAIGHT_JOIN addresses a ON a.State = st.State WHERE st.State LIKE 'N%'
- Riedsio在一个UPDATE
语句中,你不能[轻松地]使用连接操作,所以WHERE EXISTS
非常适用于此:
UPDATE mytable t
SET columnX = 'SomeValue'
WHERE EXISTS
(SELECT 1
FROM myothertable ot
WHERE ot.columnA = t.columnY
AND ot.columnB = 'XYX'
);
编辑:基于Oracle而非MySQL,是的,有使用内联视图的方法,但在我看来这种方式更加简洁。
UPDATE mytable t JOIN myothertable ot ON ot.columnA = t.columnY SET columnX = 'SomeValue' WHERE ot.columnB = 'XYX'
。 - Gabe
exists
和in
。虽然是针对MS-SQL Server的,但同样的原则也适用于其他数据库:http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx...另一个链接,更加关注性能方面:http://oracle-online-help.blogspot.com/2006/11/in-vs-exist-in-sql.html 还有一个...http://www.java2s.com/Tutorial/Oracle/0040__Query-Select/EXISTSandNOTEXISTSVersusINandNOTIN.htm - FrustratedWithFormsDesigner