You are on page 1of 20

IDZ DO

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

SQL jest jzykiem programowania uywanym we wszystkich najpopularniejszych


systemach zarzdzania bazami danych. Oczywicie, kady z nich ma specyficzne
dla siebie polecenia i parametry, jednak rdze jzyka jest ustandaryzowany.
SQL wykorzystuje si do tworzenia baz i tabel, wprowadzania danych do bazy
i manipulowania nimi oraz do administrowania serwerem bazy danych.
Mimo stosunkowo niewielkiego zbioru sw kluczowych, jest niezwykle elastyczny
i uniwersalny.
Ksika SQL. Receptury to zestawienie rozwiza problemw, z jakimi programici
baz danych spotykaj si w swojej pracy. Przedstawia zagadnienia zwizane
z wybieraniem rekordw z bazy, grupowaniem, sortowaniem ich i tworzeniem zoonych
zapyta wykorzystujcych kilka tabel. Opisuje metody wprowadzania danych do bazy,
tworzenia raportw i przetwarzania wynikw zapyta. Kade z rozwiza
zaprezentowane jest w formie polecenia SQL opatrzonego szczegowym
komentarzem.
Odczytywanie danych z bazy
Sortowanie wynikw zapyta
czenie tabel w zapytaniach
Wprowadzanie i aktualizowanie danych w tabelach
Usuwanie rekordw
Operacje na liczbach i datach
Zapytania zoone
Tworzenie raportw
Polecenia SQL specyficzne dla okrelonych systemw baz danych

Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl

Optymalna konstrukcja zapyta SQL jest jednym z warunkw szybkiego dziaania


aplikacji bazodanowych. Dziki wiadomociom z tej ksiki kady programista baz
danych wykorzysta wszystkie moliwoci jzyka SQL.

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

2. Sortowanie wynikw zapyta ................................................................................... 43


Zwracanie wynikw zapyta posortowanych w okrelonym porzdku
Sortowanie zbioru wynikowego wedug zawartoci wielu pl
Sortowanie wedug podacuchw
Sortowanie wymieszanych danych alfanumerycznych
Obsuga wartoci pustych w zapytaniach sortujcych
Sortowanie wedug klucza zalenego od danych

43
44
45
46
49
55

3. Praca z wieloma tabelami ........................................................................................... 57


Umieszczanie jednego zbioru wierszy ponad drugim
czenie wzajemnie powizanych wierszy
Odnajdywanie wsplnych wierszy pomidzy dwiema tabelami
Uzyskiwanie z jednej tabeli tylko tych wartoci, ktre nie wystpuj w innej tabeli
Spis treci

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

4. Wstawianie, aktualizowanie i usuwanie ................................................................... 91


Wstawianie nowych rekordw
Wstawianie wartoci domylnych
Przykrywanie wartoci domylnych wartoci NULL
Kopiowanie wierszy pomidzy tabelami
Kopiowanie definicji tabel
Wstawianie wierszy do wielu tabel jednoczenie
Blokowanie moliwoci wstawiania wartoci do wybranych kolumn
Modyfikowanie rekordw tabeli
Aktualizowanie danych pod warunkiem zawierania w tabeli okrelonych wierszy
Aktualizowanie wartoci wedug zawartoci innej tabeli
Scalanie rekordw
Usuwanie wszystkich rekordw z tabeli
Usuwanie rekordw speniajcych okrelone kryteria
Usuwanie pojedynczych rekordw
Usuwanie wierszy naruszajcych integralno odwoa
Usuwanie powtarzajcych si rekordw
Usuwanie wierszy bdcych przedmiotem odwoa rekordw skadowanych
w innej tabeli

92
92
94
95
95
97
99
100
101
102
105
107
107
108
109
110
111

5. Zapytania przetwarzajce metadane ....................................................................... 113


Generowanie listy tabel wchodzcych w skad schematu bazy danych
Generowanie listy kolumn danej tabeli
Generowanie listy indeksowanych kolumn danej tabeli
Generowanie listy ogranicze zdefiniowanych dla tabeli
Generowanie listy kluczy obcych pozbawionych indeksw
Generowanie kodu jzyka SQL za pomoc wyrae tego jzyka
Opisywanie perspektyw sownikw danych w bazie danych Oracle

