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

2.3.2 Příkazy pro získávání dat

2.3.3 Příkazy pro manipulaci s daty (DML)

 

2.3.1.4 Klauzule ALTER TABLE

ALTER TABLE umožňuje měnit strukturu existující tabulky. Přidává jeden nebo více sloupců do tabulky v aktuální databází. ALTER TABLE může provést několikanásobné přidávání a odstraňování položek. Je umožněno zadávání jmen položek. Příkaz ALTER TABLE zhavaruje, jestliže aktuální data v tabulce porušují omezení PRIMARY KEY a UNIQUE definic přidávaných do tabulky.

Syntaxe:

ALTER TABLE table <operace> [, < operace > ...];

< operace > = {ADD <sloupec_def> | ADD <tab_omezení> | DROP sloupec

| DROP CONSTRAINT omezení}

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

[DEFAULT {literal | NULL | USER}]

[NOT NULL] [<sloupec_omezení>]

 

< sloupec_omezení > = [CONSTRAINT constraint] <def_omezení> [<sloupec_omezení >]

< def_omezení > = {PRIMARY KEY | UNIQUE| CHECK (<vyhled_podmínka>)

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

<typ> = {

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

| {DECIMAL | NUMERIC} [(precision [, scale])]

| DATE

| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR}

[(1...32767)] [CHARACTER SET charname]

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

[CHARACTER SET charname]

| BLOB [(seglen [, subtype])]

}

<tabulka_omezení> = CONSTRAINT omezení <volba_t_omezení> [<tabulka_omezení >]

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

| CHECK (<vyhled_podmínka >)

}

Popis:

tabulka

je název existující tabulky, jež bude modifikována

< operace >

je činnost prováděná na tabulce. Správné volby jsou: ADD - přidání nové položky nebo tabulky, DROP - zrušení existující položky nebo omezení z tabulky.

< sloupec_def >

je popis nově přidaváného sloupce do tabulky. Musí zahrnovat název sloupce a datový typ.

<tabulka_omezení>

je popis nově přidaného omezení tabulky. Pouze jedno omezení tabulky může být do tabulky přidáno.

< constraint >

je jméno přidávaného nebo rušeného omezení.

domain

je název pole (domain) nad kterým by měla být založena definice sloupce.

NOT NULL

určuje nám fakt, že položka (sloupec) nemůže obsahovat hodnotu NULL.

DEFAULT

viz. CREATE TABLE

< def_omezení >

je definice omezení sloupce.

CONSTRAINT

 

DROP CONSTRAINT

 

2.3.1.5 Klauzule CREATE VIEW

CREATE VIEW vytváří náhled (odvozený) na základě jedné nebo více tabulek, to znamená, že je jejích podmnožinou řádků a sloupců. Vrácené řádky jsou definovány (vybrány) příkazem SELECT, který seřazuje požadované položky (sloupce) ze zdrojových tabulek. Uživatel, který vytváří náhled je jeho vlastníkem a má veškeré práva týkající se vytvořeného náhledu, včetně stanovení (GRANT) privilegií ostatním uživatelům. Uživatel má právo k prohlížení náhledu i v případě neumožněného přístupu k tabulkám, z nichž byl náhled vytvořen. Pro tvorbu náhledu platí :

Syntaxe:

CREATE VIEW název [(view_sloupec [, view_ sloupec ...])]

AS <select> [WITH CHECK OPTION];

Popis:

název

je název náhledu. Opět musí být jedinečný v rámci jedné databáze (často včetně názvů tabulek).

view_sloupec

je název sloupce, jenž musí být opět jedinečný v rámci jednoho náhledu. Je požadován v případě položek vytvářených na základě výpočetních výrazů. Jinak je zadávání volitelné. Implicitně se přiřazují názvy odpovídající položkám v základních tabulkách.

<select>

určuje výběrová kritéria pro záznamy zahrnuté v náhledu.

WITH CHECK OPTION

umožňuje kontrolu všech vkládaných, aktualizovaných nebo rušených dat vyhledávací podmínkou WHERE příkazu SELECT náhledu, tedy přímo z definice náhledu. Jestliže některý ze záznamů nevyhovuje podmínce WHERE, neovlivní základní tabulku. Používané při implementaci aktualizačního náhledu.

