这个问题存在于 MySQL 的最新版本中,所以我什至怀疑这可能是一个错误。
这里有两张表:
t1(id int), values (10),(2)
t2(id int), values (0),(null),(1)
执行:
select id from t1 where id > all (select id from t2);
返回结果集:
+------+
| id |
+------+
| 10 |
| 2 |
+------+
根据我的知识和页面http://dev.mysql.com/doc/refman/5.5/en/all-subqueries.html
该语句应返回空结果!因为“where”中的每一个判断都会导致null,像这样:
select id > all (select id from t2) as c1 from t1;
返回:
+------+
| c1 |
+------+
| NULL |
| NULL |
+------+
实际上select id from t1 where null;
什么也没返回!
最后,我尝试了这个:
explain extended select id from t1 where id > all (select id from t2);
show warnings;
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------+
| Note | 1003 | select `test`.`t1`.`id` AS `id` from `test`.`t1` where <not>((`test`.`t1`.`id` <= (select max(`test`.`t2`.`id`) from `test`.`t2`))) |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------+
一组中的 1 行(0.00 秒)
我们可以看到 MySQL 将原来的 SQL 优化到了这个,实际上和结果集是吻合的。
但我认为优化后的 SQL 不等于原始 SQL。
我错了吗?