40

这两个查询有什么区别?

SELECT f.name, 
       u.name, 
       u.id 
FROM   families f 
       JOIN units u 
         ON f.unit_id = u.id 
HAVING u.id IN( 43, 413, 22 )

和:

SELECT f.name, 
       u.name, 
       u.id 
FROM   families f 
       JOIN units u 
         ON f.unit_id = u.id 
WHERE  u.id IN( 43, 413, 22 )

这两个查询的结果完全相同。那么区别在哪里呢?

4

3 回答 3

66

WHERE用于选择正在处理的原始表中的数据。

HAVING用于过滤查询生成的结果集中的数据。SELECT这意味着它可以在子句中引用聚合值和别名。

例如,可以写:

SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
HAVING diff > 10

这不起作用,WHERE因为diff它是别名,而不是原始表列之一。你可以改写:

SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
WHERE t1.val - t2.val > 10

但随后它可能必须将所有减法执行两次:一次用于选择,另一次用于生成结果集。

于 2013-04-22T20:20:44.533 回答
48

sql中的have子句和where子句的区别在于where子句不能与聚合一起使用,但have子句可以。一种思考方式是,have 子句是 where 子句的附加过滤器。

哪个更好:点击

于 2013-04-22T20:24:40.633 回答
10

在这些查询中,什么都没有。但是如果你使用 aGROUP BY你会看到不同。如果您要使用 aGROUP BYHAVING应用于组,而WHERE将应用于SELECT数据分组之前。

于 2013-04-22T20:17:55.147 回答