Úvod do jazyka SQL

Tomáš Herceg       3. 9. 2007       SQL, Databáze       21989 zobrazení

Mnoho lidí si myslí, že umí SQL, a náležitě to dávají ostatním najevo, a přitom netuší, že existuje příkaz JOIN. V tomto článku se podíváme na databáze úplně od začátku a naučíme se alespoň základní příkazy SELECT, INSERT, UPDATE a DELETE. Dojde i na ten slibovaný JOIN.

dTento článek jsem se rozhodl napsat z jednoho prostého důvodu - mnoho převážně začátečníků o databázích téměř nic neví. Nebudu se zde moc pouštět do teorie, ukážu spíše praktické příklady a to, co se každému může hodit. Tento článek rozhodně doporučuji prostudovat, pokud čtete také seriál o ASP.NET 2.0 pro začátečníky.

Co je to databáze?

Databáze obecně je prostor či nástroj k uchování a organizaci nějakých dat. Databází je mnoho druhů, my se v tomto článku budeme zaobírat pouze jedním a pravděpodobně nejpoužívanějším typem - databázemi relačními. Relační databáze uchovávají data v tabulkách a umožňují nám s nimi pohodlně manipulovat, většinou pomocí speciálního jazyka SQL.

Jazyk SQL (Structured Query Language - strukturovaný dotazovací jazyk) je jakási "strojová" angličtina uzpůsobená pro manipulaci s daty. V praxi to funguje tak, že pošleme databázi příkaz v SQL a databáze nám vrátí jako výsledek požadovaná data.

Software kolem toho

Existuje několik různých databázových serverů. Jsou to programy či služby, které schraňují několik databází a umožňují manipulaci s jejich daty. Nejpoužívanější jsou databázové servery MySqlMS SQL, PostgreSQL, Oracle, Firebird. Všechny umí jazyk SQL, základ je stejný, ale v některých (mnohdy podstatných) detailech se tyto databáze a i jejich verze jazyka SQL liší. Já se budu držet databázového serveru Microsoft SQL Server 2005, který je v Express edici dostupný zdarma. Ukázky tedy nemusí fungovat jinde, datové typy se mohou také jmenovat jinak. Principy jsou však většinou stejné.

Abyste mohli spustit příklady a hrát si s databází, doporučuji stáhnout balík Microsoft SQL Server Express With Advanced Services SP2, který obsahuje jak samotný databázový server, tak i program Server Management Studio Express, pomocí kterého můžeme pracovat s databázemi a jejich daty. Balík je bohužel poměrně velký (280 MB), ale vřele jej doporučuji stáhnout a nainstalovat.

Uspořádání dat v databázi

V relačních databázích jsou data uchovávána v tabulkách (tzv. relacích). V jedné databázi může být více tabulek, každá se používá pro specifický druh dat. Tabulka má (zcela přirozeně) sloupce a řádky - každý řádek je jeden záznam a v každém sloupci je hodnota předem definovaného typu. Lepší je to ukázat na příkladu (v tomto i v ostatních příkladech jsou jména fiktivní, podobnost s existujícími osobami je čistě náhodná):

Vzorová tabulka

Jedná se o tabulku tříd ve škole, se kterou budeme pracovat i dále. Tato tabulka má 3 sloupce - IdTrida, Nazev a TridniUcitel. To jsou data, která si chceme pamatovat o každé třídě. Každý řádek je pak jedna konkrétní třída a obsahuje k ní příslušné informace.

Datové typy, primární klíče a podobná zvířátka

Každá tabulka by měla mít tzv. primární klíč - je to speciální sloupec, který slouží k jednoznačné identifikaci záznamu v tabulce. Žádné dva řádky nesmí mít v tomto sloupci stejnou hodnotu, každý řádek musí mít hodnotu primárního klíče jedinečnou (unikátní) v rámci tabulky. Většinou se to řeší tak, že tento sloupec nastavíme jako identity field (někdy také auto_increment). Do tohoto sloupce se díky tomu samy dosazují čísla postupně od zadané počáteční hodnoty. Pokud tedy do prázdné tabulky přidáme jeden záznam, dostane třeba číslo 1, pokud přidáme druhý, dostane číslo 2 atd. Za chvíli máme v tabulce 10 záznamů a rozhodneme se jeden smazat, třeba záznam číslo 5. Pokud přidáme další záznam, dostane ale číslo 11. Nejde totiž o to, aby bylo číslování souvislé (aby nebyly díry), ale aby každý sloupec měl hodnotu primárního klíče jinou. V naší ukázkové tabulce byl primární klíč sloupec IdTrida.

