🎯 Cele lekcji

📋

1. Kolejność klauzul SQL

Klauzule w zapytaniu SELECT muszą występować w ściśle określonej kolejności — naruszenie kolejności powoduje błąd składni.
NrKlauzulaOpisWymagana?
1SELECTKtóre kolumny / wyrażenia zwrócićTAK
2FROMZ której tabeli (lub podzapytania)TAK*
3WHEREFiltrowanie wierszy (przed grupowaniem)NIE
4GROUP BYGrupowanie wierszyNIE
5HAVINGFiltrowanie grup (po grupowaniu)NIE
6ORDER BYSortowanie wynikówNIE
7LIMITOgraniczenie liczby wierszyNIE
-- Pełne zapytanie ze wszystkimi klauzulami
SELECT kategoria, COUNT(*) AS liczba, AVG(cena) AS srednia
FROM produkty
WHERE aktywny = 1
GROUP BY kategoria
HAVING COUNT(*) > 5
ORDER BY srednia DESC
LIMIT 3;
↕️

2. ORDER BY — sortowanie

-- Sortowanie rosnące (domyślne = ASC)
SELECT nazwa, cena FROM produkty ORDER BY cena;
SELECT nazwa, cena FROM produkty ORDER BY cena ASC;

-- Sortowanie malejące (od największego)
SELECT nazwa, cena FROM produkty ORDER BY cena DESC;

-- Wielokolumnowe: najpierw kategoria A→Z, potem cena malejąco
SELECT nazwa, kategoria, cena
FROM produkty
ORDER BY kategoria ASC, cena DESC;

-- Sortowanie po aliasie lub numerze kolumny
SELECT nazwa, cena * 1.23 AS cena_brutto
FROM produkty
ORDER BY cena_brutto DESC;

-- NULL w sortowaniu — NULL trafia na początek (ASC) lub koniec (DESC) w MySQL
SELECT nazwa, opis FROM produkty ORDER BY opis IS NULL, opis;
📄

3. LIMIT i OFFSET — paginacja

-- Pierwsze 10 wyników
SELECT * FROM produkty LIMIT 10;

-- Pominięcie 20 rekordów i pobranie kolejnych 10 (strona 3)
SELECT * FROM produkty LIMIT 10 OFFSET 20;

-- Skróconaforma: LIMIT offset, count
SELECT * FROM produkty LIMIT 20, 10;  -- pomiń 20, pobierz 10

-- Paginacja — wzorzec obliczania OFFSET
-- Strona 1: LIMIT 10 OFFSET 0   (rekordy 1-10)
-- Strona 2: LIMIT 10 OFFSET 10  (rekordy 11-20)
-- Strona 3: LIMIT 10 OFFSET 20  (rekordy 21-30)
-- Formuła: OFFSET = (numer_strony - 1) * rozmiar_strony

-- TOP 5 najdroższych produktów ze Sport
SELECT nazwa, cena
FROM produkty
WHERE kategoria = 'Sport'
ORDER BY cena DESC
LIMIT 5;
Paginacja — podział wyników na strony. Przy dużych zbiorach danych LIMIT+OFFSET jest niezbędne. Formuła: OFFSET = (strona - 1) * rozmiar_strony
🔗

4. Operatory logiczne AND, OR, NOT

-- AND — oba warunki muszą być prawdziwe
SELECT * FROM produkty
WHERE kategoria = 'Elektronika' AND cena < 500;

-- OR — co najmniej jeden warunek musi być prawdziwy
SELECT * FROM produkty
WHERE kategoria = 'Sport' OR kategoria = 'Dom';
-- Równoważne (lepsze):
WHERE kategoria IN ('Sport', 'Dom')

-- NOT — negacja warunku
SELECT * FROM produkty
WHERE NOT kategoria = 'Elektronika';

-- Priorytety: NOT > AND > OR — używaj nawiasów!
SELECT * FROM produkty
WHERE (kategoria = 'Sport' OR kategoria = 'Dom') AND cena < 100;
-- Bez nawiasów: AND wiąże mocniej niż OR — inny wynik!
Priorytet operatorów: NOT jest silniejszy niż AND, który jest silniejszy niż OR. Zawsze używaj nawiasów przy mieszaniu AND z OR, żeby uniknąć nieoczekiwanych wyników!
✏️

Zadania interaktywne

Zadanie 1Ułóż klauzule w poprawnej kolejności

Które z poniższych jest poprawną kolejnością klauzul w zapytaniu SELECT?

  • FROM → WHERE → SELECT → ORDER BY → LIMIT
  • SELECT → FROM → WHERE → ORDER BY → LIMIT
  • SELECT → WHERE → FROM → ORDER BY → LIMIT
  • SELECT → FROM → ORDER BY → WHERE → LIMIT
Zadanie 2Quiz: LIMIT i OFFSET

Zapytanie: SELECT * FROM produkty ORDER BY id LIMIT 5 OFFSET 10; — które rekordy zwróci?

  • Rekordy 1–5 (pierwsze pięć)
  • Rekordy 6–10
  • Rekordy 11–15
  • Rekordy 10–15 (od 10-tego włącznie)
Zadanie 3Napisz zapytanie: top 5 najdroższych produktów

Napisz zapytanie zwracające 5 najdroższych produktów z kategorii 'Sport' (posortowanych od najdroższego):

📌 Zapamiętaj