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)
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 exi stují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 d o 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 (do main) 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 |
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.
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.
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. |
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.
Příkazy pro získávání dat2.3.2.1 Klauzule SELECT a FROM
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 exist ují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.
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. |
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. |
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í. |
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. |
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 v klá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. |
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). |
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.2Popis:
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). |