2. Základy SQL

2.1 Úvod do SQL (popis a vlastnosti)

2.2 Základní pojmy v SQL

2.3 Rozdělení příkazů SQL dle prováděné činnosti

2.3.1 Příkazy pro definici datových struktur (DDL)

 

2. Základy SQL

2.1 Úvod do SQL (popis a vlastnosti)

SQL - Structured Query Language (Strukturovaný dotazovací jazyk) - je obecný nástroj pro manipulaci, správu a organizování dat uložených v databázi počítače. Je v prvé řadě určen uživatelům, i když jej v mnoha směrech využívají i tvůrci aplikací. Je adaptovatelný pro jakékoliv prostředí.

Název tohoto nástroje je sice stručný, není však výstižný. SQL totiž není pouze dotazovací jazyk, s jeho pomocí je možno také definovat data, tedy strukturu tabulky, naplňovat sloupce tabulky (pole záznamů) daty a definovat vztahy a organizaci mezi položkami dat. Dále umožňuje řízení přístupu k datům, tedy udělování a odebírání přístupových oprávnění na různých úrovních, čímž chrání data před náhodným nebo úmyslným zničením, neautorizovaným čtením nebo manipulaci s nimi, dále také umožňuje sdílené využívání dat a zajišťuje hladký průběh činností, přistupuje-li k datům více uživatelů současně.

SQL je specializovaný programovací jazyk, který se používá ve vhodném prostředí buď uživatelsky nebo interaktivně k okamžitému řešení úloh (nejčastěji dotazy), nebo se jeho příkazy vkládají do hostitelského jazyka. SQL není však plnohodnotným samostatným programovacím jazykem, např. proto, že se v něm ve většině implementací nenachází řídicí programové konstrukce a další požadované prvky, které by měl obsahovat každý obecný programovací jazyk. SQL je tedy standardizovaný nástroj pro práci s relačními databázemi. Nepředstavuje databázový systém, ale různě integrovanou součást systému řízení bází dat.

SQL je především interaktivní dotazovací jazyk - umožňuje získat odpovědi i na velmi komplikované dotazy téměř ihned. Je nástrojem neprocedurálním, s množinovým přístupem k datům a je jazykem standardizovaným, je srozumitelný, protože chápe data v podobě tabulek, což je snadno pochopitelné i uživatelům. Pracuje s relačními databázemi, ve kterých se uživatel dívá na data v podobě soustavy provázaných tabulek. Každá tabulka představuje množinu dat, která je uspořádaná v řádcích (záznamech) a sloupcích (položkách). Na hodnotu dat se uživatel odkazuje jako na prvek v matici.

V převážné většině případů je výsledkem úlohy popsané v SQL nějaká množina dat z jedné nebo více tabulek, tzv. tabulka výsledků, která nemusí být vždy konečným produktem. Může sloužit jako množina vstupních údajů pro další zpracování. Např. pro výtisk etiket nebo vykreslení grafu, atd.

SQL může sloužit jako “společná řeč“, zejména při provozu v sítích, na kterých se používají různé databázové produkty.

Jazyk SQL se používá také k vytváření náhledů (dotazů). Náhledy SQL umožňují vytvořit pro různé uživatele různé pohledy na struktury tabulek a na data. Každý uživatel tak vidí pouze ta data, která má vidět. Přitom data vidí uživatel opět v podobě jednoduché tabulky, i když ve skutečnosti data pocházejí z různých tabulek. Data zobrazovaná v náhledech jsou dynamická, tzn. znění-li se data v tabulkách (databázových souborech), změní se také data, které zobrazuje náhled. Také naopak. Pracuje-li se s aktualizačním náhledem (speciální typ náhledu, který umožňuje nejen data prohlížet, ale i přidávat a aktualizovat) a změní se v něm data, promítnou se změny do patřičných tabulek (databázových souborů).

2.2 Základní pojmy v SQL

2.2.1 Datové typy SQL
2.2.2 Zápis konstant v SQL
2.2.3 Výrazy v SQL
2.2.4 Vestavěné funkce

 

Klíčovým pojmem v jazyku SQL je příkaz. Každý příkaz začíná klíčovým slovem. Slovo vyjadřuje orientačně, jakou činnost daný příkaz provádí. Za klíčovým slovem následuje jedna nebo více volitelných klauzulí, které blíže specifikují povahu vykonávané činnosti, nebo určují data, s nimiž má příkaz pracovat.

Každá klauzule začíná klíčovým slovem, jako jsou např. FROM nebo WHERE. Některé klauzule jsou povinné, jiné volitelné. Každá implementace SQL používá kromě standardních klauzulí, daných konvencemi ANSI/ISO, své vlastní klauzule, někdy se i činnost standardních klauzulí mírně či více liší.

Jména objektů v jazyku SQL mají ve standardu délku 1-18 znaků, z toho první znak musí být písmeno, a jméno nesmí obsahovat mezery nebo interpunkční znaky. Při udávání jména je někdy potřeba jméno kvalifikovat, vyskytují-li se stejná jména, a není jednoznačně jasné, na který objekt se jméno odkazuje. Kvalifikace jména se provádí pomocí kvalifikátoru ´.´ (tečka). Často se kvalifikace používá se jmény tabulek:

<vlastník>.<jméno_tabulky>

nebo při kvalifikaci sloupců, což se v databázových systémech používá velmi často:

< jméno_tabulky>.< jméno_sloupce> , obecně se v SQL připouští i kvalif. víceúrovňová:

<vlastník>.<jméno_tabulky>.< jméno_sloupce>

2.2.1 Datové typy SQL

Obecně se v SQL určuje typ dat pro sloupce (položky) tabulek, tedy to, jaké hodnoty jakého druhu mohou být ve sloupci obsaženy. Kromě typu dat je nutné pro některé typy dat uvádět i maximálně možnou šířku sloupce, u číselných údajů i volitelně počet desetinných míst.

Typ dat:

Popis:

SMALLINT

Celá čísla v délce až šesti číslic (včetně znaménka). Rozpětí povolených hodnot je od -32,768 do 32,767.

Velikost: 2 Byte.

INTEGER

Celá čísla v délce až 11 číslic (včetně znaménka). Rozpětí povolených hodnot je interval od -2,147,483,648 až do 2,147,483,647.

Velikost: 4 Byte.

DECIMAL(x,y)

Čísla s pevnou řádovou čárkou se znaménkem celkem s x číslicemi a y desetinnými místy, x je implicitně 30 a y se implicitně rovná 6

Velikost: proměnná.

NUMERIC(x,y)

Obdobně jako DECIMAL(x,y).

Velikost: proměnná.

FLOAT(x)

Čísla v pohyblivé řádové čárce. Rozpětí čísel sahá od 2.22507385850720160*10-308 až k 1.79769313486231560*10+308.

Velikost: 8 Byte.

CHAR(n)

(CHARAKTER (n))

Znakové řetězce v délce n znaků. Povolené rozpětí pro n je interval od 1 do 32767. Bez určení n je implicitně rovno 1.

Velikost : n znaků.

VARCHAR(n)

(VARYING CHARAKTER)

Umožňuje používat řetězců proměnné délky. Dovoluje ukládat řetězce různé délky v jednotlivých řádcích. Stanovuje se horní maximálně možná délka řetězce. Jinak podobně jako u CHAR(n).

Velikost: n znaků.

LONG VARCHAR

Řetězec libovolného počtu znaků. Maximální velikost je omezena maximálně dovolenou velikostí databázového souboru.

DATE

Datum ve formátu dle nastavení: yyyy/mm/dd.

Velikost: 4 Byte.

TIMESTAMP

Stejně jako datum plus hodina, minuta, vteřina a zlomek vteřiny (na 6 míst): yyyy/mm/dd hh-mm-ss.ffffff.

Velikost: 8 Byte.

TIME

Časový okamžik dne. Ve formátu hodina/minuta/vteřina.

Velikost: 4 Byte.

DOUBLE

Obdobně jako FLOAT.

Velikost: 8 Byte.

REAL

Reálná čísla s vědeckotechnickým formátem. Rozpětí čísel sahá od 1.175494351*10 -38 až do 3.402823466*10 38

Velikost: 4 Byte.

BINARY(n)

