0Pricing
SQL Interview Prep · Lekcja

Podzapytania w klauzuli FROM (tabele pochodne)

Opakowywanie zapytania jako tabeli wirtualnej oraz wyjaśnienie, dlaczego aliasy są obowiązkowe

Podzapytania w klauzuli FROM (tabele pochodne) to bezpłatna lekcja SQL Interview Prep na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.

Czym jest tabela pochodna

Podzapytanie w klauzuli FROM nazywa się tabelą pochodną (lub widokiem inline). Zamiast pojedynczej wartości zwraca cały zbiór wyników, który zapytanie zewnętrzne traktuje tak, jakby był rzeczywistą tabelą.

  • Może zawierać wiele wierszy i wiele kolumn.
  • Można wykonywać na nim zapytania, łączyć je i filtrować tak jak każdą tabelę.

Osoby prowadzące rozmowy używają tabel pochodnych, aby sprawdzić, czy potrafią Państwo podzielić problem na etapy.

Alias jest obowiązkowy

Najważniejsza pułapka: tabela pochodna musi mieć alias. Bez niego większość silników odrzuca zapytanie.

  • MySQL: Every derived table must have its own alias.
  • Postgres: subquery in FROM must have an alias.

Należy nadać jej nazwę (tutaj dept_avg), aby można było odwoływać się do jej kolumn za pomocą tej nazwy.

SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS dept_avg;

Dlaczego warto wcześniej agregować w tabeli pochodnej

Częsty problem na rozmowie kwalifikacyjnej: pokazać każdego pracownika obok średniego wynagrodzenia w jego dziale. Nie można bezpośrednio połączyć wiersza szczegółowego z funkcją agregującą bez problemów związanych z grupowaniem.

Czyste rozwiązanie polega na obliczeniu średniej dla każdego działu w tabeli pochodnej, a następnie połączeniu jej z powrotem z wierszami szczegółowymi. Tabela pochodna najpierw redukuje wynik do jednego wiersza na dział.

SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d ON e.dept_id = d.dept_id;

Filtrowanie wyniku agregacji

Tabele pochodne pozwalają filtrować według obliczonej wartości agregującej bez stosowania złożonych konstrukcji HAVING w zapytaniu zewnętrznym. Załóżmy, że chcemy uwzględnić tylko działy, w których średnie wynagrodzenie przekracza 60000.

Agregujemy dane wewnątrz, a następnie stosujemy zwykłe WHERE do kolumny pochodnej na zewnątrz. Dla zapytania zewnętrznego avg_salary jest zwykłą kolumną.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d
WHERE avg_salary > 60000;

Dwa poziomy agregacji

Tabele pochodne są szczególnie przydatne, gdy potrzebują Państwo agregacji wyniku agregacji — to klasyczne pytanie na rozmowie kwalifikacyjnej: jaka jest średnia ze średnich wynagrodzeń poszczególnych działów?

Nie można bezpośrednio zagnieździć AVG(AVG(...)). Zapytanie wewnętrzne tworzy jedną średnią dla każdego działu, a zewnętrzne oblicza średnią z tych wartości.

SELECT AVG(avg_salary) AS avg_of_dept_avgs
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d;

Nazywanie obliczanych kolumn

Każde wyrażenie w tabeli pochodnej potrzebuje aliasu, jeśli chcą Państwo odwoływać się do niego poza nią. Wewnętrzne salary * 12 miałoby w przeciwnym razie nazwę nadaną przez bazę danych, na której nie można polegać.

Zawsze należy nadawać aliasy obliczanym kolumnom — osoby prowadzące rozmowy zauważą odwołanie do wyrażenia bez aliasu i założenie nazwy kolumny, która może nie istnieć.

SELECT name, annual_salary
FROM (
  SELECT name, salary * 12 AS annual_salary
  FROM employees
) AS yearly
WHERE annual_salary > 100000;

Łączenie dwóch tabel pochodnych

Można łączyć ze sobą wiele tabel pochodnych. Tutaj porównujemy liczbę pracowników w każdym dziale z jego całkowitym funduszem płac, łącząc dwa wcześniej zagregowane podzapytania.

Każda tabela pochodna odpowiada na jedno pytanie pomocnicze; złączenie łączy je w końcowy raport. Takie etapowe myślenie jest dokładnie tym, co doceniają osoby prowadzące rozmowy na poziomie średniozaawansowanym.

SELECT c.dept_id, c.headcount, p.payroll
FROM (
  SELECT dept_id, COUNT(*) AS headcount
  FROM employees GROUP BY dept_id
) AS c
JOIN (
  SELECT dept_id, SUM(salary) AS payroll
  FROM employees GROUP BY dept_id
) AS p ON c.dept_id = p.dept_id;

