Lekce 2 - MS-SQL krok za krokem: Vytvoření databáze a tabulky
V minulé lekci, MS-SQL krok za krokem: Úvod do MS-SQL a příprava prostředí, jsme si řekli něco o relačních databázích a připravili jsme si prostředí.
Dnes si v MS-SQL tutoriálu založíme první databázi a vytvoříme v ní tabulku uživatelů. Osvojíme si tak základní práci s Visual Studiem a naučíme se první T-SQL příkazy.
Vytvoření databáze ve Visual Studio
Otevřeme si Visual Studio a v úvodním okně přejdeme pomocí tlačítka Continue without code do hlavního okna:

K MS-SQL databázím budeme přistupovat přes okno SQL Server Object Explorer. Otevřeme si jej přes nabídku View:

V okně SQL Server Object Explorer si rozbalíme položky SQL Server a následně (localdb)\MSSQLLocalDB:

Pro vytvoření nové LocalDB databáze klikneme pravým tlačítkem myši na složku Databases a zvolíme Add New Database:

Databázi pojmenujeme databazeProWeb. V MS-SQL databázích je
zvykem používat PascalCase při pojmenovávání. Diakritice se jako vždy
vyhneme. Místo uložení si zvolíme libovolné, můžeme však ponechat i to
výchozí. Dialog potvrdíme:

Pokud se nám databáze v okně SQL Server Object Explorer ihned nezobrazí, stačí kliknout na tlačítko Refresh v levém horním rohu okna:

Máme vše připraveno k tomu, abychom se mohli začít učit jazyk T-SQL.
Jazyk T-SQL
T-SQL označuje Transact Structured Query Language, tedy strukturovaný dotazovací jazyk. T-SQL je jazyk deklarativní. Zatímco u imperativních jazyků počítači říkáme krok po kroku co má udělat, u jazyků deklarativních pouze říkáme co má být výsledkem a již nás nezajímá, jak tohoto výsledku počítač dosáhne. Díky tomu jsou databázové dotazy zjednodušeny na příkaz typu "Vrať mi 10 uživatelů s nejvyšším hodnocením". Databáze takový dotaz pochopí, rozloží si ho na nějaké své instrukce a tak jej zpracuje. Nám poté opravdu vrátí výsledek, aniž bychom tušili, jak k němu došla. Pokud vám příkaz přišel jako nadsázka, tak tomu tak není a příkazy opravdu takto vypadají. Jen jsou anglicky.
T-SQL se používá na platformě MS-SQL a dokud se nedostanete do jeho hlubin, tak je totožný s SQL. Každý výrobce databáze si SQL trochu upraví, ale základ je vždy stejný.
SQL se původně jmenovalo SEQUEL (Structured English Query Language) a vzniklo v laboratořích společnosti IBM s cílem vytvořit jazyk, kterým by se dalo komunikovat s databází jednoduchou angličtinou. SQL (relační) databáze se poté rozšiřovaly a ujaly. Dnes se prakticky nic jiného nepoužívá a i když má T-SQL v objektovém programování značné nevýhody, firmám se nechce přecházet na nic jiného (i když existují alternativní řešení). Ale to jsme odbočili.
V T-SQL (a SQL obecně) se většinou píší příkazy velkými písmeny, to proto, že je to lépe odliší od zbytku dotazu nebo od kódu naší aplikace (například v ASP.NET Core). Názvy tabulek, sloupců a další identifikátory se v T-SQL píší PascalCase notací (první písmeno slova velké, další malá, bez mezer). Je dobrým zvykem je vkládat do hranatých závorek (na české klávesnici Alt Gr + F a Alt Gr + G).
Vytvoření tabulky
Našim cílem bude vytvořit tabulku uživatelů s následující strukturou:
| Jméno | Příjmení | Datum narození | Počet článků |
|---|---|---|---|
| Jan | Novák | 11.3.1984 | 17 |
| Tomáš | Marný | 1.2.1989 | 6 |
| Josef | Nový | 20.12.1972 | 9 |
| Michaela | Slavíková | 14.8.1990 | 1 |
Připomeňme si, že položky (konkrétně zde uživatele) v databázových tabulkách ukládáme na jednotlivé řádky, sloupce pak označují atributy, které položky mají. Zatím nám půjde pouze o vytvoření samotné tabulky, tedy o definování jejích sloupců. Daty tabulku naplníme až později.
V okně SQL Server Object Explorer si otevřeme naši databázi. Uvidíme osm složek, nás zatím bude zajímat pouze složka Tables. Rozklikněme si ji. Kromě nějakých systémových tabulek se v ní žádné nenacházejí. Vlastní tabulku vytvoříme kliknutím pravým tlačítkem na složku Tables a výběrem Add New Table...:

Ve Visual Studiu se nám otevře designer (návrhář) tabulky:

Tento návrhář má okno rozdělené na dvě části. V horní polovině
máme přehledné definice sloupců tabulky s jejich názvy (Name),
datovými typy (Data Type) a dalšími důležitými vlastnostmi.
Každému sloupci databázové tabulky tu odpovídá jeden řádek. Můžeme zde
vidět předdefinovaný výchozí sloupec Id, tj. unikátní
identifikátor. Dole pak máme výsledný T-SQL kód, který se spustí až
budeme chtít tabulku skutečně vytvořit.
Výchozí sloupec Id si ponecháme a přidáme pod něj do
tabulky sloupce Jmeno, Prijmeni,
DatumNarozeni a PocetClanku. Vždy nejprve zadáme
název sloupce Name a následně přidání potvrdíme klávesou
Enter:

Datové typy
Přesuňme se k druhému sloupci návrháře, kde jsou datové
typy jednotlivých sloupců tabulky. Přednastavený
máme nchar(10), což jsou textové řetězce o maximální délce
10 znaků. Typů je opravdu mnoho, ale my si dlouho vystačíme jen s
několika:
Idponecháme na typuint, tedy celé číslo.JmenoaPrijmeninastavíme nanvarchar(60), to je krátký text o maximálně 60 znacích.- Datum narození změníme na typ
datepředstavující datum. - Poslední sloupec,
PocetClanku, bude typuint.
U všech sloupců zrušíme zatržení hodnoty Allow
Nulls, což způsobí, že bude hodnoty vždy nutné
zadat. Časem si popíšeme i další datové typy a NULL
(který jsme zakázali), ale teď vám s nimi nebudeme motat hlavu
U datových typů pro text, pokud
to umožňují (s tím nám poradí našeptávač, kterého jsme si již
určitě všimli) se do závorek uvádí maximální délka.
Vedle typu date MS-SQL ještě podporuje i datový
typ datetime2 (případně starší datetime), do
kterého lze kromě data uložit i čas.
Primární klíč
Všimněme si, že předdefinovaný sloupec Id má u sebe ikonku
klíče. Jedná se o tzv. primární klíč. Klíče (někdy
indexy) nám umožňují identifikovat položku v tabulce. Takový primární
klíč by měla mít každá tabulka (i když teoreticky nemusí).
Když budeme chtít uživatele například vymazat, vymažeme ho podle tohoto
klíče (tedy podle sloupce Id). Kdybychom ho mazali podle jména,
mohli bychom nechtěně smazat hned několik položek, protože třeba Janů
Nováků může být v tabulce více. Podle Id vymažeme vždy jen
toho jednoho.
Aby se uživatelé po vložení do tabulky číslovali
automaticky, tak sloupci Id nastavíme tzv. Identity
Specification. Označme sloupec Id a v okně
Properties (otevřeme přes menu View a poté Properties
Window, případně stisknutím klávesy F4) si rozbalme
nabídku Identity Specification. Vlastnost Is Identity
nastavme na True:

Vlastnost Identity Increment říká, že se bude číslo
zvětšovat vždy o 1.
Výsledný návrhář vypadá takto:

Přejmenování tabulky
Než tabulku skutečně vytvoříme, tak v kódu ještě změníme její
aktuální název Table (v hranatých závorkách) na
Uzivatele. Kód bude nyní vypadat takto:
CREATE TABLE [dbo].[Uzivatele] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [Jmeno] NVARCHAR(60) NOT NULL, [Prijmeni] NVARCHAR(60) NOT NULL, [DatumNarozeni] DATE NOT NULL, [PocetClanku] INT NOT NULL )
Odeslání tabulky
Navrženou tabulku musíme do databáze "odeslat". Do databáze se pošle SQL dotaz vygenerovaný Visual Studiem, který vidíme v dolní polovině návrháře. Odeslání provedeme kliknutím na tlačítko Update v levém horním rohu návrháře:

Teď se staly dvě události. Tou první je, že nám Visual Studio otevřelo dialog, který (až se načte) bude shrnovat, co v databázi měníme a jaký by to mohlo mít dopad. V našem případě se nic zvláštního neděje, a proto zpráva bude stručná a krátká. Ale kdybychom třeba přidávali sloupce, Visual Studio nás informuje o tom, jakou hodnotu budou mít nově přidané sloupce u stávajících položek tabulky. Až se dialog načte, potvrdíme ho tlačítkem Update Database:

Dále nám Visual Studio otevřelo okno Data Tools Operations. Zde se objevila jedna položka, která se změnila v zelenou fajfku (pokud vše proběhlo správně). Když si ji rozklikneme, uvidíme, že operace, kterou jsem provedli, Visual Studio doplnilo tím, že se serveru zeptalo na možné důsledky a ty nám před okamžikem zobrazilo v dialogu. Poté vygenerovalo skript, spustilo jej a ten proběhl úspěšně:

Když si okno SQL Server Object Explorer aktualizujeme (první tlačítko Refresh v nástrojové liště tohoto okna), tak se nová tabulka objeví v naší databázi:

Pokud bychom se rozhodli tabulku odstranit, provedeme to v okně SQL Server Object Explorer – pravým tlačítkem klikneme na tabulku a vybereme Delete. Stejně tak bychom mohli odstranit i samotnou databázi.
Vygenerovaný T-SQL kód
Nyní si ještě projdeme T-SQL kód který Visual Studio vytvořilo:
CREATE TABLE [dbo].[Uzivatele] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [Jmeno] NVARCHAR(60) NOT NULL, [Prijmeni] NVARCHAR(60) NOT NULL, [DatumNarozeni] DATE NOT NULL, [PocetClanku] INT NOT NULL )
První řádek je vcelku jasný – příkazem CREATE TABLE
vytváříme tabulku Uzivatele, dbo zde odkazuje na
samotnou databázi. Na dalších řádcích se definují jednotlivé sloupce
tabulky a jejich datový typ. U nvarchar k typu uvádíme i počet
znaků. NOT NULL je to, proč jsme rušili zatržení Allow
Nulls, tedy že sloupce nesmí být nevyplněné. O hodnotě
NULL se dozvíte v některém z dalších dílů.
Id je pomocí PRIMARY KEY označeno jako primární
klíč tabulky. IDENTITY mu navíc nastavuje, aby databáze
každému novému uživateli přiřadila o 1 větší Id, než měl
ten poslední.
Spouštění T-SQL skriptu
Na databázi můžeme spustit libovolný T-SQL skript. Stačí na ni v okně SQL Server Object Explorer kliknout pravým tlačítkem a vybrat New Query...:

Otevře se nám nový SQL soubor, do nějž můžeme napsat náš T-SQL kód.
Zkusme si přes zdrojový kód odstranit naši tabulku Uzivatele,
to provedeme následujícím příkazem:
DROP TABLE [Uzivatele];
V SQL je dobrou praxí každý příkaz vždy zakončit
středníkem ;, který značí konec daného příkazu. V T-SQL je
to však ve většině případů nepovinné.
Když chceme kód zpracovat, klikneme na zelenou šipku Execute, která je vlevo nahoře, jako bylo tlačítko Update u tabulek:

V okně SQL Server Object Explorer se můžeme ujistit, že tabulka z databáze opravdu zmizela, nezapomeňme jej předtím obnovit. Nakonec si tabulku vytvoříme znovu naším SQL dotazem:
CREATE TABLE [dbo].[Uzivatele] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [Jmeno] NVARCHAR(60) NOT NULL, [Prijmeni] NVARCHAR(60) NOT NULL, [DatumNarozeni] DATE NOT NULL, [PocetClanku] INT NOT NULL )
V příští lekci, MS-SQL krok za krokem: Vkládání a mazání dat v tabulce, si naší tabulku již naplníme nějakými daty

