background image

Bazy danych – wykład trzeci

Konrad Zdanowski

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL - przypomnienie

Podstawowa forma kwerendy SQL:

s e l e c t A1 ,

. . . , Ak

from R1 ,

. . . , Rn

where <warunek > ;

Odpowiada jej w algebrze relacji operacja
π

A1,...,Ak

(σ

<warunek>

(

R1 × · · · × Rn))

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – semantyka

s e l e c t R . A , T . B from R, T where <warunek > ;

Tak ˛

a kwerend ˛e mo˙zna zrealizowa´c nast ˛epuj ˛

aco:

1

Utwór˙z iloczyn kartezja ´nski R × T ,

2

Wypisz pary atrybutów z tych wierszy R × T , które
spełniaj ˛

a <warunek>.

albo

for all ∈ do

for all t

0

∈ do

if tt

0

spełniaj ˛

a <warunek>

then

print t.A,t’.B

end if

end for

end for

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – semantyka

Je´sli jedna z tablic wymienionych po “

from” jest pusta, to

iloczyn kartezja ´nski R × T b ˛edzie pusty.

W takim przypadku zapytanie nie zwróci ˙zadnych krotek.

Niech R(AB)T (CD) tabele takie, ˙ze T jest pusta.

s e l e c t A , B from R ;

zwróci nam tabel ˛e R.

s e l e c t A , B from R, T ;

nie zwróci ˙zadnej krotki.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – semantyka

Domy´slnie tabele w bazie danych to zbiory. Nie mo˙zna
trzyma´c w jednej tabeli dwóch krotek o tych samych
warto´sciach wszystkich atrybutów.

W wyniku zapytania mog ˛

a zosta´c zwrócone wielozbiory.

Dzi ˛eki temu w nie tracimy informacji (nawet je´sli jest ona
nam niepotrzebna).

Przykład. Osoby (imienazwiskoid ). Zapytanie

s e l e c t count ( i m i e )

from Osoby as o
where o . i m i e = ’Ewa ’ ;

zwraca liczb ˛e osób o imieniu Ewa.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – semantyka

Je´sli chcemy usun ˛

a´c powtarzaj ˛

ace si ˛e krotki mo˙zemy u˙zy´c

s e l e c t d i s t i n c t i m i e , nazwisko

from Osoby ;

Taka operacja wymaga posortowania wyniku. Usuni ˛ecie
powtórze ´n mo˙ze by´c kosztowniejsze ni˙z obliczenie
zapytania.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – operacje teoriomnogo´sciowe

Przy pomocy

unionintersectexcept mo˙zemy obliczy´c

sum ˛e, cz ˛e´s´c wspóln ˛

a (przeci ˛ecie) oraz ró˙znic ˛e dwóch

tabel.

Operacje te domy´slnie usuwaj ˛

a duplikaty krotek!

Aby zachowa´c duplikaty trzeba u˙zy´c słowa kluczowego

all.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – operacje teoriomnogo´sciowe

Rozwa˙zmy tabel ˛e GRAF(poczatek, koniec)

POCZATEK

KONIEC

1

2

2

3

3

4

4

5

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – operacje teoriomnogo´sciowe

Rozwa˙zmy

s e l e c t poczatek , k o n i e c

from g r a f
union

s e l e c t poczatek , poczatek

from g r a f ;

Wyniki:

POCZATEK

KONIEC

1

1

1

2

2

2

2

3

3

3

3

4

4

4

4

5

Wyniki s ˛

a posortowane.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – operacje teoriomnogo´sciowe

Rozwa˙zmy

s e l e c t poczatek , k o n i e c

from g r a f
union a l l

s e l e c t poczatek , poczatek

from g r a f ;

Wyniki:

POCZATEK

KONIEC

1

2

2

3

3

4

4

5

1

1

2

2

3

3

4

4

Zauwa˙zmy, ˙ze w tym przypadku wyniki s ˛

a nieposortowane.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – operacje teoriomnogo´sciowe

Zapytania

s e l e c t poczatek

from g r a f ;

s e l e c t poczatek

from g r a f
union

s e l e c t poczatek

from g r a f ;

s e l e c t poczatek

from g r a f
union a l l

s e l e c t poczatek

from g r a f ;

mog ˛

a zwróci´c inne wyniki!

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – operacje teoriomnogo´sciowe

Oracle 11g stosuje

