Úvod do jazyka SQL

Než začnu s popisem SQL jazyka a PostgreSQL, měl bych vás seznámit se základními pojmy, které se v databázích používají. Bez jejich znalosti se mezi databázisty nedorozumíte a nerozuměli byste ani tomuto tutoriálu.

Základní pojmy

PostgreSQL
(dříve zvaná Postgres) je relační databáze fungující na bázi server – klient (jako většina databází). Na první pohled to vypadá složitě, ono kolem databází taky vznikla celá věda, ale pro domácí použití vám bude stačit pochopit pár následujících pojmů. Pokud je nepochopíte všechny hned, nevadí, jejich význam vysvětlím na příkladech v dalších kapitolách.
Databáze
je nějaký soubor uložený kdesi na disku. Struktura tohoto souboru je tvořena tabulkami (a relacemi mezi tabulkami). Tabulky obsahují řádky a sloupce.

Například můžete vytvořit tabulku se jménem telefonni_seznam, která bude obsahovat dva sloupce se jmény jmeno a telefon. Řádky pak budou tvořit jednotlivé záznamy v tabulce (Kolik budete mít záznamů jmeno + telefon, tolik budete mít řádků).

telefonni_seznam
jmeno telefon
James Bond 02/12345
Karel IV. 02/012345

Jako databázi můžete považovat klidně i soubor Excelu. Ale taky můžete mít dočasnou databázi jen v paměti počítače.

Databáze je také označení pro program, který pracuje s databázovým souborem. PostgreSQL je jedním takovým programem (o dalších se dočtete dále). V tomto smyslu se o databázi hovoří jako o DBMS (viz dále).

Databáze nemusí mít vůbec nic společného s počítači. Databází je i váš papírový telefonní seznam.

Databáze je označení pro model dat (jen jakousi ideu, jak se budou data ukládat a v jakém budou vztahu).

Databázový program často pracuje s více než jedním databázovým souborem. Všechny soubory dohromady (na jednom počítači) se pak označují jako databáze, resp. catalog a jednotlivé „databáze“ se označují jako schemata nebo workspace. (Databáze může obsahovat několik schémat, která se liší svým jménem a místem, kam se ukládají data).

Jak vidíte, pojem databáze je hodně zneužívaný a tak není občas jasné, co se jím myslí. Většinou to poznáte z kontextu, ve kterém se o „databázi“ hovoří.
Cluster, Catalog, Schéma, Tabulka

Cluster, Catalog, Schéma, Tabulka

Definice dle SQL standardu:

  • Databázový server je cluster. (DBMS)
  • Cluster má catalogy. (Catalog = Database)
  • Catalogy obsahují schemata (=workspace).
  • Schemata obsahují tabulky.
  • Tabulky obsahují řádky.
  • Řádky obsahují data, definovaná pomocí sloupečků.

V tomto tutoriálu budete pracovat s jedním DBMS a s jedním clusterem, ze začátku pouze s jedním schématem ve kterém si budete definovat tabulky. Když budu mluvit o databázi, budu mít nejčastěji na mysli DBMS nebo schéma.

SŘBD, DBMS
systém řízení báze dat, database management system – vznešený název pro celý databázový program (např. PostgreSQL). S těmito pojmy se určitě setkáte ve škole, jinak každý říká databáze :-).
Relace
je vztah mezi tabulkami v databázi. Například můžete mít tabulku obsahující názvy hudebních CD a tabulku obsahující jména zpěváků. Vztah, který určí které CD patří kterému zpěváku, se zove relací. Až se budete učit relace používat, pochopíte a osvojíte si je rychle.
Server
Tím se zde myslí program, který se stará o soubory databáze. Zapisuje do nich, čte z nich a vrací data klientovi. Udržuje informace o přístupových právech k databázím a je jediný, kdo s daty fyzicky pracuje.
Server běžně běží na nějakém vzdáleném počítači, kde se data ukládají a k tomuto počítači mívá přístup více klientů skrze internet.
Klient a server můžou být na jednom počítači, což už víte z předchozí kapitoly.
Server běží jako proces na pozadí a vyčkává, dokud se neozve klient. V PostgreSQL se o tyto činnosti stará program postgres, který často běží ve více instancích, aby zvládal obsluhovat více klientů.
Klient
je také program. Klient říká serveru, co má udělat, jaká data z tabulky má vrátit, jaká tam má vložit, jaká smazat atd. Klient se vůbec nestará o to, jakým způsobem a kde jsou data uložena, komunikuje pouze se serverem pomocí SQL příkazů.
V PosgreSQL je jeden z klientů program psql. Ale klientem může být také modul do PHP nebo jiných programovacích jazyků, které umožňují komunikovat se serverem.
Primární klíč
je hodnota v sloupci, který obsahuje jedinečné, unikátní hodnoty (sloupec primárních klíčů se obvykle jmenuje id – id jako identifikátor). Proč se tomu říká klíč a ne identifikátor zůstává nevyřešenou záhadou (že by to byl klíč k poznání?).

