gpt4 book ai didi

sql - IN 谓词在 SQL 中如何工作?

转载 作者:行者123 更新时间:2023-12-03 01:33:11 32 4
gpt4 key购买 nike

准备好 this question 的答案后我发现我无法验证我的答案。

在我的第一份编程工作中,我被告知,IN () 谓词中的查询会针对父查询中包含的每一行执行,因此应该使用 IN避免。

例如,给定查询:

SELECT count(*) FROM Table1 WHERE Table1Id NOT IN (
SELECT Table1Id FROM Table2 WHERE id_user = 1)
Table1 Rows | # of "IN" executions----------------------------------      10    |       10     100    |      100    1000    |     1000   10000    |    10000

这是正确的吗? IN 谓词实际上是如何工作的?

最佳答案

关于为每行执行子查询的警告是正确的 - 对于相关子查询。

SELECT COUNT(*) FROM Table1 a 
WHERE a.Table1id NOT IN (
SELECT b.Table1Id FROM Table2 b WHERE b.id_user = a.id_user
);

请注意,子查询引用外部查询的 id_user 列。 Table1 每行的 id_user 值可能不同。因此,子查询的结果可能会有所不同,具体取决于外部查询中的当前行。 RDBMS必须多次执行子查询,对于外部查询中的每一行执行一次。

您测试的示例是一个不相关子查询。大多数值得信赖的现代 RDBMS 优化器应该能够判断子查询的结果何时不依赖于外部查询每行中的值。在这种情况下,RDBMS 运行一次子查询,缓存其结果,并在外部查询中的谓词中重复使用它。

PS:在 SQL 中,IN() 称为“谓词”,而不是语句。谓词是语言的一部分,计算结果为 true 或 false,但不一定作为语句独立执行。也就是说,您不能仅将其作为 SQL 查询运行:“2 IN (1,2,3);”虽然这是一个有效的谓词,但它不是一个有效的语句。

关于sql - IN 谓词在 SQL 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/761150/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com