Untuk menggunakan HAVINGdalam query SQL, haruskah ada GROUP BYagregat nama kolom?
Apakah ada kasus khusus di mana dimungkinkan untuk digunakan HAVINGtanpa GROUP BYdalam query SQL?
Haruskah mereka hidup berdampingan pada saat yang sama?
Untuk menggunakan HAVINGdalam query SQL, haruskah ada GROUP BYagregat nama kolom?
Apakah ada kasus khusus di mana dimungkinkan untuk digunakan HAVINGtanpa GROUP BYdalam query SQL?
Haruskah mereka hidup berdampingan pada saat yang sama?
Jawaban:
Tidak.
Mereka tidak harus hidup berdampingan, sebagaimana dibuktikan oleh fakta bahwa permintaan berikut dalam Oracle berfungsi:
select * from dual having 1 = 1;
Demikian pula, di PostgreSQL kueri berikut berfungsi:
select 1 having 1 = 1;
Jadi having tidak perlu group by .
Setelah diterapkan setelah fase agregasi dan harus digunakan jika Anda ingin memfilter hasil agregat. Jadi kebalikannya tidak benar, dan yang berikut ini tidak akan berfungsi:
select a, count(*) as c
from mytable
group by a
where c > 1;
Anda harus mengganti wheredengan havingdalam hal ini, sebagai berikut:
select a, count(*) as c
from mytable
group by a
having c > 1;
NB Formulir permintaan berikut juga akan berfungsi:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
Anda dapat melihat bahwa menggunakan havinghanyalah versi singkat dari kueri terakhir ini.
Singkatnya, havingditerapkan setelah para group byfase sedangkan wherediterapkan sebelum itu group byfase.
select 1 having count(*) = 1;yang belum saya pahami.
SELECT 1 AS id, 'Colin' AS name;sementara yang lain seperti Oracle memiliki dualtabel khusus . Saya tidak berpikir bahwa salah satu dari sintaks ini adalah ANSI / ISO SQL (yang mengharuskan FROM).
fromtetapi referensi count(*)dalam havingklausa tanpa indikasi untuk mana kolom ini sedang dikumpulkan. Agaknya agregat di atas semua kolom dalam selectklausa.
Memiliki digunakan untuk menyaring grup.
di mana klausa digunakan untuk menyaring baris.
havingadalah diterapkan setelah fase agregasi sehingga dapat digunakan untuk kelompok filter.
Dengan tidak adanya klausa GROUP BY, kueri menganggap seluruh hubungan sebagai satu kelompok.
misalnya
select count(*)
from dual
having count(*) > 5;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);