SQL - 有 MIN() 与 WHERE

SQL - HAVING MIN() vs WHERE

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

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

几件事:

HAVING MIN(status) = 100

WHERE status = 100

不同。 where 条件过滤掉任何不是 100 的东西,期间——它甚至没有被评估。 having 子句仅在读取每条记录后对其进行评估,并查看指定分组的聚合函数 (min) 的结果。

此外,一个更细微的区别是 "where" 非聚合函数的子句更可取,因为它可以使用 table 上的任何索引,同样重要的是它会阻止记录免于分组和加入。

例如

having E = 1

where E = 1

在功能上做同样的事情。不同之处在于,您需要收集、分组和排序一堆记录,然后使用 "having," 丢弃它们,而 "where" 选项会在任何分组发生之前删除它们。此外,在此示例中,使用 "where" 选项,您可以从分组条件中删除 E,因为它始终为 1。

高级别:

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

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

它们不相等。

当你考虑以下区块时

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

结果(只有第二个returns),

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

因此 min(status)=100 案例从未发生,第一次查询 returns 没有结果。

Rextester Demo