为什么你需要把你自己创建的列(例如,选择1作为“数字”)后有,而不是哪里在MySQL?

如果不使用WHERE 1(编写整个定义而不是列名),有什么缺点吗?


当前回答

为什么你需要把你自己创建的列(例如“选择1作为数字”)放在HAVING之后,而不是MySQL中的WHERE ?

WHERE应用在GROUP BY之前,HAVING应用在GROUP BY之后(并且可以对聚合进行过滤)。

一般来说,你可以在这两个子句中引用别名,但MySQL允许在GROUP BY, ORDER BY和HAVING中引用SELECT级别的别名。

如果不写“WHERE 1”(写整个定义而不是列名),有什么缺点吗?

如果计算出来的表达式不包含任何聚合,那么将其放入WHERE子句中很可能会更有效。

其他回答

这两个感觉和第一个一样,因为它们都用来表示过滤数据的条件。尽管在任何情况下我们都可以用“having”来代替“where”,但在某些情况下我们不能用“where”来代替“having”。这是因为在选择查询中,' where '在' select '之前过滤数据,而' having '在' select '之后过滤数据。因此,当我们使用实际上不在数据库中的别名时,' where '不能识别它们,但' having '可以。

例如:让Student表包含student_id,姓名,生日,地址。假设生日的类型是date。

SELECT * FROM Student WHERE YEAR(birthday)>1993; /*this will work as birthday is in database.if we use having in place of where too this will work*/

SELECT student_id,(YEAR(CurDate())-YEAR(birthday)) AS Age FROM Student HAVING Age>20; 
/*this will not work if we use ‘where’ here, ‘where’ don’t know about age as age is defined in select part.*/

为什么你需要把你自己创建的列(例如“选择1作为数字”)放在HAVING之后,而不是MySQL中的WHERE ?

WHERE应用在GROUP BY之前,HAVING应用在GROUP BY之后(并且可以对聚合进行过滤)。

一般来说,你可以在这两个子句中引用别名,但MySQL允许在GROUP BY, ORDER BY和HAVING中引用SELECT级别的别名。

如果不写“WHERE 1”(写整个定义而不是列名),有什么缺点吗?

如果计算出来的表达式不包含任何聚合,那么将其放入WHERE子句中很可能会更有效。

主要区别是WHERE不能用于分组项(例如SUM(number)),而HAVING可以。

原因是WHERE是在分组之前执行的,HAVING是在分组之后执行的。

HAVING用于筛选GROUP BY中的聚合。

例如,要检查重复的名称:

SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1

WHERE在数据分组之前过滤,HAVING在数据分组之后过滤。这是一个重要的区别;行是 由WHERE子句消除的将不包含在组中。这 可以改变计算值,反过来(=结果)可以影响哪 组是基于这些值在HAVING中的使用进行筛选的 条款。

和仍在继续,

HAVING与WHERE如此相似,以至于大多数dbms都将它们视为相同的 ,如果没有指定GROUP BY。尽管如此,你还是应该这样做 自己的区别。HAVING只能与GROUP BY配合使用 条款。使用WHERE进行标准的行级过滤。

摘录: Forta,本。《山姆10分钟自学SQL》(第5期) 版)(山姆自学……)