relační databáze

34
Relační databáze Jakub Lokoč

Upload: toby

Post on 07-Jan-2016

96 views

Category:

Documents


2 download

DESCRIPTION

Relační databáze. Jakub Lokoč. Rekapitulace ZS. Proč a jak vzniká relační datový model? Kvalita relačního modelu? Co relační model umožňuje? SQL – jazyk pro definici dat, modifikaci dat a hlavně pro jejich dotazování Transakce – konkurenční prostředí Co mají všechna témata společného?. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Relační databáze

Relační databázeJakub Lokoč

Page 2: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

2

Rekapitulace ZSProč a jak vzniká relační datový model?Kvalita relačního modelu?Co relační model umožňuje?

SQL – jazyk pro definici dat, modifikaci dat a hlavně pro jejich dotazování

Transakce – konkurenční prostředí

Co mají všechna témata společného?

Page 3: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

3

Plán na letní semestrSeznámení s MSSQL serverem

◦ Instalace express edition 2008 (DÚ)◦Microsoft SQL Server Management Studio

T-SQL◦Uložené procedury◦Triggery

Datový sklad pomocí MSSQL serveru◦Operátor CUBE

Page 4: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

4

Cvičení Používaný datový model

◦ DUM(Cislo, Ulice, Barva)◦ OKNO(Id, Cislo, Ulice, JeStresni) Cislo, Ulice je CK do DŮM◦ KOCKA(Id, Jmeno, Barva)◦ PREDENI(OknoId, KockaId) OknoId a KockaId jsou Ck do tabulek Okno a Kocka

Vytvořte tabulky na MSSQL serveru (včetně primárních a cizích klíčů)

Nastavte, že barva domu nebo kočky může být jen bílá, hnědá nebo černá

Naplňte tabulky daty

Napište a otestujte SQL dotazy◦ Střešní okna na ulici Estonská nebo Vltavská

◦ Jména koček, které předly na ulici Estonská

◦ Kolik koček předlo v Estonské ulici?

◦ Na které ulici nepředla žádná kočka?

Page 5: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

5

T-SQLRozšíření jazyka SQL (Microsoft a

Sybase)◦Lokální proměnné◦Řízení toku programu (control of

flow)◦Knihovna systémových procedur a

funkcí◦Uživatelské procedury a funkce◦Rozšíření operací UPDATE a DELETE◦BULK INSERT◦…

Page 6: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

6

Běžné datové typy na MSSQL serveru

Typ Velikost

Popis

INT 4 Celé číslo

FLOAT n Desetinné číslo (n je počet bitů mantisy)

DATETIME 8 Datum a čas

CHAR n Řetězec délky n

VARCHAR n Řetězec proměnlivé délky

NCHAR n Unicode varianta CHAR

NVARCHAR

n Unicode varianta VARCHAR

BIT 1 Pravdivostní hodnota TRUE nebo FALSE

TABLE Tabulka pro uložení mezivýsledku

CURSOR Struktura pro sekvenční procházení dat

Page 7: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

7

T-SQL systémové funkceMatematické operátory

◦+, -, /, *, %, Abs, Round, Floor, Ceiling, RandAgregační funkce

◦Sum, Min, Max, Avg, CountFunkce pro práci s řetězci

◦+, Left, Right, Lower, Len, Replace, Substring

Funkce pro práci s datem a s NULL◦Year, Month, Day, GetDate, IsNull

Funkce pro konverzi mezi datovými typy◦Cast(vyraz as typ), Convert(typ, vyraz, styl)

Page 8: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

8

T-SQL deklarace proměnnýchKlíčové slovo DECLAREProměnná musí začínat symbolem @Příklady na přiřazení hodnoty proměnné

DECLARE @PocetDomu INT, @Datum DATETIME;

SET @PocetDomu = 5; SET @Datum = ‘3-20-2012’;

SET @Datum = DATEADD(DAY, 1, @Datum);

-- Náhodná inicializace proměnné na hodnotu 2, 3 nebo 4

SET @PocetDomu = 2 + Rand() * 3;

SET @PocetDomu = (SELECT Count(*) FROM Dum);

SELECT @PocetDomu = Count(*) FROM Dum;

Page 9: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

9

T-SQL platnost proměnnéProměnné jsou lokální, tj. platí pouze v

