编辑:我在原始版本中错误地简化了查询。这个查询就是我的意思。
SELECT *
FROM A
LEFT JOIN B ON A.seq = B.seq
WHERE (select max(B.data) where B.data is not null group by B.seq);
我会留下错误的版本,因为它在标量子查询方面也对我有帮助。
我的同事问为什么这个语句在 MySQL 中有效。
SELECT *
FROM anytable
WHERE (SELECT 'asdf')
这将返回 0 行。我简化了查询,但基本上,where 子句包含一个没有 IN 或比较运算符的子查询;只是它自己。我们预计它会抛出有关 SQL 语法的错误,就像 SQL Server 一样。但是 MySQL 没有。
有趣的是,如果我像下面这样更改查询,查询会返回 anytable
中的所有行。
SELECT *
FROM anytable
WHERE (SELECT 1);
我找不到关于此的文档。这是如何工作的?
最佳答案
这回答了问题的原始版本。
当你这样做时:
WHERE (SELECT 'asdf')
您有一个标量子查询。这相当于:
WHERE 'asdf'
现在,MySQL 将 bool 值视为整数,反之亦然,0
为 false,其他任何为 true。 MySQL 不将字符串视为 bool 值,因此它决定使用隐式转换将值转换为数字。
隐式转换会转换所有前导数字。没有,因此该值被转换为 0
。瞧!它被视为错误。
当您使用 WHERE (SELECT 1)
时,同样的逻辑成立,除了值已经是一个数字。它是 1
,所以它被视为 true。
关于MySQL 允许在 WHERE 子句中没有 IN 或比较运算符的子查询。它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58072044/