Spis treci

113
114
115
117
118
121
123

6. Praca z acuchami ..................................................................................................... 125


Przechodzenie pomidzy znakami acucha
Umieszczanie apostrofw w staych acuchowych
Zliczanie wystpie znaku w acuchu wejciowym
Usuwanie z acucha niechcianych znakw
Oddzielanie danych numerycznych od danych znakowych
Okrelanie, czy acuch jest cigiem alfanumerycznym
Okrelanie inicjaw na podstawie caych imion i nazwisk
Sortowanie kolumn wedug wybranych fragmentw acuchw
Sortowanie danych wedug liczb zapisanych w acuchach
Tworzenie listy wartoci oddzielonych przecinkami z danych zawartych
w wierszach tabeli
Konwertowanie danych oddzielonych przecinkami na wielowartociow list IN
Sortowanie znakw w acuchach w porzdku alfabetycznym
Identyfikowanie acuchw, ktre mona traktowa jak liczby
Odnajdywanie n-tego podacucha na licie oddzielonej przecinkami
Przetwarzanie adresw IP

126
128
129
130
131
135
140
144
145
151
157
162
168
174
180

7. Praca z liczbami .......................................................................................................... 183


Wyznaczanie wartoci redniej
Identyfikacja minimalnej i maksymalnej wartoci w kolumnie
Sumowanie wartoci skadowanych w kolumnie
Zliczanie wierszy tabeli
Zliczanie rnych wartoci w kolumnie
Generowanie sum biecych
Generowanie iloczynw biecych
Wyznaczanie rnic biecych
Wyznaczanie wartoci modalnej (dominanty)
Wyznaczanie mediany
Okrelanie procentowego udziau w wartoci cznej
Agregowanie kolumn zawierajcych wartoci NULL
Wyznaczanie wartoci rednich z wyczeniem wartoci spoza okrelonego
przedziau
Konwertowanie acuchw alfanumerycznych na liczby
Modyfikowanie wartoci uwzgldnianych w sumach biecych

183
185
187
188
190
191
194
197
198
201
205
207
209
210
213

8. Dziaania na datach .................................................................................................... 215


Dodawanie i odejmowanie dni, miesicy i lat
Okrelanie liczby dni pomidzy dwiema datami
Okrelanie liczby dni roboczych pomidzy dwiema datami
Okrelanie liczby miesicy lub lat dzielcych dwie daty
Okrelanie liczby sekund, minut lub godzin dzielcych dwie daty

215
218
220
224
227
Spis treci

Zliczanie wystpie poszczeglnych dni tygodnia w roku


Okrelanie rnicy dzielcej dat reprezentowan w biecym rekordzie
i dat reprezentowan w rekordzie nastpnym

228
239

9. Przetwarzanie dat ..................................................................................................... 245


Okrelanie, czy dany rok jest rokiem przestpnym
Okrelanie liczby dni w roku
Wydobywanie jednostek czasu z dat wejciowych
Okrelanie pierwszego i ostatniego dnia miesica
Okrelanie wszystkich dat dla konkretnego dnia tygodnia w cigu danego roku
Okrelanie dat pierwszego i ostatniego wystpienia okrelonego dnia tygodnia
w danym miesicu
Tworzenie kalendarza
Generowanie dat rozpoczynajcych i koczcych
poszczeglne kwartay danego roku
Okrelanie daty pocztkowej i kocowej dla danego na wejciu kwartau
Odnajdywanie brakujcych dat
Przeszukiwanie wedug okrelonych jednostek czasu
Porwnywanie rekordw wedug okrelonych fragmentw dat
Identyfikacja wzajemnie pokrywajcych si przedziaw czasowych

246
252
255
257
260
267
274
291
296
303
312
314
317

10. Praca z przedziaami ................................................................................................. 323


Lokalizowanie przedziaw w ramach cigw wartoci
Odnajdywanie rnic pomidzy wierszami nalecymi do tej samej grupy
lub wycinka danych
Lokalizowanie pocztkw i kocw przedziaw wartoci nastpujcych
bezporednio po sobie
Uzupenianie brakujcych wartoci w przedziale
Generowanie kolejnych wartoci liczbowych

323
328
337
342
346

11. Zaawansowane przeszukiwanie ............................................................................... 351


Podzia zbioru wynikowego na strony
Pomijanie n wierszy tabeli
Stosowanie logiki alternatywy w zapytaniach wykorzystujcych zczenia
zewntrzne
Identyfikacja par odwrotnych w przetwarzanym zbiorze wierszy
Wybieranie n najlepszych rekordw
Odnajdywanie rekordw z najwikszymi i najmniejszymi wartociami
Badanie przyszych wierszy
Przenoszenie wartoci nieprzetworzonych
Przypisywanie ocen do wierszy zbioru wynikowego
Eliminowanie powtrze

Spis treci

351
354
357
360
361
363
365
369
372
373

Odnajdywanie wartoci skoczka


Generowanie prostych prognoz

375
382

12. Raportowanie i magazynowanie danych ................................................................. 391


Konwertowanie zbioru wynikowego do postaci pojedynczego wiersza
Konwertowanie zbioru wynikowego do postaci zbioru wielowierszowego
Odwrotna transpozycja zbioru wynikowego
Odwrotna transpozycja zbioru danych do postaci zbioru jednokolumnowego
Eliminowanie powtrze ze zbioru wynikowego
Obracanie zbioru wynikowego celem wykonywania oblicze w ramach
skonsolidowanych wierszy
Tworzenie blokw danych tej samej wielkoci
Tworzenie predefiniowanej liczby blokw danych
Tworzenie histogramw poziomych
Tworzenie histogramw pionowych
Zwracanie zbiorw wynikowych bez kolumn wykorzystywanych w procesie
grupowania
Wyznaczanie prostych sum czciowych
Wyznaczanie sum czciowych dla wszystkich moliwych kombinacji wyrae
Identyfikowanie wierszy niebdcych sumami czciowymi
Konwertowanie wierszy na wersj bitow za pomoc wyrae CASE
Tworzenie tzw. macierzy rzadkich
Grupowanie wierszy wedug okrelonych jednostek czasu
Jednoczesne agregowanie danych wedug rnych grup i blokw
Agregowanie zmiennych (ruchomych) przedziaw wartoci
Obracanie zbioru wynikowego zawierajcego sumy czciowe

391
393
401
403
406
409
411
414
419
421
424
429
433
442
444
446
447
451
453
460

13. Zapytania hierarchiczne ............................................................................................ 465


Wyraanie relacji rodzic-potomek
Wyraanie relacji potomek-rodzic-dziadek
Tworzenie hierarchicznych perspektyw dla istniejcych tabel
Odnajdywanie wszystkich wierszy potomnych dla danego wiersza rodzica
Okrelanie wierszy wystpujcych w rolach lici, gazi i korzeni

466
469
475
483
486

14. Rozmaitoci ................................................................................................................ 495


Tworzenie raportw krzyowych za pomoc operatora PIVOT systemu
SQL Server
Przywracanie oryginalnego ksztatu obrconych raportw krzyowych
za pomoc operatora UNPIVOT systemu SQL Server
Transponowanie zbiorw wynikowych za pomoc klauzuli MODEL systemu Oracle
Wydobywanie interesujcych nas elementw z rnych czci acucha
Znajdowanie liczby dni w roku (rozwizanie alternatywne tylko dla systemu Oracle)

Spis treci

495
497
499
503
506

Przeszukiwanie danych wejciowych pod ktem zawierania acuchw


alfanumerycznych
Konwertowanie liczb cakowitych na reprezentacje binarne w systemie Oracle
Obracanie zbioru wynikowego z wartociami rankingowymi
Wstawianie nagwkw kolumn w dwukrotnie obrconych zbiorach wynikowych
Konwertowanie podzapyta skalarnych na podzapytania kompozytowe
w systemie Oracle
Konwertowanie uszeregowanych danych do postaci osobnych wierszy
Wyznaczanie procentowych stosunkw poszczeglnych wartoci wzgldem
sumy wszystkich wartoci
Tworzenie w systemie Oracle list wartoci oddzielonych przecinkami
Odnajdywanie kolejnych niepasujcych wzorcw w systemie Oracle
Transformacja danych za pomoc perspektywy wbudowanej
Testowanie wystpowania wartoci w grupie

507
509
512
516
526
528
533
535
540
542
544

A Przypomnienie funkcji okienkowania ...................................................................... 549


B Jeszcze raz o Rozenshteinie ...................................................................................... 575
Skorowidz .................................................................................................................... 611

10

Spis treci

ROZDZIA 1.

W niniejszym rozdziale skupimy si na najbardziej podstawowych wyraenia SELECT. Dobre ich


zrozumienie jest o tyle wane, e znaczna cz prezentowanych tutaj zagadnie bdzie wykorzystywana nie tylko w kolejnych rozdziaach, ale te w Twojej codziennej pracy z jzykiem SQL.

Odczytywanie wszystkich wierszy i kolumn tabeli


Problem
Dysponujemy tabel bazy danych i chcemy si zapozna ze wszystkimi zawartymi w niej
danymi.

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

W przypadku zapyta budowanych ad hoc i wykonywanych w sposb interaktywny duo


prostszym rozwizaniem jest stosowanie wyrae SELECT *. Podczas pisania trwaego kodu
programu warto jednak wprost wymienia odczytywane kolumny. Wydajno obu zapyta
bdzie identyczna, ale obecno konkretnych nazw kolumn uatwi identyfikacj pobieranych
danych i bdzie stanowia pewne zabezpieczenie programu na wypadek zmian w bazie danych.
Co wicej, tak zapisywane zapytania atwiej zrozumie osobom analizujcym nasz kod (ktre
nie musz przecie zna wszystkich kolumn tworzcych przetwarzan tabel).
29

Odczytywanie podzbioru wierszy tabeli


Problem
Dysponujemy tabel bazy danych i chcemy si zapozna wycznie z zawartoci tych wierszy,
ktre speniaj okrelony warunek.

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).

Odnajdywanie wierszy speniajcych wiele warunkw


Problem
Chcemy uzyska wiersze, ktre speniaj wiele warunkw.

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

Rozdzia 1. Odczytywanie rekordw

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

Odczytywanie podzbioru kolumn tabeli


Problem
Dysponujemy tabel bazy danych i chcemy si zapozna z wartociami okrelonych kolumn
zamiast z zawartoci wszystkich kolumn danej tabeli.

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

Odczytywanie podzbioru kolumn tabeli

31

porednictwem sieci, poniewa eliminuje to opnienia wynikajce z wyszukiwania i przesyania niepotrzebnych danych.

Definiowanie znaczcych nazw kolumn


Problem
Chcielibymy tak zmieni nazwy kolumn uwzgldnianych w zbiorze wynikowym wygenerowanym przez nasze zapytanie, aby byy bardziej czytelne i zrozumiae. Przeanalizujmy zapytanie zwracajce wysoko wynagrodze i prowizji otrzymywanych przez wszystkich pracownikw:
1 select sal, comm
2
from emp

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

Rozdzia 1. Odczytywanie rekordw

Odwoania do aliasw kolumn w klauzuli WHERE


Problem
Uywalimy ju aliasw do definiowania bardziej zrozumiaych nazw kolumn dla generowanych zbiorw wynikowych; tym razem chcielibymy dodatkowo wyczy cz wierszy za
pomoc klauzuli WHERE. Okazuje si jednak, e prba bezporedniego odwoania do nazw aliasw w tej klauzuli koczy si niepowodzeniem:
select sal as salary, comm as commission
from emp
where salary < 5000

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.

Wrmy do naszego przykadowego zapytania, w ktrym uylimy aliasu. Okazuje si, e


