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_produktuINTnazwaVARCHAR(50)cenaDECIMAL(10,2)stan_magazynowyINT
1GITARA ELEKTRYCZNA2155,9911
2GITARA KLASYCZNA1999,3956
3KOSTKA GITAROWA2,0032
4PIANINO ELEKTRYCZNE2144,9017
5PODNÓŻEK DO GITARY19,5018
Tabela produkty: 5 wierszy i 4 kolumny. Cena jest w złotych.

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.

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.

Ta interakcja wymaga włączonego JavaScriptu.

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.

zapytanie.sqlsql
USE sklep2p;

SELECT nazwa, cena, stan_magazynowy
FROM produkty
WHERE cena < 500 AND stan_magazynowy > 15
ORDER BY cena ASC
LIMIT 3;
  1. USE sklep2p; wybiera bazę. Robisz to raz na początku, potem wszystkie zapytania dotyczą tej bazy.
  2. AND oznacza, że oba warunki muszą być prawdziwe jednocześnie. Z pięciu produktów spełniają je dwa.
  3. LIMIT 3 pozwala na najwyżej trzy wiersze. Pasują tylko dwa, więc dostajesz dwa: LIMIT niczego nie dopełnia.
nazwacenastan_magazynowy
KOSTKA GITAROWA2,0032
PODNÓŻEK DO GITARY19,5018
Wynik zapytania: 2 wiersze.

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.

Ta interakcja wymaga włączonego JavaScriptu.

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.

ZapisCo oznaczaPrzykład
= <>równe, różnemiejscowosc = 'Olsztyn'
< > <= >=porównanie liczb, dat i czasucena >= 100
ANDwszystkie warunki muszą być prawdziwecena < 500 AND stan_magazynowy > 15
ORwystarczy jeden prawdziwy warunekmiejscowosc = 'Olsztyn' OR miejscowosc = 'Bydgoszcz'
BETWEEN 20 AND 2000zakres z obiema granicami włączniecena BETWEEN 20 AND 2000
LIKE 'A%'tekst zaczynający się od Anazwa LIKE 'A%'
LIKE '_a%'dowolny jeden znak, potem litera anazwisko 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
Tak nie
SELECT nazwa, kategoria
FROM produkty;

Baza odpowie błędem: Unknown column 'kategoria' in 'field list'. W tej tabeli nie ma takiej kolumny.

Tak
SELECT * FROM produkty;

Najpierw zerknij na nagłówki. Możesz też użyć DESCRIBE produkty;, które wypisze nazwy kolumn.

Tekst bez apostrofów
Tak nie
SELECT * FROM klienci
WHERE miejscowosc = Olsztyn;

Błąd: Unknown column 'Olsztyn' in 'where clause'. Bez apostrofów baza uznaje, że Olsztyn to nazwa kolumny.

Tak
SELECT * FROM klienci
WHERE miejscowosc = 'Olsztyn';

Tekst i daty zawsze idą w apostrofach. Liczby piszesz bez.

LIKE bez znaku %
Tak nie
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.

Tak
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
Tak nie
SELECT * FROM klienci
WHERE miejscowosc = 'Olsztyn'
  AND miejscowosc = 'Bydgoszcz';

Zawsze pusty wynik, bo klient nie może mieszkać naraz w dwóch miastach.

Tak
SELECT * FROM klienci
WHERE miejscowosc = 'Olsztyn'
   OR miejscowosc = 'Bydgoszcz';

Chcesz klientów z jednego albo drugiego miasta, więc potrzebujesz OR.

LIMIT bez sortowania
Tak nie
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.

Tak
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
Tak nie
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.

Tak
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ć

  1. SELECT czyta dane i niczego w tabeli nie zmienia.
  2. Kolejność zapisu jest stała: SELECT, FROM, WHERE, ORDER BY, LIMIT.
  3. SELECT wybiera kolumny, a WHERE wybiera wiersze.
  4. LIMIT ma sens dopiero razem z ORDER BY.
  5. Tekst i daty piszesz w apostrofach. Do szukania fragmentu służy LIKE ze znakiem %.
  6. 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ę →
Źródła i dalsza nauka