Mysql 存在与所有、任何、某些

Mysql 存在与所有、任何、某些,mysql,sql,database,relational-algebra,Mysql,Sql,Database,Relational Algebra,我试图理解MySQL中存在和全部的区别。让我举个例子: 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文档: 传

我试图理解MySQL中存在和全部的区别。让我举个例子:

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 忽略此子查询中的选择列表,因此没有任何区别

在我看来,mysql应该能够将这两个查询转换为同一个关系代数表达式。这两个查询只是两个表中的值之间的简单比较。然而,情况似乎并非如此。我尝试了两个查询,第二个查询的性能比第一个好得多

优化器如何准确地处理这些查询? 为什么优化器不能使第一个查询作为第二个查询执行? 使用全部/任何/某些条件是否总是更有效?
您的问题中的查询不是等价的,因此无论优化程度如何,它们都会有不同的执行计划。如果您使用的不是val>ANY。。。那就相当了


您应该始终使用EXPLAIN查看查询的执行计划,并意识到执行计划可能会随着数据的更改而更改。测试和理解执行计划将帮助您确定哪些方法性能更好。对于ALL/ANY/SOME没有硬性规定,它们通常被优化为一个EXISTS。

空值呢?看看这个。对于一些人来说,它做的事情和其他人一样。