Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
SQL. Receptury
Autor: Anthony Molinaro
Tumaczenie: Mikoaj Szczepaniak
ISBN: 83-246-0450-2
Tytu oryginau: SQL Cookbook
Format: B5, stron: 624
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Przedmowa ................................................................................................................... 11
1. Odczytywanie rekordw ............................................................................................. 29
Odczytywanie wszystkich wierszy i kolumn tabeli
Odczytywanie podzbioru wierszy tabeli
Odnajdywanie wierszy speniajcych wiele warunkw
Odczytywanie podzbioru kolumn tabeli
Definiowanie znaczcych nazw kolumn
Odwoania do aliasw kolumn w klauzuli WHERE
Konkatenacja wartoci kolumn
Stosowanie logiki warunkowej w wyraeniu SELECT
Ograniczanie liczby zwracanych wierszy
Zwracanie n losowych rekordw tabeli
Odnajdywanie wartoci pustych
Tumaczenie wartoci pustych na wartoci rzeczywiste
Poszukiwanie wzorcw
29
30
30
31
32
33
34
35
36
38
39
40
41
43
44
45
46
49
55
57
59
60
62
|
Uzyskiwanie z jednej tabeli tylko tych wierszy, dla ktrych nie istniej
odpowiedniki w innej tabeli
Dodawanie zcze do zapyta bez koniecznoci modyfikowania pozostaych,
ju istniejcych zcze
Okrelanie, czy dwie tabele zawieraj te same dane
Identyfikowanie i eliminowanie iloczynw kartezjaskich
Stosowanie zcze w zapytaniach wykorzystujcych funkcje agregujce
Stosowanie zcze zewntrznych w zapytaniach wykorzystujcych funkcje
agregujce
Zwracanie brakujcych danych z wielu tabel
Wykorzystywanie wartoci NULL w operacjach i wyraeniach warunkowych
66
68
70
76
78
82
85
89
92
92
94
95
95
97
99
100
101
102
105
107
107
108
109
110
111
Spis treci
113
114
115
117
118
121
123
126
128
129
130
131
135
140
144
145
151
157
162
168
174
180
183
185
187
188
190
191
194
197
198
201
205
207
209
210
213
215
218
220
224
227
Spis treci
228
239
246
252
255
257
260
267
274
291
296
303
312
314
317
323
328
337
342
346
Spis treci
351
354
357
360
361
363
365
369
372
373
375
382
391
393
401
403
406
409
411
414
419
421
424
429
433
442
444
446
447
451
453
460
466
469
475
483
486
Spis treci
495
497
499
503
506
507
509
512
516
526
528
533
535
540
542
544
10
Spis treci
ROZDZIA 1.
Rozwizanie
Naley uy dla interesujcej nas tabeli wyraenia SELECT ze znakiem specjalnym gwiazdki (*):
1 select *
2
from emp
Omwienie
Znak gwiazdki (*) ma w jzyku SQL znaczenie specjalne. Uycie tego znaku w wyraeniu SELECT
spowoduje zwrcenie wszystkich kolumn wskazanej tabeli. Poniewa w prezentowanym rozwizaniu nie ma klauzuli WHERE, zwrcony wynik bdzie zawiera take wszystkie wiersze
tabeli EMP. Alternatywnym rozwizaniem byoby zdefiniowanie wprost listy wszystkich kolumn
tej tabeli:
select empno, ename, job, sal, mgr, hiredate, comm, deptno
from emp
Rozwizanie
Naley uy klauzuli WHERE definiujcej warunek kwalifikowania wierszy do generowanego
zbioru wynikowego. Przykadowo, aby uzyska list wszystkich pracownikw zatrudnionych
w dziesitym dziale firmy, powinnimy wykona nastpujce wyraenie:
1 select *
2
from emp
3 where deptno = 10
Omwienie
Klauzula WHERE umoliwia nam uzyskiwanie tylko tych wierszy, ktre nas interesuj. Jeli wyraenie zdefiniowane w klauzuli WHERE okae si prawdziwe dla danego wiersza, wiersz ten zostanie uwzgldniony w zbiorze wynikowym.
Wikszo producentw oferuje w swoich systemach takie operatory porwnawcze jak =, <, >,
<=, >=, ! oraz <>. Dodatkowo mamy moliwo definiowania klauzul, ktre bd wymagay od
wierszy kwalifikowanych do zbioru wynikowego speniania wielu warunkw mona to osign, stosujc operatory AND, OR oraz nawiasy (patrz nastpny przepis).
Rozwizanie
Naley uy klauzuli WHERE zawierajcej operatory OR i (lub) AND. Przykadowo, jeli bdziemy
zainteresowani list wszystkich pracownikw dziesitego dziau firmy, pracownikw, ktrzy s
wynagradzani w trybie prowizyjnym, oraz wszystkich pracownikw dwudziestego dziau firmy
zarabiajcych nie wicej ni 2000 dolarw miesicznie, powinnimy zastosowa nastpujce
wyraenie SELECT:
1 select *
2
from emp
3 where deptno = 10
4
or comm is not null
5
or sal <= 2000 and deptno = 20
30
Omwienie
Moemy uy kombinacji operatorw AND i OR oraz nawiasw, aby zakwalifikowa do zbioru
wynikowego wiersze speniajce wiele warunkw. W prezentowanym przykadzie klauzula
WHERE powinna wskazywa na wiersze, ktre:
w kolumnie DEPTNO zawieraj warto 10,
w kolumnie COMM zawieraj warto NULL,
w kolumnie SAL zawieraj warto mniejsz lub rwn 2000 i w kolumnie DEPTNO war-
to 20.
Stosujc nawiasy, wymusimy czne wyznaczenie wartoci warunkw zawartych w tych
nawiasach.
Przykadowo, zastanwmy si, jak zmieni si zbir wynikowy, jeli w naszym zapytaniu umiecimy nawiasy tak jak w poniszym przykadzie:
select *
from emp
where (
deptno = 10
or comm is not null
or sal <= 2000
)
and deptno = 20
EMPNO
----7369
7876
ENAME
-----SMITH
ADAMS
JOB
MGR HIREDATE
SAL
COMM DEPTNO
------ ----- ----------- ----- ---------- -----CLERK
7902 17-DEC-1980
800
20
CLERK
7788 12-JAN-1983 1100
20
Rozwizanie
Naley wymieni w klauzuli SELECT zapytania wszystkie interesujce nas kolumny. Przykadowo, aby uzyska nazwisko, numer dziau i wynagrodzenie pracownikw, powinnimy wykona zapytanie SELECT w postaci:
1 select ename, deptno, sal
2
from emp
Omwienie
Wymieniajc poszczeglne kolumny w klauzuli SELECT, moemy zagwarantowa, e zbir
wynikowy nie bdzie zawiera adnych dodatkowych, niespodziewanych danych. Tego rodzaju
pewno jest szczeglnie istotna w sytuacji, gdy dania s kierowane do bazy danych za
31
porednictwem sieci, poniewa eliminuje to opnienia wynikajce z wyszukiwania i przesyania niepotrzebnych danych.
Czym jest sal? Skrcon wersj sowa sale? Czyim nazwiskiem? Czym jest comm? Skrcon
wersj sowa communication? Chcemy, aby etykiety kolumn tabeli wynikowej byy bardziej
zrozumiae.
Rozwizanie
Aby zmieni nazwy prezentowane w wynikach zapyta, naley uy sowa kluczowego AS
w nastpujcej formie: nazwa_oryginalna AS nowa_nazwa. Niektre bazy danych nie wymagaj
stosowania sowa kluczowego AS, ale wszystkie produkty akceptuj i prawidowo interpretuj
to sowo:
1 select sal as salary, comm as commission
2
from emp
SALARY COMMISSION
------ ---------800
1600
300
1250
500
2975
1250
1300
2850
2450
3000
5000
1500
0
1100
950
3000
1300
Omwienie
Stosowanie sowa kluczowego AS do nadawania nowych nazw kolumnom zwracanym przez
nasze zapytanie czsto jest nazywane nadawaniem aliasw (ang. aliasing) tym kolumnom. Nowe
nazwy s okrelane mianem aliasw. Zdefiniowanie dobrych aliasw moe bardzo uatwi
ewentualnym odbiorcom wynikw zapytania ich prawidow interpretacj.
32
Rozwizanie
Opakowujc nasze zapytanie w sposb, ktry przeksztaci je w wewntrzn perspektyw,
moemy sobie zapewni moliwo odwoa do kolumn reprezentowanych przez aliasy:
1 select *
2
from (
3 select sal as salary, comm as commission
4
from emp
5
) x
6 where salary < 5000
Omwienie
W tym prostym przykadzie moglibymy oczywicie unikn koniecznoci stosowania perspektywy wewntrznej i uy w klauzuli WHERE bezporednich odwoa do kolumn COMM i SAL (efekt
byby identyczny). Przedstawione rozwizanie wprowadza mechanizm, ktrego bdziemy
potrzebowali podczas stosowania odwoa do nastpujcych konstrukcji w klauzuli WHERE:
funkcji agregujcych,
podzapyta skalarnych,
funkcji okienkowania,
aliasw.
33
Warto jednak pamita, e dane potrzebne do wygenerowania tego rodzaju wynikw pochodz
z dwch rnych kolumn tabeli EMP ENAME oraz JOB:
select ename, job
from emp
where deptno = 10
ENAME
---------CLARK
KING
MILLER
JOB
--------MANAGER
PRESIDENT
CLERK
Rozwizanie
Naley odnale wbudowan funkcj naszego systemu zarzdzania baz danych, ktra umoliwia konkatenacj wartoci, i uy jej.
MySQL
Baza danych MySQL oferuje funkcj nazwan CONCAT:
1 select concat(ename, ' WORKS AS A ', job) as msg
2
from emp
3 where deptno = 10
34
SQL Server
Uytkownicy systemu SQL Server mog konkatenowa wartoci wielu tabel za pomoc standardowego operatora dodawania (+):
1 select ename + ' WORKS AS A ' + job as msg
2
from emp
3 where deptno = 10
Omwienie
Konkatenacja wartoci pochodzcych z wielu kolumn wymaga uycia funkcji CONCAT. Operator
|| jest skrtem funkcji CONCAT stosowanym w systemach baz danych DB2, Oracle i PostgreSQL,
natomiast operator + jest skrtem funkcji CONCAT w systemie SQL Server.
Rozwizanie
Musimy uy wyraenia CASE, za porednictwem ktrego moemy zdefiniowa logik warunkow bezporednio w naszym zapytaniu SELECT:
1 select ename, sal,
2
case when sal <= 2000 then 'UNDERPAID'
3
when sal >= 4000 then 'OVERPAID'
4
else 'OK'
5
end as status
6
from emp
35
Omwienie
Wyraenie CASE umoliwia definiowanie rozmaitych elementw logiki warunkowej, ktrej
zachowania s uzalenione od wartoci zwracanych przez zapytanie. Istnieje moliwo przypisania do wyraenia CASE aliasu, ktry zapewni wiksz czytelno generowanego zbioru wynikowego. W prezentowanym przykadzie nadano wynikowi wyraenia CASE alias STATUS. Klauzula ELSE ma charakter opcjonalny. Jeli zrezygnujemy z tej klauzuli i dany wiersz nie zostanie
dopasowany do adnego z warunkw testowych, wyraenie CASE zwrci warto NULL.
Rozwizanie
Naley uy odpowiedniej funkcji oferowanej przez nasz system zarzdzania baz danych
umoliwiajcej kontrol liczby zwracanych wierszy.
DB2
W systemie bazy danych DB2 powinnimy uy klauzuli FETCH FIRST:
1 select *
2
from emp fetch first 5 rows only
MySQL i PostgreSQL
Ten sam efekt osigniemy w systemach MySQL i PostgreSQL, stosujc klauzul LIMIT:
1 select *
2
from emp limit 5
Oracle
W systemie zarzdzania baz danych Oracle ograniczenia liczby wierszy zwracanych przez
zapytania powinny mie posta klauzul WHERE definiujcych warto progow funkcji ROWNUM:
1 select *
2
from emp
3 where rownum <= 5
SQL Server
W systemie SQL Server mona ograniczy liczb zwracanych wierszy, stosujc sowo kluczowe TOP:
1 select top 5 *
2
from emp
36
Omwienie
Wielu producentw oferuje obsug klauzul podobnych do FETCH FIRST oraz LIMIT, dziki ktrym moemy okrela liczb wierszy zwracanych przez zapytanie. Inaczej jest w systemie Oracle,
gdzie jestemy zmuszeni uy funkcji nazwanej ROWNUM, ktra zwraca liczb wierszy wchodzcych w skad zbioru wynikowego (licznik jest automatycznie zwikszany o jeden wraz z kadym wierszem kwalifikowanym do zbioru wynikowego).
Poniej opisano procedur wykonywania zapytania zawierajcego w klauzuli WHERE warunek
ROWNUM <= 5, ktry ogranicza liczb zwracanych wierszy do piciu:
37
Rozwizanie
Naley uy funkcji wbudowanej w wykorzystywany system zarzdzania baz danych, ktra
zwraca wartoci losowe. Powinnimy zastosowa t funkcj w klauzuli ORDER BY, aby posortowa wiersze w sposb przypadkowy. Nastpnie naley wykorzysta opisan w poprzednim podrozdziale technik ograniczania liczby losowo posortowanych wierszy, ktre znajd
si w zbiorze wynikowym.
DB2
Naley uy wbudowanej funkcji RAND cznie z klauzul ORDER BY i wspominan wczeniej
funkcj FETCH:
1 select ename, job
2
from emp
3 order by rand() fetch first 5 rows only
MySQL
Naley uy wbudowanej funkcji RAND cznie z funkcj FETCH wywoywan w ciele klauzuli
ORDER BY:
1 select ename, job
2
from emp
3 order by rand() limit 5
PostgreSQL
Powinnimy uy wbudowanej funkcji RANDOM cznie z funkcj FETCH i klauzul ORDER BY:
1 select ename, job
2
from emp
3 order by random() limit 5
38
Oracle
Naley uy wbudowanej funkcji VALUE bdcej czci wbudowanego pakietu DBMS_RANDOM
cznie z klauzul ORDER BY oraz wywoaniem funkcji ROWNUM klauzuli WHERE:
1 select *
2
from (
3 select ename, job
4
from emp
5
order by dbms_random.value()
8
)
9
where rownum <= 5
SQL Server
Aby uzyska losowy picioelementowy zbir wynikowy, naley uy wbudowanej funkcji NEWID
w poczeniu ze sowem kluczowym TOP oraz klauzul ORDER BY:
1 select top 5 ename, job
2
from emp
3 order by newid()
Omwienie
Klauzula ORDER BY moe otrzymywa warto zwrcon przez funkcj i na jej podstawie modyfikowa porzdek elementw w zbiorze wynikowym. Wszystkie zapytania przedstawione
w punkcie Rozwizanie sprawdzaj liczb wierszy w zbiorze wynikowym po wykonaniu funkcji wywoywanej w klauzuli ORDER BY. Uytkownicy systemw zarzdzania baz danych innych
ni Oracle powinni skorzysta z okazji i przeanalizowa rozwizanie zaproponowane wanie
dla tego systemu, poniewa wanie to zapytanie najlepiej ilustruje ide stojc take za pozostaymi zapytaniami.
W adnym razie nie naley myli stosowania funkcji w klauzuli ORDER BY ze stosowaniem staych numerycznych. Podczas okrelania staej numerycznej w klauzuli ORDER BY tak naprawd
damy, by sortowanie uwzgldniao zawarto okrelonej kolumny wymienionej w klauzuli
SELECT. Jeli w klauzuli ORDER BY umiecimy wywoanie jakiej funkcji, operacja sortowania
bdzie wykonywana na wynikach tej funkcji wyznaczanych dla kadego kolejnego wiersza.
Rozwizanie
Aby okreli, czy w danym wierszu okrelona kolumna zawiera warto pust, musimy uy
wyraenia IS NULL.
1 select *
2
from emp
3 where comm is null
39
Omwienie
Warto NULL nigdy nie jest ani rwna, ani rna od czegokolwiek (nawet od samej siebie), zatem
nie moemy sprawdza ewentualnego zawierania tej wartoci w wierszu za pomoc standardowych = lub !=. Aby okreli, czy dany wiersz zawiera warto NULL, musimy uy wyraenia
IS NULL. Odnajdywanie wierszy, ktre nie zawieraj wartoci pustych w okrelonej kolumnie,
wymaga zastosowania w klauzuli WHERE wyraenia IS NOT NULL.
Rozwizanie
Naley uy funkcji COALESCE, aby zastpi wartoci puste waciwymi wartociami (w tym
przypadku zerami):
1 select coalesce(comm, 0)
2
from emp
Omwienie
Funkcja COALESCE otrzymuje za porednictwem swoich argumentw jedn lub wiele wartoci
wejciowych. Funkcja zwraca pierwsz warto rn od NULL z tej listy. Oznacza to, e w prezentowanym przykadzie warto kolumny COMM jest zwracana pod warunkiem, e nie jest wartoci pust. W przeciwnym razie funkcja zwraca zero.
Podczas pracy z wartociami pustymi zawsze warto korzysta z wbudowanej funkcjonalnoci
stosowanego systemu zarzdzania baz danych (DBMS). Znaczna cz tych systemw oferuje
wiele funkcji, ktre mona z powodzeniem uywa do realizacji tego zadania. W prezentowanym rozwizaniu wykorzystalimy funkcj COALESCE, poniewa dziaa ona we wszystkich systemach zarzdzania bazami danych. Drug uniwersaln konstrukcj jzyka SQL obsugiwan
przez wszystkie systemy jest klauzula CASE:
select case
when comm is null then 0
else comm
end
from emp
Chocia wyraenie CASE moe by wykorzystywane do tumaczenia wartoci NULL na inne wartoci, powyszy przykad dowodzi, e funkcja COALESCE jest zdecydowanie prostsza w uyciu
i bardziej zwiza.
40
Poszukiwanie wzorcw
Problem
Chcemy zwrci wiersze speniajce okrelone kryteria wiersze, ktrych zawarto mona
dopasowa do okrelonego podacucha lub wzorca. Przeanalizujmy ponisze zapytanie
i zbir wynikowy:
select ename, job
from emp
where deptno in (10, 20)
ENAME
---------SMITH
JONES
CLARK
SCOTT
KING
ADAMS
FORD
MILLER
JOB
---------CLERK
MANAGER
MANAGER
ANALYST
PRESIDENT
CLERK
ANALYST
CLERK
Chcemy, aby zbir wynikowy zawiera nazwiska i stanowiska pracy tylko tych pracownikw
dziesitego i dwudziestego dziau, ktrych nazwiska zawieraj liter I lub ktrych nazwa stanowiska pracy koczy si literami ER.
ENAME
---------SMITH
JONES
CLARK
KING
MILLER
JOB
---------CLERK
MANAGER
MANAGER
PRESIDENT
CLERK
Rozwizanie
Naley uy operatora LIKE cznie ze stosowanym w jzyku SQL symbolem wieloznacznym %:
1 select ename, job
2
from emp
3 where deptno in (10, 20)
4
and (ename like '%I%' or job like '%ER')
Omwienie
Operator % stosowany cznie z uniwersalnym operatorem dopasowywania wzorcw LIKE jest
dopasowywany do dowolnej sekwencji znakw. Wikszo implementacji standardu SQL dodatkowo oferuje operator podkrelenia (_), ktry jest dopasowywany do pojedynczych znakw.
Umieszczajc prosty, jednoliterowy wzorzec przeszukiwania I pomidzy dwoma operatorami
%, okrelamy, e do zbioru wynikowego bd kwalifikowane acuchy zawierajce liter I (na
dowolnej pozycji). Gdybymy uyli tylko jednego operatora %, zawarto zbioru wynikowego
naszego zapytania byaby uzaleniona od miejsca umieszczenia tego operatora. Przykadowo,
aby otrzyma stanowiska pracy o nazwach koczcych si literami ER, powinnimy szukany acuch ER poprzedzi operatorem %; gdybymy chcieli odnale nazwy stanowisk pracy rozpoczynajce si od tych liter, powinnimy uy wyraenia regularnego %ER.
Poszukiwanie wzorcw
41