首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EXISTS命令与IN命令

EXISTS命令与IN命令
EN

Stack Overflow用户
提问于 2018-11-26 10:50:47
回答 2查看 31关注 0票数 0

作为参考,我正在尝试回答一个SQL问题:https://www.w3resource.com/sql-exercises/sql-subqueries-exercise-21.php

答案是:

代码语言:javascript
复制
SELECT first_name, last_name, department_id 
FROM employees 
WHERE EXISTS (SELECT * 
              FROM employees 
              WHERE salary > 3700);

但是有没有人能解释一下为什么上面的结果没有返回相同的结果:

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2018-11-26 10:59:51

EXISTS子句提供的值为TRUE或FALSE。如果employees中有任何工资超过3700的行,那么您编写的语句将给出值TRUE。您没有包含任何要求该行与您正在检查的员工的id匹配的条件。

如果你想添加这样一个条件,你可以这样写(假设存在一个唯一的雇员id,名为employee_id):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-11-26 10:51:58

第一个没有相关子句。因此,它要么返回employees中的所有行(如果存在匹配条件的行)。或者在employees中不返回任何行(如果不存在这样的行)。

第二种方法是将子查询中的行与外部查询中的id进行比较。使用exists的等效查询为:

代码语言:javascript
复制
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是一个名为employees的表的主键,所以这也是同样的事情:

代码语言:javascript
复制
SELECT e1.first_name, e1.last_name, e1.department_id 
FROM employees AS e1
WHERE e1.salary > 3700
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53474186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档