【发布时间】:2021-10-17 15:44:08
【问题描述】:
我对子查询逻辑有疑问。据我了解,sql总是先解析子查询,然后再解析异常查询。但是,官方文档中的示例不支持。
链接来自mysql官方文档
https://dev.mysql.com/doc/refman/8.0/en/subqueries.html
Here is another example, which again is impossible with a join
because it involves aggregating for one of the tables.
It finds all rows in table t1 containing a value that occurs twice in a given column:
SELECT * FROM t1 AS t
WHERE 2 = (SELECT COUNT(*) FROM t1 WHERE t1.id = t.id);
据我了解,当sql解析子查询时,会发现
(SELECT COUNT(*) FROM t1 WHERE t1.id = t.id)
根据表返回标量。然后当它与 2 比较时
它要么返回 t1 中的所有行,要么什么都不返回,因为这是一个简单的真假问题。
显然它不喜欢什么办公文件讨论 .根据官方文档,它更像是从 t1 表中逐行检查,与标量 2 进行比较,并一直循环整个表直到结束。
为什么逻辑是这样的?我很难理解其中的逻辑。 任何未来的解释都会有所帮助。
【问题讨论】: