8. diel - MS-SQL krok za krokom: Dátové typy a NULL
V predchádzajúcom cvičení, Riešené úlohy k 7. lekcii MS-SQL, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
Dnes sa v MS-SQL tutoriáli vrátime k dátovým typom, predstavíme si
tabuľky tých najdôležitejších a povieme si niečo o hodnote
NULL.
Dátové typy
Hneď na začiatku nášho on-line kurzu MS-SQL sme si uviedli niekoľko
základných dátových typov. Vtedy som vám s nimi nechcel motať hlavu. Reč
bola o typoch INT, VARCHAR a DATE.
Databáza (konkrétne tu MS-SQL) ich má samozrejme oveľa viac. Uveďme si
niekoľko tabuliek a predstavme si tie najdôležitejšie.
Celé čísla
Na celé čísla používame tieto dátové typy:
| Typ | Rozsah | Veľkosť |
|---|---|---|
TINYINT |
0 až 255 | 8 bitov |
SMALLINT |
-32 768 až 32 767 | 16 bitov |
INT |
-2 147 483 648 až 2 147 483 647 | 32 bitov |
BIGINT |
-9 223 372 036 854 775 808 až 9 223 372 036 854 775 807 | 64 bitov |
Ak hľadáte dátový typ boolean (hodnoty
true/false), tak na ukladanie tejto hodnoty sa
spravidla používa typ BIT (0/1).
Texty
Už vieme, že existujú aj typy VARCHAR a CHAR.
Tie však nepodporujú Unicode kódovanie a mohli by sme v nich mať problémy s
diakritikou. Preto namiesto nich budeme používať typy:
| Typ | Rozsah |
|---|---|
NVARCHAR (max. počet znakov) |
počet znakov, aký si zvolíme |
NCHAR (počet znakov) |
pevný počet znakov, aký si zvolíme |
N v dátových typoch označuje National, ako medzinárodný.
Zaujímavá situácia nastane, keď zapíšeme dátový typ ako
NVARCHAR (MAX). V tejto chvíli je dĺžka textu neobmedzená
(prakticky je tam limit asi 2GB, čo jednou hodnotou len ťažko zaplníme). Na
dlhé texty sa v minulosti používal typ NTEXT, ktorý je však
teraz zastaraný.
Ostatné
Ďalej sa nám budú ešte hodiť nasledujúce dátové typy:
| Typ | Popis |
|---|---|
DATE |
Dátum ako textový reťazec v tvare 'YYYY-MM-DD', rozsah od
'0001-01-01' do '9999-12-31' |
TIME |
Čas ako textový reťazec v tvare 'hh:mm:ss' |
DATETIME2 |
Prakticky je to zreťazenie dátumu a času:
'YYYY-MM-DD hh:mm:ss' (prípadne
'YYYY-MM-DDThh:mm:ss') |
BLOB a spol. |
Všeobecné dáta v binárnom tvare. Umožňujú do databázy ukladať napr. obrázky alebo iné súbory. |
Hodnota NULL
Dátové typy v databázach sa trochu odlišujú od dátových typov, ako ich
poznáme v programovacích jazykoch. Zatiaľ čo napríklad v jazyku C môže mať typ int hodnoty len
nejakých -32 768 až 32 767 a nič okrem toho, databázový INT
môže nadobúdať aj hodnotu NULL. NULL nemá vôbec
nič spoločné s nulou (0), označuje to, že hodnota
ešte nebola zadaná. Filozofia databáz je takto postavená, nezadané
hodnoty majú predvolenú hodnotu NULL (ak im nenastavíme inú) a
každý dátový typ má okrem hodnôt, ktoré by sme v ňom očakávali,
navyše možnú hodnotu NULL. Dátovému typu túto hodnotu
môžeme aj zakázať, viac ďalej.
Ak si spomíname, keď sme vytvárali databázu a tabuľku
Pouzivatelia, odškrtávali sme Allow Nulls. To zaistí,
že sa nám do databázy NULL nedostanú. Skúsme si to. Zavolajme
na našej tabuľke Pouzivatelia tento príkaz:
INSERT INTO [Pouzivatelia] ([Meno], [Priezvisko]) VALUES ('Pán', 'Neúplný');
Výsledkom bude chyba, ktorá nám hovorí, že niektoré stĺpce
neumožňujú NULL:

Otvoríme si designer tabuľky Pouzivatelia dvojklikom na ňu v
SQL Server Object Exploreri, zaškrtneme Allow Nulls pri všetkých
stĺpcoch okrem Id, potvrdíme tlačidlom Update a
následne tlačidlom Update Database:

Teraz rovnaký dotaz spustime znovu:
INSERT INTO [Pouzivatelia] ([Meno], [Priezvisko]) VALUES ('Pán', 'Neúplný');
Keď sa teraz pozrieme do dát v tabuľke (pravým tlačidlom klikneme na
tabuľku a zvolíme View Data), na konci bude Pán Neúplný a bude
mať v nevyplnených stĺpcoch NULL:

Prínos hodnoty NULL
Asi sa pýtate, na čo hodnota NULL vlastne je? Jej prínos je v
tom, že zistíme, či bola hodnota zadaná. Napr. pri zadávaní čísla
neexistuje hodnota, podľa ktorej by sme zistili, že číslo nie je zadané.
Keby sme si na tento účel určili hodnotu nula (0), nevieme, či používateľ
číslo nezadal alebo zadal práve nulu. NULL okrem iného aj
šetrí miesto v databáze, kde na rozdiel od predvolených hodnôt nezaberá
miesto.
NULL na strane aplikácie
Už sme si povedali o tom, že programovacie jazyky hodnotu NULL
spravidla nemajú (teda tie staticky typované). V typovaných jazykoch, ako je
napríklad Java alebo C#, musíme
použiť iné dátové typy. V C# môžeme ktorýkoľvek dátový typ označiť
ako nullovateľný
a on pochopí, že v ňom môže byť aj NULL. Používa sa na to
otáznik, typ je potom napr. int?.
Spresňujúce informácie k dátovým typom
K dátovým typom (ak chcete k stĺpcom) môžeme uviesť niekoľko
spresňujúcich informácií. Už sme sa stretli s IDENTITY.
Pozrime sa na ďalšie:
| Názov | Popis |
|---|---|
IDENTITY |
Len pre čísla. Ak pri vkladaní riadku dáme tejto položke hodnotu
NULL, databáza jej automaticky pridelí hodnotu o 1 väčšiu,
než dala minulému riadku (prírastok sa teoreticky dá zmeniť, ale tým sa
teraz nebudeme zaťažovať). Výborná vec na pohodlnú tvorbu unikátnych
identifikačných kľúčov. |
UNIQUE |
Hovorí, že nesmie existovať viac riadkov, ktoré majú v tejto položke
rovnakú hodnotu (s výnimkou hodnoty NULL). |
NOT NULL |
Udáva, že daná hodnota nesmie byť prázdna – nepôjde do nej vložiť
hodnota NULL. |
PRIMARY KEY |
Určuje, že sa tento stĺpec bude používať ako primárny kľúč.
Vhodné pre nejaké relatívne krátke identifikačné kódy, podľa ktorých
budeme riadky najčastejšie hľadať. Primárny kľúč je vždy
NOT NULL a UNIQUE, aj keď to nenariadime, dostane
tieto vlastnosti implicitne. |
DEFAULT hodnota |
Predvolená hodnota, ktorú položka dostane, keď ju pri vkladaní riadku neuvedieme. |
Nové slová spresňujúce dátový typ sa vkladajú zaň, rovnako ako to
bolo pri IDENTITY. Uveďme si nejaký príklad:
CREATE TABLE [Osoby] ( [Id] INT PRIMARY KEY IDENTITY, [Meno] NVARCHAR(50) NOT NULL, [Email] NVARCHAR(100) UNIQUE, [Vek] SMALLINT NOT NULL DEFAULT 0 );
V nasledujúcom kvíze, Kvíz - Výber dát, radenie a dátové typy v MS-SQL, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.