这两个查询有什么区别?
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 )
Run Code Online (Sandbox Code Playgroud)
和:
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 )
Run Code Online (Sandbox Code Playgroud)
这两个查询的结果完全相同.那么区别在哪里?
Bar*_*mar 46
WHERE 用于选择正在处理的原始表中的数据.
HAVING用于过滤查询生成的结果集中的数据.这意味着它可以引用SELECT子句中的聚合值和别名.
例如,可以写:
SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
HAVING diff > 10
Run Code Online (Sandbox Code Playgroud)
这不起作用,WHERE因为diff是别名,而不是原始表列之一.你可以写:
SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
WHERE t1.val - t2.val > 10
Run Code Online (Sandbox Code Playgroud)
但是它可能必须进行两次所有减法:一次用于选择,再一次用于产生结果集.
在这些查询中,没有.但是,如果你使用a,GROUP BY你会看到差异.如果你使用GROUP BY的HAVING将被应用到组,而WHERE将被应用到SELECT分组数据之前.
| 归档时间: |
|
| 查看次数: |
34937 次 |
| 最近记录: |