2015-04-23 83 views
0

有人可以请解释如何使用HAVING子句,尽可能减少它。我看了看我的texbook,w3schools和youtube,但我仍然无法将自己的想法包括在内。我不知道是否过度思考,但我需要了解这一点。SQL,HAVING子句解释

回答

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约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约具有value> 5 table;

+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+ 
| 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

尽管我不确定这是否提供这些问题的正确位置,但HAVING子句与WHERE子句几乎相同,但请牢记以下差异。

WHERE子句:

  1. where子句可以使用比Select语句也

  2. 凡适用于每个和单行

  3. 在where子句中的数据获取等根据条件从内存中删除

  4. 在GROUP BY子句前使用的地方

例如:在条件中使用存储器中的数据。

HAVING子句:

  1. 虽仅与SELECT语句中使用。

  2. 具有适用于总结行(与GRO​​UP BY总结)

  3. 在具有先取出,然后根据条件分离的完成的数据。

  4. HAVING子句用于对分组功能强加条件并在查询

例GROUP后使用BY子句:使用平均功能,然后当过滤数据等AVA(销售)> 0

摘要:

Having作品像Where子句出来Group By条款