5.1 Dichiarazione HAVING
C'è un altro operatore utile in SQL che viene utilizzato con GROUP BY
, si chiama HAVING
.
Nel suo significato, è del tutto analogo all'operatore WHERE
. Ti consente solo WHERE
di impostare un filtro di riga prima del raggruppamento e, con l'aiuto, HAVING
puoi impostare un filtro che viene applicato ai record dopo il raggruppamento.
La visualizzazione generale della query quando si utilizza il raggruppamento e il filtraggio dei risultati del raggruppamento è la seguente:
SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition
HAVING
può essere utilizzato solo se la richiesta contiene GROUP BY
.
Scriviamo una query in cui mostriamo il numero di dipendenti assunti per anno.
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
E il risultato di questa query:
noleggio_anno | totale |
---|---|
2012 | 1 |
2013 | 1 |
2014 | 1 |
2015 | 2 |
2018 | 1 |
E ora ne escludiamo gli anni in cui sono stati assunti uno o meno dipendenti. Esempio:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1
E il risultato di questa query:
noleggio_anno | totale |
---|---|
2015 | 2 |
5.3 Ordine di esecuzione delle dichiarazioni
Per scrivere query SQL corrette ed efficienti, è necessario comprendere come vengono eseguite dal server SQL.
La procedura per eseguire azioni è strettamente regolamentata e non dipende dal tuo desiderio. Non è possibile riorganizzare gli operatori e ottenere un ordine diverso.
La query SQL viene eseguita in più fasi in questo ordine.
- Fase 1: recupero delle righe
- Innanzitutto, vengono selezionate tutte le righe della tabella specificata.
- Quindi vengono aggiunti campi calcolati.
- E poi di tutte le righe rimangono solo quelle che soddisfano la condizione
WHERE
- Fase 2 - raggruppamento
- Il raggruppamento viene quindi applicato ai risultati.
- Durante il raggruppamento, campi come
COUNT(*)
. - Infine, viene applicato un filtro al risultato del raggruppamento
HAVING
. - Fase 3 - smistamento
- Le righe ottenute nei passaggi precedenti vengono ordinate utilizzando
ORDER BY
.
Infine, il risultato può essere tagliato con LIMIT
e OFFSET
.
GO TO FULL VERSION