Secondo lo standard:
SELECT 1 FROM r HAVING 1=1
si intende
SELECT 1 FROM r GROUP BY () HAVING 1=1
Visto ISO / IEC 9075-2: 2011 7.10 Sintassi Regola 1 (Parte della definizione della clausola HAVING):
Lascia che HC
sia il <having clause>
. Lascia che TE
sia quello <table expression>
che contiene immediatamente HC
. Se TE
non contiene immediatamente a
<group by clause>
, allora " GROUP BY ()
" è implicito. Lascia che T
sia il descrittore della tabella definita dal <group by clause>
GBC
contenuto immediatamente contenuto TE
e R
sia il risultato di GBC
.
Ok, è molto chiaro.
Asserzione: 1=1
è la vera condizione di ricerca. Non fornirò alcuna citazione per questo.
Adesso
SELECT 1 FROM r GROUP BY () HAVING 1=1
è equivalente a
SELECT 1 FROM r GROUP BY ()
Visto ISO / IEC 9075-2: 2011 7.10 Regola generale 1:
La <search condition>
viene valutata per ciascun gruppo di R
. Il risultato di <having clause>
è una tabella raggruppata di quei gruppi di R per i quali il risultato di
<search condition>
è Vero.
Logica: poiché la condizione di ricerca è sempre vera, il risultato è R
, che è il risultato del gruppo in base all'espressione.
Quello che segue è un estratto delle Regole generali di 7.9 (la definizione del GRUPPO PER CLAUSOLA)
1) Se non <where clause>
viene specificato no , allora T
sia il risultato del precedente <from clause>
; altrimenti, T
sia il risultato del precedente <where clause>
.
2) Caso:
a) Se non ci sono colonne di raggruppamento, il risultato di <group by clause>
è la tabella raggruppata costituita dal T
suo unico gruppo.
Quindi possiamo concludere che
FROM r GROUP BY ()
risulta in una tabella raggruppata, composta da un gruppo, con zero righe (poiché R è vuota).
Un estratto dalle Regole generali di 7.12, che definisce una specifica di query (aka un'istruzione SELECT):
1) Caso:
a) Se T
non è una tabella raggruppata, [...]
b) Se T
è una tabella raggruppata, allora
Astuccio:
i) Se T
ha 0 (zero) gruppi, allora lascia che TEMP sia una tabella vuota.
ii) Se T
ha uno o più gruppi, ognuno <value expression>
viene applicato a ciascun gruppo di T
restituire una tabella TEMP
di M
righe, dove M
è il numero di gruppi in T
. La i
colonna -th di TEMP contiene i valori derivati dalla valutazione del i
-th <value expression>
. [...]
2) Caso:
a) Se <set quantifier>
DISTINCT
non è specificato, il risultato di <query specification>
è TEMP
.
Pertanto, poiché la tabella ha un gruppo, deve avere una riga di risultati.
così
SELECT 1 FROM r HAVING 1=1
dovrebbe restituire un set di risultati di 1 riga.
QED
SELECT COUNT(*) FROM r;
restituisce 1 riga (con0
), mentreSELECT COUNT(*) FROM r GROUP BY ();
non restituisce righe.