Chcete-li si vést databázi zaměstnanců, může se vám stát, že dva zaměstnanci budou mít stejné jméno. Jak takové zaměstnance od sebe odlišit? Zavedením sloupce primárních klíčů! To může být sloupec s rodnými čísly, nebo prostě jen (jedinečnými) čísly. Každá tabulka, do které se odkazujete z jiné tabulky, by měla mít primární klíč.

Primárním klíčem může být nejen číslo, ale třeba i řetězec (jméno apod.). Musíte mít ovšem jistotu, že nikdy nebudete mít dva lidi se stejným jménem.
Jméno, oproti číslu, by zbytečně zabíralo místo v tabulkách, kde se na tuto hodnotu primárního klíče odkazujete. Číslo vám vždy zabere méně místa, takže se běžně používá jako primární klíč (id) – celé nenulové kladné číslo.

O to, že bude hodnota primárního klíče pro celou tabulku (v rámci sloupce) unikátní, se už postará SŘBD. Vy jen musíte říct, který sloupeček obsahuje primární klíče (o tom jak se to dělá někdy příště).

Zaměstnanci
id jmeno plat
1 Leoš Janáček 13000
2 Tomas Mann 15000
3 Leoš Janáček 20000
Cizí klíč
je hodnota primárního klíče z jiné tabulky (ve sloupci cizích klíčů, například se jménem id_zamestnance).

Řekněme, že tabulka která bude zaznamenávat příchody vašich zaměstnanců, bude obsahovat kromě sloupce s daty příchodů ještě sloupec, do kterého se budou zapisovat primární klíče z tabulky zaměstnanců. (A relace je na světě :-)).
Cizí klíče v tomto sloupci se pochopitelně budou opakovat. (Odhadnete, kolik bytů ušetříte tím, že nepoužíváte jako primární klíč jméno? A nejen že tím šetříte místo, ale také zvyšujete rychlost práce s takovouto databází).

Příchody
cas id_zamestnance
"Pondeli, 07:30" 1
"Utery, 07:00" 2
"Utery, 07:30" 1
"Utery, 08:30" 3

Pokud zvládnete říci, ve které dny a v kolik přišel do práce Leoš Janáček co bere 13000, gratuluji, můžete svůj mozek označit za relační :-).

Structured Query Language

Nyní už víte, co je to ta relační databáze, a zbývá jen říct, co je to to záhadné SQL.

Jak již bylo řečeno, máme tu serverovou aplikaci, která se stará o databáze a mnoho klientských aplikací, které z jedné strany komunikují se serverovou aplikací a z druhé strany s vámi. SQL je tzv. dotazovací jazyk, který slouží k ovládání relačních databází. Tímto jazykem se server domlouvá s klientem. To zaručuje jistou hardwarovou i softwarovou nezávislost, pokud doručíte serveru požadavek v jazyce SQL, bude mu rozumět a je mu jedno, od koho ho dostal.

Ukázka SQL jazyka:

SELECT * FROM phone WHERE name = 'Sinead' and surname = 'O\'Connor';

Jak vidíte, SQL je podobné anglickému jazyku. Příklad říká: Vyber všechno z tabulky phone kde je jméno Sinead a příjmení O'Connor. (Všimněte si, že se textové hodnoty uzavírají do uvozovek. A pokud text sám obsahuje uvozovku, musí se před ní napsat zpětné lomítko.)

ANSI/ISO SQL standard

Existuje mnoho firem, které vytvářejí aplikace na bázi jazyka SQL (PostgreSQL, MySQL, Oracle atd.). Ačkoli je tu snaha o vytvoření univerzálního jazyka a vytvářejí se normy jazyka SQL, kterým by měl rozumět každý program založený na SQL, stále existují drobné (i nedrobné) rozdíly mezi různými implementacemi SQL.

Tyto rozdíly by vás mohly vyvést z míry, pokud zde probírané příklady budte zkoušet na jiném SQL softwaru, než je PostgreSQL.

ANSI/ISO SQL standard
RokOznačeníPodrobnosti
1986SQL86ANSI
SQL87ISO
1989SQL89Základní verze normy. Nedůležité.
1992SQL92Moderní koncepce relační DB.
1999SQL99Objektová orientace, rekurze, reg-výrazy, triggery …
2003SQL2003XML, funkce oken, sekvence, generické sloupce
2006SQL2006xml-sql, XQuery
2008SQL2008 spouště INSTEAD OF, truncate, order by …

Případné nesrovnalosti byste měli dohledat v dokumentaci k vašemu systému řízení databázových dat. V dokumentaci PostgreSQL se občas dočtete, co je a co není dle normy. Normy zcela nezvládla implementovat žádná databáze a už asi nikdy ani nezvládne, protože normy vznikly až po DBMS a zpětně se chování databází mění jen těžko (kvůli zpětné kompatibilitě). Navíc některé požadavky norem jsou prostě nereálné. Takže zapomeňte na normy, studujte dokumentaci.

V Linuxu, distribuci OpenSuSE, existuje balíček postgresql-docs. Po jeho nainstalování najdete informace o PostgreSQL v adresáři /usr/share/doc/packages/postgresql96/ (začněte dokumentem html/index.html)
Na internetu se můžete podívat například na http://www.pgsql.cz/index.php/PostgreSQL nebo oficiální zdroj (v angličtině) http://www.postgresql.org/docs/9.4/interactive/.

