SELECT to zapytanie, które pobiera dane z bazy. Na egzaminie co najmniej 2–3 z 4 zapytań to SELECT, a te same zapytania wykorzystujesz potem w skrypcie PHP. Jeśli opanujesz tę lekcję – masz pewne punkty.
Przykłady działają na bazie ćwiczeniowej sklep_gier (tabela gry: id, nazwa, opis, cena, punkty, rok, zdjecie, gatunek_id).
Schemat zapytania SELECT
Kolejność słów kluczowych jest zawsze taka sama – zapamiętaj ją:
SELECT kolumny -- CO pokazać
FROM tabela -- SKĄD
WHERE warunek -- KTÓRE wiersze
GROUP BY kolumna -- grupowanie (następna lekcja)
HAVING warunek_grupy -- warunek dla grup
ORDER BY kolumna ASC|DESC -- sortowanie
LIMIT liczba; -- ile wierszySąsiad Franek Wciąż Gra Hałaśliwie Od Lata – SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT.
Wybieranie kolumn
SELECT * FROM gry; -- wszystkie kolumny
SELECT nazwa, cena FROM gry; -- tylko wybrane kolumny
SELECT nazwa AS tytul, cena FROM gry; -- alias: kolumna nazywa się w wyniku "tytul"
SELECT DISTINCT rok FROM gry; -- bez powtórzeń
SELECT nazwa, cena * 1.23 AS brutto FROM gry; -- obliczeniaSłowo jedynie znaczy: tylko te kolumny, w tej kolejności, nic więcej. SELECT * w takim zadaniu = 0 punktów. Kolejność kolumn w SELECT przepisz dokładnie jak w treści.
WHERE – filtrowanie wierszy
SELECT nazwa, cena FROM gry WHERE id = 10;
SELECT nazwa FROM gry WHERE cena < 50;
SELECT nazwa FROM gry WHERE rok >= 2015 AND punkty > 90;
SELECT nazwa FROM gry WHERE gatunek_id = 1 OR gatunek_id = 3;
SELECT nazwa FROM gry WHERE NOT rok = 2020;Operatory
| Operator | Znaczenie | Przykład |
|---|---|---|
= | równe | rok = 2020 |
<> lub != | różne | rok <> 2020 |
<, >, <=, >= | porównania | cena <= 100 |
AND | i (oba warunki) | cena < 50 AND punkty > 80 |
OR | lub (choć jeden) | rok = 2019 OR rok = 2020 |
NOT | zaprzeczenie | NOT gatunek_id = 2 |
BETWEEN a AND b | w przedziale włącznie | cena BETWEEN 20 AND 60 |
IN (…) | jedna z wartości | gatunek_id IN (1, 3, 5) |
LIKE | dopasowanie tekstu | nazwa LIKE 'W%' |
IS NULL / IS NOT NULL | pusta wartość | opis IS NULL |
WHERE miasto = 'Kraków', WHERE data = '2025-06-10', ale WHERE cena = 49.99. Liczby dziesiętne zapisujesz z kropką, nie przecinkiem.
LIKE – wyszukiwanie wzorca
SELECT nazwa FROM gry WHERE nazwa LIKE 'W%'; -- zaczyna się na W
SELECT nazwa FROM gry WHERE nazwa LIKE '%a'; -- kończy się na a
SELECT nazwa FROM gry WHERE nazwa LIKE '%wojna%'; -- zawiera "wojna"
SELECT nazwa FROM gry WHERE nazwa LIKE '_a%'; -- druga litera to a
SELECT imie FROM klienci WHERE imie LIKE '%a' ; -- imiona żeńskie (kończą się na a)„Które zapytanie wybierze nazwiska zaczynające się od litery K?” → WHERE nazwisko LIKE 'K%'. Pułapki w odpowiedziach: '%K' (kończy się na K), = 'K%' (zwykłe porównanie, szuka dosłownie „K%”), LIKE 'K_' (dokładnie 2 znaki).
ORDER BY – sortowanie
SELECT nazwa, punkty FROM gry ORDER BY punkty; -- rosnąco (ASC – domyślne)
SELECT nazwa, punkty FROM gry ORDER BY punkty DESC; -- malejąco
SELECT nazwa, cena FROM gry ORDER BY cena DESC, nazwa ASC; -- najpierw po cenie, przy równej cenie alfabetycznie- ASC – ascending, rosnąco (A→Z, 1→9, stare→nowe daty),
- DESC – descending, malejąco (Z→A, 9→1, nowe→stare).
LIMIT – ograniczenie liczby wierszy
SELECT nazwa, punkty FROM gry ORDER BY punkty DESC LIMIT 5; -- TOP 5 najlepiej ocenianych
SELECT nazwa, cena FROM gry ORDER BY cena LIMIT 1; -- najtańsza gra
SELECT nazwa FROM gry LIMIT 10, 5; -- pomiń 10, pokaż 5 (stronicowanie)„Zapytanie wybierające jedynie pola nazwa i punkty z pięciu pierwszych wierszy o najwyższej punktacji z tabeli gry”:
SELECT nazwa, punkty FROM gry ORDER BY punkty DESC LIMIT 5;Funkcje tekstowe
Arkusz często podaje w tabeli pomocniczej funkcje, których możesz użyć (np. LEFT, RIGHT):
SELECT LEFT(opis, 100) FROM gry WHERE id = 10; -- pierwsze 100 znaków opisu
SELECT RIGHT(nazwa, 3) FROM gry; -- ostatnie 3 znaki
SELECT SUBSTRING(nazwa, 2, 4) FROM gry; -- od 2. znaku, 4 znaki
SELECT UPPER(nazwa), LOWER(nazwa) FROM gry; -- WIELKIE / małe litery
SELECT LENGTH(nazwa) FROM gry; -- długość (w bajtach; CHAR_LENGTH – w znakach)
SELECT CONCAT(imie, ' ', nazwisko) AS osoba FROM klienci; -- sklejanie
SELECT TRIM(' tekst '); -- usuwa spacje z brzegów
SELECT REPLACE(nazwa, ' ', '_') FROM gry; -- zamianaFunkcje liczbowe i daty
SELECT ROUND(cena), ROUND(cena, 1), CEIL(cena), FLOOR(cena) FROM gry;
SELECT NOW(), CURDATE(), CURTIME(); -- teraz, dziś, godzina
SELECT YEAR(data), MONTH(data), DAY(data) FROM zakupy;
SELECT * FROM zakupy WHERE MONTH(data) = 6 AND YEAR(data) = 2025;
SELECT DATEDIFF('2025-12-24', CURDATE()); -- ile dni do Wigilii
SELECT * FROM zakupy WHERE data BETWEEN '2025-01-01' AND '2025-03-31';Dlaczego tak, a nie inaczej – SQL bez tajemnic
Dlaczego słowa muszą iść w tej kolejności?
SQL czyta się jak zdanie po angielsku, a zdanie ma ustalony szyk:
SELECT co pokazać → „Wybierz nazwę i cenę
FROM skąd → z tabeli gry
WHERE które wiersze → tylko te tańsze niż 50
ORDER BY jak ułożyć → od najtańszej
LIMIT ile → i pokaż 3.”Możesz pominąć części, których nie potrzebujesz, ale nie możesz zamienić ich miejscami. SELECT … FROM gry LIMIT 3 ORDER BY cena to błąd #1064 – bo baza musi wiedzieć, jak posortować, zanim wybierze „pierwsze trzy”.
Dlaczego tekst w apostrofach, a liczba bez?
Baza musi odróżnić wartość od nazwy kolumny:
WHERE miasto = 'Kraków' -- 'Kraków' to tekst (wartość)
WHERE miasto = Kraków -- ✘ baza szuka KOLUMNY o nazwie Kraków → błąd #1054
WHERE cena = 50 -- liczba nie może być nazwą kolumny, więc apostrofy zbędneNazwy tabel i kolumn piszesz bez apostrofów. Jeśli mają spację lub polską literę (np. alias), bierzesz je w odwrotne apostrofy (znak z klawisza pod Esc) – nie w zwykłe.
Dlaczego = a nie ==?
W SQL jest tylko porównanie, nie ma przypisania w WHERE, więc wystarczy jeden znak =. „Różne od” to <> albo !=.
Dlaczego WHERE pole = NULL nic nie zwraca?
NULL znaczy „brak wartości / nie wiadomo”. Nie da się powiedzieć, że „nie wiadomo” równa się czemukolwiek – nawet innemu „nie wiadomo”. Dlatego:
WHERE telefon IS NULL -- ✔ wiersze bez telefonu
WHERE telefon IS NOT NULL -- ✔ wiersze z telefonem
WHERE telefon = NULL -- ✘ zawsze 0 wierszyDlaczego SELECT * jest wygodne, a na egzaminie złe?
* znaczy „wszystkie kolumny”. Gdy arkusz pisze „wybierające jedynie pola nazwa i cena”, SELECT * zwróci więcej kolumn i nie dostaniesz punktu, choć wynik „zawiera” to, co trzeba. Słowo „jedynie” = wypisz dokładnie te kolumny.
Dlaczego średnik na końcu?
Średnik oddziela zapytania od siebie. W phpMyAdmin przy jednym zapytaniu można go pominąć, ale gdy wkleisz cztery naraz – bez średników baza skleiłaby je w jedno. Zawsze go pisz, także w kwerendy.txt.
Najczęstsze błędy w SELECT
| Błąd | Komunikat / objaw | Poprawka |
|---|---|---|
WHERE nazwa = Wiedźmin | #1054 Unknown column 'Wiedźmin' | tekst w apostrofach: 'Wiedźmin' |
ORDER BY po LIMIT | #1064 syntax error | kolejność: WHERE → ORDER BY → LIMIT |
przecinek po ostatniej kolumnie: SELECT nazwa, cena, FROM | #1064 near 'FROM' | bez przecinka przed FROM |
brak przecinka między kolumnami: SELECT nazwa cena | wynik ma jedną kolumnę o nagłówku „cena” | MySQL potraktował cena jako alias – dodaj przecinek |
LIKE 'S' zamiast LIKE 'S%' | 0 wierszy | % = „dowolne znaki dalej” |
cudzysłowy z Worda ‘Kraków’ | #1064 | tylko prosty apostrof ' |
WHERE miasto = 'Kraków' OR 'Gdańsk' | zwraca dziwne wyniki | każdy warunek pełny: miasto = 'Kraków' OR miasto = 'Gdańsk' (albo IN ('Kraków','Gdańsk')) |
SELECT *, gdy arkusz chce wybranych pól | brak punktu | wypisz kolumny jedna po drugiej |
| zła baza zaznaczona po lewej | #1146 Table doesn't exist | kliknij właściwą bazę przed zakładką SQL |
Ćwiczenia (baza sklep_gier)
- Wybierz jedynie nazwę i cenę wszystkich gier.
- Wybierz nazwę i rok gier wydanych po 2018 roku, posortowane od najnowszej.
- Wybierz nazwy gier, których nazwa zaczyna się na literę „S”.
- Wybierz trzy najtańsze gry (nazwa, cena).
- Wybierz nazwę i pierwsze 50 znaków opisu gry o id = 4.
- Wybierz imię i nazwisko klientów z Krakowa lub Gdańska, alfabetycznie po nazwisku.
- Wybierz nazwy gier kosztujących od 30 do 80 zł (włącznie).
Pokaż rozwiązania
-- 1
SELECT nazwa, cena FROM gry;
-- 2
SELECT nazwa, rok FROM gry WHERE rok > 2018 ORDER BY rok DESC;
-- 3
SELECT nazwa FROM gry WHERE nazwa LIKE 'S%';
-- 4
SELECT nazwa, cena FROM gry ORDER BY cena ASC LIMIT 3;
-- 5
SELECT nazwa, LEFT(opis, 50) FROM gry WHERE id = 4;
-- 6
SELECT imie, nazwisko FROM klienci WHERE miasto = 'Kraków' OR miasto = 'Gdańsk' ORDER BY nazwisko;
-- lub: WHERE miasto IN ('Kraków', 'Gdańsk')
-- 7
SELECT nazwa FROM gry WHERE cena BETWEEN 30 AND 80;Sprawdź się
Zaznacz odpowiedzi i kliknij „Sprawdź wynik”. Przy każdej błędnej odpowiedzi zobaczysz, dlaczego jest zła i która jest poprawna.