这两个查询之间有什么区别?
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 )
这两个查询的结果完全相同。那么差异在哪里呢?
答案 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
。