🗄️ Ćwiczenie: Podstawy MySQL

Nauka tworzenia i zarządzania bazami danych

🎯 Cel ćwiczenia

MySQL to najpopularniejszy system zarządzania relacyjnymi bazami danych (RDBMS). W tym ćwiczeniu nauczysz się tworzyć bazy danych, tabele oraz wykonywać zapytania SQL do pobierania i modyfikowania danych.

Czego się nauczysz:

  • Tworzenia baz danych i tabel
  • Podstawowych zapytań SQL (SELECT, INSERT, UPDATE, DELETE)
  • Filtrowania i sortowania danych
  • Łączenia tabel (JOIN)
  • Grupowania i agregacji danych
  • Pracy z XAMPP i phpMyAdmin

📥 Pobierz bazę danych do ćwiczeń

Przygotowałem gotową bazę danych ze szkołą - uczniowie, nauczyciele, przedmioty i oceny.

Plik zawiera kompletną bazę z przykładowymi danymi do importu w phpMyAdmin

🚀 Część 1: Konfiguracja XAMPP

Krok 1: Uruchomienie XAMPP

  1. Otwórz XAMPP Control Panel
  2. Kliknij Start przy Apache
  3. Kliknij Start przy MySQL
  4. Oba powinny świecić się na zielono

Krok 2: Otwarcie phpMyAdmin

  1. Otwórz przeglądarkę
  2. Wejdź na adres: http://localhost/phpmyadmin
  3. Zobaczysz interfejs phpMyAdmin
Uwaga! Jeśli XAMPP nie startuje:
  • Sprawdź czy nie masz uruchomionego Skype (używa portu 80)
  • Sprawdź czy antywirus nie blokuje XAMPP
  • Uruchom XAMPP jako administrator

Krok 3: Import bazy danych

  1. W phpMyAdmin kliknij zakładkę "Import"
  2. Kliknij "Wybierz plik"
  3. Wybierz pobrany plik szkola.sql
  4. Kliknij "Wykonaj" na dole strony
  5. Baza danych szkola powinna pojawić się po lewej stronie

📊 Część 2: Struktura Bazy Danych

Baza szkola zawiera 4 tabele:

Tabela: uczniowie

Kolumna Typ Opis
id INT Unikalny identyfikator (klucz główny)
imie VARCHAR(50) Imię ucznia
nazwisko VARCHAR(50) Nazwisko ucznia
klasa VARCHAR(10) Oznaczenie klasy (np. 3A)
data_urodzenia DATE Data urodzenia

Tabela: nauczyciele

Kolumna Typ Opis
id INT Unikalny identyfikator
imie VARCHAR(50) Imię nauczyciela
nazwisko VARCHAR(50) Nazwisko nauczyciela
przedmiot VARCHAR(50) Przedmiot nauczany

Tabela: przedmioty

Kolumna Typ Opis
id INT Unikalny identyfikator
nazwa VARCHAR(50) Nazwa przedmiotu
nauczyciel_id INT ID nauczyciela (klucz obcy)

Tabela: oceny

Kolumna Typ Opis
id INT Unikalny identyfikator
uczen_id INT ID ucznia (klucz obcy)
przedmiot_id INT ID przedmiotu (klucz obcy)
ocena INT Wartość oceny (1-6)
data DATE Data wystawienia oceny

📝 Część 3: Podstawowe Zapytania SQL

Przykład 1: SELECT - Pobieranie wszystkich danych

-- Pokaż wszystkich uczniów SELECT * FROM uczniowie; -- Pokaż tylko imiona i nazwiska SELECT imie, nazwisko FROM uczniowie;
Wyjaśnienie: * oznacza "wszystkie kolumny". Możesz też wybrać konkretne kolumny oddzielone przecinkami.

Przykład 2: WHERE - Filtrowanie danych

-- Uczniowie z klasy 3A SELECT * FROM uczniowie WHERE klasa = '3A'; -- Uczniowie urodzeni po 2005 roku SELECT * FROM uczniowie WHERE data_urodzenia > '2005-01-01'; -- Uczniowie z nazwiskiem zaczynającym się na 'K' SELECT * FROM uczniowie WHERE nazwisko LIKE 'K%';

Przykład 3: ORDER BY - Sortowanie

-- Sortuj po nazwisku alfabetycznie SELECT * FROM uczniowie ORDER BY nazwisko ASC; -- Sortuj po dacie urodzenia (od najmłodszych) SELECT * FROM uczniowie ORDER BY data_urodzenia DESC;
ASC = rosnąco (A-Z, 1-9), DESC = malejąco (Z-A, 9-1)

