SELECT company_name, contact_name, customer_id
FROM customers
WHERE EXISTS (SELECT customer_id FROM orders
WHERE orders.customer_id = customers.customer_id
AND freight BETWEEN 50 AND 100)
在这种情况下对 EXISTS 的工作感兴趣,如果在子查询中返回了某些内容,那么应该选择主查询中的所有内容吗?在这种情况下,将返回 65 行。那为什么如果你写这个,然后一次选择所有的记录呢?
SELECT company_name, contact_name, customer_id
FROM customers
WHERE EXISTS (SELECT customer_id FROM orders
WHERE orders.customer_id = 'VINET')
事实证明,过滤的方式与通常的 IN 相同或如何?帮助我理解。
WHERE EXISTS
- 通常是相关子查询。WHERE IN
- 通常不会。WHERE EXISTS
一旦找到与子查询匹配的第一条记录,就会中止搜索。WHERE IN
始终获取完整的子查询记录集,然后检查匹配项。如果子查询
WHERE IN
不相关,则它是可重用的。中的子查询WHERE EXISTS
(如果相关)本质上是不可重用的,并且会针对每条记录执行。WHERE IN
可能包含一个静态表达式(通常是文字列表),而它WHERE EXISTS
总是包含一个子查询。应用于问题文本中显示的查询。
条件中的查询不相关。因此,它将独立执行,其结果将在以后用作常量。
那些。总而言之——如果表
orders
中至少有一条带有 的记录orders.customer_id = 'VINET'
,则返回查询结果SELECT company_name, contact_name, customer_id FROM customers
,否则返回空记录集。如果子查询的执行结果取决于从外部子查询中获得的值,则称为相关子查询。例如,来自正在执行子查询的外部查询中记录的字段值。
如果结果不依赖于外部值,则称为不相关子查询。