有人可以解释如何使用HAVING子句,尽可能地减少它。我看着我的短信书,w3schools和youtube,但我仍然无法围绕这一点。我不知道我是不是在想这个但我需要学习这个。
答案 0 :(得分:3)
HAVING用于过滤GROUP BY中的聚合。
例如,要检查重复的名称:
SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
假设我们有一张表:
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 - 未知栏' v'在' where子句'
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
WHERE子句要求条件成为表中的列,但HAVING子句可以同时使用列和别名。
这是因为WHERE子句在select之前过滤数据,但是HAVING子句在select之后过滤数据。
因此,如果表中有许多行,则将WHERE子句中的条件更有效。
尝试使用EXPLAIN查看关键区别:
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 table
来自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使用索引,但行数不同。
答案 1 :(得分:1)
虽然我不确定这是提出这些问题的正确位置,但HAVING
条款与WHERE
条款几乎相同,但要记住以下差异。
条款:
除了Select语句
适用于每一行
在where子句中根据条件
在GROUP BY子句
Ex:对内存中的数据使用Condition。
有条款:
仅用于SELECT语句。
适用于汇总行(使用GROUP BY汇总)
首先获取完成的数据然后根据条件分离。
HAVING子句用于对GROUP函数施加条件,并在查询中的GROUP BY子句之后使用
例如:使用avg功能然后过滤数据,如ava(Sales)> 0
<强>要点:强>
Having
的作用类似于Where
子句,而Group By
条款