我是新来的,我想我会得到一些帮助。
我有两个问题
第一
SELECT ename, deptno, sal, comm
FROM emp
WHERE sal IN
(SELECT sal FROM emp WHERE deptno = 30)
and comm IN
(SELECT comm FROM emp WHERE deptno = 30)
SECOND
SELECT ename, deptno, sal, comm
FROM emp
WHERE (sal, comm) IN
(SELECT sal, comm FROM emp WHERE deptno = 30)
他们产生相同的结果,但他们之间有什么区别?
也许SECOND会比第一个更快地返回结果....或???
非常感谢!
答案 0 :(得分:3)
这些查询完全不同。它们可能碰巧产生相同的数据,但这仅仅是因为您的数据集没有说明差异。
如您所见,这:(您的第二个查询) http://sqlfiddle.com/#!4/eaf0d/2/0
与此不一样:(您的第一个查询) http://sqlfiddle.com/#!4/eaf0d/1/0
您的第一个查询将返回任何具有部门30中任何人的工资的员工,以及与部门30中任何人相同的佣金,但每个人都可以是不同的人,即。薪水可能与人X匹配,佣金可能与人Y匹配
您的第二个查询将返回任何与部门30中至少一名员工具有相同工资和佣金的员工。但与第一个查询不同,工资和佣金都必须与部门30中同一员工的匹配,你不能与人X匹配,而另一人与Y人匹配。
换句话说,您的第二个查询更具选择性。
这就是为什么'Fish'被排除在我的示例数据集中,他的薪水与'Brian'匹配(但不是与Brian的佣金匹配),并且他有一个匹配涂鸦的接受(但是不是涂鸦的薪水)。由于员工在佣金和工资的基础上没有一个匹配,他被排除在外。
他被包含在另一个查询中,因为一方或另一方确实与至少一名员工匹配(但这些员工是不同的人)。
在性能方面,下面的查询将导致更少的表扫描并且可能运行得更快,但是如果它根据我对上述2个查询之间的功能差异的描述符合您的意图,则应该使用它:
SELECT ename, deptno, sal, comm
FROM emp
WHERE (sal, comm) IN
(SELECT sal, comm FROM emp WHERE deptno = 30)
答案 1 :(得分:0)
我认为你只需要这个:
SELECT ename, deptno, sal, comm
FROM emp
WHERE deptno = 30
@Brian DeMilia只是很好地观察了为什么以上可能是错的。你可能想要这个:
SELECT emp.ename, emp.deptno, emp.sal, emp.comm
FROM emp
JOIN emp AS emp2
WHERE emp2.deptno = 30 AND emp.comm = emp2.comm AND emp.sal = emp2.sal
最好将HAVING
用于comm
和sal
匹配。当然,你应该选择最简单的方法。根据您的RLDBM,关键字AS
可能会导致失败 - 如果是,请将其删除。
没有更多信息,没人能回答你关于速度的问题。很难想象其中任何一个之间的速度有任何差异,但很大程度上取决于记录集的大小,RDBMS(数据库程序)和表索引的选择。