10 sql przeglad

background image

(c) T. Pankowski, SQL - przegląd

1

SQL

SQL

j

j

ę

ę

zyk baz danych

zyk baz danych

przegl

przegl

ą

ą

d

d

Tadeusz Pankowski

www.put.poznan.pl/~tadeusz.pankowski

(c) T. Pankowski, SQL - przegląd

2

SQL

SQL

-

-

historia

historia

• SQL - "Structured Query Language" - język czwartej

generacji (4GL) wymowa: "es-kju-ell" lub "sequel [si:kwl]"

• SQL – język baz danych, strukturalny język zapytań, język

kwerend.

Język do definiowania, wyszukiwania i

administrowania danymi w relacyjnej bazie danej.

(c) T. Pankowski, SQL - przegląd

3

SQL

SQL

-

-

historia

historia

1.

1970, E.F.Codd, "

A relational model of data for large shared data

banks

", Communications of the ACM, Vol.13, No.6, 1970, podstawy

relacyjnego modelu danych

2.

1974, SEQUEL "Structured English Query Language", D. Chamberlin

i in., IBM San Jose Research Laboratory, implementacja: SEQUEL-

XRM (1974-75)

3.

1976-77, SEQUEL/2, implementacja i rozwój w ramach projektu

System R, IBM San Jose RL

4.

1980-83, główne implementacje: ORACLE, DB2 (SQL/DS),

5.

1986, SQL/86 - oficjalny standard ANSI (American National

Stanmdards Institute) oraz ISO (International Organization for

Standardization)

6.

1992, SQL2 (lub SQL/92) - "International Standard ISO/IEC

9075:1992,

Database Language SQL

"

7.

dalszy rozwój: SQL3 (SQL:1999), włącza idee podejścia

obiektowego, dane wielowymiarowe, heterogeniczne, XML, ...

(c) T. Pankowski, SQL - przegląd

4

Standaryzacja

Standaryzacja

-

-

zalety

zalety

redukcja kosztów szkolenia

przenośność aplikacji

wydłużenie żywotności aplikacji

komunikacja międzysystemowa,

interoperacyjno

ść

wygoda dla użytkownika, co robi system, a nie w jaki

sposób

wspólny interfejs do bazy danych

background image

(c) T. Pankowski, SQL - przegląd

5

Standaryzacja

Standaryzacja

-

-

wady

wady

ograniczenie kreatywności

SQL jest dość daleki od idealnego języka relacyjnego

braki samego SQL – wiele problemów pozostawiono jako

zależnych od implementacji "implementation

dependent", co utrudnia przenośność

złudzenie istnienia standardu (?)

Architektura aplikacji baz

Architektura aplikacji baz

danych

danych

Oprogramowanie klienta

ADO

(ActiveX Data Objects)

ODBC

(Open Database Connectivity)

MS SQL

Server

ORACLE

Access

Warstwa

oprogramowania

klienta

Oprogramowanie standardowe

zapewniające wymianę danych

między serwerem i klientem:

Warstwa

oprogramowania

serwera

7

SQL

SQL

przeznaczenie

przeznaczenie

SQL = SQL2 = SQL/92
Uwaga: Używać będziemy notacji stosowanej w dialekcie języka SQL

systemu MS SQL Server, a więc języka Transact-SQL.

1.

Główne funkcje zarządzania danymi:

definiowanie

manipulowanie,

administrowanie

2.

Przeznaczony dla:

interakcyjnych użytkowników końcowych,

twórców programów użytkowych (aplikacji),

administratorów baz danych,

twórców oprogramowania specjalizowanego (narzędziowego,

systemów współpracujących z bazami danych, ...)

8

SQL

SQL

posta

posta

ć

ć

polece

polece

ń

ń

Zapytania w języku SQL mogą przybierać różną postać. Postać ta może

zależeć od:

1.

Miejsca wydawania polecenia:

bezpośrednio w trybie interakcyjnym z terminala,

w oprogramowaniu serwera,

w oprogramowaniu kienta.

2.

Kompletności posiadanej informacji w momencie formułowania

polecenia:

posiadamy pełną informację (w zapytaniu nie ma potrzeby używania

zmiennych),

używamy zmiennych do przekazywania i pobierania do/z zapytania

pewnych parametrów, ale postać zapytania jest ustalona,

używamy zmiennych do dynamicznego tworzenia postaci zapytania, a

więc zmienne mogą być zarówno parametry zapytania, jak również jego

struktura.

background image

9

Pe

Pe

ł

ł

ne okre

ne okre

ś

ś

lenie zapytania

lenie zapytania

Pracownik(IDPrac, Nazwisko, Placa, Stanowisko)

Dochod(IDPrac, Rok, Kwota)

Wtrybie interakcyjnym, bezpośrednio z terminala

select Nazwisko, Placa

from

Pracownik

where Placa >= 2000

Wynikiem jest tabela o dwóch kolumnach: Nazwisko i Placa.

Do tabeli wynikowej należą wiersze, w których atrybut Placa

ma wartość większą lub równą 2000.

Z wykorzystaniem zmiennnych wierszowych (aliasów):

select P.Nazwisko, D.Rok, D.Kwota