minus zamiast except.

Oracle 11g nie implementuje

intersect all oraz minus all.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zł ˛

aczenia

Operacj ˛e ł ˛

aczenia z algebry relacji mo˙zemy wykona´c przy

u˙zyciu

join.

Iloczyn kartezja ´nski dwóch tabel R × T otrzymamy za
pomoc ˛

a R

cross join T .

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zł ˛

aczenia

Je´sli chcemy ograniczy´c krotki w zł ˛

aczeniu do spełniaj ˛

acych

pewien warunek mo˙zemy napisa´c:

Zapytanie:

s e l e c t 

from g r a f g j o i n g r a f t

on g . k o n i e c = t . poczatek ;

Wynik:

POCZATEK

KONIEC

POCZATEK1

KONIEC1

1

2

2

3

2

3

3

4

3

4

4

5

Otrzymali´smy tylko te krotki, które spełniaj ˛

a warunek po

on.

Z grafów g i t “zgineły” krotki!

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zł ˛

aczenia

Mo˙zemy zachowa´c wszystkie zaginione krotki.

Zapytanie:

s e l e c t 

from g r a f g f u l l outer j o i n g r a f t

on g . k o n i e c = t . poczatek ;

Wynik:

POCZATEK

KONIEC

POCZATEK1

KONIEC1

(null)

(null)

1

2

1

2

2

3

2

3

3

4

3

4

4

5

4

5

(null)

(null)

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zł ˛

aczenia

Mo˙zemy zachowa´c zaginione (wisz ˛

ace) krotki z grafu g.

Zapytanie:

s e l e c t 

from g r a f g l e f t outer j o i n g r a f t

on g . k o n i e c = t . poczatek ;

Wynik:

POCZATEK

KONIEC

POCZATEK1

KONIEC1

1

2

2

3

2

3

3

4

3

4

4

5

4

5

(null)

(null)

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zł ˛

aczenia

Mo˙zemy zachowa´c wisz ˛

ace krotki z grafu t.

Zapytanie:

s e l e c t 

from g r a f g r i g h t outer j o i n g r a f t

on g . k o n i e c = t . poczatek ;

Wynik:

POCZATEK

KONIEC

POCZATEK1

KONIEC1

1

2

2

3

2

3

3

4

3

4

4

5

(null)

(null)

1

2

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zł ˛

aczenia

Niech tabela graf posiada dwa wiersze (1null) oraz (null2).
Zapytanie

s e l e c t 

from g r a f g j o i n g r a f t

on g . k o n i e c = t . poczatek ;

nie zwróci ˙zadnej krotki.

Warto´s´c porównania null = null nie jest zdefiniowana.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – podzapytania

Po słowach

fromwhere mo˙ze wyst ˛

api´c nowe zapytanie.

s e l e c t poczatek , k o n i e c

from g r a f g
where ( g . poczatek ∗2 , g . k o n i e c +2) i n

(

s e l e c t ∗ from g r a f ) ;

To zapytanie zwróci nam jedn ˛

a krotk˛e (23).

Po

where nie mo˙zemy u˙zy´c samej tabeli. Napisanie

where ( g . poczatek ∗2 , g . k o n i e c +2) i n ( g r a f )

byłoby niepoprawne składniowo (Oracle).

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – podzapytania

W warunkach wykorzystuj ˛

acych relacje R i krotk˛e s

mo˙zemy u˙zywa´c:

1

EXISTS R,

2

s

in R,

3

s > ALL R,

4

s > ANY R,

5

s<> ALL R.

Wyra˙zenia mo˙zemy poprzedza´c negacj ˛

a, np. NOT EXISTS

R.
Pewne wyra˙zenia s ˛

a równowa˙zne:

1

s = ANY R jest równowa˙zne s

in R,

2

NOT s > ALL S jest równowa˙zne s <= ANY R.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – podzapytania

Je´sli wiemy, ˙ze zapytanie zwróci tylko jedn ˛

a warto´s´c,

mo˙zemy u˙zy´c jego wyniku do porównania:

where n = ( s e l e c t numer

from R, T
where R . numer = T . i d

)

Podobnie, mo˙zemy porówna´c całe krotki

where ( n , k o l o r ) = ( s e l e c t R . numer , T . k o l o r

from R, T
where R . numer = T . i d

)

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – podzapytania skorelowane

Wyniki pewnych podzapyta ´n zale˙z ˛

