为什么你需要把你自己创建的列(例如,选择1作为“数字”)后有,而不是哪里在MySQL?
如果不使用WHERE 1(编写整个定义而不是列名),有什么缺点吗?
为什么你需要把你自己创建的列(例如,选择1作为“数字”)后有,而不是哪里在MySQL?
如果不使用WHERE 1(编写整个定义而不是列名),有什么缺点吗?
当前回答
主要区别是WHERE不能用于分组项(例如SUM(number)),而HAVING可以。
原因是WHERE是在分组之前执行的,HAVING是在分组之后执行的。
其他回答
为什么你需要把你自己创建的列(例如“选择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是在分组之后执行的。
WHERE在数据分组之前过滤,HAVING在数据分组之后过滤。这是一个重要的区别;行是 由WHERE子句消除的将不包含在组中。这 可以改变计算值,反过来(=结果)可以影响哪 组是基于这些值在HAVING中的使用进行筛选的 条款。
和仍在继续,
HAVING与WHERE如此相似,以至于大多数dbms都将它们视为相同的 ,如果没有指定GROUP BY。尽管如此,你还是应该这样做 自己的区别。HAVING只能与GROUP BY配合使用 条款。使用WHERE进行标准的行级过滤。
摘录: Forta,本。《山姆10分钟自学SQL》(第5期) 版)(山姆自学……)
Having仅用于聚合语句,但用于非聚合语句 如果你有where word,把它放在聚合(分组by)之前
对这个问题的其他回答都没有抓住要害。
假设我们有一个表:
CREATE TABLE `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
并且有10行id和值都从1到10:
INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);
尝试以下2个查询:
SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
您将得到完全相同的结果,您可以看到HAVING子句可以在没有GROUP BY子句的情况下工作。
区别在于:
SELECT `value` v FROM `table` WHERE `v`>5;
上面的查询将引发错误#1054 - where子句中未知列“v”
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
WHERE子句允许条件使用任何表列,但不能使用别名或聚合函数。 HAVING子句允许条件使用选定的(!)列、别名或聚合函数。
这是因为WHERE子句在select之前过滤数据,而HAVING子句在select之后过滤结果数据。
所以,如果表中有很多行,把条件放在WHERE子句中会更有效。
试着解释一下关键的区别:
EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| 1 | SIMPLE | table | range | value | value | 4 | NULL | 5 | Using where; Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
EXPLAIN SELECT `value` v FROM `table` having `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| 1 | SIMPLE | table | index | NULL | value | 4 | NULL | 10 | Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
您可以看到WHERE或HAVING都使用索引,但行是不同的。