INF.03 · Bazy danych i SQL
SELECT — jak zapytać bazę o to, czego szukasz
W sklepie internetowym zaznaczasz „do 500 zł” i „dostępne od ręki”, a lista produktów w ułamku sekundy robi się krótsza. Pod spodem działa jedno zapytanie SQL. Dziś nauczysz się je pisać i czytać, krok po kroku, na prawdziwej tabeli.
- około 25 minut
- SQL (MariaDB / MySQL)
- baza ćwiczeniowa: sklep2p
Po tej lekcji: napiszesz zapytanie, które wybiera kolumny, filtruje wiersze, sortuje wynik i ogranicza jego długość, a potem sprawdzisz, czy wynik zgadza się z poleceniem.
1 · Najpierw dane
Tabela to wiersze i kolumny
Każdy wiersz to jeden produkt, a każda kolumna to jedna jego cecha: nazwa, cena, stan magazynowy. Zanim o cokolwiek zapytasz, popatrz na dane tak, jak widzi je baza.
Pracujemy na tabeli produkty z bazy sklep2p, czyli z małego sklepu muzycznego. Plik z bazą pobierzesz w biurku. Pięć wierszy wystarczy, żeby zobaczyć każdy mechanizm.
| id_produktuINT | nazwaVARCHAR(50) | cenaDECIMAL(10,2) | stan_magazynowyINT |
|---|---|---|---|
| 1 | GITARA ELEKTRYCZNA | 2155,99 | 11 |
| 2 | GITARA KLASYCZNA | 1999,39 | 56 |
| 3 | KOSTKA GITAROWA | 2,00 | 32 |
| 4 | PIANINO ELEKTRYCZNE | 2144,90 | 17 |
| 5 | PODNÓŻEK DO GITARY | 19,50 | 18 |
2 · Zapytanie krok po kroku
Jedno zapytanie, pięć pytań
Zapytanie SELECT to odpowiedzi na kilka pytań, zadanych zawsze w tej samej kolejności. Kliknij kolejne linijki i zobacz, za co odpowiada każda z nich.
Co chcę zobaczyć?
Wybierasz kolumny, które trafią do wyniku. Zamiast nazw możesz wpisać *, wtedy dostaniesz wszystkie kolumny.
Wynik ma dwie kolumny: nazwa i cena. Reszta tabeli zostaje poza wynikiem.
Skąd biorę dane?
Wskazujesz tabelę. Baza musi wiedzieć, w którym miejscu ma szukać.
Baza zagląda do tabeli produkty.
Które wiersze pasują?
Warunek działa jak sito: wiersz, który go nie spełnia, odpada z wyniku. Z tabeli nic nie znika.
Zostają produkty tańsze niż 500 zł. W naszej tabeli to dwa z pięciu.
W jakiej kolejności?
ASC ustawia wyniki od najmniejszej wartości (rosnąco), DESC od największej (malejąco). Bez ORDER BY kolejność nie jest gwarantowana.
Najtańszy produkt jest pierwszy.
Ile wierszy najwyżej?
Odcina wynik po podanej liczbie wierszy. Używaj go razem z ORDER BY, bo inaczej nie wiesz, które wiersze zostały.
Wynik nie będzie dłuższy niż trzy wiersze.
Laboratorium · ćwiczenie w przeglądarce, do którego odsyłają rozgrzewki na końcu lekcji
3 · Teraz Ty
Złóż zapytanie i zobacz, co dzieje się z danymi
Zmieniaj ustawienia. Zapytanie zapisuje się samo, a tabela pokazuje los każdego wiersza: który trafia do wyniku, który odpada i dlaczego.
Spróbuj też zrobić coś źle, na przykład ustawić LIMIT bez sortowania albo odznaczyć wszystkie kolumny. Zobaczysz, jak baza reaguje.
Zauważ podział ról: WHERE wybiera wiersze, SELECT wybiera kolumny, ORDER BY ustawia kolejność, a LIMIT odcina koniec. Każde robi coś innego, dlatego można je łączyć.
4 · Przykład z wynikiem
Czytaj zapytanie jak zdanie
Przeczytaj to zapytanie od góry: „pokaż nazwę, cenę i stan produktów, ale tylko tych tańszych niż 500 zł, których zostało więcej niż 15 sztuk. Ułóż je od najtańszego i zostaw najwyżej trzy”. Tak właśnie się je czyta.
USE sklep2p;
SELECT nazwa, cena, stan_magazynowy
FROM produkty
WHERE cena < 500 AND stan_magazynowy > 15
ORDER BY cena ASC
LIMIT 3;
USE sklep2p;wybiera bazę. Robisz to raz na początku, potem wszystkie zapytania dotyczą tej bazy.ANDoznacza, że oba warunki muszą być prawdziwe jednocześnie. Z pięciu produktów spełniają je dwa.LIMIT 3pozwala na najwyżej trzy wiersze. Pasują tylko dwa, więc dostajesz dwa:LIMITniczego nie dopełnia.
| nazwa | cena | stan_magazynowy |
|---|---|---|
| KOSTKA GITAROWA | 2,00 | 32 |
| PODNÓŻEK DO GITARY | 19,50 | 18 |
5 · Tekst
Gdy nie znasz całej nazwy: LIKE
Znak = porównuje cały tekst. Często jednak znasz tylko kawałek, na przykład „coś z gitarą”. Do tego służy LIKE z dwoma znakami specjalnymi: % zastępuje dowolny ciąg znaków (także pusty), a _ zastępuje dokładnie jeden znak.
Wpisz własny wzorzec albo kliknij gotowy. W MariaDB przy zwykłych ustawieniach wielkość liter nie ma tu znaczenia, więc gitar znajdzie też GITARA.
LIKE 'gitara' bez znaku % działa prawie jak = 'gitara': szuka dokładnie takiego tekstu. Dopiero procent pozwala szukać fragmentu.
6 · Ściąga
Operatory, które warto mieć pod ręką
Na co dzień wystarczy kilkanaście zapisów. Wracaj do tej tabeli, kiedy układasz warunek do WHERE.
| Zapis | Co oznacza | Przykład |
|---|---|---|
= <> | równe, różne | miejscowosc = 'Olsztyn' |
< > <= >= | porównanie liczb, dat i czasu | cena >= 100 |
AND | wszystkie warunki muszą być prawdziwe | cena < 500 AND stan_magazynowy > 15 |
OR | wystarczy jeden prawdziwy warunek | miejscowosc = 'Olsztyn' OR miejscowosc = 'Bydgoszcz' |
BETWEEN 20 AND 2000 | zakres z obiema granicami włącznie | cena BETWEEN 20 AND 2000 |
LIKE 'A%' | tekst zaczynający się od A | nazwa LIKE 'A%' |
LIKE '_a%' | dowolny jeden znak, potem litera a | nazwisko LIKE '_a%' |
7 · Zanim się pomylisz
Sześć pomyłek, które zdarzają się najczęściej
Rozwiń każdą z nich. Zobaczysz, co zrobiła baza i jak to naprawić.
Kolumna, która nie istnieje
SELECT nazwa, kategoria
FROM produkty;Baza odpowie błędem: Unknown column 'kategoria' in 'field list'. W tej tabeli nie ma takiej kolumny.
SELECT * FROM produkty;Najpierw zerknij na nagłówki. Możesz też użyć DESCRIBE produkty;, które wypisze nazwy kolumn.
Tekst bez apostrofów
SELECT * FROM klienci
WHERE miejscowosc = Olsztyn;Błąd: Unknown column 'Olsztyn' in 'where clause'. Bez apostrofów baza uznaje, że Olsztyn to nazwa kolumny.
SELECT * FROM klienci
WHERE miejscowosc = 'Olsztyn';Tekst i daty zawsze idą w apostrofach. Liczby piszesz bez.
LIKE bez znaku %
SELECT nazwa FROM produkty
WHERE nazwa LIKE 'gitar';Zero wierszy. To nie błąd, tylko wynik: baza szuka dokładnie napisu „gitar”, a takiej nazwy nie ma.
SELECT nazwa FROM produkty
WHERE nazwa LIKE '%gitar%';Procent mówi: „tu może być cokolwiek”. Dostajesz cztery produkty związane z gitarą.
AND tam, gdzie miało być OR
SELECT * FROM klienci
WHERE miejscowosc = 'Olsztyn'
AND miejscowosc = 'Bydgoszcz';Zawsze pusty wynik, bo klient nie może mieszkać naraz w dwóch miastach.
SELECT * FROM klienci
WHERE miejscowosc = 'Olsztyn'
OR miejscowosc = 'Bydgoszcz';Chcesz klientów z jednego albo drugiego miasta, więc potrzebujesz OR.
LIMIT bez sortowania
SELECT nazwa, cena
FROM produkty
LIMIT 2;Dostajesz dwa wiersze, ale nie wiadomo które. Nie muszą to być ani najtańsze, ani najdroższe.
SELECT nazwa, cena
FROM produkty
ORDER BY cena DESC
LIMIT 2;Najpierw porządkujesz, potem odcinasz. Dwa najdroższe produkty to GITARA ELEKTRYCZNA i PIANINO ELEKTRYCZNE.
Zła kolejność klauzul
SELECT nazwa
WHERE cena < 500
FROM produkty;Błąd składni: You have an error in your SQL syntax. Baza oczekuje stałej kolejności.
SELECT nazwa
FROM produkty
WHERE cena < 500;Kolejność jest zawsze taka: SELECT, FROM, WHERE, ORDER BY, LIMIT.
8 · Sprawdź sam siebie
Zanim uznasz wynik za dobry
Brak komunikatu o błędzie nie znaczy jeszcze, że zapytanie jest poprawne. Na egzaminie INF.03 liczy się zgodność z poleceniem: nazwy tabel i kolumn, właściwy warunek, kolejność sortowania i sam wynik. Przejdź przez tę listę po każdym SELECT.
Podsumowanie
Co warto zapamiętać
SELECTczyta dane i niczego w tabeli nie zmienia.- Kolejność zapisu jest stała:
SELECT,FROM,WHERE,ORDER BY,LIMIT. SELECTwybiera kolumny, aWHEREwybiera wiersze.LIMITma sens dopiero razem zORDER BY.- Tekst i daty piszesz w apostrofach. Do szukania fragmentu służy
LIKEze znakiem%. - Po każdym zapytaniu sprawdź nagłówki, liczbę wierszy i kolejność.
Dalej na swoim koncie
Rozgrzewki, quiz i zadania są w biurku ucznia.
Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.
Zaloguj się →