MySql - HAVING vs WHERE

时间:2013-04-22 20:16:35

标签: mysql

这两个查询之间有什么区别?

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 )

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

3 个答案:

答案 0 :(得分:43)

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

但是它可能需要两次进行所有减法:一次用于选择,再次用于产生结果集。

答案 1 :(得分:35)

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

哪个更好:click

答案 2 :(得分:9)

在这些查询中,没有任何内容。但是如果您使用GROUP BY,您会看到不同之处。如果您使用GROUP BY,则HAVING将应用于该组,而WHERE将在对数据进行分组之前应用于SELECT