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 WHEREsă setați un filtru de rând înainte de grupare, iar cu ajutorul HAVINGputeț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

HAVINGpoate 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.

  1. 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țiaWHERE
  2. 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.
  3. 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.