GROUP BY olmadan HAVING'in SQL sorgularında kullanımı


26

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:


25

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.


2
Başka bir örnek:SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
ypercubeᵀᴹ

1
Evet. PostgreSQL, select 1 having count(*) = 1;henüz kavramadığım aşağıdaki yapıya izin veriyor .
Colin 'te Hart

SQL Server da izin 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 .
ypercubeᵀᴹ

Bu maddenin hangi sütunların üzerinde toplandığına dair herhangi bir belirti olmaksızın , maddeye fromatıfta bulunmak istemedim . Muhtemelen fıkradaki tüm sütunların üzerinde toplanmaktadır . count(*)havingselect
Colin 'te Hart

Ah tamam. Evet, bunun ne anlama geldiğine katılıyorum (demek istediğiniz tüm satırlarda - boş bir tablonun tüm satırlarında toplanmalıdır).
ypercubeᵀᴹ


1

HAVING grupları filtreliyor. GROUP BY nedenine sahip değilseniz, tüm satırlar bir grup sunar. Dolayısıyla, HAVING öğesindeki yordam doğru olarak değerlendirilirse, bir satır alırsınız, aksi takdirde satır olmaz.


1

GROUP BY deyiminin yokluğunda, sorgu tüm ilişkiyi bir grup olarak kabul eder.

Örneğin

     select count(*)
     from dual
     having count(*) > 5;
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.