V SELECT příkazu (v tomto případě podpříkazu) aplikovaném na náhled se nemůže uvádět klauzule ORDER BY.

2.3.1.6 Klauzule DROP VIEW

DROP VIEW umožňuje tvůrci náhledu odstranit definici náhledu z databáze, pokud náhled není používán náhledem jiným, uloženou procedurou nebo CHECK omezující definicí.

Syntaxe:

DROP VIEW jméno

Popis:

jméno je jméno existujícího náhledu.

2.3.1.7 Klauzule ALTER DOMAIN

ALTER DOMAIN mění vlastnosti existujícího pole vyjma jeho datových typů a NOT NULL nastavení. Změna definice pole má vliv na všechny definice položek (sloupců), založených na poli, který nemůže být potlačen na úrovni tabulky.

Syntaxe:

ALTER DOMAIN název {

[SET DEFAULT {literal | NULL | USER}]

| [DROP DEFAULT]

| [ADD [CONSTRAINT] CHECK (<dom_vyhl_podmínka>)]

| [DROP CONSTRAINT]

};

<dom_ vyhl_podmínka >= {VALUE <operator> <hodnota>

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

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

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

| VALUE IS [NOT] NULL

| VALUE [NOT] CONTAINING < hodnota >

| VALUE [NOT] STARTING [WITH] < hodnota >

| (<dom_ vyhl_podmínka >)

| NOT <dom_vyhl_podmínka>

| <dom_vyhl_podmínka> OR <dom_ vyhl_podmínka > | <dom_ vyhl_podmínka >

AND <dom_ vyhl_podmínka >

}

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

Popis:

Název

je název existujícího pole (oblast).

SET DEFAULT

specifikuje implicitní hodnotu položky.

DROP DEFAULT

ruší existující implicitu.

ADD [CONSTRAINT]CHECK (<dom_vyhl_podmínka>)

přidá kontrolující omezení do pole. Může zahrnovat pouze jedno CHECK omezení.

DROP CONSTRINE

ruší kontrolní omezení v definici pole.

2.3.1.8 Klauzule DROP DOMAIN

DROP DOMAIN ruší existující definici pole (domain) v databázi. Tento příkaz selže jestli toto pole je právě použito k definici položky. K ošetření této možnosti je třeba před použitím tohoto příkazu pomocí klauzule ALTER TABLE zrušit tyto položky.

Syntaxe:

DROP DOMAIN jméno

Popis:

jméno jméno existujícího pole.

2.3.2 Příkazy pro získávání dat

2.3.2.1 Klauzule SELECT a FROM

2.3.2.2 Příkaz DECLARE CURSOR

2.3.2.3 Příkaz OPEN

2.3.2.4 Příkaz FETCH

2.3.2.5 Příkaz CLOSE

 

2.3.2.1 Klauzule SELECT a FROM

Klauzule SELECT je syntakticky bohatý příkaz jímž se sestavují veškeré dotazy. Je to stěžejní příkaz jazyka SQL, který může mít tvar jednoduchý i velice komplikovaný jak je patrné z níže uvedené syntaxe:

Syntaxe :

SELECT [DISTINCT | ALL] {* | <hodnota> [, < hodnota > ...]}

FROM <tabulka> [, < tabulka > ...]

[WHERE <vyhled_podmínka>]

[GROUP BY sloupec [,sloupec...]

[HAVING < vyhled_podmínka >]

[UNION <výběr_výraz>]

[ORDER BY <order_seznam>]

< hodnota > = {

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

| NULL | USER |

}

< konstanta > = num | "řetězec" | charsetname " řetězec "

< výraz > = Platný SQL výraz jehož výsledek je jedna hodnota položky.

< funkce > = {

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 >)

}

 

<tabulka> = <připojená_tabulka> | table | view | procedure

[(<hodnota > [, < hodnota > ...])] [alias]

< spoj_tabulka > = <tabulka> < typ_propojení > JOIN <tabulka>

