Lekce 8 - MS-SQL krok za krokem: Datové typy a NULL
V předešlém cvičení, Řešené úlohy k 7. lekci MS-SQL, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Dnes se v MS-SQL tutoriálu vrátíme k datovým typům, představíme si
tabulky těch nejdůležitějších a řekneme si něco o hodnotě
NULL.
Datové typy
Hned na začátku našeho on-line kurzu MS-SQL jsme si uvedli několik
základních datových typů. Tehdy jsem vám s nimi nechtěl motat hlavu. Řeč
byla o typech INT, VARCHAR a DATE.
Databáze (konkrétně zde MS-SQL) jich má samozřejmě mnohem více. Uveďme
si několik tabulek a představme si ty nejdůležitější.
Celá čísla
Pro celá čísla používáme tyto datové typy:
| Typ | Rozsah | Velikost |
|---|---|---|
TINYINT |
0 až 255 | 8 bitů |
SMALLINT |
-32 768 až 32 767 | 16 bitů |
INT |
-2 147 483 648 až 2 147 483 647 | 32 bitů |
BIGINT |
-9 223 372 036 854 775 808 až 9 223 372 036 854 775 807 | 64 bitů |
Pokud hledáte datový typ boolean (hodnoty
true/false), tak k ukládání této hodnoty se
zpravidla používá typ BIT (0/1).
Texty
Již víme, že existují i typy VARCHAR a CHAR. Ty
ale nepodporují Unicode kódování a mohli bychom v nich mít problémy s
diakritikou. Proto místo nich budeme používat typy:
| Typ | Rozsah |
|---|---|
NVARCHAR (max. počet znaků) |
počet znaků jaký si zvolíme |
NCHAR (počet znaků) |
pevný počet znaků jaký si zvolíme |
N v datových typech označuje National, jako mezinárodní.
Zajímavá situace nastane, když zapíšeme datový typ jako
NVARCHAR (MAX). V tuto chvíli je délka textu neomezená
(prakticky je tam limit asi 2GB, což jednou hodnotou jen těžko zaplníme).
Pro dlouhé texty se v minulosti používal typ NTEXT, který je
ovšem nyní zastaralý.
Ostatní
Dále se nám budou ještě hodit následující datové typy:
| Typ | Popis |
|---|---|
DATE |
Datum jako textový řetězec ve tvaru 'YYYY-MM-DD', rozsah od
'0001-01-01' do '9999-12-31' |
TIME |
Čas jako textový řetězec ve tvaru 'hh:mm:ss' |
DATETIME2 |
Prakticky je to zřetězení data a času:
'YYYY-MM-DD hh:mm:ss' (případně
'YYYY-MM-DDThh:mm:ss') |
BLOB a spol. |
Obecná data v binárním tvaru. Umožňují do databáze ukládat např. obrázky nebo jiné soubory. |
Hodnota NULL
Datové typy v databázích se malinko odlišují od datových typů, jak je
známe v programovacích jazycích. Zatímco třeba v jazyce C může mít typ int hodnoty jen
nějakých -32 768 až 32 767 a nic kromě toho, databázový INT
může nabývat i hodnoty NULL. NULL nemá vůbec nic
společného s nulou (0), označuje to, že hodnota nebyla
ještě zadána. Filozofie databází je takto postavena, nezadané
hodnoty mají výchozí hodnotu NULL (pokud jim nenastavíme jinou)
a každý datový typ má kromě hodnot, které bychom v něm očekávali,
navíc možnou hodnotu NULL. Datovému typu tuto hodnotu můžeme i
zakázat, více dále.
Pokud si vzpomínáme, když jsme vytvářeli databázi a tabulku
Uzivatele, odškrtávali jsme Allow Nulls. To zajistí,
že se nám do databáze NULL nedostanou. Zkusme si to. Zavolejme
na naší tabulce Uzivatele tento příkaz:
INSERT INTO [Uzivatele] ([Jmeno], [Prijmeni]) VALUES ('Pan', 'Neuplny');
Výsledkem bude chyba, která nám říká , že některé sloupce
neumožňují NULL:

Otevřeme si designer tabulky Uzivatele, zaškrtněme Allow
Nulls u všech sloupců kromě Id, potvrďme tlačítkem
Update a následně tlačítkem Update Database:

Nyní stejný dotaz spusťme znovu:
INSERT INTO [Uzivatele] ([Jmeno], [Prijmeni]) VALUES ('Pan', 'Neuplny');
Když se nyní podíváme do dat v tabulce (pravým tlačítkem klikneme na
tabulku a zvolíme View Data), na konci bude Pan Neúplný a bude mít
v nevyplněných sloupcích NULL:

Přínos hodnoty NULL
Asi se ptáte k čemu hodnota NULL vlastně je? Její přínos
je v tom, že poznáme, jestli byla hodnota zadána. Např. při zadávání
čísla neexistuje hodnota, podle které bychom poznali, že číslo není
zadáno. Kdybychom si k tomuto určili hodnotu nula (0), nevíme, jestli
uživatel číslo nezadal nebo zadal právě nulu. NULL mimo jiné
i šetří místo v databázi, kde na rozdíl od výchozích hodnot nezabírá
místo.
NULL na straně aplikace
Již jsme si řekli o tom, že programovací jazyky hodnotu NULL
zpravidla nemají (tedy ty staticky typované). V jazycích typovaných, jako je
třeba Java nebo C#, musíme použít
jiné datové typy. V C# můžeme kterýkoli datový typ označit jako nullovatelný
a on pochopí, že v něm může být i NULL. Používá se k tomu
otazník, typ je potom např. int?.
Upřesňující informace k datovým typům
K datovým typům (chcete-li ke sloupcům) můžeme uvést několik
upřesňujících informací. Již jsme se setkali s IDENTITY.
Podívejme se na další:
| Název | Popis |
|---|---|
IDENTITY |
Jen pro čísla. Pokud při vkládání řádku dáme této položce hodnotu
NULL, databáze jí automaticky přidělí hodnotu o 1 větší
než dala minulému řádku (přírůstek se teoreticky dá změnit, ale tím se
nyní nebudeme zatěžovat). Výborná věc pro pohodlnou tvorbu unikátních
identifikačních klíčů. |
UNIQUE |
Říká, že nesmí existovat více řádků, které mají v této položce
stejnou hodnotu (s výjimkou hodnoty NULL). |
NOT NULL |
Udává, že daná hodnota nesmí být prázdná – nepůjde do ní vložit
hodnota NULL. |
PRIMARY KEY |
Určuje, že se tenhle sloupec bude používat jako primární klíč.
Vhodné pro nějaké relativně krátké identifikační kódy, podle kterých
budeme řádky nejčastěji hledat. Primární klíč je vždy
NOT NULL a UNIQUE, i když to nenařídíme, dostane
tyto vlastnosti implicitně. |
DEFAULT hodnota |
Výchozí hodnota, kterou položka dostane, když ji při vkládání řádku neuvedeme. |
Nová slova upřesňující datový typ se vkládají za něj, stejně jako
tomu bylo u IDENTITY. Uveďme si nějaký příklad:
CREATE TABLE [Osoby] ( [Id] INT PRIMARY KEY IDENTITY, [Jmeno] NVARCHAR(50) NOT NULL, [Email] NVARCHAR(100) UNIQUE, [Vek] SMALLINT NOT NULL DEFAULT 0 );
V následujícím kvízu, Kvíz - Výběr dat, řazení a datové typy v MS-SQL, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.

