PODZAPYTANIA (SUBQUERIES) W MySQL
Podzapytania (ang. subqueries) to zapytania umieszczone wewnątrz innych zapytań SQL. MySQL wykonuje je najpierw, a wynik przekazuje do zapytania nadrzędnego (outer query).
Rodzaje podzapytań
✔ Podzapytania skalarne
Zwracają dokładnie jedną wartość (jedną kolumnę i jeden wiersz).
✔ Podzapytania zwracające wiele wierszy
Stosowane z operatorami:
IN, ANY, ALL, EXISTS.
✔ Podzapytania w klauzulach
- w
SELECT(wartości obliczane) - w
WHERE(najczęściej) - w
FROM(tzw. subquery as table) - w
HAVING
Podzapytania skalarne – przykłady
Przykład 1
Znajdź nauczycieli, którzy zarabiają więcej niż średnia pensja wszystkich nauczycieli.
Podzapytanie:
zwraca jedną liczbę → średnią pensję.
Przykład 2
Znajdź uczniów, którzy mają największą ocene z Matematyki.
Podzapytania zwracające wiele wierszy
Operator IN
Przykład 3
Znajdź uczniów, którzy mają jakiekolwiek oceny 5.00 z dowolnego przedmiotu.
Operator EXISTS
Przykład 4
Wypisz nauczycieli, którzy uczą przynajmniej jedną klasę.
EXISTS zwraca TRUE, jeśli podzapytanie znajdzie choć jeden wynik.
Operator ANY / ALL
Przykład 5
Znajdź nauczycieli, którzy zarabiają więcej niż jakikolwiek nauczyciel z zarobkami poniżej 4900.
Przykład 6
Znajdź nauczycieli, którzy zarabiają więcej niż wszyscy nauczyciele od WF.
Podzapytania w klauzuli FROM (tzw. inline views)
Są traktowane jak tymczasowe tabele.
Przykład 7
Średnia ocen każdego ucznia wraz z imieniem i nazwiskiem.
Podzapytania w SELECT
Przykład 8
Lista nauczycieli wraz z liczbą klas, które prowadzą (podzapytanie dla każdej osoby).
Zagnieżdżone podzapytania
Przykład 9
Znajdź uczniów, którzy mają więcej ocen niż średnia liczba ocen na ucznia.
- Liczymy liczbę ocen na ucznia
- Liczymy średnią
- Porównujemy z liczbą ocen danego ucznia
Podzapytania zamiast JOIN — kiedy używać?
JOIN jest szybszy, ale podzapytania są wygodniejsze, gdy:
- wartość wyliczana jest jednorazowo,
- potrzebujesz filtrowania na podstawie wyniku agregacji,
- potrzebujesz warunków logicznych typu
EXISTS.
Praktyczne podzapytania na Twojej bazie
Przykład 10
Znajdź uczniów mieszkających w tym samym mieście co ich wychowawca (uczeń → klasa → nauczyciel → dane kontaktowe)
Przykład 11
Znajdź przedmioty, których nikt nie wybrał (na podstawie tablicy UczenPrzedmiot).
Przykład 12
Znajdź najlepszą ocenę jaką uzyskał każdy uczeń.
Różnice między IN, EXISTS, JOIN
| Technika | Zalety | Wady |
|---|---|---|
| IN | prosty zapis | wolniejszy przy dużych zbiorach |
| EXISTS | sprawdza obecność rekordu (efektywny) | tylko TRUE/FALSE |
| JOIN | najszybszy, najlepszy do pobierania danych | nie nadaje się zawsze do filtrów warunkowych |