Technikum Klasa I 45 minut PP: II.3d | s. 344

Lekcja 44: Bazy danych - filtrowanie, kwerendy, wyszukiwanie

SQL: SELECT, WHERE, ORDER BY, JOIN, funkcje agregujace

📋 Podstawa programowa: II.3d
SELECTSQLWHEREbazy danychfiltrfiltrowanie danychkwerendy
00:00
Wprowadzenie
5 min
00:05
Teoria
15 min
00:20
Cwiczenia
15 min
00:35
Podsumowanie
10 min
📚

Teoria

Czym jest SQL?

SQL (Structured Query Language) to jezyk zapytan do komunikacji z relacyjnymi bazami danych. Pozwala na pobieranie, dodawanie, modyfikowanie i usuwanie danych. SQL jest standardem stosowanym przez wszystkie popularne systemy baz danych: MySQL, PostgreSQL, SQLite, MS SQL Server, Oracle.

W MS Access kwerendy mozna tworzyc wizualnie (Kreator kwerend) lub pisac bezposrednio w SQL (Widok SQL).

Podstawowa instrukcja SELECT

Instrukcja SELECT sluzy do pobierania danych z tabeli:

-- Pobierz wszystkie kolumny ze wszystkich rekordow
SELECT * FROM Uczniowie;

-- Pobierz tylko wybrane kolumny
SELECT Imie, Nazwisko, Klasa FROM Uczniowie;

-- Pobierz unikalne wartosci (bez powtorzen)
SELECT DISTINCT Miasto FROM Klienci;

Filtrowanie danych - WHERE

Klauzula WHERE pozwala filtrowac rekordy wedlug warunkow:

-- Uczniowie z klasy 1A
SELECT * FROM Uczniowie WHERE Klasa = '1A';

-- Produkty drozsze niz 100 zl
SELECT Nazwa, Cena FROM Produkty WHERE Cena > 100;

-- Zamowienia z okreslonych dat
SELECT * FROM Zamowienia
WHERE DataZamowienia BETWEEN '2025-01-01' AND '2025-06-30';

-- Klienci z Krakowa lub Warszawy
SELECT * FROM Klienci
WHERE Miasto = 'Krakow' OR Miasto = 'Warszawa';

-- To samo z operatorem IN
SELECT * FROM Klienci
WHERE Miasto IN ('Krakow', 'Warszawa', 'Wroclaw');

-- Wyszukiwanie tekstu (wzorzec)
SELECT * FROM Produkty WHERE Nazwa LIKE '%laptop%';
-- % = dowolny ciag znakow, _ = jeden znak
Operatory porownania w WHERE: = (rowne), <> (rozne), > (wieksze), < (mniejsze), >= (wieksze lub rowne), <= (mniejsze lub rowne), BETWEEN (zakres), LIKE (wzorzec), IN (lista wartosci), IS NULL (puste pole).

Sortowanie wynikow - ORDER BY

Klauzula ORDER BY sortuje wyniki zapytania:

-- Sortuj uczniow alfabetycznie wg nazwiska
SELECT * FROM Uczniowie ORDER BY Nazwisko ASC;

-- Sortuj produkty od najdrozszego
SELECT * FROM Produkty ORDER BY Cena DESC;

-- Sortowanie wielopoziomowe
SELECT * FROM Uczniowie
ORDER BY Klasa ASC, Nazwisko ASC, Imie ASC;

Laczenie tabel - JOIN

JOIN laczy dane z dwoch lub wiecej tabel na podstawie wspodlnych pol (klucz glowny - klucz obcy):

-- INNER JOIN - tylko pasujace rekordy z obu tabel
SELECT Zamowienia.ID_zamowienia, Klienci.Imie,
       Klienci.Nazwisko, Zamowienia.DataZamowienia
FROM Zamowienia
INNER JOIN Klienci ON Zamowienia.ID_klienta = Klienci.ID_klienta;

-- LEFT JOIN - wszystkie rekordy z lewej tabeli
-- + pasujace z prawej (lub NULL)
SELECT Klienci.Nazwisko, Zamowienia.ID_zamowienia
FROM Klienci
LEFT JOIN Zamowienia ON Klienci.ID_klienta = Zamowienia.ID_klienta;
-- Pokaze tez klientow BEZ zamowien (z NULL)

Typy JOIN:

  • INNER JOIN - zwraca tylko rekordy pasujace w obu tabelach (czesc wspolna)
  • LEFT JOIN - wszystkie rekordy z lewej tabeli + pasujace z prawej (lub NULL)
  • RIGHT JOIN - wszystkie rekordy z prawej tabeli + pasujace z lewej
  • FULL JOIN - wszystkie rekordy z obu tabel (z NULL gdzie brak dopasowania)