daném vykonávaném blokuPozor na příkaz GO ukončující dávkuPříklad

DECLARE @PocetDomu INT;

GO

-- Dojde k chybě, nezná proměnnou @PocetDomu

SET @PocetDomu = 5;

SELECT Ulice, Count(Cislo)

FROM Dum GROUP BY Ulice HAVING Count(*) > @PocetDomu

Page 10: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

10

T-SQL tabulková proměnnáSlouží k uchování mezivýsledku

(optimalizace dotazu)Záleží na velikosti mezivýsledku!!!Příklad

DECLARE @T TABLE

(Cislo INT not null, Adresa VARCHAR(50) not null);

-- Naplníme jako klasickou tabulku

INSERT INTO @T SELECT Cislo, Adresa FROM Dům WHERE …

SELECT * FROM @T, Okno WHERE …

Page 11: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

11

T-SQL řízení toku programu BEGIN, END – začátek a konec bloku

IF, ELSE – větvení programu

WHILE – opakované provádění bloku kódu

BREAK, CONTINUE – řízení cyklu

RETURN – opuštění vykonávané procedury

WAITFOR – pozastavení programu

GOTO – skok na návěští (moc nepoužívat)

Page 12: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

12

T-SQL větvení programu

DECLARE @PocetOken INT;

SELECT @PocetOken = Count(*) FROM Okno WHERE Ulice = ‘Estonská’ AND Cislo = 1;

-- Pro objednávku 50 a více oken je 500 Kč sleva

IF @PocetOken > 49

PRINT ‘Cena za jedno okno je 10.000 Kč.’

ELSE

PRINT ‘Cena za jedno okno je 10.500 Kč.’

-- Pokud chceme vykonat více operací v rámci jedné větve, tak

-- musíme příkazy uzavřít do bloku BEGIN a END

-- Příkaz PRINT vytiskne řetězec do okna zpráv (Messages)

Page 13: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

13

T-SQL cyklusDECLARE @Pocet INT, @Ulice VARCHAR(25);

SET @Pocet = 0;

WHILE @Pocet < 10

BEGIN

SET @Pocet = @Pocet + 1;

IF Rand() < 0.25 SET @Ulice = ‘Estonská’;

ELSE SET @Ulice = ‘Vltavská’;

INSERT INTO Dum VALUES (@Pocet, @Ulice, ‘Modrá’);

END

-- Upravte skript tak, aby se generovaly různé barvy domů (použijte CASE)

-- Upravte skript tak, aby se ke každému novému domu vložilo 5 oken.

-- Třetí a páté okno bude vždy střešní.

Page 14: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

14

T-SQL řízení cykluDELETE FROM Dum;

DECLARE @Pocet INT;

SET @Pocet = 0;

WHILE @Pocet < 10

BEGIN

SET @Pocet = @Pocet + 1;

IF @Pocet = 2 CONTINUE;

INSERT INTO Dum VALUES (@Pocet, ‘Estonská’, ‘Modrá’);

IF @Pocet = 7 BREAK;

END

-- Popište, jak bude vypadat tabulka Dum po provedení skriptu.

Page 15: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

15

T-SQL kurzory Slouží pro sekvenční zpracování výsledku SQL dotazu Často vyžadují hodně paměti! Neopomíjet alternativy založené na sadách řádků! Pravidla práce s kurzorem

◦ Deklarace kurzoru pomocí SELECT příkazu◦ Před použitím je nutné kurzor otevřít (po použití zase

zavřít)◦ Pohyb kurzoru si řídí uživatel sám (FETCH NEXT, FIRST,

LAST, …)◦ Uživatel má k dispozici data z aktuální pozice kurzoruČíslo Ulice

1 Estonská

2 Estonská

3 Estonská

1 Francouzská

FETCH NEXT do proměnných @x a @y

FETCH NEXT …

FETCH NEXT …

FETCH NEXT …

FETCH NEXT @@FETCH_STATUS != 0

Page 16: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

16

T-SQL práce s kurzoryDECLARE @Cislo INT, @Ulice VARCHAR(50);

DECLARE dum_cursor CURSOR FORSELECT Cislo, Ulice FROM Dum;OPEN dum_cursor;

FETCH NEXT FROM dum_cursor INTO @Cislo, @Ulice

