作为参考,我试图在以下地方回答一个SQL问题:https://www.w3resource.com/sql-exercises/sql-subqueries-exercise-21.php
答案是:
SELECT first_name, last_name, department_id
FROM employees
WHERE EXISTS (SELECT *
FROM employees
WHERE salary > 3700);
但是有人可以解释为什么上面的返回结果与以下结果不同吗
SELECT e1.first_name, e1.last_name, e1.department_id
FROM employees AS e1
WHERE e1.employee_id IN (SELECT e2.employee_id
FROM employees AS e2
WHERE e2.salary > 3700);
答案 0 :(得分:1)
EXISTS子句的值为TRUE或FALSE。如果employees
中根本没有薪水超过3700的行,则您编写的语句将提供TRUE值。您未包含任何要求该行与ID相匹配的条件。您要检查的员工。
如果要添加这样的条件,则可以编写(假设存在唯一的员工ID,并称为employee_id
):
SELECT first_name, last_name, department_id
FROM employees E1
WHERE EXISTS
(SELECT *
FROM employees
WHERE salary > 3700 AND employee_id = E1.employee_id )
答案 1 :(得分:0)
第一个没有相关子句。因此,它要么返回employees
中的所有行(如果存在任何与条件匹配的行)。或者它不返回employees
中的任何行(如果不存在这样的行)。
第二个是将子查询中的行与外部查询中的id进行比较。使用exists
的等效查询为:
SELECT e1.first_name, e1.last_name, e1.department_id
FROM employees AS e1
WHERE EXISTS (SELECT e2.employee_id
FROM employees AS e2
WHERE e2.employee_id = e1.employee_id AND
e2.salary > 3700
);
当然,人们希望employee_id
是称为employee
的表的主键。所以这会做同样的事情:
SELECT e1.first_name, e1.last_name, e1.department_id
FROM employees AS e1
WHERE e1.salary > 3700