Podzapytania

1. Czym są podzapytania?

Podzapytanie to zapytanie SQL zagnieżdżone wewnątrz innego zapytania. Jego wynik jest wykorzystywany przez zapytanie główne.

Podzapytania pozwalają:

  • pisać bardziej złożone zapytania
  • unikać skomplikowanych JOIN
  • wykonywać zapytania „krok po kroku” (logicznie)

Ogólna postać:


2. Rodzaje podzapytań

2.1. Podzapytania skalarne (zwracają jedną wartość)

Zwracają dokładnie jedną wartość (np. średnią, maksimum).

Przykład: uczniowie z oceną wyższą niż średnia wszystkich ocen

➡ Podzapytanie oblicza średnią, a zapytanie główne ją wykorzystuje.


2.2. Podzapytania zwracające wiele wartości (IN)

Zwracają listę wartości (np. wiele id).

Przykład: uczniowie, którzy mają ocenę z matematyki

➡ Podzapytanie zwraca listę uczniów z matematyki.


2.3. Podzapytania w FROM (tzw. tabele pochodne)

Podzapytanie działa jak tymczasowa tabela.

Przykład: średnia ocen każdego ucznia, a następnie filtracja

Alias (AS srednie_uczniow) jest obowiązkowy.


3. Podzapytania w różnych częściach zapytania

3.1. Podzapytanie w SELECT

Przykład: imię ucznia i jego średnia ocen

➡ Podzapytanie wykonywane osobno dla każdego ucznia.


3.2. Podzapytanie w WHERE

Najczęściej spotykane.

Przykład: nauczyciele zarabiający więcej niż średnia


3.3. Podzapytanie w HAVING

Przykład: klasy, w których średnia ocen > 4.3


4. Podzapytania skorelowane (correlated subqueries)

Podzapytanie skorelowane odwołuje się do kolumn zapytania głównego i jest wykonywane dla każdego wiersza osobno.

Przykład: uczniowie z oceną wyższą niż ich własna średnia

Wolniejsze niż zwykłe podzapytania, ale bardzo elastyczne.


5. Operatory używane z podzapytaniami

5.1. IN

5.2. NOT IN

➡ Uczniowie bez ocen.


5.3. EXISTS / NOT EXISTS

Sprawdza czy podzapytanie zwraca jakiekolwiek wiersze.

Przykład: uczniowie, którzy mają co najmniej jedną ocenę

EXISTS często szybsze niż IN przy dużych danych.


6. Podzapytania vs JOIN

Podzapytania JOIN
Łatwiejsze logicznie Często wydajniejsze
Czytelne Bardziej „SQL-owe”
Czasem wolniejsze Lepsze dla dużych baz

W praktyce często można użyć obu rozwiązań.


7. Najczęstsze błędy

❌ Podzapytanie zwraca więcej niż jedną wartość przy =

✔ Poprawnie:


❌ Brak aliasu w podzapytaniu w FROM

✔ Poprawnie:


8. Podsumowanie (najważniejsze)

  • Podzapytanie = zapytanie w zapytaniu
  • Może występować w: SELECT, FROM, WHERE, HAVING
  • Rodzaje:

    • skalarne
    • wielowartościowe (IN)
    • skorelowane
  • Operatory: IN, NOT IN, EXISTS

  • Alternatywa dla JOIN