Binární data celkové délky ‘n’ Byte. Implicitně je size= 1 Byte. Max. délka je 32767 Byte. V podstatě stejné jako CHAR(n), ale s rozdílným chování při porovnávání: u datového typu CHAR(n) je výsledek porovnání řetězců závislý na tom, jestli databázový systém rozlišuje malá a velká písmena.

Velikost: n Byte.

LONG BINARY

Binární datový typ libovolné délky. Omezení jako u LONG VARCHAR.

2.2.2 Zápis konstant v SQL

Číselné konstanty se píší klasickým způsobem. Jediný problém může vzniknout v implicitním nastavení oddělovače desetinných míst, tzn. že v různých implementacích SQL se často může psát místo desetinné čárky tečka. Dále také některé “dialekty“ SQL nemusí povolovat mezeru mezi znaménkem a číslem.

Řetězcové konstanty se standardně píší v oddělovačích apostrofy, v některých implementacích je možno používat i uvozovky.

Datové a časové konstanty se obvykle v SQL píší jako znakové řetězce. V mnoha implementacích se dá použít (vestavěnou) konverzní funkci CTOD( ), která převádí položku typu řetězec na typ datum.

Některé implementace umožňují navíc používat tzv. symbolické konstanty; ve standardu ANSI/ISO je taková jediná, a to USER, jež označuje uživatelské jméno, pod kterým se aktuálně přistupuje k databázi.

Součástí standardu ANSI/ISO je zvláštní indikátor (požadavek na zacházení s chybějícími hodnotami), psaný obvykle symbolicky jako NULL. Takto uvedená hodnota v tabulce znamená, že tato hodnota chybí, není použitelná nebo není známá.

Další obvyklé konstanty jsou např. CURRENT DATE, CURRENT TIME, CURRENT TIMESTAMP pro systémové datum, systémový čas a systémové datum a čas. Jiné implementace používají místo symbolických konstant vestavěných funkcí. Pro systémové datum se užívá funkce DATE( ), pro čas TIME( ).

2.2.3 Výrazy v SQL

Výrazy se skládají z operandů (konstanty, proměnné, jména sloupců, vestavěné funkce) a operátorů, s jejichž pomocí se získá výsledná hodnota výrazu. ANSI/ISO standart SQL uvádí čtyři základní aritmetické operace:

+ sčítání,

- odečítání,

* násobení

/ dělení,

přičemž priorita je obvyklá - násobení a dělení mají vyšší prioritu než sčítání a odečítání. Prioritu provádění operací je samozřejmě možno změnit použitím kulatých závorek. Mnohé implementace podporují další operátory a umožňují také fungování základních operací pro znakové řetězce a data typu datum nebo čas. Např. operátor + (sčítání) aplikovaný na znakové řetězce znamená zřetězení, operátor - (odečítání) aplikovaný na hodnotu typu datum dává jako výsledek rozdíl mezi dvěma daty ve dnech.

Standardně je také v SQL zajištěna automatická konverze z celých čísel na desetinná a z desetinných na čísla v pohyblivé řadové čárce.

2.2.4 Vestavěné funkce

Mnohé implementace SQL obsahují řadu vestavěných funkcí, i když tyto nejsou ve standardu ANSI/ISO vůbec zmiňovány. V příkazech jazyka SQL se mohou, např. v databázovém prostředí Microsoft Access, prakticky používat nejen vestavěné funkce danému prostředí vlastní, ale jsou dokonce povoleny i uživatelsky definované funkce. Obecně je možno se řídit zásadou, že vestavěná funkce vracející údaj určitého typu se může použít všude tam, kde je možno uvést i konstantu tohoto typu.

2.3 Rozdělení příkazů SQL dle prováděné činnosti

V řadě implementací se příkazy SQL, i když těchto příkazů není mnoho, rozdělují do dvou základních skupin. První skupinu tvoří příkazy pro definice dat - DDL (Data Definition Language), jež zabezpečují v podstatě tři základní činnosti vykonávané nad objekty databáze, tj. vytvořit objekt, vymazat existující objekt a změnit definici objektu. Druhou skupinu tvoří jazyk pro manipulaci s daty - DML (Data Manipulation Language), jež zahrnuje tyto tři základní příkazy: přidání (vymazání) jednoho nebo více řádků z (do) existující tabulky a aktualizace sloupcových hodnot určené množiny řádků. Kromě rozdělení do dvou hlavních výše uvedených příkazových skupin určujeme další typy skupin příkazů, a to příkazy pro kontrolu přístupu k datům (ochrana před neoprávněným přístupem) - DCL (Data Control Language), řízení transakcí, dále pak programové příkazy, agregované funkce (i konverzní) a predikáty.

