MySql - HAVING vs WHERE

Noa*_* B. 27 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 )
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)

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

  • `HAVING` 只是计算结果集中每一行的表达式。如果为真,则将行保留在结果中,否则将其删除。任何表达式都是允许的,唯一的区别是它在别名可用的范围内。 (2认同)
  • “ WHERE”只能重发原始表中的列,而不能在“ SELECT”中引用别名。`WHERE`在生成结果集之前进行过滤,`HAVING`在之后进行过滤。尽管通常将其用于聚合结果,但可以将其用于结果集中的任何内容。实际上,这只是将原始查询放入子查询中,然后在外部查询中使用`WHERE`子句的简写。 (2认同)

Ram*_*ran 36

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

哪个更好:点击

  • 伟大的文章和解释.谢谢. (2认同)
  • 这个链接有效吗?我正在尝试访问,但它说地址无效。请检查它是否只是我收到错误。 (2认同)

Mik*_*oud 9

在这些查询中,没有.但是,如果你使用a,GROUP BY你会看到差异.如果你使用GROUP BYHAVING将被应用到组,而WHERE将被应用到SELECT分组数据之前.

  • 你能给出一个例子,我将能够看到这个查询的不同之处吗? (3认同)