SQL-具有MIN()与WHERE

时间:2018-10-18 15:04:05

标签: sql group-by where aggregate-functions having

这些查询是否完全相同,还是可能根据数据获得不同的结果?

SELECT A, B, C, D 
FROM Table_A 
GROUP BY A, B, C, D , E
HAVING A in (1,2) AND E = 1 AND MIN(status) = 100

SELECT A, B, C, D 
FROM Table_A 
WHERE A IN (1,2) AND E = 1 AND status = 100
GROUP BY A, B, C, D , E

3 个答案:

答案 0 :(得分:1)

他们不相等。

考虑以下内容

create table Table_A(A int, B int, C int, D int, E int, status int);
insert into Table_A values(1,1,1,1,1,100);
insert into Table_A values(1,1,1,1,1,10);
insert into Table_A values(2,1,1,1,1,10);

SELECT A, B, C, D, 'First Query' as query 
FROM Table_A 
GROUP BY A, B, C, D , E
HAVING A in (1,2) AND E = 1 AND MIN(status) = 100;

SELECT A, B, C, D, 'Second Query' as query   
FROM Table_A 
WHERE A IN (1,2) AND E = 1 AND status = 100
GROUP BY A, B, C, D , E

您得到

A   B   C   D   query
-   -   -   -   -------------
1   1   1   1   Second Query

结果(仅第二个返回),

因为两个分组1,1,1,1,12,1,1,1,1-> min(status)=10

因此,min(status)=100永远不会发生,并且第一个查询不会返回结果。

Rextester Demo

答案 1 :(得分:0)

几件事:

HAVING MIN(status) = 100

WHERE status = 100

是不同的。 where条件过滤掉任何不等于100的句点-甚至不进行评估。 hading子句仅在读取每条记录后才对其求值,并查看指定分组的聚合函数(min)的结果。

另一个更微妙的区别是,非聚合函数的“ where”子句更为可取,因为它可以利用表上的任何索引,同等重要的是,它将防止对记录进行分组和联接。

例如

having E = 1

where E = 1

在功能上执行相同的操作。不同之处在于,您只需要使用“具有”来收集,分组和排序一堆记录,以丢弃它们,而“ where”选项则在进行任何分组之前将其删除。另外,在此示例中,通过“ where”选项,您可以将E从分组条件中删除,因为它始终为1。

答案 2 :(得分:0)

高级别:

  • where子句指定行的搜索条件 由查询返回,并将行限制为有意义的集合。

  • 具有子句用作分组行顶部的过滤器。