INF.03 Moduł 23 · Klasa 4 TI

Typy danych SQL

Dobieranie typów kolumn do projektu tabeli — ćwiczenia interaktywne na przykładzie różnych scenariuszy baz danych.

TYPY DANYCH VARCHAR / CHAR INT / DECIMAL DATE / DATETIME ENUM NOT NULL CHECK ALTER TABLE
📐
Sekcja 01 — Teoria – przegląd typów danych

Wybór właściwego typu danych dla każdej kolumny to jeden z najważniejszych kroków projektowania bazy. Zły dobór prowadzi do marnowania miejsca, błędów w obliczeniach i problemów z sortowaniem.

INT / SMALLINT / TINYINT
Liczby całkowite. Wybierz najmniejszy typ pasujący do zakresu wartości.
wiek TINYINT, id INT, rok SMALLINT
VARCHAR(n)
Tekst o zmiennej długości. n dobierz do realnej maks. długości pola.
imie VARCHAR(40), email VARCHAR(100)
CHAR(n)
Tekst o stałej długości — idealny gdy każdy wpis ma dokładnie tyle samo znaków.
pesel CHAR(11), skrot CHAR(2)
DECIMAL(x, y)
Dokładne wartości liczbowe z częścią dziesiętną. Zawsze dla pieniędzy.
cena DECIMAL(10,2), waga DECIMAL(6,3)
DATE / DATETIME
DATE — tylko data (RRRR-MM-DD). DATETIME — data i czas razem.
data_ur DATE, zamowiony_o DATETIME
ENUM('a','b',...)
Ograniczony zbiór dopuszczalnych wartości tekstowych. Chroni przed błędnymi danymi.
status ENUM('nowe','w toku','zamknięte')
TINYINT(1)
Wartość logiczna: 1 = prawda, 0 = fałsz. Używaj zamiast BOOLEAN.
aktywny TINYINT(1) DEFAULT 1
TEXT / BLOB
Długie teksty lub dane binarne. Używaj tylko gdy naprawdę potrzeba dużej ilości danych.
opis TEXT, zdjecie BLOB
Złota zasada Wybierz najmniejszy typ, który spełnia wymagania i przechowa wszystkie możliwe wartości. Nie używaj TEXT, jeśli wystarczy VARCHAR(200). Nie używaj INT, jeśli zakres mieści się w TINYINT.
🗄
Sekcja 02 — Projekt: Klinika weterynaryjna

Projekt VetClinic — system obsługi gabinetu weterynaryjnego. Encje i ich atrybuty wymagające doboru typów:

WŁAŚCICIELE
wlasciciel_idINT PKPK
imieVARCHAR(40)
telefonVARCHAR(15)
emailVARCHAR(100)
ZWIERZĘTA
zwierze_idINT PKPK
wlasciciel_idINT FKFK
imieVARCHAR(40)
gatunekENUM(...)
data_urDATE
waga_kgDECIMAL(5,2)
WIZYTY
wizyta_idINT PKPK
zwierze_idINT FKFK
data_wizytyDATETIME
diagnozaTEXT
kosztDECIMAL(8,2)
oplaconaTINYINT(1)
Sekcja 03 — Ćwiczenia – dobierz typy danych
01
Dopasuj typ danych do opisu kolumny
DOPASOWANIE
Zadanie Kliknij opis kolumny (lewa strona), a następnie odpowiadający mu typ SQL (prawa strona). Para zostanie oznaczona kolorem — zielonym jeśli poprawna, czerwonym jeśli błędna.

Opis pola

Numer PESEL (zawsze 11 cyfr)
Cena produktu w złotych (np. 129,99)
Data i godzina złożenia zamówienia
Status: „nowe", „w toku", „zamknięte"
Wiek ucznia (od 6 do 19 lat)
Długa treść artykułu — kilka akapitów

Typ SQL

ENUM('nowe','w toku','zamknięte')
CHAR(11)
TINYINT
DATETIME
TEXT
DECIMAL(10,2)
02
Uzupełnij CREATE TABLE — tabela ZWIERZĘTA
UZUPEŁNIANIE
Zadanie Wybierz z listy odpowiedni typ danych dla każdej kolumny. Po uzupełnieniu kliknij „Sprawdź".
CREATE TABLE zwierzeta (
  zwierze_id     PRIMARY KEY AUTO_INCREMENT,
  wlasciciel_id  NOT NULL,
  imie          NOT NULL,
  gatunek       -- pies, kot, królik, inne
  data_ur       ,
  waga_kg       CHECK(waga_kg > 0),
  FOREIGN KEY(wlasciciel_id) REFERENCES wlasciciele(wlasciciel_id)
);
03
Znajdź i popraw błędnie dobrane typy
ANALIZA BŁĘDÓW
Zadanie Poniższa tabela klienci zawiera 4 błędnie dobrane typy. Kliknij każdą linię, która zawiera błąd — zaznaczone linie podświetlą się. Następnie sprawdź rozwiązanie.
CREATE TABLE klienci (
  id              INT PRIMARY KEY AUTO_INCREMENT,
  imie            TEXT NOT NULL,
  nazwisko        TEXT NOT NULL,
  telefon         INT,
  data_urodzenia  VARCHAR(20),
  aktywny         TINYINT(1) DEFAULT 1
);

