sql
DESCRIPTION
SQL. Přednáška DB1. Literatura. CONNOLLY, T.M.-BEGG,C.E.-STRACHAN,A.D.: Database Systems – A Practial Approach to Design, Implementation and Management. University of Paisley, Addison-Wesley Publ. Comp., ISBN 0-201-42277-8, 1995. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/1.jpg)
SQL
Přednáška DB1
![Page 2: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/2.jpg)
Literatura
• CONNOLLY, T.M.-BEGG,C.E.-STRACHAN,A.D.: Database Systems – A Practial Approach to Design, Implementation and Management. University of Paisley, Addison-Wesley Publ. Comp., ISBN 0-201-42277-8, 1995.
• POKORNÝ,J.: Počítačové databáze. Výběr informací z organizační a výpočetní techniky, Kancelářské stroje, Praha, 1991.
![Page 3: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/3.jpg)
Základní vlastnosti SQL
• Structured Query Language• Vytvoření databáze a struktury relací• ISO SQL standard obsahuje dvě základní komponenty
– DDL
– DML
• Neprocedurální jazyk• užití: administrátor (DBA), management, vývojář aplikace, koncový
uživatel
![Page 4: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/4.jpg)
Základní příkazy SQL
• DDL– CREATE TABLE, ALTER TABLE, DROP TABLE
– totéž pro VIEW
– CREATE INDEX, DROP INDEX
– SET TRANSACTION
– GRANT, REVOKE
• DML– SELECT
– INSERT
– UPDATE
– DELETE
![Page 5: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/5.jpg)
Jak psát příkazy
• Každý příkaz musí začínat na nové řádce.• Příkaz SQL rozlišuje rezervovaná slova a uživatelem definovaná
slova (názvy objektů).• Rezervovaná slova nesmí být dělená do dvou řádků.• Příkaz SQL bývá dost často ukončen, a to středníkem „;“• SQL není case sensitive, jen hodnoty textového argumentu musí být
napsány přesně.
![Page 6: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/6.jpg)
Příkaz SELECT
SELECT [ DISTINCT | ALL ] { * | [ sloupcový_výraz [AS nový_název] ] [ , …] }FROM název_tabulky [alias] [ , … ][ WHERE podmínka ][GROUP BY seznam_sloupců ] [ HAVING podmínka ][ORDER BY seznam_sloupců ]
Sloupcový výraz - název sloupce nebo výraz
![Page 7: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/7.jpg)
Získání celé tabulky
SELECT Isbn, Inv_č, D_nákupu, Cena, Země_vydáníFROM Exemplář;
SELECT * FROM Exemplář;
![Page 8: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/8.jpg)
Projekce
SELECT Země_vydání FROM Exemplář;
SELECT DISTINCT Země_vydání FROM Exemplář;
![Page 9: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/9.jpg)
Vypočítaná položka
SELECT Isbn, Inv_č, D_nákupu, Cena, Cena/1.05 AS bez_DPH, Země_vydáníFROM Exemplář;
![Page 10: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/10.jpg)
Selekce
SELECT * FROM Exemplář WHERE Země_vydání = ‘GB‘;
= , != nebo <>, < , <= , > , >= , AND, OR , NOT
SELECT * FROM Exemplář WHERE Země_vydání = ‘GB‘ OR Země_vydání = ‘USA‘;
SELECT * FROM Exemplář WHERE Cena BETWEEN 300 AND 900;
SELECT * FROM Exemplář WHERE Země_vydání IN (‘GB‘ , ‘USA‘ );
výčet hodnot
interval
![Page 11: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/11.jpg)
Výběr podle vzoru
SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘G%‘;
SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘G_‘;
SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘U_ _‘ ;
SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘%A‘ ;
SELECT * FROM Exemplář WHERE Země_vydání NOT LIKE ‘G%‘;
SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘%A%‘;
![Page 12: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/12.jpg)
Test prázdné hodnoty
SELECT * FROM Exemplář WHERE Země_vydání IS NULL;
SELECT * FROM Exemplář WHERE Země_vydání IS NOT NULL;
![Page 13: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/13.jpg)
Řazení
SELECT * FROM Exemplář ORDER BY Cena;
SELECT * FROM Exemplář ORDER BY Cena Desc;
SELECT * FROM Exemplář ORDER BY Země_vydání, Cena
![Page 14: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/14.jpg)
Agregované funkce
COUNT počet hodnot ve sloupci (počet řádků)SUM součet hodnot ve sloupciAVG průměr hodnot z daného sloupceMIN minimální hodnotaMAX maximální hodnota
SELECT COUNT(*) AS z_GB FROM Exemplář WHERE Země_vydání = ‘GB’
SELECT COUNT( DISTINCT Země_vydání) AS různých_zemíFROM Exemplář
SELECT SUM(Cena) AS za_kolik_z_GB FROM Exemplář WHERE Země_vydání = ‘GB’
![Page 15: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/15.jpg)
Vnořený select
Najdi čísla čtenářů, kteří bydlí v Plzni a mají vypůjčenou nějakou knihu.
SELECT Č_čt FROM ČtenářWHERE adresa LIKE ’%Plzeň%’AND Č_čt IN (SELECT Č_čt FROM Výpůjčka);
Najdi jména čtenářů, kteří mají rezervovanou knihu Babička.
SELECT Jméno FROM ČtenářWHERE Č_čt IN (SELECT Č_čt FROM Rezervace WHERE ISBN = (SELECT ISBN FROM KNIHA WHERE Titul = ’Babička’));
Poznámka: máme zaručeno, že existuje právě jeden záznam Babičky s ISBN
![Page 16: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/16.jpg)
Grupování
SELECT COUNT(Inv_č), SUM(Cena) AS celkem, Země_vydáníFROM Exemplář GROUP BY Země_vydáníORDER BY Země_vydání
počet Celkem Země_vydání
3 1950 GB
2 1562 USA
SELECT COUNT(Inv_č), SUM(Cena) AS celkem, Země_vydáníFROM Exemplář GROUP BY Země_vydání HAVING COUNT(Inv_č) > 2ORDER BY Země_vydání
![Page 17: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/17.jpg)
Agregované funkce ve vnořeném selektu
Vypiš zaměstnance, kteří mají nadprůměrný plat a uveď o kolik
SELECT Číslo_zam, Jméno, Funkce, Plat – (SELECT AVG(Plat) FROM Zaměstnanci) AS nad_průměrFROM ZaměstnanciWHERE plat > (SELECT AVG(Plat) FROM Zaměstnanci);
• ORDER BY nesmí být ve vnořeném selektu použito,• vnořený SELECT musí obsahovat jméno jednoho sloupce nebo výraz (vyjma EXISTS),• jméno sloupce se vztahuje k tabulce uvedené ve vnořeném selektu,• jestliže je vnořený selekt jedním ze dvou operandů, musí být uveden na pravé straně.
![Page 18: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/18.jpg)
Sjednocení
UNION – sjednocení dvou tabulek se stejnými sloupci
Najdi čísla čtenářů, kteří mají vypůjčené nebo rezervované knihy do 31.12.2003
SELECT Č_čt FROM VýpůjčkaWHERE D_zpět < ’31.12.2003’UNIONSELECT Č_čt FROM RezervaceWHERE D_rez < ’31.12.2003’;
Č_čt
INTERSECT - průnikEXCEPT - rozdíl
![Page 19: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/19.jpg)
Spojení - SELECT přes více tabulek 1:N
Najdi čísla čtenářů a knihy, které mají vypůjčeny.
SELECT a.Č_čt , Inv_č FROM Čtenář a, Výpůjčka bWHERE a.Č_čt = b.Č_čt;
Najdi čísla čtenářů a názvy knihy, které mají rezervovány.
SELECT a.Č_čt , Název FROM Čtenář a, Rezervace b, Kniha cWHERE a.Č_čt = b.Č_čt AND b.ISBN = c.ISBN
Poznámka:- FROM Čtenář a JOIN Výpůjčka b ON a.Č_čt = B.Č_čt;- FROM Čtenář JOIN Výpůjčka USING Č_čt¨;- FROM Čtenář NATURAL JOIN Výpůjčka- nepoužijeme-li WHERE, získáme kartézský součin, totéž lze
SELECT ….. FROM Čtenář CROSS JOIN Výpůjčka (formálně ano, logicky nesmysl)
![Page 20: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/20.jpg)
SELECT – FROM - WHERE
je v praxi základní konstrukcí jazyka SQL
![Page 21: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/21.jpg)
LEFT, RIGHT a FULL spojení
Zahrnuje i neporovnatelné řádky ze spojení
SELECT a.* , b.* FROM Čtenář aLEFT JOIN Výpůjčka b ON a.Č_čt = b.Č_čt;
LEFT JOIN poskytne nejen ty čtenáře, ke kterým byla nalezene výpůjčka, a to každého tolikrát, kolik výpůjček mají, ale i ty čtenáře, kteří výpůjčku nemají. Hodnoty z Výpůjčky jsou NULL.
Obecně: LEFT JOINT připojí i ty řádky, které z levé (první) tabulky nemajív pravé (druhé) relaci (tabulce) odpovídající prvek (řádku).
- RIGHT JOIN – připojuje neporovnané řádky z pravé (druhé) tabulky- FULL JOIN – připojuje neporovnané řádky jak z první tak ze druhé tabulky
![Page 22: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/22.jpg)
Test existence (EXISTS a NOT EXISTS)
Najdi jména čtenářů, kteří mají rezervovanou nějakou knihu,
SELECT Jméno FROM ČtenářWHERE EXISTS ( SELECT * FROM Rezervace WHERE Č_čt = Čtenář.Č_čt)
Výsledkem je hodnota true tehdy a jen tehdy, je-li v tabulce poddotazu alespoň jedna řádka. Jinak je hodnota false.
![Page 23: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/23.jpg)
Vložení prvku relace (řádky)
INSERT INTO název_tabulky [(seznam_sloupců)] VALUES (seznam_dat)
Hodnoty se uzavírají do apostrofů, pouze číselné hodnoty ne. Hodnotyse oddělují čárkou.
INSERT INTO Čtenář ( Č_čt, Jméno)VALUES (‘123’,’Novák Petr’);
INSERT ukládá výsledek dotazu do tabulky.Vytvořme relaci obsahující čtenáře a počet vypůjčených knih.
CREATE TABLE Statistika(Č-čt char (4), Počet SMALLINT);
INSERT INTO StatistikaSELECT Č_čt, COUNT(Inv_č) FROM Výpůjčka
GROUP BY Č_čt;
![Page 24: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/24.jpg)
Zrušení prvku relace (řádky)
DELETE FROM název_tabulky WHERE podmínka
DELETE FROM Kniha WHERE Autor = ‘B.Němcová’;
zrušení všech řádek
DELETE FROM Kniha
![Page 25: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/25.jpg)
Změna prvku relace (řádky)
UPDATE název_tabulkySET název_sloupce = hodnota_dat, [ název_sloupce_2 = hodnota_dat][WHERE podmínka]
UPDATE ČtenářSET Adresa = ‘Plzeň, Univerzitní 8’WHERE Č_čt = ‘123’
![Page 26: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/26.jpg)
Výraz relační algebry x příkaz SELECT
Student Známka1 N
Č_stud
Studijní_obor
Předmět
Známka
Vypiš jména všech studentů studijního oboru počítačové sítě, kteří mají z předmětu DB1 jedničku.
((Student (studijní_obor = ‘počítačové sítě’) * (Známka (Předmět = ‘DB1’AND Známka = 1)) [Jméno]
SELECT Jméno FROM Student a, Známka bWHERE Studijní_obor = ‘počítačové sítě’ AND a.Č_stud = b.Č_stud AND Předmět = ‘DB1’ AND Známka = 1
![Page 27: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/27.jpg)
DDL
• Datové typy ISO SQL – tabulky, pohledy, jména, sloupce– znaková sada: A … Z, a … z, 0 … 9 a „_“,
– identifikátor max. 128 znaků,
– identifikátor musí začínat písmenem,
– identifikátor nesmí obsahovat mezeru
![Page 28: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/28.jpg)
Definice tabulky
CREATE TABLE jméno_tabulky (
{ název_sloupce datový_typ [ NOT NULL ] [ UNIQUE ]
[ DEFAULT hodnota ] [ CHECK ( výběrová_podmínka )
[ , název_sloupce … ]}
[ PRIMARY KEY ( seznam_názvů_sloupců ), ]
{ [ FOREIGN KEY ( seznam_názvů_sloupců_tvořící_cizí_klíč )
REFERENCES název_nadřazené_tabulky [( seznam_názvů _sloupců )] ,
[ MATCH { PARTIAL | FULL }]
[ ON UPDATE referenční akce ]
[ ON DELETE referenční akce ] ]
[ , … ] }
{ [ CHECK ( výběrová_podmínka ) [ , …] }
)
![Page 29: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/29.jpg)
Datový typ
Logická proměnná
BOOLEAN
Text CHAR VARCHAR
Bit BIT BIT VARYING
Přesné výpočty
NUMERIC DECIMAL INTEGER SMALLINT
Přibližné výpočty
FLOAT REAL DOUBLE PRECISION
Čas DATE TIME TIMESTAMP
Interval INTERVAL
Rozsáhlé objekty
CHARACTER LARGE OBJECT
BINARY LARGE OBJECT
![Page 30: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/30.jpg)
Výběrová podmínka - příklady
den_v_týdnu CHAR (2) NOT NULL
CHECK ( den_v_týdnu IN ( ‘Po’, ‘Út’, ‘St’, ‘Čt’, ‘Pá’, ‘So’, ‘Ne’))
plat INT CHECK ( plat > 0 ) ,
odmena INT CHECK ( odmena < 0.5 * plat )
pocet_kreditu SMALLINT CHECK ( pocet_kreditu BETWEEN 1 AND 6 )
Podle ANSI SQL89 mohl být odkaz jen na položky definované v tabulce. Podle ANSI SQL92 (též SQL2) může být odkaz i na jinou tabulku – pomocí konsturkce SELECT.
![Page 31: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/31.jpg)
Deklarativní realizace integritních omezení
CREATE TABLE Předmět ( ….
FOREIGN KEY ( garant ) REFERENCES ucitele (cislo_ucitele)
…. )
Ucitele Predmet1 N
cislo_ucitele Předmět
Garant
ANSI SQL-86 pouze NOT NULLa UNIQUE
ANSI SQL-89 PRIMARY KEY CHECK (viz „výběrová kriteria“) FOREIGN KEY a REFERENCES
![Page 32: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/32.jpg)
Deklarativní realizace integritních omezenípokr.
ANSI SQL-92 (též SQL2)
definice cizího klíče doplněna
ON DELETE CASCADE
ON UPDATE CASCADE
ON DELETE SET NULL
ON UPDATE SET NULL
nová syntaxe CHECK – možnost vložení příkazu SELECT
Př.: Vedoucím katedry může být jen profesor nebo docent. Informace o titulu je uložena v tabulce Učitelé.
CREATE TABLE katedry ( …
vedoucí CHAR (8) CHECK ( EXISTS SELECT * FROM Ucitele
WHERE vedouci = ucitele.cis
AND titul IN ( ‘Prof’, ‘Doc’ ))
… )
![Page 33: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/33.jpg)
Referenční IO
Ucitele Predmet1 N
cislo_ucitele Zkratka
Garant
Vyuka
Zkratka
Garant
1 1
N N
CREATE TABLE Vyuka ( …FOREIGN KEY ( Garant) REFERENCES Ucitele (cislo_ucitele)
ON UPDATE CASCADE ON DELETE CASCADE,FOREIGN KEY ( Zkratka) REFERENCES Predmet
ON UPDATE CASCADE ON DELETE CASCADE…. )CREATE TABLE Předmět (…FOREIGN KEY ( Garant) REFERENCES Ucitele (cislo_ucitele)
ON UPDATE CASCADE ON DELETE NULL… )
![Page 34: SQL](https://reader035.vdocuments.net/reader035/viewer/2022062722/568139e5550346895da19d80/html5/thumbnails/34.jpg)
Pohledy
CREATE VIEW jméno_pohledu [ (nové_jméno_sloupce [ , …])]
AS subselect [WITH [CASCADED | LOCAL] CHECK OPTION]
• Dynamická struktura• Výsledek jedné nebo více relačních operací• Vznik nové relace, která je virtuální, v databázi neexistuje, je uložen
pouze její popis.