from

Pracownik P, Dochod D

where P.IDPrac = D.IDPrac AND Rok > 1980

10

Zapytania sparametryzowane

Zapytania sparametryzowane

Pracownik(IDPrac, Nazwisko, Placa, Stanowisko)

Dochod(IDPrac, Rok, Kwota)

Wykorzystanie zmiennych wyjściowych w T-SQL (Transact-SQL):

declare @zm_placa money

select @zm_placa = Placa

from

Pracownik

where IDPrac = '00123'

W pierwszym wierszu deklarowana jest zmienna @zm_placa (nazwa

każdej zmiennej w języku Transact-SQL rozpoczyna się od znaku @) typu

money.

W drugim wierszu pod zmienną @zm_placa podstawiana jest wartość

kolumny Placa z ostatniego wiersza stanowiącego zbiór odpowiedzi na

zapytanie.

11

Zapytania sparametryzowane (c.d.)

Zapytania sparametryzowane (c.d.)

Pracownik(IDPrac, Nazwisko, Placa, Stanowisko)

Dochod(IDPrac, Rok, Kwota)

Wykorzystanie zmiennych wejściowych i wyjściowych (T_SQL):

declare @IDPrac varchar(30)

declare @zm_placa money

set @IDPrac='00123'

select @zm_placa = Placa

from

Pracownik

where IDPrac = @IDPrac

Wartość zmienna @IDPrac określana jest przed wykonaniem zapytania.

Zauważmy, że dzięki znakowi @ system rozróżnia czy chodzi o nazwę

zmiennej @IDPrac, czy o nazwę kolumny IDPrac.

W obydwu powyższych przypadkach struktura zapytania jest znana.

12

Zapytania dynamiczne (T

Zapytania dynamiczne (T

-

-

SQL)

SQL)

declare @zm_zapytanie varchar(100)

declare @zm_tabela varchar(100)

declare @zm_kolumny varchar(100)

set @zm_tabela = 'Pracownik'

set @zm_kolumny='Nazwisko, Placa'

set @zm_zapytanie='select ' + @zm_kolumny + ‘ from '+@zm_tabela

execute sp_sqlexec @zm_zapytanie

trzy pierwsze linie zawierają deklaracje zmiennych

w trzech kolejnych liniach następuje określenie wartości zmiennych,

tworzymy:

”select Nazwisko, Placa from Pracownik”

w ostatniej linii następuje wykonanie zapytania, procedury pamiętanej

sp_sqlexec, ktrórej parametr @zm_zapytanie przekazuje tekst

polecenia (zapytania, procedury)

background image

13

Zapytania dynamiczne (T

Zapytania dynamiczne (T

-

-

SQL)

SQL)

• W przypadku zapytań dynamicznych postać zapytania nie

jest znana na etapie kompilacji, w szczególności więc

system nie jest w stanie ani sprawdzić poprawności

składniowej zapytania, ani tym bardziej opracować

optymalnej strategii jego wykonania.

• Czynności te realizowane są dopiero na etapie wykonania,

co istotnie zmniejsza efektywność przetwarzania.

14

Zapytania dynamiczne (VB

Zapytania dynamiczne (VB

-

-

ADO)

ADO)

15

Zapytania dynamiczne (VB

Zapytania dynamiczne (VB

-

-

ADO)

ADO)

‘Podprogram tworzenia tabeli w bieżącej bazie danych

‘nazwa tabeli podawana jest w polu tekstowym NazwaTabeli i jest wykorzystana

‘do dynamicznego utworzenia polecenia SQL-owego CREATE TABLE

-----------------------------------------------------------------------------------------------------------

Private Sub TworzTabele_Click()
Dim c As ADODB.Command
On Error Resume Next
Set c = New ADODB.Command
Set c.ActiveConnection = db
c.CommandText = "Create Table " & NazwaTabeli.Text & " (KolA Char (2),KolB Int)"
c.CommandType = adCmdText
db.Errors.Clear
c.Execute
If db.Errors.Count > 0 Then

WriteError

Else

StatusBar1.SimpleText = "Tabela utworzona."

End If
End Sub

Definiowanie tabel

Definiowanie tabel

-

-

przyk

przyk

ł

ł

ad

ad

background image

17

Definiowanie tabel

Definiowanie tabel

-

-

przyk

przyk

ł

ł

ad

ad

create table Dostawca (

NrDcy

char(3) primary key,

Nazwa

char(20),

Adres

char(20))

create table Magazyn (

NrMag

INT primary key,

Adres

char(20))

create table Towar (

NrTow

char(5) not null primary key,

Nazwa

char(20),

GrupaTow

char(3) not null,

CenaZak

money,

CenaSprz

money)

18

Definiowanie tabel

Definiowanie tabel

przyk

przyk

ł

ł

ad (c.d.)

ad (c.d.)

create table Dostawa (

IdDost

int

identity(1,1),

NrDcy

char(3),

NrMag

int,

NrTow

char(5),

Data

datetime,

Ilosc

decimal(5),

constraint Kg_Dostawa primary key (IdDost),

constraint Ko_Dostawa_Dostawca

foreign key (NrDcy) references Dostawca,

constraint Ko_Dostawa_Towar

foreign key (NrTow) references Towar ,

constraint Ko_Dostawa_Magazyn

foreign key (NrMag) references Magazyn)

