两个SQL查询的区别,但结果相同

时间:2014-07-26 21:59:41

标签: sql database select

我是新来的,我想我会得到一些帮助。

我有两个问题

第一

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会比第一个更快地返回结果....或???

非常感谢!

2 个答案:

答案 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用于commsal匹配。当然,你应该选择最简单的方法。根据您的RLDBM,关键字AS可能会导致失败 - 如果是,请将其删除。

没有更多信息,没人能回答你关于速度的问题。很难想象其中任何一个之间的速度有任何差异,但很大程度上取决于记录集的大小,RDBMS(数据库程序)和表索引的选择。