a od aktualnie

testowanych krotek na zewn ˛

atrz danego podzapytania.

Wtedy trzeba oblicza´c je za ka˙zdym przypisaniem warto´sci
tym krotkom.

Przykład. Tabela Filmy(tytul, rok, dlugosc).

s e l e c t t y t u l

from f i l m y s t a r y
where r o k < ANY

(

s e l e c t r o k

from f i l m y

where t y t u l = s t a r y . t y t u l

) ;

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – agregowanie

W SQL mo˙zemy oblicza´c warto´sci dla wszystkich wierszy
w tabeli.

Dost ˛epne funkcje: SUM(A), AVG(A), MIN(A), MAX(A),
COUNT(*), COUNT(DISTINCT A).

Ich argumetny mog ˛

a by´c wyra˙zeniami, np. SUM(A ∗ 2).

Przykład Filmy(tytul, rok, dlugosc).

s e l e c t count d i s t i n c t t y t u l )

from F i l m y ;

s e l e c t sum( d l u g o s c )

from F i l m y
where r o k =2010;

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – agregowanie

Je´sli chcemy obliczy´c warto´s´c funkcji agreguj ˛

acej

oddzielnie dla ró˙znych grupi wyniku u˙zywamy

group by.

Przykład Filmy(tytul, rok, rezyser, dlugosc).

s e l e c t sum( d l u g o s c )

from F i l m y
group by r o k ;

s e l e c t

rok , r e z y s e r ,

sum( d l u g o s c )

from F i l m y
group by rok , r e z y s e r ;

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – agregowanie

Mo˙zemy te˙z ograniczy´c wynik zapytania u˙zywaj ˛

ac funkcji

agreguj ˛

acej:

having.

Przykład Filmy(tytul, rok, rezyser, dlugosc).
Je´sli interesuje nas długo´s´c filmów, wyprodukowanych przez
re˙zyserów, którzy zaczeli pracowa´c po roku 2000 napiszemy:

s e l e c t r e z y s e r , sum( d l u g o s c )

from F i l m y
group by r e z y s e r
having min ( r o k ) >=2000;

Albo sami re˙zyserzy:

s e l e c t

r e z y s e r

from F i l m y
group by r e z y s e r
having min ( r o k ) >=2000;

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – perspektywy

SQL daje nam mo˙zliwo´s´c tworzenia perspektyw.

Perspektywy nie s ˛

a przechowywane jako oddzielne tabele

w bazie danych.

Mo˙zemy je interpretowa´c jako skróty dla zapyta ´n, które je
definiuj ˛

a - w zapytaniu perspektywa zamieniana jest na

podzapytanie SQL.

Mo˙zemy korzysta´c z perspektyw w zapytaniach jak z tabel
ale ich warto´s´c jest za ka˙zdym razem obliczalna.

Zapewniaj ˛

a lepsz ˛

a izolacj ˛e danych i czytelno´s´c zapyta ´n.

cr ea te view s t o p i e n _ w i e r z c h o l k a as

s e l e c t poczatek w i e r z c h o l e k , count ( ∗ ) s t o p i e n

from g r a f
group by poczatek ;

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – perspektywy

W poprzednim przykładzie tracili´smy wierchołki o stopniu
wychodz ˛

acym 0 ale raczej nie chcemy te˙z, ˙zeby obliczenie

perspektywy trwało długo.

cr ea te view s t o p i e n _ w i e r z c h o l k a as

s e l e c t poczatek w i e r z c h o l e k , count ( ∗ ) s t o p i e n

from g r a f
group by poczatek
union a l l

s e l e c t

k o n i e c w i e r z c h o l e k , 0 s t o p i e n

from g r a f
where g r a f . k o n i e c not i n

(

s e l e c t poczatek from g r a f ) ;

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – perspektywy

Je´sli perspektywa jest utworzona z jednej tabeli (lub
perspektywy) i wykorzystane w niej atrybuty mo˙zna
uzupełni´c warto´sciami domy´slnymi do pełnego wiersza
wyj´sciowej tabeli do do perspektywy mo˙zemy wstawia´c
krotki.

Wynikiem jest wtedy wstawienie krotek do wyj´sciowej
tabeli.

Usuni ˛ecie krotki z perspektywy (je´sli jest to mo˙zliwe)
skutkuje usuni ˛eciem

wszystkich pasuj ˛

acych do niej krotek

z tabeli.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – definiowanie relacji w zapytaniu

Potrzebn ˛

a nam relacj ˛e mo˙zemy zdefiniowa´c te˙z przed

wła´sciwym zapytaniem.

Słu˙zy do tego konstrukcja

with R( A1 ,

. . . , Ak )

as

(

s e l e c t

. . . .

)

s e l e c t

. . . .

from R,

. . .

where . . . . ;

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – definiowanie relacji w zapytaniu

Rozwa˙zmy tabel ˛e GRAF(poczatek, koniec)

POCZATEK

KONIEC

1

2

2

3

3

4

4

5

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – definiowanie relacji w zapytaniu

with GrafOdwrotny ( poczatek , k o n i e c ) as

(

s e l e c t koniec , poczatek from g r a f
)

s e l e c t go . poczatek , g . k o n i e c

from g r a f g , GrafOdwrotny go
where go . k o n i e c = g . poczatek ;

POCZATEK

KONIEC

2

2

3

3

4

4

5

5

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zapytania rekurencyjne

Chcemy obliczy´c tranzytywne domkni ˛ecie relacji GRAF,
czyli relacj ˛e osi ˛

agalno´sci.

Obliczenie par wierzchołków (p,k) takich, ˙ze z p mo˙zna
osi ˛

agn ˛

a´c k w

dwóch krokach:

s e l e c t g1 . poczatek , g2 . k o n i e c

from g r a f g1 , g r a f g2
where g1 . k o n i e c = g2 . poczatek ;

Obliczenie par wierzchołków (p,k) takich, ˙ze z p mo˙zna
osi ˛

agn ˛

a´c k w

trzech krokach:

s e l e c t g1 . poczatek , g3 . k o n i e c

from g r a f g1 , g r a f g2 , g r a f g3
where g1 . k o n i e c = g2 . poczatek and

g2 . k o n i e c = g3 . poczatek ;

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zapytania rekurencyjne

with t r a n s _ g r a f ( poczatek , k o n i e c ) as

(

s e l e c t poczatek , k o n i e c

from g r a f
union a l l

s e l e c t t 1 . poczatek , g . k o n i e c

from t r a n s _ g r a f t1 , g r a f g
where t 1 . k o n i e c = g . poczatek

)

s e l e c t 

from t r a n s _ g r a f

order by poczatek , k o n i e c ;

Uwaga. Relacja trans_graf pojawia si ˛e po from w jednym z
członów sumy, która j ˛

a sam ˛

a definiuje.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zapytania rekurencyjne

Wyniki zapytania:

POCZATEK

KONIEC

1

2

1

3

1

4

1

5

2

3

2

4

2

5

3

4

3

5

4

5

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zapytania rekurencyjne

Silnik bazy danych Oracle sprawdza czy obliczenie
zapytania nie doprowadzi do niesko ´nczonej p ˛etli.
W powy˙zszym przykładzie zapytanie

with t r a n s _ g r a f ( poczatek , k o n i e c ) as

(

s e l e c t poczatek , k o n i e c

from g r a f
union a l l

s e l e c t t 1 . poczatek , g . k o n i e c

from t r a n s _ g r a f t1 , t r a n s _ g r a f t 2
where t 1 . k o n i e c = t 2 . poczatek

)

s e l e c t 

from t r a n s _ g r a f

order by poczatek , k o n i e c ;

nie zwróciłoby wyniku.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – zapytania rekurencyjne

Podobnie doło˙zenie kraw ˛edzi (11) do grafu sprawia, ˙ze
Oracle “rozpoznaje” p ˛etle podczas obliczania odpowiedzi.

Warto wi ˛ec zastanowi´c si ˛e czy naprawd ˛e potrzebujemy
rekursji.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Funkcje agreguj ˛

ace pozwalaj ˛

a obliczy´c warto´s´c zale˙zn ˛

a od

wszystkich (pogrupowanych) wierszy w odpowiedzi.

Funkcje analityczne pozwalaj ˛

a oblicza´c funkcje zale˙zne

tylko od cz ˛e´sci wyniku.

Np. pozwalaj ˛

a oblicza´c post ˛epuj ˛

ac ˛

a sum ˛e, N najwi ˛ekszych

(najmniejszych) warto´sci, wyznacza´c ranking, oblicza´c
funkcje na podstawie danego rekordu i jego N s ˛

