SQL od podstaw · część 06

Typy danych i NULL

Wybierz właściwy typ i odróżnij brak wartości od zera. W Edytorze SQL sprawdzisz własne zapytania na syntetycznych danych.

Część bazodanowa INF.03

Typ mówi, jakie dane mają sens

Liczba sztuk, cena i numer telefonu wyglądają podobnie tylko na ekranie. Liczbę sztuk dodajesz, cenę rozliczasz z określoną dokładnością, a w telefonie chcesz zachować znak + i początkowe zera. Dobry typ ogranicza błędy, określa dozwolone operacje i wpływa na zajmowane miejsce.

InformacjaRozsądny wybór w MySQL/MariaDBUzasadnienie
Liczba sztukINTWartość całkowita; dodatkowo CHECK lub walidacja zakresu.
CenaDECIMAL(10,2)10 cyfr łącznie, 2 po przecinku. Arytmetyka dziesiętna, odpowiednia do kwot.
Nazwa produktuVARCHAR(120)Tekst zmiennej długości z ustalonym limitem.
Kod pocztowyCHAR(6)Format 00-000, a nie liczba do obliczeń.
Data zamówieniaDATEData kalendarzowa, np. 2026-02-03.
Moment zdarzeniaDATETIME lub TIMESTAMPWybór zależy m.in. od zakresu i obsługi stref czasowych.
OpisTEXTDłuższa treść; nie każda kolumna wymaga dużego typu.
Plik binarnyBLOBBajty, które nie są tekstem.

FLOAT i DOUBLE są przybliżone. Służą np. do pomiarów; nie zastępują automatycznie DECIMAL w rozliczeniach. DECIMAL(10,2) nie oznacza dziesięciu cyfr przed przecinkiem. W SQL zapisujesz literał 19.90 z kropką, nawet gdy aplikacja pokazuje użytkownikowi 19,90 zł.

NULL: nie znam wartości

NULL oznacza brak znanej lub właściwej wartości. Zero jest znaną liczbą, pusty napis '' jest tekstem o długości zero, a 'NULL' jest czteroliterowym tekstem. Nie zapisuj słowa „brak” w liczbowej kolumnie ceny. To miesza dane z ich prezentacją.

SELECT id, imie, email
FROM klienci
WHERE email IS NULL
ORDER BY id;

W danych edytora zapytanie wybierze Jana i Adama. IS NULL sprawdza brak wartości. Zapis email = NULL nie jest jego zamiennikiem: porównanie daje UNKNOWN, a WHERE zachowuje tylko wiersze, dla których warunek jest prawdziwy. NOT NULL w definicji kolumny zabrania braku wartości; nie zabrania automatycznie pustego tekstu.

Pułapka Oracle 19c. Oracle traktuje pusty tekst jako NULL. Dlatego nie zakładaj, że rozróżnienie '' i NULL działa identycznie w każdej bazie. W Access dopuszczanie pustego tekstu i wymaganie wartości to odrębne właściwości pola.

Ten sam brak danych w różnych silnikach

Wszystkie poniższe zapytania wyświetlają napis „brak” przy nieznanym adresie e-mail. Zakładamy tekstową kolumnę email oraz istniejącą tabelę klienci. Przykłady z Access uruchamiaj w kwerendzie Access; funkcja Nz należy do środowiska aplikacji.

MySQL / MariaDB

SELECT imie,
 IFNULL(email, 'brak') AS kontakt
FROM klienci;

SQL Server

SELECT imie,
 ISNULL(email, 'brak') AS kontakt
FROM klienci;

Oracle 19c

SELECT imie,
 NVL(email, 'brak') AS kontakt
FROM klienci;

Microsoft Access

SELECT imie,
 Nz(email, 'brak') AS kontakt
FROM klienci;

MySQL, MariaDB, SQL Server i Oracle mają również COALESCE, które wybiera pierwszy argument różny od NULL. W edytorze ćwicz wspólną wersję:

SELECT imie, COALESCE(email, 'brak') AS kontakt
FROM klienci ORDER BY id;

To formatowanie wyniku, nie aktualizacja tabeli. Szczegóły ustalania typu i długości wyniku ISNULL, NVL i COALESCE różnią się; przy mieszaniu typów używaj jawnych konwersji zgodnych z konkretnym silnikiem.

Edytor SQL — własne zapytania

Uruchomienie jest lokalne w pamięci przeglądarki. Typy i zachowanie pozostają właściwościami SQLite; nie sprawdzaj tutaj ścisłego DECIMAL, dat, AUTO_INCREMENT ani IDENTITY.

Przygotowanie edytora…

Podobny cel, inne nazwy typów

CelMySQL/MariaDBSQL ServerOracle 19cAccess/ACE
KwotaDECIMAL(10,2)DECIMAL(10,2)NUMBER(10,2)CURRENCY (4 miejsca dziesiętne)
Krótki tekstVARCHAR(120), utf8mb4NVARCHAR(120)VARCHAR2(120 CHAR)TEXT(120)
DataDATEDATEDATE zawiera też czasDATETIME
Tak/nieBOOLEAN jest aliasem TINYINT(1)BITW 19c brak typu BOOLEAN kolumny SQL; np. CHAR(1) z CHECKYESNO / BIT

To odpowiedniki przeznaczenia, a nie gwarancja identycznego zakresu i zachowania. W SQL Server prefiks N przed literałem, np. N'Łódź', jest istotny przy tekstach Unicode. W Oracle semantyka długości BYTE/CHAR oraz zestaw znaków wpływają na miejsce na tekst. Nie przenoś ograniczeń długości lub reguł konwersji z SQLite na serwer.

Ćwiczenia

  1. Dobierz typy do: liczby punktów, numeru telefonu, kwoty faktury i daty urodzenia. Uzasadnij, dlaczego telefon nie powinien być INT.
  2. W edytorze wyświetl klientów z nieznanym miastem. Następnie zamień IS NULL na = NULL i porównaj wynik.
  3. Wyświetl imiona oraz miasta, zastępując brak miasta napisem „nie podano”. Nie zmieniaj danych w tabeli.
Rozwiązania i oczekiwane wyniki

1. Np. INT, VARCHAR o uzasadnionym limicie, DECIMAL z właściwą precyzją i DATE. Telefon może zaczynać się zerem lub + i nie służy do dodawania.

SELECT imie FROM klienci WHERE miasto IS NULL;
SELECT imie FROM klienci WHERE miasto = NULL;
SELECT imie, COALESCE(miasto, 'nie podano') AS miasto
FROM klienci ORDER BY id;

2. Pierwsze zapytanie zwraca Ewę, drugie nie zwraca wierszy. 3. Wynik zawiera pięciu klientów, z napisem „nie podano” przy Ewie. Reset przywraca dane, jeżeli wcześniej je zmodyfikowano.

Źródła: typy MySQL 8.4, typy SQL Server, NULL w Oracle 19c. Powiązanie z INF.03.4: dobór typów, projektowanie struktury i zapytania. Dalej: CREATE, ograniczenia i automatyczne identyfikatory.

Przewijanie do góry