2.3.1 Příkazy pro definici datových struktur (DDL)

2.3.1.1 Klauzule CREATE DATABASE
2.3.1.2 Klauzule CREATE TABLE
2.3.1.3 Klauzule DROP TABLE

          2.3.1.4 Klauzule ALTER TABLE

          2.3.1.5 Klauzule CREATE VIEW

          2.3.1.6 Klauzule DROP VIEW

          2.3.1.7 Klauzule ALTER DOMAIN

          2.3.1.8 Klauzule DROP DOMAIN

 

2.3.1.1 Klauzule CREATE DATABASE

CREATE DATABASE vytváří databázi a stanovuje pro ně následující vlastnosti:

Jméno primárního souboru, jež identifikuje databázi pro uživatele. Implicitně je databáze obsažena v jediném souboru.
Jméno každého sekundárního souboru, ve kterém je databáze uložena. Databáze může být uložena ve více souborech, pokud tyto jsou specifikovány jako sekundární.

Syntaxe:

CREATE {DATABASE | SCHEMA} "<specif_souboru>"

[USER "username" [PASSWORD "password"]]

[PAGE_SIZE [=] int]

[LENGTH [=] int [PAGE[S]]]

[DEFAULT CHARACTER SET charset]

[<sekundární_soubor>];

< sekundární_soubor > = FILE "<specif_souboru>"[< sekundární_soubor >]

Popis:

"<specif_souboru>"

Specifikace nového databázového souboru.

DEFAULT CHARACTER SET charset

Nastaví implicitní znakový kód pro databázi. Charset je odpovídající jméno znakového kódu. Při nepoužití se implicitní hodnota nastaví na NONE.

FILE "<specif_souboru>"

je jméno jednoho nebo více sekundárních souborů pro udržení databázových stránek v paměti před naplněním souboru primárního.

2.3.1.2 Klauzule CREATE TABLE

CREATE TABLE je příkaz jazyka SQL sloužící k vytvoření nové tabulky SQL v aktuální databázi. Uživatel, který vytváří tabulku je jejím vlastníkem, jemu připadají veškerá privilegia, jež mu mimo jiné umožňují přidávat určitá práva (GRANT) uživatelům. Tento příkaz podporuje několik voleb pro definici položek tabulky (sloupců):

lokální sloupce specifikují název a datový typ pro data vstupující do sloupce
výpočetní sloupce, specifikované na základě výp. příkazu. Hodnoty sloupce jsou vypočteny po každém jejím připojení.
Domain-based sloupce zdědí všechny vlastnosti domainu, mimoto definice sloupce může obsahovat novou implicitní hodnotu, NOT NULL atribut, navíc CHECK omezení nebo verifikační klauzuli, která umožňuje potlačit domain definici.

Specifikace datového typu pro CHAR, VARCHAR nebo BLOB textově definovaného sloupce může zahrnovat CHARAKTER SET klauzuli pro určení jednotlivých znakových kódů jednotlivých sloupců.

Syntaxe:

CREATE TABLE tabulka "<jm_souboru>"]

(<def_sloupce> [, < def_sloupce> | <t_omezení> ...])

< def_sloupce> = <m_sloupce> <typ> | COMPUTED [BY] (<výraz>) | domain

[DEFAULT {literal | NULL | USER}]

[NOT NULL] [<s_omezení>]

