Standartlara göre:
SELECT 1 FROM r HAVING 1=1
anlamına geliyor
SELECT 1 FROM r GROUP BY () HAVING 1=1
Alıntı ISO / IEC 9075-2: 2011 7.10 Sözdizimi Kural 1 (HAVING yan tümcesinin tanımının bir parçası):
Izin HC
olmak <having clause>
. Izin TE
olmak <table expression>
hemen içerdiğini HC
. Eğer TE
hemen bir içermiyor
<group by clause>
, ardından “ GROUP BY ()
” örtük olduğunu. Izin vermek hemen içerdiği T
tarafından tanımlanan tablonun tanımlayıcı olmak ve sonuç olsun .<group by clause>
GBC
TE
R
GBC
Tamam o kadar açık ki.
İddia: 1=1
gerçek arama koşulu. Bunun için alıntı yapmayacağım.
şimdi
SELECT 1 FROM r GROUP BY () HAVING 1=1
eşittir
SELECT 1 FROM r GROUP BY ()
Atıf ISO / IEC 9075-2: 2011 7.10 Genel Kural 1:
<search condition>
Her grup için değerlendirilir R
. Sonuç <having clause>
, sonucunun <search condition>
Doğru olduğu R gruplarının gruplandırılmış bir tablosudur
.
Mantık: Arama koşulu daima doğru R
olduğu için sonuç, grubun ifadeye göre sonucudur.
Aşağıdaki genel kurallar 7.9'dan (GROUP BY CLAUSE'ın tanımı) bir alıntıdır.
1) Hayır <where clause>
belirtilirse, bir öncekinin T
sonucu olsun <from clause>
; aksi takdirde, bir öncekinin T
sonucu olsun <where clause>
.
2) Durum:
a) Hiçbir gruplama sütunu yoksa, sonucunun sonucu tek grup olarak <group by clause>
oluşan gruplandırılmış tablodur T
.
Böylece şu sonuca varabiliriz:
FROM r GROUP BY ()
sıfır satır içeren bir gruptan oluşan gruplandırılmış bir tablo ile sonuçlanır (R boş olduğu için).
Sorgu Spesifikasyonu (diğer adıyla SELECT ifadesi) tanımlayan 7.12 Genel Kurallarından bir alıntı:
1) Durum:
a) T
Gruplandırılmış bir tablo değilse, [...]
b) T
Gruplandırılmış bir tablo ise,
Durum:
i) T
0 (sıfır) grup varsa TEMP'nin boş bir tablo olmasına izin verin.
Eğer ii) T
bir veya daha fazla grup yer alır, daha sonra her bir <value expression>
her bir gruba uygulanan T
bir tablo elde TEMP
ait M
sıraları, burada M
grupların sayısıdır T
. i
TEMP inci kolon değerlendirilmesi ile elde edilen değerleri içerir i
th <value expression>
. [...]
2) Durum:
Bir) <set quantifier>
DISTINCT
belirtilmemişse, o sonucu <query specification>
olduğunu TEMP
.
Bu nedenle, tablonun bir grubu olduğundan, bir sonuç satırına sahip olması gerekir.
Böylece
SELECT 1 FROM r HAVING 1=1
1 satır sonuç kümesi döndürmelidir.
QED
SELECT COUNT(*) FROM r;
1 satır döndürüyor (ile0
),SELECT COUNT(*) FROM r GROUP BY ();
hiçbir satır döndürmüyor.