create table TowMag (

NrMag

int,

NrTow

char(5),

Stan

decimal(5),

primary key (NrMag, NrTow),

foreign key (NrMag) references Magazyn,

foreign key (NrTow) references Towar)

19

Definiowanie tabel

Definiowanie tabel

przyk

przyk

ł

ł

ad (c.d.)

ad (c.d.)

1. W powyższych definicjach:

klucz główny składa się z kilku kolumn dlatego jego definicja

podana jest po definicji wszystkich kolumn, np: primary key

(NrMag, NrTow);

warunkom spójności bazy danych można nadać nazwy,

umieszczamy je wtedy we frazie constraint,

definiujemy zależności referencyjne przez określenie klucza

obcego foreign key oraz tabeli, od której klucza głównego ten

klucz obcy zależy, np: foreign key (NrMag) references Magazyn

oznacza, że każda wartość wprowadzana do kolumny

TowMag.NrMag musi występować jako wartość klucza głównego

w tabeli Magazyn.

2. Za pomocą create table tworzone są tablice bazowe

(ekstensjonalne), mające fizyczną reprezentację w bazie danych oraz

określamy niektóre warunki spójności bazy dnaych.

3. Tablice wirtualne (intencjonalne), tzw. widoki lub perspektywy (ang.

view) tworzone są za pomocą CREATE VIEW

(c) T. Pankowski, SQL - przegląd

20

Operowanie danymi

Operowanie danymi

Cztery podstawowe operacje:

select

- wyszukiwanie,

insert

- dołączanie,

update

- aktualizacja,

delete

- usuwanie.

Przykłady operacji modyfikujących:

insert into Dostawa

values('10','100',1,'1996.11.26',3)

update Towar

set

CenaSprz = 1.1 * CenaSprz

where GrupaTow = 'AGD'

delete from Towar

whereCenaSprz < CenaZak

background image

(c) T. Pankowski, SQL - przegląd

21

SELECT *

SELECT *

Problemy z SELECT *:

1. Wybiera wszystkie kolumny, ale w jakiej

kolejności? Kolejność kolumn w modelu
relacyjnym nie jest określona. Musimy się
więc odwoływać do poziomu fizycznego
określającego sposób pamiętania tabeli.

2. Jeśli za pomocą SELECT * został

zdefiniowany widok, to co się stanie jeśli do
bazowej tabeli dodam nową kolumnę? Ma
być ona włączana do widoku czy nie?

(c) T. Pankowski, SQL - przegląd

22

Co zadecydowało o sukcesie systemów relacyjnych baz
danych?

I think there are three elements of the System R prototype and its

deployment in test environments that had an effect on the eventual adoption

of relational data storage systems.

(c) T. Pankowski, SQL - przegląd

23

1.
The first one
is the obvious one that everybody suggests: the invention of

a nonprocedural query specification was a tremendous simplification that

made it much easier to specify applications. No longer did you have to say

which index to use and which join method to use to get the job done.

This was a tremendous boon to application development.

(c) T. Pankowski, SQL - przegląd

24

2.
But the real reasons that the relational system won have nothing to do with the

relational model; they have to do with the fact that the early prototypes,

both System R and Ingres, supported ad hoc queries and online data

definition.
You could try out a query right away, rather than typing it into your application,

compiling the application, running it, and having a failure, usually a syntax error.

Even if there were no syntax errors, you still had the advantage that you could

look at the query answers and see if you had the right tuples.
Ad hoc online query execution was something that was unheard of in the

database community at that time, so this was a tremendous boon to

application developers and to people who were browsing the data.

background image

(c) T. Pankowski, SQL - przegląd

25

3.
Maintaining the coherence between the metadata that the system

uses at run time to figure out where things are and which way's up and

which way's down and the actual use of the system.
So a difficult and rather successful effort in the System R project was to figure

out ways to synchronize the modification of metadata without

impacting or interrupting the ongoing work involving other data

objects.

(c) T. Pankowski, SQL - przegląd

26

Operowanie danymi

Operowanie danymi

Operacja wyszukiwania:

select distinct W.NrTow, W.NrMag

from

Dostawa W

where NrDcy = '10' AND Ilosc > 2

distinct - usuwanie duplikatów

select W.NrDcy, D.Nazwa, T.Nazwa, T.CenaSprz

from

Dostawa W, Dostawca D, Towar T

where W.NrDcy = D.NrDcy AND W.NrTow = T.NrTow

Funkcje agreguj

Funkcje agreguj

ą

ą

ce

ce

count, sum, avg, max, min, count(*)

1.

Liczba wszystkich dostawców:

select count(*) as Ld
from Dostawca

2.

Liczba dostawców realizujących dostawy

select count(distinct W.NrDcy) as Ldd
from Dostawa W

bez distinct:

select count(W.NrDcy) AS Ldd
from Dostawa W

Ld

4

Ldd

3

Ldd

5

(c) T. Pankowski, SQL - przegląd

28

Funkcje agreguj

Funkcje agreguj

ą

ą

ce (c.d.)

ce (c.d.)

3. Sumaryczny wartość towaru 100 w cenach zakupu:

select

sum(T.CenaZak * TM.Stan) as W100

from

Towar T, TowMag TM

where

T.NrTow = TM.NrTow AND T.NrTow = '100'

W100

45 000

background image

(c) T. Pankowski, SQL - przegląd

29

Funkcje agreguj

Funkcje agreguj

ą

ą

ce (c.d.)

ce (c.d.)

4.

Wartości towarów w poszczególnych grupach towarowych:

select

T.GrupaTow, sum(T.CenaZak * TM.Stan) as Wartość

from

Towar T, TowMag TM

where

T.NrTow = TM.NrTow

group by T.GrupaTow
having

GrupaTow <> 'AGD'

GrupaTow

Wartość

----------------- --------------

KOM 24 000.00

RTV 45 000.00

select

*

from

Towar T, TowMag TM

where

T.NrTow = TM.NrTow

30

Operacje z wykorzystaniem kursora

Operacje z wykorzystaniem kursora

Kursor (ang. cursor) dostarcza mechanizmu dostępu do pojedynczych

wierszy wg zasady "jeden po drugim".

declare @zmNazwa char(20)
declare @zmCenaSprz Money
declare kurAGD cursor
for select Nazwa, CenaSprz

from Towar
where GrupaTow = 'AGD'

open kurAGD
fetch next from kurAGD into @zmNazwa, @zmCenaSprz
while @@FETCH_STATUS = 0
begin

select @zmNazwa, @zmCenaSprz
fetch next from kurAGD into @zmNazwa, @zmCenaSprz

end
close kurAGD
deallocate kurAGD

(c) T. Pankowski, SQL - przegląd

31

Operacje z wykorzystaniem kursora

Operacje z wykorzystaniem kursora

Aby przetwarzać dane za pomocą kursora należy:
• zadeklarować kursor DECLARE ... CURSOR i zdefiniować jego zakres

FOR SELECT,

• otworzyć kursor, OPEN - wykonywana jest operacja SELECT, kursor

wskazuje na miejsce bezpośrednio przed pierwszym wierszem w

utworzonym zbiorze wierszy (zakresie kursora),

• wykonać operację pobrania danych na kolejnym wierszu FETCH NEXT

FROM, pobierane dane można zapamiętać pod podanymi zmiennymi,

• pobieranie danych może być realizowane w pętli, różna od zera wartość

zmiennej (funkcji) globalnej @@FETCH_STATUS może kończyć

wykonywanie operacji pobierania danych,

• zmienne mogą być wykorzystywane w dowolnych operacjach,

wyrażenie SELECT @zmNazwa, @zmCenaSprz oznacza wypisanie

danych,

• w końcu kursor należy zamknąć CLOSE i dealokować DEALLOCATE.

(c) T. Pankowski, SQL - przegląd

32

Operacje pozycyjne: UPDATE i DELETE

Operacje pozycyjne: UPDATE i DELETE

declare @zmNazwa char(20)
declare @zmCenaSprz money
declare kurAGD cursor

for select Nazwa, CenaSprz

from Towar
where GrupaTow = 'AGD'

open kurAGD
fetch next from kurAGD into @zmNazwa, @zmCenaSprz
while @@FETCH_STATUS = 0
begin

select @zmNazwa, @zmCenaSprz

update Towar set CenaSprz = CenaSprz + 1 where current of kurAGD

fetch next from kurAGD into @zmNazwa, @zmCenaSprz

end
close kurAGD
deallocate kurAGD

background image

(c) T. Pankowski, SQL - przegląd

33

Widoki (

Widoki (

views

views

)

)

• Widoki są tabelami wirtualnymi (intencjonalnymi), nie mającymi

bezpośredniej reprezentacji w bazie danych. Zapamiętana jest jedynie

ich definicja.

• Definicja widoku wykorzystywana jest w momencie odwoływania się

do niego jak do każdej innej tabeli.

(c) T. Pankowski, SQL - przegląd

34

Widoki (

Widoki (

views

views

)

)

"Towary RTV w cenach sprzedaży "

create view RTV (NrTow, Nazwa, CenaSprz)

as select T.NrTow, T.Nazwa, T.CenaSprz

from Towar T

where T.GrupaTow = 'RTV‘

Definicja widoku wykorzystywana jest w momencie odwoływania się do

niego:

select

RTV.NrTow, RTV.Nazwa, RTV.CenaSprz

from

RTV

where

RTV.CenaSprz < 2000

Przekształcone jest do zapytania względem tabeli TOWAR:

select

RTV.NrTow, RTV.Nazwa, RTV.CenaSprz

from (select T.NrTow, T.Nazwa, T.CenaSprz

from Towar T

where T.GrupaTow = 'RTV' ) RTV

where RTV.CenaSprz < 2000

lub równoważnie:

select

T.NrTow, T.Nazwa, T.CenaSprz

from

Towar T

where

T.GrupaTow = 'RTV' and T.CenaSprz < 2000

(c) T. Pankowski, SQL - przegląd

35

Modyfikowalno

Modyfikowalno

ść

ść

widok

widok

ó

ó

w

w

1. Jeśli widok jest tak zdefiniowany, że można

przetransformować operacje jego modyfikowania na

modyfikację tabel bazowych, to można go aktualizować.

2. Sytuacja taka występuje na przykład wtedy, gdy w

definicji kursora zawarto klucz główny tabel bazowych,

nad którymi jest definiowany i nie zawiera funkcji

agregujących ani słowa DISTINCT.

(c) T. Pankowski, SQL - przegląd

36

Modyfikowalno

Modyfikowalno

ść

ść

widok

widok

ó

ó

w (c.d.)

w (c.d.)

W przypadku widoku RTV, jego definicja

create view RTV (NrTow, Nazwa, CenaSprz)
as

select T.NrTow, T.Nazwa, T.CenaSprz
from

Towar T

where T.GrupaTow = 'RTV'

zawiera klucz główny tabeli Towar. Można go więc modyfikować.
Wówczas polecenie:

update RTV
set CenaSprz = CenaSprz + 10

zostanie wykonane i spowoduje odpowiednią modyfikację tabeli Towar.

background image

(c) T. Pankowski, SQL - przegląd

37

Modyfikowalno

Modyfikowalno

ść

ść

widok

widok

ó

ó

w (c.d.)

w (c.d.)

Bardzo często widoki są niemodyfikowalne.
Przykłady niemodyfikowalnych widoków:

1. Widok zawierający łączną ilość poszczególnych towarów we

wszystkich dostawach:

create view TD(NrTow, IlDost)
as select W.NrTow, SUM(W.Ilosc)

from Dostawa W
group by W.NrTow

Widok jest niemodyfikowalny, gdyż zawiera funkcję agregującą.

(c) T. Pankowski, SQL - przegląd

38

Modyfikowalno

Modyfikowalno

ść

ść

widok

widok

ó

ó

w (c.d.)

w (c.d.)

2. Widok Miasta definiuje pary (DAdres, MAdres), gdzie DAdres jest

adresem dostawcy, a MAdres jest adresem magazynu, do którego
dostawca dostarcza towary:

create view Miasta (DAdres, MAdres)
as select distinct D.Adres, M.Adres

from Dostawca D, Magazyn M, Dostawa W
where D.NrDcy = W.NrDcy and M.NrMag = W.NrMag

Widok ten jest niemodyfikowalny, gdyż zawiera słowo distinct.

39

Modyfikowalno

Modyfikowalno

ść

ść

widok

widok

ó

ó

w (c.d.)

w (c.d.)

Rozważmy widok jak poprzednio, ale bez słowa distinct:

create view Miasta1 (DAdres, MAdres)

as select D.Adres, M.Adres

from Dostawca D, Magazyn M, Dostawa W

where D.NrDcy = W.NrDcy and M.NrMag = W.NrMag

Modyfikowalno

Modyfikowalno

ść

ść

widok

widok

ó

ó

w (c.d.)

w (c.d.)

update Miasta1

set DAdres = 'Kraków'

where DAdres = 'Poznań'

Miasta1

Dostawca

Widok Miasta1 jest modyfikowalny, gdyż zawarte w jego definicji warunki na kluczach głównych
pozwalają dokonać odpowiednich modyfikacji na wyjściowych tabelach

background image

(c) T. Pankowski, SQL - przegląd

41

Bezpiecze

Bezpiecze

ń

ń

stwo baz danych

stwo baz danych

1.

Mechanizmy zapewnienia bezpieczeństwa:

uwierzytelnianie i autoryzacja:
(nazwa logowania, hasło)

użytkownik bazy danych

uprawnienia

operacje GRANT/REVOKE/DENY – przyznawanie,

odbieranie, odmawiane uprawnień,

wykorzystanie widoków (selektywne udostępnianie

danych),

warunki spójności bazy danych

archiwowanie i odtwarzanie

(c) T. Pankowski, SQL - przegląd

42

Bezpiecze

Bezpiecze

ń

ń

stwo baz danych (c.d.)

stwo baz danych (c.d.)

Przykład pokazuje, w jaki sposób tworzy się nowego użytkownika i nową rolę w systemie
SQL Server oraz w jaki sposób dodaje się użytkownika do istniejącej roli.

1.

Tworzenie nowego konta logowania do systemu MS SQL Server umożliwiającego

użytkownikowi przyłączenie się do serwera:

EXEC sp_addlogin 'Piotr', 'piotr', ‘sklep'

'Piotr' jest nazwą użytkownika, 'piotr' jest hasłem, a ‘sklep' bazą danych.

2.

Tworzenie nowego użytkownika (w tym przypadku nazwa użytkownika jest

identyczna z nazwą konta logowania):

EXEC sp_adduser 'Piotr', 'Piotr'

3.

Tworzenie nowej roli:

EXEC sp_addrole 'Klient'

4.

Dodanie użytkownika do roli:

EXEC sp_addrolemember 'Klient', 'Piotr'

5.

Zdefiniowanie uprawnień:

grant SELECT on Pracownik to Klient
deny SELECT on Pracownik to Piotr