asiadów

Funkcje analityczne wykonywane s ˛

a po instrukcjach

join,

wheregroup byhaving a przed instrukcj ˛

a

order by.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Składnia funkcji analitycznej:

f u n c t i o n ( A2 ,

. . . , Ak )

over ( < p a r t i t i o n by argument >

<

order by argument >

<windowingclause > )

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

partition by ... dzieli wynik zapytania na cz ˛e´sci, dla
których bed ˛

a, oddzielnie, obliczane warto´sci funkcji,

order by ... definiuje porz ˛

adek w jakim b ˛ed ˛

a podawane

wiersze przy obliczaniu funkcji, nie musi by´c to porz ˛

adek

wypisywania wyników,

windowing-clause definiuje, od których wierszy z tabeli
zale˙zy wynik funkcji.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Przykład. Osoby(imie, nazwisko, id).

IMIE

NAZWISKO

ID

Jan

Kowalski

1

Ewa

Kowalska

2

Marian

Kowalski

3

Roman

Kowalski

4

Ewa

Kowalska

5

Chcemy obliczy´c kolejno´s´c osób zgodn ˛

a z imieniem.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Chcemy obliczy´c kolejno´s´c osób zgodn ˛

a z imieniem.

s e l e c t i m i e , nazwisko , rank ( ) over
(

order by i m i e ) as m i e j s c e

from osoby ;

IMIE

NAZWISKO

MIEJSCE

Ewa

Kowalska

1

Ewa

Kowalska

1

Jan

Kowalski

3

Marian

Kowalski

4

Roman

Kowalski

5

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Chcemy obliczy´c kolejno´s´c osób zgodn ˛

a z imieniem.

s e l e c t i m i e , nazwisko , dense_rank ( ) over
(

order by i m i e ) as m i e j s c e

from osoby ;

IMIE

NAZWISKO

MIEJSCE

Ewa

Kowalska

1

Ewa

Kowalska

1

Jan

Kowalski

2

Marian

Kowalski

3

Roman

Kowalski

4

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Mo˙zemy skorzysta´c te˙z z funkcji agreguj ˛

acych.

Bed ˛

a obliczane dla ka˙zdego wiersza oddzielnie, nie tylko

dla całej grupy.

s e l e c t i m i e , nazwisko , i d

sum( i d ) over

(

p a r t i t i o n by i m i e order by i d )

as suma

from osoby ;

IMIE

NAZWISKO

ID

SUMA

Ewa

Kowalska

2

2

Ewa

Kowalska

5

7

Jan

Kowalski

1

1

Marian

Kowalski

3

3

Roman

Kowalski

4

4

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Porz ˛

adek generowania wyników mo˙ze zosta´c zmieniony,

przez dodanie na ko ´ncu zapytania polecenia

order by.

Nie zmienia to warto´sci funkcji analitycznej.

s e l e c t i m i e , nazwisko , i d

sum( i d ) over

(

p a r t i t i o n by i m i e order by i d )

as suma

from osoby order by i d ;

IMIE

NAZWISKO

ID

SUMA

Jan

Kowalski

1

1

Ewa

Kowalska

2

2

Marian

Kowalski

3

3

Roman

Kowalski

4

4

Ewa

Kowalska

5

7

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Mo˙zemy modyfikowa´c porz ˛

adek:

ascdesc.

Warto´sci null mo˙zemy ustawia´c na ko ´ncu lub pocz ˛

atku:

nulls [first|last].

Inne funkcje:

ntile(N), percent_rank(), cume_dist()

Je´sli chcemy tylko przypisa´c wierszom unikatowe numery
mo˙zemy u˙zy´c funkcji

row_number().

To pozwala łatwo znale´z´c pierwszych N krotek.

Je´sli chcemy powtarzalnych wyników musimy sortowa´c po
unikatowym kluczu.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Przykład. U˙zycie row_number().

s e l e c t i m i e , nazwisko , i d , row_number ( ) over