aliasy przypisane kolumnom w perspektywie wewntrznej mog by przedmiotem odwoa w zapytaniu zewntrznym. Dlaczego aliasy definiowane w perspektywie wewntrznej s
dla nas takie wane? Ot klauzula WHERE jest przetwarzana przed klauzul SELECT, zatem
aliasy SALARY i COMMISSION nie istniej w momencie wyznaczania klauzuli WHERE oryginalnego zapytania (klauzuli z warunkiem SALARY < 5000). Z drugiej strony, klauzula FROM
jest przetwarzana przed klauzul WHERE. Umieszczajc oryginalne zapytanie w klauzuli FROM,
spowodujemy, e niezbdne aliasy zostan zdefiniowane przed osigniciem skrajnie zewntrznej klauzuli WHERE, zatem bd widoczne dla tej klauzuli. Opisana technika jest szczeglnie
przydatna w sytuacji, gdy nazwy kolumny tabeli s niezrozumiae dla osb zmuszonych do
analizy uzyskiwanych danych.

Odwoania do aliasw kolumn w klauzuli WHERE

33

Perspektywa wewntrzna w prezentowanym rozwizaniu jest reprezentowana przez


alias X. Nie wszystkie bazy danych wymagaj reprezentowania wewntrznych perspektyw za pomoc definiowanych wprost aliasw, ale wszystkie bazy danych akceptuj tego rodzaju zabiegi skadniowe.

Konkatenacja wartoci kolumn


Problem
Chcemy zwraca wartoci skadowane w wielu kolumnach w formie pojedynczej kolumny.
Wyobramy sobie na przykad, e chcemy skonstruowa zapytanie, ktre na podstawie tabeli
EMP wygeneruje nastpujcy zbir wynikowy:
CLARK WORKS AS A MANAGER
KING WORKS AS A PRESIDENT
MILLER WORKS AS A CLERK

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.

DB2, Oracle, PostgreSQL


Systemy zarzdzania bazami danych DB2, Oracle, PostgreSQL wykorzystuj w roli operatorw
konkatenacji pary znakw pionowej linii:
1 select ename||' WORKS AS A '||job as msg
2
from emp
3 where deptno = 10

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

Rozdzia 1. Odczytywanie rekordw

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.

Stosowanie logiki warunkowej w wyraeniu SELECT


Problem
Chcemy wykonywa operacje IF-ELSE na wartociach zwrconych przez wyraenie SELECT.
Przykadowo, chcielibymy utworzy zbir wynikowy, w ktrym kolumna STATUS bdzie zawieraa warto UNDERPAID dla pracownikw zarabiajcych nie wicej ni 2000 dolarw, warto
OVERPAID dla pracownikw zarabiajcych co najmniej 4000 dolarw lub warto OK dla pracownikw, ktrych zarobki mieszcz si w przedziale od 2000 do 4000 dolarw. Zbir wynikowy
powinien mie nastpujc posta:
ENAME
SAL STATUS
---------- ---------- --------SMITH
800 UNDERPAID
ALLEN
1600 UNDERPAID
WARD
1250 UNDERPAID
JONES
2975 OK
MARTIN
1250 UNDERPAID
BLAKE
2850 OK
CLARK
2450 OK
SCOTT
3000 OK
KING
5000 OVERPAID
TURNER
1500 UNDERPAID
ADAMS
1100 UNDERPAID
JAMES
950 UNDERPAID
FORD
1000 OK
MILLER
1300 UNDERPAID

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

Stosowanie logiki warunkowej w wyraeniu SELECT

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.

Ograniczanie liczby zwracanych wierszy


Problem
Chcemy ograniczy liczb wierszy zwracanych przez nasze zapytanie. Nie interesuje nas porzdek wierszy w zbiorze wynikowym chcemy tylko, by ich liczba wynosia dokadnie n.

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

Rozdzia 1. Odczytywanie rekordw

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:

1. System Oracle zaczyna wykonywa nasze zapytanie.


