Lekcja 3. DQL — wyszukiwanie danych (SELECT)
PodstawowyPo co się tego uczymy?
SELECT to najczęściej używane polecenie w całym SQL-u — to nim "pytasz" bazę danych o informacje. Wyszukiwarka produktów w sklepie, lista ocen ucznia, ranking najlepiej sprzedających się produktów — wszystko to w tle wykonuje zapytanie SELECT.
Teoria
DQL (ang. Data Query Language) w praktyce sprowadza się do jednego polecenia: SELECT. Podstawowa struktura:
SELECT kolumny FROM tabela WHERE warunek ORDER BY kolumna LIMIT liczba;
- SELECT — które kolumny chcesz zobaczyć (albo * dla wszystkich).
- FROM — z jakiej tabeli.
- WHERE — warunek filtrujący wiersze (operatory: =, !=, <, >, <=, >=, AND, OR, BETWEEN, IN).
- LIKE — wyszukiwanie tekstu według wzorca: % zastępuje dowolną liczbę znaków, _ zastępuje dokładnie jeden znak. Np. '%gitara%' znajdzie "Gitara akustyczna" i "Struny do gitary".
- ORDER BY — sortowanie wyników (ASC — rosnąco, domyślnie; DESC — malejąco).
- LIMIT — ogranicza liczbę zwracanych wierszy.
Ważna rzecz, o której uczniowie zapominają: kolejność PISANIA zapytania (SELECT...FROM...WHERE) nie jest tą samą kolejnością, w jakiej baza je WYKONUJE. Zobacz diagram niżej.
Schemat
Przykład z życia
Wchodzisz na stronę sklepu internetowego, wpisujesz w wyszukiwarkę "gitara", ustawiasz filtr "cena do 500 zł" i sortowanie "od najtańszych". W tle serwer wykonuje dokładnie takie zapytanie SELECT, jakie widzisz w kodzie poniżej.
Kod (SQL)
-- Wszystkie produkty z kategorii "Instrumenty" tańsze niż 500 zł,
-- posortowane od najtańszego, tylko pierwsze 3 wyniki
SELECT nazwa, cena
FROM Produkty
WHERE kategoria = 'Instrumenty' AND cena < 500
ORDER BY cena ASC
LIMIT 3;
-- Produkty, których nazwa zawiera słowo "gitara" (wielkość liter nieważna)
SELECT nazwa, cena
FROM Produkty
WHERE nazwa LIKE '%gitara%';
Komentarz i wyjaśnienie kodu
Pierwsze zapytanie filtruje po dwóch warunkach naraz połączonych AND (obie muszą być spełnione), sortuje rosnąco po cenie i ogranicza wynik do 3 wierszy — dokładnie tak działa strona "3 najtańsze produkty w kategorii". Drugie zapytanie pokazuje LIKE ze znakiem % z obu stron wzorca — to znajdzie słowo "gitara" gdziekolwiek w nazwie produktu, nie tylko na początku.
Ćwiczenie samodzielne
Napisz zapytanie, które wybierze z tabeli Produkty nazwy i ceny wszystkich produktów droższych niż 100 zł, posortowane malejąco po cenie (od najdroższego).
Plac zabaw — wypróbuj online
Poniższy kod wykonuje się od razu w Twojej przeglądarce — nic nie trzeba instalować. Zmień kod i kliknij „Uruchom”.
Zadania do pracy własnej
Zadanie 1. SELECT w sklepie 2P
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Sklep muzyczny 2P (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Wyświetl wszystkich klientów.
- Wyświetl produkty, których stan magazynowy jest większy niż 15.
- Wyświetl zamówienia wraz z nazwiskiem klienta i nazwą produktu.
- Oblicz wartość każdego zamówienia: cena * ilość_sztuk.
- Policz liczbę zamówień każdego klienta.
- Policz łączną liczbę sprzedanych sztuk każdego produktu.
- Wyświetl produkty, których nigdy nie zamówiono.
- Wyświetl klientów z miejscowości Olsztyn.
- Pokaż najdroższy produkt.
- Pokaż zamówienia z 2025 roku.
Zadanie 2. SELECT w aptece
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Apteka Zdrowie (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Wyświetl wszystkie leki wraz z kategorią i producentem.
- Wyświetl leki, których stan magazynowy jest mniejszy niż 50.
- Policz liczbę leków w każdej kategorii.
- Oblicz średnią cenę leków według kategorii.
- Oblicz wartość magazynu każdego leku: cena * ilość_magazyn.
- Pokaż trzy najdroższe leki.
- Wyświetl sprzedaż: nazwa leku, ilość, data, wartość sprzedaży.
- Oblicz sumę sprzedanych sztuk dla każdego leku.
- Pokaż producentów, których leki były sprzedawane.
- Pokaż kategorie, w których średnia cena przekracza 20 zł.
Zadanie 3. SELECT w siłowni
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Siłownia FitZone (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Wyświetl zajęcia wraz z imieniem i nazwiskiem trenera.
- Wyświetl klientów z karnetem Premium.
- Policz liczbę zajęć prowadzonych przez każdego trenera.
- Policz zapisy na każde zajęcia.
- Wyświetl klientów zapisanych na Trening siłowy.
- Pokaż zajęcia rozpoczynające się po godzinie 17:00.
- Pokaż klientów, którzy zapisali się na więcej niż jedne zajęcia.
- Wyświetl raport: klient, typ karnetu, zajęcia, trener, data zapisu.
- Policz zapisy według dnia.
- Pokaż trenerów, którzy prowadzą zajęcia z co najmniej dwoma zapisami.
Typowe błędy
Bardzo częsty błąd to zapomnienie apostrofów wokół wartości tekstowych (WHERE kategoria = Instrumenty zamiast WHERE kategoria = 'Instrumenty') — SQL potraktuje to jako nazwę kolumny i zgłosi błąd. Drugi błąd to używanie LIKE bez znaków % (wtedy działa jak zwykłe porównanie =). Trzeci: próba napisania LIMIT przed ORDER BY — to zadziała odwrotnie niż zamierzone, bo LIMIT zawsze musi być na samym końcu zapytania.
Nawiązanie do egzaminu zawodowego
SELECT to trzon efektu "wyszukuje informacje w bazie danych przy użyciu języka SQL" (INF.03.4). W informatorze CKE pojawiają się dokładnie takie zadania: wybór dwóch kolumn z sortowaniem i LIMIT-em (zadanie 18) oraz użycie LIKE do wyszukiwania wzorca w tekście (zadanie 17) — oba typy zapytań znajdziesz w tej lekcji.