CodeGym /Kursy /SQL SELF /Czym są zapytania zagnieżdżone i po co ich używać?

Czym są zapytania zagnieżdżone i po co ich używać?

SQL SELF
Poziom 13, Lekcja 0
Dostępny

Teraz jesteś gotowy na kolejny krok — pracę z zapytaniami zagnieżdżonymi w SQL. Dzisiaj ogarniemy, co to w ogóle jest, po co to komu, jakie są typy zapytań zagnieżdżonych i dlaczego są przydatne w codziennym życiu programisty.

Zapytania zagnieżdżone (albo podzapytania) — to takie zapytania SQL, które są używane wewnątrz innych zapytań SQL. Taka trochę matrioszka albo cebula: masz zapytanie główne, a w środku niego schowane jest inne, mniejsze zapytanie. Podzapytanie wykonuje się jako pierwsze, a jego wynik jest używany przez zapytanie zewnętrzne (czasem nazywane "głównym").

Rozkminimy to na przykładzie:

Przykład 1: Jak to działa

Mamy tabelę students z takimi danymi:

id imię wiek grupa_id
1 Alicja 20 1
2 Bob 22 2
3 Klark 21 1
4 Dina 23 3
5 Emilia 22 2

Oraz tabelę groups, gdzie trzymamy info o nazwach grup:

id nazwa
1 Klasa matematyczna
2 Klasa fizyczna
3 Klasa literacka

Jeśli chcemy dowiedzieć się, jakie są nazwy grup, w których uczą się studenci, możemy użyć zapytania zagnieżdżonego:

SELECT nazwa
FROM groups 
WHERE id IN (
    SELECT grupa_id 
    FROM students 
    WHERE wiek > 21
);

Co się tu dzieje?

Podzapytanie:

SELECT grupa_id 
FROM students 
WHERE wiek > 21

To zapytanie wybiera grupa_id wszystkich studentów starszych niż 21 lat. Wynik: lista identyfikatorów grup, np. [2, 3].

Zapytanie główne:

SELECT nazwa 
FROM groups 
WHERE id IN ([wyniki podzapytania])

To zapytanie używa wyników podzapytania i zwraca nazwy grup, których id to 2 lub 3.

Wynik:

Klasa fizyczna
Klasa literacka

Dalej nic nie kumasz? Spoko, to normalne. Zaraz wszystko rozjaśnimy.

Zacznijmy od prostej idei — wynik działania zapytania SELECT to taki jakby wirtualna tabela. Serio, ma kolumny, ma wiersze. Czym to się różni od zwykłej tabeli?

A skoro wynik zapytania to tabela, to można ją używać tam, gdzie normalnie używasz tabel: w JOIN, na przykład, albo w bardziej skomplikowanych konstrukcjach.

Nie ma ona nazwy i to jest problem. Ale kolumny-wyrażenia też nie mają nazw i rozwiązujemy to nadając im alias — pseudonimy. To samo można zrobić z wirtualnymi tabelami.

Więcej o tym w kolejnych lekcjach — nie będę spoilerował :P

Po co nam zapytania zagnieżdżone?

  1. Ułatwiają trudniejsze zadania. Czasem jedna tabela nie ma wszystkich danych, które chcesz wyciągnąć. Podzapytania pozwalają rozbić zapytanie na dwa etapy: najpierw znajdujesz wynik pośredni, a potem używasz go, żeby dostać finalne dane.

  2. Praca z wynikami pośrednimi. Zapytania zagnieżdżone są przydatne, gdy musisz zrobić dodatkowe obliczenia zanim przetworzysz dane. Na przykład znaleźć minimalną wartość albo policzyć sumę.

  3. Poprawa czytelności kodu. Zapytania zagnieżdżone sprawiają, że kod jest bardziej uporządkowany, szczególnie jeśli pracujesz z dużymi tabelami i skomplikowaną logiką.

Podstawowe typy zapytań zagnieżdżonych

Zapytania zagnieżdżone możesz używać w różnych częściach zapytania SQL. W zależności od tego, gdzie je wrzucisz, dzielą się na kilka typów.

  1. Podzapytania w SELECT. Podzapytanie jest w liście kolumn i służy do wyliczania wartości. To wygodne, np. żeby dodać nową kolumnę do wyników.

Przykład — dodamy kolumnę z maksymalnym wiekiem wśród studentów:

SELECT imię, wiek,
       (SELECT MAX(wiek) FROM students) AS maksymalny_wiek 
FROM students;

Wynik:

imię wiek maksymalny_wiek
Alicja 20 23
Bob 22 23
Klark 21 23
Dina 23 23
Emilia 22 23
  1. Podzapytania w FROM. Podzapytanie jest używane jako tymczasowa tabela. To przydatne, jeśli najpierw musisz zagregować albo przekształcić dane.

Przykład — policzymy średni wiek studentów w każdej grupie:

SELECT tmp.grupa_id, tmp.średni_wiek
FROM (
    SELECT grupa_id, AVG(wiek) AS średni_wiek
    FROM students
    GROUP BY grupa_id
) AS tmp -- Nadajemy alias tmp tymczasowej tabeli 
WHERE tmp.średni_wiek > 21;

Wynik:

grupa_id średni_wiek
2 22.0
3 23.0
  1. Podzapytania w WHERE i HAVING. Podzapytania mogą być warunkiem filtrującym wiersze. Często używa się ich do sprawdzania
  2. istnienia rekordów albo do porównywania wartości.

Przykład — studenci, którzy są starsi niż średni wiek:

SELECT imię, wiek
FROM students
WHERE wiek > (
    SELECT AVG(wiek) 
    FROM students
);

Wynik:

imię wiek
Bob 22
Dina 23
Emilia 22

Zalety używania zapytań zagnieżdżonych

Większa elastyczność: zapytania zagnieżdżone pozwalają ogarniać bardziej złożone struktury danych.

Podział logiki na etapy: możesz rozbić logikę na podzapytania, co sprawia, że kod jest czytelniejszy.

Dostęp do danych pośrednich: możesz obrabiać dane "w locie", bez konieczności tworzenia tymczasowych tabel w bazie danych.

2
Zadanie
SQL SELF, poziom 13, lekcja 0
Niedostępne
LEFT JOIN do wyświetlania wszystkich pracowników i ich projektów
LEFT JOIN do wyświetlania wszystkich pracowników i ich projektów
2
Zadanie
SQL SELF, poziom 13, lekcja 0
Niedostępne
Łączenie zamówień z datami i klientami za pomocą LEFT JOIN
Łączenie zamówień z datami i klientami za pomocą LEFT JOIN
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION