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.03Typ 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.
| Informacja | Rozsądny wybór w MySQL/MariaDB | Uzasadnienie |
|---|---|---|
| Liczba sztuk | INT | Wartość całkowita; dodatkowo CHECK lub walidacja zakresu. |
| Cena | DECIMAL(10,2) | 10 cyfr łącznie, 2 po przecinku. Arytmetyka dziesiętna, odpowiednia do kwot. |
| Nazwa produktu | VARCHAR(120) | Tekst zmiennej długości z ustalonym limitem. |
| Kod pocztowy | CHAR(6) | Format 00-000, a nie liczba do obliczeń. |
| Data zamówienia | DATE | Data kalendarzowa, np. 2026-02-03. |
| Moment zdarzenia | DATETIME lub TIMESTAMP | Wybór zależy m.in. od zakresu i obsługi stref czasowych. |
| Opis | TEXT | Dłuższa treść; nie każda kolumna wymaga dużego typu. |
| Plik binarny | BLOB | Bajty, 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.
'' 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.
Podobny cel, inne nazwy typów
| Cel | MySQL/MariaDB | SQL Server | Oracle 19c | Access/ACE |
|---|---|---|---|---|
| Kwota | DECIMAL(10,2) | DECIMAL(10,2) | NUMBER(10,2) | CURRENCY (4 miejsca dziesiętne) |
| Krótki tekst | VARCHAR(120), utf8mb4 | NVARCHAR(120) | VARCHAR2(120 CHAR) | TEXT(120) |
| Data | DATE | DATE | DATE zawiera też czas | DATETIME |
| Tak/nie | BOOLEAN jest aliasem TINYINT(1) | BIT | W 19c brak typu BOOLEAN kolumny SQL; np. CHAR(1) z CHECK | YESNO / 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
- Dobierz typy do: liczby punktów, numeru telefonu, kwoty faktury i daty urodzenia. Uzasadnij, dlaczego telefon nie powinien być INT.
- W edytorze wyświetl klientów z nieznanym miastem. Następnie zamień IS NULL na = NULL i porównaj wynik.
- 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.