Przykład 4: INSERT - Dodawanie danych

-- Dodaj nowego ucznia INSERT INTO uczniowie (imie, nazwisko, klasa, data_urodzenia) VALUES ('Jan', 'Kowalski', '1A', '2010-05-15'); -- Dodaj wielu uczniów naraz INSERT INTO uczniowie (imie, nazwisko, klasa, data_urodzenia) VALUES ('Anna', 'Nowak', '1A', '2010-03-20'), ('Piotr', 'Wiśniewski', '2B', '2009-11-10');

Przykład 5: UPDATE - Aktualizacja danych

-- Zmień klasę ucznia o ID 1 UPDATE uczniowie SET klasa = '2A' WHERE id = 1; -- Zmień wiele pól naraz UPDATE uczniowie SET imie = 'Janusz', klasa = '3B' WHERE id = 5;
UWAGA! Zawsze używaj WHERE w UPDATE! Bez niego zaktualizujesz WSZYSTKIE rekordy!

Przykład 6: DELETE - Usuwanie danych

-- Usuń ucznia o ID 10 DELETE FROM uczniowie WHERE id = 10; -- Usuń wszystkich uczniów z klasy 1C DELETE FROM uczniowie WHERE klasa = '1C';
OSTRZEŻENIE! DELETE bez WHERE usunie WSZYSTKIE rekordy! Bądź ostrożny!

🔗 Część 4: Łączenie Tabel (JOIN)

Przykład 7: INNER JOIN - Łączenie tabel

-- Pokaż oceny uczniów z imionami i nazwiskami SELECT uczniowie.imie, uczniowie.nazwisko, oceny.ocena, oceny.data FROM oceny INNER JOIN uczniowie ON oceny.uczen_id = uczniowie.id; -- Pokaż oceny z nazwami przedmiotów SELECT uczniowie.nazwisko, przedmioty.nazwa, oceny.ocena FROM oceny INNER JOIN uczniowie ON oceny.uczen_id = uczniowie.id INNER JOIN przedmioty ON oceny.przedmiot_id = przedmioty.id;

📊 Część 5: Funkcje Agregujące

Przykład 8: COUNT, AVG, SUM, MIN, MAX

-- Policz ilu jest uczniów SELECT COUNT(*) AS liczba_uczniow FROM uczniowie; -- Średnia ocen wszystkich uczniów SELECT AVG(ocena) AS srednia FROM oceny; -- Najwyższa i najniższa ocena SELECT MAX(ocena) AS najwyzsza, MIN(ocena) AS najnizsza FROM oceny; -- Ile uczniów jest w każdej klasie SELECT klasa, COUNT(*) AS liczba FROM uczniowie GROUP BY klasa;

✏️ ZADANIA PRAKTYCZNE

Zadanie 1: Podstawowe zapytania SELECT

ŁATWY

Wykonaj następujące zapytania:

  1. Wyświetl wszystkich uczniów
  2. Wyświetl tylko imiona i nazwiska uczniów
  3. Wyświetl uczniów z klasy 2B
  4. Wyświetl uczniów posortowanych alfabetycznie po nazwisku
  5. Wyświetl 5 pierwszych uczniów (użyj LIMIT 5)

Zadanie 2: Filtrowanie i wyszukiwanie

ŁATWY

Napisz zapytania które:

  1. Znajdą uczniów urodzonych po 2008 roku
  2. Znajdą uczniów z nazwiskiem zawierającym literę 'a'
  3. Pokażą nauczycieli matematyki
  4. Pokażą oceny lepsze niż 3
  5. Pokażą oceny z ostatnich 30 dni (użyj DATE_SUB)

Zadanie 3: Dodawanie i modyfikacja

ŚREDNI

Wykonaj następujące operacje:

  1. Dodaj siebie jako ucznia do tabeli uczniowie
  2. Dodaj nowego nauczyciela informatyki
  3. Dodaj przedmiot "Programowanie" z przypisaniem do nauczyciela
  4. Zmień swoją klasę na 4A
  5. Dodaj sobie ocenę 6 z programowania

Zadanie 4: Zapytania z JOIN

ŚREDNI

Stwórz zapytania które pokażą:

  1. Wszystkie oceny wraz z imionami i nazwiskami uczniów
  2. Oceny wraz z nazwami przedmiotów
  3. Kompletny widok: uczeń, przedmiot, ocena, data, nauczyciel
  4. Oceny ucznia o konkretnym ID (np. ID=1)
  5. Wszystkie oceny z matematyki

Zadanie 5: Funkcje agregujące i GROUP BY

ŚREDNI