ON <vyhled_podmínka> | (<spoj_tabulka >)

< typ_propojení> = {[INNER] |

{LEFT | RIGHT | FULL }

[OUTER]} JOIN

< vyhled_podmínka > = {<hodnota> <operator>< hodnota >

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

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

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

| < hodnota > IS [NOT] NULL

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

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

| EXISTS (<select_výraz>)

| SINGULAR (<select_ výraz >)

| < hodnota > [NOT] CONTAINING < hodnota >

| < hodnota > [NOT] STARTING [WITH] <hodnota>

| (<vyhled_podmínka >)

| NOT < vyhled_podmínka >

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

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

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

<select_seznam> =příkaz SELECT na jediné položce, který vrací žádný nebo více řádků.

<select_výraz> = příkaz SELECT na seznamu hodnot, který vrací žádný nebo více řádků.

<order_seznam>= {col | int} [COLLATE collation] [ASC[ENDING] | DESC[ENDING]]

[, <order_ seznam >]

Popis:

DISTINCT | ALL

explicitní zdůraznění zařazení (ALL) nebo nezařazení (DISTINCT) duplicitních řádků do výběru.

{*|<hodnota>[, < hodnota >...]}

‘*’ specifikuje výběr všech položek. Seznam hodnot specifikuje výběr položek dle hodnoty (která určuje č. sloupce) v uvedeném pořadí hodnot.

FROM<tabulka>[,<tabulka>...]

je seznam tabulek, náhledů a uložených procedur, z nichž se výběr dat provádí. Seznam může zahrnovat propojení a tyto mohou být vnořené.

tabulka, náhled, procedura

jména existujících tabulek, náhledů a uložených procedur (fungujících stejně jako SELECT příkaz) v databázi.

Alias

je stručné, alternativní jméno tabulky nebo náhledu. Po jeho deklaraci v <tabulka> může alias zastupovat následující odkazy na tabulky nebo náhledy.

< spoj_tabulka >

odkaz (reference) na tabulku sestávající z propojení.

< typ_propojení>

je typ prováděného spoje. Implicitně: INNER.

WHERE <vyhled_podmínka>

je žádost, specifikovaná vyhledávací podmínkou, o výběr jen některých řádků zdrojové tabulky do tabulky výsledků.

GROUP BY sloupec [,sloupec...]

slouží k řešení skupinových dotazů. Daným způsobem definovaná skupina řádků se redukuje na jediný řádek v tabulce výsledků, jehož sloupcové hodnoty buď popisují skupinu nebo obsahují agregované výsledky za skupinu.

HAVING <vyhled_podmínka>

stanovuje vyhledávací podmínku skupinových dotazů GROUP BY.

UNION

je kombinace dvou nebo více tabulek, které mají plně nebo částečně identickou strukturu.

ORDER BY <order_seznam>

určuje uspořádání pořadí řádků v tabulce výsledků (vzestupně ASC nebo sestupně DESC)

SELECT vybírá řádky a sloupce z tabulek nebo náhledů do tabulky výsledků (virtuální). Tuto tabulku je možno použít v jiném dotazu SELECT nebo přemístit její hodnoty do proměnných programu.

Příkaz SELECT může být použit jako poddotaz v následujících příkazech SQL:

Při použití příkazu SELECT jako poddotazu, může tento příkaz obsahovat klauzule FROM, WHERE, GROUP BY a HAVING.

SELECT se může také vnořovat uvnitř klauzule WHERE nebo HAVING jiného příkazu SELECT. Tento typ příkazu se nazývá poddotaz nebo také vnitřní dotaz.

2.3.2.2 Příkaz DECLARE CURSOR

SQL nabízí určitou možnost také pro situace, kde je žádoucí zpracovávat tabulku výsledků dotazu postupně, řádek po řádku. Tato realizace zpracování je užitečná v případě vkládání SQL příkazů do hostitelského jazyka, tzn. ve spojení s jinými programovacími jazyky (C, C++, PASCALL). Zde je nutné, např. při naplňování paměťových proměnných hostitelského jazyka, zpracovávat tabulku výsledků dotazu SELECT (jež vrací více než jeden záznam) sekvenčně. Takže kurzor se používá v programech s vloženými příkazy SQL k sekvenčnímu zpracování tabulky výsledků řádek po řádku.

Příkaz DECLARE CURSOR definuje kurzor a svůj poddotaz s klauzulí SELECT, který vrátí tabulku výsledků, po které se bude kurzor pohybovat.

Syntaxe:

DECLARE <jméno_kurzoru> CURSOR

FOR <SELECT příkaz>

[FOR UPDATE OF <seznam_sloupců> | <ORDER BY klauzule>];

Popis:

<jméno_kurzoru>

je jméno deklarovaného kurzoru.

SELECT příkaz

platný SELECT příkaz (viz kap. 2.3.2.1)

FOR UPDATE OF

touto klauzulí se určují sloupce tabulky, které se mohou aktualizovat v následném příkazu UPDATE.

<seznam_sloupců>

specifikace seznamu sloupců tabulky pro následnou aktualizaci příkazem UPDATE.

<ORDER BY klauzule>

viz ORDER BY klauzule v kap. 2.3.2.1.

2.3.2.3 Příkaz OPEN

Otvírá dříve deklarovaný kurzor. Vykoná klauzuli SELECT příkazu DECLARE CURSOR a umístí kurzor nad první řádek tabulky výsledků.

Syntaxe:

OPEN <jméno_kurzoru>;

Popis:

<jméno_kurzoru>

je jméno dříve deklarovaného kurzoru příkazem DECLARE CURSOR.

2.3.2.4 Příkaz FETCH

Tento příkaz zpracovává postupně všechny řádky tabulky výsledků, která vznikne vykonáním příkazu SELECT po otevření příslušného kurzoru, a přemísťuje hodnoty z tohoto řádku do odpovídajících paměťových proměnných hostitelského programovacího jazyka. Použitelné pouze v programech s vkládanými příkazy SQL. FETCH naplní paměťové proměnné uvedené v seznamu INTO a přesouvá vždy hodnoty jednoho řádku do paměťových proměnných. Postup zpracování může být pouze do předu. Jestliže je třeba začít od začátku, musí se kurzor zavřít (příkaz CLOSE v kap. 2.3.2.5) a následně znovu otevřít (příkaz OPEN v kap. 2.3.2.3).

Syntaxe:

FETCH <jméno_kurzoru>

INTO <seznam_proměnných>;

Popis:

<jméno_kurzoru>

je jméno dříve deklarovaného kurzoru příkazem DECLARE CURSOR.

<seznam_proměnných>

je seznam proměnných, do kterých se přemisťují hodnoty položek zpracovávaného řádku kurzoru. Proměnné musí být stejného datového typu jako selektované položky klauzule SELECT příslušného kurzoru a musí být taky uvedeny ve stejném pořadí.

2.3.2.5 Příkaz CLOSE

CLOSE deaktivuje otevřený kurzor. Je to obvyklý koncový příkaz, který uvolňuje paměť použitou pro dočasnou tabulku výsledků. Musí být taky umístěn za všemi příkazy, které se odkazují na zavíraný kurzor.

Syntaxe:

CLOSE <jméno_kurzoru>;

Popis:

<jméno_kurzoru>

je jméno dříve deklarovaného kurzoru příkazem DECLARE CURSOR.

2.3.3 Příkazy pro manipulaci s daty (DML)

2.3.3.1 Klauzule INSERT

2.3.3.2 Klauzule DELETE

2.3.3.3 Klauzule UPDATE

 

2.3.3.1 Klauzule INSERT

INSERT uloží jeden nebo více nových řádků dat do existující tabulky nebo náhledu. Hodnoty jsou vkládány do tabulky v pořadí položek, ledaže by byl poskytnut volatelný seznam cílových položek.

Jestliže je cílový seznam položek podmnožinou dostupných položek, potom jsou automaticky v uvedených položkách uloženy implicitní nebo NULL hodnoty. Jestli se neuvede volitelný seznam cílových položek, pak klauzule VALUES musí poskytovat hodnoty pro vložení do všech položek tabulky.

Pro vložení jediného řádku dat, by klauzule VALUES měla obsahovat určitý seznam vkládaných hodnot. Pro vložení vícenásobných řádků dat je specifikovaný < vyber_výraz >, který vybere existující data z jiné tabulky Vybrané (selektované) položky musí korespondovat s položkami uvedenými v klauzuli INSERT. Je legální vybírat položky z tabulky, na kterou se příkaz SELECT aplikuje, nicméně tyto praktiky nejsou doporučovány z důvodu neurčitého výsledku po vložení řádku.

Syntaxe:

INSERT INTO <objekt> [(sloupec [, sloupec...])]

{VALUES (<hodnota> [, < hodnota > ...]) | <vyber_ výraz >};

<objekt> = jm_tabulky | jm_náhledu

< hodnota > = {<konstanta> | < výraz >| <funkce> | NULL | USER

} [COLLATE collation]

< konstanta > = num | "řetězec" | charsetname " řetězec "

< výraz > = Platný SQL výraz jehož výsledek je jedna hodnota položky.

< funkce > = {

CAST (<hodnota > AS <typ>)

| UPPER (<hodnota >)

}

< vyber_ výraz > = SELECT vrací více nebo žádný řádek. Tyto řádky se vloží tam, kde se počet sloupců v každém řádku shoduje s počtem položek vybraných.

Popis:

INTO < objekt >

je jméno existující tabulky nebo náhledu, do kterého se vkládají data.

Sloupec

je jméno existujícího sloupce, do kterého se vkládají data.

VALUES (<hodnota>[, < hodnota > ...])

je seznam hodnot vkládaných do tabulky nebo náhledu. Hodnoty musí být seřazeny stejně jako cílové položky.

< vyber_ výraz >

je dotaz, který vrací hodnoty řádku pro vložení do cílových položek.

2.3.3.2 Klauzule DELETE

DELETE určuje jeden nebo více řádků pro odstranění z tabulky nebo aktualizačního náhledu. Přístup ke klauzuli DELETE je možno omezit příkazy GRANT a REVOKE. Pro označení podmnožiny záznamů z tabulky pro odstranění může sloužit klauzule WHERE. Bez této klauzule dojde k odstranění všech záznamů z tabulky.

Syntaxe:

DELETE FROM TABLE [WHERE < vyhled_podmínka > |

WHERE CURRENT OF <jméno_kurzoru>];

Popis:

TABULKA

Název tabulky ve které se odstraňují záznamy.

WHERE <vyhled_podmínka>

Vyhledávací podmínka určuje záznamy k odstranění.

WHERE CURRENT OF

se používá v případě odstranění záznamů dříve otevřeného kurzoru (viz kap. 2.3.2.2).

2.3.3.3 Klauzule UPDATE

UPDATE modifikuje jeden nebo více řádků v tabulce nebo náhledu. Volitelná klauzule WHERE stanoví řádky, které se mají aktualizovat. V klauzuli WHERE může být uveden poddotaz.

Syntaxe:

UPDATE {tabulka | náhled}

SET sloupec = <hodnota> [,sloupec = < hodnota > ...]

[WHERE <vyhl_podmínka> | WHERE CURRENT OF <jméno_kurzoru>];

< hodnota > = {

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

| NULL | USER

}

< konstanta > = num | "řetězec" |

charsetname " řetězec "

< výraz > = Platný SQL výraz jehož výsledek je jedna hodnota položky.

< funkce > = {

CAST (<hodnota > AS <datatype>)

| UPPER (<hodnota >)

}

< vyhl_podmínka > = viz kap. 2.3.1.2

< jméno_kurzoru > = viz kap. 2.3.2.2

Popis:

tabulka | náhled

je jméno existující tabulky nebo náhledu k aktualizaci

SET sloupec = <hodnota>

specifikuje modifikované položky a hodnoty převáděné do těchto položek.

WHERE CURRENT OF

se používá v případě aktualizace položek dříve otevřeného kurzoru. Specifikace aktualizovatelných položek kurzoru se provádí při jeho definici s použitím klauzule FOR UPDATE OF (viz kap.2.3.2.2).