Každý sloupec musí mít svůj datový typ, který přesně určuje typ dat, které v daném sloupci budou. Nejběžnější datové typy jsou varchar (textová hodnota), int (číselná hodnota), bit (hodnota Boolean) a datetime (datum a čas). Datový typ varchar musí ještě uvádět maximální délku textu, kterou je schopen pojmout, pokud je to na opravdu dlouhé texty (celé články), místo maximální délky se uvádí slovo max. Vše uvidíte na ukázce vytvoření tabulky.

Ve všech databázích existuje ještě speciální hodnota NULL, která znamená něco ve smyslu nevyplněno. Můžeme ji pro konkrétní sloupce v tabulce povolit, čímž řekneme, že údaj nemusí být vyplněn.

Vytvoření databáze a tabulek

Vytvoření databáze 1

Pokud již máte balík stažen a nainstalován, spusťte z nabídky Start program Server Management Studio Express (je schováno ve složce Microsoft SQL Server 2005). Pokud ještě nemáte staženo a nainstalováno, pokračujte klidně ve čtení. Po spuštění se objeví dialog pro výběr databázového serveru, ke kterému se chcete připojit. Nechte standardní nastavení a klikněte na tlačítko Connect. Po pár sekundách se program připojí k databázovému serveru.

Nyní vytvoříme databázi. Pravým tlačítkem klikněte v levém panelu na složku Databases a vyberte položku New Database. V dialogovém okně nastavte název databáze třeba jako demo a klikněte na OK.

Vytvoření databáze 2

 Přestože program obsahuje i nástroje pro vizuální návrh databáze, preferuji ruční zápis SQL příkazů (často se mi stane, že zapomenu něco naklikat, pokud to napíšu ručně, nestane se mi to tak snadno). Klikněte tedy v panelu nástrojů na tlačítko New Query , aby se nám vytvořil nový databázový skript. Zkontrolujte, zda je v rozbalovacím seznamu s databázemi v druhém řádku vyplněná databáze demo. Pokud ne, vyberte ji (musíte nejprve kliknout do velkého podokna se skriptem, aby se seznam odemknul).

Vytvoření tabulky

 Do skriptu vložte tento příkaz, který vytvoří naši tabulku tříd (tabulka se jmenuje Tridy).

CREATE TABLE [Tridy] (
  [IdTrida] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  [Nazev] VARCHAR(50) NOT NULL,
  [TridniUcitel] VARCHAR(100) NOT NULL
)

Příkaz CREATE TABLE slouží k vytvoření tabulky. Za ním musí následovat název tabulky a pak v závorce seznam sloupců s jejich datovými typy a nastavením, jednotlivé sloupce se oddělují čárkou, pro přehlednost dávám každý na nový řádek).

Druhý řádek definuje primární klíč tabulky - první je vždy název sloupce, pak následuje datový typ a pak další nastavení. [IdTrida] je tedy název sloupce, INT je datový typ číslo, NOT NULL znamená, že nepovolujeme hodnotu NULL, tím pádem musí být položka vždy vyplněna, PRIMARY KEY říká, že se jedná o primární klíč (často se primární klíče deklarují zvlášť jako tzv. constraint - omezení, ale nám zatím stačí toto). IDENTITY(1,1) znamená, že se budou do tohoto sloupce dosazovat automaticky číselné hodnoty - první číslo je počáční hodnota pro první záznam a druhé číslo je přírůstek (každý další přidaný záznam má přiřazenou hodnotu vyšší než naposledy přidaný záznam právě o tento přírustek). Tím tedy máme nadefinovaný primární klíč.

Třetí řádek definuje druhý sloupec tabulky - název třídy. [Nazev] je název sloupce, VARCHAR(50) je datový typ pro textovou hodnotu, číslo v závorce je již zmiňovaná maximální délka textu a NOT NULL již známe, název tedy musí být vyplněn. Čtvrtý řádek je téměř stejný, bude obsahovat jméno a příjmení třídního učitele, maximální délka je 100 znaků.

Je dobré zvyknout si uzavírat názvy sloupců a tabulek do hranatých závorek, jazyk SQL obsahuje mnoho klíčových slov a pokud bychom chtěli pojmenovat sloupec klíčovým slovem, bez hranatých závorek by to nešlo. Proto je lepší je dávat všude, přestože to není nutné. Je dobré také upozornit na to, že každá firma má svůj vlastní styl co se týče pojmenování tabulek a sloupců (někde se pojmenovávají česky, jinde anglicky, primární klíče někde začínají předponou Id, jinde Id_, jinde tak končí, někde se píší klíčováslova velkými písemny, někde malými atd.) Je jedno, jaký styl člověk používá, ale rozhodně je více než vhodné použít v celé databázi styl stejný. Pokud nejste ve firmě a nenutí vás nikdo do konkrétního stylu, vymyslete si svůj a důsledně jej dodržujte.

Pokud tedy máte příkaz zapsaný v okně skriptu, stiskněte klávesu F5, aby se příkaz provedl. Ve spodním panelu se ukáže text Command(s) completed successfully, což znamená, že se operace zdařila.

Vazby mezi tabulkami

V drtivé většině případů chceme uchovávat data, která spolu nějak souvisí. Protože chceme do databáze přidat ještě tabulku žáků, musíme si tedy něco říci o tom, jak reprezentovat vazby mezi záznamy. Mohl bych vyrobit krásnou tabulku žáků (údaje jsou opět fiktivní), která ovšem bude mít hned několik nedostatků.

Špatně navržená tabulka

Jako první bych viděl to, že jména a příjmení jsou v jednom sloupci. Pokud bych chtěl setřídit žáky podle příjmení, abych v nich mohl snadno někoho vyhledat, bylo by to složité a pomalé (třídit lze jednoduše podle sloupců, ale jinak to až tak triviální není). Lepší tedy jistě bude udělat dva sloupce Jmeno a Prijmeni, pokud potřebujeme vypsat někde celé jméno, poskládáme si to až v aplikaci samotné a ne na úrovni databáze. Druhým nedostatkem je sloupec druhý - u každého žáka je vypsán název třídy. Pokud je žáků 5, ještě to tak nevadí, pokud jich bude 500 a nějaká třída se nám přejmenuje, budeme muset změnit mnoho záznamů v tabulce (dokonce ve dvou - v tabulce tříd i v tabulce žáků). Lepší by bylo vytvořit něco jako odkaz na záznam v tabulce tříd, pro přejmenování třídy stačí pak jen změnit název v tabulce tříd. A v neposlední řadě tato tabulka žáků nemá primární klíč (to, co vidíte nalevo jsou jen čísla řádků, ale to je věc programu, který s databází pracuje, v samotné tabulce takový údaj není). Pokud tedy budeme chtít smazat nějakého žáka, nemáme jej jak identifikovat - dva lidé jmenující se stejně je poměrně běžná věc.

Primární klíč zvládnemee přidat, vytvořit dva sloupce místo jediného také. Problémem je tedy zatím ta vazba. Kvůli ní se částečně také dělá primární klíč. Místo názvu třídy do tabulky žáků uložíme hodnotu primárního klíče konkrétní třídy z tabulky tříd. Kromě toho, že se hodnoty primárního klíče pro záznam většinou nemění (sice mohou, ale obyčejně se to nedělá), je porovnávání čísel rychlejší než porovnávání textů, což oceníme v okamžiku, kdy potřebujeme vypsat k jednotlivým žákům jejich třídní učitele.

Několik jednoduchých zásad pro návrh tabulek

Údaje stejného druhu patří do jedné tabulky. Nebudeme tedy pro každou třídu vytvářet novou tabulku pro její žáky, ale všechny žáky dáme do jedné tabulky a přidáme do ní speciální sloupec pro identifikaci třídy. Manipulace s daty v jedné velké tabulce je lepší než manipulace s deseti tabulkami.

Neopisujeme data z jiných tabulek pro vyjádření vztahu. Místo vypisování názvu třídy u každého žáka uvedeme hodnotu primárního klíče tabulky, čímž odkážeme na konkrétní záznam. Pokud bychom neměli pro třídy tabulku, je vhodné ji vytvořit, pokud víme, že se hodnoty budou často opakovat.

Každá tabulka má mít primární klíč. Abychom mohli jednoznačně identifikovat záznamy v tabulce, důsledně dodržujte vytváření primárních klíčů opravdu do každé tabulky.

Jistě by se dalo najít více zásad, ale tyto tři myslím stačí. Databáze jsou optimalizované pro databáze, které dodržují tato pravidla. Pokud tedy vazby vytvoříte tak, jak se mají, dosáhnete vyššího výkonu. Správně navržená tabulka žáků může vypadat takto:

CREATE TABLE [Zaci] (
  [IdZak] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  [Jmeno] VARCHAR(50) NOT NULL,
  [Prijmeni] VARCHAR(50) NOT NULL,
  [Pohlavi] BIT NOT NULL,
  [Narozen] DATETIME NOT NULL,
  [IdTrida] INT NOT NULL REFERENCES [Tridy]([IdTrida]),
  [Telefon] VARCHAR(20)
)

Většinu toho již známe, [IdZak] je primární klíč s automatickým dosazováním hodnot, [Jmeno] a [Prijmeni] je jasné, sloupec [Pohlavi] je typu BIT (přípustné hodnoty 0 - žena nebo 1 - muž), [Narozen] je typu DATETIME, což je datum a čas, [Telefon] je text a nemá NOT NULL, takže jej nemusíme vždy vyplnit (ne všichni prvňáčci mají mobil). Záměrne jsem ale přeskočil řádek [IdTrida], datový typ číslo a musí být vždy vyplněno. Klíčové slovo REFERENCES deklaruje vazbu bezi tabulkami (tzv. foreign key - cizí klíč). Za ním následuje název tabulky, do které odkazujeme a v závorce název sloupce (v našem případě primární klíč). To je celá věda, můžeme za tuto deklaraci přidat ještě ON DELETE CASCADE či ON DELETE SET NULL. Tím definujeme, co se má stát, pokud smažeme záznam, na který se odkazuje - první možnost smaže i tento záznam (pokud bychom tedy smazali třídu, smažou se automaticky i všechny záznamy, které na ni odkazují), druhá možnost nastaví hodnotu v tomto sloupci na NULL (všem žákům právě smazané třídy by se sloupec IdTrida nastavil na hodnotu NULL). To zatím používat nebudeme.

Zkopírujte tedy tento skript na vytvoření tabulky do Server Management Studia Express a spusťte klávesou F5 (předchozí skript smažte, jinak by se provedl také). Tím jsme vytvořili tabulku žáků a máme navrženou velmi jednoduchou databázi. Nyní se vrhneme na data.

Vkládání dat do tabulek 

Pokud chceme do tabulky přidat záznam, používáme příkaz INSERT. Musíme vždy vyplnit všechny sloupce označené NOT NULL, nevyplňujeme primární klíč, pokud má nastavenou IDENTITY, protože se vyplní sama. Struktura příkazu INSERT vypadá takto: 

INSERT INTO [Tridy] ([Nazev], [TridniUcitel]) VALUES ('1.A', 'Jolana Lupsonová')
INSERT INTO [Tridy] ([Nazev], [TridniUcitel]) VALUES ('1.B', 'Herberta Nováková')

INSERT INTO říká, že se má přidat záznam, následuje název tabulky, do které záznam přidáváme. Do závorky za sebe uvedeme názvy sloupců, které chceme vyplnit, oddělené čárkou. Pak následuje mimo závorku klíčové slovo VALUES a za ním v závorce hodnoty, které se do sloupců dosadí (v tom pořadí, v jakém jsme vypsali sloupce). Textové hodnoty ohraničujeme znaky ' (apostrof), čísla píšeme bez apostrofů.

Pokud spustíte tyto dva příkazy, vloží se do tabulky tříd tyto dvě třídy - třída 1.A s třídní učitelkou Jolanou Lupsonovou a třída 1.B s paní učitelkou Herbertou Novákovou (jména jsou opět fiktivní). První záznam se očísloval číslem 1 a druhý číslem 2, pokud jsme před tím do tabulky již nezasahovali. Tady můžeme jména a příjmení třídního učitele dát dohromady, nemáme totiž žádnou tabulku učitelů (pro účely tohoto článku je to zbytečné), pakliže bychom ji měli, dali bychom sem jen odkaz na cizí klíč v tabulce učitelů.

Vložte tedy ještě tyto žáčky do tabulky žáků: 

INSERT INTO [Zaci] ([Jmeno], [Prijmeni], [Pohlavi], [Narozen], [IdTrida], [Telefon])
  VALUES ('Tomáš', 'Dvořáček', 1, 'January 3, 2001', 1, NULL)
INSERT INTO [Zaci] ([Jmeno], [Prijmeni], [Pohlavi], [Narozen], [IdTrida], [Telefon])
  VALUES ('Lenka', 'Nová', 0, 'November 6, 2000', 1, '314 212 111')
INSERT INTO [Zaci] ([Jmeno], [Prijmeni], [Pohlavi], [Narozen], [IdTrida], [Telefon])
  VALUES ('Lucius', 'Moudrý', 1, 'August 24, 2001', 2, '987 654 321')
