Podstawowe komendy SQL: ściąga z przykładami dla analityka danych

Szukasz listy, na której podstawowe komendy SQL są wytłumaczone po ludzku? Na start nie potrzebujesz 50 komend. Analityk w pracy używa kilku i codziennie składa je w podobne zapytania.

W tej ściądze pokazuję je w kolejności, w jakiej piszesz zapytanie: od SELECT do JOIN. Wszystkie przykłady działają na jednym małym zbiorze danych sklepu, więc widzisz, co każda kolejna komenda dokłada do poprzedniej. Na końcu znajdziesz komendy, których analityk prawie nie używa, i błąd, na którym na początku potyka się sporo osób.

Zapytania SQL: przykłady na danych małego sklepu

Mamy dwie tabele, jak w małym sklepie internetowym: 9 zamówień z lutego, marca i kwietnia 2026 i 5 klientów.

  • zamowienia: id_zamowienia, id_klienta, data_zamowienia, produkt, kategoria, kwota. Jeden wiersz to jedno zamówienie.
  • klienci: id_klienta, imie, miasto. Jeden wiersz to jeden klient.

W pracy wygląda to bardzo podobnie. Jedna tabela zapisuje, co się wydarzyło, a druga opisuje, kto to zrobił. Pytania typu „ile sprzedaliśmy w Krakowie w marcu” rozwiązujesz właśnie na takiej parze.

1. SELECT i FROM: co chcesz zobaczyć

SELECT mówi, które kolumny chcesz zobaczyć, a FROM, z której tabeli je wziąć. Od tej pary zaczyna się każde zapytanie, które napiszesz jako analityk.

SELECT produkt, kwota
FROM zamowienia;

SELECT * zwraca wszystkie kolumny. Przydaje się, gdy pierwszy raz oglądasz tabelę. W zapytaniu, które zostaje w raporcie, wypisuj kolumny po nazwie. Tabela z kilkudziesięcioma kolumnami ładuje się dłużej, a osoba, która przejmie Twój kod, nie zgadnie, których kolumn naprawdę potrzebujesz.

2. WHERE: filtrowanie wierszy (LIKE, IN, BETWEEN)

WHERE zostawia tylko wiersze, które spełniają warunek. Kilka warunków łączysz przez AND (wszystkie muszą być spełnione) albo OR (wystarczy jeden).

SELECT produkt, kwota
FROM zamowienia
WHERE kategoria = 'Elektronika' AND kwota > 150;

Trzy operatory, które w filtrach pojawiają się najczęściej:

  • LIKE szuka po wzorcu. Znak % oznacza dowolny ciąg znaków, więc 'Kubek%’ znajdzie każdy produkt, który zaczyna się od słowa Kubek.
  • IN zastępuje kilka warunków połączonych przez OR.
  • BETWEEN wybiera zakres i obejmuje obie granice.
SELECT produkt, kwota
FROM zamowienia
WHERE produkt LIKE 'Kubek%';
SELECT imie, miasto
FROM klienci
WHERE miasto IN ('Warszawa', 'Kraków');
SELECT id_zamowienia, data_zamowienia, kwota
FROM zamowienia
WHERE data_zamowienia BETWEEN '2026-03-01' AND '2026-03-31';

Uwaga: jeśli kolumna z datą zapisuje też godzinę, ten BETWEEN pominie zamówienia z 31 marca złożone w ciągu dnia, na przykład o 14:20. Bezpieczniej napisać wtedy data_zamowienia >= '2026-03-01' AND data_zamowienia < '2026-04-01'.

3. ORDER BY i LIMIT albo TOP: ranking w dwóch linijkach

ORDER BY sortuje wynik, domyślnie rosnąco. DESC odwraca kolejność. LIMIT ucina wynik do kilku pierwszych wierszy, więc razem robią ranking, na przykład trzy najdroższe zamówienia:

SELECT produkt, kwota
FROM zamowienia
ORDER BY kwota DESC
LIMIT 3;

LIMIT czy TOP?

