MySQL 允许在 WHERE 子句中没有 IN 或比较运算符的子查询。它是如何工作的?

标签 mysql sql subquery where-clause

编辑:我在原始版本中错误地简化了查询。这个查询就是我的意思。

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);

enter image description here

我会留下错误的版本,因为它在标量子查询方面也对我有帮助。


我的同事问为什么这个语句在 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/

相关文章:

MySQL Where OR 查询结果一个别名

sql - 在 Oracle SQL 查询的结果中包含列名?

MySQL依赖于前提条件吗?

mysql - 从文本文件读取 IP 地址到 IPTABLES

PHP/MySQL : How to save media player playlist order

mysql - 外连接一张包含选择查询结果的表

c# - 在asp.net mvc3 (C#)中执行sql语句

mysql - 不同 MySQL 系统上 Update 的执行时间差异很大

mysql - Rails MySQL 子查询计数

mysql - Laravel 数据库访问被拒绝