这些查询是否完全相同,还是可能根据数据获得不同的结果?
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
答案 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,1
和2,1,1,1,1
-> min(status)=10
。
因此,min(status)=100
永远不会发生,并且第一个查询不会返回结果。
答案 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子句指定行的搜索条件 由查询返回,并将行限制为有意义的集合。
具有子句用作分组行顶部的过滤器。