Zakres: zapytanie zewnętrzne nie widzi wnętrza

Ważna zasada: zapytanie zewnętrzne może odwoływać się wyłącznie do kolumn, które tabela pochodna udostępnia na swojej liście SELECT. Kolumny używane tylko wewnątrz podzapytania są niewidoczne na zewnątrz.

Jeśli zapytanie wewnętrzne wybiera dept_id i avg_salary, to salary ani name nie są dostępne na zewnątrz — zostały wykorzystane przez agregację. Osoby prowadzące rozmowy sprawdzają znajomość tej granicy zakresu.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
) AS d;

Tabela pochodna a CTE

Tabela pochodna i Common Table Expression (CTE) często prowadzą do tego samego planu wykonania. Osoba prowadząca rozmowę może zapytać, dlaczego wybraliby Państwo jedno z tych rozwiązań:

  • Tabela pochodna: zapisana bezpośrednio w zapytaniu, odpowiednia do jednorazowego użycia.
  • CTE (WITH): nazwana na początku, czytelna i możliwa do ponownego użycia, jeśli jest przywoływana wielokrotnie.

W przypadku głęboko zagnieżdżonej logiki potok CTE czyta się od góry do dołu, a tabelę pochodną — od środka na zewnątrz.

WITH dept_avg AS (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
)
SELECT * FROM dept_avg WHERE avg_salary > 60000;

LATERAL / skorelowane podzapytanie w FROM

Zwykle podzapytanie w FROM nie może odwoływać się do wierszy zapytania zewnętrznego. LATERAL (Postgres) lub CROSS APPLY (SQL Server) znosi to ograniczenie, pozwalając tabeli pochodnej wykonywać się dla każdego wiersza zewnętrznego.

Umożliwia to wyszukiwanie najlepszych N wyników dla każdego wiersza. Znajomość istnienia tego słowa kluczowego sygnalizuje świadomość na poziomie seniorskim, nawet podczas rozmowy na poziomie średniozaawansowanym.

SELECT d.dept_name, top_emp.name, top_emp.salary
FROM departments d
CROSS JOIN LATERAL (
  SELECT name, salary FROM employees e
  WHERE e.dept_id = d.id
  ORDER BY salary DESC LIMIT 1
) AS top_emp;

Wypowiedź na rozmowę kwalifikacyjną

Jeśli padnie pytanie o podzapytania w klauzuli FROM, proszę powiedzieć: "Tabela pochodna to podzapytanie w FROM, które zwraca zbiór wyników używany przez zapytanie zewnętrzne jak tabela. Musi mieć alias, zapytanie zewnętrzne może odwoływać się tylko do wybranych przez nie kolumn, a takie rozwiązanie idealnie nadaje się do wstępnej agregacji przed złączeniem lub do agregowania wyniku agregacji."

Proszę dodać, że LATERAL pozwala mu odwoływać się do wierszy zewnętrznych, i w ten sposób omówili Państwo wszystkie aspekty.

Szybki test

Proszę wskazać stwierdzenie, które jest zawsze wymagane w przypadku podzapytania w klauzuli FROM.

Podsumowanie

Tabele pochodne — najważniejsze informacje:

  • Podzapytanie w FROM zwraca wirtualną tabelę — wiele wierszy i wiele kolumn.
  • Musi mieć alias; zapytanie zewnętrzne widzi tylko wybrane przez nią kolumny.
  • Należy używać go do wstępnej agregacji przed złączeniem, filtrowania po agregatach lub agregowania wyniku agregacji.
  • CTE to czytelna, nazwana alternatywa; LATERAL/CROSS APPLY pozwalają odwoływać się do wierszy zewnętrznych.

Następnie: podzapytania sprawdzające przynależność do zbioru z użyciem IN, ANY i ALL.

Często zadawane pytania

Czy lekcja „Podzapytania w klauzuli FROM (tabele pochodne)” jest bezpłatna?

Tak — pełny tekst „Podzapytania w klauzuli FROM (tabele pochodne)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Interview Prep, przejdź na CoddyKit PRO. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „Podzapytania w klauzuli FROM (tabele pochodne)”?

Opakowywanie zapytania jako tabeli wirtualnej oraz wyjaśnienie, dlaczego aliasy są obowiązkowe Ćwiczysz SQL Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Interview Prep?

Nie wymagamy żadnego doświadczenia. SQL Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Podzapytania w klauzuli FROM (tabele pochodne)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Interview Prep?

Tak. Każda lekcja SQL Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podzapytania skalarne w SELECT i WHERE
  2. Podzapytania w klauzuli FROM (tabele pochodne)
  3. Podzapytania IN, ANY i ALL
  4. Wydajność EXISTS a IN
← Powrót do SQL Interview Prep