To ta sama potrzeba, tylko różne bazy zapisują ją inaczej. LIMIT działa w PostgreSQL, MySQL i SQLite i stoi na końcu zapytania. SQL Server (także Azure SQL i hurtownia w Microsoft Fabric) używa TOP zaraz po SELECT:

SELECT TOP 3 produkt, kwota
FROM zamowienia
ORDER BY kwota DESC;

Bez ORDER BY ani LIMIT, ani TOP nie gwarantuje, które wiersze dostaniesz. Dokumentacja PostgreSQL mówi wprost, że wtedy dostajesz nieprzewidywalny podzbiór wierszy.

4. GROUP BY i funkcje agregujące: z listy zamówień robisz raport

Szefowa pyta, która kategoria zarabia najwięcej. GROUP BY składa wiersze w grupy, a funkcje agregujące liczą coś dla każdej grupy: COUNT liczy wiersze, SUM sumuje, AVG liczy średnią, MIN i MAX szukają skrajnych wartości.

SELECT kategoria,
       COUNT(*) AS liczba_zamowien,
       SUM(kwota) AS przychod,
       AVG(kwota) AS srednia_kwota
FROM zamowienia
GROUP BY kategoria;

Dziewięć zamówień zamienia się w trzy wiersze, po jednym na kategorię: Dom ma 4 zamówienia i 242 zł przychodu, Elektronika 3 zamówienia i 577 zł, Książki 2 zamówienia i 148 zł. Zasada na start: każda kolumna w SELECT, która nie siedzi w funkcji agregującej, musi trafić do GROUP BY.

HAVING: filtr po grupowaniu

WHERE filtruje pojedyncze zamówienia, zanim powstaną grupy. HAVING filtruje gotowe grupy, więc tylko tam napiszesz warunek na SUM albo COUNT.

SELECT kategoria, SUM(kwota) AS przychod
FROM zamowienia
GROUP BY kategoria
HAVING SUM(kwota) > 200;

W HAVING powtarzam SUM(kwota) zamiast aliasu przychod, bo SQL Server aliasu w tym miejscu nie przyjmie. Dlaczego, wyjaśniam niżej przy kolejności wykonywania zapytania.

5. JOIN: łączenie tabel klientów i zamówień

Pytanie „ile zarobiliśmy w każdym mieście” wymaga obu tabel: kwota jest w zamówieniach, a miasto w klientach. JOIN łączy je po wspólnej kolumnie id_klienta.

SELECT k.miasto, SUM(z.kwota) AS przychod
FROM zamowienia AS z
JOIN klienci AS k ON z.id_klienta = k.id_klienta
GROUP BY k.miasto
ORDER BY przychod DESC;

Litery z i k to aliasy tabel. Skracają zapis i od razu pokazują, z której tabeli pochodzi kolumna.

Samo JOIN (czyli INNER JOIN) zostawia tylko wiersze, które mają parę w obu tabelach. Klient bez zamówień w wyniku się nie pojawi. Żeby go znaleźć, użyj LEFT JOIN: zachowuje wszystkie wiersze z lewej tabeli, a tam, gdzie brakuje pary, wstawia NULL.

SELECT k.imie, k.miasto
FROM klienci AS k
LEFT JOIN zamowienia AS z ON k.id_klienta = z.id_klienta
WHERE z.id_zamowienia IS NULL;

Po każdym JOIN sprawdź liczbę wierszy. Jeśli nagle jest ich więcej niż zamówień, klucz w drugiej tabeli się powtarza i sumy wyjdą zawyżone.

JOIN dobrze ćwiczy się w SQL Murder Mystery z listy gier do nauki SQL: bez łączenia tabel nie znajdziesz w niej sprawcy.

INSERT, UPDATE, DELETE, DROP: komendy, których analityk prawie nie używa

Wiele list z podstawami SQL zaczyna od tworzenia tabel i dopisywania danych. To perspektywa programisty albo testera, który sam przygotowuje bazę. Analityk zwykle dostaje gotową hurtownię danych i ma w niej uprawnienia tylko do odczytu.

  • INSERT dodaje nowe wiersze.
  • UPDATE zmienia istniejące wiersze.
  • DELETE usuwa wiersze.
  • DROP usuwa całą tabelę razem z danymi.

