Powtórzenie wiadomości – zapytania SELECT, filtrowanie i grupowanie danych w SQL

Cel lekcji

Uczeń potrafi:

  • pobierać dane z tabel za pomocą SELECT;

  • stosować złożone warunki filtrowania z wykorzystaniem WHERE;

  • łączyć warunki za pomocą operatorów AND, OR i NOT;

  • wykorzystywać operatory IN, BETWEEN, LIKE oraz IS NULL;

  • sortować wyniki za pomocą ORDER BY;

  • stosować funkcje agregujące COUNT(), SUM(), AVG(), MIN() i MAX();

  • grupować dane za pomocą GROUP BY;

  • filtrować wyniki grupowania za pomocą HAVING;

  • łączyć warunki WHERE i HAVING w jednym zapytaniu;

  • analizować dane i tworzyć zapytania SQL na podstawie opisu problemu.

Uwaga: Wszystkie ćwiczenia wykonujemy na pojedynczych tabelach. Nie wykorzystujemy instrukcji JOIN.

1. Przygotowanie bazy danych

Podczas lekcji będziemy pracować na bazie danych przedstawiającej niewielki sklep internetowy. Baza zawiera informacje o klientach, produktach i zamówieniach.

Skrypt tworzący bazę danych

Uruchom poniższy skrypt w środowisku MySQL, np. w phpMyAdmin lub MySQL Workbench.

SQL

CREATE DATABASE sklep_powtorzenie;
USE sklep_powtorzenie;

CREATE TABLE klienci (
    id_klienta INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50),
    nazwisko VARCHAR(50),
    miasto VARCHAR(50),
    wiek INT,
    email VARCHAR(100)
);

CREATE TABLE produkty (
    id_produktu INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(100),
    kategoria VARCHAR(50),
    cena DECIMAL(10,2),
    stan_magazynowy INT
);

CREATE TABLE zamowienia (
    id_zamowienia INT AUTO_INCREMENT PRIMARY KEY,
    id_klienta INT,
    data_zamowienia DATE,
    status VARCHAR(30),
    wartosc DECIMAL(10,2),
    metoda_platnosci VARCHAR(30)
);

Wprowadzanie danych do tabel

Tabela klienci

INSERT INTO klienci (imie, nazwisko, miasto, wiek, email) VALUES
('Adam', 'Kowalski', 'Warszawa', 25, 'adam@example.com'),
('Anna', 'Nowak', 'Krakow', 32, 'anna@example.com'),
('Piotr', 'Wisniewski', 'Gdansk', 41, 'piotr@example.com'),
('Ewa', 'Wojcik', 'Warszawa', 28, 'ewa@example.com'),
('Tomasz', 'Kaminski', 'Poznan', 35, 'tomasz@example.com'),
('Katarzyna', 'Lewandowska', 'Krakow', 22, 'kasia@example.com'),
('Michal', 'Zielinski', 'Lublin', 46, 'michal@example.com'),
('Magdalena', 'Szymanska', 'Gdansk', 30, 'magda@example.com'),
('Pawel', 'Dabrowski', 'Warszawa', 19, 'pawel@example.com'),
('Joanna', 'Kozlowska', 'Poznan', 39, 'joanna@example.com'),
('Marcin', 'Jankowski', 'Lublin', 27, 'marcin@example.com'),
('Agnieszka', 'Mazur', 'Krakow', 51, 'agnieszka@example.com'),
('Krzysztof', 'Wozniak', 'Warszawa', 44, 'krzysztof@example.com'),
('Monika', 'Krawczyk', 'Gdansk', 24, 'monika@example.com'),
('Robert', 'Piotrowski', 'Poznan', 33, 'robert@example.com'),
('Natalia', 'Grabowska', 'Lublin', 29, 'natalia@example.com'),
('Damian', 'Nowicki', 'Krakow', 37, 'damian@example.com'),
('Aleksandra', 'Pawlak', 'Warszawa', 31, 'ola@example.com'),
('Rafal', 'Michalski', 'Gdansk', 48, 'rafal@example.com'),
('Julia', 'Krol', 'Poznan', 21, 'julia@example.com');

Tabela produkty

