Відповідно до стандарту:
SELECT 1 FROM r HAVING 1=1
засоби
SELECT 1 FROM r GROUP BY () HAVING 1=1
Цитування ISO / IEC 9075-2: 2011 7.10 Правило 1 синтаксису (частина визначення пункту HAVING):
Нехай HC
буде <having clause>
. Нехай TE
буде те, <table expression>
що відразу містить HC
. Якщо TE
не одразу містить a
<group by clause>
, то " GROUP BY ()
" є неявним. Нехай T
буде дескриптор таблиці, визначений <group by clause>
GBC
одразу, що міститься в, TE
і нехай R
буде результатом GBC
.
Гаразд, що багато чого досить зрозуміло.
Затвердження: 1=1
справжня умова пошуку. Я не буду наводити жодної цитати на це.
Тепер
SELECT 1 FROM r GROUP BY () HAVING 1=1
еквівалентно
SELECT 1 FROM r GROUP BY ()
Цитування ISO / IEC 9075-2: 2011 7.10 Загальне правило 1:
<search condition>
Оцінюється для кожної групи R
. Результатом <having clause>
є згрупована таблиця тих груп R, для яких результат значення
<search condition>
True є.
Логіка: Оскільки умова пошуку завжди відповідає дійсності, результат є R
, який є результатом групи за виразом.
Далі - уривок із Загальних правил 7.9 (визначення групи ГРУПИ ПО КЛАЗУ)
1) Якщо ні <where clause>
вказується, то нехай T
буде результат попереднього <from clause>
; інакше нехай T
буде результатом попереднього <where clause>
.
2) Справа:
a) Якщо немає групувальних стовпців, то результатом <group by clause>
є згрупована таблиця, що складається T
як її єдина група.
Таким чином, ми можемо зробити висновок про це
FROM r GROUP BY ()
приводить до згрупованої таблиці, що складається з однієї групи, з нульовими рядками (оскільки R порожній).
Витяг із Загальних правил 7.12, який визначає Специфікацію запиту (він же SELECT):
1) Справа:
а) Якщо T
це не згрупована таблиця, то [...]
б) Якщо T
це згрупована таблиця, то
Справа:
i) Якщо T
має 0 (нульових) груп, то нехай TEMP - порожня таблиця.
б) Якщо T
має одну або кілька груп, то кожен <value expression>
застосовується до кожної групи T
отримує таблицю TEMP
з M
рядків, де M
ця кількість груп в T
. У i
-му стовпці TEMP містяться значення, отримані оцінкою i
-го <value expression>
. [...]
2) Справа:
а) Якщо значення <set quantifier>
DISTINCT
не вказано, то результат <query specification>
є TEMP
.
Тому, оскільки таблиця має одну групу, вона повинна мати один рядок результатів.
Таким чином
SELECT 1 FROM r HAVING 1=1
повинен повернути набір результатів у 1 рядок.
QED
SELECT COUNT(*) FROM r;
повертає 1 рядок (з0
), аSELECT COUNT(*) FROM r GROUP BY ();
повертає жодних рядків.