Logo Platforma Edukacyjna - kursy do matury i egzaminów z informatyki

HAVING: warunek dla grup

HAVING to WHERE dla grup. Odpowiada na pytania o całą grupę naraz: „które miasta mają co najmniej dwóch uczniów?”, „kto ma średnią powyżej 4?”.

Najpierw teoria

HAVING to WHERE dla grup

`WHERE` sprawdza jeden wiersz, `HAVING` całą grupę.

Liczbę uczniów w mieście albo średnią ucznia zna dopiero grupa. WHERE patrzy na jednego ucznia naraz i nie wie, ilu jest takich jak on, więc nie zna COUNT ani AVG.

Dlatego HAVING stoi po GROUP BY: najpierw powstają grupy i ich wyniki, potem HAVING wyrzuca grupy, które nie spełniają warunku.

WHERE miasto = 'Kraków'
✓✓✗✗✓✗
sito na wierszach: każdy uczeń osobno
HAVING COUNT(*) >= 2
KrakówCOUNT = 3✓NiepołomiceCOUNT = 1✗SkawinaCOUNT = 1✗NULLCOUNT = 1✗
sito na grupach: całe pudełko po jego wyniku
  1. FROMbierze tabelę
  2. WHEREsito na wierszach
  3. GROUP BYwiersze do pudełek
  4. HAVINGsito na pudełkach
  5. SELECTjeden wiersz z pudełka
  6. ORDER BYkolejność

Pytanie: które miasta mają co najmniej dwóch uczniów? Z WHERE nie da się go zadać: baza zatrzymuje zapytanie, bo w WHERE nie ma jeszcze grup.

To zapytanie możesz zmienić: kliknij w nie, wpisz swoje i naciśnij Enter. Uczniowie odegrają Twoją wersję.

FROM uczniowie: 6 wierszy w szeregu. Każdy wiersz to jedna postać, a kartki pod nią to kolumny.

1/2
imienazwiskomiasto
OlaMazurKraków
MajaKaczmarekKraków
FilipGrabowskiNiepołomice
SzymonMichalskiSkawina
LenaKrólKraków
AntoniWieczorekNULL

To samo z HAVING. Najpierw GROUP BY liczy uczniów w każdym mieście, potem HAVING zostawia tylko miasta z wynikiem co najmniej 2.

FROM uczniowie: 6 wierszy w szeregu. Każdy wiersz to jedna postać, a kartki pod nią to kolumny.

1/4
imienazwiskomiasto
OlaMazurKraków
MajaKaczmarekKraków
FilipGrabowskiNiepołomice
SzymonMichalskiSkawina
LenaKrólKraków
AntoniWieczorekNULL

Średnia też istnieje dopiero dla grupy. Grupa to oceny jednego ucznia, a HAVING zostawia uczniów ze średnią powyżej 4.

FROM oceny: 6 wierszy w szeregu. Każdy wiersz to jedna postać, a kartki pod nią to kolumny.

1/4
uczen_idocena
16
15
35
34
43
42

Oba sita mogą stać w jednym zapytaniu. WHERE najpierw wyrzuca pojedyncze oceny z fizyki (przedmiot 3). Z tego, co zostało, powstają grupy, a HAVING sprawdza ich średnie.

FROM oceny: 6 wierszy w szeregu. Każdy wiersz to jedna postać, a kartki pod nią to kolumny.

1/5
uczen_idprzedmiot_idocena
116
125
315
334
413
422

Warto zapamiętać

Warunek na pojedynczy wiersz (miasto, ocena, data) idzie do WHERE. Warunek na wynik funkcji (COUNT, SUM, AVG, MIN, MAX) idzie do HAVING.