Oblicz i wyświetl:

  1. Średnią ocen każdego ucznia
  2. Liczbę ocen dla każdego przedmiotu
  3. Najwyższą ocenę każdego ucznia
  4. Średnią ocen w każdej klasie
  5. Ile przedmiotów prowadzi każdy nauczyciel

Zadanie 6: Zaawansowane zapytania

TRUDNY

Wyzwania:

  1. Znajdź uczniów, którzy mają średnią powyżej 4.5
  2. Pokaż nauczycieli, którzy nie mają przypisanych przedmiotów (LEFT JOIN)
  3. Wyświetl TOP 3 uczniów z najlepszymi średnimi
  4. Policz ile uczniów otrzymało każdą ocenę (1-6)
  5. Znajdź przedmioty, z których nie ma jeszcze żadnych ocen
  6. Stwórz ranking klas według średniej ocen

Zadanie 7: Tworzenie własnej bazy

TRUDNY

Cel: Stwórz od zera bazę danych "biblioteka"

Wymagania:

  • Tabela "ksiazki" (id, tytul, autor, rok_wydania, isbn)
  • Tabela "czytelnicy" (id, imie, nazwisko, email, data_rejestracji)
  • Tabela "wypozyczenia" (id, ksiazka_id, czytelnik_id, data_wypozyczenia, data_zwrotu)
  • Dodaj klucze główne i obce
  • Wstaw przykładowe dane (min. 5 książek, 5 czytelników)
  • Napisz zapytania pokazujące:
    • Aktualnie wypożyczone książki
    • Historię wypożyczeń konkretnego czytelnika
    • Najpopularniejsze książki

💡 WSKAZÓWKI I NAJLEPSZE PRAKTYKI

1. Zawsze używaj WHERE w UPDATE i DELETE

Bez klauzuli WHERE zaktualizujesz lub usuniesz WSZYSTKIE rekordy!

-- ❌ ŹLE - usuwa wszystko! DELETE FROM uczniowie; -- ✅ DOBRZE - usuwa konkretny rekord DELETE FROM uczniowie WHERE id = 5;

2. Używaj aliasów dla czytelności

-- Zamiast długich nazw tabel SELECT u.imie, u.nazwisko, o.ocena FROM uczniowie AS u INNER JOIN oceny AS o ON u.id = o.uczen_id;

3. Testuj na kopii danych

Przed wykonaniem UPDATE/DELETE na prawdziwych danych, najpierw wykonaj SELECT z tymi samymi warunkami, żeby sprawdzić co zostanie zmienione:

-- Najpierw sprawdź co zostanie usunięte SELECT * FROM uczniowie WHERE klasa = '1C'; -- Jak już jesteś pewny, usuń DELETE FROM uczniowie WHERE klasa = '1C';

4. Używaj LIMIT do testowania

Gdy pracujesz z dużą ilością danych, użyj LIMIT:

-- Pokaż tylko 10 pierwszych wyników SELECT * FROM uczniowie LIMIT 10;

Częste błędy do uniknięcia:

  • ❌ Brak średnika na końcu zapytania
  • ❌ Brak apostrofów wokół tekstów: WHERE imie = Jan (powinno być 'Jan')
  • ❌ Używanie przecinka zamiast AND w WHERE: WHERE klasa = '1A', imie = 'Jan'
  • ❌ Literówki w nazwach kolumn lub tabel
  • ❌ Zapominanie o PRIMARY KEY przy tworzeniu tabel
  • ❌ UPDATE/DELETE bez WHERE (!!!)

📚 SQL Cheat Sheet

Podstawowe polecenia:

-- TWORZENIE BAZY CREATE DATABASE nazwa_bazy; USE nazwa_bazy; -- TWORZENIE TABELI CREATE TABLE tabela ( id INT PRIMARY KEY AUTO_INCREMENT, kolumna1 VARCHAR(50), kolumna2 INT ); -- POBIERANIE DANYCH SELECT * FROM tabela; SELECT kolumna1 FROM tabela WHERE kolumna2 = 10; -- DODAWANIE INSERT INTO tabela (kolumna1, kolumna2) VALUES ('wartość', 10); -- AKTUALIZACJA UPDATE tabela SET kolumna1 = 'nowa' WHERE id = 1; -- USUWANIE DELETE FROM tabela WHERE id = 1; -- SORTOWANIE SELECT * FROM tabela ORDER BY kolumna1 ASC; -- FUNKCJE AGREGUJĄCE SELECT COUNT(*) FROM tabela; SELECT AVG(kolumna2) FROM tabela; SELECT SUM(kolumna2) FROM tabela; -- GRUPOWANIE SELECT kolumna1, COUNT(*) FROM tabela GROUP BY kolumna1; -- ŁĄCZENIE TABEL SELECT t1.*, t2.kolumna FROM tabela1 t1 INNER JOIN tabela2 t2 ON t1.id = t2.tabela1_id;