Funkcje agregujace

Funkcje agregujace obliczaja wartosci na podstawie grupy rekordow:

-- Liczba uczniow
SELECT COUNT(*) AS LiczbaUczniow FROM Uczniowie;

-- Srednia cena produktow
SELECT AVG(Cena) AS SredniaCena FROM Produkty;

-- Suma sprzedazy
SELECT SUM(Kwota) AS LacznaSprzedaz FROM Zamowienia;

-- Najdrozszy i najtanszy produkt
SELECT MIN(Cena) AS Najtanszy, MAX(Cena) AS Najdrozszy
FROM Produkty;

Grupowanie - GROUP BY

GROUP BY grupuje rekordy i pozwala stosowac funkcje agregujace dla kazdej grupy:

-- Liczba uczniow w kazdej klasie
SELECT Klasa, COUNT(*) AS LiczbaUczniow
FROM Uczniowie
GROUP BY Klasa;

-- Suma sprzedazy w kazdym miesiacu
SELECT MONTH(DataZamowienia) AS Miesiac,
       SUM(Kwota) AS Sprzedaz
FROM Zamowienia
GROUP BY MONTH(DataZamowienia);

-- Filtrowanie grup - HAVING (jak WHERE, ale dla grup)
SELECT Kategoria, AVG(Cena) AS SredniaCena
FROM Produkty
GROUP BY Kategoria
HAVING AVG(Cena) > 50;
Kolejnosc klauzul SQL: SELECT > FROM > JOIN > WHERE > GROUP BY > HAVING > ORDER BY > LIMIT. To stala kolejnosc - nie mozna jej zmieniac!
✏️

Zadania

Latwe

Zadanie 1: Podstawowe zapytania SELECT i WHERE

Masz tabele "Produkty" z polami: ID, Nazwa, Kategoria, Cena, IloscNaStanie. Napisz zapytania SQL: (a) Wyswietl wszystkie produkty, (b) Wyswietl nazwy i ceny produktow z kategorii "Elektronika", (c) Wyswietl produkty z cena od 50 do 200 zl posortowane wg ceny rosnaco, (d) Znajdz produkty ktorych nazwa zawiera slowo "Pro".

Pokaz rozwiazanie
a) Wszystkie produkty:
SELECT * FROM Produkty;

b) Elektronika - nazwy i ceny:
SELECT Nazwa, Cena
FROM Produkty
WHERE Kategoria = 'Elektronika';

c) Cena 50-200, sortowane rosnaco:
SELECT *
FROM Produkty
WHERE Cena BETWEEN 50 AND 200
ORDER BY Cena ASC;

d) Produkty z "Pro" w nazwie:
SELECT *
FROM Produkty
WHERE Nazwa LIKE '%Pro%';

Dodatkowe przyklady:
-- Produkty na wyczerpaniu (mniej niz 5 sztuk)
SELECT Nazwa, IloscNaStanie
FROM Produkty
WHERE IloscNaStanie < 5
ORDER BY IloscNaStanie ASC;

-- Produkty NIE z kategorii Elektronika
SELECT * FROM Produkty
WHERE Kategoria <> 'Elektronika';
Srednie

Zadanie 2: Funkcje agregujace i GROUP BY

Uzyj bazy danych "Sklep" z tabelami Produkty, Klienci, Zamowienia. Napisz zapytania: (a) Ile jest produktow w kazdej kategorii? (b) Jaka jest srednia cena produktow w kazdej kategorii? (c) Ktory klient zlozyl najwiecej zamowien? (d) Pokaz kategorie ze srednia cena powyzej 100 zl.

Pokaz rozwiazanie
a) Liczba produktow w kazdej kategorii:
SELECT Kategoria, COUNT(*) AS LiczbaProd
FROM Produkty
GROUP BY Kategoria
ORDER BY LiczbaProd DESC;

b) Srednia cena w kazdej kategorii:
SELECT Kategoria,
       ROUND(AVG(Cena), 2) AS SredniaCena,
       MIN(Cena) AS NajnizszaCena,
       MAX(Cena) AS NajwyzszaCena
FROM Produkty
GROUP BY Kategoria;

c) Klient z najwieksza liczba zamowien:
SELECT Klienci.Imie, Klienci.Nazwisko,
       COUNT(Zamowienia.ID_zamowienia) AS LiczbaZam
FROM Klienci
INNER JOIN Zamowienia
  ON Klienci.ID_klienta = Zamowienia.ID_klienta
GROUP BY Klienci.Imie, Klienci.Nazwisko
ORDER BY LiczbaZam DESC;

d) Kategorie ze srednia cena > 100 zl:
SELECT Kategoria, AVG(Cena) AS SredniaCena
FROM Produkty
GROUP BY Kategoria
HAVING AVG(Cena) > 100
ORDER BY SredniaCena DESC;
Trudne

