2015-04-23 101 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條款