Kliknij linie zawierające błędy (możesz kliknąć kilka).

04
Napisz CREATE TABLE dla tabeli WIZYTY
CREATE TABLE
Zadanie Na podstawie schematu z sekcji 02 utwórz tabelę wizyty. Pamiętaj o:
  • Kluczu głównym z AUTO_INCREMENT.
  • Kluczu obcym do tabeli zwierzeta.
  • Odpowiednim typie dla kolumny koszt (wartość pieniężna).
  • Kolumnie oplacona jako wartości logicznej.
  • Kolumnie diagnoza — może być długim tekstem.
-- Tabela wizyt w klinice weterynaryjnej
CREATE TABLE wizyty (
  wizyta_id   INT          PRIMARY KEY AUTO_INCREMENT,
  zwierze_id  INT          NOT NULL,
  data_wizyty DATETIME     NOT NULL,
  diagnoza    TEXT,
  koszt       DECIMAL(8,2) CHECK(koszt >= 0),
  oplacona    TINYINT(1)   DEFAULT 0,
  FOREIGN KEY(zwierze_id) REFERENCES zwierzeta(zwierze_id)
);
05
Zastosuj ENUM i CHECK do ograniczeń danych
OGRANICZENIA
Zadanie Tabela przesylki w firmie kurierskiej powinna zawierać:
  • Kolumnę status mogącą przyjąć wartości: nadana, w trasie, doręczona, zwrot — użyj ENUM.
  • Kolumnę waga_kg z wartością większą od 0 — użyj CHECK.
  • Kolumnę ubezpieczona jako wartość logiczną z domyślnym: NIE.
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   DECIMAL(10,2) CHECK(wartosc >= 0),
  status    ENUM('nadana', 'w trasie', 'doreczona', 'zwrot') DEFAULT 'nadana',
  ubezpieczona TINYINT(1)                                   DEFAULT 0
);
📊
Sekcja 04 — Zadanie projektowe — własna tabela

INF.03 PROJEKT — DOBÓR TYPÓW

Zaprojektuj tabelę pracownicy dla systemu HR małej firmy. Tabela powinna zawierać co najmniej 8 kolumn.

Wymagania:

  1. Klucz główny z AUTO_INCREMENT.
  2. Imię i nazwisko — odpowiedni typ znakowy zmiennej długości.
  3. Numer PESEL — stała długość, unikalny.
  4. Data zatrudnienia — tylko data, bez czasu.
  5. Wynagrodzenie — dokładny typ dziesiętny, wartość ≥ minimalnego wynagrodzenia.
  6. Stanowisko — wybór z: „junior", „mid", „senior", „kierownik".
  7. Email służbowy — unikalny.
  8. Czy aktualnie zatrudniony — wartość logiczna, domyślnie TAK.
CREATE TABLE pracownicy (
  id               INT           PRIMARY KEY AUTO_INCREMENT,
  imie             VARCHAR(40)   NOT NULL,
  nazwisko         VARCHAR(50)   NOT NULL,
  pesel            CHAR(11)      UNIQUE NOT NULL,
  data_zatrudnienia DATE          NOT NULL,
  wynagrodzenie    DECIMAL(10,2) CHECK(wynagrodzenie >= 4300.00),
  stanowisko       ENUM('junior', 'mid', 'senior', 'kierownik') NOT NULL,
  email            VARCHAR(100)  UNIQUE NOT NULL,
  zatrudniony      TINYINT(1)    DEFAULT 1
);
Sekcja 05 — Quiz — sprawdź, czy rozumiesz typy danych
Q1 — Który typ najlepiej nadaje się do przechowywania numeru telefonu?
Q2 — Dlaczego DATE jest lepsze niż VARCHAR(20) dla dat?
Q3 — Co odróżnia CHAR(n) od VARCHAR(n)?
Q4 — Dlaczego ceny i kwoty pieniężne przechowuje się jako DECIMAL, a nie FLOAT?
Q5 — Do czego służy typ ENUM?
Sekcja 06 — Checklista — definicje tabel i typy danych

Postęp: 0 / 8