我理解如何使用EXISTS编写查询。例如,以下两个查询是相同的:
SELECT last_name
FROM employees
WHERE employee_id in (SELECT manager_id
FROM employees);
SELECT last_name
FROM employees e
WHERE EXISTS (SELECT *
FROM employees em
WHERE em.manager_id = e.employee_id);
我不明白的是EXISTS
条款背后的逻辑。我不明白此查询如何与使用IN
的其他查询等效。
请解释EXISTS
子句背后的逻辑。
答案 0 :(得分:3)
您可以将EXISTS
和IN
翻译成英文。
经理名单:
(SELECT manager_id FROM employees)
员工列表,其id
位于经理列表中:
SELECT *
FROM employees
WHERE employee_id IN (SELECT manager_id FROM employees)
具有经理或“经理存在”的员工列表,或“表雇员中存在的记录具有适合雇员列manager_id
的记录”目前正在关注:
SELECT *
FROM employees e
WHERE EXISTS (
SELECT *
FROM employees em
WHERE e.employee_id = em.manager_id
);
逻辑上,您的查询会遍历所有员工,如果同一个表中有匹配的经理,则会检查每个员工。
编辑:
顺便说一下,您会发现许多建议只能使用EXISTS
或IN
,而其中一个会比另一个更快。许多年前就是这种情况,但现在两个查询都以相同的速度运行。 Oracle甚至可能将一种语法翻译成另一种语法。
同样,有很多传闻要使用... IN (SELECT 1 ...
代替... IN (SELECT * ...
,这也是错误的。
但是,外部查询应该只使用您需要的列,特别是如果您只需要employee_id
或索引中包含的其他列。