<typ> = {

{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION [<array_dim>]

| {DECIMAL | NUMERIC} [(přesnost [, měřítko])]

| DATE

| {CHAR | CHARACTER | CHARACTER VARYING }

[(n)] [<array_dim>] [CHARACTER SET charname]

| BLOB [SUB_TYPE {int | subtype_name}] [SEGMENT SIZE int]

[CHARACTER SET název_písma]

| BLOB [(seglen [, subtype])]

}

<výraz> = Platný SQL výraz, jehož výsledkem je jediná hodnota .

<s _omezení> = <def_omezení> [<s_omezení>]

<def_omezení> = {UNIQUE | PRIMARY KEY

| CHECK (<vyhled_podmínka>)

| REFERENCES jiná_tabulka [(jiný_sloupec [,jiný_sloupec...])]}

<t_omezení> = CONSTRAINT constraint <tconstraint_def> [<tconstraint>]

<t_omezení_def> = {{PRIMARY KEY | UNIQUE} (sloupec [, sloupec ...])

| FOREIGN KEY (sloupec [, sloupec ...]) REFERENCES jiná_tabulka

| CHECK (<vyhled_podmínka >)}

< vyhled_podmínka > =

{<hodnota> <operator> {< hodnota > | (<select_one>)}

| < hodnota > [NOT] BETWEEN < hodnota > AND < hodnota >

| < hodnota > [NOT] LIKE < hodnota > [ESCAPE < hodnota >]

| < hodnota > [NOT] IN (<hodnota > [, < hodnota > ...] | <select_list>)

| < hodnota > IS [NOT] NULL

| < hodnota > {[NOT] {= | < | >} | >= | <=}

{ALL | SOME | ANY} (<select_list>)

| EXISTS (<vynraný_výraz>)

| (<search_condition>)

| NOT < vyhled_podmínka >

| < vyhled_podmínka > OR < vyhled_podmínka >

| < vyhled_podmínka > AND < vyhled_podmínka >}

<hodnota> = {

sloupec<konstanta> | <výraz> | <funkce>

| NULL | USER

< konstanta > = num | "string" | charsetname "string"

<function> = {

COUNT (* | [ALL] < hodnota > | DISTINCT < hodnota >)

| SUM ([ALL] < hodnota > | DISTINCT < hodnota >)

| AVG ([ALL] < hodnota > | DISTINCT < hodnota >)

| MAX ([ALL] < hodnota > | DISTINCT < hodnota >)

| MIN ([ALL] < hodnota > | DISTINCT < hodnota >)

| CAST (<hodnota > AS <typ>)

| UPPER (<hodnota val>)

}

<operator> = {= | < | > | <= | >= | !< | !> | <> | !=}

<select_one> = SELECT (výběr) na jediné položce, jež vrací pouze nulovou hodnotu.

<select_list> = SELECT (výběr) na jediné položce, jež vrací nulu nebo více hodnot.

Popis:

Tabulka

je název tabulky. Název tabulky musí být jedinečný mezi tabulkami v databázi.

"<jm_souboru>"

kompletní souborová specifikace externího souboru nebo tabulky.

Sloupec

je název sloupce; jedinečný mezi sloupci v rámci tabulky.

<typ>

SQL datový typ pro sloupec.

COMPUTED [BY] (<výraz>)

určuje definici položky na základě výrazu. (<výraz>) je jakákoliv aritmetická operace platná pro datový typ položky (sloupce).

Domain

název existujícího pole.

DEFAULT

definuje implicitní hodnotu sloupce do tabulky. Hodnoty: literal vloží specifikovaný řetězec, numerickou hodnotu nebo hodnotu datum. NULL vloží hodnotu NULL. USERS vloží uživatelské jméno současného uživatele. Datový typ položky musí být kompatibilní s implicitní hodnotou DEFAULT.

Omezení

určuje druh omezení tabulky <t_omezení> a sloupce <s_omezení>

dále

UNIQUE

určuje jedinečnost hodnoty sloupce při pořizování a aktualizacích.

PRIMARY KEY

stanoví sloupec jako primární klíč pro tabulku.

CHECK

stanoví validační podmínku při pořizování a aktualizaci hodnot sloupce.

REFERENCES

je odkaz na tabulku při propojování tabulek.

2.3.1.3 Klauzule DROP TABLE

DROP TABLE ruší v databázi data tabulky a indexy. Odkazy na tabulku uvedené ve výrazech SQL, náhledy založené na této tabulce, integrita omezení nebo uložených procedur nemohou být zrušeny. Tabulka užívaná aktivní transakcí nemůže být také zrušena, dokud se transakce neukončí. Jestli aplikujeme příkaz na externí tabulku, pak se odstraní pouze její definice z databáze a ne externí soubor.

Syntaxe:

DROP TABLE jméno

Popis:

jméno je jméno existující tabulky.