MySql-拥有vs何处

MySql-拥有vs何处,mysql,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 
HAVING u.id IN( 43, 413, 22 )
以及:


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

在这些查询中,没有什么。但是如果您使用
分组方式,您会看到差异。如果要使用
分组依据
拥有
将应用于该组,而
其中
将应用于
选择
,然后再对数据进行分组。

其中
用于选择正在处理的原始表中的数据

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

但是它可能需要做两次所有的减法运算:一次用于选择,另一次用于生成结果集。

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


哪一个更好:

你能举个例子,让我看到这个查询中的差异吗?我能
选择形状类型,count(shapeType)countShapeType from shapes group by shapeType have countShapeType have countShapeType>10
在此查询中,您可以选择按形状类型分组的所有形状,并且仅显示具有10个以上形状类型的形状。您将无法在where语句中执行此操作,因为在那里您无法访问计数聚合。非常好的文章和解释。谢谢。那篇文章非常有用,+1这个链接有用吗?我正在尝试访问,但它显示无效地址。请检查是否只是我出错。是的,它正在工作。可能你有一些代理问题链接不适合我。看到ERR\u CONNECTION\u TIMED\u out甚至更早,可以在中找到更好的副本,但是,
having
也可以用于使用
where
的正常非聚合谓词。例如,
其中1=1
具有1=1
。为什么允许这样做?
have
只计算结果集中每一行的表达式。如果为true,则会在结果中保留该行,否则会删除该行。任何表达式都是允许的,唯一的区别是它在别名也可用的范围内。我的意思是,将非聚合比较放在
having
中难道没有意义吗?它们不应该放在
的where
中吗?
的where
只能重新引用原始表中的列,它不能引用
选择中的别名<代码>其中
在生成结果集之前进行筛选,
之后进行
筛选。虽然它通常用于聚合结果,但也可以用于结果集中的任何内容。它实际上只是将原始查询放在子查询中,然后在外部查询.Ic中使用
WHERE
子句的简写,所以您的意思是,将非聚合筛选器从
having
转移到
WHERE
可能不会完全返回相同的结果集?
SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
WHERE t1.val - t2.val > 10