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,1
和 2,1,1,1,1
这两个分组 -> min(status)=10
。
因此 min(status)=100
案例从未发生,第一次查询 returns 没有结果。
这些查询是完全相同的,还是可能根据数据得到不同的结果?
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,1
和 2,1,1,1,1
这两个分组 -> min(status)=10
。
因此 min(status)=100
案例从未发生,第一次查询 returns 没有结果。