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?”.
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'HAVING COUNT(*) >= 2FROMbierze tabelęWHEREsito na wierszachGROUP BYwiersze do pudełekHAVINGsito na pudełkachSELECTjeden wiersz z pudełkaORDER 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.
| imie | nazwisko | miasto |
|---|---|---|
| Ola | Mazur | Kraków |
| Maja | Kaczmarek | Kraków |
| Filip | Grabowski | Niepołomice |
| Szymon | Michalski | Skawina |
| Lena | Król | Kraków |
| Antoni | Wieczorek | NULL |
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.
| imie | nazwisko | miasto |
|---|---|---|
| Ola | Mazur | Kraków |
| Maja | Kaczmarek | Kraków |
| Filip | Grabowski | Niepołomice |
| Szymon | Michalski | Skawina |
| Lena | Król | Kraków |
| Antoni | Wieczorek | NULL |
Ś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.
| uczen_id | ocena |
|---|---|
| 1 | 6 |
| 1 | 5 |
| 3 | 5 |
| 3 | 4 |
| 4 | 3 |
| 4 | 2 |
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.
| uczen_id | przedmiot_id | ocena |
|---|---|---|
| 1 | 1 | 6 |
| 1 | 2 | 5 |
| 3 | 1 | 5 |
| 3 | 3 | 4 |
| 4 | 1 | 3 |
| 4 | 2 | 2 |
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.