Bazy Danych

Zapytania SQL przykłady: SELECT, JOIN i GROUP BY krok po kroku

Zapytania SQL przykłady najlepiej pokazać na jednej małej bazie, bo wtedy widać, co dokładnie robi każde polecenie. Poniżej przechodzimy od prostego SELECT przez filtrowanie, sortowanie i łączenie tabel po grupowanie i zmianę danych. To zestaw, który wystarcza do większości zadań na lekcjach oraz na egzaminie INF.03, a każdy przykład da się od razu przepisać i uruchomić w MySQL lub phpMyAdmin.

Baza przykładowa do wszystkich zapytań

Używamy dwóch prostych tabel: klienci i zamowienia. Kolumna id_klienta w zamówieniach to klucz obcy, o którym piszemy w tekście o kluczu głównym i obcym.

TabelaKolumny
klienciid_klienta, imie, miasto
zamowieniaid_zam, id_klienta, kwota, data_zam

Zapytania SQL przykłady: SELECT i WHERE

SELECT pobiera dane, a WHERE je filtruje.

-- wszystkie kolumny
SELECT * FROM klienci;

-- wybrane kolumny
SELECT imie, miasto FROM klienci;

-- tylko klienci z Krakowa
SELECT imie FROM klienci WHERE miasto = 'Kraków';

-- kwota od 100 do 500 zł
SELECT * FROM zamowienia WHERE kwota BETWEEN 100 AND 500;

-- imiona zaczynające się na A
SELECT imie FROM klienci WHERE imie LIKE 'A%';

-- kilka miast naraz
SELECT imie FROM klienci WHERE miasto IN ('Kraków', 'Gdańsk');

-- bez powtórzeń
SELECT DISTINCT miasto FROM klienci;

W LIKE znak % oznacza dowolny ciąg znaków, a _ jeden znak. Warunki można łączyć przez AND i OR. Przy mieszaniu ich używaj nawiasów, bo AND ma pierwszeństwo przed OR i bez nawiasów wynik łatwo może być inny, niż oczekujesz.

Sortowanie i ograniczanie wyników

-- najwyższe kwoty na górze
SELECT * FROM zamowienia ORDER BY kwota DESC;

-- najpierw po mieście, potem po imieniu
SELECT * FROM klienci ORDER BY miasto ASC, imie ASC;

-- trzy największe zamówienia
SELECT * FROM zamowienia ORDER BY kwota DESC LIMIT 3;

ASC oznacza rosnąco i jest domyślne, a DESC malejąco. LIMIT jest składnią MySQL, a w innych systemach odpowiednikiem jest na przykład TOP albo FETCH FIRST.

JOIN: łączenie tabel

To najważniejsza część SQL. Aby wyświetlić imię klienta obok zamówienia, trzeba połączyć tabele po kluczu.

-- tylko zamówienia, które mają klienta
SELECT k.imie, z.kwota
FROM zamowienia z
INNER JOIN klienci k ON z.id_klienta = k.id_klienta;

-- wszyscy klienci, także bez zamówień
SELECT k.imie, z.kwota
FROM klienci k
LEFT JOIN zamowienia z ON z.id_klienta = k.id_klienta;

-- klienci, którzy nic nie zamówili
SELECT k.imie
FROM klienci k
LEFT JOIN zamowienia z ON z.id_klienta = k.id_klienta
WHERE z.id_zam IS NULL;
ZłączenieCo zwraca
INNER JOINtylko wiersze z dopasowaniem w obu tabelach
LEFT JOINwszystkie wiersze z lewej tabeli, a z prawej NULL, gdy brak dopasowania
RIGHT JOINwszystkie wiersze z prawej tabeli

Różnica między INNER a LEFT JOIN to częste pytanie. Jeśli klient bez zamówień ma się pojawić w wyniku, potrzebny jest LEFT JOIN. Skąd w ogóle bierze się potrzeba dzielenia danych na tabele, wyjaśnia normalizacja baz danych.

Funkcje i GROUP BY: podsumowania

-- liczba zamówień i ich suma
SELECT COUNT(*), SUM(kwota) FROM zamowienia;

-- średnia kwota każdego klienta
SELECT id_klienta, AVG(kwota) AS srednia
FROM zamowienia
GROUP BY id_klienta;

-- klienci z sumą zamówień powyżej 1000 zł
SELECT id_klienta, SUM(kwota) AS suma
FROM zamowienia
GROUP BY id_klienta
HAVING SUM(kwota) > 1000;

