我必须执行此子查询
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%'));
我知道第二个代码是错误的,但是为什么呢?
答案 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
的替代则是正确的)
在第二个中,您不会发现自己组合了多个谓词,因为您要将谓词应用于不同的查询。