何时在子查询中使用IN OR AND? (SQL oracle数据库hr模式)

时间:2018-10-11 11:26:58

标签: sql oracle

我必须执行此子查询
EXP:编写查询以显示所有收入高于平均工资并且在部门中工作且姓名为J的雇员的雇员编号,姓名(名字和姓氏)和薪水。

并且子查询的代码如下

SELECT e.employee_id, e.first_name ,e. salary  
FROM employees e 
WHERE e.salary >  (SELECT AVG (e.salary)   FROM employees e ) 
AND  e.department_id IN  ( SELECT e.department_id   FROM employees  e  WHERE e.first_name LIKE '%J%');

为什么当我用'IN'代替AND时不能使用此代码

select e.employee_id,e.first_name ,e.salary from employees e
where e.salary > (select avg(e.salary) from employees e where e.department_id in
(select e.department_id from employees e where e.first_name like '%J%'));

我知道第二个代码是错误的,但是为什么呢?

2 个答案:

答案 0 :(得分:0)

查询要求我们查找薪水> ALL 员工的平均薪水并且在部门中工作且姓名为J的员工。 因此,在您的代码中,您仅计算了在部门工作且名称中有J的员工的平均工资。在这种情况下,您需要使用 AND ,因为所有雇员的平均工资与在部门工作且雇员姓名均为J的雇员的平均工资彼此独立。

答案 1 :(得分:0)

SELECT e.employee_id, e.first_name ,e. salary  
FROM employees e 

除了会说我们正在寻找员工之外,我们将忽略上述情况

WHERE e.salary >  (SELECT AVG (e.salary)   FROM employees e ) 

员工的薪水高于所有员工的平均薪水

AND e.department_id IN (
  SELECT e.department_id FROM employees e WHERE e.first_name LIKE '%J%');

该雇员所在的部门中至少有一个雇员的名字包含J

下一步!


select e.employee_id,e.first_name ,e.salary from employees e

除了会说我们正在寻找员工之外,我们将忽略上述情况

where e.salary > (select avg(e.salary) from employees e

员工工资高于平均工资的地方

where e.department_id in
(select e.department_id from employees e where e.first_name like '%J%'));

对于部门中的雇员,其中至少一个雇员的名字包含J


两者正在回答不同的问题:

  • 在该雇员的薪水高于所有雇员的平均薪水并且该雇员所在的部门中至少有一个雇员的名字包含J的地方寻找雇员。

和:

  • 在该雇员的薪水大于部门中雇员的平均薪水的雇员,该部门中至少一个雇员的名字包含J

请注意,区别恰恰在于如何应用“在至少一个雇员的名字包含J的部门中”约束。首先,它被用作对雇员整体搜索的约束。在第二个中,它被用作我们计算雇员平均工资的约束。

考虑到规范的措辞,我认为应该将约束应用于整体搜索而不是平均工资的计算,因此第一个查询是正确的。


  

为什么当我用'IN'代替AND时不能使用此代码

这不是我描述两个查询之间差异的方式。请注意,它们都使用IN。区别在于您要对谓词应用哪个查询(或子查询)。第一个添加了AND,因为我们现在有两个谓词应用于外部查询,并且我们需要某种运算符来组合这些谓词(AND在这里是正确的,而OR的替代则是正确的)

在第二个中,您不会发现自己组合了多个谓词,因为您要将谓词应用于不同的查询。