-- największa kwota, użyta w podzapytaniu
SELECT * FROM zamowienia
WHERE kwota = (SELECT MAX(kwota) FROM zamowienia);

WHERE filtruje wiersze przed grupowaniem, a HAVING po grupowaniu. Dlatego warunku z SUM nie zapiszesz w WHERE. AS nadaje kolumnie alias, czyli czytelną nazwę w wyniku. Ostatni przykład to podzapytanie, czyli zapytanie w zapytaniu.

Dodawanie, zmiana i usuwanie danych

-- dodanie klienta
INSERT INTO klienci (imie, miasto) VALUES ('Anna', 'Kraków');

-- zmiana miasta jednego klienta
UPDATE klienci SET miasto = 'Gdańsk' WHERE id_klienta = 3;

-- usunięcie jednego zamówienia
DELETE FROM zamowienia WHERE id_zam = 10;

Uważaj na brak WHERE. UPDATE albo DELETE bez warunku zmienia lub usuwa wszystkie wiersze tabeli. Dobry nawyk to najpierw uruchomić SELECT z tym samym warunkiem, sprawdzić wynik i dopiero potem zmieniać dane.

Typowe błędy i kolejność zapisu

Klauzule trzeba pisać w ustalonej kolejności: SELECT, FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT. Zamiana miejsc to częsty powód błędu składni. Do innych częstych problemów należą:

  • Porównanie z NULL przez znak równości. Trzeba pisać IS NULL, a nie = NULL.
  • Brak warunku ON w JOIN. Wynik mnoży wtedy wszystkie wiersze obu tabel.
  • Kolumna niezgrupowana. Przy GROUP BY w SELECT powinny być tylko kolumny grupujące i funkcje agregujące.
  • Niejednoznaczna nazwa kolumny. Gdy dwie tabele mają tę samą kolumnę, poprzedź ją aliasem tabeli.

Jeśli chcesz zobaczyć, jak te zapytania wypadają na tle innych baz, zerknij na artykuł o bazach SQL i NoSQL.

Krótkie zadania z odpowiedziami

Spróbuj zapisać każde zapytanie samodzielnie, zanim spojrzysz na odpowiedź. Zadania są podobne do tych, które pojawiają się na lekcjach i w arkuszach egzaminacyjnych.

-- 1. Imiona klientów z Krakowa, alfabetycznie
SELECT imie FROM klienci
WHERE miasto = 'Kraków'
ORDER BY imie ASC;

-- 2. Suma zamówień w każdym mieście
SELECT k.miasto, SUM(z.kwota) AS suma
FROM klienci k
INNER JOIN zamowienia z ON z.id_klienta = k.id_klienta
GROUP BY k.miasto;

-- 3. Liczba zamówień z listopada 2026
SELECT COUNT(*) FROM zamowienia
WHERE data_zam BETWEEN '2026-11-01' AND '2026-11-30';

-- 4. Dodanie kolumny z numerem telefonu
ALTER TABLE klienci ADD telefon VARCHAR(15);

W zadaniu drugim imię klienta nie jest potrzebne, dlatego w SELECT zostaje tylko miasto i suma. Zadanie czwarte zmienia strukturę tabeli, a nie dane, dlatego używa ALTER TABLE, a nie UPDATE. To rozróżnienie często sprawia kłopot na egzaminie.

Najczęściej zadawane pytania o zapytania SQL

Jakie są podstawowe zapytania SQL?

SELECT do odczytu oraz INSERT, UPDATE i DELETE do zmiany danych. Do tego często dochodzą WHERE, ORDER BY, JOIN i GROUP BY.

Czym różni się INNER JOIN od LEFT JOIN?

INNER JOIN zwraca tylko wiersze z dopasowaniem w obu tabelach. LEFT JOIN zwraca wszystkie wiersze z lewej tabeli, nawet bez dopasowania.

Czym różni się WHERE od HAVING?

WHERE filtruje wiersze przed grupowaniem, a HAVING już pogrupowane wyniki, na przykład po sumie.

Co robi DISTINCT?

Usuwa powtarzające się wiersze z wyniku, więc lista miast pokaże każde miasto tylko raz.

Czy to wystarczy na egzamin INF.03?

To trzon, który trzeba znać. Sprawdź też zadania z poprzednich lat, bo często łączą kilka poleceń w jednym zadaniu.

Stan na listopad 2026 r.

Dodaj komentarz

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