Untuk menggunakan HAVING
dalam query SQL, haruskah ada GROUP BY
agregat nama kolom?
Apakah ada kasus khusus di mana dimungkinkan untuk digunakan HAVING
tanpa GROUP BY
dalam query SQL?
Haruskah mereka hidup berdampingan pada saat yang sama?
Untuk menggunakan HAVING
dalam query SQL, haruskah ada GROUP BY
agregat nama kolom?
Apakah ada kasus khusus di mana dimungkinkan untuk digunakan HAVING
tanpa GROUP BY
dalam 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 where
dengan having
dalam 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 having
hanyalah versi singkat dari kueri terakhir ini.
Singkatnya, having
diterapkan setelah para group by
fase sedangkan where
diterapkan sebelum itu group by
fase.
select 1 having count(*) = 1;
yang belum saya pahami.
SELECT 1 AS id, 'Colin' AS name;
sementara yang lain seperti Oracle memiliki dual
tabel khusus . Saya tidak berpikir bahwa salah satu dari sintaks ini adalah ANSI / ISO SQL (yang mengharuskan FROM
).
from
tetapi referensi count(*)
dalam having
klausa tanpa indikasi untuk mana kolom ini sedang dikumpulkan. Agaknya agregat di atas semua kolom dalam select
klausa.
Memiliki digunakan untuk menyaring grup.
di mana klausa digunakan untuk menyaring baris.
having
adalah 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);