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 HCbędzie <having clause>. Niech TEbędzie to, <table expression>co natychmiast zawiera HC. Jeśli TEnie zawiera od razu znaku
„, oznacza <group by clause>to„ GROUP BY ()”. Niech Tbędzie deskryptorem tabeli zdefiniowanej przez <group by clause> GBCbezpośrednio zawartą TEi niech Rbędzie wynikiem GBC.
Ok, więc wszystko jest całkiem jasne.
Twierdzenie: 1=1jest 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 Tbędzie wynikiem poprzedniego <from clause>; w przeciwnym razie niech Tbę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ę Tjako 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 Tnie jest zgrupowana tabela, to [...]
b) Jeśli Ttabela jest zgrupowana, to
Walizka:
i) Jeśli Tma 0 (zero) grup, niech TEMP będzie pustą tabelą.
ii) w przypadku Tposiada jedną lub więcej grup, a każdy <value expression>jest stosowany do każdej grupy Totrzymując tabelę TEMPz Mrzędów, gdzie Mjest liczba grup T. i-Tej kolumny temp zawiera wartości uzyskane przez ocenę i-tym <value expression>. [...]
2) Obudowa:
a) Jeśli <set quantifier> DISTINCTnie 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.