这两个查询之间的区别是什么?
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 )
这两个查询的结果完全相同。那么,区别在哪里呢?
发布于 2013-04-23 04:24:41
sql中having子句和where子句之间的区别在于,where子句不能用于聚合,但having子句可以用于聚合。可以这样认为: having子句是where子句的附加过滤器。
哪个更好:click
发布于 2013-04-23 04:20:45
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
但是,它可能必须做两次所有减法:一次用于选择,另一次用于生成结果集。
https://stackoverflow.com/questions/16155937
复制相似问题