5.1 Declarația HAVING
Există un alt operator util în SQL care este folosit cu GROUP BY
, se numește HAVING
.
În sensul său, este complet analog cu operatorul WHERE
. Vă permite doar WHERE
să setați un filtru de rând înainte de grupare, iar cu ajutorul HAVING
puteți seta un filtru care se aplică înregistrărilor după grupare.
Vizualizarea generală a interogării atunci când se utilizează gruparea și filtrarea rezultatelor grupării este următoarea:
SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition
HAVING
poate fi folosit numai dacă cererea conține GROUP BY
.
Să scriem o interogare în care afișăm numărul de angajați angajați.
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
Și rezultatul acestei interogări:
angajare_an | total |
---|---|
2012 | 1 |
2013 | 1 |
2014 | 1 |
2015 | 2 |
2018 | 1 |
Și acum excludem din el anii în care au fost angajați unul sau mai puțini angajați. Exemplu:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1
Și rezultatul acestei interogări:
angajare_an | total |
---|---|
2015 | 2 |
5.3 Ordinea de executare a declarațiilor
Pentru a scrie interogări SQL corecte și eficiente, trebuie să înțelegeți cum sunt executate de serverul SQL.
Procedura de efectuare a acțiunilor este strict reglementată și nu depinde de dorința dvs. Nu puteți rearanja operatorii și obține o comandă diferită.
Interogarea SQL este executată în mai multe etape în această ordine.
- Etapa 1 - preluarea rândurilor
- În primul rând, sunt selectate toate rândurile din tabelul specificat.
- Apoi li se adaugă câmpuri calculate.
- Și apoi din toate rândurile rămân doar cele care îndeplinesc condiția
WHERE
- Etapa 2 - gruparea
- Gruparea este apoi aplicată rezultatelor.
- În timpul grupării, câmpuri precum
COUNT(*)
. - În cele din urmă, se aplică un filtru rezultatului grupării
HAVING
. - Etapa 3 - sortarea
- Rândurile obținute în pașii anteriori sunt sortate folosind
ORDER BY
.
În cele din urmă, rezultatul poate fi tăiat cu LIMIT
și OFFSET
.
GO TO FULL VERSION