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 WHEREdi impostare un filtro di riga prima del raggruppamento e, con l'aiuto, HAVINGpuoi 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

HAVINGpuò 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.

  1. 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 condizioneWHERE
  2. 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.
  3. Fase 3 - smistamento
    • Le righe ottenute nei passaggi precedenti vengono ordinate utilizzando ORDER BY.

Infine, il risultato può essere tagliato con LIMITe OFFSET.