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.

  1. Liczymy liczbę ocen na ucznia
  2. Liczymy średnią
  3. 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