EXISTS命令与IN命令

时间:2018-11-26 02:50:47

标签: sql

作为参考,我试图在以下地方回答一个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);

2 个答案:

答案 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