Lekce 6 - MS-SQL krok za krokem: Datové typy a NULL

MS-SQL krok za krokem MS-SQL krok za krokem: Datové typy a NULL

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, MS-SQL krok za krokem: Řazení, Limit a agregační funkce, jsme se dozvěděli něco o řazení a o agregačních funkcích. 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.

Hodnoty NULL v tabulce

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 příští lekci, MS-SQL krok za krokem: Dotazy přes více tabulek (JOIN), si připravíme tabulky a testovací data pro jednoduchý redakční systém, jako je třeba tady na ITnetwork. Další lekce totiž budeme dělat dotazy přes více tabulek a tzv. poddotazy. Tak bude váš arzenál základních databázových nástrojů kompletní pro tvorbu prakticky jakékoli aplikace :)


 

 

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
Jak se ti líbí článek?
5 hlasů
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity (4)

 

 

Komentáře

Avatar
Lu Kiss
Člen
Avatar
Lu Kiss:20.7.2017 17:54

Jakým datovým typem by jsi řešil uložení 1440 hodnot typu float? Nějakým blobem nebo by šlo použít něco jiného?

 
Odpovědět 20.7.2017 17:54
Avatar
Odpovídá na Lu Kiss
Michal Žůrek (misaz):20.7.2017 18:14

pakliže má jeden záznam 1440 hodnot, tak v duchu zachování normálních forem je třeba rozdělit to na dvě tabulky s vazbou 1:N. datový typ pak bude float.

Odpovědět 20.7.2017 18:14
Nesnáším {}, proto se jim vyhýbám.
Avatar
Lu Kiss
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
Lu Kiss:20.7.2017 18:23

Těch 1440 záznamů jsou nějaká měření veličin za celý den. Denně se měří třeba 50 různých veličin, proto uvažuji nad tím, že namísto 1440 záznamů pro jednu veličinu bude pouze jeden záznam, kde sloupce budou Datum, typ měření a hodnoty za celý den. Zjednodušeně.

 
Odpovědět 20.7.2017 18:23
Avatar
Odpovídá na Lu Kiss
Michal Žůrek (misaz):20.7.2017 18:56

Jestli chceš takhle porušovat všechny datbazove proncipy, tak si to uloz do souboru. Budeš to mít mnohem jednodušší.

Odpovědět 20.7.2017 18:56
Nesnáším {}, proto se jim vyhýbám.
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Marian Benčat:20.7.2017 19:39

Eh.. Relační databáze se také používají často v denormalizovanem tvaru, kvůli výkonu.

Odpovědět  +1 20.7.2017 19:39
Totalitní admini..
Avatar
Peter Trcka
Člen
Avatar
Peter Trcka:20.7.2017 20:32

len doplnim ze PRIMARY KEY nemusi striktne vzdy iba jede stlpec. v pripade asociacnych vztahov v databaze moze byt PRIMARY KEY tvoreny aj viacerymi stlpcami z tabulky. Co je dolezite a plati vzdy je ze musi byt unikatny.

Prikladom su napriklad spojovacie tabulky s kardinalitou M:N. neuvadza sa to ale tam je primarny kluc tvoreny unikatnou kombinaciou cudzich klucov.

 
Odpovědět  +1 20.7.2017 20:32
Avatar
Odpovídá na Marian Benčat
Michal Žůrek (misaz):20.7.2017 21:02

jo, ale to ani zdaleka není jeho případ.

Odpovědět 20.7.2017 21:02
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na Lu Kiss
Michal Žůrek (misaz):20.7.2017 21:26

takto se uvažuje v nerelačních databázích. Tam si ale musíš sám pořešit mnoho věcí, které ti relační databáze řeší sama.

Odpovědět 20.7.2017 21:26
Nesnáším {}, proto se jim vyhýbám.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.