2. System Oracle odczytuje ze wskazanej tabeli pierwszy wiersz i przypisuje licznikowi
warto 1.
3. Czy osignlimy ju limit piciu wierszy? Jeli nie, system Oracle zwrci dany wiersz,
poniewa zdefiniowane w klauzuli WHERE kryterium liczby wierszy mniejszej lub rwnej
5 jest spenione. Jeli tak, system Oracle nie zwrci kolejnego wiersza.
4. System Oracle odczytuje kolejny wiersz ze wskazanej tabeli i zwiksza warto licznika
wierszy (do 2, do 3, do 4 itd.).
5. Wr do kroku 3.
Z powyszego opisu wynika, e funkcja ROWNUM systemu Oracle przypisuje warto odpowiedniemu licznikowi po odczytaniu kolejnego wiersza. Sekwencja dziaa jest w tym przypadku
niezwykle istotna. Wielu programistw baz danych Oracle prbuje okrela, e zbir wynikowy powinien zawiera np. tylko pi wierszy za pomoc wyraenia ROWNUM = 5. Stosowanie warunku rwnociowego dla wartoci funkcji ROWNUM nie jest jednak dobrym rozwizaniem.
Poniej opisano procedur wykonywania zapytania zawierajcego w klauzuli WHERE warunek
ROWNUM <= 5:

1. System Oracle zaczyna wykonywa nasze zapytanie.


2. System Oracle odczytuje ze wskazanej tabeli pierwszy wiersz i przypisuje licznikowi
warto 1.
3. Czy osignlimy ju limit piciu wierszy? Jeli nie, system Oracle pomija dany wiersz,
poniewa zdefiniowane w klauzuli WHERE kryterium liczby wierszy rwnej 5 jest spenione.
Jeli tak, system Oracle zwrci dany wiersz. Warto jednak pamita, e odpowied na to
pytanie nigdy nie bdzie pozytywna!
4. System Oracle odczytuje kolejny wiersz ze wskazanej tabeli i przypisuje mu numer 1.
Wynika to z faktu, e pierwszy wiersz zwracany przez zapytanie zawsze musi by oznaczany numerem 1.
5. Wr do kroku 3.
Jeli dokadnie przeanalizujesz opisan powyej procedur, przekonasz si, dlaczego stosowanie
warunku rwnociowego ROWNUM = 5 nie przyniesie spodziewanych rezultatw. Nie moemy
przecie otrzyma zbioru wynikowego zoonego z piciu wierszy, jeli wczeniej nie dodamy
do tego zbioru wierszy od pierwszego do czwartego!

Ograniczanie liczby zwracanych wierszy

37

By moe si domylie, e warunek ROWNUM = 1 spowoduje zgodnie z oczekiwaniami


wygenerowanie jednowierszowego zbioru wynikowego, co pozornie jest sprzeczne z powyszymi wyjanieniami. Powodem prawidowej interpretacji warunku ROWNUM = 5 jest to, e okrelenie w systemie Oracle, czy dana tabela zawiera cho jeden wiersz, wymaga od tego systemu
odczytania tego wiersza. Jeli ponownie przeanalizujesz przedstawion powyej piciopunktow
procedur, zastpujc testowan liczb 5 liczb 1, zrozumiesz, dlaczego warunek ROWNUM = 1
prawidowo ogranicza liczno zbioru wynikowego do jednego wiersza.

Zwracanie n losowych rekordw tabeli


Problem
Chcemy zwrci okrelon liczb losowo wybranych rekordw tabeli. Naszym celem jest taka
modyfikacja poniszego wyraenia, ktra spowoduje, e nastpujce po sobie wywoania bd
zwracay rne zbiory, z ktrych kady bdzie si skada z piciu losowo wybranych wierszy:
select ename, job
from emp

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

Rozdzia 1. Odczytywanie rekordw

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.

Odnajdywanie wartoci pustych


Problem
Chcemy odnale wszystkie wiersze, ktre zawieraj wartoci puste w okrelonej kolumnie.

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

Odnajdywanie wartoci pustych

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.

Tumaczenie wartoci pustych na wartoci rzeczywiste


Problem
Mamy do czynienia z wierszami zawierajcymi wartoci puste i chcielibymy, aby w ich miejsce byy zwracane inne, konkretne wartoci.

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

Rozdzia 1. Odczytywanie rekordw

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

You might also like