Różnice między wybraną wersją a wersją aktualną.
Nowa wersja | Poprzednia wersja | ||
notatki:bazy_danych [2025/05/13 11:20] – utworzono administrator | notatki:bazy_danych [2025/05/16 17:25] (aktualna) – administrator | ||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | ====== | + | ====== MySQL: Wstęp projekt bazy Sklep ====== |
+ | |||
+ | Możesz podążać za tutorialem poprzez stronę: https:// | ||
W tym artykule wykorzystamy przykładową bazę danych sklepu internetowego z trzema tabelami: klienci, towary i zamówienia. Przedstawimy definicje tabel w SQL oraz dodamy po 10 przykładowych rekordów do każdej z nich. Następnie omówimy różne rodzaje zapytań na tych danych, w tym: | W tym artykule wykorzystamy przykładową bazę danych sklepu internetowego z trzema tabelami: klienci, towary i zamówienia. Przedstawimy definicje tabel w SQL oraz dodamy po 10 przykładowych rekordów do każdej z nich. Następnie omówimy różne rodzaje zapytań na tych danych, w tym: | ||
- | | + | * podstawowe zapytania SELECT z klauzulami WHERE, ORDER BY i LIMIT, |
- | + | | |
- | | + | |
- | + | | |
- | | + | |
- | + | | |
- | | + | |
- | + | ||
- | | + | |
- | + | ||
- | | + | |
Każdy rodzaj zapytania zostanie zilustrowany przykładowym kodem SQL działającym na naszej bazie. Na zakończenie artykułu zamieścimy krótkie podsumowanie omawianych zagadnień. | Każdy rodzaj zapytania zostanie zilustrowany przykładowym kodem SQL działającym na naszej bazie. Na zakończenie artykułu zamieścimy krótkie podsumowanie omawianych zagadnień. | ||
== Tabele i przykładowe dane == | == Tabele i przykładowe dane == | ||
- | Zacznijmy od zdefiniowania struktury bazy danych sklepu. Utworzymy trzy tabele: <code sql> CREATE TABLE klienci ( id_klienta INT PRIMARY KEY, imie VARCHAR(50), | + | Zacznijmy od zdefiniowania struktury bazy danych sklepu. Utworzymy trzy tabele: |
+ | <WRAP right 25%> | ||
+ | {{: | ||
+ | Po wykonaniu skryptu powinniśmy uzyskać coś takiego | ||
+ | </ | ||
+ | <code sql> | ||
+ | CREATE TABLE klienci ( | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ); | ||
CREATE TABLE towary ( | CREATE TABLE towary ( | ||
- | id_towaru INT PRIMARY KEY, | + | |
- | nazwa VARCHAR(100), | + | nazwa VARCHAR(100), |
- | kategoria VARCHAR(50), | + | kategoria VARCHAR(50), |
- | cena DECIMAL(10, | + | cena DECIMAL(10, |
); | ); | ||
CREATE TABLE zamowienia ( | CREATE TABLE zamowienia ( | ||
- | id_zamowienia INT PRIMARY KEY, | + | |
- | id_klienta INT, | + | id_klienta |
- | id_towaru INT, | + | id_towaru |
- | ilosc INT, | + | ilosc INT, |
- | data DATE | + | data |
+ | CONSTRAINT fk_zamowienia_klienci | ||
+ | FOREIGN KEY (id_klienta) | ||
+ | REFERENCES klienci(id_klienta) | ||
+ | ON UPDATE CASCADE | ||
+ | ON DELETE CASCADE, | ||
+ | CONSTRAINT fk_zamowienia_towary | ||
+ | FOREIGN KEY (id_towaru) | ||
+ | REFERENCES towary(id_towaru) | ||
+ | ON UPDATE CASCADE | ||
+ | ON DELETE RESTRICT | ||
); | ); | ||
</ | </ | ||
+ | <WRAP right 25%> | ||
+ | {{: | ||
+ | Schemat bazy wygenerowany za pomocą narzedzia [[https:// | ||
+ | </ | ||
+ | Wyjaśnienia: | ||
+ | |||
+ | PRIMARY KEY przy kolumnach id_klienta, id_towaru i id_zamowienia jednoznacznie identyfikuje wiersz w każdej z tabel. | ||
+ | |||
+ | W tabeli zamowienia: | ||
+ | |||
+ | * fk_zamowienia_klienci to klucz obcy wskazujący na klienci(id_klienta). | ||
+ | |||
+ | ON UPDATE CASCADE – zmiana wartości id_klienta w tabeli klienci automatycznie zaktualizuje wszystkie powiązane wiersze w zamowienia. | ||
+ | |||
+ | ON DELETE CASCADE – usunięcie klienta spowoduje automatyczne skasowanie jego zamówień. | ||
+ | |||
+ | * fk_zamowienia_towary to klucz obcy wskazujący na towary(id_towaru). | ||
+ | |||
+ | ON UPDATE CASCADE – zmiana id_towaru w towary automatycznie zaktualizuje referencje w zamowienia. | ||
+ | |||
+ | ON DELETE RESTRICT – nie pozwoli usunąć towaru, który jest powiązany z przynajmniej jednym zamówieniem. | ||
+ | |||
W tabeli klienci przechowujemy dane klientów (imię, nazwisko, miasto, wiek), w tabeli towary – informacje o produktach (nazwa, kategoria, cena), a w tabeli zamowienia – dane dotyczące zamówień (powiązanie z klientem i towarem, ilość, data). | W tabeli klienci przechowujemy dane klientów (imię, nazwisko, miasto, wiek), w tabeli towary – informacje o produktach (nazwa, kategoria, cena), a w tabeli zamowienia – dane dotyczące zamówień (powiązanie z klientem i towarem, ilość, data). | ||
- | Następnie dodamy przykładowe rekordy do każdej tabeli: <code sql> INSERT INTO klienci (id_klienta, | + | Następnie dodamy przykładowe rekordy do każdej tabeli: |
+ | <WRAP right 25%> | ||
+ | {{: | ||
+ | Po wykonaniu powinniśmy uzyskać coś takiego | ||
+ | </ | ||
+ | <code sql> | ||
+ | INSERT INTO klienci | ||
+ | (id_klienta, | ||
+ | VALUES | ||
+ | (1,' | ||
+ | (2,' | ||
+ | (3,' | ||
+ | (4,' | ||
+ | (5,' | ||
+ | (6,' | ||
+ | (7,' | ||
+ | (8,' | ||
+ | (9,' | ||
+ | (10,' | ||
+ | </ | ||
+ | <WRAP right 25%> | ||
+ | {{: | ||
+ | Po wykonaniu powinniśmy uzyskać coś takiego | ||
+ | </ | ||
+ | <code sql> | ||
+ | INSERT INTO towary | ||
+ | (id_towaru, nazwa, kategoria, cena) | ||
+ | VALUES | ||
+ | (1,' | ||
+ | (2,' | ||
+ | (3,' | ||
+ | (4,' | ||
+ | (5,' | ||
+ | (6,' | ||
+ | (7,' | ||
+ | (8,' | ||
+ | (9,' | ||
+ | (10,' | ||
+ | </ | ||
+ | <WRAP right 25%> | ||
+ | {{: | ||
+ | Po wykonaniu powinniśmy uzyskać coś takiego | ||
+ | </ | ||
+ | <code sql> | ||
+ | INSERT INTO zamowienia | ||
+ | (id_zamowienia, | ||
+ | VALUES | ||
+ | (1, | ||
+ | (2, | ||
+ | (3, | ||
+ | (4, | ||
+ | (5, | ||
+ | (6, | ||
+ | (7, | ||
+ | (8, | ||
+ | (9, | ||
+ | (10, | ||
+ | </ | ||
Taka konfiguracja zapewnia realistyczne dane: kilku klientów zamawia różne towary w różnych ilościach i terminach. | Taka konfiguracja zapewnia realistyczne dane: kilku klientów zamawia różne towary w różnych ilościach i terminach. | ||
Linia 45: | Linia 143: | ||
Podstawowym zapytaniem służącym do pobierania danych jest SELECT. Pozwala ono wybrać jedną lub więcej kolumn z tabeli. Najprostsze zapytanie SELECT zwraca wszystkie kolumny i wiersze danej tabeli. Przykładowo: | Podstawowym zapytaniem służącym do pobierania danych jest SELECT. Pozwala ono wybrać jedną lub więcej kolumn z tabeli. Najprostsze zapytanie SELECT zwraca wszystkie kolumny i wiersze danej tabeli. Przykładowo: | ||
+ | {{: | ||
to zapytanie pobiera wszystkie dane z tabeli klienci. Często potrzebujemy jednak filtrować rekordy według pewnych kryteriów. Służy do tego klauzula WHERE, np. aby wybrać klientów z konkretnego miasta: <code sql> SELECT * FROM klienci WHERE miasto = ' | to zapytanie pobiera wszystkie dane z tabeli klienci. Często potrzebujemy jednak filtrować rekordy według pewnych kryteriów. Służy do tego klauzula WHERE, np. aby wybrać klientów z konkretnego miasta: <code sql> SELECT * FROM klienci WHERE miasto = ' | ||
+ | {{: | ||
- | Możemy też ograniczać liczbę wyników i ich kolejność. Klauzula ORDER BY sortuje wyniki względem podanych kolumn (domyślnie rosnąco) | + | Możemy też ograniczać liczbę wyników i ich kolejność. Klauzula ORDER BY sortuje wyniki względem podanych kolumn (domyślnie rosnąco), natomiast LIMIT ogranicza liczbę zwracanych wierszy |
- | w3schools.com | + | |
- | , natomiast LIMIT ogranicza liczbę zwracanych wierszy | + | Przykłady: <code sql> SELECT imie, |
- | w3schools.com | + | {{: |
- | . Przykłady: <code sql> SELECT imie, | + | |
Powyższe zapytanie wybiera imiona, nazwiska i wiek klientów starszych niż 30 lat, sortuje je malejąco według wieku i ogranicza wynik do trzech pierwszych rekordów. | Powyższe zapytanie wybiera imiona, nazwiska i wiek klientów starszych niż 30 lat, sortuje je malejąco według wieku i ogranicza wynik do trzech pierwszych rekordów. | ||
Linia 58: | Linia 157: | ||
Podsumowując: | Podsumowując: | ||
- | | + | * SELECT służy do pobierania danych z bazy |
- | | + | |
- | . | + | |
- | + | * LIMIT ogranicza liczbę zwróconych rekordów | |
- | | + | |
- | + | ||
- | | + | |
- | | + | |
- | . | + | |
- | LIMIT ogranicza liczbę zwróconych rekordów | ||
- | w3schools.com | ||
- | . | ||
== Łączenie tabel (JOIN) == | == Łączenie tabel (JOIN) == | ||
Często musimy pobrać dane z więcej niż jednej tabeli. Służą do tego różne rodzaje łączeń tabel (JOIN). Najczęściej używanym jest INNER JOIN, który łączy wiersze z dwóch (lub więcej) tabel, zwracając tylko te wiersze, dla których istnieje dopasowanie na podstawie wspólnego pola | Często musimy pobrać dane z więcej niż jednej tabeli. Służą do tego różne rodzaje łączeń tabel (JOIN). Najczęściej używanym jest INNER JOIN, który łączy wiersze z dwóch (lub więcej) tabel, zwracając tylko te wiersze, dla których istnieje dopasowanie na podstawie wspólnego pola | ||
- | kajodata.com | ||
- | . Przykładowa składnia: | ||
+ | Przykładowa składnia: | ||
+ | <code sql> | ||
SELECT kolumna1, kolumna2, ... | SELECT kolumna1, kolumna2, ... | ||
FROM tabela1 | FROM tabela1 | ||
INNER JOIN tabela2 ON tabela1.klucz = tabela2.klucz; | INNER JOIN tabela2 ON tabela1.klucz = tabela2.klucz; | ||
+ | </ | ||
+ | W naszym przykładzie, | ||
- | W naszym przykładzie, | + | <code sql> |
+ | SELECT k.imie, k.nazwisko, t.nazwa AS nazwa_towaru, | ||
+ | FROM zamowienia z | ||
+ | INNER JOIN klienci k ON z.id_klienta = k.id_klienta | ||
+ | INNER JOIN towary t ON z.id_towaru = t.id_towaru; | ||
+ | </ | ||
+ | {{: | ||
Wynik tego zapytania będzie zawierał imię i nazwisko klienta, nazwę zamówionego towaru, ilość i datę dla każdego zamówienia. | Wynik tego zapytania będzie zawierał imię i nazwisko klienta, nazwę zamówionego towaru, ilość i datę dla każdego zamówienia. | ||
Linia 88: | Linia 187: | ||
Oprócz INNER JOIN istnieją również inne typy łączeń: | Oprócz INNER JOIN istnieją również inne typy łączeń: | ||
- | | + | * LEFT JOIN: zwraca wszystkie wiersze z lewej tabeli oraz pasujące z prawej. Jeśli dla wiersza z lewej tabeli nie ma dopasowania, |
- | | + | * RIGHT JOIN: zwraca wszystkie wiersze z prawej tabeli oraz pasujące z lewej. Działa odwrotnie niż LEFT JOIN (przy braku dopasowania pola z lewej strony są NULL) |
- | . | + | * FULL OUTER JOIN: teoretycznie zwraca wszystkie wiersze, które mają dopasowanie w lewej lub prawej tabeli. W praktyce MySQL nie obsługuje bezpośrednio FULL JOIN, ale można go zasymulować np. za pomocą UNION SELECT. |
- | RIGHT JOIN: zwraca wszystkie wiersze z prawej tabeli oraz pasujące z lewej. Działa odwrotnie niż LEFT JOIN (przy braku dopasowania pola z lewej strony są NULL) | + | Przykład użycia '' |
- | | + | <code sql> |
- | . | + | SELECT k.id_klienta, k.imie, z.id_zamowienia |
+ | FROM klienci k | ||
+ | LEFT JOIN zamowienia z ON k.id_klienta = z.id_klienta; | ||
+ | </ | ||
+ | {{: | ||
- | FULL OUTER JOIN: teoretycznie zwraca wszystkie wiersze, które mają dopasowanie w lewej lub prawej tabeli. W praktyce MySQL nie obsługuje bezpośrednio FULL JOIN, ale można go zasymulować np. za pomocą UNION SELECT. | + | W efekcie zobaczymy, że klienci bez zamówień (np. o id 8, 9, 10) będą mieli NULL w kolumnie id_zamowienia. RIGHT JOIN działa podobnie, tylko względem prawej tabeli: |
- | + | <code sql> | |
- | Przykład użycia LEFT JOIN w naszym sklepie: chcemy zobaczyć wszystkich klientów i ewentualne informacje o ich zamówieniach (nawet jeśli zamówienie nie istnieje). <code sql> SELECT k.id_klienta, | + | SELECT z.id_zamowienia, |
- | + | FROM zamowienia z | |
- | W efekcie zobaczymy, że klienci bez zamówień (np. o id 8, 9, 10) będą mieli NULL w kolumnie id_zamowienia. RIGHT JOIN działa podobnie, tylko względem prawej tabeli: <code sql> SELECT z.id_zamowienia, | + | RIGHT JOIN klienci k |
+ | ON z.id_klienta = k.id_klienta; | ||
+ | </ | ||
+ | {{: | ||
Podsumowując: | Podsumowując: | ||
- | | + | * INNER JOIN – łączy wiersze, gdy istnieje dopasowanie w obu tabelach |
- | | + | |
- | . | + | |
- | + | | |
- | | + | |
- | | + | |
- | . | + | |
- | + | ||
- | | + | |
- | | + | |
- | . | + | |
- | + | ||
- | | + | |
- | kajodata.com | + | |
- | . | + | |
== Grupowanie i funkcje agregujące == | == Grupowanie i funkcje agregujące == | ||
- | Do podsumowywania danych używamy klauzuli GROUP BY oraz funkcji agregujących. Klauzula GROUP BY grupuje wiersze o tych samych wartościach w określonych kolumnach (zwykle w połączeniu z funkcjami agregującymi jak SUM czy COUNT) | + | Do podsumowywania danych używamy klauzuli GROUP BY oraz funkcji agregujących. Klauzula GROUP BY grupuje wiersze o tych samych wartościach w określonych kolumnach (zwykle w połączeniu z funkcjami agregującymi jak SUM czy COUNT). Przykładowo, |
- | geeksforgeeks.org | + | <code sql> |
- | . Przykładowo, | + | SELECT miasto, COUNT(*) AS liczba_klientow |
+ | FROM klienci | ||
+ | GROUP BY miasto; | ||
+ | </ | ||
+ | {{: | ||
Wynik pokaże liczbę klientów z Warszawy, Krakowa, itp. Funkcje agregujące: | Wynik pokaże liczbę klientów z Warszawy, Krakowa, itp. Funkcje agregujące: | ||
- | | + | * COUNT() – zwraca liczbę wierszy |
- | | + | * SUM() – oblicza sumę wartości w kolumnie |
- | , | + | * AVG() – oblicza średnią wartość kolumny |
+ | * (dalej: MIN(), MAX() itd.). | ||
- | | + | Na przykład, by obliczyć łączną ilość zamówionych towarów przez każdego klienta: |
- | | + | <code sql> |
- | , | + | SELECT id_klienta, |
+ | FROM zamowienia | ||
+ | GROUP BY id_klienta; | ||
+ | </ | ||
+ | {{: | ||
- | AVG() – oblicza średnią wartość kolumny | + | Innym przykładem jest zbadanie średniej ceny wszystkich produktów: |
- | w3schools.com | + | <code sql> |
- | , | + | SELECT AVG(cena) AS srednia_cena |
- | + | FROM towary; | |
- | (dalej: MIN(), MAX() itd.). | + | </ |
- | + | {{: | |
- | Na przykład, by obliczyć łączną ilość zamówionych towarów przez każdego klienta: <code sql> SELECT id_klienta, SUM(ilosc) AS suma_ilosci FROM zamowienia GROUP BY id_klienta; </ | + | |
- | + | ||
- | Innym przykładem jest zbadanie średniej ceny wszystkich produktów: <code sql> SELECT AVG(cena) AS srednia_cena FROM towary; </ | + | |
Funkcje agregujące ignorują wartości NULL, a gdy użyjemy ich bez klauzuli GROUP BY, traktowane są jak pojedyncza grupa obejmująca wszystkie wiersze. | Funkcje agregujące ignorują wartości NULL, a gdy użyjemy ich bez klauzuli GROUP BY, traktowane są jak pojedyncza grupa obejmująca wszystkie wiersze. | ||
Linia 152: | Linia 253: | ||
Do modyfikacji danych w tabelach używamy trzech podstawowych poleceń: | Do modyfikacji danych w tabelach używamy trzech podstawowych poleceń: | ||
- | | + | * INSERT – służy do wstawiania nowych rekordów do tabeli |
- | | + | * UPDATE – służy do modyfikacji istniejących rekordów w tabeli |
- | . | + | * DELETE – służy do usuwania istniejących rekordów z tabeli |
- | UPDATE – służy do modyfikacji istniejących rekordów w tabeli | + | Przykłady użycia: |
- | | + | <code sql> |
- | . | + | -- Dodanie nowego klienta |
+ | INSERT INTO klienci (id_klienta, | ||
+ | </ | ||
+ | {{: | ||
+ | <code sql> | ||
+ | -- Zmiana miasta klienta o id 2 | ||
+ | UPDATE klienci SET miasto = ' | ||
+ | </ | ||
+ | {{: | ||
+ | <code sql> | ||
+ | -- Usunięcie klienta o id 10 | ||
+ | DELETE FROM klienci WHERE id_klienta = 10; | ||
+ | </ | ||
+ | {{: | ||
- | DELETE – służy do usuwania istniejących rekordów z tabeli | + | Każde z tych zapytań ma swoje szczegóły: |
- | w3schools.com | + | |
- | . | + | |
- | + | ||
- | Przykłady użycia: <code sql> -- Dodanie nowego klienta INSERT INTO klienci (id_klienta, | + | |
- | + | ||
- | Każde z tych zapytań ma swoje szczegóły: | + | |
== Podzapytania (subqueries) == | == Podzapytania (subqueries) == | ||
Podzapytanie to zapytanie zagnieżdżone wewnątrz innego zapytania. Innymi słowy, to zapytanie SELECT zawierające w klauzuli WHERE (lub FROM, HAVING itp.) inny SELECT | Podzapytanie to zapytanie zagnieżdżone wewnątrz innego zapytania. Innymi słowy, to zapytanie SELECT zawierające w klauzuli WHERE (lub FROM, HAVING itp.) inny SELECT | ||
- | w3resource.com | + | Podzapytania pozwalają porównywać wartość z wynikiem innego zapytania. Na przykład: |
- | . Podzapytania pozwalają porównywać wartość z wynikiem innego zapytania. Na przykład: <code sql> SELECT nazwa, cena FROM towary WHERE cena > (SELECT AVG(cena) FROM towary); </ | + | <code sql> |
+ | SELECT nazwa, cena | ||
+ | FROM towary | ||
+ | WHERE cena > (SELECT AVG(cena) FROM towary); | ||
+ | </ | ||
+ | {{: | ||
To zapytanie zwraca produkty, których cena jest większa niż średnia cena wszystkich produktów. Najpierw wykonujemy podzapytanie (SELECT AVG(cena) FROM towary), które oblicza średnią cenę, a następnie główne zapytanie wybiera towary o cenie większej od tej wartości. | To zapytanie zwraca produkty, których cena jest większa niż średnia cena wszystkich produktów. Najpierw wykonujemy podzapytanie (SELECT AVG(cena) FROM towary), które oblicza średnią cenę, a następnie główne zapytanie wybiera towary o cenie większej od tej wartości. | ||
Podsumowując, | Podsumowując, | ||
- | w3resource.com | ||
- | . | ||
== Prosta procedura składowana == | == Prosta procedura składowana == | ||
Procedura składowana (stored procedure) to zapisany w bazie zestaw instrukcji SQL, który można wykonywać wielokrotnie. W MySQL tworzymy ją za pomocą polecenia CREATE PROCEDURE | Procedura składowana (stored procedure) to zapisany w bazie zestaw instrukcji SQL, który można wykonywać wielokrotnie. W MySQL tworzymy ją za pomocą polecenia CREATE PROCEDURE | ||
- | w3schools.com | + | Przykładowo, |
- | . Przykładowo, | + | <code sql> |
+ | DELIMITER // | ||
+ | CREATE PROCEDURE LiczbaZamowienDlaKlienta (IN client_id INT) | ||
+ | BEGIN SELECT COUNT(*) AS liczba_zamowien | ||
+ | FROM zamowienia | ||
+ | WHERE id_klienta = client_id; | ||
+ | END | ||
+ | // DELIMITER ; | ||
+ | </ | ||
- | Powyższa procedura LiczbaZamowienDlaKlienta przyjmuje parametr wejściowy client_id i zwraca liczbę zamówień danego klienta. Aby ją wywołać, używamy polecenia CALL: <code sql> CALL LiczbaZamowienDlaKlienta(1); | + | Powyższa procedura LiczbaZamowienDlaKlienta przyjmuje parametr wejściowy client_id i zwraca liczbę zamówień danego klienta. Aby ją wywołać, używamy polecenia CALL: |
+ | <code sql> | ||
+ | CALL LiczbaZamowienDlaKlienta(1); | ||
+ | </ | ||
+ | {{: | ||
Procedury składowane ułatwiają wielokrotne wykonywanie tych samych operacji na bazie i mogą zwracać zestawy wyników lub dane wyjściowe. | Procedury składowane ułatwiają wielokrotne wykonywanie tych samych operacji na bazie i mogą zwracać zestawy wyników lub dane wyjściowe. | ||
Linia 192: | Linia 315: | ||
== Podsumowanie == | == Podsumowanie == | ||
- | W tym obszernym | + | W tym tutorialu opisaliśmy podstawowe sposoby formułowania zapytań w MySQL na przykładzie bazy sklepu z tabelami klienci, zamowienia i towary. Omówiliśmy pobieranie danych przy pomocy SELECT z klauzulami WHERE, ORDER BY i LIMIT, łączenie tabel za pomocą różnych typów JOIN (INNER, LEFT, RIGHT, FULL) oraz zagnieżdżanie zapytań. Pokazaliśmy także, jak grupować dane używając GROUP BY oraz jak stosować funkcje agregujące takie jak COUNT, SUM i AVG do podsumowywania wyników. Przedstawiliśmy polecenia modyfikujące dane: INSERT (dodawanie nowych rekordów), UPDATE (aktualizacja istniejących) i DELETE (usuwanie rekordów). Zademonstrowaliśmy także przykład podzapytania (SELECT wewnątrz SELECT) oraz stworzenie prostej procedury składowanej. |
Dzięki tym przykładowym zapytaniom możesz ćwiczyć pracę z bazą danych i stopniowo rozwijać swoje umiejętności SQL. Pamiętaj, że kluczem jest praktyka – warto eksperymentować na różnych danych i zadaniach, aby lepiej opanować składnię i możliwości MySQL. | Dzięki tym przykładowym zapytaniom możesz ćwiczyć pracę z bazą danych i stopniowo rozwijać swoje umiejętności SQL. Pamiętaj, że kluczem jest praktyka – warto eksperymentować na różnych danych i zadaniach, aby lepiej opanować składnię i możliwości MySQL. | ||
+ | |||
+ | == Pełen dump bazy danych == | ||
+ | <code mysql> | ||
+ | -- Adminer 5.2.1 MySQL 8.0.42 dump | ||
+ | |||
+ | SET NAMES utf8; | ||
+ | SET time_zone = ' | ||
+ | SET foreign_key_checks = 0; | ||
+ | SET sql_mode = ' | ||
+ | |||
+ | DROP DATABASE IF EXISTS `sklep`; | ||
+ | CREATE DATABASE `sklep` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_polish_ci */ /*!80016 DEFAULT ENCRYPTION=' | ||
+ | USE `sklep`; | ||
+ | |||
+ | DELIMITER ;; | ||
+ | |||
+ | CREATE PROCEDURE `LiczbaZamowienDlaKlienta` (IN `client_id` int) | ||
+ | BEGIN SELECT COUNT(*) AS liczba_zamowien | ||
+ | FROM zamowienia | ||
+ | WHERE id_klienta = client_id; | ||
+ | END;; | ||
+ | |||
+ | DELIMITER ; | ||
+ | |||
+ | DROP TABLE IF EXISTS `klienci`; | ||
+ | CREATE TABLE `klienci` ( | ||
+ | `id_klienta` int NOT NULL, | ||
+ | `imie` varchar(50) COLLATE utf8mb3_polish_ci DEFAULT NULL, | ||
+ | `nazwisko` varchar(50) COLLATE utf8mb3_polish_ci DEFAULT NULL, | ||
+ | `miasto` varchar(50) COLLATE utf8mb3_polish_ci DEFAULT NULL, | ||
+ | `wiek` int DEFAULT NULL, | ||
+ | PRIMARY KEY (`id_klienta`) | ||
+ | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_polish_ci; | ||
+ | |||
+ | INSERT INTO `klienci` (`id_klienta`, | ||
+ | (1, | ||
+ | (2, | ||
+ | (3, | ||
+ | (4, | ||
+ | (5, | ||
+ | (6, | ||
+ | (7, | ||
+ | (8, | ||
+ | (9, | ||
+ | (11, | ||
+ | |||
+ | DROP TABLE IF EXISTS `towary`; | ||
+ | CREATE TABLE `towary` ( | ||
+ | `id_towaru` int NOT NULL, | ||
+ | `nazwa` varchar(100) COLLATE utf8mb3_polish_ci DEFAULT NULL, | ||
+ | `kategoria` varchar(50) COLLATE utf8mb3_polish_ci DEFAULT NULL, | ||
+ | `cena` decimal(10, | ||
+ | PRIMARY KEY (`id_towaru`) | ||
+ | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_polish_ci; | ||
+ | |||
+ | INSERT INTO `towary` (`id_towaru`, | ||
+ | (1, | ||
+ | (2, | ||
+ | (3, | ||
+ | (4, | ||
+ | (5, | ||
+ | (6, | ||
+ | (7, | ||
+ | (8, | ||
+ | (9, | ||
+ | (10, | ||
+ | |||
+ | DROP TABLE IF EXISTS `zamowienia`; | ||
+ | CREATE TABLE `zamowienia` ( | ||
+ | `id_zamowienia` int NOT NULL, | ||
+ | `id_klienta` int DEFAULT NULL, | ||
+ | `id_towaru` int DEFAULT NULL, | ||
+ | `ilosc` int DEFAULT NULL, | ||
+ | `DATA` date DEFAULT NULL, | ||
+ | PRIMARY KEY (`id_zamowienia`), | ||
+ | KEY `fk_zamowienia_klienci` (`id_klienta`), | ||
+ | KEY `fk_zamowienia_towary` (`id_towaru`), | ||
+ | CONSTRAINT `fk_zamowienia_klienci` FOREIGN KEY (`id_klienta`) REFERENCES `klienci` (`id_klienta`) ON DELETE CASCADE ON UPDATE CASCADE, | ||
+ | CONSTRAINT `fk_zamowienia_towary` FOREIGN KEY (`id_towaru`) REFERENCES `towary` (`id_towaru`) ON DELETE RESTRICT ON UPDATE CASCADE | ||
+ | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_polish_ci; | ||
+ | |||
+ | INSERT INTO `zamowienia` (`id_zamowienia`, | ||
+ | (1, | ||
+ | (2, | ||
+ | (3, | ||
+ | (4, | ||
+ | (5, | ||
+ | (6, | ||
+ | (7, | ||
+ | (8, | ||
+ | (9, | ||
+ | (10, | ||
+ | |||
+ | -- 2025-05-13 10:05:07 UTC | ||
+ | </ |