Відповідно до стандарту:
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 ();повертає жодних рядків.