По стандарту:
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 ();
возвращает строк.