HAVINGSQL sorgularında kullanmak GROUP BYiçin, sütun adlarını toplamak için bir a olmalı mı?
HAVINGBir GROUP BYSQL sorgusu olmadan kullanmanın mümkün olduğu özel durumlar var mı?
Aynı anda birlikte var olmak zorunda mı?
HAVINGSQL sorgularında kullanmak GROUP BYiçin, sütun adlarını toplamak için bir a olmalı mı?
HAVINGBir GROUP BYSQL sorgusu olmadan kullanmanın mümkün olduğu özel durumlar var mı?
Aynı anda birlikte var olmak zorunda mı?
Yanıtlar:
Yok hayır.
Oracle'da şu sorgunun işe yaradığı gerçeğinin kanıtladığı gibi bir arada bulunmaları gerekmiyor:
select * from dual having 1 = 1;
Benzer şekilde, PostgreSQL'de aşağıdaki sorgu çalışır:
select 1 having 1 = 1;
Yani having gelmez gerektirir group by .
Yaşıyor uygulanan sonra toplama evresinde ve toplu sonuçları filtrelemek istiyorsanız kullanılmalıdır. Yani tam tersi doğru değildir ve aşağıdakiler işe yaramaz:
select a, count(*) as c
from mytable
group by a
where c > 1;
Sen değiştirmeniz gerekiyor whereile havingaşağıdaki gibi bu durumda:
select a, count(*) as c
from mytable
group by a
having c > 1;
NB Aşağıdaki sorgu formu da çalışacaktır:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
Kullanmanın havingbu son sorgunun kısa bir sürümü olduğunu görebilirsiniz .
Özet olarak, havinguygulandığı sonragroup by faz ise whereuygulanır öncegroup by faz.
select 1 having count(*) = 1;henüz kavramadığım aşağıdaki yapıya izin veriyor .
SELECT 1 AS id, 'Colin' AS name;verirken , Oracle gibi diğerleri özel bir dualmasaya sahipler . Bu sözdizimlerinden herhangi birinin ANSI / ISO SQL (gerekli FROM) olduğunu sanmıyorum .
fromatıfta bulunmak istemedim . Muhtemelen fıkradaki tüm sütunların üzerinde toplanmaktadır . count(*)havingselect
Grupları filtrelemek için kullanılır.
yan tümce satırları süzmek için kullanılır.
havingolan uygulanan çekiş faz kadar sonra kullanılabilir filtre grupları.
GROUP BY deyiminin yokluğunda, sorgu tüm ilişkiyi bir grup olarak kabul eder.
Örneğin
select count(*)
from dual
having count(*) > 5;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);