🔍 Operatory w WHERE

Operator Opis Przykład
= Równe WHERE klasa = '3A'
!= Różne WHERE klasa != '1A'
> Większe WHERE ocena > 3
< Mniejsze WHERE ocena < 5
>= Większe lub równe WHERE ocena >= 4
LIKE Zawiera wzorzec WHERE nazwisko LIKE 'Kow%'
IN W zbiorze wartości WHERE klasa IN ('1A', '2A', '3A')
BETWEEN W zakresie WHERE ocena BETWEEN 3 AND 5
AND Oba warunki prawdziwe WHERE klasa='1A' AND ocena=6
OR Jeden z warunków prawdziwy WHERE klasa='1A' OR klasa='1B'

📊 Typy Danych MySQL

Typ Opis Przykład użycia
INT Liczba całkowita wiek, id, liczba_punktow
VARCHAR(n) Tekst do n znaków imie, nazwisko, email
TEXT Długi tekst opis, komentarz
DATE Data (YYYY-MM-DD) data_urodzenia
DATETIME Data i czas data_utworzenia
DECIMAL(m,d) Liczba dziesiętna cena, srednia
BOOLEAN Prawda/Fałsz (0/1) aktywny, zatwierdzony

🎓 Test Wiedzy

Pytania kontrolne - sprawdź swoją wiedzę!

  1. Co oznacza SQL? (Odp: Structured Query Language)
  2. Czym różni się SELECT od SELECT DISTINCT? (Odp: DISTINCT usuwa duplikaty)
  3. Co robi klucz główny (PRIMARY KEY)? (Odp: Unikalnie identyfikuje każdy rekord)
  4. Co to jest klucz obcy (FOREIGN KEY)? (Odp: Odniesienie do klucza głównego innej tabeli)
  5. Jaka jest różnica między INNER JOIN a LEFT JOIN? (Odp: INNER zwraca tylko dopasowane, LEFT wszystkie z lewej tabeli)
  6. Co robi funkcja COUNT(*)? (Odp: Liczy liczbę wierszy)
  7. Czym różni się WHERE od HAVING? (Odp: WHERE filtruje przed, HAVING po GROUP BY)
  8. Co oznacza AUTO_INCREMENT? (Odp: Automatyczne zwiększanie wartości)

🏆 Projekt Końcowy

Stwórz system zarządzania sklepem internetowym

Wymagania:

  • Tabele: produkty, kategorie, klienci, zamowienia, szczegoly_zamowien
  • Relacje między tabelami (klucze obce)
  • Minimum 20 produktów w różnych kategoriach
  • 10 przykładowych klientów
  • 5 przykładowych zamówień

Zapytania do wykonania:

  1. Wyświetl wszystkie produkty z danej kategorii
  2. Pokaż 10 najdroższych produktów
  3. Wyświetl historię zamówień konkretnego klienta
  4. Oblicz całkowitą wartość każdego zamówienia
  5. Znajdź najpopularniejsze produkty (najczęściej kupowane)
  6. Pokaż klientów, którzy wydali najwięcej pieniędzy
  7. Wyświetl produkty, które nigdy nie zostały kupione

🎉 PODSUMOWANIE

Gratulacje! Po ukończeniu tego ćwiczenia powinieneś umieć:

  • ✅ Tworzyć bazy danych i tabele
  • ✅ Wykonywać podstawowe zapytania SQL (SELECT, INSERT, UPDATE, DELETE)
  • ✅ Filtrować i sortować dane
  • ✅ Łączyć dane z wielu tabel (JOIN)
  • ✅ Używać funkcji agregujących
  • ✅ Projektować strukturę bazy danych
  • ✅ Pracować z XAMPP i phpMyAdmin

Następny krok: Naucz się łączyć MySQL z PHP, aby tworzyć dynamiczne strony internetowe!

Powodzenia w pracy z bazami danych! 🗄️🚀

💼 Dlaczego SQL jest ważny?

  • SQL jest używany przez 95% firm korzystających z baz danych
  • Umiejętność SQL to jedna z najczęściej wymaganych kompetencji w IT
  • Prawie każda aplikacja webowa korzysta z bazy danych
  • SQL jest niezależny od języka programowania
  • Znajomość SQL otwiera drzwi do kariery jako Database Administrator, Data Analyst czy Backend Developer