【发布时间】:2015-03-10 07:02:31
【问题描述】:
我试图了解 MySQL 中 EXISTS 和 ALL 之间的区别。举个例子吧:
SELECT *
FROM table1
WHERE NOT EXISTS (
SELECT *
FROM table2
WHERE table2.val < table1.val
);
SELECT *
FROM table1
WHERE val <= ALL( SELECT val FROM table2 );
引用自 MySQL 文档:
传统上,EXISTS 子查询以 SELECT * 开头,但它可以 以 SELECT 5 或 SELECT column1 或任何内容开头。 MySQL 忽略此类子查询中的 SELECT 列表,因此没有区别。 [1]
读到这里,在我看来 mysql 应该能够将两个查询转换为相同的关系代数表达式。这两个查询只是两个表中的值之间的简单比较。然而,情况似乎并非如此。我尝试了这两个查询,第二个查询的性能比第一个好得多。
- 优化器如何准确处理这些查询?
- 为什么优化器不能使第一个查询像第二个查询一样执行?
- 使用 ALL/ANY/SOME 条件总是更有效吗?
【问题讨论】:
-
NULL 值怎么样?
-
看看这个stackoverflow.com/questions/28946163/…。至于一些,它和 ANY 做同样的事情。
标签: mysql sql database relational-algebra