WHILE @@FETCH_STATUS = 0BEGINPRINT Cast(@Cislo AS CHAR(4)) + ' ' + @UliceFETCH NEXT FROM dum_cursor INTO @Cislo, @UliceEND

CLOSE dum_cursor;DEALLOCATE dum_cursor;

Page 17: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

17

T-SQL kurzoryPříklad 1

◦ S využitím kurzoru přidejte každému domu v Estonské jedno střešní okno

Jiné řešení (sice jednodušší, ale zato efektivnější…)

INSERT INTO Okno (Cislo, Ulice, JeStresni)

SELECT Cislo, Ulice, 1 FROM Dum WHERE Ulice = ‘Estonská’

Příklad 2◦ Spočítejte kumulativní sumu počtu střešních oken pro

posloupnost domů (1, 1+1, 1+1+1, …). Srovnejte efektivitu kurzoru a řešení pomocí dotazu s Group By

Page 18: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

18

T-SQL transakceZajištění ACID vlastností složitějších operací

MS SQL server podporuje několik módů transakcí◦ Autocommit mode – běžné nastavení, každá operace

je transakcí která potvrdí nebo abortuje v případě chyby

◦ Implicitní transakce – neuvádí se start transakce, potvrzení odstartuje novou transakci

◦ Explicitní transakce – explicitně definované startem a koncem transakce

Autocommit mód je nevhodný pro rozsáhlé operace

Page 19: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

19

T-SQL transakce Autocommit mode - doba vložení kolem 40s

DECLARE @Pocet INT

SET @Pocet = 100000

WHILE @Pocet > 0

BEGIN

SET @Pocet = @Pocet - 1

INSERT INTO Dum VALUES (@Pocet, 'Estonska', 'Bila')

END

Page 20: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

20

T-SQL transakce Explicitně vyjádřená transakce - doba vložení kolem

3s

DECLARE @Pocet INT

SET @Pocet = 100000

BEGIN TRAN

WHILE @Pocet > 0

BEGIN

SET @Pocet = @Pocet - 1

INSERT INTO Dum VALUES (@Pocet, 'Estonska', 'Bila')

END

COMMIT TRAN

Page 21: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

21

T-SQL explicitní transakceBEGIN TRAN – zahájení transakceCOMMIT TRAN – potvrzení transakceROLLBACK TRAN – zrušení efektu transakce

DECLARE @PocetDomu INT, @Limit INTSET @Limit = AktualniPocetPovolenychDomu()

BEGIN TRANINSERT INTO Dum VALUES (1, 'Estonska', 'Bila')

SET @PocetDomu = (SELECT Count(*) FROM Dum)

IF @PocetDomu > @Limit ROLLBACK TRANCOMMIT TRAN

Page 22: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

22

T-SQL explicitní transakceImplicitní chování není ACID – chyba jedné z

operací nevyvolá abort celé transakce