INSERT INTO produkty (nazwa, kategoria, cena, stan_magazynowy) VALUES
('Laptop Lenovo', 'Komputery', 3500.00, 12),
('Laptop Dell', 'Komputery', 4200.00, 8),
('Komputer HP', 'Komputery', 3100.00, 5),
('Smartfon Samsung', 'Smartfony', 2800.00, 20),
('Smartfon Xiaomi', 'Smartfony', 1900.00, 15),
('iPhone 15', 'Smartfony', 4500.00, 7),
('Mysz Logitech', 'Akcesoria', 120.00, 50),
('Klawiatura mechaniczna', 'Akcesoria', 350.00, 25),
('Monitor 27 cali', 'Akcesoria', 1100.00, 18),
('Sluchawki gamingowe', 'Gaming', 280.00, 30),
('Konsola Xbox', 'Gaming', 2200.00, 10),
('Konsola PlayStation', 'Gaming', 2500.00, 6),
('Ekspres do kawy', 'AGD', 1600.00, 9),
('Odkurzacz', 'AGD', 850.00, 14),
('Glosnik Bluetooth', 'Akcesoria', 450.00, 0),
('Tablet Samsung', 'Komputery', 1800.00, 11),
('Smartwatch Apple', 'Smartfony', 1700.00, 4),
('Mikrofon USB', 'Akcesoria', 390.00, 22),
('Kamera internetowa', 'Akcesoria', 250.00, 35),
('Fotel gamingowy', 'Gaming', 950.00, 3),
('Drukarka HP', 'Komputery', 750.00, 16),
('Router TP-Link', 'Akcesoria', 320.00, 19),
('Czajnik elektryczny', 'AGD', 180.00, 40),
('Blender Bosch', 'AGD', 420.00, 13),
('Monitor Samsung', 'Akcesoria', 1450.00, 0);

Tabela zamowienia

INSERT INTO zamowienia
(id_klienta, data_zamowienia, status, wartosc, metoda_platnosci) VALUES
(1, '2026-01-10', 'zrealizowane', 3620.00, 'karta'),
(2, '2026-01-15', 'zrealizowane', 3150.00, 'przelew'),
(3, '2026-01-20', 'wyslane', 6400.00, 'karta'),
(1, '2026-02-05', 'zrealizowane', 3920.00, 'blik'),
(4, '2026-02-10', 'anulowane', 4500.00, 'karta'),
(5, '2026-02-15', 'zrealizowane', 2760.00, 'gotowka'),
(6, '2026-02-20', 'wyslane', 3800.00, 'przelew'),
(7, '2026-03-01', 'zrealizowane', 2780.00, 'karta'),
(8, '2026-03-05', 'zrealizowane', 2450.00, 'blik'),
(9, '2026-03-10', 'oczekujace', 2800.00, 'przelew'),
(10, '2026-03-15', 'zrealizowane', 4600.00, 'karta'),
(2, '2026-03-20', 'wyslane', 2260.00, 'blik'),
(3, '2026-04-01', 'zrealizowane', 6400.00, 'przelew'),
(5, '2026-04-05', 'anulowane', 4500.00, 'karta'),
(11, '2026-04-10', 'zrealizowane', 630.00, 'gotowka'),
(12, '2026-04-15', 'oczekujace', 1700.00, 'przelew'),
(4, '2026-04-20', 'zrealizowane', 5300.00, 'karta'),
(6, '2026-05-01', 'zrealizowane', 3040.00, 'blik'),
(7, '2026-05-05', 'wyslane', 3060.00, 'przelew'),
(8, '2026-05-10', 'zrealizowane', 1950.00, 'gotowka'),
(1, '2026-05-15', 'zrealizowane', 5200.00, 'karta'),
(9, '2026-05-20', 'anulowane', 3500.00, 'blik'),
(10, '2026-06-01', 'zrealizowane', 4200.00, 'przelew'),
(11, '2026-06-05', 'wyslane', 1850.00, 'karta'),
(12, '2026-06-10', 'zrealizowane', 2750.00, 'blik'),
(3, '2026-06-15', 'zrealizowane', 5800.00, 'karta'),
(4, '2026-06-20', 'oczekujace', 1250.00, 'gotowka'),
(5, '2026-07-01', 'zrealizowane', 3400.00, 'przelew'),
(6, '2026-07-05', 'zrealizowane', 2200.00, 'karta'),
(7, '2026-07-10', 'wyslane', 4100.00, 'blik'),
(8, '2026-07-15', 'zrealizowane', 1800.00, 'gotowka'),
(9, '2026-07-20', 'zrealizowane', 3900.00, 'przelew'),
(10, '2026-08-01', 'anulowane', 2700.00, 'karta'),
(11, '2026-08-05', 'zrealizowane', 5200.00, 'blik'),
(12, '2026-08-10', 'wyslane', 3100.00, 'przelew'),
(1, '2026-08-15', 'zrealizowane', 2800.00, 'karta'),
(2, '2026-08-20', 'zrealizowane', 4600.00, 'blik'),
(3, '2026-09-01', 'zrealizowane', 3500.00, 'przelew'),
(4, '2026-09-05', 'wyslane', 2400.00, 'karta'),
(5, '2026-09-10', 'zrealizowane', 1800.00, 'gotowka'),
(6, '2026-09-15', 'zrealizowane', 5700.00, 'blik');

Ćwiczenie 1

Wyświetl nazwy, ceny i stany magazynowe produktów, których cena jest większa niż 1000 zł, ale mniejsza niż 4000 zł, a stan magazynowy jest większy niż 5 sztuk. Wyniki posortuj malejąco według ceny.

Ćwiczenie 2

Wyświetl imiona, nazwiska, miasta i wiek klientów, którzy mieszkają w Warszawie lub Krakowie, mają więcej niż 25 lat, ale nie więcej niż 40 lat. Wyniki posortuj alfabetycznie według nazwiska.

