SQL: SELECT, WHERE, ORDER BY, JOIN, funkcje agregujace
ð Podstawa programowa: II.3dSQL (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).
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;
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
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;
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)
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;
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;
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".
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';
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.
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;
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.
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;
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).
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