INF.03 Kurs 📖 Składnia
0%
Zaloguj Kup kurs · 49,99 zł
🗄️ Moduł 4 · SQL i bazy danych

SELECT od zera: WHERE, ORDER BY, LIMIT, LIKE

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ą:

SQL
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 wierszy
💡 Rymowanka na kolejność

Sąsiad Franek Wciąż Gra Hałaśliwie Od Lata – SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT.

Wybieranie kolumn

SQL
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;   -- obliczenia
📖 W tym przykładzie:SELECTFROMASDISTINCT
🎯 „Zapytanie wybierające jedynie…”

Sł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

SQL
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;
📖 W tym przykładzie:SELECTFROMWHEREAND

Operatory

OperatorZnaczeniePrzykład
=równerok = 2020
<> lub !=różnerok <> 2020
<, >, <=, >=porównaniacena <= 100
ANDi (oba warunki)cena < 50 AND punkty > 80
ORlub (choć jeden)rok = 2019 OR rok = 2020
NOTzaprzeczenieNOT gatunek_id = 2
BETWEEN a AND bw przedziale włączniecena BETWEEN 20 AND 60
IN (…)jedna z wartościgatunek_id IN (1, 3, 5)
LIKEdopasowanie tekstunazwa LIKE 'W%'
IS NULL / IS NOT NULLpusta wartośćopis IS NULL
⚠️ Teksty i daty w apostrofach, liczby bez

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

  • % – dowolny ciąg znaków (także pusty),
  • _ – dokładnie jeden znak.
SQL
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)
📖 W tym przykładzie:SELECTFROMWHERELIKE
🎯 Klasyk testu pisemnego

„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

SQL
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
📖 W tym przykładzie:SELECTFROMORDER BY
  • 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

SQL
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)
📖 W tym przykładzie:SELECTFROMORDER BYLIMIT
🎯 Zapytanie z czerwca 2025

„Zapytanie wybierające jedynie pola nazwa i punkty z pięciu pierwszych wierszy o najwyższej punktacji z tabeli gry”:

SQL
SELECT nazwa, punkty FROM gry ORDER BY punkty DESC LIMIT 5;
📖 W tym przykładzie:SELECTFROMORDER BYLIMIT

Funkcje tekstowe

Arkusz często podaje w tabeli pomocniczej funkcje, których możesz użyć (np. LEFT, RIGHT):

SQL
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;         -- zamiana
📖 W tym przykładzie:SELECTLEFTFROMWHEREAS

Funkcje liczbowe i daty

SQL
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';
📖 W tym przykładzie:SELECTROUNDFROMNOWWHEREANDBETWEEN

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:

Tekst
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:

SQL
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ędne
📖 W tym przykładzie:WHERE

Nazwy 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:

SQL
WHERE telefon IS NULL        -- ✔ wiersze bez telefonu
WHERE telefon IS NOT NULL    -- ✔ wiersze z telefonem
WHERE telefon = NULL         -- ✘ zawsze 0 wierszy
📖 W tym przykładzie:WHERE

Dlaczego 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łądKomunikat / objawPoprawka
WHERE nazwa = Wiedźmin#1054 Unknown column 'Wiedźmin'tekst w apostrofach: 'Wiedźmin'
ORDER BY po LIMIT#1064 syntax errorkolejność: 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 cenawynik 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’#1064tylko prosty apostrof '
WHERE miasto = 'Kraków' OR 'Gdańsk'zwraca dziwne wynikikażdy warunek pełny: miasto = 'Kraków' OR miasto = 'Gdańsk' (albo IN ('Kraków','Gdańsk'))
SELECT *, gdy arkusz chce wybranych pólbrak punktuwypisz kolumny jedna po drugiej
zła baza zaznaczona po lewej#1146 Table doesn't existkliknij właściwą bazę przed zakładką SQL

Ćwiczenia (baza sklep_gier)

✍️ Napisz zapytania
  1. Wybierz jedynie nazwę i cenę wszystkich gier.
  2. Wybierz nazwę i rok gier wydanych po 2018 roku, posortowane od najnowszej.
  3. Wybierz nazwy gier, których nazwa zaczyna się na literę „S”.
  4. Wybierz trzy najtańsze gry (nazwa, cena).
  5. Wybierz nazwę i pierwsze 50 znaków opisu gry o id = 4.
  6. Wybierz imię i nazwisko klientów z Krakowa lub Gdańska, alfabetycznie po nazwisku.
  7. Wybierz nazwy gier kosztujących od 30 do 80 zł (włącznie).
Pokaż rozwiązania
SQL
-- 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.

Podoba Ci się ta lekcja?

Tak wygląda cały kurs. Pełna wersja to 62 lekcji + 4 egzaminy próbne z rozwiązaniami.

Kup pełny kurs · 49,99 zł
Chcesz przejść kurs od nowa? Wyczyść zaznaczone lekcje i pasek postępu (dotyczy tylko tej przeglądarki).