为何两条含ALL子查询的MySQL查询结果不同?第一条返回空集
为啥第一条MySQL查询返回空集?
先把你的查询和结果贴出来,方便对照分析:
mysql> select id,name from Employee where salary >= all (select salary from Employee); Empty set (0.00 sec) mysql> select id,name from Employee where salary >= all (select max(salary) from Employee); +--------+------------+ | id | name | +--------+------------+ | 001 | John | +--------+------------+ 1 row in set (0.00 sec)
咱们直接说核心原因:你的Employee表中肯定存在salary为NULL的记录,这触发了all运算符的特殊逻辑。
第一条查询为啥不行?
salary >= all (select salary from Employee)这个条件的意思是:当前行的薪资必须大于等于子查询返回的每一个薪资值。但MySQL里有个关键规则:任何值和NULL做比较(比如10000 >= NULL),结果都是UNKNOWN,而WHERE子句只会保留判断结果为TRUE的行。只要子查询返回的集合里存在一个NULL,整个条件就无法满足,最终返回空集。
第二条查询为啥正常?
select max(salary) from Employee里的MAX()函数会自动忽略NULL值,直接返回表中最高的有效薪资。这时候子查询只返回一个确定的数值,salary >=这个值的判断逻辑完全正常,所以能精准匹配到薪资最高的John。
你可以用这条语句验证表中是否存在NULL薪资:
select count(*) from Employee where salary is null;
如果表中所有薪资都是非NULL的,那第一条查询应该也能返回正确结果——这种情况你就得检查是不是有其他特殊数据(比如薪资是0或者极小值,但概率很低)。
内容的提问来源于stack exchange,提问作者eastwater
相关产品推荐
相关产品推荐