Dane do hurtowni ładują procesy, za które odpowiadają inżynierowie danych. Gdyby analityk poprawiał kwoty ręcznie przez UPDATE, raport i system źródłowy pokazywałyby co innego, a następne ładowanie danych i tak nadpisałoby poprawkę. DELETE bez WHERE usuwa wszystkie wiersze tabeli i nie pyta o potwierdzenie.

Warto znać te komendy, żeby rozumieć cudzy kod i ćwiczyć na własnej bazie. W pracy przez większość dnia piszę SELECT-y, a zmiany w danych zostawiam inżynierom danych.

Kolejność wykonywania zapytania SQL: błąd, który robi wielu początkujących

Zapytanie piszesz w kolejności SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT. Baza czyta je inaczej. Według dokumentacji SQL Server logiczna kolejność wygląda tak:

  1. FROM i JOIN: skąd wziąć dane.
  2. WHERE: które wiersze zostają.
  3. GROUP BY: jak je pogrupować.
  4. HAVING: które grupy zostają.
  5. SELECT: które kolumny i obliczenia pokazać.
  6. ORDER BY: jak posortować wynik.
  7. LIMIT albo TOP: ile wierszy zwrócić.

Stąd błąd, który w SQL dla początkujących pojawia się najczęściej: alias z SELECT użyty w WHERE.

-- błąd w SQL Server, PostgreSQL i MySQL
SELECT produkt, kwota * 1.23 AS kwota_brutto
FROM zamowienia
WHERE kwota_brutto > 100;

W chwili, gdy baza sprawdza WHERE, kolumna kwota_brutto jeszcze nie istnieje, bo SELECT dzieje się dopiero w kroku piątym. W WHERE powtórz więc całe wyrażenie: WHERE kwota * 1.23 > 100. W ORDER BY alias zadziała, bo sortowanie przychodzi po SELECT. Niektóre bazy, na przykład SQLite, przepuszczają alias w WHERE, ale nie przyzwyczajaj się do tego.

Ta sama kolejność tłumaczy, dlaczego warunku na SUM nie wpiszesz do WHERE: w kroku drugim grup jeszcze nie ma.

Podsumowanie: podstawowe komendy SQL w jednym zapytaniu

Najważniejsze komendy z tej ściągi mieszczą się w jednym zapytaniu, które odpowiada na pytanie: które miasta przyniosły w marcu ponad 100 zł przychodu, od największego.

SELECT k.miasto, SUM(z.kwota) AS przychod
FROM zamowienia AS z
JOIN klienci AS k ON z.id_klienta = k.id_klienta
WHERE z.data_zamowienia >= '2026-03-01'
  AND z.data_zamowienia < '2026-04-01'
GROUP BY k.miasto
HAVING SUM(z.kwota) > 100
ORDER BY przychod DESC
LIMIT 3;

Podstawowe komendy SQL to kilka elementów jednego zapytania, które składasz zawsze w tej samej kolejności.

Sama zaczynałam od SQL i Excela, bez technicznego wykształcenia, i najwięcej dało mi pisanie, a nie czytanie. Przepisz każde zapytanie z tego wpisu z pamięci na następny dzień. Jeśli chcesz ćwiczyć regularnie, zaznaczaj kolejne dni w trackerze 100 dni nauki SQL. Ma 45 tematów od pierwszego SELECT do funkcji okienkowych.

Jeśli masz pytanie o którąś komendę, napisz w komentarzu.

Chcesz, żeby ta składnia została Ci w głowie?

Fiszki SQL: Podstawy to 80 kart o fundamentach SQL: komendach, filtrowaniu, pierwszych JOIN-ach i relacjach między tabelami. Ten wpis tłumaczy komendy, a fiszki pomagają je powtarzać, aż przestaniesz zaglądać do ściągi.

Zobacz Fiszki SQL →

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Koszyk