Zapisz się na nasz newsletter
Otrzymuj regularne aktualizacje, specjalne oferty i porady od ekspertów, które pomogą Ci osiągnąć więcej w krótszym czasie.
Ten artykuł to praktyczny przewodnik po pytaniach rekrutacyjnych z SQL: od prostych SELECT-ów po złożone CTE i funkcje okienkowe. Znajdziesz tu typowe błędy, pułapki i przykłady zapytań, które faktycznie pojawiają się na rozmowach. Nie chodzi o wkuwanie odpowiedzi, tylko o zrozumienie, jak rozwiązywać problemy tak, jak oczekuje tego rekruter.
Wprowadzenie
Poniżej znajdziesz zwięzłe kompendium, które przygotuje Cię na pytania rekrutacyjne SQL. Skupiam się na praktyce: co rekruter sprawdza, jakie błędy pojawiają się najczęściej i jak rozwiązywać typowe SQL zadania rekrutacyjne.
Artykuł obejmuje SELECT, JOIN, agregacje, podzapytania, CTE, funkcje okienkowe, transakcje i indeksy. To baza do rozmowa kwalifikacyjna SQL w środowiskach PostgreSQL, MySQL i SQL Server.
Podstawowe pytania teoretyczne
Najczęstsze pytania o SQL dotyczą fundamentów: różnica między kluczem głównym a unikalnym, rola kluczy obcych, ograniczenia NOT NULL/CHECK, semantyka NULL (trójwartościowa logika). Często pada: czym jest normalizacja (1NF–3NF), kiedy ją łamać na rzecz denormalizacji oraz co to ACID.
Rekruterzy pytają też o typy danych (NUMERIC vs FLOAT, CHAR vs VARCHAR, TIMESTAMP WITH/WITHOUT TIME ZONE), kolacje i porównania tekstów, strefy czasowe. Warto umieć wyjaśnić poziomy izolacji transakcji oraz różnice między widokiem, materialized view i tabelą tymczasową. To typowe pytania o SQL na poziomie mid.

