SQL
Definiowanie typów danych zgodnie z projektem
Dobór, optymalizacja, oszczędność miejsca i wydajność — INF.03 Dział V
Teoria Typy danych — jak mądrze projektować tabelę?
- Wybór typu danych wpływa na wydajność, rozmiar bazy i poprawność danych.
- INT, SMALLINT, TINYINT – liczby całkowite, do identyfikatorów, wieku, liczników.
- VARCHAR(n) – tekst o zmiennej długości, n dobieraj do realnej maksymalnej długości.
- CHAR(n) – tekst o stałej długości (np. PESEL, kody, skróty).
- DATE, DATETIME – daty oraz data+czas, ułatwiają sortowanie i filtrowanie.
- DECIMAL(x,y) – wartości pieniężne i dokładne obliczenia, FLOAT/DOUBLE – przybliżone.
- BOOLEAN/TINYINT(1) – wartości prawda/fałsz.
- ENUM – ograniczony zbiór dopuszczalnych wartości (status, kategoria).
- TEXT, BLOB – duże teksty/opisy lub dane binarne, używaj tylko gdy naprawdę potrzebne.
Podstawowa zasada: wybierz najmniejszy typ, który spełnia wymagania i pozwala przechować wszystkie możliwe wartości.
Ćwiczenie 1 Dobór typów dla tabeli „uczniowie”
Zadanie: Wybierz typy kolumn dla tabeli
uczniowie.
Pola: id, imie, nazwisko, pesel, wiek, email, data_ur, aktywny (czy nadal uczy się w szkole).
- Dla identyfikatora użyj typu całkowitego z AUTO_INCREMENT.
- Dla PESEL wybierz typ o stałej długości.
- Dla „aktywny” użyj typu logicznego/małej liczby.
CREATE TABLE uczniowie ( id INT PRIMARY KEY AUTO_INCREMENT, imie VARCHAR(30) NOT NULL, nazwisko VARCHAR(40) NOT NULL, pesel CHAR(11) UNIQUE, -- stała długość wiek TINYINT CHECK (wiek BETWEEN 6 AND 25), email VARCHAR(80) UNIQUE, data_ur DATE, aktywny TINYINT(1) DEFAULT 1 -- 1 = aktywny, 0 = nieaktywny );
Ćwiczenie 2 Tabela „produkty” dla sklepu
Zadanie: Zaprojektuj tabelę
produkty: id, nazwa, cena, ilosc, data_dodania, opis, aktywny.
- Dla ceny użyj typu dokładnego (DECIMAL).
- Dla ilości wybierz typ wystarczający dla magazynu.
- Dla opisu użyj typu umożliwiającego dłuższy tekst.
CREATE TABLE produkty ( id INT PRIMARY KEY AUTO_INCREMENT, nazwa VARCHAR(70) NOT NULL, cena DECIMAL(10,2) CHECK (cena >= 0), ilosc SMALLINT UNSIGNED DEFAULT 0, data_dodania DATETIME DEFAULT CURRENT_TIMESTAMP, opis TEXT, aktywny TINYINT(1) DEFAULT 1 );
Ćwiczenie 3 Typy dla „zamowienia” i statusów
Zadanie: Zaprojektuj kolumnę
status w tabeli zamowienia, która może przyjmować tylko: „nowe”, „w realizacji”, „zrealizowane”, „anulowane”.
Dodaj też pole wartosc i data_zamowienia.
- Ogranicz dopuszczalne wartości statusu.
- Dla wartości zamówienia użyj DECIMAL.
- Dla daty zamówienia użyj odpowiedniego typu czasowego.
CREATE TABLE zamowienia (
id INT PRIMARY KEY AUTO_INCREMENT,
klient_id INT NOT NULL,
wartosc DECIMAL(10,2) CHECK (wartosc >= 0),
data_zamowienia DATETIME DEFAULT CURRENT_TIMESTAMP,
status ENUM('nowe', 'w realizacji', 'zrealizowane', 'anulowane') DEFAULT 'nowe'
);
Ćwiczenie 4 Oszczędność miejsca – tabela logów
Zadanie: Dobierz typy tak, by każdy log zajmował minimalną ilość miejsca.
Pola: id, typ_zdarzenia (login, zapis, błąd), opis (krótki), data_zdarzenia, udany (tak/nie).
- Użyj małych typów numerycznych lub ENUM.
- Opis ogranicz do rozsądnej długości.
- Dodaj pole logiczne dla wyniku operacji.
CREATE TABLE logi (
id INT PRIMARY KEY AUTO_INCREMENT,
typ_zdarzenia ENUM('login', 'zapis', 'blad') NOT NULL,
opis VARCHAR(80),
data_zdarzenia DATETIME DEFAULT CURRENT_TIMESTAMP,
udany TINYINT(1) DEFAULT 1
);
Ćwiczenie 5 Korekta źle dobranych typów
Sytuacja: Istnieje tabela
klienci:
CREATE TABLE klienci ( id INT, imie TEXT, nazwisko TEXT, telefon INT, data_urodzenia VARCHAR(20) );Zadanie: Zaproponuj lepsze typy i pokaż ALTER TABLE, który poprawi strukturę.
- Zamień TEXT na VARCHAR o rozsądnej długości.
- Zamień telefon z INT na typ znakowy (numery z wiodącym zerem, znaki „+”).
- Zamień datę z VARCHAR na DATE.
ALTER TABLE klienci MODIFY id INT PRIMARY KEY AUTO_INCREMENT, MODIFY imie VARCHAR(30) NOT NULL, MODIFY nazwisko VARCHAR(40) NOT NULL, MODIFY telefon VARCHAR(15), MODIFY data_urodzenia DATE;
Zadanie INF.03 Analiza wymagań i dobór typów
Opis: Firma kurierska potrzebuje tabeli
przesylki z polami:
- id przesyłki,
- numer listu przewozowego (max 15 znaków, czasem z literami),
- waga w kg (dokładność do 0,01),
- wartosc zadeklarowana (zł),
- data_nadania, data_doreczenia,
- status („nadana”, „w trasie”, „doręczona”, „zwrot”),
- ubezpieczona (tak/nie).
- Dobierz typy danych dla każdego pola.
- Zapisz definicję tabeli w SQL.
CREATE TABLE przesylki (
id INT PRIMARY KEY AUTO_INCREMENT,
nr_listu VARCHAR(15) NOT NULL UNIQUE,
waga_kg DECIMAL(6,2) CHECK (waga_kg >= 0),
wartosc_zl DECIMAL(10,2) CHECK (wartosc_zl >= 0),
data_nadania DATETIME NOT NULL,
data_doreczenia DATETIME,
status ENUM('nadana', 'w trasie', 'doreczona', 'zwrot') DEFAULT 'nadana',
ubezpieczona TINYINT(1) DEFAULT 0
);
Quiz Sprawdź wiedzę o typach danych!
- Kiedy użyć CHAR zamiast VARCHAR?
- Jaki typ będzie optymalny dla kolumny „wiek” w bazie szkoły?
- Jak ograniczyć ilość miejsca zajmowanego przez opis produktu?
- Jaki typ wybrać dla pola „cena” w sklepie internetowym?
- Czym różni się DATE od DATETIME?
- Dlaczego nie powinno się przechowywać dat w kolumnach VARCHAR?
- Gdy długość jest zawsze taka sama (np. PESEL, kod kraju, skrót klasy).
- Najczęściej TINYINT lub SMALLINT, bo zakres wartości jest niewielki.
- Ustalić maksymalną długość (np. VARCHAR(100)) zamiast TEXT, jeśli nie trzeba bardzo długiego tekstu.
- DECIMAL(x,2), aby przechować wartości pieniężne bez błędów zaokrągleń.
- DATE zapisuje tylko rok‑miesiąc‑dzień, DATETIME dodatkowo godzinę, minutę i sekundę.
- Bo utrudnia to sortowanie, filtrowanie, walidację i wymaga konwersji typów przy obliczeniach.
Checklista Sprawdź umiejętności
- Dobieram typy danych zgodnie z projektem i rzeczywistymi zakresami wartości.
- Optymalizuję rozmiar tabel, stosując najmniejsze sensowne typy.
- Poprawnie wykorzystuję typy znakowe, liczbowe oraz daty i czas.
- Stosuję ograniczenia CHECK, UNIQUE, NOT NULL dla poprawy jakości danych.
Materiały: INF.03 — Typy danych w SQL · Autor: Tomasz Puchała © 2025