考虑以下Employee表
ID salary DeptName
1 10000 EC
2 40000 EC
3 30000 CS
4 40000 ME
5 50000 ME
6 60000 ME
7 70000 CS
以下查询的结果中有多少行?
SELECT E.ID
FROM Employee E
WHERE EXISTS (SELECT E2.salary
FROM Employee E2
WHERE E2.DeptName = 'CS'
AND E.salary > E2.salary)
(A) 0
(B) 4
(C) 5
(D) 6答案: (C)
说明:背景:
- WHERE EXISTS测试子查询中是否存在任何记录。
- 如果子查询返回一个或多个记录,则EXISTS返回true。
- EXISTS通常与相关子查询一起使用。
在上面的问题中,这里有一个相关的子查询,因为该子查询引用了封闭的查询(关系Employee重命名为E)
子查询( SELECT E2.salary FROM Employee E2
在哪里E2.DeptName =’CS’)
将E2关系过滤为(DeptName为CS的所有元组和相应的薪水)
现在,相关查询的工作方式如下:
选择E.ID
来自员工E
存在的地方( 从雇员E2中选择E2.salary
在哪里E2.DeptName =’CS’
AND E.salary> E2.salary)
如果WHERE EXISTS返回true,即子查询返回一个或多个记录,则它从“员工关系”中获取一个元组并显示其ID。当来自“员工关系E”的元组的“薪水”属性值大于上面过滤出的“薪水”属性值中的任何一个时,就会发生这种情况。
因此,过滤掉的元组将是其薪水属性值大于E2关系中至少一个的薪水值(3000和7000)的所有元组。
身份证薪水DeptName
2 40000 EC
4 40000我
5 50000我
6 60000我
7 70000 CS
最后,它将显示其ID,输出将是:
2个
4
5
6
7
因此,选项(C)5行。
该解决方案由Yashika Arora提供。
这个问题的测验