mysql中having和where的区别

让咱们先运行2个sql语句: mysql

一、SELECT * FROM `welcome` HAVING id >1 LIMIT 0 , 30
二、SELECT * FROM `welcome` WHERE id >1 LIMIT 0 , 30 sql

查看一下结果吧,怎么样?是否是查询到相同的结果。 函数

让咱们再看2个sql语句: code

一、SELECT user, MAX(salary) FROM users GROUP BY user HAVING MAX(salary)>10;
二、SELECT user, MAX(salary) FROM users GROUP BY user WHERE MAX(salary)>10; 开发

怎么样?看出差异了吗,第一个sql语句能够正常运行【旧版mysql可能会出错】,而第二个则会报错。 扩展

看了2个实例以后,咱们再来看mysql手册中对having语句的说明: sql语句

一、SQL标准要求HAVING必须引用GROUP BY子句中的列或用于总计函数中的列。不过,MySQL支持对此工做性质的扩展,并容许HAVING涉及SELECT清单中的列和外部子查询中的列。 引用

二、HAVING子句必须位于GROUP BY以后ORDER BY以前。 查询

三、若是HAVING子句引用了一个意义不明确的列,则会出现警告。在下面的语句中,col2意义不明确,由于它既做为别名使用,又做为列名使用:mysql> SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2; 开发者

标准SQL工做性质具备优先权,所以若是一个HAVING列名既被用于GROUP BY,又被用做输出列清单中的起了别名的列,则优先权被给予GROUP BY列中的列。

四、HAVING子句能够引用总计函数,而WHERE子句不能引用。【这应该是开发者在特定的状况下采用HAVING子句的最大缘由】

五、不要将HAVING用于应被用于WHERE子句的条目,从咱们开头的2条语句来看,这样用并无出错,可是mysql不推荐。并且也没有明确说明缘由,可是既然它要求,咱们遵循就能够了。

相关文章
相关标签/搜索