(

order by i d desc as r n

from osoby ;

IMIE

NAZWISKO

ID

RN

Ewa

Kowalska

5

1

Roman

Kowalski

4

2

Marian

Kowalski

3

3

Ewa

Kowalska

2

4

Jan

Kowalski

1

5

Uwaga. U˙zycie rn w klauzuli where jest nielegalne - funkcje
analityczne s ˛

a obliczane po

wheregroup byhaving a przed

order by.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Przykład. U˙zycie row_number(). Aaaaaby otrzyma´c wiersze z
pewnego zakresu mo˙zemy zagnie´zdzi´c zapytanie u˙zywaj ˛

ace

row_number().

s e l e c t i m i e , nazwisko , r n from
(
s e l e c t i m i e , nazwisko , i d , row_number ( ) over

(

order by i d desc as r n

from osoby

)

where 1< r n and r n < 5 ;

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Funkcje SUM, COUNT, AVG, MIN, MAX nie zale˙z ˛

a od

porz ˛

adku wierszy.

Je´sli obliczenie zale˙zy od porz ˛

adku generowania wierszy

powinni´smy go poda´c w

over (...) przez order by.

Forma:

order by expr [asc | descnulls [first | last].

Funkcje zale˙z ˛

ace od porz ˛

adku: LEAD, LAG, RANK,

DENSE_RANK, ROW_NUMBER, FIRST, FIRST VALUE,
LAST, LAST VALUE.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

first_value(sql-expr) oblicza warto´s´c sql-expr na pierwszej
krotce w grupie zdefiniowanej przez

partition.

s e l e c t i m i e , nazwisko , i d ,

i d − f i r s t _ v a l u e ( i d )

over

(

p a r t i t i o n by nazwisko

order by

nazwisko , i m i e , i d )

as d i f f

from osoby ;

IMIE

NAZWISKO

ID

DIFF

Ewa

Kowalska

2

0

Ewa

Kowalska

5

3

Jan

Kowalski

1

0

Marian

Kowalski

3

2

Roman

Kowalski

4

3

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

lead(sql-expr,offset, default) oblicza warto´s´c sql-expr na
krotce wyst ˛epuj ˛

acej w grupie offset pozycji

po aktualnej.

s e l e c t i m i e , nazwisko , i d ,

i d + l e a d ( i d ,1 , 10)

over

(

p a r t i t i o n by nazwisko

order by

nazwisko , i m i e , i d )

as sum

from osoby ;

IMIE

NAZWISKO

ID

SUM

Ewa

Kowalska

2

7

Ewa

Kowalska

5

-5

Jan

Kowalski

1

4

Marian

Kowalski

3

7

Roman

Kowalski

4

-6

Warto´s´c domy´slna dla offset to 1. Je´sli dana krotka nie istnieje,
to zostanie zwrócona warto´s´c default.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

Funkcja analogiczna do

first_value to last_value.

Funkcja analogiczna do

lead to lag(sql-expr, offset,

default).

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – funkcje analityczne

s e l e c t i m i e , nazwisko , i d , sum( i d ) over

(

order by

nazwisko , i m i e , i d

rows between 1 p r e c e d i n g and

i d f o l l o w i n g )

as sum

from osoby ;

IMIE

NAZWISKO

ID

SUM

Ewa

Kowalska

2

8

Ewa

Kowalska

5

15

Jan

Kowalski

1

9

Marian

Kowalski

3

8

Roman

Kowalski

4

7

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – dygresja

Czasem zamiast row_number() wystarczy u˙zy´c
pseudokolumny Oracle

rownum.

Dla ka˙zdej tabeli i wyniku zapytania mo˙zemy posłu˙zy´c si ˛e
rownum, która przechowuje kolejne numery wierszy tabeli
(licz ˛

ac od 1).

s e l e c t i m i e , nazwisko , rownum

from osoby
where rownum <4;

IMIE

NAZWISKO

ROWNUM

Jan

Kowalski

1

Ewa

Kowalska

2

Marian

Kowalski

3

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

SQL – dygresja

s e l e c t i m i e , nazwisko , rownum

from osoby
where rownum <4;

zwraca tylko pierwsze trzy wiersze

s e l e c t i m i e , nazwisko , rownum

from osoby
where rownum >1;

nie zwróci ˙zadnego wiersza, bo

rownum przypisuje

pierwszemu wierszowi numer 1. Ka˙zdy kolejno testowany
wiersz b ˛edzie miał domy´slnie przypisany

rownum = 1.

U˙zycie

rownum mo˙ze wył ˛

aczy´c pewne optymalizacje w

obliczaniu zapyta ´n.

Konrad Zdanowski

Bazy danych – wykład trzeci

background image

Koniec

Konrad Zdanowski

Bazy danych – wykład trzeci