Lekcja 4: Podzapytania — Kiedy Jeden Zapytanie To Za Mało!
Witaj znowu, dzielny rycerzu danych! Jeśli dotarłeś aż tutaj, pewnie myślisz sobie: “E tam, SQL? To bułka z masłem!” Ale właśnie wtedy, gdy czujesz się królem swoich tabel, PostgreSQL wyciąga asa z rękawa: Podzapytania. I wtedy zaczyna się prawdziwa zabawa! Podzapytania — to jak małe tajne misje, ukryte wewnątrz głównego zapytania, które wykonują całą brudną robotę za kulisami.
Co to jest Podzapytanie?
Wyobraź sobie, że jesteś w restauracji. Zamówiłeś pizzę (główne zapytanie), ale cicho dodajesz kelnerowi: „A, jeszcze, jeśli to możliwe, dorzućcie trochę boczku.” To właśnie jest twoje podzapytanie! Podzapytanie to zapytanie w zapytaniu, które służy do doprecyzowania lub rozszerzenia wyniku głównego zapytania.
Podzapytania przydają się wtedy, kiedy jedno zapytanie po prostu nie wystarcza, na przykład:
- Znaleźć najlepszych rycerzy (na podstawie liczby wykonanych misji).
- Dowiedzieć się, które smoki spaliły więcej niż trzy wioski.
- Ustalić, którzy rycerze wymagają, hm, dodatkowego szkolenia.
Rodzaje Podzapytania
Podzapytania mają różne rodzaje, zależnie od tego, jak i gdzie je stosujesz. Poznajmy naszych głównych bohaterów:
- Podzapytania Jednowierszowe: Zwracają tylko jeden wiersz. Idealne do szybkiego podglądu.
- Podzapytania Wielowerszowe: Zwracają wiele wierszy. Świetnie nadają się do porównywania list!
- Podzapytania Skalowane: Zwracają jedną wartość. Dobre do tajemniczych porównań.
- Podzapytania Skojarzone: Te są jak szpiedzy — wiedzą, co się dzieje w głównym zapytaniu, i dopasowują się na bieżąco.
Zobaczmy, jak to wygląda w praktyce!
Używanie Podzapytań z SELECT
Zacznijmy od prostego przykładu. Powiedzmy, że masz tabelę rycerze
i chcesz dowiedzieć się, który rycerz wykonał najwięcej misji:
SELECT imie
FROM rycerze
WHERE wykonane_misje = (SELECT MAX(wykonane_misje) FROM rycerze);
To małe podzapytanie (SELECT MAX(wykonane_misje) FROM rycerze)
robi swoje, zwraca maksymalną liczbę wykonanych misji i przekazuje ją głównemu zapytaniu, które następnie mówi: „Pokaż mi tylko tych rycerzy, którzy mają właśnie tyle misji.”
Podzapytania w FROM
A teraz załóżmy, że chcesz pogrupować rycerzy według królestw i zobaczyć średnią liczbę wykonanych misji. Zwykłe zapytanie może się pogubić, ale podzapytanie w FROM
łatwo to ogarnie:
SELECT krolestwo, AVG(wykonane_misje)
FROM (SELECT imie, krolestwo, wykonane_misje FROM rycerze) AS sub_rycerze
GROUP BY krolestwo;
Tutaj nasze podzapytanie działa jak tymczasowa tabela, ograniczając dane, zanim główne zapytanie wejdzie do gry.
Podzapytania w WHERE
Podzapytania są często używane w WHERE
, aby ustawić warunki. Wyobraź sobie, że chcesz znaleźć rycerzy, którzy wykonali więcej misji, niż wynosi średnia wszystkich rycerzy:
SELECT imie
FROM rycerze
WHERE wykonane_misje > (SELECT AVG(wykonane_misje) FROM rycerze);
Podzapytanie oblicza średnią, a główne zapytanie mówi: „Pokaż mi tylko tych rycerzy, którzy są powyżej średniej!” (Czyli takich, którzy faktycznie ruszają do akcji, a nie tylko siedzą w zbroi i liczą owce.)
Podzapytania Skojarzone: Szpiedzy SQL
Podzapytania skojarzone są najchytrzejsze ze wszystkich. Wykonują się dla każdego wiersza głównego zapytania i mogą odnosić się do jego kolumn. Załóżmy, że chcesz dowiedzieć się, którzy rycerze wykonali więcej misji, niż wynosi średnia w ich własnym królestwie:
SELECT imie, krolestwo
FROM rycerze AS r1
WHERE wykonane_misje > (SELECT AVG(wykonane_misje)
FROM rycerze AS r2
WHERE r2.krolestwo = r1.krolestwo);
Tutaj podzapytanie dynamicznie oblicza średnią liczbę misji dla każdego królestwa. To jak szpieg w głównym zapytaniu, który собирает dane и передает их дальше.
Podzapytania w SELECT
Na koniec, porozmawiajmy o podzapytaniach w SELECT
. Wyobraź sobie, że chcesz raport, który pokazuje imię każdego rycerza i to, jak wypada w porównaniu z ogólną średnią wykonanych misji:
SELECT imie,
wykonane_misje,
(SELECT AVG(wykonane_misje) FROM rycerze) AS ogolna_srednia
FROM rycerze;
Teraz masz jasne porównanie, i wszystko dzięki этому маленькому подзапytанию, который спрятался в основном запросе.
Połączmy Wszystko: Wielki Pokaz Podzapytań!
Oto scenariusz, który покажет wszystko, czego się nauczyliśmy:
Chcesz znaleźć rycerzy, którzy wykonali więcej misji, niż wynosi średnia, ale tylko jeśli pochodzą z królestw, gdzie średnia liczba misji przekracza 3. Brzmi skomplikowanie? Voilà:
SELECT imie
FROM rycerze
WHERE wykonane_misje > (SELECT AVG(wykonane_misje)
FROM rycerze)
AND krolestwo IN (SELECT krolestwo
FROM rycerze
GROUP BY krolestwo
HAVING AVG(wykonane_misje) > 3);
Ten potwór-zapytanie używa podzapytań zarówno w WHERE
, jak i w IN
. To jak dowodzić całą armią małych zapytań!
Czego się Dziś Nauczyliśmy?
Dziś odkryliśmy świat podzapytań:
- Podzapytania Jednowierszowe: Zwracają jeden wiersz, używane do precyzyjnych porównań.
- Podzapytania Wielowerszowe: Zwracają wiele wierszy, idealne dla list.
- Podzapytania Skalowane: Zwracają jedno значение, używane do porównań.
- Podzapytania Skojarzone: Dynamicznie dopasowują się do głównego zapytania.
Co Dalej?
W następnej lekcji przejdziemy do CTE i Funkcji Okienkowych. Przygotuj się na kolejny poziom umiejętności SQL!
Witaj w świecie podzapytań. Niech twoje zapytania będą zawsze szybkie, a wyniki — dokładne!