Produkty, klienci i zamówienia. Ta sama baza, na której stoi dział SQL kursu.
SCHEMAT
produkt
id INTEGER PRIMARY KEY
nazwa TEXT NOT NULL
cena REAL NOT NULL
kategoria TEXT
sztuk INTEGER
klient
id INTEGER PRIMARY KEY
imie TEXT NOT NULL
miasto TEXT
zamowienie
id INTEGER PRIMARY KEY
klient_id INTEGER REFERENCES klient(id)
produkt_id INTEGER REFERENCES produkt(id)
ilosc INTEGER
kwota REAL
GOTOWE ZAPYTANIA
zapytanie
0/4000
Ćwiczenie zapytań SQL na gotowej bazie w przeglądarce
Baza relacyjna trzyma dane w tabelach, a tabela to wiersze i kolumny. Zapytanie opisuje, co chcesz dostać, a nie w jaki sposób ma to zostać znalezione. Podstawą jest SELECT (WYBIERZ), po którym wymieniasz kolumny, po FROM (Z) tabelę, a po WHERE (GDZIE) warunek ograniczający wiersze. ORDER BY porządkuje wynik, a LIMIT przycina go do zadanej liczby wierszy.
Kolejność wykonywania różni się od kolejności pisania i z tej różnicy bierze się najwięcej pomyłek. Najpierw działa FROM, potem WHERE, potem GROUP BY, potem HAVING, a dopiero na końcu SELECT i ORDER BY. Dlatego WHERE filtruje pojedyncze wiersze przed grupowaniem, a HAVING dopiero gotowe grupy, i dlatego aliasu nadanego w SELECT nie można użyć w WHERE.
Złączenie łączy dwie tabele po wspólnej kolumnie, zwykle po kluczu obcym. INNER JOIN zostawia wyłącznie pary pasujące po obu stronach, a LEFT JOIN zachowuje wszystkie wiersze tabeli po lewej i uzupełnia brakującą prawą stronę wartością NULL. Sam NULL nie jest ani zerem, ani pustym tekstem, więc nie porównuje się go znakiem równości, tylko zapisem IS NULL albo IS NOT NULL.
Silnik działa w całości w przeglądarce, więc żadne zapytanie nie wychodzi poza Twoją kartę i nie ma tu nic do zepsucia: polecenia INSERT, UPDATE i DELETE naprawdę zmieniają dane, a przycisk przywracania odtwarza bazę od zera. Silnikiem jest SQLite, a egzamin INF.03 stoi na MySQL. Składnia SELECT, WHERE, JOIN i GROUP BY jest ta sama, natomiast różnice w poleceniach tworzących tabele wypisuje osobna sekcja narzędzia.
Przykład: trzy najdroższe produkty z bazy sklep
1
Zaczynasz od najprostszej postaci: SELECT nazwa, cena FROM produkt.
2
Dokładasz porządek malejący po cenie: ORDER BY cena DESC.
3
Przycinasz wynik do trzech wierszy: LIMIT 3.
4
Całość to SELECT nazwa, cena FROM produkt ORDER BY cena DESC LIMIT 3. Buduj zapytanie właśnie tak, po jednym elemencie, i sprawdzaj wynik po każdym kroku.
Najczęstsze pytania
WHERE działa przed grupowaniem i filtruje pojedyncze wiersze, więc nie można w nim użyć funkcji agregującej. HAVING działa po grupowaniu i filtruje gotowe grupy, dlatego to w nim stawia się warunek na przykład na sumę albo liczebność grupy.
INNER JOIN zwraca tylko te pary wierszy, które pasują po obu stronach złączenia. LEFT JOIN zwraca wszystkie wiersze tabeli po lewej stronie, a tam gdzie nie ma pary, wstawia wartości NULL.
Tak. Plac zabaw uruchamia bazę w samej przeglądarce, bez logowania, instalacji i bez wysyłania czegokolwiek na serwer. Do nauki składni zapytań w zupełności to wystarcza.
COUNT(*) liczy wszystkie wiersze grupy. COUNT z nazwą kolumny pomija te wiersze, w których ta kolumna ma wartość NULL, więc wynik bywa mniejszy.