Wyobraź sobie, że masz ogromną bibliotekę, pełną książek o różnych tematach. Chcesz znaleźć wszystkie książki o dinozaurach, które zostały wydane po 2000 roku. Jak byś to zrobił? Musiałbyś przejrzeć każdą książkę, sprawdzić tytuł i datę wydania. To byłoby bardzo czasochłonne!
SQL (Structured Query Language) to specjalny język, który pozwala nam "rozmawiać" z komputerem o danych, tak jak z bibliotekarzem. Zamiast przeglądać każdą książkę ręcznie, możemy zadać komputerowi pytanie: "Podaj mi tytuły wszystkich książek o dinozaurach wydanych po 2000 roku". Komputer, dzięki SQL, szybko przeszuka całą bibliotekę i poda nam dokładną odpowiedź.
Dlaczego SQL jest taki ważny?
Baza danych jak biblioteka: Komputery przechowują ogromne ilości danych w specjalnych miejscach nazywanych bazami danych. Baza danych jest jak wielka biblioteka, w której książki są uporządkowane w półkach i szufladach.
SQL jako język zapytań: SQL to język, który pozwala nam precyzyjnie formułować pytania o dane przechowywane w bazie danych.
Wszechstronność: SQL jest używany w wielu miejscach, od dużych sklepów internetowych po banki. Pomaga zarządzać danymi klientów, produktami, zamówieniami i wieloma innymi informacjami.
Do czego używamy SQL?
Zapytać o dane: Możemy znaleźć konkretne informacje, np. "Jakie są najpopularniejsze produkty w naszym sklepie?".
Dodawać nowe dane: Możemy wprowadzić nowe informacje do bazy danych, np. dodać nowego klienta.
Zmieniać istniejące dane: Możemy aktualizować informacje, np. zmienić adres klienta.
Usuwać dane: Możemy usunąć niepotrzebne dane, np. usunąć stare zamówienia.
Organizować dane: Możemy tworzyć nowe tabele i łączyć je ze sobą, aby lepiej zarządzać informacjami.
Jak działa SQL?
Wyobraź sobie, że tabela w bazie danych to coś w rodzaju arkusza kalkulacyjnego. Każdy wiersz w tabeli to jedna książka, a każda kolumna to informacja o tej książce (np. tytuł, autor, data wydania).
SQL pozwala nam na:
Tworzenie nowych tabel: Jakbyśmy dodawali nową półkę w bibliotece.
Wypełnianie tabel danymi: Jakbyśmy umieszczali książki na półkach.
Sortowanie danych: Jakbyśmy ustawiali książki alfabetycznie po tytule.
Filtrowanie danych: Jakbyśmy wybierali tylko książki o dinozaurach.
Prosty przykład:
Załóżmy, że mamy tabelę o nazwie "ksiazki" z kolumnami "tytuł" i "rok_wydania". Aby znaleźć wszystkie książki o dinozaurach wydane po 2000 roku, możemy użyć takiego polecenia SQL:
AND tytuł LIKE '%dinozaury%';
___________________________
Jak uzyskać dostęp do MySQL przez terminal w XAMPP
Korzystanie z terminala do obsługi MySQL może być bardziej efektywne i daje większą kontrolę nad bazą danych. Poniżej kroki, jak połączyć się z MySQL w XAMPP z terminala:
Uruchom XAMPP i włącz MySQL:
W XAMPP Control Panel uruchom tylko serwer MySQL, nie musisz włączać serwera Apache.
Otwórz terminal lub wiersz polecenia:
Windows: Uruchom CMD lub PowerShell.
Linux/MacOS: Otwórz terminal.
Przejdź do katalogu instalacyjnego XAMPP:
Domyślnie na Windows jest to folder C:\xampp.
W terminalu przejdź do tego katalogu, wpisując:
cd C:\xampp\mysql\bin
Uruchom MySQL z terminala:
Wpisz poniższe polecenie, aby połączyć się z serwerem MySQL jako użytkownik root:
mysql -u root -p
Jeśli nie ustawiłeś hasła dla użytkownika root (domyślnie XAMPP nie ma hasła dla MySQL), naciśnij Enter po wyświetleniu prośby o hasło.
Jeśli masz ustawione hasło, wpisz je po pojawieniu się prośby.
Pracuj z bazą danych:
Po połączeniu się z MySQL możesz wprowadzać komendy SQL bezpośrednio w terminalu.
Przykłady:
SHOW DATABASES; -- Wyświetla wszystkie bazy danych
USE nazwa_bazy; -- Przełącz się na określoną bazę danych
SHOW TABLES; -- Wyświetla wszystkie tabele w bieżącej bazie danych
Wyjście z MySQL:
Aby zakończyć sesję MySQL, wpisz:
EXIT;
DDL (Data Definition Language) – Język definiowania danych
DDL (Data Definition Language) to część języka SQL, która służy do definiowania i zarządzania strukturą bazy danych. Polecenia DDL pozwalają tworzyć, modyfikować i usuwać obiekty w bazie danych, takie jak tabele, indeksy i widoki. Polecenia DDL nie wpływają na same dane, a raczej na strukturę, w której te dane są przechowywane.
Polecenie CREATE umożliwia tworzenie nowych obiektów, takich jak bazy danych, tabele, indeksy, widoki i inne.
Przykłady:
Tworzenie nowej bazy danych:
CREATE DATABASE nazwa_bazy;
Tworzenie nowej tabeli:
CREATE TABLE klienci (
id INT PRIMARY KEY,
imie VARCHAR(50),
nazwisko VARCHAR(50),
wiek INT,
miasto VARCHAR(100)
);
Tworzenie indeksu na kolumnie:
CREATE INDEX idx_nazwisko ON klienci(nazwisko);
Tworzenie widoku:
CREATE VIEW aktywni_klienci AS
SELECT imie, nazwisko, miasto FROM klienci WHERE wiek > 18;
Polecenie ALTER umożliwia modyfikację istniejących obiektów, takich jak tabele. Dzięki niemu można dodawać, usuwać lub zmieniać kolumny i inne elementy struktury tabel.
Przykłady:
Dodanie nowej kolumny do tabeli:
ALTER TABLE klienci ADD email VARCHAR(100);
Zmiana typu danych kolumny:
ALTER TABLE klienci MODIFY wiek TINYINT;
Usunięcie kolumny z tabeli:
ALTER TABLE klienci DROP COLUMN miasto;
Zmiana nazwy tabeli:
ALTER TABLE klienci RENAME TO nowi_klienci;
Polecenie DROP umożliwia usunięcie obiektów z bazy danych, takich jak tabele, bazy danych, widoki i indeksy. Użycie tego polecenia usuwa obiekt całkowicie, łącznie z danymi, które w nim się znajdują, dlatego należy z niego korzystać ostrożnie.
Przykłady:
Usunięcie tabeli:
DROP TABLE klienci;
Usunięcie bazy danych:
DROP DATABASE nazwa_bazy;
Usunięcie widoku:
DROP VIEW aktywni_klienci;
Usunięcie indeksu:
DROP INDEX idx_nazwisko ON klienci;
Polecenie TRUNCATE usuwa wszystkie rekordy z tabeli, ale pozostawia jej strukturę nietkniętą. W przeciwieństwie do DROP, tabela pozostaje w bazie danych, co oznacza, że można w niej od razu wprowadzać nowe dane.
Przykład:
Wyczyść wszystkie dane z tabeli:
TRUNCATE TABLE klienci;
Polecenia DDL są kluczowe dla zarządzania strukturą bazy danych. Oto ich najważniejsze zastosowania:
CREATE – tworzenie nowych obiektów (baz danych, tabel, indeksów, widoków).
ALTER – modyfikacja istniejących obiektów, takich jak dodawanie lub usuwanie kolumn.
DROP – usuwanie obiektów z bazy danych (np. tabel, widoków).
TRUNCATE – usunięcie wszystkich rekordów z tabeli bez zmiany jej struktury.
Te polecenia pozwalają zdefiniować i zarządzać strukturą baz danych, co jest istotne w projektowaniu i utrzymaniu efektywnych systemów bazodanowych.
DML (Data Manipulation Language) – Język manipulacji danymi
Wyobraź sobie, że baza danych to wielka biblioteka. Książki w tej bibliotece to dane, a półki to tabele. Polecenia DML (Data Manipulation Language) to narzędzia, które pozwalają nam dodawać nowe książki (rekordy), usuwać stare, oraz zmieniać informacje w istniejących książkach.
GŁÓWNE POLECENIA DML
INSERT: Dodaje nowe rekordy (wiersze) do tabeli.
Przykład: Chcesz dodać nowego ucznia do klasy? Użyjesz INSERT, aby wstawić jego imię, nazwisko i numer klasy do tabeli "uczniowie".
UPDATE: Modyfikuje istniejące rekordy.
Przykład: Uczeń zmienił adres? UPDATE pozwoli Ci zmienić jego adres w tabeli "uczniowie".
DELETE: Usuwa rekordy z tabeli.
Przykład: Uczeń przeniósł się do innej szkoły? DELETE usunie jego dane z tabeli "uczniowie".
INSERT:
INSERT INTO nazwa_tabeli (kolumna1, kolumna2, ...)
VALUES (wartość1, wartość2, ...);
nazwa_tabeli: nazwa tabeli, do której dodajemy dane.
kolumna1, kolumna2, ...: kolumny, do których wpisujemy wartości.
wartość1, wartość2, ...: wartości, które chcemy dodać.
UPDATE:
UPDATE nazwa_tabeli
SET kolumna1 = nowa_wartość1, kolumna2 = nowa_wartość2, ...
WHERE warunek;
WHERE warunek: określa, które rekordy mają zostać zmodyfikowane.
DELETE:
DELETE FROM nazwa_tabeli
WHERE warunek;
WHERE warunek: określa, które rekordy mają zostać usunięte.
Przykład:
Mamy tabelę "uczniowie" z kolumnami: id, imię, nazwisko, klasa. Chcemy:
Dodać nowego ucznia:
INSERT INTO uczniowie (id, imie, nazwisko, klasa)
VALUES (5, 'Jan', 'Kowalski', '2a');
Zmienić klasę ucznia o id=3 na "2b":
UPDATE uczniowie
SET klasa = '2b'
WHERE id = 3;
Usunąć ucznia o id=2:
DELETE FROM uczniowie
WHERE id = 2;
DQL (Data Query Language) – Język zapytań
Czym są zapytania DQL?
Wyobraź sobie, że masz ogromną bibliotekę książek. Żeby znaleźć konkretną książkę, musisz zadać odpowiednie pytanie. W języku SQL takie pytania nazywamy zapytaniami DQL (Data Query Language). Są to polecenia, które pozwalają nam wydobyć konkretne informacje z bazy danych.
SELECT kolumna1, kolumna2, ...
FROM nazwa_tabeli;
SELECT– Określone, które mają pozostać wybrane.
FROM– określenie tabeli, z której dane są pobierane.
Przykład :
SELECT imie, nazwisko FROM klienci;
Pytamy o pobranie kolumny imie i nazwisko z tabeli klienci.
Symbol * jest używany, gdy dostarczane są z zestawu.
Przykład :
SELECT * FROM klienci;
Aby pobrać wszystkie kolumny z tabeli klienci.
Klauzula WHERE pozwala na filtrowanie danych, aby wybrać tylko te rekordy, które spełniają warunek.
Przykłady :
Pobranie wszystkich klientów o wieku powyżej 18 lat:
SELECT imie, nazwisko FROM klienci WHERE wiek > 18;
Pobranie klientów z miasta warszawa:
SELECT imie, nazwisko FROM klienci WHERE miasto = 'Warszawa';
Możemy używać różnych operatorów porównania, aby określić warunki w klauzuli WHERE:
=: równe
<> lub !=: różne
<, >, <=, >=: mniejsze, większe, mniejsze lub równe, większe lub równe
BETWEEN ... AND ...: wartość znajduje się w określonym przedziale
IN (...): wartość jest jedną z podanych wartości
LIKE: służy do wyszukiwania wzorców (np. "%")
Przykład z użyciem różnych operatorów:
SELECT * FROM klienci
WHERE wiek BETWEEN 18 AND 25 AND miasto IN ('Warszawa', 'Kraków');
To zapytanie wybierze klientów, którzy mają od 18 do 25 lat i mieszkają w Warszawie lub Krakowie.
Przykłady :
Wybór klientów w wieku od 18 do 25 lat:
SELECT * FROM klienci WHERE wiek BETWEEN 18 AND 25;
Wybór klientów z miasta Warszawa lub Kraków:
SELECT * FROM klienci WHERE miasto IN ('Warszawa', 'Kraków');
Wybór klientów, których nazwisko zaczyna się na „K”:
SELECT * FROM klienci WHERE nazwisko LIKE 'K%';
Składnia:
SELECT kolumna1, kolumna2, ...
FROM tabela
ORDER BY kolumna_sortowania [ASC | DESC];
SELECT kolumna1, kolumna2, ...: Określa, które kolumny mają być wyświetlone w wynikach zapytania.
FROM tabela: Określa, z której tabeli pobieramy dane.
ORDER BY kolumna_sortowania: Określa, według której kolumny ma być wykonane sortowanie.
ASC: Służy do sortowania rosnąco (domyślne).
DESC: Służy do sortowania malejąco.
Przykład:
Załóżmy, że mamy tabelę klienci z kolumnami: id, imie, nazwisko i miasto. Chcemy wyświetlić listę klientów posortowaną alfabetycznie według nazwiska:
SELECT imie, nazwisko, miasto
FROM klienci
ORDER BY nazwisko ASC;
W tym przykładzie:
SELECT imie, nazwisko, miasto: Wybieramy kolumny imię, nazwisko i miasto.
FROM klienci: Pobieramy dane z tabeli klienci.
ORDER BY nazwisko ASC: Sortujemy wyniki rosnąco według kolumny nazwisko.
Sortowanie według wielu kolumn:
Możemy sortować wyniki według wielu kolumn. Na przykład, chcemy posortować klientów najpierw według miasta (rosnąco), a następnie według nazwiska (malejąco):
SELECT imie, nazwisko, miasto
FROM klienci
ORDER BY miasto ASC, nazwisko DESC;
Ważne uwagi:
Kolejność sortowania: Kolejność, w jakiej podajemy kolumny po ORDER BY, określa priorytet sortowania.
Typ danych: Typ danych kolumny, według której sortujemy, ma znaczenie. Dla typów liczbowych sortowanie jest numeryczne, dla tekstowych - alfabetyczne.
NULL-y: Wartości NULL są zazwyczaj umieszczane na początku lub na końcu wyników, w zależności od implementacji bazy danych.
Słowo kluczowe DISTINCT służy do eliminowania zduplikowanych wierszy z wyniku zapytania SQL. Dzięki temu każdy wiersz w wyniku jest unikalny.
SELECT DISTINCT kolumna1, kolumna2, ...
FROM nazwa_tabeli;
Przykład:
Jeśli masz tabelę o nazwie zamówienia z kolumnami id_klienta i id_produktu i chcesz znaleźć unikalne ID klientów, którzy złożyli zamówienia, możesz użyć:
SELECT DISTINCT id_klienta
FROM zamówienia;
To zwróci listę unikalnych identyfikatorów klientów bez żadnych duplikatów.
Funkcja CONCAT służy do łączenia dwóch lub więcej łańcuchów znaków w jeden łańcuch.
Składnia:
CONCAT(łańcuch1, łańcuch2, ...)
Przykład:
Aby połączyć kolumny imię i nazwisko w pełne imię i nazwisko:
SELECT CONCAT(imie, ' ', nazwisko) AS pełne_imię
FROM klienci;
To utworzy nową kolumnę o nazwie pełne_imię, która będzie zawierać połączone imię i nazwisko.
Klauzula LIMIT służy do określenia maksymalnej liczby wierszy, które mają być zwrócone w wyniku zapytania.
Składnia:
SELECT kolumna1, kolumna2, ...
FROM nazwa_tabeli
LIMIT liczba_wierszy;
Przykład:
Aby pobrać 10 najlepszych klientów pod względem wartości zamówień:
SELECT id_klienta, SUM(wartość_zamówienia) AS suma_wydatków
FROM zamówienia
GROUP BY id_klienta
ORDER BY suma_wydatków DESC
LIMIT 10;
To zapytanie pogrupuje zamówienia według klienta, obliczy sumę wydatków każdego klienta, posortuje wyniki według sumy wydatków malejąco i ograniczy wynik do 10 najlepszych klientów.
Łącząc te klauzule, możesz tworzyć potężne i elastyczne zapytania SQL, aby wydobywać konkretne informacje z bazy danych.
Funkcje agregujące i grupowanie danych
Funkcje agregujące pozwalają nam na wykonywanie obliczeń na zbiorach danych, zwracając pojedynczą wartość jako wynik. Są niezwykle przydatne do podsumowywania informacji z wielu wierszy.
COUNT(*): Liczy liczbę wszystkich wierszy w zestawie danych.
Przykład:
SELECT COUNT(*) FROM klienci;
Zwraca liczbę wszystkich klientów w tabeli.
COUNT(kolumna): Liczy liczbę wierszy, gdzie dana kolumna ma wartość inną niż NULL.
Przykład:
SELECT COUNT(email) FROM klienci;
Zwraca liczbę klientów, którzy podali adres email.
SUM(kolumna): Oblicza sumę wartości liczbowych w danej kolumnie.
Przykład:
SELECT SUM(wartosc_zamowienia) FROM zamowienia;
Oblicza całkowitą wartość wszystkich zamówień.
AVG(kolumna): Oblicza średnią arytmetyczną wartości liczbowych w danej kolumnie.
Przykład:
SELECT AVG(wiek) FROM pracownicy;
Oblicza średni wiek pracowników.
MAX(kolumna): Znajduje największą wartość w danej kolumnie.
Przykład:
SELECT MAX(cena) FROM produkty;
Znajduje najdroższy produkt.
MIN(kolumna): Znajduje najmniejszą wartość w danej kolumnie.
Przykład:
SELECT MIN(data_zamowienia) FROM zamowienia;
Znajduje datę pierwszego zamówienia.
Klauzula GROUP BY pozwala na podzielenie danych na grupy na podstawie wartości jednej lub wielu kolumn. Pozwala to na stosowanie funkcji agregujących do każdej grupy z osobna.
Przykład:
SELECT kraj, COUNT(*) AS liczba_klientow
FROM klienci
GROUP BY kraj;
Zwraca liczbę klientów z każdego kraju.
Klauzula HAVING służy do filtrowania grup utworzonych przez GROUP BY. Działa podobnie do WHERE, ale odnosi się do grup, a nie do pojedynczych wierszy.
Przykład:
SELECT miasto, AVG(wiek) AS sredni_wiek
FROM osoby
GROUP BY miasto
HAVING AVG(wiek) > 30;
Zwraca miasta, w których średni wiek mieszkańców jest większy niż 30 lat.
DISTINCT: Usuwa zduplikowane wartości z wyników zapytania.
Przykład:
SELECT DISTINCT kraj FROM klienci;
Zwraca listę unikalnych krajów.
ORDER BY: Sortuje wyniki zapytania według określonej kolumny lub kilku kolumn.
Przykład:
SELECT imie, nazwisko FROM klienci
ORDER BY nazwisko ASC;
Sortuje klientów alfabetycznie według nazwiska.
Możemy łączyć funkcje agregujące, GROUP BY, HAVING, ORDER BY i inne klauzule, aby tworzyć bardziej złożone zapytania.
Przykład:
SELECT kategoria, AVG(cena) AS srednia_cena
FROM produkty
GROUP BY kategoria
HAVING AVG(cena) > 100
ORDER BY srednia_cena DESC;
Zwraca średnią cenę produktów w każdej kategorii, gdzie średnia cena jest większa niż 100, posortowaną malejąco.
Relacje -łączenie tabel
-- Tworzenie bazy danych
CREATE DATABASE sklep_muzyczny;
USE sklep_muzyczny;
-- Tabela Klienci
CREATE TABLE Klienci (
id_klienta INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(50) NOT NULL,
nazwisko VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE
);
-- Tabela Produkty
CREATE TABLE Produkty (
id_produktu INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(100) NOT NULL,
cena DECIMAL(10, 2) NOT NULL,
kategoria VARCHAR(50) NOT NULL
);
-- Tabela Zamowienia
CREATE TABLE Zamowienia (
id_zamowienia INT AUTO_INCREMENT PRIMARY KEY,
id_klienta INT NOT NULL,
id_produktu INT NOT NULL,
ilosc INT NOT NULL,
data_zamowienia DATE NOT NULL,
FOREIGN KEY (id_klienta) REFERENCES Klienci(id_klienta),
FOREIGN KEY (id_produktu) REFERENCES Produkty(id_produktu)
);
-- Dodawanie rekordów
-- Rekordy w tabeli Klienci
INSERT INTO Klienci (imie, nazwisko, email) VALUES
('Jan', 'Kowalski', 'jan.kowalski@example.com'),
('Anna', 'Nowak', 'anna.nowak@example.com'),
('Marek', 'Wiśniewski', 'marek.wisniewski@example.com');
-- Rekordy w tabeli Produkty
INSERT INTO Produkty (nazwa, cena, kategoria) VALUES
('Gitara akustyczna', 499.99, 'Instrumenty'),
('Keyboard Yamaha', 1299.99, 'Instrumenty'),
('Mikrofon Shure', 299.99, 'Akcesoria'),
('Słuchawki Sony', 199.99, 'Akcesoria'),
('Struny do gitary', 39.99, 'Akcesoria');
-- Rekordy w tabeli Zamowienia
INSERT INTO Zamowienia (id_klienta, id_produktu, ilosc, data_zamowienia) VALUES
(1, 1, 1, '2025-01-01'), -- Jan Kowalski kupił gitarę
(1, 5, 2, '2025-01-01'), -- Jan Kowalski kupił struny
(2, 2, 1, '2025-01-02'), -- Anna Nowak kupiła keyboard
(2, 4, 1, '2025-01-02'), -- Anna Nowak kupiła słuchawki
(3, 3, 1, '2025-01-03'); -- Marek Wiśniewski kupił mikrofon
Więzy integralności
Podzapytania (Subqueries)
Stwórz bazę danych dla szkoły zawierającą informacje o uczniach, klasach i przedmiotach. Wykonaj poniższe kroki:
Stwórz następujące tabele:
Uczniowie:
IdUcznia (int, klucz główny)
Imie (varchar(50))
Nazwisko (varchar(50))
IdKlasy (int, klucz obcy)
Klasy:
IdKlasy (int, klucz główny)
NazwaKlasy (varchar(20))
Wychowawca (varchar(50))
Przedmioty:
IdPrzedmiotu (int, klucz główny)
NazwaPrzedmiotu (varchar(50))
IdKlasy (int, klucz obcy)
Wstaw przykładowe dane do tabel:
Tabela Uczniowie – minimum 5 uczniów.
Tabela Klasy – minimum 2 klasy.
Tabela Przedmioty – minimum 3 przedmioty przypisane do klas.
Wykonaj zapytania:
Wyświetl wszystkich uczniów i przypisz ich do odpowiednich klas.
Znajdź wszystkie przedmioty nauczane w wybranej klasie.
Zaktualizuj nazwę wychowawcy w jednej z klas.
Usuń ucznia, który zakończył naukę.
Dodatkowe wyzwanie (dla chętnych):
Dodaj tabelę Oceny z następującymi kolumnami:
IdOceny (int, klucz główny)
IdUcznia (int, klucz obcy)
IdPrzedmiotu (int, klucz obcy)
Ocena (int)
Wstaw dane do tabeli i napisz zapytanie, które obliczy średnią ocen ucznia z konkretnego przedmiotu.