INSERT INTO [Zaci] ([Jmeno], [Prijmeni], [Pohlavi], [Narozen], [IdTrida], [Telefon])
  VALUES ('Zuzana', 'Jetelová', 0, 'June 19, 2001', 2, NULL)
INSERT INTO [Zaci] ([Jmeno], [Prijmeni], [Pohlavi], [Narozen], [IdTrida], [Telefon])
  VALUES ('Petr', 'Hubert', 1, 'March 23, 2000', 2, NULL)

Pokud chceme předat datum, máme několik povolených formátů pro jeho předání. U každé databáze je to trochu jinak, pokud předáváme jen datum, můžeme jej zadat ve formátu Měsíc Den, Rok, kde měsíc je anglický název měsíce. Pokud zadáváme datum i čas zároveň, doporučuje se tento formát 2007-08-23 15:36:24.000. Pokud nechceme zadat nějaký údaj, napíšeme místo něj NULL (ne do apostrofů).

Výpis záznamů z tabulky

Pro výpis dat z tabulky slouží příkaz SELECT. Za něj zapíšeme názvy sloupců, které chceme vrátit, pak napíšeme FROM a název tabulky. Můžeme specifikovat setřídění či podmínku. Pokud chceme všechny sloupce, napíšeme hvězdičku.

Výběr všech žáků

SELECT * FROM [Zaci]

Všichni žáci

Vybrat jen příjmení a telefony

SELECT [Prijmeni], [Telefon] FROM [Zaci]

Jen příjmení a telefony

Vybrat jen dívky

SELECT [Jmeno], [Prijmeni] FROM [Zaci] WHERE [Pohlavi] = 0

Jen dívky

Vybrat žáky narozené po 1. 1. 2001 a jen ze třídy 1.B

SELECT * FROM [Zaci] WHERE [Narozen] > 'January 1, 2001' AND [IdTrida] = 2

Jen děti narozené po 1.1.2001 a z 1.B třídy

Vybrat jen chlapce a seřadit je podle příjmení

SELECT * FROM [Zaci] WHERE [Pohlavi] = 1 ORDER BY [Prijmeni]

Chlapci seřazení podle příjmení

Žáci, kteří nemají telefon, seřazení podle data narození sestupně

SELECT * FROM [Zaci] WHERE [Telefon] IS NULL ORDER BY [Narozen] DESC

Žáci bez telefonu seřazení podle od nejmladších po nejstarší

 Žáci seřazení podle třídy a pak podle příjmení

SELECT [IdTrida], [Prijmeni] FROM [Zaci] ORDER BY [IdTrida], [Prijmeni]

Žáci seřazení podle třídy a pak podle příjmení

Shrnutí

 Na těchto příkladech jsme si ukázali mnoho variant příkazu SELECT a různé specifikace kritérií. Známe tedy klíčové slovo ORDER BY, kterým dovedem třídit záznamy podle definovaných sloupců, klíčové slovo DESC, které řadí sestupně (ORDER BY [Prijmeni] řadí od A do Z, ORDER BY [Prijmeni] DESC řadí od Z do A). Umíme také specifikovat podmínky pomocí slova WHERE, operátory jsou přesně jako v jazyce Visual Basic - (je menší <, je větší >, je menší nebo rovno <=, je větší nebo rovno >=, rovná se = a nerovná se <>), stejně jsou i logické operátory (AND - a, OR - nebo, NOT - ne).

Spojení dvou tabulek příkazem JOIN

Zvlášte u posledního příkladu na seřazení podle třídy a příjmení by se hodilo řadit ne podle ID třídy, ale podle názvu třídy, a místo ID vypsat právě název této třídy. Toho dosáhneme na úrovni databáze příkazem JOIN.

SELECT [Zaci].[Prijmeni], [Tridy].[Nazev]
FROM [Zaci] 
JOIN [Tridy] ON [Tridy].[IdTrida] = [Zaci].[IdTrida]
ORDER BY [Tridy].[Nazev], [Zaci].[Prijmeni]

Je to již trochu složitější - protože tabulky mohou obsahovat sloupce stejných názvů, je dobré před každý název sloupce přidat ještě název tabulky, ze které pochází. Vybíráme tedy sloupec [Prijmeni] z tabulky [Zaci] a sloupec [Nazev] z tabulky [Tridy] z tabulky [Zaci] a k výsledkům připojíme tabulku [Tridy] tak, aby hodnoty sloupců [IdTrida] v obou tabulkách byly stejné. Setřídění už je jasné.

