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