SQL,HAVING子句解释

时间:2015-04-23 04:23:44

标签: mysql sql

有人可以解释如何使用HAVING子句,尽可能地减少它。我看着我的短信书,w3schools和youtube,但我仍然无法围绕这一点。我不知道我是不是在想这个但我需要学习这个。

2 个答案:

答案 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条款几乎相同,但要记住以下差异。

条款:

  1. 除了Select语句

  2. 之外,还可以使用其中的子句
  3. 适用于每一行

  4. 在where子句中根据条件

  5. 从内存中获取的数据
  6. 在GROUP BY子句

  7. 之前使用的位置

    Ex:对内存中的数据使用Condition。

    有条款:

    1. 仅用于SELECT语句。

    2. 适用于汇总行(使用GROUP BY汇总)

    3. 首先获取完成的数据然后根据条件分离。

    4. HAVING子句用于对GROUP函数施加条件,并在查询中的GROUP BY子句之后使用

    5. 例如:使用avg功能然后过滤数据,如ava(Sales)> 0

      <强>要点:

      Having的作用类似于Where子句,而Group By条款