6.

Odczytanie informacji o kontach logowania, użytkownikach i rolach (dostępne po

ponownym uruchomieniu SQL Servera):

sp_helplogins
sp_helpuser
sp_helprole

(c) T. Pankowski, SQL - przegląd

43

Sp

Sp

ó

ó

jno

jno

ść

ść

bazy danych

bazy danych

1.

Spójność, niesprzeczność, integralność (ang. consistency, integrity
constraints
).

2.

Spójność oznacza poprawność, niesprzeczność danych w bazie
danych. Standard SQL zawiera środki do definiowania warunków
spójności
(lub więzów integralności), np. w obrębie zdania CREATE
TABLE.

3.

Każda próba naruszenia zdefiniowanych warunków spójności
(podczas modyfikacji bazy danych) zostaje udaremniona, operacja
ją podejmująca jest odrzucana, a baza danych pozostaje nie
zmieniona.

4.

W systemie pamiętana jest więc baza danych (dane podstawowe)
oraz wiedza o bazie danych (dane opisujące struktury i warunki
spójności).

(c) T. Pankowski, SQL - przegląd

44

Rodzaje warunk

Rodzaje warunk

ó

ó

w sp

w sp

ó

ó

jno

jno

ś

ś

ci

ci

1.

Typ kolumny – typ może być standardowy lub pochodny zdefiniowany

przez użytkownika.

2.

UNIQUE – dla określenia, że kolumna lub zestaw kolumn ma mieć

unikalną wartość w tabeli (jest kluczem potencjalnym - alternatywnym,

kandydującym – w tabeli), taki klucz może przyjmować wartości NULL.

3.

PRIMARY KEY – specjalny przypadek UNIQUE dla zdefiniowania

klucza głównego – nie może przyjmować wartości NULL.

4.

FOREIGN KEY - dla zdefiniowania zależności referencyjnych

(zależności odniesień). Wartość klucza obcego musi występować jako

wartość klucza w powoływanej tabeli.

5.

CHECK - dla określenia, że kolumna lub zestaw kolumn (z jednej krotki)

mają mieć wartości spełniające określony warunek. Taka spójność

może być zdefiniowane jako reguła w wyrażeniu CREATE RULE.

6.

Bardziej złożone warunki spójności można definiować za pomocą

procedur wyzwalanych w wyrażeniach CREATE TRIGGER. Procedury

te są automatycznie wyzwalane przy aktualizacji tabeli.

background image

(c) T. Pankowski, SQL - przegląd

45

Programowanie SQL

Programowanie SQL

Servera

Servera

¾ Dla wykonywania obliczeń, których nie można wyrazić za pomocą

pojedynczego wyrażenia w języku Transact-SQL (T-SQL), stosuje

się:

• systemowe procedury pamiętane (

system stored procedures

),

• paczki (wsady) (

batches

) i skrypty (

scripts

),

• funkcje (

functions

),

• procedury pamiętane (składowane) (

stored procedures

),

• procedury wyzwalane (trigery) (

triggers

),

• kursory (

cursors

).

(c) T. Pankowski, SQL - przegląd

46

Systemowe procedury pami

Systemowe procedury pami

ę

ę

tane

tane

¾

Nazwy wszystkich systemowych procedur pamiętanych rozpoczynaj

ą

si

ę od „sp_” lub „xp_”.

¾

Systemowe procedury pami

ętana są prekompilowanymi zbiorami

wyra

żeń SQL-owych („sp_”) lub języka programowanie („xp_”).

¾

Procedury typu „xp_” (extended stored procedures) s

ą to funkcje

zdefiniowane w bibliotekach do

łączanych dynamicznie (bibliotekach

DLL) i s

łużą do rozszerzenia funkcji SQL Servera. Aby zainstalować

tak

ą procedurę należy najpierw skopiować plik DLL do katalogu

zawieraj

ącego SQL Server – najczęścij jest to C:\Mssql\Binn, a

nast

ępnie wykonać systemową procedurę pamiętaną

sp_addextendedproc.

(c) T. Pankowski, SQL - przegląd

47

Systemowe procedury pami

Systemowe procedury pami

ę

ę

tane

tane

-

-

przyk

przyk

ł

ł

ady

ady

¾

Tworzenie typu PESEL opartego na standardowym typie danych varchar. Typ

nie może przyjmować wartości NULL, varchar(11) jest ujęte w apostrofy, gdyż

zawiera nawiasy:

USE master
EXEC sp_addtype PESEL, 'VARCHAR(11)', 'NOT NULL‘
¾

Odczytanie tekstu procedury wyzwalanej employee_insupd zawartej w bazie

danych pubs:

USE pubs
EXEC sp_helptext 'employee_insupd'
¾

Wykonanie prostego wyrażenia SELECT zawierającego wbudowany parametr

@level:

execute sp_executesql
N'select * from pubs.dbo.employee where job_lvl = @level',
N'@level tinyint',
@level = 35

48

Systemowe procedury pami

Systemowe procedury pami

ę

ę

tane

tane

-

-

przyk

przyk

ł

ł

ady

ady

¾

Dodanie rozszerzonej procedury pamiętanej:

USE master
EXEC sp_addextendedproc xp_hello, 'xp_hello.dll'

¾

Wykonuje podaną komendę systemu operacyjnego i zwraca wyjście jako zbiór

wierszy tekstowych:

xp_cmdshell 'dir *.exe'

¾

Tworzenie wyrażenia INSERT:

DECLARE @ret_string varchar (255)
EXEC xp_sprintf @ret_string OUTPUT,
'INSERT INTO %s VALUES (%s, %s)', 'table1', '1', '2'
PRINT @ret_string
Wynik:
INSERT INTO table1 VALUES (1, 2)

background image

(c) T. Pankowski, SQL - przegląd

49

Paczki (

Paczki (

batches

batches

)

)

• Paczka stanowi grupę złożoną z jednej lub z wielu wyrażeń

Transact-SQLa. Standardowym końcem paczki jest polecenie GO

lub koniec pliku. Paczkę może też stanowić grupa „podświetlonych”

wyrażeń (przy korzystaniu z

Query Analysera

).

• SQL Server kompiluje paczkę w pojedynczą jednostkę wykonywalną

zwaną planem wykonania (

execution plan

).

• Wyrażenia tworzące plan wykonania wykonywane są jednorazowo

w jednym czasie. W przypadku wystąpienia błędu kompilacji, żadne

z wyrażeń w paczce nie zostanie wykonane.

• Zmienna zdefiniowana w paczce nie jest dostępna poza nią –

zmienne są lokalne w paczce.

• Nie wszystkie wyrażenia mogą występować w jednej paczce (np.

definiowanie i wywoływanie procedury).

(c) T. Pankowski, SQL - przegląd

50

Paczki i skrypty

Paczki i skrypty

¾ Przykład skryptu złożonego z dwóch paczek:

USE sklep
GO

-- wykonanie paczki, wybór bazy danych sklep

DECLARE @Powitanie VARCHAR(50)
SET @Powitanie = 'Witaj w sklepie!'
print @Powitanie
GO -- wykonanie paczki,
-- zmienna @Powitanie po GO nie jest już dostępna.

(c) T. Pankowski, SQL - przegląd

51

Funkcje

Funkcje

¾ Rodzaje funkcji:
• funkcje skalarne (

scalar user-defined functions

) – zwracaną

wartością jest pojedyncza liczba lub tekst, tj. wartość dowolnego

typu z wyjątkiem typów: text, ntext i image;

• proste funkcje tablicowe (

inline table-valued functions

) – zwracają

wartość typu TABLE, przy czym zwracana tabela jest określona za

pomocą pojedynczego wyrażenia SELECT (funkcje te nazywane są

sparametryzowanymi widokami);

• złożone funkcje tablicowe (

multi-statement table-valued functions

) –

zwracają zmienną typu TABLE, przy czym zwracana tabela jest

dowolną tabelą utworzoną w ciele funkcji.

(c) T. Pankowski, SQL - przegląd

52

Funkcje skalarne

Funkcje skalarne

Funkcja zwraca największy numer pracownika z podanego działu:

CREATE FUNCTION ostatni_prac_dzialu (@id int)
RETURNS int
BEGIN

declare @nr int
set @nr = (select max(IdPrac) from pracownik

where IdDzialu=@id)

RETURN @nr

END

Wykorzystanie funkcji:

select * from pracownik
where IdPrac = dbo.ostatni_prac_dzialu(1)

background image

(c) T. Pankowski, SQL - przegląd

53

Proste funkcje tablicowe

Proste funkcje tablicowe

Funkcja zwraca zbiór pracowników z działu o podanym identyfikatorze:

create function prac_dzialu(@id int)
RETURNS TABLE
as
RETURN(select * from pracownik where IdDzialu=@id)
go

Wykorzystanie funkcji (wywołanie funkcji występuje w roli tabeli):

select * from dbo.prac_dzialu(2)

lub bez dbo

select * from prac_dzialu(2)

(c) T. Pankowski, SQL - przegląd

54

Z

Z

ł

ł

o

o

ż

ż

one funkcje tablicowe

one funkcje tablicowe

Funkcja zwraca listę dobrze zarabiających pracowników:
create function krezus(@z int)
RETURNS @lista table (id int PRIMARY KEY,

nazwisko varchar(22), dochod int)

as
begin

if @z > 5000
insert @lista select id_prac,nazwisko,zarobki

from pracownik1 where zarobki > @z
RETURN
end

Wykorzystanie funkcji:

select * from krezus(5500)
select * from krezus(1000) –- tabela pusta

Procedury pami

Procedury pami

ę

ę

tane

tane

Procedura oblicza dochód w podanym okresie:

CREATE PROC dochod

@idprac int,
@czas int,
@wynik int OUTPUT -- parametr wyjsciowy

as
select @wynik = (pensja + premia)*@czas
from pracownik where IdPrac = @idprac
go

Wywołanie:

declare @c int, @w int
select @c = 12
exec dochod 1,@c,@w output
select
cast(@c as varchar(4))+' miesiecy' as [dochod za okres],
cast(@w as varchar(11))+' zl' as wynosi
go

Wynik:

dochod za okres

