Yanıtlar:
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
, HAVING
sonra uygulanır (ve agrega filtre).
Genel olarak, bu iki maddede de takma adlara başvuramazsınız , ve ve öğelerinde MySQL
başvuru SELECT
düzeyi takma adlarına izin verirsiniz .GROUP BY
ORDER BY
HAVING
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 WHERE
büyük olasılıkla daha etkili olacaktır.
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.
SELECT value, COUNT(*) frequency FROM table GROUP BY value HAVING frequency > 10
...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 effective
için...WHERE clause will be more efficient
Temel fark, WHERE
gruplanmış öğ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
HAVING
içindeki toplamalara filtre uygulamak için kullanılır GROUP BY
.
Örneğin, yinelenen adları kontrol etmek için:
SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
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.*/
WHERE
ve arasındaki farkı tam olarak açıklar HAVING
.
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 ...).”.
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)