MySQL — Jak zacząć? Darmowy e-book
Praktyczny przewodnik po świecie SQL. Poznaj typy danych, zapytania SELECT, JOIN, funkcje agregujące i nie tylko.
Praktyczne pytania o zapytania SELECT
Sprawdzana jest poprawność filtru i kolejność ewaluacji: FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT. Trzeba wiedzieć kiedy używać DISTINCT, a kiedy lepiej naprawić logikę JOIN. Ważne są też operacje na datach, COALESCE/NULLIF, CASE oraz bezpieczna paginacja.
Krótki przykład: top N rekordów per kategoria bez duplikatów, z obsługą NULL.
SQL1 2 3 4 5 6 7 8SELECT p.id, p.category, p.price FROM ( SELECT id, category, price, ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) AS rn FROM products ) p WHERE p.rn <= 3 ORDER BY p.category, p.price DESC;
JOIN, GROUP BY i agregacja danych
Znajomość INNER vs LEFT/RIGHT/FULL JOIN to podstawa. Częsta pułapka: nieświadome zwielokrotnienie wierszy przez JOIN 1:N, a potem ratowanie się DISTINCT. Lepiej zredukować dane wcześniej (np. agregować w podzapytaniu) albo użyć półzłączeń (EXISTS/NOT EXISTS). Różnicuj WHERE i HAVING: WHERE filtruje wiersze przed agregacją, HAVING filtruje grupy.
Przykład: liczba zamówień i średnia wartość per klient, bez dublowania przez linie pozycji.
SQL1 2 3 4 5 6 7 8 9SELECT c.id, COUNT(o.id) AS orders_cnt, AVG(o.amount) AS avg_amount FROM customers c LEFT JOIN ( SELECT id, customer_id, SUM(line_total) AS amount FROM orders o JOIN order_items oi ON oi.order_id = o.id GROUP BY o.id, o.customer_id ) o ON o.customer_id = c.id GROUP BY c.id;
Jeśli chcesz wejść głębiej w profile i plany wykonania, zajrzyj: Optymalizacja zapytań SQL.
Podzapytania i CTE
Pytania rekrutacyjne SQL często porównują podzapytania skorelowane z nieskorelowanymi i CTE. CTE czytelnie porządkuje złożoną logikę, ale nie zawsze jest materializowane ani szybsze od podzapytania w FROM. Rekurencyjne CTE użyjesz do hierarchii lub grafów.
Przykład: filtr klientów z ostatnim zamówieniem w 2025 roku.
SQL1 2 3 4 5 6 7 8 9WITH last_order AS ( SELECT o.customer_id, MAX(o.created_at) AS last_dt FROM orders o GROUP BY o.customer_id ) SELECT c.id, l.last_dt FROM customers c JOIN last_order l ON l.customer_id = c.id WHERE l.last_dt >= DATE '2025-01-01';
Więcej o technikach i pułapkach: Podzapytania i CTE w SQL.
Funkcje okienkowe
Funkcje okienkowe rozwiązują całą klasę SQL zadań rekrutacyjnych: deduplikacja (ROW_NUMBER), rankingi (RANK/DENSE_RANK), sumy kroczące (SUM() OVER), średnie ruchome (AVG() OVER ROWS BETWEEN). Wyróżnij PARTITION BY (podział) i ORDER BY (kolejność) oraz ramy okna.
Przykład: 7-dniowa średnia sprzedaży per region.
SQL1 2 3 4 5 6 7 8 9 10 11SELECT region, sales_date, SUM(amount) AS day_amount, AVG(SUM(amount)) OVER ( PARTITION BY region ORDER BY sales_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) AS ma7 FROM sales GROUP BY region, sales_date ORDER BY region, sales_date;
Uzupełnienie i niuanse per silnik: Funkcje okienkowe w SQL.
Transakcje, indeksy i wydajność
Na rozmowa kwalifikacyjna SQL padnie ACID, poziomy izolacji (Read Committed, Repeatable Read, Serializable) i zjawiska (dirty/non-repeatable/phantom reads). Znaj indeksy B-Tree, złożone (kolejność kolumn!), indeksy pokrywające i predykaty sargowalne (kolumna po lewej, brak funkcji uniemożliwiających użycie indeksu).
Przykład: bezpieczna aktualizacja w transakcji i indeks pod zapytanie filtrowo-sortujące.
SQL1 2 3 4 5 6 7 8BEGIN; UPDATE orders SET status = 'CLOSED' WHERE status = 'PAID' AND created_at < NOW() - INTERVAL '30 days'; COMMIT; CREATE INDEX idx_orders_status_created_at ON orders(status, created_at); -- Zapytanie: WHERE status='PAID' AND created_at>... ORDER BY created_at
Rozwiń temat indeksów: Indeksy w SQL: teoria i praktyka.
Różnice między SQL a NoSQL
Pytania o SQL i NoSQL celują w dopasowanie narzędzia do problemu. SQL to spójność, relacje, złożone zapytania ad-hoc, transakcje ACID. NoSQL często oferuje elastyczny schemat, skalowanie poziome, eventual consistency i szybkie kluczo-wartość/dokumenty, ale ogranicza joiny i agregacje ad-hoc.
Na rozmowa kwalifikacyjna SQL warto umieć wskazać trade-offy: raportowanie i OLTP zwykle lepiej w RDBMS; strumieniowe metryki na ogromnej skali lub dokumenty o zmiennym schemacie — bazy dokumentowe/kolumnowe. Częsty kompromis: system hybrydowy.
Typowe pułapki i błędy na rozmowie
- DISTINCT jako plaster zamiast poprawnego JOIN/GRUPPING. Skutkuje utratą informacji. Lepiej naprawić kardynalność wcześniej.
- NOT IN vs NOT EXISTS przy NULL. NOT IN może zwrócić 0 wierszy przez jeden NULL w podzbiorze; używaj NOT EXISTS.
- COUNT(kolumna) nie liczy NULL. Do wszystkich wierszy użyj COUNT(*). HAVING bez GROUP BY bywa antywzorcem.
- Paginação OFFSET duże wartości jest kosztowna; zastosuj keyset pagination (WHERE id > ... ORDER BY id).
- Funkcje na kolumnie w WHERE (np. LOWER(email)) psują użycie indeksu; normalizuj dane lub użyj indeksów funkcyjnych.
Przykładowe zadanie praktyczne
Zadanie: zwróć 3 najlepszych klientów 2025 per region wg sumy wydatków, z datą ostatniego zakupu. Tabele: customers(id, name, region), orders(id, customer_id, amount, created_at).
SQL1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20WITH y2025 AS ( SELECT o.customer_id, SUM(o.amount) AS total_amount, MAX(o.created_at) AS last_order_dt FROM orders o WHERE o.created_at >= DATE '2025-01-01' AND o.created_at < DATE '2026-01-01' GROUP BY o.customer_id ), ranked AS ( SELECT c.region, c.id, c.name, y.total_amount, y.last_order_dt, ROW_NUMBER() OVER (PARTITION BY c.region ORDER BY y.total_amount DESC, y.last_order_dt DESC) AS rn FROM y2025 y JOIN customers c ON c.id = y.customer_id ) SELECT region, id, name, total_amount, last_order_dt FROM ranked WHERE rn <= 3 ORDER BY region, total_amount DESC, last_order_dt DESC;
Jak przygotować się do rozmowy rekrutacyjnej z SQL
Ćwicz na realnych danych: odtwórz schemat z 3–5 tabel i rozwiązuj SQL zadania rekrutacyjne w limicie czasu. Naucz się czytać EXPLAIN/EXPLAIN ANALYZE. Porównaj różnice składni/limitacji między PostgreSQL, MySQL i SQL Server (CTE, funkcje okienkowe, typy czasu).
Plan: codziennie 30–45 min. Naprzemiennie SELECT/JOIN, agregacje, okna, CTE/rekurencja, indeksy/EXPLAIN. Spisz checklistę pułapek (NULL, NOT IN, DISTINCT). Materiały startowe: Jak uczyć się SQL.
Podsumowanie
Pytania rekrutacyjne SQL skupiają się na poprawnej logice zapytań, świadomych JOIN, agregacjach, oknach, transakcjach i indeksach. Ćwicz krótkie, czytelne rozwiązania, weryfikuj plany i pamiętaj o pułapkach z NULL, NOT EXISTS, paginacją.
Dobra rozmowa kwalifikacyjna SQL to nie popis trików, lecz klarowna analiza problemu i poprawna implementacja. Praktyka na małych, ale różnorodnych zadaniach najlepiej przygotowuje na pytania o SQL.

Kurs SkumajBazy — Czas w końcu nauczyć się SQLa
Kompleksowy kurs SQL dla programistów, analityków i wszystkich, którzy chcą efektywnie pracować z danymi. Od podstaw do zaawansowanych zapytań.



