SQL po páté - založme si tabulku!

Jak jsme si minule slíbili, dnes si povíme, jak pomocí SQL můžeme založit tabulku, jak ji změnit a zrušit.
Jak jsme si minule slíbili, dnes si povíme, jak pomocí SQL můžeme založit tabulku, jak ji změnit a zrušit. Seznámíme se tak s prvními příkazy spadajícími do kategorie DDL (Data Definition Language).

Na začátku našeho seriálu jsme si uvedli, že název příkazů v SQL je odvozen od odpovídajících výrazů v anglickém jazyce. Chceme-li vytvořit tabulku, použijeme překlad a vyřkneme "magické" CREATE TABLE. Zjednodušená syntaxe tohoto příkazu má následující podobu:

CREATE TABLE jméno_tabulky
položka typ [NOT NULL]
[,položka typ [NOT NULL]] ...
Typů je v SQL, obdobně jako v dalších programovacích jazycích, celá řada. Mezi nejpoužívanější patří integer, decimal, float, char, varchar či date. Poznamenejme, že vlastnosti (případně včetně názvů) jednotlivých typů mohou být ve vlastních implementacích mírně odlišné a proto doporučuji si zjistit bližší informace (zejména o platnosti rozsahu) v technické dokumentaci. Při volbě typu nezapomínejte na paměťové požadavky - to, co zpočátku vypadá třeba na kilo, může při miliónech záznamů neuvěřitelně narůst.

Za specifikací typu se poprvé setkáváme s pojmem NULL. Tato "hodnota" říká, že v dané položce vlastně žádná hodnota není. Upozorňuji na zásadní rozdíl například od významu nuly (0), která hodnotou je. Ještě jednou tento podstatný rozdíl opakuji - "hodnota" NULL znamená, že v položce žádná hodnota není, tedy (jinými slovy) je prázdná. Klauzule NOT NULL v definici položky nám říká, že v každém řádku musí být hodnota pro daný atribut vyplněna. Pro práci s NULL hodnotami platí určitá pravidla - například v podmínce nepoužíváme zápis ve tvaru položka = NULL, ale položka is NULL. Příkaz na založení naší zkušební tabulky osoby může vypadat takto:

CREATE TABLE osoby
jméno varchar(30),
příjmení varchar(30),
rodné_číslo char(11),
datum date,
počet_dětí integer
Rozhodneme-li se, že chceme mít pro rodné číslo hodnotu vždy vyplněnou, příkaz upravíme přidáním popisované klauzule NOT NULL:
CREATE TABLE osoby
jméno varchar(30),
příjmení varchar(30),
rodné_číslo char(11) NOT NULL,
datum date,
počet_dětí integer
Příkaz CREATE TABLE (součástí kterého je v přesné syntaxi možnost definovat jedinečnost, klíče či další logická omezení) bývá jedním z těch, které se od SQL standardů mírně odlišují. Tím však nechci říci, že by byla nějak radikálně omezena jeho funkčnost, spíše naopak. Mnohdy je umožněno specifikování dalších parametrů týkajících se vlastního uložení dat (například počáteční velikosti zabíraných paměťových bloků). Připomeňme si, že na pořadí atributů v relačním modelu nezáleží - přesto se doporučuje na první pozice umisťovat položky, které budou součástí klíčů či indexů (případná výhoda takového uspořádání však závisí na vnitřních mechanismech konkrétního systému).

Druhým příkazem, který budeme pro práci s definicí tabulky potřebovat, je ALTER TABLE. Vzhledem k jeho určení, kterým je změna definice tabulky, vychází jeho možnosti z příkazu CREATE TABLE. Ukažme si, jaké jsou základní volby:

ALTER TABLE jméno_tabulky
[ADD položka typ [NOT NULL]] ... ¦
[MODIFY položka typ [[NOT] NULL]] ... ¦
[DROP položka] ...
Význam jednotlivých klauzulí přesně odpovídá anglickým ekvivalentům - ADD umožní položku přidat, MODIFY změnit její definici (tedy například typ) a DROP atribut z tabulky odebrat. Vraťme se ještě k problému NULL hodnoty - omezení změny na NOT NULL je logicky možné pouze tehdy, když je hodnota měněné položky vyplněna pro všechny záznamy. Poznamenejme, že některé systémy úpravu na NOT NULL ani neumožňují (problém lze vyřešit vytvořením nové tabulky a "přehráním" dat). Stejně je na tom i možnost odstranění položky z tabulky (omezení zde ovšem neplyne z hodnot dat jako u NOT NULL, ale spíše z mnohdy problematické změny použitých fyzických struktur v operační paměti a na záznamovém médiu). Vlastní změna dat se zpravidla neprovádí ihned po vykonání příkazu ALTER TABLE, ale až při nejbližším použití příkazu UPDATE.

Pamatujete si, jak jsme v díle věnovaném agregacím přidávali do tabulky osoby novou položku počet_dětí? Příkaz pro tuto změnu by mohl mít následující podobu:

ALTER TABLE osoby
ADD počet_dětí integer
Pokud chceme zrušit naše omezení (použité ve druhém dnešním příkladě na založení tabulky) NOT NULL na položce rodné_číslo, použijeme následující zápis:
ALTER TABLE osoby
MODIFY rodné_číslo NULL
Při změně typu dat musíme mít na paměti, že systém musí být schopen na pozadí provést automatickou konverzi mezi typem původním a novým. V opačném případě (například při změně typu z char na integer) můžeme očekávat chybové hlášení.

K naší zcela původní verzi tabulky osoby se můžeme vrátit, použijeme-li zápis příkazu ve tvaru:

ALTER TABLE osoby
DROP počet_dětí
Velmi často příkaz ALTER TABLE, obdobně jako příkaz předchozí, umožňuje ovlivnit celou řadu vlastností - bližší podrobnosti jsou však nad rámec tohoto dílu. Na první pohled tyto základní DDL příkazy vypadají složitěji než například SELECT. Je a není to pravda - pokud se spokojíme pouze s "jádrem" těchto příkazů (pro učení a zkoušení je to zcela dostačující), nemělo by nám jejich pochopení činit žádné větší problémy.

Pokud jsme si s ukázkovou tabulkou již dostatečně vyhráli, můžeme ji zrušit příkazem DROP TABLE. Rušení čehokoli zpravidla patří mezi nejjednodušší postupy, není proto divu, že syntaxe je velmi triviální:

DROP TABLE jméno_tabulky
Příkaz DROP TABLE bývá často doplněn o možnost současného zrušení referenčních odkazů z ostatních tabulek, ale to již patří do pokročilejších technik.

Na tomto místě bych se ještě jednou vrátil k otázce kompatibility konkrétní implementace SQL se standardy. Pokud Vám některý příklad nefunguje tak jak má, podívejte se do dokumentace na přesnou syntaxi. Odlišnosti však nemusíte chápat jako katastrofu - mnohdy se jedná pouze o drobné nuance. Horší situace nastane ve chvíli, kdy není některá vlastnost podporována vůbec (nejedná se tedy o rozdílnou syntaxi). Pak musíte zjistit, zda se požadavek nedá "opsat" jiným způsobem - pokud ne a uvedenou vlastnost opravdu potřebujete, zvažte, zda nemůžete přejít na jiný systém.

Dosud jsme si ukázali pouze pár příkazů - mohlo by se to zdát málo. Známe však všechny, které potřebujeme k vytvoření jednoduché aplikace (byť opravdu velmi jednoduché a neohrabané). Použití SQL se neustále točí okolo této skupiny příkazů. Příště si povíme něco o slíbených indexech a poprvé se tak podíváme na zoubek (byť z bezpečné vzdálenosti) otázce rychlosti prováděných SQL příkazů.

Diskuze (2) Další článek: Tweak UI: konfigurujeme kontextové menu a rušíme kostřičky po zrušených programech (IX.)

Témata článku: Software, Programování, Tab, Položka, Jednoduché uspořádání, Přesná hodnota, Alter, Omezená možnost, Drop, Syntax, Jednoduchý tvar, Přesný tvar, Nota, Milión záznamů, SQL, Nuance


Určitě si přečtěte

Vylaďte si Wi-Fi: Podívejte se, jaká pásma máte doma volná a kam signál nedosáhne

Vylaďte si Wi-Fi: Podívejte se, jaká pásma máte doma volná a kam signál nedosáhne

** Prozkoumejte, jaké pásmo je pro vaši síť nejlepší ** Díky heat mapě snadno poznáte, kde to bude se signálem horší ** Vše zvládnete i z mobilního telefonu

Vladislav Kluska | 36

Jak horko bude ve vašem městě, až vám bude 80 let? Podívejte se, jak se projeví klimatické změny!

Jak horko bude ve vašem městě, až vám bude 80 let? Podívejte se, jak se projeví klimatické změny!

** Srpen byl třetí nejteplejší za posledních více než sto let ** Bude to ale daleko horší, jak ukazuje aplikace NYT ** V Praze vzroste počet horkých dní na čtyřnásobek

Karel Kilián | 21

Tohle tak jednou zažít: Nová vzducholoď Airlander 10 s prosklenou podlahou

Tohle tak jednou zažít: Nová vzducholoď Airlander 10 s prosklenou podlahou

** Airlander 10 nabídne plavby vzduchem v interiéru s prosklenou podlahou ** Luxusní vzducholoď byla původně vyvíjena pro vojenské účely ** Počítá se s třídenními „kochacími“ výlety za poznáním

Karel Kilián | 7

Američtí mariňáci si tisknou kasárna z betonu na 3D tiskárně

Američtí mariňáci si tisknou kasárna z betonu na 3D tiskárně

** Americká námořní pěchota nedávno představila 3D tištěná kasárna pro vojáky ** Ty jim tiskne velká 3D tiskárna na beton ** Výsledkem je solidní obytný prostor, který je slušně chráněný před nepřátelskou palbou

Stanislav Mihulka | 18


Aktuální číslo časopisu Computer

Jak vytvořit a spravovat vlastní web

Velký test herních klávesnic a DVB-T2 tunerů

Vše o formátu RAW

Vybíráme nejlepší základní desku