BEGIN TRANINSERT INTO Dum VALUES (1, 'Estonska', 'Bila')INSERT INTO Dum VALUES (1, 'Estonska', 'Bila‘)

COMMIT TRAN

Druhý insert neproběhne kvůli porušení omezení primárního klíče, nicméně, první insert proběhne a je potvrzen

Page 23: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

23

T-SQL explicitní transakceLze vyřešit pomocí přepínače…

SET XACT_ABORT ON

BEGIN TRANINSERT INTO Dum VALUES (1, 'Estonska', 'Bila')INSERT INTO Dum VALUES (1, 'Estonska', 'Bila')

COMMIT TRAN

Page 24: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

24

T-SQL explicitní transakceNebo ručně pomocí zachycení a ošetření chyby

BEGIN TRANBEGIN TRY

INSERT INTO Dum VALUES (1, 'Estonska', 'Bila')INSERT INTO Dum VALUES (1, 'Estonska', 'Bila')COMMIT TRAN

END TRYBEGIN CATCH

ROLLBACK TRANEND CATCH

Page 25: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

25

T-SQL savepointyMechanismus, jak vrátit zpět pouze část

transakce

BEGIN TRANINSERT INTO Dum VALUES (1, 'Estonska', 'Bila');SAVE TRAN SP1INSERT INTO Dum VALUES (2, 'Estonska', 'Bila');ROLLBACK TRAN SP1INSERT INTO Dum VALUES (3, 'Estonska', 'Bila');

COMMIT TRAN

Do tabulky Dům se vloží pouze Domy 1 a 3

Page 26: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

26

T-SQL uložené proceduryZajišťují znovupoužitelnost kóduKomunikují s volajícím pomocí

parametrů◦ INPUT a OUTPUT parametry, příkaz

RETURNVe svém těle mohou volat jiné

proceduryProcedury se volají/spouštějí příkazem

EXEC

Hlavní program Procedura

Parametry

Page 27: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

27

T-SQL uložené proceduryPříklad uživatelské procedury, která vrátí počet

domů na zadané ulici příkazem RETURN

CREATE PROCEDURE PocetDomu_1

@Ulice VARCHAR(50)

AS

BEGIN

DECLARE @Pocet INT;

SELECT @Pocet = Count(*) FROM Dum WHERE Ulice = @Ulice;

RETURN @Pocet;

END

GO

DECLARE @Pocet INT;

EXEC @Pocet = PocetDomu_1 ‘Estonská’;

Page 28: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

28

T-SQL uložené proceduryPříklad uživatelské procedury, která vrátí

počet domů na zadané ulici OUTPUT parametrem

CREATE PROCEDURE PocetDomu_2

@Ulice VARCHAR(50), @Pocet INT OUTPUTAS

BEGIN

SELECT @Pocet = Count(*) FROM Dum WHERE Ulice = @Ulice;

END

GO

DECLARE @Pocet INT;

EXEC PocetDomu_2 ‘Estonská’, @Pocet OUTPUT;

Page 29: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

29

T-SQL uložené proceduryZapouzdřují složité operace nad

datyMinimalizují síťovou komunikaciRozmanité možnosti nastavení

oprávnění pro přístup k datůmMůžou (ale nemusí) vracet

hodnotuJsou primárně navrženy tak, aby

vracely výsledky aplikaci (v datasetu)

Page 30: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

30

T-SQL uložené funkcePodobné jako procedury až na to, že…

◦ Vždy vrací nějakou hodnotu◦ Můžou vracet i tabulku (volání v SELECT dotazu)◦ Na rozdíl od pohledu můžou přijímat parametry◦ Nelze v nich volat některé příkazy

CREATE FUNCTION Domy(@Ulice VARCHAR(50))

RETURNS TABLE

AS

RETURN

(SELECT * FROM Dum WHERE Ulice = @Ulice);

GO

SELECT Count(*) FROM Domy(‘Estonská’);

Page 31: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

31

T-SQL příkaz EXECEXEC (‘SELECT * FROM Dum’)

◦Spustí SQL dotaz zadaný řetězcem

EXEC nazev_procedury parametry◦Spustí proceduru s parametry

EXEC @return = nazev_procedury◦Spustí proceduru a převezme

výsledek

Page 32: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

32

T-SQL triggery Tzv. spouštěče událostí u DDL nebo DML akcí U DML operací lze triggery spouštět v módech

◦ AFTER – po operaci (pouze u tabulek)◦ INSTEAD OF – namísto operace (u pohledů a tabulek)

Většinou se na událost volá nějaká stored procedura

U DML triggerů je klíčové mít k dispozici vložená, změněná nebo opravená data

INSERTED DELETED

INSERT Nové řádky

UPDATE Nové údaje Staré údaje

DELETE Smazané řádky

Page 33: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

33

T-SQL triggeryCREATE TRIGGER UpravaTabulkyDumON Dum AFTER INSERT ASINSERT INTO DumLogSELECT I.Id, GetDate() FROM Inserted IGO-- Vypnutí triggeruDISABLE TRIGGER UpravaTabulkyDum ON DumGO-- Zapnutí triggeruENABLE TRIGGER UpravaTabulkyDum ON Dům-- Jak by se zalogovaly všechny operace s

tabulkou?

Page 34: Relační databáze

Relační databáze, T-SQL, RNDr. Jakub Lokoč, Ph.D.

34

T-SQL triggeryJak zjistit Id nových nebo změněných

objektů?◦ SELECT I.Id FROM Inserted I

Jak zjistit Id smazaných objektů?◦ SELECT D.Id FROM Deleted D

Jak zjistit, jestli byla změněna hodnota ve sloupci Ulice?◦ IF UPDATE(Ulice) …

Jak stornovat aktualizační operaci?◦ Příkazem ROLLBACK