Pokud spojujeme dvě tabulky, je nutné vždy uvést podmínku spojení - podle jakého klíče se k sobě záznamy z tabulek mají přiřazovat. V našem případě spojíme, když se [Zaci].[IdTrida] rovná [Tridy].[IdTrida].

Přiřazování vazeb mezi tabulkami

Zkrátka ke každému řádku v tabulce [Zaci] se najde záznam s odpovídajícím ID v tabulce [Tridy].

Ještě existuje rozdíl mezi tzv. INNER (vnitřní) a OUTER (vnější) joinem. Ani jeden se nás nyní netýká, protože ve sloupci IdTrida nesmí být hodnota NULL, ale je dobré rozdíl mezi nimi zmínit. Pokud má cizí klíč hodnotu NULL, INNER JOIN jej vynechá a s ničím jej nespojí, naopak OUTER JOIN spojení provede a do všech sloupců z připojované tabulky nastaví hodnotu NULL.

Samotný JOIN, který jsme použili nyní, je automaticky INNER JOIN. Pokud by se v tabulce [Zaci] ve sloupci [IdTrida] objevila hodnota NULL, INNER JOIN by záznam vynechal. Pokud chceme použít OUTER JOIN, musíme napsat LEFT JOIN nebo RIGHT JOIN, podle toho, jestli chceme povolit nulové hodnoty v první tabulce nebo v druhé (té připojované). Častější je LEFT JOIN, pokud by se tedy v tabulce [Zaci] ve sloupci [IdTrida] vyskysla hodnota NULL, spojení se provede a do všech sloupců připojované tabulky se nastaví hodnota NULL. Takže název třídy pro tento řádek bude také NULL. Nejčastěji se tedy používá buď samotné JOIN, nebo LEFT JOIN.

Editace záznamů

Často potřebujeme nějaká data v tabulce změnit, například již zmiňovaná situace změny názvu třídy. Přišel totiž nový rok a z prvňáčků jsou druháci. Je tedy třeba změnit jejich názvy tříd. To obstará příkaz UPDATE.

UPDATE [Tridy] SET [Nazev] = '2.A' WHERE [IdTrida] = 1

Obecně tedy napíšeme UPDATE, dále název tabulky, pak slovo SET a přiřazení sloupec = hodnota (může jich být víc oddělených čárkou). Následuje podmínka, která jednoznačně určí, které záznamy se mají upravit. Pokud ji nezadáte, upraví se všechny!

Ze třídy 1.B se tedy má stát třída 2.B, ale zároveň jejich paní učitelka odešla do důchodu a vystřídal ji pan učitel. Musíme tedy upravit dvě hodnoty.

UPDATE [Tridy] SET [Nazev] = '2.B', [TridniUcitel] = 'Josef Lukeš' WHERE [IdTrida] = 2

Mazání záznamů

Někdy je třeba záznamy smazat, k tomu máme příkaz DELETE. Napíšeme DELETE FROM, dále název tabulky a pak podmínku, která řekne, které záznamy se mají smazat. Opět platí, že pokud ji nezadáme, smaže se vše!

DELETE FROM [Zaci] WHERE [IdZak] = 3

Další "čachry" s databázemi

Kdyby databáze uměly jen toto, vyvíjely by se aplikace poměrně špatně. Vazby mezi daty bývají často velmi složité a není možné je popsat takto triviálními prostředky. Zmíním se tedy krátce o dalších prvcích, které může databáze obsahovat.

Pohledy (VIEW) slouží ke zjednodušení běžných SELECT příkazů. Pokud budu psát redakční systém, kde mám tabulku autorů, článků a kategorií, zcela jistě si udělám pohled, který mi vypíše články již spojené se jmény autorů a názvy kategorií. Pak napíšu jen SELECT * FROM ViewClanky, kde ViewClanky je název daného pohledu, a je to stejné, jako kdybych psal SELECT * FROM Clanky LEFT JOIN Autori ... LEFT JOIN Kategorie ... atd.

Uložené procedury (Stored Procedures) slouží k provedení více operací najednou. Je to víceméně totéž co procedury v běžných programovacích jazycích - dostanou nějaké parametry, provedou určité příkazy a ještě umí vrátit nějaká data (např. tabulku). U složitějších databází se často nepracuje přímo s tabulkami, ale každá tabulka má vytvořené procedury pro přidávání, opravy a mazání záznamů, kde se dají například kontrolovat oprávnění pro provedení akce a různé další funkce.

Triggery jsou jakési reakce na událost. Pokud například přidáme záznam do tabulky nebo jej smažeme či upravíme, můžeme naprogramovat trigger, který provede další akci (třeba odešle e-mail, i to databázové servery často umí).

