48
Нaпреден SQL

Napreden_SQL - bazi

Embed Size (px)

DESCRIPTION

bazi podatoci - naprd_sql

Citation preview

Page 1: Napreden_SQL - bazi

Нaпреден SQL

Page 2: Napreden_SQL - bazi

2

Некои посебности на SET операции

Најди курс кој се оддржувал во есен 2009 година или лето 2010 година

Најди курс кој се оддржувал во есен 2009 но не лето 2010

(select course_id from section where sem = ‘Fall’ and year = 2009) union(select course_id from section where sem = ‘Spring’ and year = 2010)

Најди курс кој се оддржувал во есен 2009 и лето 2010

(select course_id from section where sem = ‘Fall’ and year = 2009) intersect(select course_id from section where sem = ‘Spring’ and year = 2010)

(select course_id from section where sem = ‘Fall’ and year = 2009) except(select course_id from section where sem = ‘Spring’ and year = 2010)

Page 3: Napreden_SQL - bazi

3

Некои посебности на SET операции

Пример база

Page 4: Napreden_SQL - bazi

4

Пример

Надите сите имиња на branches кои имаат поголема вредност на assets од колку сите branches лоцирани во Brooklyn.

select branch-namefrom branchwhere assets > all

(select assetsfrom branchwhere branch-city = ‘Brooklyn’)

Page 5: Napreden_SQL - bazi

5

Некои посебности на SET операции

F <comp> some r t r s.t. (F <comp> t)Каде <comp> е еден од:

056

(5< some ) = true

05

0

) = false

5

05(5 some ) = true (since 0 5)

(5 < од некои редициво релација)

(5< some

) = true(5 = some

(= some) inHо ( some) not in

Page 6: Napreden_SQL - bazi

6

Некои посебности на SET операции (1)

F <comp> all r t r (F <comp> t)

056

(5< all ) = false

610

4

) = true

5

46(5 all ) = true (since 5 4 and 5 6)

(5< all

) = false(5 = all

( all) not inHo (= all) in

Page 7: Napreden_SQL - bazi

7

Тест за немање дупликати

unique тестира постоење дупликати во табела. Да се најдат сите customers кои имаат најмногу една сметка во

филијала Perryridge.

select T.customer-name from depositor as T where unique (

select R.customer-name from account, depositor as R where T.customer-name = R.customer-name and

R.account-number = account.account-number and account.branch-name = ‘Perryridge’)

Page 8: Napreden_SQL - bazi

8

Пример

Наjдите сите имиња на branches кои имаат поголема вредност на assets од некои branches лоцирани во Brooklyn.

select branch-namefrom branchwhere assets > some

(select assetsfrom branchwhere branch-city = ‘Brooklyn’)

Исто што и select distinct T.branch-namefrom branch as T, branch as Swhere T.assets > S.assets and S.branch-city = ‘Brooklyn’

Page 9: Napreden_SQL - bazi

9

Креирање табели

SQL табела (relation) се дефинира со create table команда:

create table r (A1 D1, A2 D2, ..., An Dn,(integrity-constraint1),...,(integrity-constraintk))

– r име на релација

– секоја Ai е име на атрибут во шема за релацијата r

– Di е тип на податоци во доменот на вредности на атрибутот Ai

Пример:

create table branch(branch-name char(15) not null,branch-city char(30),assets integer)

Page 10: Napreden_SQL - bazi

10

Авторизациска спецификација во SQL

grant наредба за авторизација

grant <листа провилегии>

on <име релација или поглед> to <корисничка листа> <user list> е:

– user-id

– public, дозволува на сите валидни корисници привилегии кои се дадени

– рола

Давање привилеги на погледи не значи давање на привилегии на релации

Tој што може да дава привилегии, мора да има исти привилегии или повисоко, или да е администратор на БП

Page 11: Napreden_SQL - bazi

11

Правилата за интегритет дефинирани при креирање табели

Пример: декларираме branch-name како примарен клуч за branch и обезбедуваме assets >=0.

create table branch(branch-name char(15),branch-city char(30)assets integer,primary key (branch-name),check (assets >= 0))

not null primary key (A1, ..., An)

check (P), where P is a predicate

Page 12: Napreden_SQL - bazi

12

Ограничувања на домени

Domain constraints најелементарен облик на ограничувања на интегритет.

Примери креирање нови домени за постоечки типови податоци – промер: create domain Dollars numeric(12, 2)

create domain Pounds numeric(12,2)

Тие две вредности не можат да се споредуваат – Може да извршиме конверзија

(cast r.A as Pounds) (може да се поможи со соодносот долар/ фунта курс)

Page 13: Napreden_SQL - bazi

13

Ограничувања на интегритет

Можноста за редукција на грешки при внес на податоци – account мора да има баланс поголем од $10,000.00

– salary мора да е помала од $4.00 на час

– Клиент мора на има non-null телефонски број

Page 14: Napreden_SQL - bazi

14

Ограничувања на една релација

not null primary key unique check (P ), where P is a predicate

Page 15: Napreden_SQL - bazi

15

Not Null ограничување

дефинираме branch_name за branch е not null

branch_name char(15) not null

Дефинираме доменот на Dollars да биде not null

create domain Dollars numeric(12,2) not null

Page 16: Napreden_SQL - bazi

16

Ограничувања на една релација

unique ( A1, A2, …, Am)

Обезбедува атрибутите

A1, A2, … Amда формираат кандидат клуч. Тоа не значи дека ќе го избереме и за примарен клуч.

Page 17: Napreden_SQL - bazi

17

Check нредба

check (P ), where P е predicate

Пример (како порано)

create table branch (branch_name char(15), branch_city char(30), assets integer, primary key (branch_name), check (assets >= 0))

Page 18: Napreden_SQL - bazi

18

Референцијален интегритет

Обезбедува да вредноста на надворешен клуч (множество атрибути) на една табела се појавува како вредноста на едно множество атрибути во друга релација – Пример: Ако “Perryridge” е branch име во редица во account

табела, тогаш постои редица во branch табела за branch “Perryridge”.

Primary, candidate keys и foreign keys се дефинираат како дел од SQL create table наредбата:– primary key clause листа атрибути кои формираат primary key.

– unique key clause листа атрибути кои се candidate key.

– foreign key clause листа атрибути кои се foreign key како и име на релација која ја референцираат. По default, foreign key референцира primary key атрибут во референцирана релација.

Page 19: Napreden_SQL - bazi

19

Референцијален интегритет во SQL – Пример

create table customer(customer_name char(20),customer_street char(30),customer_city char(30),primary key (customer_name ))

create table branch(branch_name char(15),branch_city char(30),assets numeric(12,2),primary key (branch_name ))

Page 20: Napreden_SQL - bazi

20

Референцијален интегритет во SQL – Пример (1)

create table account(account_number char(10),branch_name char(15),balance integer,primary key (account_number), foreign key (branch_name) references branch )

create table depositor(customer_name char(20),account_number char(10),primary key (customer_name, account_number),foreign key (account_number ) references account,foreign key (customer_name ) references customer )

Page 21: Napreden_SQL - bazi

21

Assertions

Assertion e предикатен израз со услов кој сакаме секогаш да е задоволен на една база податоци

Аssertion во SQL има следната форма

create assertion <assertion-name> check <predicate> Тест на валидност, се изведува при секоја промена во база која

може да наруши правилото.– Ова може да побарува доста ресурси и време зато треба да

се користи со внимание.

Asserting for all X, P(X)

Или алтернативно

not exists X such that not P(X)

Page 22: Napreden_SQL - bazi

22

Assertion пример

Секој заем (loan) има барем еден клиент (borrower) кој оддржува сметка (account) со минимум balance $1000.00

create assertion balance_constraint check (not exists ( select *

from loan where not exists (

select * from borrower, depositor, account where loan.loan_number = borrower.loan_number

and borrower.customer_name = depositor.customer_name and depositor.account_number = account.account_number and account.balance >= 1000)))

Page 23: Napreden_SQL - bazi

23

Assertion пример (1)

Сума на сите позајмици (loan) за секоја филиала (branch) мора да биде помала од сума на сите вредности на сметки за секоја филијала (account balances).

create assertion sum_constraint check (not exists (select * from branch

where (select sum(amount ) from loan

where loan.branch_name = branch.branch_name )

>= (select sum (amount ) from account

where loan.branch_name = branch.branch_name )))

Page 24: Napreden_SQL - bazi

24

Авторизација (Authorization)

Постојат следните форми на автризација во БП:

Read – дозволува читање, но не модификација на податоци, Insert – дозволува вметнување нови податоци, но не модификација

на постоечкиу податоци, Update – дозволува модификација, но не бришење на податоци, Delete – дозволува бришење податоци.

Форми на ауторизација за промена на шема на БП: Index – дозволува креирање, менување индекси, Resources – дозволува менување нови релации, Alteration – дозволува додавање или бришење атрибути во релација, Drop – дозволува бришење на релација.

Page 25: Napreden_SQL - bazi

25

Привилегии во SQL

select: дозволува read access за релација, или можност за пребарување со користење view. Пример:– Доделување на корисниците U1, U2, и U3 select авторизација

на branch релација:

grant select on branch to U1, U2, U3

insert: за insert update: за update delete: за delete. all privileges: кратка форма за сите привилегии

Page 26: Napreden_SQL - bazi

26

Повлекување (Revoking) авторизација во SQL

Се користи revoke наредба за да се повлече авторизација.revoke <листа привилегииt>

on <име релација или поглед> from <корисничка листа>

Пример:revoke select on branch from U1, U2, U3

<листа привилегии> може да биде all за повлекување сите привилегии.

Ако<revoke-листа> вклучува public, сите корисници губат привилегии освен оние кои имаат експлицитна авторизација

Ако корисник добил привилегии од повеќе овластени лица за давање на авторизација при употреба на една revoke наредба од едно овластено лице, може да задржи привилегии дадени од друго овластено лице. Важи и за исти привилегии.

Сите привилегии кои зависат од дадени привилегии исто така се повлекуваат

Page 27: Napreden_SQL - bazi

27

Embedded SQL

Најважна можност за правење апликации е SQL standard кој дефинира вклучување (embedding) на SQL наредби во различни програмски јазици C, C#, Java, Delphi....

Повикувачки јазик се нарекува host language а SQL структура во тој јазик е составена од embedded SQL.

EXEC SQL наредбата се користи за идентификација на embedded SQL барање до предпроцесор

EXEC SQL <embedded SQL statement > END_EXEC

Забелешка: ова се разликува во различни јазици на пример Java embedding користи # SQL { …. };

Page 28: Napreden_SQL - bazi

28

Пример Query

Специфицирајте прашање во SQL и декларирајте променлива cursor за преземање одговор

EXEC SQL declare c cursor for select depositor.customer_name, customer_city from depositor, customer, account where depositor.customer_name = customer.customer_name and depositor account_number = account.account_number

and account.balance > :amount END_EXEC

Најголем предизвик кај јазикот домаќин е начин на профаќање на резултат со оглед на расположиви структури на податоци. Во случајов е декларирана променлива c како cursor

Од јазикот домаќин да се најдат имиња и градови на клиенти кои на сметки имаат повеќе од вредност дадена во променливата amount.

Page 29: Napreden_SQL - bazi

29

Embedded SQL (1)

Наредбата open обезбедува евалуација на прашањето

EXEC SQL open c END_EXEC Наредбата fetch обезбедува редицата (одговор на прашањето) да

се смести во јазик домаќин.

EXEC SQL fetch c into :cn, :cc END_EXEC

Повторување на fetch обезбедува добивање сукцесивни редици Променливата SQLSTATE во SQL комуникациско подрачје

(SQLCA) се поставува на ‘02000’ за да означи дека нема веќе податоци.

Наредбата close брише привремена табела (покажувач) која содржи резултат

EXEC SQL close c END_EXEC

Забелешка: овие елементи се различни кај различни јазици

Page 30: Napreden_SQL - bazi

30

SQL Views (погледи)

SQL view е виртуелна табела која се конструира од други реални табели во БП. Нема сопствени податоци, но во време на користење (извршување) црпи податоци од постоечки табели или други погледи.

Улога– Скривање одредени колони или редици– Доделување различни нивоа на дозволи за пристап до иста табела– Доделување различни тригери на разлини погледи на иста табела– Приказ на резиултати од пресметки– Надминување проблеми со комплицирани SQL

create view v as <query expression>

v е назив на погледquery expression e валиден израз

Page 31: Napreden_SQL - bazi

31

Пример креирање поглед

Поглед кој содржи сите branches и нивни customerscreate view all-customer as

(select branch-name, customer-name from depositor, account where depositor.account-number = account.account-number)

union (select branch-name, customer-name from borrower, loan where borrower.loan-number = loan.loan-number)

Прашање поставено на поглед

select customer-namefrom all-customerwhere branch-name = ‘Perryridge’

Page 32: Napreden_SQL - bazi

32

Ажурирање поглед

Ажурирање погледи е дозволено ако– Поглед се базира на една табела без колони со null вредности во

погледот– За останатите случаи постојат посебни правила и ограничувања и

затоа или не се дозволени или не се препорачуваат–

Пример креирање сите loan data во loan релацијаta со скриен атрибут amount

create view branch-loan asselect branch-name, loan-numberfrom loan

Додавање редица во поглед branch-loaninsert into branch-loan

values (‘Perryridge’, ‘L-307’)Ова се реализира со вметнување редица

(‘L-307’, ‘Perryridge’, null)во табелата loan на која се базира погледот

Page 33: Napreden_SQL - bazi

33

Тригери (Triggers)

TriggerСкладиран програм кој се извршува од ДБМС кога се случува некој настан. Тригер се извршува секогаш кога некој настан ќе се случи, на пример кога ќе се вметне редица во одредена табела.

Поврзан е со табела (релација) или поглед (view) Постојат три типа на тригери: BEFORE, INSTEAD OF и AFTER Секој од овие три типа може да биде деклариран за наредбите

INSERT, UPDATE, и/или DELETE Кога се активира тригер ДБМС обезбедува

– Стари и нови вредности за UPDATE– Нови вредности за INSERTS– Стари вредности за DELETE

Page 34: Napreden_SQL - bazi

34

Користење тригери

Обезбедува покомплексни default вредности Обезбедува контрола за ограничувања и дефинира default вредности Ажурира погледи (views) Обезбедува референцијален интегритет SQL Server на пр.поддржува 6 типа тригери (само за AFTER и

INSTEAD OF тригери)

Генеричка синтакса (скратена) за тригер

CREATE TRIGGER trigger_name ON table_or_view_name AFTER | BEFORE | INSTEAD OF INSERT | UPDATE | DELETE AS trigger_code

Page 35: Napreden_SQL - bazi

35

Целосна синтакса за тригер

CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } }

Page 36: Napreden_SQL - bazi

36

Пример

CREATE TRIGGER trig_addAuthor ON authors FOR INSERT AS

-- Get the first and last name of new author DECLARE @newName VARCHAR(100) SELECT @newName = (SELECT au_fName + ‘ ' + au_lName FROM Inserted)

-- Print the name of the new author PRINT 'New author "' + @newName + '" added.'

Креира нов тригер со име trig_addAuthor за табела authors кој ќе се активира при INSERT

Може да се дефинира истовремено користење за INSERT, DELITE, UPDATE

При извршување на наредбата INSERT се креира виртуелна табела со имe INSERTED за табелата authors со соодветни атрибути.

При вметнување секоја нова редица во табелата authors се повикува тригер кој во случајов испишува: New author име презиме added

Page 37: Napreden_SQL - bazi

37

Пример (1)

Нека pubs е назив на база во која се наоѓа табела authors

За тестирање на новиот тригер од командна линија во Query Analyzer (Start -> Programs -> Microsoft SQL Server 7.0 -> Query Analyzer) и конекција кон базата:

USE pubs GO

SET NOCOUNT ON

INSERT INTO authors(au_id, au_lname, au_fname, phone, address, city, state, zip, contract) VALUES('172-85-4534', 'Doe', 'John', '123456', '1 Black Street', 'Doeville', 'CA', '90210', 0)

Page 38: Napreden_SQL - bazi

38

Пример (3)

Page 39: Napreden_SQL - bazi

39

Пример за UPDATE

CREATE TRIGGER trig_updateAuthor ON authors FOR UPDATE AS

DECLARE @oldName VARCHAR(100) DECLARE @newName VARCHAR(100)

IF NOT UPDATE(au_fName) AND NOT UPDATE(au_lName) BEGIN RETURN END

SELECT @oldName = (SELECT au_fName + ' ' + au_lName FROM Deleted) SELECT @newName = (SELECT au_fName + ' ' + au_lName FROM Inserted)

PRINT 'Name changed from "' + @oldName + '" to "' + @newName + '"'

Се креираат две нови променливи: oldName (ќе содржи вредности пред промената) и newName ќе содржи вредности по промената. UPDATE тригер проверува дали "au_fName" и "au_lName“ полиња се ажурирани со "UPDATE" SQL query. Се извршува тригер "trig_updateAuthor" trigger. Ако нема ажурирање се враќа контрола на SQL server. Ако има ажурирање и на двете полиња au_fName и au_lName се земаат нивни стари имиња од табелата DELETED I se ставаат во променливата oldName, додека новите ажурирани вредности се земаат од тавелата INSERTED и се ставаат во newName. Потоа и двете вредности се печатат

Page 40: Napreden_SQL - bazi

40

Пример тригер за дефинирање ограничувања

Arenas (ArenaID, ArenaName, City, ArenaCapacity), ArenaCapacity >= 5000

CREATE TRIGGER minseating ON Arenas /*trigger associated to Arenas*/FOR INSERT /*executed after an insert*/ASDECLARE @capacity as int /*variable declarations */

SELECT @capacity = ArenaCapacity /* get values inserted */FROM insertedif @capacity < 5000BEGINROLLBACK /*undo the insert*/Print 'Arena too small‘ /*message for the user*/END

Page 41: Napreden_SQL - bazi

41

Тригер за интегритет на табелата

Page 42: Napreden_SQL - bazi

42

Page 43: Napreden_SQL - bazi

43

Складирани процедури (Stored Procedures)

Stored procedure Е програм кој е складиран во рамките на база и се компајлира во моментов на

користење Може да прифаќа влезни параметри и може да враќа резултати Може да се повикува:

– некој стандарден јазик– скриптирачки јазик– SQL command prompt

За креирање– ORACLE во PL/SQL или Java– SQL Server воTRANSACT-SQL

За повикување: – Во ORACLE PL/SQL или Java– Во скриптирачки јазици JavaScript, VBScript– На SQL команден промпт (SQL*Plus ORACLE, Query Analyzer SQL Server

Page 44: Napreden_SQL - bazi

44

Предности на stored procedure

Поголема сигурност, бидеќи се складираат на ДБ сервер SQL се оптимизира со DBMS compiler Помал пренос податоци низ мрежа Делење на код резултира со:

– Помалку работа

– Стандардизирање на процесирање

– Специјали на развоен тим

Page 45: Napreden_SQL - bazi

45

Креирање и повикување на stored procedure

CREATE PROCEDURE proc_name

AS proc_code

exec proc_name [@param1 = ]value1, …

Има мали варијации во варианти на SQL на различни ДБМС

Пример:

Performers (PerformerID, PerformerName, Street, City, State, Zip)

опис: Се вметнива performer само ако name и zip не се веќе во табелата

Page 46: Napreden_SQL - bazi

46

Performers (PerformerID, PerformerName, Street, City, State, Zip, ActivityID)

CREATE PROCEDURE performer_Insert(@ID int,

@NewName char(20),

@street char(20),

@city char(15),

@state char(2),

@NewZip int)

AS

DECLARE @Count as int

SELECT @Count = Count(*)

FROM Performers

WHERE PerformerName=@NewName

AND Zip = @NewZip

IF @Count > 0 BEGIN PRINT 'Performer is already in the Database' RETURN END BEGIN TRANSACTION INSERT INTOPerformers(PerformerID,PerformerName, Street, City, State, Zip) VALUES (@ID, @NewName, @street, @city, @state, @NewZip)PRINT 'Performer added to database'COMMIT

exec performer_Insert @ID = 10, @NewName = 'James Brown', @street ='Main', @city ='Aiken', @state ='SC', @NewZip = 54322

Page 47: Napreden_SQL - bazi

47

Triggers vs. Stored Procedures

Тригери Се примери на код (програми) кои се повикуваат од страна на ДБМС

само при INSERT, UPDATE и DELITE команди Придружени се на одредена табела или поглед (view) Во зависноста од ДБМС може да имаме еден или повеќе тригери за

една табела или поглед Со повикување еден тригер (на пример при INSERT) може да се

провоцира повикување на некој друг тригер Складирани процедури Се примери на код кои ги повикува корисник или ДБА администратор Се однесува на база податоци (не само на одделна табела или поглед) Може да се користи и кај INSERT, UPDATE и DELITE команди Најчесто се користи за административни работи на база или како дел

на апликација

Page 48: Napreden_SQL - bazi

48

Triggers vs. Assertions

Assertions се моќни, но најчесто не може да одредиме кога и колку проверки ќе бидат изведени.

Чекирања на атрибути и терки можат да се прердвидат но не се толку моќни алатки

Тригери овозможуваат одлуки за проверки да носат корисници