Sesuai standar:
SELECT 1 FROM r HAVING 1=1
cara
SELECT 1 FROM r GROUP BY () HAVING 1=1
Kutipan ISO / IEC 9075-2: 2011 7.10 Sintaks Aturan 1 (Bagian dari definisi klausa HAVING):
Biarkan HC
saja <having clause>
. Biarkan TE
menjadi <table expression>
yang berisi HC
. Jika TE
tidak segera mengandung a
<group by clause>
, maka " GROUP BY ()
" adalah implisit. Membiarkan T
menjadi deskriptor dari tabel yang didefinisikan oleh <group by clause>
GBC
segera terkandung TE
dan biarkan R
menjadi hasil GBC
.
Ok jadi itu cukup jelas.
Pernyataan: 1=1
adalah kondisi pencarian yang sebenarnya. Saya tidak akan memberikan kutipan untuk ini.
Sekarang
SELECT 1 FROM r GROUP BY () HAVING 1=1
setara dengan
SELECT 1 FROM r GROUP BY ()
Kutipan ISO / IEC 9075-2: 2011 7.10 Aturan Umum 1:
The <search condition>
dievaluasi untuk setiap kelompok R
. Hasil dari <having clause>
adalah tabel dikelompokkan dari kelompok-kelompok R yang hasilnya
<search condition>
benar.
Logika: Karena kondisi pencarian selalu benar, hasilnya adalah R
, yang merupakan hasil grup dengan ekspresi.
Berikut ini adalah kutipan dari Peraturan Umum 7.9 (definisi GROUP BY CLAUSE)
1) Jika tidak <where clause>
ditentukan, maka biarkan T
menjadi hasil dari pendahulunya <from clause>
; jika tidak, biarkan T
menjadi hasil dari sebelumnya <where clause>
.
2) Kasus:
a) Jika tidak ada kolom pengelompokan, maka hasil dari <group by clause>
adalah tabel dikelompokkan terdiri dari T
sebagai satu-satunya grup.
Dengan demikian kita dapat menyimpulkan itu
FROM r GROUP BY ()
menghasilkan tabel yang dikelompokkan, terdiri dari satu grup, dengan nol baris (karena R kosong).
Kutipan dari Aturan Umum 7.12, yang mendefinisikan Spesifikasi Kueri (alias pernyataan SELECT):
1) Kasus:
a) Jika T
bukan tabel yang dikelompokkan, maka [...]
b) Jika T
tabel dikelompokkan, maka
Kasus:
i) Jika T
memiliki 0 (nol) grup, maka biarkan TEMP menjadi tabel kosong.
ii) Jika T
memiliki satu atau lebih kelompok, maka setiap <value expression>
diterapkan untuk setiap kelompok T
menghasilkan sebuah meja TEMP
dari M
baris, di mana M
adalah jumlah kelompok di T
. The i
kolom -th TEMP mengandung nilai-nilai yang diperoleh evaluasi i
-th <value expression>
. [...]
2) Kasus:
a) Jika <set quantifier>
DISTINCT
tidak ditentukan, maka hasil dari <query specification>
is TEMP
.
Oleh karena itu karena tabel memiliki satu grup, itu harus memiliki satu baris hasil.
Jadi
SELECT 1 FROM r HAVING 1=1
harus mengembalikan set hasil 1 baris.
QED
SELECT COUNT(*) FROM r;
mengembalikan 1 baris (dengan0
), sementaraSELECT COUNT(*) FROM r GROUP BY ();
tidak mengembalikan baris.