Schémata slouží hlavně v obrovských a složitých databázích, kde máme hodně tabulek a je možné, že nastanou konflikty v pojmenováních. Můžeme tedy vytvořit schémata, která se zapisují před název tabulky, a díky tomu smečku tabulek rozdělit an několik logických celků.

Závěrem

To by bylo pro začátek vše, doufám, že jsem vám moc nezamotal hlavu. Databáze toho umí opravdu hodně, toto je skutečně jen úvod. Nevím, jestli k tomu dojde, ale možná ještě napíšu článek o pohledech a procedurách, ty lze velmi dobře využít ku prospěchu věci.

 

hodnocení článku

2 bodů / 2 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Mohlo by vás také zajímat

Začínáme s ASP.NET - díl 5.: Jednoduché diskusní fórum

Po delší odmlce přichází pátý díl oblíbeného seriálu o programování v ASP.NET 2.0. V tomto díle si ukážeme, jak používat komponentu FormView pro přidávání záznamů do databáze. Také si ukážeme nejčastější útoky na webové aplikace a hlavně způsoby, jak jim zabránit. Také si předvedeme, jak validovat a kontrolovat vstupy uživatele jednoduše a spolehlivě.

Stopařův průvodce po databázích - díl 1.: Lehký úvod – teorie databází

První díl přináší teoretické seznámení s databázovými systémy a jejich rozdělením.

Stopařův průvodce po databázích - díl 5.: Fyzické soubory databáze – datové soubory a transakční log

Každá běžná databáze je fyzicky reprezentována soubory. V tomto článku se dočtete o jejich významu v Microsoft SQL Serveru.

 

 

Nový příspěvek

 

Diskuse: Úvod do jazyka SQL

Zdravim

ja mam problem s instalaciou uz som skusal 2005 2008 a teraz 2012 no stale nemozem najst Server Management Studio mam tu iba configuration tools ....

kde je problem ??

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Dobrý den,

děkuji za superweb. Jsem začátečník a chci si udělat program zatím jen ve VB winform (následně v ASP.NET). Prošel jsem rubriku začínáme VB.NET a přešel na MSSQL, které do svého programu budu potřebovat. Umím už z Vaších článků ze své databáze v MSSQL 2008 dostávat data do základních komponentů VB. Ale nikde jsem se zde nedočetl nebo nenašel nebo správně nepochopil jak dostat data zadaná uživatelem teclive do VB do MSSQL.

Mockrát děkuji a 1* za web

Hanes

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Dobrý den,

moc děkuji za výborné a srozumitelné články. Chtěl bych se zeptat, v čem spočívá rozdíl níže uvedených zápisů:

CREATE TABLE Dodavatel

(ID INT IDENTITY(1,1),

Nazev VARCHAR(30),

ICO VARCHAR(20),

CONSTRAINT pk_dodavatel PRIMARY KEY (ID))

-- varianta 1

CREATE TABLE Produkt

(ID INT IDENTITY(1,1),

Popis VARCHAR(10),

DodavatelID INT,

CONSTRAINT pk_produkt PRIMARY KEY (ID))

ALTER TABLE Produkt

ADD CONSTRAINT fk_prodej_dodavatel FOREIGN KEY (DodavatelID) REFERENCES Produkt(ID)

GO

-- varianta 2

CREATE TABLE Produkt

(ID INT IDENTITY(1,1),

Popis VARCHAR(10),

DodavatelID INT, REFERENCES Dodavatel(ID)

Děkuji za vysvětlení. Honza

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Ahoj Tome,

máš talent napsat i svojí knížku nebo to i vyučovat. V podstatě jsi popsal SQL základy na A4 a odborné knížky např. z Computer Pressu předávají stejnou informaci složitěji a 4x obsáhleji.

Bylo by hezké prohlédnout si Tvůj návod např. na MS Access jak se provádějí jednoduché výpočty v dotazech nebo formulářích :-).

Krásné Vánoce všem. Tomáš Kadlec

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Opět chvála ;-) Dělal jsem něco v Accesu a nyní potřebuji přejít na SQL. Acces měl vyřešenou grafickou nádstavbu, což mi vyhovovalo (tvorba tabulek, formuláře, atd. atd.). Existuje něco friendly i pro SQL? Ještě dotaz, je možno nějak naimportovat data z SQL databáze do databáze vytvořené v ACCESU?

Díky za případnou odpověď.

Lupen

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Microsoft SQL Server Management Studio

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Ahoj, potreboval bych vymazat vsechna data, ktera zobrazi nasledujici select:

select trp.*

from cml_fut.t_role tr, cml_fut.t_role_privilege trp

where tr.role_dsc like '%User_%' and tr.role_id= trp.role_id;

Nemohu prijit na to, jak se pouziva delete na vic nez jednu tabulku.

Dekuji,

Martin

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Musíte mazat zvlášť, ideální je na to si udělat stored proceduru.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Nazdar v článku píšete "Nechte standardní nastavení a klikněte na tlačítko Connect." , ale ak nehám všetko na štandartnom nastavení je tláčitko connect akoby enabled=false :/ a ked napíšem do server name napríklad localhost tak vypíše chybu že sa nemôže pripojiť :( .

Za pomoc predom dakujem.

PS: chyba : TITLE: Connect to Server

------------------------------

Cannot connect to test.

------------------------------

ADDITIONAL INFORMATION:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) (Microsoft SQL Server, Error: 53)

For help, click: http://go.microsoft.com/fwlink?ProdName=...

------------------------------

BUTTONS:

OK

------------------------------

nahlásit spamnahlásit spam 0 odpovědětodpovědět

problem vyrieseny :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Dobrý den,

potřebuji radu.Při vytvoření nové databáze mi pokaždé vyskočí tato hláška:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.Express.ConnectionInfo)

------------------------------

CREATE DATABASE permission denied in database 'master'. (Microsoft SQL Server, Error: 262)

Díky za pomoc

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nemáte práva pro vytvoření databáze. Zkuste Management Studio spustit jako administrátor.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji mockrát za bleskovou odpověď, už to jde.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Dobrý den,

mohu se zeptat, jak jednoduše zmenšit transakční log u MS SQL 2000? Zatím jsem to řešil úplným backupem, následnou obnovou (na stejné místo) a pak mi již šlo provést Shrink database (u transakčního logu).

Určitě to lze vyřešit jednodušeji, napadá Vás jak?

Předem díky,

Vašek P.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

SHRINK DATABASE

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Děkuji za naprosto přesné vysvětlení začátku SQL moc mně to pomohlo ve samostudiu SQL .dík

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Je možno zobrazit údaj z SQLtabulky (obsahující např.jediný údaj) tak, aby v závislosti na jeho hodnotě se zobrazil v mřížce(GridView) "vypočítaný" text?

Př: hodnota údaje = 1 text v mřížce chci:"VBnet"

hodnota údaje = 2 text v mřížce chci:"C#"

Nechce se mi to řešit další tabulkou a propojením obou tabulek, ale pokud to jinak nepůjde...

Díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Něco takového (klidně to napište do jednoho řádku, já jsem to rozepsal, aby to bylo přehledné, výsledek najdete ve sloupečku Jazyk).

SELECT (
  CASE Typ  
    WHEN 1 THEN 'VB.NET'
    WHEN 2 THEN 'C#'
    ELSE 'neznámý'
  END
  ) AS Jazyk
FROM ...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Hned jsem přece říkal, že to tak půjde...;-))

Tak děkuju.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Dobrý den, mohl by mi prosím někdo poradit, jak lze přejmenovat název SQL serveru v Management Studiu? (MSSQL 2005 Express Edition)

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Ahoj Tome, musím jen potvrdit chválu, co tu na tebe pějí, vzhledem ke svému věku máš talent věci vysvětlovat logicky a přímočaře, nezapomínáš na žádné maličkosti v začátcích, což se naopak často v obdorných publikacích určených začátečníkům děje. Sám studují Vysokou školu manažerské informatiky, přesto na tvých stránkách nacházím jasně vysvětlené věci, se kterými jsem dosud nepřišel do styku. Děkuji, Ondřej

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Nerad přehnaně chválím, ale Váš sloh a logika výkladu je opravdu jedinečná a na českém internetu vzácná.

Doufám(e), že než Vás zakoupí nějaká bohatá firma, stihnete ze mě podobnými články ještě NĚCO udělat ;-)

Díky.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Doufám, že až budu v bohaté firmě, budu mít stále čas na psaní svých článků.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Zrovna dneska jsem uvažoval, jak se vyslovuje "Oracle". Nebo jinak, jak to čtete vy?

Orejkl? Orákl? ;-)

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Nejsem expert na angličtinu a moje výslovnost nepatří k těm dobrým, ale já osobně to vyslovuji "Orekl".

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do jazyka SQL

Přimlouvám se (a věřím, že ne toliko za sebe), aby "k tomu došlo"! Předem děkujeme!

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback