2. blok – část B
Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
Studijní cíl Tento blok je věnován základní syntaxi příkazu SELECT, pojmům projekce a restrikce. Stručně zde budou představeny příkazy INSERT, UPDATE, DELETE. Doba nutná k nastudování
1 - 2 hodiny
Průvodce studiem Při studiu tohoto bloku se předpokládá, že čtenář je obeznámen se základními pojmy jako tabulka, sloupec, databázový systém, výraz. 1. Příkaz SELECT Příkaz SELECT je nejčastěji využívaným příkazem jazyka SQL. Slouží totiž k získávání dat z databáze. Příkaz SELECT můžeme spouštět nad tabulkou, pohledem, tabulkovou funkcí a můžeme přes něj volat vestavěné funkce databázového serveru. Základní syntaxe příkazu SELECT zní: SELECT [ALL | UNIQUE | DISTINCT] <sloupce> FROM
[WHERE <podmínka>] [GROUP BY <sloupce agregace> [HAVING <podmínka>]] [ORDER BY <sloupce řazení> [ASC | DESC]]; Nyní si vysvětlíme jednotlivé části příkazu SELECT.
ALL | UNIQUE | DISTINCT – nepovinné parametry, které definují, zda bude ve výsledku naloženo s duplicitami. Podrobně si je vysvětlíme později. <sloupce> - seznam sloupců, které se zobrazí ve výsledku. Výčet všech sloupců může být nahrazen operátorem *. Ukážeme si na příkladu později. - identifikátor tabulky (pohledu, tabulkové funkce), nad kterou je prováděn příkaz SELECT. Může zde být obsaženo více tabulek oddělených čárkou, spojení tabulek nebo vnořený dotaz. WHERE <podmínka> – příkaz slouží k omezení výstupní množiny dat. Do výsledku budou zahrnuty pouze ty řádky, které vyhovují podmínce <podmínka>. Podmínka může obsahovat jakýkoliv výraz, jehož výsledkem
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
1
je logická hodnota (PRAVDA, NEPRAVDA). Tato operace je nazývána restrikce. GROUP BY < sloupce agregace >, HAVING <podmínka> konstrukce pro vytváření agregačních dotazů. Agregacím a souhrnným dotazům je věnován celý blok a nebudeme se jimi v této lekci zabývat. ORDER BY <sloupce řazení> - seznam sloupců, podle kterých se bude výsledek řadit. Ke každému sloupci je možné přidat ještě směr řazení ASC (vzestupně) a DESC (sestupně).
V tomto bloku se budeme zabývat pouze zjednodušenou syntaxí příkazu SELECT bez konstrukcí agregačních dotazů (GROUP BY, HAVING). 1.1. Projekce Se základní syntaxí příkazu SELECT jsme se již seznámili a než si ukážeme příklady, představíme si důležité základní pojmy. Prvním důležitým pojmem je pojem projekce. Pojem vychází z relační algebry a představuje, které sloupce z tabulky budeme příkazem SELECT zobrazovat. Mějme tabulku PRODUKTY, která má následující sloupce a data:
Pokud budeme z tabulky chtít zobrazit sloupce oznaceni a cena říkáme, že provádíme projekci sloupce oznaceni a cena. V relační algebře bychom zapsali jako PRODUKTY[oznaceni, cena].
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
2
Obrázek 1 - Grafické znázornění projekce
1.2. Restrikce Druhým důležitým pojmem vycházejícím z relační algebry, je pojem restrikce ( v literatuře někdy označován jako selekce). Restrikce definuje řádky, které budou obsaženy ve výsledku. Jedná se tedy o podmínky a uvádí se za klauzulí WHERE. Příklad si ukážeme na již zmíněné tabulce PRODUKTY. Zobrazíme ty řádky, kde cena > 20000. V relační algebře zapíšeme jako PRODUKTY(cena>20000). Ke spojování podmínek v restrikci se používají logické operátory (AND, OR, NOT), kterým je věnován jeden celý blok a také operátory LIKE a EXISTS, které budou také probrány později. Projekce a restrikce je možné samozřejmě kombinovat.
Obrázek 2 - Grafické znázornění restrikce
Pojmy projekce a restrikce jsme si objasnili a můžeme si tedy zapsat znovu syntaxi příkazu SELECT s použitím těchto pojmů ve zjednodušené formě jako: SELECT [ALL | UNIQUE | DISTINCT] <projekce> FROM [WHERE ] [ORDER BY <sloupce řazení> [ASC | DESC]];
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
3
1.3. Použití příkazu SELECT Prakticky si nyní ukážeme použití příkazu SELECT. Jak již bylo řečeno, příkaz slouží k získávání dat a není možné jím jakkoliv data ve zdrojovém umístění měnit. Ukážeme si nejjednodušší použití příkazu, které je možné. Zobrazte všechna data z tabulky PRODUKTY. SELECT * FROM produkty;
V příkladu jsme využili pouze povinné části příkazu SELECT. Vynechali jsme restrikce i řazení. Projekci jsme provedli nad všemi sloupci tabulky a pro zjednodušení jsme použili operátor *. Stejný příklad je možné zapsat jako: SELECT produkt_id, oznaceni, dodavatel_id, cena FROM produkty;
Další příklad si uvedeme již včetně restrikcí. Zobrazte všechny produkty z tabulky PRODUKTY, které mají cenu větší než 20 000, data seřaďte podle nejdražšího produktu. SELECT produkt_id, oznaceni, dodavatel_id, cena FROM produkty WHERE cena > 20000 ORDER BY cena DESC;
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
4
Restrikce zajistila, že do výstupu se dostaly pouze ty řádky, které ve sloupci cena mají hodnotu větší než 20000. 1.3.1. ALL, UNIQUE, DISTINCT Klíčová slova ALL, UNIQUE a DISTINCT slouží k definování způsobu práce s duplicitními řádky ve výsledku. Než si vysvětlíme význam jednotlivých příkazů, zobrazíme si část tabulky PRODKUTY. Konkrétně provedeme projekci na sloupec dodavatel_id. SELECT dodavatel_id FROM produkty;
Z výstupu je patrné, že ve výsledku máme duplicitní řádky. V některých aplikacích potřebujeme, aby výstupní množina dat obsahovala každý řádek pouze jednou. K tomuto účelu slouží klauzule DISTINCT. Doplníme ji tedy do předchozího dotazu a znovu si zobrazíme výsledek. SELECT DISTINCT dodavatel_id FROM produkty;
Každý řádek výstupu je nyní unikátní. Stejnou službu nám poskytne i klauzule UNIQUE, který je synonymem pro klauzuli DISTINCT. SELECT UNIQUE dodavatel_id FROM produkty;
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
5
Klauzule ALL je defaultní, pokud není zvolena žádná ze zde jmenovaných. Následující příkaz zobrazí kompletně všechna data bez ohledu na duplicity: SELECT ALL dodavatel_id FROM produkty;
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
6
2. Příkazy INSERT, UPDATE, DELETE Základní práci a pochopení příkazu SELECT máme za sebou a nyní si představíme další rozšířené příkazy jazyka SQL. Jedná se o příkazy souhrnně označované jako DML (Data Manipulation Language), tedy příkazy pro manipulaci s daty. Mezi tyto příkazy patří INSERT, UPDATE a DELETE. Pomocí DML operací je možné upravovat data v tabulkách a za jistých podmínek také v pohledech. 2.1. INSERT Příkaz INSERT slouží ke vkládání dat do jedné nebo do více tabulek zároveň. Základní syntaxe příkazu pro vkládání dat do jedné tabulky zní: INSERT INTO (<sloupec> [, <sloupec2>]) VALUES (DEFAULT | [, DEFAULT | ]);
- identifikátor tabulky (nebo pohledu), do které budeme vkládat <sloupec> - definuje sloupec tabulky, do kterého budeme vkládat. Pokud vkládáme zároveň do více sloupců, oddělujeme pomocí čárek. DEFAULT | - do sloupce můžeme vložit buď vlastní hodnotu () nebo defaultní hodnotu sloupce (DEFAULT), pokud je zadaná v definici tabulky. Data pro jednotlivé sloupce oddělujeme čárkou.
Na ukázku si vložíme řádek do tabulky PRODUKTY a celý obsah tabulky si následně vypíšeme. INSERT INTO produkty (produkt_id, oznaceni, dodavatel_id, cena) VALUES (11, 'Notebook2', 3, 32000); SELECT * FROM produkty;
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
7
Řádek se do tabulky úspěšně vložil. Příkaz INSERT je možné použít pro vkládání jednotlivých řádků, ale také pro vkládání hodnot přímo z výsledku příkazu SELECT. Syntaxe takového případu je potom: INSERT INTO (<sloupec> [, <sloupec2>]) SELECT <projekce> FROM [WHERE ];
Tento způsob vkládání dat si ukážeme přímo na příkladu. Opět vložíme data do tabulky PRODUKTY. Data, která budeme vkládat, budou modifikovaná data z téže tabulky. Výsledný obsah tabulky si opět zobrazíme.
INSERT INTO produkty (produkt_id, oznaceni, dodavatel_id, cena) SELECT produkt_id+10, oznaceni||' NEW', dodavatel_id, cena*0.7 FROM produkty; SELECT * FROM produkty;
Pro využívání této konstrukce je nutné pochopit, jak je takový příkaz databázovým systémem zpracováván. Nejdříve je vyhodnocen příkaz SELECT a teprve potom jsou data použita do příkazu INSERT. Není tedy možné, aby se cyklicky přidávaly řádky pro každý přidaný řádek.
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
8
2.2. UPDATE Data, která se v tabulce již nachází, musí být možné nějakým způsobem upravovat. K úpravě dat v tabulce slouží příkaz UPDATE. Obecná syntaxe příkazu UPDATE vypadá následovně: UPDATE SET <sloupec>= [, <sloupec2>=] [WHERE ];
- identifikátor tabulky (nebo pohledu), v níž budeme upravovat data. <sloupec>= - přiřazení nové hodnoty () sloupci (<sloupec>). Při současné úpravě více sloupců, oddělujeme uspořádané dvojice čárkou. WHERE - nepovinná část příkazu. Restrikce definuje, na které řádky se změna promítne.
Příkaz UPDATE si ukážeme na praktickém příkladu. Provedeme změnu v tabulce PRODUKTY a to takovou, že zdražíme produkty o 15% u odběratele s id=2. Nakonec zobrazíme upravený obsah tabulky. UPDATE produkty SET cena=1.15*cena WHERE dodavatel_id=2; SELECT * FROM produkty;
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
9
2.3. DELETE Dosud jsme si představili příkaz pro vkládání a upravování. Do skupiny DML operací chybí ještě příkaz DELETE, který slouží k mazání záznamů z tabulky. Obecná syntaxe příkazu DELETE zní: DELETE FROM [WHERE ];
- identifikátor tabulky (nebo pohledu), odkud budeme mazat data. WHERE - nepovinná část příkazu. Restrikce definuje, které řádky budou smazány.
Příkaz DELETE si ukážeme nad tabulkou PRODUKTY, kde odstraníme ty řádky, který mají id > 10, kromě id = 17. Výsledný obsah tabulky si zobrazíme.
DELETE FROM produkty WHERE produkt_id >= 10 AND produkt_id <> 17; SELECT * FROM produkty;
2.4. Hodnota NULL Ve výsledcích příkazů SELECT v této lekci můžete u některých produktů pozorovat ve sloupcích dodavatel_id a cena hodnotu NULL – ve výsledku z SQL Developeru, kde jsou generovány výsledky pro praktické ukázky, se zobrazuje jako (null). Jde o takzvanou prázdnou, tj. chybějící neboli neznámou hodnotu. Znamená to, že neznáme, který dodavatel daný produkt dodává nebo za jakou cenu. V databázích se s hodnotami NULL budeme pravidelně setkávat a nepochopení jejich významu nebo nevhodná práce s touto hodnotou vede k častým chybám. Nejdříve je nezbytné pochopit rozdíl mezi hodnotou NULL a hodnotou 0 (nula). Nulová hodnota například v případě ceny udává, že produkt je možné získat za 0 peněz, tedy bezplatně. Hodnota NULL však neudává cenu, ale pouze označuje položku, jejíž hodnota není udána. David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
10
Databázový řídící systém s hodnotou NULL pracuje odlišně, než s jinými hodnotami. Tyto hodnoty neovlivňují některé matematické operace, například počítání součtu nebo počtu hodnot. Také logické funkce AND, OR a NOT musí s tímto „třetím“ nedefinovaným stavem pracovat. 2.5. Vytvoření tabulky příkazem CREATE TABLE V předchozích kapitolách jsme se seznámili s příkazy DML. Nyní si řekneme něco o příkazech DDL. Zkratka DDL (Data Definition Language) zastupuje příkazy, které slouží k definici databázových objektů. Jedná se o příkazy pro vytvoření, zrušení a modifikaci tabulek a všech dalších databázových objektů. V této kapitole si představíme základní DDL příkaz pro vytvoření nové tabulky. Základní syntaxe vytvoření tabulky zní:
CREATE TABLE [<schema>.] ( [NOT NULL][DEFAULT ][UNIQUE] [PRIMARY KEY] [CONSTRAINT { NOT NULL | CHECK (<pravidla>) }] [CHECK <pravidla>] [, [NOT NULL][DEFAULT ][UNIQUE] [PRIMARY KEY] [CONSTRAINT { NOT NULL | CHECK (<pravidla>) }] [CHECK <pravidla>]] [,CONSTRAINT { PRIMARY KEY (<sloupce>) | CHECK (<pravidla>) | FOREIGN KEY (<sloupce>) REFERENCES [schema.](<sloupce>)}] );
- název vytvářené tabulky. Před název je možné ještě
specifikovat schéma, do kterého se tabulky vytvoří. Pokud schéma nespecifikujeme, vytvoří se do aktuálního schématu. - název jednoho sloupce tabulky a jeho datový typ (např. id NUMBER(10)). NOT NULL – omezení, které definuje, že hodnota ve sloupci musí být vždy zadána (nesmí být NULL).
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
11
UNIQUE – hodnoty v celém sloupci musí být unikátní. Žádná hodnota se nesmí opakovat. DEFAULT – předdefinovaná hodnota (např. datum DATE DEFAULT sysdate – pokud není vyplněno datum, použij aktuální systémové datum). CONSTRAINT - definice pravidla CHECK <pravidla> - podmínka pro hodnoty ve sloupci (např. ID INTEGER CHECK ID BETWEEN 0 AND 100) PRIMARY KEY (<sloupce>) – definuje primární klíč tabulky (hodnoty ve sloupci musí být vyplněny a musí být unikátní). FOREIGN KEY (<sloupce>) REFERENCES (<sloupce>) – definice cizího klíče (odkazuje na sloupec jiné tabulky – podpora pro udržení integrity dat).
Pro názornost popsaných pravidel, si ukážeme několik příkladů vytvoření tabulek s použitím popsaných pravidel.
CREATE TABLE dodavatele ( dodavatel_id NUMBER(4) NOT NULL, nazev VARCHAR2(100) NOT NULL, zastoupeni VARCHAR2 (100), CONSTRAINT dodavatel_pk PRIMARY KEY (dodavatel_id) ); CREATE TABLE produkty ( produkt_id NUMBER (8) NOT NULL, oznaceni VARCHAR2 (30) NOT NULL, dodavatel_id NUMBER (4) NOT NULL, cena NUMBER (6), CONSTRAINT fk_dodavatele FOREIGN KEY (dodavatel_id) REFERENCES dodavatele(dodavatel_id) );
V uvedeném příkladu jsou vytvořeny dvě tabulky. Tabulka dodavatele, která má 3 sloupce a jedno omezení. Omezení je definováno jako primární klíč nad sloupcem dodavatel_id. Druhá tabulka je produkty. Tato tabulka má definovány čtyři sloupce a jedno omezení cizího klíče. Sloupec dodavatel_id je napojen na stejně nazvaný sloupec tabulky dodavatele.
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
12
CREATE TABLE ZAMESTNANCI_DEMO ( zamestnanec_id NUMBER(6) PRIMARY KEY, jmeno VARCHAR2(20), prijmeni VARCHAR2(25) CONSTRAINT zam_prijmeni_nn NOT NULL, email VARCHAR2(50) CONSTRAINT zam_email_nn NOT NULL, mobil VARCHAR2(15), datum_nastupu DATE DEFAULT SYSDATE CONSTRAINT zam_datum_nastupu_nn NOT NULL, pozice_id VARCHAR2(10) CONSTRAINT zam_pozice_nn NOT NULL, mzda NUMBER(8,2) CONSTRAINT zam_mzda_nn NOT NULL, provize_pct NUMBER(2,2), manazer_id NUMBER(6), oddeleni_id NUMBER(4), CONSTRAINT zam_mzda_min CHECK (mzda > 0), CONSTRAINT zam_email_uk UNIQUE (email) );
Druhý, již komplexnější příklad, vytváří tabulku s 11 sloupci. Sloupec zamestnanec_id je definován jako primární klíč. Sloupce prijmeni, email, datum_nastupu, pozice_id a mzda nemohou obsahovat hodnoty NULL. V závěru jsou vytvořena dvě pravidla. Jedno pro sloupec mzda, které definuje, že plat musí být větší než 0. Další je pro sloupec email a definuje, že hodnoty tohoto sloupce musí být v celé tabulce unikátní. Strukturu tabulek si můžeme nechat vypsat pomocí příkazu DESC . DESC produkty;
DROP TABLE ; Odstraní z databáze tabulku s daným jménem, tj. všechny řádky tabulky, celou strukturu, všechny nad ní definované databázové objekty (např. indexy a všechna případná omezení definovaná nad sloupci či celou tabulkou). David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
13
Tabulku již umíme vytvořit i odstranit. Poslední operace, kterou ještě schází představit, je úprava tabulky. Syntaxe pro přidání sloupce či omezení do tabulky zní: ALTER TABLE ADD ( { []} | { } ); Přidání sloupce do tabulky si ukážeme na jednoduchých příkladech. ALTER TABLE dodavatele ADD mesto varchar2(50); ALTER TABLE dodavatele ADD ( ulice varchar2(50), telefon varchar2(13) );
V prvním příkladu byl do tabulky dodavatele přidán sloupec mesto. Ve druhém příkladu jsou do tabulky přidány hned dva sloupce, ulice a telefon. Se sloupci tabulky je samozřejmě možné provádět i další operace, jako je přejmenování, úprava a odstranění. Syntaxe pro přejmenování sloupce zní: ALTER TABLE RENAME COLUMN TO <nový název>; ALTER TABLE dodavatele RENAME COLUMN mesto to sidlo_mesto;
Změna sloupce tabulky se provádí také příkazem ALTER s následující syntaxí: ALTER TABLE MODIFY (<sloupec> <specifikace sloupce>); ALTER TABLE dodavatele MODIFY sidlo_mesto VARCHAR2(45) NOT NULL;
Poslední možností úpravy struktury je odstranění sloupce s následující syntaxí: ALTER TABLE DROP COLUMN <sloupec>; ALTER TABLE dodavatele DROP COLUMN sidlo_mesto; David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
14
2.6. Úvod do transakcí V souvislosti s příkazy INSERT, UPDATE a DELETE, tedy příkazy, které modifikují obsah tabulek, je vhodné upozornit na skutečnost, že databázové systémy jsou obvykle implementovány tak, že změny v tabulkách je nutné následně buď potvrdit, nebo zamítnout. Hovoříme o takzvaném transakčním zpracování příkazů, kterému bude věnována samostatná lekce. V tuto chvíli je pro nás důležité, že veškeré změny provedené příkazy DML v tabulkách je nutné potvrdit příkazem COMMIT, případně odvolat příkazem ROLLBACK. Pokud ani jednu z těchto operací neprovedeme, dojde buď: a) K implicitnímu potvrzení transakce (COMMIT) při a. Úspěšném ukončení připojení k databázovému serveru b. Před provedením příkazu DDL b) K implicitnímu odrolování transakce (ROLLBACK) při nenormálním ukončení připojení k databázovému serveru (například při přerušení spojení)
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
15
Pojmy k zapamatování Příkazy a funkce:
Příkazy SELECT, INSERT, UPDATE a DELETE
Problém: základní užití příkazů SELECT, vymezení pojmů restrikce a projekce, seznámení s DML příkazy
Shrnutí V této lekci jste se seznámili s příkazem SELECT a DML příkazy. Příkaz SELECT slouží k získávání dat z tabulek. Pomocí projekce a restrikce definujeme oblast dat, kterou chceme zobrazit. DML operace slouží pro manipulaci s daty. Otázky na procvičení 1. 2.
3. 4. 5.
K čemu slouží příkaz SELECT? Jaký je rozdíl mezi výstupy následujících příkazů? SELECT DISTINCT … FROM … SELECT … FROM … Co znamená pojem restrikce a kam do příkazu SELECT se zapisuje? Jaké jsou základní DML příkazy? K čemu se používá příkaz COMMIT?
Odkazy a další studijní prameny
http://www.techonthenet.com/oracle (syntaxe příkazů SQL jazyka a funkcí) http://www.sqlcourse.com (interaktivni SQL trénink) http://www.oracle.com/technetwork/database/enterpriseedition/documentation (dokumentace k databázové platformě Oracle) http://www.penguin.cz/noviny/?id=chip/index (seriál Databáze standardu SQL z časopisu CHIP)
Odkazy a další studijní prameny
ŠIMŮNEK, M. SQL, kompletní kapesní průvodce. Grada Publishing, 1999. ISBN 80-7169-692-7. STEPHENS, K.R., PLEW, R.R. Naučte se SQL za 21 dní. Praha: Computer Press, 2004. ISBN 80-7226-870-8. GROFF, J.R., WEINBERG, P.N. SQL - kompletní průvodce. Praha: Computer Press, 2005. ISBN 80-251-0369-2.
David Žák, Jiří Zechmeister, Tomáš Váňa IDAS1/2B - Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE
16