wynosi

-------------------- --------
12 miesiecy

14400 zl

(c) T. Pankowski, SQL - przegląd

56

Procedury wyzwalane (

Procedury wyzwalane (

trigery

trigery

)

)

¾

Procedury wyzwalane (triggery):

• rozszerzają możliwości definiowania warunków spójności,
• wywoływane są automatycznie w wyniku wykonania operacji:

INSERT, UPDATE lub DELETE,

• może specyfikować operację, która wykona się zamiast operacji

głównej – wariant INSTEAD OF,

• wykorzystują systemowe tabele INSERTED i/lub DELETED

(INSERTED zawiera dołączane krotki lub nową wersję krotek

zmienianych; DELETED zawiera usuwane krotki lub starą wersję

krotek zmienianych),

• mogą być przypisane do tabeli lub widoku,
• mogą być wywoływane rekurencyjnie.

background image

(c) T. Pankowski, SQL - przegląd

57

Procedury wyzwalane

Procedury wyzwalane

-

-

przyk

przyk

ł

ł

ad

ad

Zakaz dopisania pracownika, który zarabia więcej niż jego kierownik:

create trigger maks
on pracownik
for insert as
if (select zarobki from inserted) >

(select k.zarobki from pracownik k, inserted i

where k.IdPrac = i.IdKier)

begin

rollback

end

58

Procedury wyzwalane

Procedury wyzwalane

INSTEAD OF

INSTEAD OF

Trigger zaznacza w kolumnie del elementy przeznaczone do usunięcia:

create trigger zaznacz

on Pracownik

INSTEAD OF delete as

update Pracownik

set del='*'

where nazwisko in (select nazwisko from deleted)

go

delete from Pracownik

where nazwisko like 'K%‘

Wynik:

nazwisko

premia

del

-------------------- ----------- ----

Kowalski 200 *

Lipski

200 NULL

Kowal

200 *

Pawlak

200 NULL

59

Kursory

Kursory

Składnia SQL-92:

DECLARE

nazwa_kursora

[INSENSITIVE] [SCROLL] CURSOR

FOR

wyra

ż

enie_select

[FOR {READ ONLY | UPDATE [OF

nazwa_kolumny

[,...

n

]]}]

Składnia Transact-SQL:

DECLARE

nazwa_kursora

CURSOR

[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR

wyra

ż

enie_select

[FOR UPDATE [OF

nazwa_kolumny

[,...

n

]]]

60

Kursory

Kursory

Kursor (ang. cursor) dostarcza mechanizmu dostępu do pojedynczych

wierszy wg zasady "jeden po drugim".

declare @zmNazwa char(20)
declare @zmCenaSprz Money
declare kurAGD cursor
for select Nazwa, CenaSprz

from Towar
where GrupaTow = 'AGD'

open kurAGD
fetch next from kurAGD into @zmNazwa, @zmCenaSprz
while @@FETCH_STATUS = 0
begin

select @zmNazwa, @zmCenaSprz
fetch next from kurAGD into @zmNazwa, @zmCenaSprz

end
close kurAGD
deallocate kurAGD

background image

(c) T. Pankowski, SQL - przegląd

61

Kursory (c.d.)

Kursory (c.d.)

Aby przetwarzać dane za pomocą kursora należy:
• zadeklarować kursor DECLARE ... CURSOR i zdefiniować jego zakres

FOR SELECT,

• otworzyć kursor, OPEN - wykonywana jest operacja SELECT, kursor

wskazuje na miejsce bezpośrednio przed pierwszym wierszem w

utworzonym zbiorze wierszy (zakresie kursora),

• wykonać operację pobrania danych na kolejnym wierszu FETCH NEXT

FROM, pobierane dane można zapamiętać pod podanymi zmiennymi,

• pobieranie danych może być realizowane w pętli, różna od zera wartość

zmiennej (funkcji) globalnej @@FETCH_STATUS może kończyć

wykonywanie operacji pobierania danych,

• zmienne mogą być wykorzystywane w dowolnych operacjach,

wyrażenie SELECT @zmNazwa, @zmCenaSprz oznacza wypisanie

danych,

• w końcu kursor należy zamknąć CLOSE i dealokować DEALLOCATE.

(c) T. Pankowski, SQL - przegląd

62

Kursory a ADO

Kursory a ADO

Recordset

Recordset

¾

Obiekt Recordset representuje zbiór rekordów z tabeli bazowej lub

wynik wykonania polecenia. W każdej chwili czasu obiekt Recordset

wskazuje jeden rekord w zbiorze zwany rekordem bieżącym.

¾

Tworzenie nowego obiektu Recordset:

Set Klient = New ADODB.Recordset
Set Klient.ActiveConnection = db

If Len(StanUSA.Text) = 0 Then

Klient.Source = "Select CustomerId, Name, State From

Customers"

Else

Klient.Source = "Select CustomerId,Name,State From

Customers Where State = '" _

& StanUSA.Text & "'"

End If

(c) T. Pankowski, SQL - przegląd

63

Kursory a ADO

Kursory a ADO

Recordset

Recordset


Wyszukiwarka

Podobne podstrony:

więcej podobnych podstron