| Nr | Klauzula | Opis | Wymagana? |
|---|---|---|---|
| 1 | SELECT | Które kolumny / wyrażenia zwrócić | TAK |
| 2 | FROM | Z której tabeli (lub podzapytania) | TAK* |
| 3 | WHERE | Filtrowanie wierszy (przed grupowaniem) | NIE |
| 4 | GROUP BY | Grupowanie wierszy | NIE |
| 5 | HAVING | Filtrowanie grup (po grupowaniu) | NIE |
| 6 | ORDER BY | Sortowanie wyników | NIE |
| 7 | LIMIT | Ograniczenie liczby wierszy | NIE |
-- 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;
-- 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;
-- 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;
OFFSET = (strona - 1) * rozmiar_strony
-- 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!
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!
Które z poniższych jest poprawną kolejnością klauzul w zapytaniu SELECT?
Zapytanie: SELECT * FROM produkty ORDER BY id LIMIT 5 OFFSET 10; — które rekordy zwróci?
Napisz zapytanie zwracające 5 najdroższych produktów z kategorii 'Sport' (posortowanych od najdroższego):
ORDER BY col ASC = rosnąco (domyślne), DESC = malejącoLIMIT n OFFSET m — pomiń m rekordów i pobierz nOFFSET = (strona - 1) * rozmiar_strony