Lekcja 4: Podzapytania — Kiedy Jeden Zapytanie To Za Mało!


Lesson 4

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:

  1. Podzapytania Jednowierszowe: Zwracają tylko jeden wiersz. Idealne do szybkiego podglądu.
  2. Podzapytania Wielowerszowe: Zwracają wiele wierszy. Świetnie nadają się do porównywania list!
  3. Podzapytania Skalowane: Zwracają jedną wartość. Dobre do tajemniczych porównań.
  4. 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!