По стандарту:
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не содержит сразу
<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 (определение GROUP BY CLAUSE)
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 ();возвращает строк.