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
Typ | Rozsah |
---|---|
TINYINT | 8bitové číslo |
SMALLINT | 16bitové číslo |
INT | 32b |
BIGINT | 64b |
Pozn.: 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
Typ | Rozsah |
---|---|
NVARCHAR (max. počet znaků) | počet znaků jaký si zvolíte |
NCHAR (počet znaků) | pevný počet znaků jaký si zvolíte |
Již víme, že existují i typy VARCHAR
a CHAR
. Ty
ale nepodporují Unicode kódování a mohli byste v nich mít problémy s
diakritikou. Proto je nebudeme používat. 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í
Typ | Popis |
---|---|
DATE | Datum jako textový řetězec ve tvaru 'rrrr-mm-dd', rozsah od '0001-01-01' do '9999-12-31' |
TIME | Čas jako textový řetězec ve tvaru 'hh:mm:ss' |
DATETIME | Prakticky je to zřetězení data a času: 'rrrr-mm-dd hh: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áte, když jsme vytvářeli databázi, odškrtávali jsme
Allow Nulls. To zajistí, že se nám do databáze NULL
nedostanou.
Zkusme si to:
INSERT INTO [Uzivatele] ([Jmeno], [Prijmeni]) VALUES ('Pan', 'Neuplny');
Výsledkem bude chyba, která nám říká , že některé sloupce
neumožňují NULL
. Otevřete si designer tabulky, zaškrtejte
Allow Nulls u všech sloupců kromě Id
, potvrďte tlačítkem
Update a následně tlačítkem Update Database. Nyní dotaz spusťte znovu.
Když se nyní podíváte do dat v tabulce, 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. Při vkládání řádku dejte této položce hodnotu
NULL a 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 (v každé tabulce max. jeden) 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 NOT NULL IDENTITY(1, 1), [Jmeno] CHAR(35) NOT NULL, PRIMARY KEY ([Id]) );
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í.