Ćwiczenie 3

Wyświetl nazwy produktów, których cena jest niższa niż 500 zł lub stan magazynowy wynosi 0. Uwzględnij jednak tylko produkty, których nazwa zawiera słowo „gaming” lub „Bluetooth”. Wyniki posortuj rosnąco według ceny.

Ćwiczenie 4

Wyświetl wszystkie informacje o zamówieniach złożonych w okresie od 1 lutego do 30 czerwca 2026 roku, których status nie jest równy „anulowane” ani „oczekujace”. Uwzględnij tylko zamówienia o wartości większej niż 2000 zł. Wyniki posortuj od najnowszego zamówienia.

Ćwiczenie 5

Dla każdej kategorii produktów wyświetl jej nazwę oraz liczbę produktów. Uwzględnij tylko produkty, których stan magazynowy jest większy od 0. Wyniki posortuj malejąco według liczby produktów.

Ćwiczenie 6

Dla każdej kategorii produktów oblicz średnią cenę produktów. Wyświetl tylko te kategorie, w których średnia cena jest większa niż 1000 zł. Wyniki posortuj malejąco według średniej ceny.

Ćwiczenie 7

Wyświetl liczbę zamówień złożonych przez każdego klienta. Uwzględnij tylko zamówienia o statusie „zrealizowane”. Wyświetl identyfikator klienta oraz liczbę zamówień. Pokaż tylko tych klientów, którzy mają co najmniej 2 zrealizowane zamówienia.

Ćwiczenie 8

Dla każdego klienta oblicz łączną wartość jego zrealizowanych zamówień. Wyświetl identyfikator klienta i sumę wartości zamówień. Pokaż tylko tych klientów, których łączna wartość zakupów przekroczyła 5000 zł. Wyniki posortuj malejąco według sumy wartości.

Ćwiczenie 9

Dla każdego klienta oblicz łączną wartość jego zamówień.

Uwzględnij wyłącznie zamówienia z okresu od 1 stycznia do 31 marca 2026 roku, których status to „zrealizowane” lub „wyslane”.

Wyświetl identyfikator klienta, liczbę zamówień oraz łączną wartość zamówień. Pokaż tylko tych klientów, którzy złożyli co najmniej 2 zamówienia, a ich łączna wartość przekroczyła 5000 zł. Wyniki posortuj malejąco według wartości zakupów.

Ćwiczenie 10

Dla każdej kategorii produktów oblicz średnią cenę, minimalną cenę, maksymalną cenę oraz liczbę produktów.

Uwzględnij tylko produkty, których cena jest wyższa niż 500 zł, a stan magazynowy jest większy niż 0.

Wyświetl tylko te kategorie, w których średnia cena przekracza 1000 zł, a liczba produktów wynosi co najmniej 2. Wyniki posortuj malejąco według średniej ceny.

Ćwiczenie 11

Dla każdego klienta oblicz liczbę zamówień, średnią wartość zamówienia oraz łączną wartość zamówień.

Uwzględnij tylko zamówienia z okresu od 1 kwietnia do 30 września 2026 roku, których status to „zrealizowane” lub „wyslane”, a wartość zamówienia jest większa niż 2000 zł.

Wyświetl tylko tych klientów, którzy złożyli co najmniej 2 takie zamówienia, a ich średnia wartość zamówienia przekracza 3000 zł. Wyniki posortuj malejąco według łącznej wartości zamówień.

Ćwiczenie 12

Przygotuj zestawienie sprzedaży produktów z podziałem na kategorie.

Uwzględnij wyłącznie produkty, których cena jest większa niż 200 zł i mniejsza niż 4000 zł, a stan magazynowy jest większy niż 0.

Dla każdej kategorii wyświetl:

  • nazwę kategorii;

  • liczbę różnych produktów;

  • łączną wartość cen produktów;

  • średnią cenę;

  • najtańszy produkt;

  • najdroższy produkt.

Wyniki ogranicz do kategorii, w których:

  • liczba produktów wynosi co najmniej 3;

  • średnia cena przekracza 500 zł;

  • łączna wartość cen produktów przekracza 3000 zł.

Wyniki posortuj malejąco według łącznej wartości cen produktów.

5. Zadanie podsumowujące

Wybierz jedną tabelę z bazy danych i przygotuj własne zapytanie SQL, które będzie analizowało zawarte w niej informacje.

Zapytanie musi wykorzystywać:

  • co najmniej trzy warunki w WHERE;

  • operatory logiczne AND oraz OR;

  • minimum dwie funkcje agregujące;

  • GROUP BY;

  • co najmniej dwa warunki w HAVING;

  • sortowanie wyników za pomocą ORDER BY.

Zapytanie nie może wykorzystywać instrukcji JOIN.

Po wykonaniu zadania krótko opisz, jakie informacje można odczytać z otrzymanego wyniku.

https://drive.google.com/file/d/1YWyhp1S-5_t5MEncBltEX1iyrI2ZmY8_/view?usp=sharing