Lekcja 2. DDL — tworzenie struktury bazy danych
PodstawowyPo co się tego uczymy?
Zanim wstawisz do bazy choćby jeden rekord, musisz mieć gdzie go wstawić — czyli zbudowaną tabelę z odpowiednimi kolumnami i typami danych. DDL to właśnie ten "budowlany" fragment SQL-a.
Teoria
DDL (ang. Data Definition Language — język definiowania danych) to część SQL-a odpowiedzialna za definiowanie STRUKTURY bazy danych: jakie są tabele, jakie mają kolumny i jakie typy danych — a nie za same dane w tych tabelach (tym zajmuje się DML, o którym będzie osobna lekcja). Można to porównać do stolarza, który buduje półki (DDL), zanim ktokolwiek zacznie na nie układać rzeczy (DML).
Poniżej najważniejsze polecenia DDL — każde ze składnią i kilkoma przykładami.
CREATE DATABASE — tworzy nową, pustą bazę danych.
CREATE DATABASE sklep;
CREATE DATABASE szkola;
CREATE DATABASE IF NOT EXISTS biblioteka;
Trzeci przykład jest bezpieczny — jeśli baza biblioteka już istnieje, polecenie nic nie zepsuje, tylko zostanie zignorowane zamiast zgłosić błąd.
CREATE TABLE — tworzy nową tabelę z listą kolumn, ich typów i ograniczeń.
CREATE TABLE Uczniowie (
id_ucznia INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(50) NOT NULL,
srednia_ocen DECIMAL(3,2)
);
CREATE TABLE Ksiazki (
id_ksiazki INT AUTO_INCREMENT PRIMARY KEY,
tytul VARCHAR(150) NOT NULL,
rok_wydania INT
);
ALTER TABLE — zmienia strukturę już istniejącej tabeli. Trzy najczęstsze warianty:
-- dodanie nowej kolumny
ALTER TABLE Uczniowie ADD COLUMN email VARCHAR(100);
-- zmiana typu istniejącej kolumny
ALTER TABLE Uczniowie MODIFY COLUMN email VARCHAR(150);
-- usunięcie kolumny
ALTER TABLE Uczniowie DROP COLUMN email;
DROP TABLE i DROP DATABASE — usuwają całą tabelę albo bazę danych razem ze wszystkimi danymi. To operacja nieodwracalna.
DROP TABLE Ksiazki;
DROP DATABASE IF EXISTS testowa_baza;
Najczęściej używane typy danych w CREATE TABLE: INT (liczba całkowita), VARCHAR(n) (tekst do n znaków), DECIMAL(p, s) (liczba dziesiętna — idealna do cen i średnich), DATE (data), TINYINT (bardzo mała liczba, często 0/1).
Ograniczenia (constraints), które dodajesz przy kolumnie: PRIMARY KEY (klucz główny), NOT NULL (kolumna musi mieć wartość), UNIQUE (wartości się nie powtarzają), DEFAULT (wartość domyślna), AUTO_INCREMENT (numer nadawany automatycznie przez bazę).
Dobre nawyki przy pisaniu DDL: trzymaj się jednej konwencji nazewnictwa w całej bazie (np. zawsze nazwy tabel w liczbie pojedynczej, zawsze PascalCase — nie mieszaj stylów w jednym projekcie); unikaj polskich znaków i spacji w nazwach tabel i kolumn; zawsze definiuj PRIMARY KEY dla każdej tabeli; wcinaj kolumny w CREATE TABLE tak jak w przykładach powyżej, żeby struktura była czytelna na pierwszy rzut oka; nie nazywaj kolumn tak samo jak słowa kluczowe SQL (unikaj np. kolumny o nazwie order albo group).
Schemat
Przykład z życia
Wyobraź sobie, że dostajesz zlecenie: sklep internetowy potrzebuje nowej funkcji — klienci mają móc wystawiać opinie o produktach. Zanim cokolwiek zaprogramujesz w aplikacji, musisz najpierw utworzyć w bazie tabelę Opinie z odpowiednimi kolumnami (treść, ocena, data, kto i o jaki produkt). To jest praca z DDL.
Kod (SQL)
-- Tworzymy nową bazę danych i przełączamy się na nią
CREATE DATABASE sklep;
USE sklep;
-- Tworzymy tabelę Produkty ze zestawem typów danych i ograniczeń
CREATE TABLE Produkty (
id_produktu INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(100) NOT NULL,
cena DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
ilosc_na_stanie INT NOT NULL DEFAULT ,
data_dodania DATE NOT NULL
);
-- Dodajemy nową kolumnę do już istniejącej tabeli
ALTER TABLE Produkty ADD COLUMN kategoria VARCHAR(50);
-- Zmieniamy typ istniejącej kolumny
ALTER TABLE Produkty MODIFY COLUMN kategoria VARCHAR(80);
-- Usuwamy kolumnę, która okazała się niepotrzebna
ALTER TABLE Produkty DROP COLUMN ilosc_na_stanie;
-- Usuwamy całą tabelę (nieodwracalne!)
-- DROP TABLE Produkty;
Komentarz i wyjaśnienie kodu
Kolumna id_produktu jest kluczem głównym z AUTO_INCREMENT, więc baza sama nadaje kolejne numery — nie musisz ich wymyślać przy każdym INSERT. cena ma typ DECIMAL(10,2), a nie INT czy FLOAT, bo dla pieniędzy potrzebujesz dokładnej wartości co do grosza, bez błędów zaokrągleń. Zauważ też kolejność: najpierw tworzymy tabelę z pewnym zestawem kolumn, a dopiero potem, w osobnych poleceniach ALTER TABLE, dodajemy, zmieniamy i usuwamy kolumny — to pokazuje, że struktura bazy danych może ewoluować razem z aplikacją, a nie musi być idealna od pierwszego dnia.
Ćwiczenie samodzielne
Utwórz tabelę Uczniowie z kolumnami: id_ucznia (klucz główny z autonumeracją), imie, nazwisko (oba wymagane), data_urodzenia oraz srednia_ocen (liczba z jednym miejscem po przecinku). Potem dopisz do niej kolumnę adres_email.
Zadania do pracy własnej
Zadanie 1. Budowa własnej bazy w XAMPP
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Sklep muzyczny (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Utwórz bazę o nazwie pracownia_sql.
- Utwórz tabelę Stanowiska z kluczem głównym.
- Utwórz tabelę Uczniowie z imieniem, nazwiskiem, klasą i e-mailem.
- Dodaj do tabeli Uczniowie kolumnę numer_dziennika.
- Zmień typ kolumny email na VARCHAR(120).
- Dodaj ograniczenie UNIQUE na email.
- Utwórz tabelę Oceny powiązaną z uczniem kluczem obcym.
- Wyświetl strukturę utworzonych tabel.
- Wyczyść tabelę testową poleceniem TRUNCATE.
- Usuń tabelę testową poleceniem DROP TABLE.
Zadanie 2. Odtwórz strukturę biblioteki
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Biblioteka szkolna (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Utwórz bazę o nazwie pracownia_sql.
- Utwórz tabelę Stanowiska z kluczem głównym.
- Utwórz tabelę Uczniowie z imieniem, nazwiskiem, klasą i e-mailem.
- Dodaj do tabeli Uczniowie kolumnę numer_dziennika.
- Zmień typ kolumny email na VARCHAR(120).
- Dodaj ograniczenie UNIQUE na email.
- Utwórz tabelę Oceny powiązaną z uczniem kluczem obcym.
- Wyświetl strukturę utworzonych tabel.
- Wyczyść tabelę testową poleceniem TRUNCATE.
- Usuń tabelę testową poleceniem DROP TABLE.
Zadanie 3. Rozszerz bazę apteki
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Apteka Zdrowie (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Utwórz bazę o nazwie pracownia_sql.
- Utwórz tabelę Stanowiska z kluczem głównym.
- Utwórz tabelę Uczniowie z imieniem, nazwiskiem, klasą i e-mailem.
- Dodaj do tabeli Uczniowie kolumnę numer_dziennika.
- Zmień typ kolumny email na VARCHAR(120).
- Dodaj ograniczenie UNIQUE na email.
- Utwórz tabelę Oceny powiązaną z uczniem kluczem obcym.
- Wyświetl strukturę utworzonych tabel.
- Wyczyść tabelę testową poleceniem TRUNCATE.
- Usuń tabelę testową poleceniem DROP TABLE.
Typowe błędy
Najczęstszy błąd to próba utworzenia tabeli z kluczem obcym wskazującym na tabelę, która jeszcze nie istnieje — SQL zgłosi błąd, trzeba pilnować kolejności CREATE TABLE. Drugi błąd to użycie INT albo FLOAT zamiast DECIMAL do przechowywania cen, co prowadzi do błędów zaokrągleń przy obliczeniach finansowych. Trzeci błąd to zapominanie o NOT NULL przy kolumnach, które zawsze muszą mieć wartość (np. imię ucznia) — bez tego baza pozwoli zapisać pusty rekord.
Nawiązanie do egzaminu zawodowego
DDL to fundament kwalifikacji INF.03.4, efekt "stosuje strukturalny język zapytań SQL" oraz "tworzy relacyjne bazy danych zgodnie z projektem" — w części praktycznej egzaminu regularnie trzeba samodzielnie utworzyć tabele w phpMyAdmin lub podobnym narzędziu na podstawie podanego opisu lub diagramu.