Zadanie 3: JOIN i zlozone zapytania

Napisz zapytania laczace wiele tabel: (a) Wyswietl liste zamowien z imionami klientow i nazwami produktow (JOIN przez 3 tabele: Zamowienia, Klienci, PozycjeZamowienia, Produkty), (b) Znajdz klientow ktorzy NIE zlozyli zadnego zamowienia (LEFT JOIN + IS NULL), (c) Pokaz laczna wartosc zamowien kazdego klienta, posortowana malejaco.

Pokaz rozwiazanie
a) Lista zamowien ze szczegolami (4 tabele):
SELECT Z.ID_zamowienia,
       K.Imie, K.Nazwisko,
       P.Nazwa AS Produkt,
       PZ.Ilosc,
       PZ.CenaJednostkowa,
       PZ.Ilosc * PZ.CenaJednostkowa AS Wartosc,
       Z.DataZamowienia
FROM Zamowienia Z
INNER JOIN Klienci K
  ON Z.ID_klienta = K.ID_klienta
INNER JOIN PozycjeZamowienia PZ
  ON Z.ID_zamowienia = PZ.ID_zamowienia
INNER JOIN Produkty P
  ON PZ.ID_produktu = P.ID_produktu
ORDER BY Z.DataZamowienia DESC;

b) Klienci BEZ zamowien:
SELECT K.Imie, K.Nazwisko, K.Miasto
FROM Klienci K
LEFT JOIN Zamowienia Z
  ON K.ID_klienta = Z.ID_klienta
WHERE Z.ID_zamowienia IS NULL;
-- LEFT JOIN zachowuje wszystkich klientow
-- IS NULL filtruje tych bez dopasowania

c) Laczna wartosc zamowien klienta:
SELECT K.Imie, K.Nazwisko,
       COUNT(DISTINCT Z.ID_zamowienia) AS LiczbaZam,
       SUM(PZ.Ilosc * PZ.CenaJednostkowa) AS LacznaWartosc
FROM Klienci K
INNER JOIN Zamowienia Z
  ON K.ID_klienta = Z.ID_klienta
INNER JOIN PozycjeZamowienia PZ
  ON Z.ID_zamowienia = PZ.ID_zamowienia
GROUP BY K.ID_klienta, K.Imie, K.Nazwisko
ORDER BY LacznaWartosc DESC;
Trudne

Zadanie 4: Kwerendy w MS Access

W MS Access utworz kwerendy dla bazy "Sklep" uzywajac Kreatora kwerend (widok graficzny): (a) Kwerenda wybierajaca - produkty z kategorii "Elektronika" drozsze niz 500 zl, (b) Kwerenda parametryczna - uzytkownik podaje nazwe miasta, a kwerenda wyswietla klientow z tego miasta, (c) Kwerenda krzyzowa - suma zamowien wg klientow (wiersze) i miesiecy (kolumny).

Pokaz rozwiazanie
a) Kwerenda wybierajaca:
   1. Tworzenie > Projekt kwerendy
   2. Dodaj tabele Produkty
   3. Przeciagnij: Nazwa, Kategoria, Cena
   4. W wierszu Kryteria dla Kategoria: "Elektronika"
   5. W wierszu Kryteria dla Cena: >500
   6. Uruchom (!)
   SQL: SELECT Nazwa, Kategoria, Cena
        FROM Produkty
        WHERE Kategoria="Elektronika" AND Cena>500;

b) Kwerenda parametryczna:
   1. Projekt kwerendy > Dodaj Klienci
   2. Przeciagnij wszystkie pola
   3. W Kryteria dla Miasto wpisz:
      [Podaj nazwe miasta:]
   4. Uruchom - pojawi sie okno dialogowe
      z pytaniem o nazwe miasta
   SQL: SELECT * FROM Klienci
        WHERE Miasto=[Podaj nazwe miasta:];

c) Kwerenda krzyzowa:
   1. Tworzenie > Kreator kwerend
      > Kwerenda krzyzowa
   2. Tabela: Zamowienia (z JOINem do Klienci)
   3. Naglowki wierszy: Nazwisko klienta
   4. Naglowki kolumn: Miesiac (DataZamowienia)
   5. Wartosc: Suma kwot
   6. Wynik: tabela krzyzowa klient x miesiac
🎥

Materialy wideo

Łączenie tabel SQL, czyli jak używać instrukcji SQL JOIN (wszystkie metody)
nieinformatyk
Kurs SQL nowoczesne bazy danych: Podzapytania
strefakursow.pl
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 43: Bazy danych - pojecia Lekcja 45: Prezentacje multimedialne →