sql

34
SQL Přednáška DB1

Upload: ernst

Post on 05-Jan-2016

61 views

Category:

Documents


1 download

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 Presentation

TRANSCRIPT

Page 1: SQL

SQL

Přednáška DB1

Page 2: SQL

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

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

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

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

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

Získání celé tabulky

SELECT Isbn, Inv_č, D_nákupu, Cena, Země_vydáníFROM Exemplář;

SELECT * FROM Exemplář;

Page 8: SQL

Projekce

SELECT Země_vydání FROM Exemplář;

SELECT DISTINCT Země_vydání FROM Exemplář;

Page 9: SQL

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

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

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

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

Ř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

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

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

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

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

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

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

SELECT – FROM - WHERE

je v praxi základní konstrukcí jazyka SQL

Page 21: SQL

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

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

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

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

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

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

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

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

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

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

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

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

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

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.