Pozn: Některé rozdíly nejsou až tak drobné. Například mohou v nějaké implementaci DBMS existovat datové typy nebo celé SQL konstrukce, které v jiné nejsou. Nebo se mohou stejné SQL příkazy chovat odlišně. Třeba zde dříve probrané vytváření uživatele a databáze v PostgreSQL, MysSQL i Oracle se liší až odstrašujícím způsobem. Ale nebojte, všechno vám vysvětlím :-).

DBMS

Zde je popis databází, které jsem vybral pro tento tutoriál. Všechny jsou to SQL relační databáze.

Existují i ne-sql databáze, ale ty se obvykle používají k jiným účelům než SQL databáze, často jako doplněk k SQL databázi. SQL databáze vládnou světu!

Existují i jiné SQL databáze, například od Microsoftu MSSQL, ale nemůžu tu popisovat úplně všechno
(= nerozumím úplně všemu).

PostgreSQL

PostgreSQL je asi nejlepší free opensource databází co existuje. Říkám asi, protože se vždycky najde nějaký rýpal, co tvrdí, že MySQL je lepší. Mezi PostgreSQL a MySQL je velká rivalita. Dřív se tvrdilo, že PostgreSQL je stabilnější a víc toho umí, zatímco MySQL je jednodušší a rychlejší. Pak se tvrdilo, že to závisí na tom, jaká a kolik dat zpracováváte a dneska se tvrdí bůh ví co.

PostgreSQL je následníkem databáze Postgres (která tím zanikla), ale běžně se jí pořád říká Postgres.

Postgres dnes najdete často i na (free) webovém hostingu, ale pořád to nebývá tak často, jako MySQL. přežívá mýtus o tom, že MySQL je méně náročná na hardware a že pokročilé funkce PostgreSQL stejnak většina nevyužije.

Pokud se chcete dozvědět něco dalšího o historii či budoucnosti PostgreSQL, podívejte se třeba na wikipedii.

Dle mých zkušeností je PostgreSQL skutečně stabilnější a umí toho více než MySQL, ale osobní zkušenost se dá těžko zaměňovat za objektivní pravdu :-).

MySQL a MariaDB

MySQL je novější DBMS než PostgreSQL. Její hlavní nevýhodou je, že ji koupil Oracle. Neumím věštit budoucnost, ale nepředpokládám, že by chtěl Oracle do rozvoje MySQL nějak moc investovat a odebírat tak zákazníky své vlastní databázi.

A protože si to nemyslím jen já, a protože MySQL byla vyvíjena pod licencí GNU, vznikl projekt MariaDB.

Která z těchto databází přežije ukáže čas. Velkou nevýhodou MariaDB je absence dokumentace (ta je totiž nyní výhradním vlastnictvím Oracle). Zatím je MariaDB věrnou kopií MySQL, takže když jí budete používat, nepoznáte oproti MySQL rozdíl. To však nevydrží na věky. Poslední verze MariaDB už nekopíruje na 100% vývoj MysQL, ale tohoto kurzu se to nijak nedotýká …

SQLite

SQLite je malý relační databázový systém, který je obsažený v malé knihovně. Nefunguje na principu klient-server. Hodí se všude tam, kde chcete ukládat databázová data, ale nechcete ztrácet čas implementací. Když znáte SQL, jediné co potřebujete je malá SQLite knihovna a máte vystaráno.

SQLite je také velmi populární. Používá jej například prohlížeč Chrome, Skype, Subversion, dokonce i Apple SQLite využívá. SQLite podprouje mnoho programovacích jazyků (C, C++, PHP, Java, Python, Ruby …).

SQLite se zkrátka hodí, když si vystačíte s jedním (relativně) malým souborem pro ukládání dat, nepotřebujete řešit přístupová práva nebo přístup mnoha uživatelům k datům najednou (= paralelní přístup), ani vzdálený přístup (přes síť).

Oracle

Oracle je jednak název firmy (Oracle Corporation) a jednak název jejího databázového systému řízení dat (Oracle Database). Oracle je tak drahý, že si ho určitě nemůžete dovolit (ani firmu, ani databázi). Naštěstí existuje verze pro testování Oracle Database Express Edition, jak bylo popsáno v kapitole o instalaci.

Oracle je hodně stará databáze (první verze Oracle je z roku 1978, Postgres 1989, MySQL 1995 a SQLite 2000), proto má občas podivnou „filozofii“ v tom jak zacházet s uživateli, schématy, datumy a taky si nehraje moc na SQL normy.

Tedy, podivné vám to příjde, pokud už pracujete s PostgreSQL nebo MySQL. Pokud ještě s žádnou databází pracovat neumíte, těžko poznáte, co je normální a co podivnost :-)

Oracle je bezesporu nejúspěšnější komerční databáze. A taky toho hodně umí a umí to dobře (nenechte se zmást tím, že je nejstarší). Jen ta cena …

Komentář Hlášení chyby
Created: 11.9.2005
Last updated: 5.9.2015
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..