Zgodnie ze standardem:
SELECT 1 FROM r HAVING 1=1
znaczy
SELECT 1 FROM r GROUP BY () HAVING 1=1
Odniesienie ISO / IEC 9075-2: 2011 7.10 Reguła składniowa 1 (Część definicji klauzuli HAVING):
Niech HC
będzie <having clause>
. Niech TE
będzie to, <table expression>
co natychmiast zawiera HC
. Jeśli TE
nie zawiera od razu znaku
„, oznacza <group by clause>
to„ GROUP BY ()
”. Niech T
będzie deskryptorem tabeli zdefiniowanej przez <group by clause>
GBC
bezpośrednio zawartą TE
i niech R
będzie wynikiem GBC
.
Ok, więc wszystko jest całkiem jasne.
Twierdzenie: 1=1
jest prawdziwym warunkiem wyszukiwania. Nie podam za to żadnego cytatu.
Teraz
SELECT 1 FROM r GROUP BY () HAVING 1=1
jest równoważne z
SELECT 1 FROM r GROUP BY ()
Odniesienie ISO / IEC 9075-2: 2011 7.10 Zasada ogólna 1:
<search condition>
Oceniano dla każdej grupy R
. Wynikiem <having clause>
jest pogrupowana tabela tych grup R, dla których wynikiem
<search condition>
jest Prawda.
Logika: Ponieważ warunek wyszukiwania jest zawsze prawdziwy, wynikiem jest wynik R
, który jest wynikiem grupy według wyrażenia.
Poniżej znajduje się fragment Ogólnych zasad 7.9 (definicja GRUPY WEDŁUG KLAUZULI)
1) Jeśli nie <where clause>
podano no, niech T
będzie wynikiem poprzedniego <from clause>
; w przeciwnym razie niech T
będzie wynikiem poprzedniego <where clause>
.
2) Obudowa:
a) Jeśli nie ma kolumn grupujących, wynikiem <group by clause>
jest zgrupowana tabela składająca się T
jako jedyna grupa.
Możemy zatem dojść do wniosku
FROM r GROUP BY ()
daje zgrupowaną tabelę, składającą się z jednej grupy, z zerowymi wierszami (ponieważ R jest puste).
Fragment Zasad ogólnych z 7.12, który definiuje specyfikację zapytania (zwaną także instrukcją SELECT):
1) Obudowa:
a) Jeśli T
nie jest zgrupowana tabela, to [...]
b) Jeśli T
tabela jest zgrupowana, to
Walizka:
i) Jeśli T
ma 0 (zero) grup, niech TEMP będzie pustą tabelą.
ii) w przypadku T
posiada jedną lub więcej grup, a każdy <value expression>
jest stosowany do każdej grupy T
otrzymując tabelę TEMP
z M
rzędów, gdzie M
jest liczba grup T
. i
-Tej kolumny temp zawiera wartości uzyskane przez ocenę i
-tym <value expression>
. [...]
2) Obudowa:
a) Jeśli <set quantifier>
DISTINCT
nie określono, wynik <query specification>
jest TEMP
.
Dlatego, ponieważ tabela ma jedną grupę, musi mieć jeden wiersz wyników.
A zatem
SELECT 1 FROM r HAVING 1=1
powinien zwrócić zestaw wyników z 1 wierszem.
CO BYŁO DO OKAZANIA
SELECT COUNT(*) FROM r;
zwraca 1 wiersz (z0
), aSELECT COUNT(*) FROM r GROUP BY ();
nie zwraca wierszy.