NEREDE vs HAVING


247

Neden kendi oluşturduğunuz sütunları (örneğin select 1 as "number") MySQL'e HAVINGdeğil sonrasına yerleştirmeniz gerekiyor WHERE?

Ve yapmak yerine herhangi bir dezavantajı var WHERE 1mı (bir sütun adı yerine tüm tanımı yazmak)?

Yanıtlar:


323

Neden MySQL'de NEREDE değil, kendiniz oluşturduğunuz sütunları yerleştirmeniz gerekiyor (örneğin "sayı olarak 1'i seçin")?

WHEREönce uygulanır GROUP BY, HAVINGsonra uygulanır (ve agrega filtre).

Genel olarak, bu iki maddede de takma adlara başvuramazsınız , ve ve öğelerinde MySQLbaşvuru SELECTdüzeyi takma adlarına izin verirsiniz .GROUP BYORDER BYHAVING

Ve "WHERE 1" yerine herhangi bir olumsuzluk var mı (bir sütun adı yerine tüm tanımı yazıyor)

Hesaplanan ifadeniz herhangi bir toplama içermiyorsa, ifadenin yanına koymak WHEREbüyük olasılıkla daha etkili olacaktır.


289

Bu sorudaki diğer tüm cevaplar kilit noktaya çarpmadı.

Bir masamız olduğunu varsayın:

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

Hem id hem de değeri 1'den 10'a kadar olan 10 satırınız var:

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);

Aşağıdaki 2 sorguyu deneyin:

SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows

Aynı sonuçları alırsınız, HAVING deyiminin GROUP BY deyimi olmadan çalışabileceğini görebilirsiniz.


Fark şu:

SELECT `value` v FROM `table` WHERE `v`>5;

Hata # 1054 - 'where cümlesi' içinde bilinmeyen 'v' sütunu

SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows

WHERE deyimi, bir koşulun herhangi bir tablo sütununu kullanmasına izin verir, ancak takma adları veya toplama işlevlerini kullanamaz. HAVING deyimi, koşulun seçili (!) Sütun, diğer ad veya toplama işlevini kullanmasına izin verir.

Bunun nedeni, WHERE deyiminin seçimden önce verileri filtrelemesi, ancak HAVING deyiminin, seçimden sonra elde edilen verileri filtrelemesi.

Bu nedenle, bir tabloda çok sayıda satırınız varsa, WHERE yan tümcesindeki koşulları daha verimli hale getirin.

Temel farkı görmek için EXPLAIN'i deneyin:

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

NEREDE veya HAVING dizinini kullanır, ancak satırlar farklıdır.


32
EXPLAIN'den bahsettiğiniz için teşekkür ederiz!
paiego

HAVING deyimi, verileri seçtikten sonra filtrelediğinden, WHERE deyimi daha etkili olacaktır. Eğer bu doğruysa, NEREDE yerine HAVING'i ne zaman kullanmalıyız?
grep

5
@grep Seçtikten sonra verileri filtrelemeniz gerekiyorsa, HAVING yan tümcesine ihtiyacınız var, genellikle GROUP BY yan tümcesi ile kullanıyoruz, örneğin: SELECT value, COUNT(*) frequency FROM table GROUP BY value HAVING frequency > 10
Fishdrowned

1
Mükemmel gönderi. Önerilen açıklamalar bir çift: Değişim ...HAVING clause can use both column and alias.için ...HAVING clause can use either column or alias.ve değişim ...WHERE clause will be more effectiveiçin...WHERE clause will be more efficient
rmirabelle

2
HAVING deyimi, WHERE anahtar sözcüğü toplama işlevleriyle kullanılamadığından SQL'e eklendi.
Shashank Vivek

62

Temel fark, WHEREgruplanmış öğede (örneğin SUM(number)) kullanılamamasıdır.HAVING kullanılamamasıdır.

Nedeni gruplamadan önceWHERE yapılır ve gruplama yapıldıktan sonra yapılır.HAVING



8

Her ikisi de verileri filtrelemek için bir koşul hakkında söylemek için kullanıldığından, bu 2 ilk olarak aynı hissedilecektir. Her halükarda 'nerede' yerine 'sahip olmak' kullanabilmemize rağmen, 'sahip olmak' yerine 'nerede' kullanamayacağımız durumlar vardır. Bunun nedeni, bir seçme sorgusunda "burada", "select" den sonra verileri filtrelemek "" seçmeden önce "verileri filtrelemek" tir. Yani, aslında veritabanında olmayan takma adlar kullandığımızda, 'nerede' onları tanımlayamaz ancak 'sahip' olabilir.

Örn: Tabloya öğrenci_kimliği, ad, doğum günü, adres dahil olsun. Doğum günü tür tarihidir.

SELECT * FROM Student WHERE YEAR(birthday)>1993; /*this will work as birthday is in database.if we use having in place of where too this will work*/

SELECT student_id,(YEAR(CurDate())-YEAR(birthday)) AS Age FROM Student HAVING Age>20; 
/*this will not work if we use ‘where’ here, ‘where’ don’t know about age as age is defined in select part.*/

1
Bu gerçek hayat örneği WHEREve arasındaki farkı tam olarak açıklar HAVING.
WM

Sahip olmak ve nerede olmak arasındaki farkı açıkça göstermektedir. Teşekkürler.
MarcoZen

3

Veriler gruplandırılmadan önce NEREYE filtreler ve veriler gruplandırıldıktan sonra HAVING filtreleri. Bu önemli bir ayrım; WHERE deyimi tarafından elenen satırlar gruba dahil edilmez. Bu, hesaplanan değerleri değiştirebilir ve sonuç olarak (= sonuç olarak) HAVING yan tümcesinde bu değerlerin kullanımına bağlı olarak hangi grupların filtreleneceğini etkileyebilir .

Ve devam ediyor,

HAVING , NEREDE kadar benzerdir ki, herhangi bir GROUP BY belirtilmezse çoğu DBMS onlara aynı şey olarak davranır . Bununla birlikte, bu ayrımı kendiniz yapmalısınız. HAVING işlevini yalnızca GROUP BY deyimleriyle birlikte kullanın . Standart satır düzeyinde filtreleme için WHERE kullanın .

Alıntı: Forta, Ben. “Sams 10 Dakikada Kendine SQL Öğretiyor (5. Baskı) (Sams Kendine Öğret ...).”.


1

Sahip olmak yalnızca toplama ile kullanılır, ancak toplama olmayan ifadelerle nerede kullanılır? Word'ün toplamadan önce nereye koyduğunu (gruplama)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.