You are on page 1of 224

Tytu oryginau: The Language of SQL

Tumaczenie: Beata Baszczyk


Projekt okadki: Studio Gravite / Olsztyn; Obarek, Pokoski, Pazdrijowski, Zaprucki
Materiay graficzne na okadce zostay wykorzystane za zgod Shutterstock Images LLC.
ISBN: 978-83-246-9357-3
2011 Course Technology, a part of Cengage Learning.
ALL RIGHTS RESERVED. No part of this work covered by the copyright herein may be reproduced, transmitted,
stored, or used in any form or by any means graphic, electronic, or mechanical, including but not limited to
photocopying, recording, scanning, digitizing, taping, Web distribution, information networks, or information storage and
retrieval systems, without the prior written permission of the publisher.
DB2, Informix, and IBM are registered trademarks of IBM Corporation. Oracle is a registered trademark of Oracle Corp.
MySQL is a registered trademark of MySQL AB. Sybase and SQL Anywhere are registered trademarks of Sybase Inc.
Access, Excel, Microsoft, SQL Server, and Windows are registered trademarks of Microsoft Corporation. Mac OS is
a registered trademark of Apple Inc. PostgreSQL is a trademark of PostgreSQL Inc and the Regents of the University
of California.
All other trademarks are the property of their respective owners.
All images Cengage Learning unless otherwise noted.
Polish edition copyright 2014 by Helion S.A. All rights reserved.
Wszelkie prawa zastrzeone. Nieautoryzowane rozpowszechnianie caoci lub fragmentu niniejszej publikacji
w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metod kserograficzn, fotograficzn, a take kopiowanie
ksiki na noniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji.
Wszystkie znaki wystpujce w tekcie s zastrzeonymi znakami firmowymi bd towarowymi ich wacicieli.
Autor oraz Wydawnictwo HELION dooyli wszelkich stara, by zawarte w tej ksice informacje byy kompletne i rzetelne. Nie
bior jednak adnej odpowiedzialnoci ani za ich wykorzystanie, ani za zwizane z tym ewentualne naruszenie praw patentowych
lub autorskich. Autor oraz Wydawnictwo HELION nie ponosz rwnie adnej odpowiedzialnoci za ewentualne szkody
wynike z wykorzystania informacji zawartych w ksice.
Wydawnictwo HELION
ul. Kociuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (ksigarnia internetowa, katalog ksiek)
Drogi Czytelniku!
Jeeli chcesz oceni t ksik, zajrzyj pod adres
http://helion.pl/user/opinie/jsqlpp_ebook
Moesz tam wpisa swoje uwagi, spostrzeenia, recenzj.
Pliki z przykadami omawianymi w ksice mona znale pod adresem: ftp://ftp.helion.pl/przyklady/jsqlpp.zip

Pole ksik na Facebook.com

Ksigarnia internetowa

Kup w wersji papierowej

Lubi to! Nasza spoeczno

Oce ksik

Dla Lisy

P ODZIKOWANIA

Rozpoczn od nawizania do zdania wypowiedzianego w 2002 roku w przeboju filmowym By sobie chopiec, bdcego angielskim przysowiem: nikt nie jest samotn
wysp. Jest to oczywicie prawda, jednak ja, piszc t ksik, osobicie dowiadczyem znaczenia tych sw. Dlatego te chciabym podzikowa za pomoc otrzyman od
osb, ktre porednio lub bezporednio wspieray mnie podczas pisania tej ksiki.
Po pierwsze, chciabym podzikowa wielu redaktorom z Cengage Learning, ktrzy
umiejtnie zweryfikowali i poprawili wiele aspektw tej ksiki w trakcie jej powstawania. Gdyby nie redaktor ds. nowych publikacji Mitzi Koontz, ta ksika dosownie
by nie powstaa, za Keith Davenport, mj redaktor techniczny, wykona znakomit prac, redagujc j. Dzikuj mu za jego liczne sugestie i dokonane poprawki. Wreszcie,
skadam podzikowania Marcie Justak, mojej redaktorce ds. projektu, ktra wspaniale
zoya wszystko w cao, nadajc projektowi profesjonalny wygld i dbajc jednoczenie o jego spjno.
Chciabym rwnie podzikowa dawnej koleance Mary Anne Schneider, dziki ktrej rozumiem sposb dziaania SQL, oraz innym wsppracownikom z ASAP Software,
ktrzy umoliwili mi samodzielne poszerzanie wiedzy.
Na koniec i w szczeglny sposb chciabym podzikowa wszystkim czonkom mojej
najbliszej rodziny za ich wsparcie podczas mojego zaangaowania w ten projekt
to jest Lisie, Steveowi, Danowi, Emily i Kyleowi.

S PIS TRECI

O autorze . ............................................................11
Wprowadzenie . .......................................................13
Rozdzia 1. Relacyjne bazy danych i SQL ...................................15
Jzyk i logika . ............................................................15
Definicja SQL .............................................................17
Microsoft SQL Server, Oracle i MySQL . ........................................17
Inne bazy danych . ........................................................19
Relacyjne bazy danych . ....................................................20
Klucze gwne i obce . .....................................................21
Typy danych . ............................................................22
Wartoci NULL . ..........................................................24
Znaczenie SQL . ..........................................................24
Co dalej? . ...............................................................25

Rozdzia 2. Podstawy pobierania danych ..................................27


Prosta instrukcja SELECT . ..................................................27
Uwagi dotyczce skadni . ..................................................28
Wybieranie kolumn . ......................................................29
Nazwy kolumn zawierajce spacje ............................................30
Co dalej? . ...............................................................31

Rozdzia 3. Obliczenia i aliasy . ...........................................33


Pola obliczane . ...........................................................33
Wartoci literau . .........................................................34
Obliczenia arytmetyczne . ..................................................35
Konkatenacja pl . ........................................................36
Aliasy kolumn . ...........................................................37
Aliasy tabel . .............................................................39
Co dalej? . ...............................................................40

Spis treci

Rozdzia 4. Korzystanie z funkcji . ........................................41


Zastosowanie funkcji . .....................................................41
Funkcje znakowe . ........................................................42
Funkcje zagniedone . ....................................................47
Funkcje daty i czasu . ......................................................48
Funkcje liczbowe . ........................................................50
Funkcje konwersji . ........................................................52
Co dalej? . ...............................................................54

Rozdzia 5. Sortowanie danych . .........................................55


Dodawanie sortowania . ...................................................55
Sortowanie danych w porzdku rosncym .....................................56
Sortowanie danych w porzdku malejcym . ...................................57
Sortowanie wzgldem wicej ni jednej kolumny . ..............................58
Sortowanie wzgldem pola obliczanego . .....................................58
Wicej na temat sekwencji sortowania . .......................................59
Co dalej? . ...............................................................62

Rozdzia 6. Logika obliczania wartoci wyjciowych w kolumnach . ...........63


Logika IF-THEN-ELSE . .....................................................64
Format prosty . ...........................................................64
Format przeszukujcy ......................................................66
Co dalej? . ...............................................................68

Rozdzia 7. Logika obliczania wartoci wyjciowych w wierszach . ............69


Zastosowanie kryteriw selekcji . ............................................69
Operatory klauzuli WHERE . .................................................71
Ograniczanie liczby zwracanych wierszy .......................................72
Ograniczanie liczby wierszy za pomoc sortowania . ............................73
Co dalej? . ...............................................................75

Rozdzia 8. Logika Boolea . .............................................77


Zoone warunki logiczne . .................................................77
Operator AND . ...........................................................78
Operator OR . ............................................................79
Zastosowanie nawiasw . ..................................................79
Zastosowanie wielu nawiasw . .............................................81
Operator NOT . ...........................................................82
Operator BETWEEN ........................................................84
Operator IN . .............................................................85
Logika Boolea a wartoci NULL ..............................................86
Co dalej? . ...............................................................88

Spis treci

Rozdzia 9. Dopasowywanie nieprecyzyjnie okrelonych wartoci . ...........89


Dopasowywanie do wzorca .................................................89
Znaki wieloznaczne . ......................................................92
Dopasowanie za pomoc brzmienia . .........................................94
Co dalej? . ...............................................................96

Rozdzia 10. Dokonywanie podsumowa ..................................99


Usuwanie duplikatw ......................................................99
Funkcje agregujce . ..................................................... 101
Funkcja COUNT . ........................................................ 103
Grupowanie danych . .................................................... 104
Grupowanie i sortowanie wzgldem kilku kolumn . ............................ 105
Kryteria selekcji w ramach agregacji ......................................... 107
Co dalej? . .............................................................. 109

Rozdzia 11. Zczenia wewntrzne tabel . ............................... 111


czenie dwch tabel . ................................................... 112
Zczenie wewntrzne . ................................................... 114
Kolejno tabel w zczeniach wewntrznych . ................................ 115
Alternatywna skadnia zcze wewntrznych . ............................... 116
Aliasy tabel cig dalszy . ................................................ 117
Co dalej? . .............................................................. 118

Rozdzia 12. Zczenia zewntrzne tabel . ............................... 119


Zczenie zewntrzne . ................................................... 120
Zczenia lewostronne . .................................................. 121
Weryfikacja wystpowania wartoci NULL .................................... 123
Zczenia prawostronne . ................................................. 124
Kolejno tabel w zczeniach zewntrznych .................................. 125
Zczenia pene . ........................................................ 126
Co dalej? . .............................................................. 128

Rozdzia 13. Zczenia zwrotne i widoki . ................................ 129


Zczenia zwrotne . ...................................................... 129
Tworzenie widokw . .................................................... 132
Pobieranie danych z widokw . ............................................ 133
Zalety stosowania widokw . .............................................. 134
Modyfikowanie i usuwanie widokw . ....................................... 136
Co dalej? . .............................................................. 137

Rozdzia 14. Podzapytania . ........................................... 139


Rodzaje podzapyta . .................................................... 139
Wykorzystanie podzapytania jako rda danych . ............................. 140
Wykorzystanie podzapytania w kryteriach selekcji . ............................ 143
Podzapytania skorelowane . ............................................... 144

Spis treci
Operator EXISTS . ........................................................ 146
Zastosowanie podzapytania do wyznaczenia wartoci kolumny obliczanej . ........ 147
Co dalej? . .............................................................. 148

Rozdzia 15. Logika zbiorw . .......................................... 149


Zastosowanie operatora UNION . ........................................... 150
Doczanie lub eliminowanie duplikatw za pomoc operatora UNION . ........... 152
Krzyowanie zapyta ..................................................... 154
Co dalej? . .............................................................. 156

Rozdzia 16. Procedury skadowane i parametryzacja . .................... 157


Tworzenie procedur skadowanych . ........................................ 158
Parametry w procedurze skadowanej . ...................................... 160
Wykonywanie procedur skadowanych . ..................................... 161
Modyfikowanie i usuwanie procedur skadowanych . ........................... 162
Funkcje cig dalszy . ................................................... 163
Co dalej? . .............................................................. 164

Rozdzia 17. Modyfikowanie danych . ................................... 165


Sposoby modyfikacji danych . ............................................. 165
Wstawianie danych . ..................................................... 166
Usuwanie danych . ...................................................... 170
Aktualizacja danych . ..................................................... 171
Aktualizacja danych w tabeli za pomoc podzapyta skorelowanych . ............. 172
Co dalej? . .............................................................. 174

Rozdzia 18. Utrzymanie tabel . ........................................ 175


Jzyk definicji danych . ................................................... 175
Atrybuty tabel . ......................................................... 176
Kolumny w tabelach . .................................................... 177
Klucze gwne i indeksy ................................................... 178
Klucze obce . ........................................................... 179
Tworzenie tabel . ........................................................ 180
Tworzenie indeksw . .................................................... 182
Co dalej? . .............................................................. 182

Rozdzia 19. Zasady projektowania baz danych . ......................... 183


Cele normalizacji . ....................................................... 184
W jaki sposb dokonywa normalizacji danych . .............................. 186
Sztuka projektowania bazy danych . ........................................ 190
Alternatywy dla normalizacji . .............................................. 191
Co dalej? . .............................................................. 193

Rozdzia 20. Sposoby prezentacji danych . ............................... 195


Kilka sw o warstwie prezentacji danych . ................................... 195
Narzdzia do raportowania i raporty krzyowe . ............................... 196

Spis treci
Arkusze kalkulacyjne i tabele przestawne . ................................... 198
Co dalej? . .............................................................. 200

Dodatek A. Praca z baz danych Microsoft SQL Server ..................... 203


Wstp . ................................................................ 203
Instalacja SQL Server Express 2014 i SQL Server Management Studio . ............. 204
Praca z SQL Server Management Studio ...................................... 204

Dodatek B. Praca z baz danych MySQL . ................................ 207


Wstp . ................................................................ 207
Instalacja MySQL Server oraz MySQL Workbench . ............................. 208
Praca z MySQL Workbench . ............................................... 209

Dodatek C. Praca z baz danych Oracle . ................................ 211


Wstp . ................................................................ 211
Instalacja Oracle Database Express Edition . .................................. 211
Praca z Oracle Database Express Edition . .................................... 212

Dodatek D. Lista wszystkich instrukcji SQL . ............................. 215


Skorowidz . ......................................................... 217

10

Spis treci

O AUTORZE

Larry Rockoff od wielu lat zajmuje si zagadnieniami zwizanymi z SQL oraz Business
Intelligence (BI). Jego gwny obszar zainteresowa obejmuje systemy oparte na hurtowniach danych oraz narzdzia do raportowania. Niedawno opracowa zestaw narzdzi
BI dla ASAP Software, bdcej spk zalen Dell Inc. Ukoczy studia MBA na Uniwersytecie Chicago ze specjalizacj nauki o zarzdzaniu.
Aby uzyska wicej informacji na temat dotychczasowej dziaalnoci autora lub skontaktowa si z nim, odwied stron LarryRockoff.com.

11

12

O autorze

W PROWADZENIE

Badania wykazay, e yjc pod presj czasu, wikszo czytelnikw ma tendencj do pomijania wstpu w kadej czytanej ksice i przechodzi od razu do pierwszego rozdziau.
Majc na uwadze ten fakt, we wstpie poruszymy jedynie stosunkowo mao wane zagadnienia, wyjaniajc, czego dowiesz si z tej ksiki oraz czego materia w niej zawarty nie obejmuje.
Po namyle dochodz jednak do wniosku, e by moe wstp ma jednak znaczenie,
wic rwnie dobrze moesz si z nim zapozna, zwaszcza e bdzie krtki.
Nawet jeli nie znasz jeszcze SQL, wystarczy powiedzie, e jest to skomplikowany jzyk, obejmujcy wiele elementw i funkcji. W tej ksice bdziemy koncentrowa si
na jednym gwnym zagadnieniu:
Jak korzysta z SQL w celu pobierania danych z bazy danych.
W mniejszym stopniu omwimy rwnie takie kwestie, jak:
sposoby aktualizowania danych w bazie danych,
sposoby budowania i utrzymywania baz danych,
sposoby projektowania relacyjnych baz danych,
strategie wywietlania danych po ich pobraniu.
W porwnaniu do innych pozycji wprowadzajcych w tematyk SQL niniejsz ksik
wyrniaj nastpujce cechy:
W trakcie zapoznawania si z materiaem zawartym w tej ksice nie bdzie konieczne pobieranie adnego oprogramowania ani praca przy komputerze.
Naszym zamiarem jest przedstawienie przykadw uycia SQL, ktre mona zrozumie, po prostu czytajc t ksik. W tekcie przedstawiono mae prbki danych,
ktre pozwol bez problemu pozna sposb dziaania instrukcji SQL.

13

14

Wprowadzenie

Metoda analogiczna do stosowanej podczas nauki jzyka obcego umoliwi Ci


nauk SQL w taki sam sposb, jakby uczy si jzyka angielskiego.
Tematy s zorganizowane w intuicyjny sposb i przedstawiane w logicznej kolejnoci. Sowa kluczowe SQL s wprowadzane po jednym naraz, dziki czemu rozbudowujesz swoj wiedz stopniowo, poznajc nowe sowa i pojcia.
W niniejszej ksice znajduj si odniesienia do skadni trzech powszechnie
stosowanych baz danych Microsoft SQL Server, MySQL i Oracle.
Jeeli midzy tymi trzema bazami danych wystpuj jakiekolwiek rnice, w gwnym
tekcie przedstawiono skadni Microsoft SQL Server. Specjalne ramki, zatytuowane Rnice w ramach innych baz danych, przedstawiaj i wyjaniaj wszelkie
rnice w skadni MySQL lub Oracle.
Szczeglny nacisk pooono na istotne aspekty SQL w kontekcie pobierania
danych.
Podejcie to jest przydatne dla tych, ktrzy potrzebuj uy jzyka SQL tylko
w poczeniu z narzdziem do raportowania.
Dodatkowo, ostatni rozdzia opisuje strategie wywietlania danych po ich pobraniu,
a take pomysy na wykorzystanie raportw krzyowych oraz tabel przestawnych.
Na koniec wstpu do niniejszej ksiki pozostaje nam odpowiedzie na nastpujce
pytanie: Jak wymawia SQL?
Tak naprawd s dwie moliwoci. Jedn z opcji jest wymwienie po prostu pojedynczych liter, czyli powiedzenie S-Q-L. Inna moliwo to wymwienie tego jako pojedynczego sowa siquel. Niektrzy twierdz, e tylko jeden z tych dwch sposobw
wymawiania jest poprawny, ale nie ma w tej kwestii porozumienia. Jest to w zasadzie
zwizane z osobistymi preferencjami.
Jeeli chodzi o znaczenie liter S-Q-L, wikszo zgadza si, e jest to strukturalny jzyk zapyta. Jednake s tacy, ktrzy twierdz, e skrtu SQL nie mona rozwin,
gdy jzyk ten wywodzi si ze stworzonego przez IBM starego jzyka o nazwie sequel,
ktra nie oznaczaa strukturalnego jzyka zapyta.
W kadym razie, zakoczylimy wprowadzenie. Teraz pora przej do waciwych
informacji.

Pliki do pobrania z uzupeniajcej strony internetowej


W dodatku D znajduj si opisy plikw dostpnych na uzupeniajcej stronie internetowej. Znajduje si w nich lista wszystkich instrukcji SQL oraz wszystkie dane prezentowane w niniejszej ksice.
Pliki do pobrania znajduj si pod adresem ftp://ftp.helion.pl/przyklady/jsqlpp.zip.

R OZ DZ I A 1

R ELACYJNE
BAZY DANYCH
I

SQL

W pierwszym rozdziale znajdziesz podstawowe informacje, ktre pozwol Ci szybko


rozpocz samodzielne pisanie instrukcji SQL w miar zapoznawania si z zagadnieniami
przedstawionymi w kolejnych rozdziaach. Porusz w nim dwa podstawowe tematy.
Po pierwsze, dokonam przegldu baz danych, do ktrych odniesienia znajdziesz w niniejszej ksice. Przedstawi rwnie kilka podstawowych informacji o tym, w jaki
sposb w tych bazach danych wykorzystywany jest jzyk SQL. Zwrc rwnie uwag
na pewne cechy tej ksiki, ktre pozwol Ci atwo okreli skadni SQL wykorzystywan w przypadku konkretnej bazy danych, ktrej uywasz.
Po drugie, omwi kilka kluczowych charakterystyk zwizanych z projektowaniem relacyjnych baz danych. Bdzie wic mowa o tabelach, wierszach, kolumnach, kluczach i typach danych. Gdy posidziesz ju podstawow wiedz, drogi Czytelniku, bdziesz mg
w krtkim czasie rozpocz prac z SQL. Nie zwlekajc wic ju duej, zaczynamy.

Jzyk i logika
Na wstpie chciabym si do czego przyzna tytu tej ksiki nie jest do koca odpowiedni. Chocia brzmi on: Jzyk SQL, by moe bardziej trafny byby taki: Logika
SQL. Twierdz tak dlatego, e podobnie jak w przypadku wszystkich jzykw programowania jzyk SQL ma znacznie wicej wsplnego z chodn, tward logik ni
z jzykiem angielskim.
Niemniej jednak w SQL mamy do czynienia ze skadni opart na jzyku, ktra odrnia go od wielu innych jzykw programowania. W przeciwiestwie do wielu narzdzi
programowania, SQL wykorzystuje zwyke angielskie sowa, takie jak WHERE, FROM czy

15

16

Rozdzia 1

Relacyjne bazy danych i SQL

HAVING, ktre stanowi sowa kluczowe w jego skadni. W rezultacie SQL ma charakter

bardziej jednoznaczny ni inne jzyki programowania, z ktrymi si spotkae.


Po zapoznaniu si z jzykiem SQL moesz wic odnie wraenie, e jego polecenia s
analogiczne do zda w jzyku angielskim i rwnie maj pewne ekspresyjne znaczenie.
Porwnaj na przykad ponisze zdanie:
Poprosz na wynos hamburgera i frytki z promocyjnego menu.

z instrukcj SQL:
Select miasto, wojewdztwo1
from klienci
order by wojewdztwo

Nie wchodzc na razie w szczegy, powysza instrukcja SQL oznacza, e chcemy wywietli pola z informacjami o miecie i wojewdztwie z tabeli zawierajcej dane
o klientach, znajdujcej si w naszej bazie danych. Ponadto, chcemy posortowa wyniki alfabetycznie wedug wojewdztwa.
W obu przypadkach okrelamy interesujce nas elementy (hamburger/frytki lub miasto/wojewdztwo), wskazujemy, skd chcemy je pozyska (promocyjne menu lub tabela z informacjami o klientach), oraz zamieszczamy dodatkowe instrukcje (przygotowanie zamwienia na wynos lub sortowanie wynikw wedug wojewdztwa).
Wanym celem tej ksiki jest nauka SQL w sposb analogiczny do nauki jzyka angielskiego, za pomoc prostych i intuicyjnych metod. Bd wprowadza po jednym nowym
pojciu zwizanym z SQL, jednoczenie rozbudowujc jego kontekst logiczny i znaczenie.
Tytu tej ksiki ma take inne, by moe mniej oczywiste znaczenie. Naley mie na
uwadze fakt, e czsto mylone s pojcia jzyka SQL oraz baz danych SQL. Istnieje wiele
firm komputerowych sprzedajcych oprogramowanie dla systemw zarzdzania bazami
danych (ang. DBMS Database Management Systems). Powszechnie bazy danych
w tego rodzaju pakietach oprogramowania s czsto okrelane jako bazy danych SQL
(ang. SQL databases), jako e jzyk SQL jest podstawowym narzdziem sucym do
zarzdzania samymi bazami danych i dostpem do danych w nich przechowywanych.
W nazwie baz danych niektrych producentw wystpuje nawet sowo SQL. Na przykad firma Microsoft swj najnowszy system zarzdzania baz danych nazwaa SQL
Server 2014.
Jednak, w gruncie rzeczy, SQL jest raczej jzykiem. Nie jest to baza danych. Dlatego
te w niniejszej ksice skupi si na scharakteryzowaniu jzyka SQL, nie za na konkretnej bazie danych.
1

W przykadach zawartych w niniejszej ksice zarwno w nazwach tabel, jak i kolumn zastosowano polskie znaki diakrytyczne. Nie jest to jednak zalecane w przypadku realizacji rzeczywistych
projektw, m.in. ze wzgldu na moliwe problemy z kodowaniem tego rodzaju znakw w realnie
istniejcych bazach danych przyp. tum.

Definicja SQL

Definicja SQL
Czym wic jest SQL? W skrcie, SQL jest standardowym jzykiem programowania
wykorzystywanym w celu utrzymywania danych zawartych w relacyjnych bazach danych i korzystania z nich. Mwic prociej, SQL to jzyk, ktry pozwala uytkownikom na interakcj z relacyjnymi bazami danych. Poczwszy od 1970 roku, przez wiele lat
by rozwijany przez rne organizacje. W 1986 roku Amerykaski Instytut Normalizacyjny (ang. ANSI American National Standards Institute) opublikowa swj pierwszy zestaw norm dotyczcych jzyka SQL i od tego czasu wielokrotnie je aktualizowa.
Oglnie rzecz biorc, jzyk SQL skada si z trzech gwnych elementw. Pierwszy z nich
nosi nazw DML lub jzyka manipulowania danymi (ang. Data Manipulation Language).
Obejmuje on zestaw instrukcji wykorzystywanych do pobierania, aktualizacji, dodawania i usuwania danych z bazy danych. Drugi element to DDL bd jzyk definicji
danych (ang. Data Definition Language). Umoliwia on tworzenie lub modyfikowanie
struktur bazy danych. Na przykad w ramach jzyka definicji danych wystpuje instrukcja ALTER, ktra pozwala modyfikowa tabele w bazie danych. Wreszcie trzeci
komponent jzyka SQL to DCL lub jzyk kontroli danych (ang. Data Control Language),
pozwalajcy zarzdza bezpieczestwem dostpu do obiektw bazy danych.
Wielu kluczowych producentw oprogramowania, takich jak Microsoft i Oracle, dostosowao standard SQL do wasnych potrzeb i dodao do niego liczne rozszerzenia
i modyfikacje. Jednak mimo e kady dostawca w wyjtkowy sposb interpretuje SQL,
podstawy tego jzyka pozostaj niezmienione i wsplne dla wszystkich producentw
oprogramowania. Ten wanie zakres zostanie omwiony w tej ksice.
Jako jzyk programowania, SQL rni si od pozostaych jzykw, takich jak Visual
Basic lub C++, ktre by moe znasz. Inne jzyki maj zazwyczaj charakter proceduralny.
Oznacza to, e umoliwiaj okrelenie pewnych procedur w celu osignicia podanych wynikw. SQL jest raczej jzykiem deklaratywnym, w ktrym cel do osignicia
zazwyczaj deklarowany jest za pomoc pojedynczej instrukcji. W SQL moliwe jest
zastosowanie prostszej struktury, poniewa jest on wykorzystywany jedynie w kontekcie relacyjnych baz danych, a nie szeroko rozumianych systemw komputerowych.

Microsoft SQL Server, Oracle i MySQL


Mimo e moim celem jest przedstawienie podstawowych elementw jzyka SQL, ktre
s wykorzystywane podczas wszystkich wdroe systemw opartych na relacyjnej bazie
danych, przedstawi take konkretne przykady skadni SQL. Majc jednak na uwadze
fakt, e skadnia SQL ustanawiana przez poszczeglnych dostawcw nieco si od siebie rni, zdecydowaem si skupi na skadni tego jzyka wykorzystywanej przez nastpujce trzy bazy danych:

17

18

Rozdzia 1

Relacyjne bazy danych i SQL

Microsoft SQL Server,


Oracle Database,
MySQL.
Gdy midzy tymi trzema bazami danych wystpi jakie rnice, w tekcie ksiki
przedstawiona zostanie skadnia stosowana w Microsoft SQL Server. Wszelkie rnice
w skadni wystpujce w przypadku MySQL oraz Oracle zostan zaprezentowane w ramce, tak jak poniej:
R N I CE W R AM A CH IN NY CH BA Z DA NY CH

Tego typu ramka pojawi si zawsze, gdy prezentowane bd rnice w skadni w przypadku bazy danych Oracle lub MySQL. Skadnia dla Microsoft SQL Server zostanie umieszczona w tekcie gwnym.
W nagwku ramki znajdzie si informacja, czy opisane w niej rnice wystpuj w skadni MySQL,
Oracle czy te w obu tych bazach danych.
Microsoft SQL Server jest dostpny w kilku wersjach i edycjach. Najnowsza wersja to
Microsoft SQL Server 2014. Producent oferuje edycje od podstawowej, o nazwie Express,
do edycji Enterprise, zawierajcej peny zakres funkcjonalnoci. Wersja Express jest
darmowa, ale zawiera mnstwo funkcji, ktre pozwalaj rozpocz przygod z budowaniem bazy danych. Wersja Enterprise ma wiele wyrafinowanych funkcji sucych
do zarzdzania baz danych, a take zaawansowane komponenty do analiz business
intelligence.
Oracle rwnie jest dostpny w wielu wersjach. Najnowsza wersja to Oracle Database
12c. Jak w przypadku baz danych Microsoft, Oracle rwnie oferuje bezpatn edycj
Express swojej bazy danych.
MySQL to baza danych typu open source. Oznacza to, e nie jest wasnoci adnej
organizacji. aden podmiot nie sprawuje rwnie pieczy nad jej rozwojem. Chocia Sun
Microsystems w 2008 roku zakupi MySQL, baza ta pozostaje jednym z najczciej
wybieranych rodzajw oprogramowania typu open source. Sun Microsystems zosta
pniej zakupiony przez Oracle. Jako baza danych typu open source, MySQL jest dostpna na wielu platformach innych ni Windows, takich jak Mac OS X i Linux. Community
Edition to baza danych MySQL, ktr mona pobra za darmo.
Zaczynajc prac z bazami danych, czasami warto wczeniej pobra wybran baz danych, aby mc powiczy budowanie instrukcji SQL z wykorzystaniem znajdujcych
si w niej tabel. Jednak w celu przyswojenia wiedzy zawartej w niniejszej ksice nie
musisz tego robi. Zostaa ona napisana w taki sposb, aby nauczy si posugiwania
jzykiem SQL w trakcie jej czytania. W tekcie zamieszcz ponadto wystarczajc ilo
danych, ktre umoliwi Ci zrozumienie wynikw rnych instrukcji SQL bez koniecznoci pobierania oprogramowania i samodzielnego wpisywania i wykonywania
prezentowanych instrukcji.

Inne bazy danych

Niemniej jednak, jeli chciaby pobra darmowe wersje ktrejkolwiek z wymienionych baz danych, pierwsze trzy dodatki na kocu tej ksiki zawieraj kilka przydatnych wskazwek i porad, jak to zrobi. Dodatek A przedstawia kompletne informacje
o tym, jak rozpocz prac z Microsoft SQL Server. Zawarta w nim instrukcja prezentuje szczegowe informacje na temat instalowania oprogramowania i wykonywania polece SQL. Analogicznie, dodatek B dotyczy bazy danych MySQL, za dodatek C
objania sposb postpowania w przypadku bazy danych Oracle.
Dodatek D zawiera materia dodatkowy list wszystkich polece SQL przedstawionych
w tej ksice, wystpujcych we wszystkich trzech bazach danych. Jak wspomniano
wczeniej, wszystkie zawarte tu instrukcje SQL bd prezentowane z uwzgldnieniem
skadni Microsoft SQL Server. W wikszoci przypadkw instrukcje te bd rwnie
dziaa w MySQL i Oracle, ale istniej pewne odstpstwa.
Wikszo czytelnikw uzna za cakowicie zbdne zarwno pobieranie oprogramowania, jak i zapoznawanie si z zawartoci dodatku D. Przykady pokazane w ksice
s oczywiste i nie wymagaj zagldania do dodatkowych rde wiedzy w celu zrozumienia prezentowanego materiau. Jednak jeeli masz tak potrzeb, zachcamy Ci
do skorzystania z dodatkowych materiaw w dodatku D.

Inne bazy danych


Poza Microsoft SQL Server, Oracle i MySQL istnieje wiele innych implementacji bazy
danych SQL. Niektre z bardziej popularnych pakietw to:
Microsoft Access firmy Microsoft,
DB2 firmy IBM,
Informix, rwnie stworzony przez IBM,
SQL Anywhere firmy Sybase,
PostgreSQL, ktra jest baz danych typu open source.
Z wymienionych powyej baz danych do wyjtkowy jest Microsoft Access. W szczeglnoci przydaje si osobom pocztkujcym w wiecie SQL, ktre chc nauczy si tego
jzyka. W istocie, Access jest graficznym interfejsem dla relacyjnych baz danych. Innymi
sowy, umoliwia on utworzenie kwerendy do relacyjnej bazy danych przy wykorzystaniu
interfejsu graficznego. Uytecznym aspektem Accessa dla pocztkujcych jest moliwo atwego utworzenia kwerendy poprzez jej wizualizacj, a nastpnie przeczenie si
na widok SQL, aby zobaczy wanie utworzon instrukcj SQL. Mona w ten sposb tworzy rne kwerendy, a nastpnie od razu sprawdza, jak wyglda ich skadnia SQL.
Innym wyrnikiem Accessa w porwnaniu do wymienionych powyej baz danych
jest to, e baza ta jest instalowana lokalnie i jako taka wykazuje du elastyczno.
Mona j wykorzysta nie tylko do utworzenia bazy danych znajdujcej si w caoci

19

20

Rozdzia 1

Relacyjne bazy danych i SQL

w jednym pliku na Twoim komputerze, ale rwnie do podczenia si do bardziej


skomplikowanych baz danych utworzonych za pomoc innych narzdzi, takich jak
Microsoft SQL Server.

Relacyjne bazy danych


Omwmy teraz podstawy relacyjnych baz danych oraz sposb ich dziaania.
Zasadniczo, relacyjna baza danych jest zbiorem danych przechowywanych w dowolnej
liczbie tabel. Termin relacyjne (ang. relational) jest wykorzystywany w celu wskazania,
e tabele s ze sob powizane. Wemy pod uwag prosty przykad bazy danych skadajcej si tylko z dwch tabel: Klienci i Zamwienia. Tabela Klienci zawiera po jednym rekordzie dla kadego klienta, ktry kiedykolwiek zoy zamwienie. Tabela
Zamwienia zawiera jeden rekord dla kadego zoonego zamwienia. Kada tabela
moe mie dowoln liczb pl, ktre s uywane do przechowywania rnych atrybutw zwizanych z kadym rekordem. Na przykad tabela Klient moe zawiera takie
pola jak Imi czy Nazwisko.
W tym momencie przydatna moe okaza si wizualizacja kilku tabel i zawartych w nich
danych. Zwyczajowo tabele przedstawia si jako siatk skadajc si z wierszy i kolumn.
Kady wiersz oznacza rekord, natomiast kada kolumna reprezentuje pole w tabeli.
Grny wiersz w nagwku zazwyczaj zawiera nazwy pl. W pozostaych wierszach
znajduj si waciwe dane.
W terminologii SQL rekordy i pola w rzeczywistoci nosz nazw wierszy (ang. rows)
i kolumn (ang. columns), odpowiadajc ich wizualnej reprezentacji. Odtd zatem w celu
opisania budowy tabel w relacyjnych bazach danych bdziemy uywali terminw wiersze
i kolumny zamiast rekordy i pola.
Spjrzmy na przykad najprostszej moliwej relacyjnej bazy danych. W tej bazie danych istniej tylko dwie tabele, Klienci i Zamwienia. Oto, jak mogyby wyglda:
Tabela Klienci:
IDKlienta

Imi

Nazwisko

Jan

Kowalski

Andrzej

Nowak

Anna

Kwiatkowska

Tabela Zamwienia:
IDZamwienia

IDKlienta

KwotaZamwienia

50,00

60,00

33,50

20,00

Klucze gwne i obce

W powyszym przykadzie tabela Klienci zawiera trzy kolumny: IDKlienta, Imi


i Nazwisko. Kady z trzech wierszy tabeli prezentuje dane trzech rnych osb: Jana
Kowalskiego, Andrzeja Nowaka i Anny Kwiatkowskiej. Kady wiersz reprezentuje innego
klienta, a kada kolumna zawiera inny fragment informacji o nim. Podobnie, w tabeli
Zamwienia znajduj si trzy kolumny, ale cztery wiersze. Oznacza to, e w bazie danych istniej cztery zamwienia i trzy przypisane do nich atrybuty.
Oczywicie, jest to bardzo prosty przykad, majcy za zadanie pokaza, jaki typ danych
moe by przechowywany w rzeczywistej bazie danych. Na przykad, tabela Klienci
zazwyczaj zawiera wiele dodatkowych kolumn, opisujcych inne atrybuty klienta, takie
jak miasto, wojewdztwo, kod pocztowy i telefon. Podobnie tabela Zamwienia zazwyczaj zawiera kolumny opisujce dodatkowe atrybuty zamwienia, takie jak data zamwienia, warto podatku obrotowego oraz informacje o sprzedawcy, ktry przyj
zamwienie.

Klucze gwne i obce


Zwr uwag na pierwsz kolumn w kadej tabeli: IDKlienta w tabeli Klienci
i IDZamwienia w tabeli Zamwienia. Kolumny te s zwykle okrelane jako klucze gwne
(ang. primary keys). Klucze gwne s przydatne, a wrcz niezbdne z dwch powodw.
Po pierwsze, pozwalaj one jednoznacznie zidentyfikowa pojedynczy wiersz w tabeli.
Na przykad, gdyby chcia pobra wiersz dla Jana Kowalskiego, wystarczy po prostu
uy kolumny IDKlienta, aby wywietli takie dane. Klucze gwne zapewniaj rwnie
unikalno. Oznaczenie kolumny IDKlienta jako klucza gwnego gwarantuje, e w tej
kolumnie znajdowa si bdzie unikalna warto dla kadego wiersza w tabeli. Nawet
jeli w bazie danych znajd si dwie osoby o takim samym imieniu i nazwisku, na przykad Jan Kowalski, w obu tych wierszach w kolumnie IDKlienta bd wystpoway
rne wartoci.
W powyszym przykadzie wartoci w kolumnach z kluczem gwnym nie oznaczaj
niczego szczeglnego. W tabeli Klienci kolumna IDKlienta zawiera wartoci 1, 2 i 3
dla trzech wierszy w tabeli. Czsto jest tak, e tabele bazy danych s zaprojektowane w taki
sposb, aby kolumny z kluczem gwnym wraz z dodawaniem kolejnych wierszy wypeniane byy automatycznie generowanymi numerami sekwencyjnymi. Ta cecha projektowa zwykle jest okrelana jako automatyczny przyrost (ang. auto-increment).
Drugim powodem zastosowania kluczy gwnych jest to, e pozwalaj w atwy sposb
poczy jedn tabel z inn. W naszym przykadzie kolumna IDKlienta w tabeli
Zamwienia wskazuje na odpowiadajcy jej wiersz w tabeli Klienci. Patrzc na czwarty
wiersz tabeli Zamwienia, mona zauway, e w kolumnie IDKlienta wystpuje warto 3. Oznacza to, e to zamwienie odnosi si do klienta z IDKlienta o numerze 3,
czyli do Anny Kwiatkowskiej. Wykorzystanie wsplnych kolumn midzy tabelami jest
istotnym elementem projektowania w relacyjnych bazach danych.

21

22

Rozdzia 1

Relacyjne bazy danych i SQL

Oprcz jedynie wskazania tabeli Klienci, kolumna IDKlienta w tabeli Zamwienia


moe zosta oznaczona jako klucz obcy (ang. foreign key). Zagadnieniem kluczy obcych
zajm si szczegowo w rozdziale 18. Na razie po prostu zapamitaj, e klucze obce
mog by zdefiniowane w celu zapewnienia, e kolumna ma poprawn warto. Przykadem moe by sytuacja, gdy nie chcesz, aby kolumna IDKlienta w tabeli Zamwienia miaa
warto, dla ktrej nie istnieje odpowiednik w kolumnie IDKlienta w tabeli Klienci.
Takie ograniczenie jest moliwe dziki oznaczeniu kolumny jako klucza obcego.

Typy danych
Za pomoc kluczy gwnych i obcych tworzona jest struktura tabel bazy danych.
Dziki nim tabele s ze sob poprawnie powizane, a take moliwy jest dostp do
wszystkich tabel w bazie danych. Inn wan cech kadej kolumny w tabeli jest typ
przechowywanych w niej danych.
Typy danych s po prostu sposobem definiowania rodzaju danych zawartych w kolumnie.
Typ danych trzeba okreli dla kadej kolumny w kadej tabeli. Niestety, w ramach
rnych relacyjnych baz danych dozwolone jest uycie zrnicowanych typw danych,
ktre maj okrelone znaczenie. Na przykad kada z relacyjnych baz danych Microsoft
SQL Server, MySQL i Oracle ma ponad 30 rnych dozwolonych typw danych.
Omwienie kadego dostpnego typu danych z uwzgldnieniem wszelkich zwizanych
z nim niuansw byoby niemoliwe, nawet jeli mowa jest tylko o trzech bazach danych
podanych powyej. Dokonam jednak pewnego streszczenia tego tematu, charakteryzujc gwne kategorie typw danych, ktre wystpuj w wikszoci baz danych. Gdy
tylko zapoznasz si z istotnymi typami danych w tych kategoriach, nie bdziesz mia
wikszych problemw z innymi, z ktrymi moesz si zetkn w przyszoci.
Oglnie rzecz ujmujc, istniej trzy fundamentalne typy danych: liczbowy, znakowy
oraz daty i czasu.
Typy danych liczbowych (ang. numeric datatypes) wystpuj pod rnymi postaciami
w formie bitw, liczb cakowitych, dziesitnych i rzeczywistych. Bity (ang. bits) s typami danych liczbowych, ktre pozwalaj na okrelenie tylko dwch wartoci 0 i 1.
S one czsto uywane w celu okrelenia, e dany atrybut ma przyjmowa wycznie
wartoci typu prawda lub fasz. Typ danych okrelajcy liczby cakowite (ang. integers)
wskazuje na liczby bez miejsc po przecinku, natomiast typy danych dla liczb dziesitnych (ang. decimals) mog zawiera wartoci dziesitne po przecinku. W odrnieniu
od bitw, liczb cakowitych i dziesitnych, wartoci liczb rzeczywistych (ang. real) s
podawane jedynie w przyblieniu, wedug wewntrznie ustalonych zasad. Jedn wyrniajc cech wszystkich typw danych liczbowych jest to, e mog one by uwzgldnione w obliczeniach arytmetycznych. Oto kilka reprezentatywnych przykadw typw danych liczbowych z Microsoft SQL Server, MySQL i Oracle.

Typy danych

Oglny opis

Typ danych w
Microsoft SQL Server

Typ danych
w MySQL

Typ danych
w Oracle

Przykad

bit (ang. bit)

bit

bit

(brak)

liczba cakowita (ang. integer)

int

int

number

43

liczba dziesitna (ang. decimal)

decimal

decimal

number

58,63

liczba rzeczywista (ang. real)

float

float

number

80,62345

Typy danych znakowych (ang. character) s czasem okrelane jako acuchy znakw
(ang. strings) lub cigi znakw (ang. character strings). W odrnieniu od typw danych liczbowych, znakowe typy danych nie ograniczaj si do liczb. Mog zawiera
jakiekolwiek litery lub cyfry, a nawet znaki specjalne, takie jak gwiazdki. Gdy za pomoc instrukcji SQL uzupeniana jest warto w kolumnie o typie znakowym, zawsze
musi by podawana w pojedynczym cudzysowie. W przypadku typw danych liczbowych nigdy nie naley uywa cudzysowu. Poniej znajduje si kilka przykadw
prezentujcych typy danych znakowych.
Typ danych w Microsoft
SQL Server

Typ danych
w MySQL

Typ danych
w Oracle

Przykad

zmienna dugo
(ang. variable length)

varchar

varchar

varchar2

'Thomas Edison'

staa dugo
(ang. fixed length)

char

char

char

'60601'

Oglny opis

Wyglda na to, e drugi przykad (60601) moe by typem danych liczbowych, poniewa
skada si wycznie z cyfr. Nie jest to nic niezwykego. Mimo e kody pocztowe
w Stanach Zjednoczonych skadaj si jedynie z cyfr, zazwyczaj definiowane s jako
znakowe typy danych, poniewa nigdy nie ma potrzeby wykonywania oblicze arytmetycznych z ich udziaem.
Typy danych zwizanych z dat i czasem (ang. date/time) s wykorzystywane do prezentowania dat i czasu. Podobnie jak typy danych znakowych, musz by podawane w pojedynczym cudzysowie. Na tym typie danych moliwe jest wykonywanie specjalnych
oblicze; na przykad mona uy specjalnej funkcji, aby obliczy liczb dni pomidzy
dwiema datami zawierajcymi zarwno dat, jak i czas. Oto kilka przykadw typw
danych zwizanych z dat i czasem:
Oglny opis

Typ danych w
Microsoft SQL Server

Typ danych
w MySQL

Typ danych
w Oracle

Przykad

data (ang. date)

date

date

(brak)

'2009-07-15'

data i czas
(ang. date and time)

datetime

datetime

date

'2009-07-15 08:48:30'

23

24

Rozdzia 1

Relacyjne bazy danych i SQL

Wartoci NULL
Inn wan cech poszczeglnych kolumn w tabeli jest to, czy kolumna moe zawiera
wartoci null. Warto null oznacza, e nie ma danych dla okrelonego elementu danych. Dosownie, pole takie nie zawiera adnych danych. Wartoci null nie s tym
samym, co spacje i puste pola. Logicznie rzecz ujmujc, wartoci null i spacje s
traktowane inaczej. Niuanse zwizane z pobieraniem danych, ktre zawieraj wartoci
null, zostan szczegowo omwione w rozdziale 8.
Podczas wywietlania danych z wartociami null wiele baz danych SQL wywietli sowo
NULL napisane wielkimi literami. Dzieje si tak po to, aby uytkownik wiedzia, e dana
kolumna zawiera warto null, a nie spacje. W caej ksice bd trzyma si tej konwencji i uywa pisowni NULL, aby podkreli, e reprezentuje ona unikalny typ wartoci.
Klucze gwne w bazie danych nie mog zawiera wartoci NULL. Jest tak, poniewa
klucze gwne, zgodnie z definicj, musz zawiera unikalne wartoci.

Znaczenie SQL
Zanim zakoczymy omawianie tematu relacyjnych baz danych, chciabym przedstawi
troch historii, aby uwiadomi Ci przydatno relacyjnych baz danych i znaczenie SQL.
W epoce kamienia w dziedzinie informatyki (lata 60. XX wieku) dane zazwyczaj przechowywane byy na tamie magnetycznej lub w plikach na dyskach. Programy komputerowe, napisane w jzykach takich jak FORTRAN i COBOL, zwykle odczytyway dane
za porednictwem plikw wejciowych i dokonyway przetwarzania w trybie jednego
rekordu naraz, na koniec przenoszc dane do plikw wyjciowych. Przetwarzanie byo
zawsze zoone, poniewa procedury musiay zosta podzielone na wiele pojedynczych
etapw, obejmujcych tabele tymczasowe, sortowanie i wielokrotne przetwarzanie
danych do momentu otrzymania prawidowego wyniku.
W latach 70., wraz z pojawieniem si hierarchicznych i sieciowych baz danych i rozpoczciem korzystania z nich, dokona si postp. Dziki skomplikowanemu systemowi
wewntrznych wskanikw bazy danych nowszego typu uatwiy odczytywanie danych.
Na przykad, program mg odczyta rekord z informacjami o kliencie, automatycznie
wskazujc wszystkie zamwienia danego klienta, a nastpnie szczegy kadego z tych
zamwie. Jednak w zasadzie odbywao si to nadal zgodnie z zasad przetwarzania
w danym momencie tylko jednego rekordu.
Przed pojawieniem si relacyjnych baz danych gwnym problemem nie byo to, w jaki
sposb dane byy przechowywane, ale jak wyglda dostp do nich. Prawdziwy przeom w zwizku z relacyjnymi bazami danych nadszed wraz z pojawieniem si jzyka
SQL, poniewa umoliwi on dostp do danych w zupenie inny sposb.

Co dalej?

W przeciwiestwie do wczeniej stosowanych metod pobierania danych, SQL umoliwia


uytkownikowi dostp do duego zbioru danych w tym samym momencie. Za pomoc jednej instrukcji polecenie SQL mogo pobra lub zaktualizowa tysice rekordw
w wielu tabelach. W ten sposb proces ten sta si duo mniej zoony. Nie byy ju
potrzebne programy komputerowe do odczytywania jednego rekordu naraz w specjalnej sekwencji przy jednoczesnym podejmowaniu decyzji o tym, co naley zrobi
z kadym rekordem. To, co do tej pory wymagao setek linii kodu programowania,
mogo by teraz realizowane za pomoc zaledwie kilku linii okrelonej logiki.

Co dalej?
W tym rozdziale przedstawiono podstawowe informacje o relacyjnych bazach danych,
ktre stanowi podwaliny pod gwne zagadnienie, ktrym bdziemy si zajmowa,
czyli pobieranie danych z baz danych. Omwilimy kilka wanych cech relacyjnych baz
danych, takich jak klucze gwne, klucze obce i typy danych. Wspomnielimy rwnie
o tym, e moliwe jest wystpienie w danych wartoci NULL. Uzupenimy t wiedz
w rozdziale 8., natomiast w rozdziale 18. powrcimy do oglnych zagadnie zwizanych
z utrzymaniem bazy danych. Rozdzia 19. powicony jest projektowaniu baz danych.
Dlaczego najwaniejszy temat projektowania baz danych omwiony zostanie w niniejszej ksice dopiero kilkanacie rozdziaw dalej? W rzeczywistym wiecie bazy danych s projektowane i tworzone, zanim maj miejsce jakiekolwiek prby pobierania
danych. Dlaczego miabym zatem nie poda t sam drog w tej ksice? Krtko mwic, doszedem do wniosku, e o wiele bardziej produktywne jest zgbienie zagadnie
zwizanych z SQL bez zaprztania sobie gowy szczegami dotyczcymi projektowania baz danych, ktre nosi znamiona zarwno sztuki, jak i nauki. Ponadto, zasady
projektowania baz danych bd znaczy o wiele wicej po zapoznaniu si ze szczegami i niuansami zwizanymi z pobieraniem danych. Na razie wic zignorujemy zagadnienia zwizane z projektowaniem baz danych i w nastpnym rozdziale przejdziemy
od razu do kwestii pobierania danych.

25

26

Rozdzia 1

Relacyjne bazy danych i SQL

R OZ DZ I A 2

P ODSTAWY
POBIERANIA
DANYCH
NOWE SOWA KLUCZOWE: SELECT, FROM

W tym rozdziale rozpoczniemy analiz najwaniejszego zagadnienia w SQL pobierania danych z bazy danych. Niewane, czy mowa o duej czy o maej firmie, najczciej programici SQL proszeni s o raporty. Oczywicie, zaadowanie danych do bazy
danych nie jest prostym zadaniem. Jednak gdy dane znajd si ju w bazie, analitycy
biznesowi staraj si wydoby z nich jak najwicej cennych informacji. W ten oto sposb zaczyna si przygoda z SQL oraz odkrywanie jego uytecznoci.
Nacisk w niniejszej ksice na pobieranie danych jest odpowiedzi na rzeczywiste wymagania w stosunku do programistw SQL. Typowych analitykw nie interesuje to,
w jaki sposb dane znajd si w bazie danych, ale jak pozyska z tych danych informacje. Aby Twoja znajomo SQL pomoga firmie, w ktrej pracujesz, pozna informacje
ukryte w bazie danych, bdziesz musia odby dug podr.

Prosta instrukcja SELECT


Pobieranie danych w SQL umoliwia instrukcja SELECT. Pomijajc wstpne wyjanienia, oto najprostszy przykad takiej instrukcji:
SELECT * FROM Klienci

W jzyku SQL, podobnie jak we wszystkich jzykach programowania, istniej pewne


sowa kluczowe (ang. keywords). Sowa te maj szczeglne znaczenie i musz by stosowane w okrelony sposb. W powyszej instrukcji sowa SELECT i FROM s wanie sowami kluczowymi. Sowo kluczowe SELECT oznacza, e rozpoczyna si instrukcja SELECT.

27

28

Rozdzia 2

Podstawy pobierania danych

Sowo kluczowe FROM jest uywane do okrelenia tabeli, z ktrej pobierane bd dane.
Nazwa tabeli wystpuje po FROM. W tym przypadku nazwa tabeli to Klienci.
Jak nakazuje zwyczaj, sowa kluczowe bd pisa wielkimi literami. Dziki temu bd
lepiej widoczne.
Symbol gwiazdki (*) w tym przykadzie jest specjalnym symbolem, ktry oznacza
wszystkie kolumny.
Podsumowujc, powysz instrukcj naley rozumie nastpujco: Wybierz wszystkie
kolumny z tabeli Klienci.
Gdyby tabela Klienci wygldaa nastpujco:
IDKlienta

Imi

Nazwisko

ZakupionaIlo

Jan

Kowalski

Piotr

Nowak

10

Barbara

Kwiatkowska

wwczas powysza instrukcja SELECT zwrciaby dane jak poniej:


IDKlienta

Imi

Nazwisko

ZakupionaIlo

Jan

Kowalski

Piotr

Nowak

10

Barbara

Kwiatkowska

Innymi sowy, zwracana jest caa zawarto tabeli.


W pierwszym rozdziale wspomniaem, e do powszechnej praktyki naley okrelenie
klucza gwnego dla wszystkich tabel. W poprzednim przykadzie tego typu kolumn
jest kolumna IDKlienta. Zaznaczyem rwnie, e klucze gwne s czasami definiowane
poprzez automatyczne wygenerowanie numerw tworzcych sekwencj liczb w momencie, gdy do tabeli dodawane s wiersze. Miao to miejsce w poprzednim przykadzie. W wikszoci przykadowych danych, ktre znajd si w tej ksice, wystpowa bdzie podobna kolumna bdca kluczem gwnym, ktrego warto bdzie przyrastaa
automatycznie. Zgodnie z konwencj na og jest to pierwsza kolumna w tabeli.

Uwagi dotyczce skadni


Podczas pisania instrukcji SQL naley pamita o dwch rzeczach. Po pierwsze, w przypadku sw kluczowych nie jest uwzgldniana wielko liter. Sowo SELECT jest traktowane identycznie jak select czy Select.
Po drugie, instrukcja SQL moe by napisana w dowolnej liczbie wierszy. Na przykad, nastpujca instrukcja SQL:
SELECT * FROM Klienci

Wybieranie kolumn

jest traktowana tak samo jak:


SELECT *
FROM Klienci

Dobrym zwyczajem jest rozpoczynanie kadej oddzielnej linii sowem kluczowym.


Gdy dojdziemy do bardziej zoonych instrukcji SQL, uatwi to szybkie uchwycenie
ich sensu.
Wreszcie, gdy bd przedstawia w tej ksice rne instrukcje SQL, obok nich znajdzie si czsto zarwno konkretny przykad, jak i bardziej oglny format danej instrukcji. Na przykad oglny format poprzedniej instrukcji wygldaby tak:
SELECT *
FROM tabela

Na ogln instrukcj wskazywa bdzie kursywa. Napisane kursyw sowo tabela oznacza, e w tym miejscu moesz wpisa nazw dowolnej tabeli. Zatem gdy w jakiejkolwiek instrukcji SQL w tej ksice zobaczysz sowa napisane kursyw, bdzie to po prostu
oznaczao, e w tym miejscu mona umieci wybrany przez siebie element danego
typu lub wyraenie.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

Wiele implementacji SQL wymaga rednika (;) na kocu kadej instrukcji. Dzieje si tak w przypadku
MySQL i Oracle, ale nie jeli chodzi o Microsoft SQL Server. Dla uproszczenia w niniejszej ksice bd przedstawia instrukcje SQL bez rednikw. Jeli wic uywasz MySQL lub Oracle, bdziesz musia doda rednik na kocu kadej instrukcji. Przykadowo, wyej prezentowana instrukcja wygldaaby nastpujco:
SELECT *
FROM Klienci;

Wybieranie kolumn
Do tej pory wywietlalimy jedynie wszystkie dane wystpujce w danej tabeli. A jeli
chcielibymy wybra tylko niektre kolumny? Pracujc na danych z tabeli okrelonej
powyej, mgby chcie wywietli na przykad tylko nazwisko klienta. Instrukcja
SELECT wygldaaby wwczas nastpujco:
SELECT Nazwisko
FROM Klienci

a uzyskane w ten sposb dane byyby takie:


Nazwisko
Kowalski
Nowak
Kwiatkowska

29

30

Rozdzia 2

Podstawy pobierania danych

Jeli chcesz wybra wicej ni jedn, ale nie wszystkie kolumny, instrukcja SELECT mogaby wyglda tak:
SELECT
Imi,
Nazwisko
FROM Klienci

a wynik powyszego zapytania byby taki:


Imi

Nazwisko

Jan

Kowalski

Piotr

Nowak

Barbara

Kwiatkowska

Oglny format dla tego rodzaju instrukcji to:


SELECT lista_kolumn
FROM tabela

Wane jest, aby zapamita, e gdy chcemy wyszczeglni wicej ni jedn kolumn
w licie_kolumn, podawane przez nas kolumny musz by oddzielone przecinkami.
Zauwa rwnie, e kad kolumn na licie_kolumn umiecilimy w oddzielnym wierszu. Dziki temu instrukcja SQL jest bardziej czytelna.

Nazwy kolumn zawierajce spacje


Co zrobi, jeli kolumna zawiera spacj w nazwie? Powiedzmy na przykad, e kolumna ZakupionaIlo zostaa zamiast tego okrelona jako Zakupiona Ilo (ze spacj
midzy dwoma sowami). Oczywiste jest, e nastpujca instrukcja nie bdzie dziaa:
SELECT
Zakupiona Ilo
FROM Klienci

Instrukcja ta zostanie uznana za niepoprawn, jako e Zakupiona i Ilo nie s nazwami kolumn istniejcych w tabeli. Nawet jeli takie kolumny by w niej istniay, musiayby by oddzielone przecinkiem. Rozwizaniem tego problemu jest uycie znaku
specjalnego po obu stronach nazwy kolumny zawierajcej spacje. Znak ten moe by
rny w zalenoci od tego, ktrej bazy danych uywasz. W przypadku Microsoft SQL
Server wykorzystywany jest nawias kwadratowy. Zatem poprawna skadnia powyszego
zapytania bdzie nastpujca:
SELECT
[Zakupiona Ilo]
FROM Klienci

Jedna dodatkowa uwaga dotyczca skadni: Tak jak sowa kluczowe nie s wraliwe na
wielko liter, tak i w przypadku nazw tabel i kolumn nie jest ona uwzgldniana. Powyszy przykad jest zatem rwnoznaczny z ponisz instrukcj:

Co dalej?
SELECT
[zakupiona ilo]
FROM klienci

W celu zachowania przejrzystoci w niniejszej ksice wszystkie sowa kluczowe pisane bd wielkimi literami, natomiast nazwy tabel i kolumn rozpoczyna si bd wielk liter. Nie jest to jednak konieczne do prawidowego dziaania instrukcji SQL.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

W przypadku MySQL znakiem wstawianym po obu stronach nazw kolumn zawierajcych spacje jest
znak akcentu sabego (`). Skadnia dla powyszego przykadu wygldaaby nastpujco:
SELECT
`Zakupiona Ilo`
FROM Klienci;

W Oracle znakiem tym jest podwjny cudzysw. Skadnia w tym przypadku byaby nastpujca:
SELECT
"Zakupiona Ilo"
FROM Klienci;

Naley zaznaczy, e w przeciwiestwie do Microsoft SQL Server i MySQL, w Oracle w nazwach kolumn
otoczonych podwjnym cudzysowem istotna jest wielko liter. Oznacza to, e poprzednia instrukcja
nie jest rwnoznaczna z ponisz:
SELECT
"ZAKUPIONA ILO"
FROM Klienci;

Co dalej?
W tym rozdziale rozpoczlimy nauk korzystania z instrukcji SELECT w celu pobrania
danych. Poznalimy podstawow skadni i dowiedzielimy si, jak wybra konkretne
kolumny. W rzeczywistoci jednak jeszcze niewiele jestemy w stanie zrobi, aby nasze
instrukcje sprawdziy si w praktyce. Co najistotniejsze, nie nauczylimy si jeszcze,
jak zastosowa dowolny rodzaj kryteriw wyboru do naszych instrukcji pobierajcych
dane. Na przykad wiemy, jak wybra wszystkich klientw, lecz nie znamy jeszcze sposobu na wybranie tylko klientw z wojewdztwa pomorskiego.
Tak si skada, e kryteria selekcji omwi dopiero w rozdziale 7. Czym wic bdziemy si zajmowa do tego momentu? W kilku nastpnych rozdziaach bdziemy rozbudowywa nasz wiedz odnonie wykorzystania skadnika lista_kolumn w instrukcji
SELECT. W nastpnym rozdziale przejd zatem do omwienia kolejnych sposobw selekcji
kolumn, pozwalajcych na tworzenie skomplikowanych oblicze w jednej kolumnie.
Porusz rwnie zagadnienia zwizane ze sposobami zmiany nazw kolumn, aby stay si
bardziej opisowe.

31

32

Rozdzia 2

Podstawy pobierania danych

Podobnie, zapoznajc si z rozdziaem 4., 5. i 6., rozbudujesz swoje umiejtnoci tworzenia jeszcze bardziej skomplikowanych i uytecznych list_kolumn. Gdy wic w kocu dojdziemy do tematu kryteriw selekcji, bdziesz ju dysponowa penym arsenaem technik.

R OZ DZ I A 3

O BLICZENIA
I ALIASY
NOWE SOWA KLUCZOWE: AS

Zagadnienia omawiane w tym rozdziale pozwol Ci na przedstawienie odbiorcom pobranych przez Ciebie danych w bardziej wygodny i ciekawy sposb. Gwn technik,
ktr zaprezentujemy, jest technika pl obliczanych (ang. calculated fields). Pozwala
ona na wykonywanie oblicze na pojedynczych elementach danych, ktre s pobierane z bazy danych.
Przy zastosowaniu tego podejcia nazwy klienta mog by sformatowane zgodnie z naszymi wymaganiami. Wykonane i przedstawione mog by take obliczenia specyficzne
dla Twojej firmy lub organizacji. Jako programista SQL czsto potrzebujesz moliwoci dostosowania zawartoci poszczeglnych kolumn, aby zawarte w nich dane stay
si lepszym nonikiem informacji. Pola obliczane s bardzo przydatnymi narzdziami,
ktre pomog Ci osign ten cel.

Pola obliczane
Wybierajc dane, nie jestemy ograniczeni tylko do wyboru kolumn, ktre akurat znajduj si w danej tabeli. Koncepcja pl obliczanych daje nam wiele innych moliwoci.
Dziki tej technice moemy:
wybra okrelone sowa lub wartoci,
wykonywa obliczenia na jednej lub wielu kolumnach,
czy ze sob kolumny i wartoci literau.
Spjrzmy na kilka przykadw. Wszystkie bd dotyczy poniszej tabeli Zamwienia:

33

34

Rozdzia 3

Obliczenia i aliasy

IDZamwienia

Imi

Nazwisko

ZakupionaIlo

CenaZaSztuk

Jan

Kowalski

2,50

Piotr

Nowak

10

1,25

Barbara

Kwiatkowska

4,00

Wartoci literau
Nasz pierwszy przykad pola obliczanego tak naprawd nie oblicza adnej wartoci. Wybierzemy okrelon warto jako kolumn, mimo e warto literau nie ma nic wsplnego z danymi w tabeli. Tego typu wyraenie nosi wanie nazw wartoci literau (ang.
literal value). Oto przykad:
SELECT
'Imi:',
Imi
FROM Zamwienia

Powysza instrukcja zwrci nastpujce dane:


(no column name)

Imi

Imi:

Jan

Imi:

Piotr

Imi:

Barbara

Za pomoc powyszej instrukcji wybieramy dwa elementy danych. Pierwszym z nich jest
warto literau 'Imi:'. Naley zauway, e pojedyncze cudzysowy wskazuj na uycie
wartoci literau o typie znakowym. Drugi element danych to zawarto kolumny Imi.
Zwr uwag na dwie rzeczy. Po pierwsze, warto literau Imi: jest powtarzana w kadym wierszu. Po drugie, w pierwszej kolumnie nie ma informacji o jej nagwku.
Po uruchomieniu instrukcji w Microsoft SQL Server nagwek kolumny przyjmie
warto (No column name), oznaczajc brak nazwy kolumny. Nagwek nie ma nazwy, poniewa jest to pole obliczane. Nie istnieje nazwa kolumny, ktra mogaby by
uyta w tym nagwku.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

Zarwno w MySQL, jak i w Oracle nagwek kolumny zawierajcej wartoci literau przyjmie okrelon
warto. W MySQL nagwek pierwszej kolumny z powyszego przykadu bdzie mia nastpujc posta:
Imi:

Natomiast w Oracle przyjmie on warto:


'IMI:'

Mgby teraz zapyta, dlaczego wiersz nagwka jest w ogle istotny. Jeli korzystasz
z instrukcji SELECT, aby tylko wywietli dane w programie komputerowym, wwczas

Obliczenia arytmetyczne

najprawdopodobniej nagwek nie jest dla Ciebie wany. Potrzebujesz tylko danych.
Jednake jeli uywasz instrukcji SELECT w celu pobrania danych do raportu, ktry
w formie drukowanej czy na ekranie komputera wywietlany jest uytkownikowi, wwczas nagwek moe okaza si istotny. Gdy uytkownicy patrz na dane w kolumnie, na
og chc przecie wiedzie, jakie dane ta kolumna zawiera. W przypadku wartoci literau w rzeczywistoci kolumnie nie jest przypisywane adne znaczenie, wic nagwek
nie jest tak naprawd konieczny. Jednak w przypadku innych rodzajw pl obliczanych kolumnie moe by przypisana sensowna etykieta. W dalszej czci tego rozdziau
omwimy pojcie aliasw kolumn, dziki ktrym w takim przypadku mona przypisa kolumnie nagwek.
Oprcz moliwoci przypisania kolumnie nagwka, gdy taki nie wystpuje, aliasy
kolumn pozwalaj take na zmian nazwy kolumny na tak, ktra moe by bardziej
zrozumiaa dla osoby przegldajcej dane. Na przykad projektant bazy danych mg
nada kolumnie z nazwiskami niezrozumia nazw LstNm222. Dziki aliasowi kolumny
moemy zmieni t nazw na tak, ktra w lepszy sposb opisze zawarto kolumny.
Pozostaa jeszcze jedna uwaga dotyczca wartoci literau. By moe pomylae, e
wszystkie wartoci literau musz by ujte w cudzysw, jednak nie zawsze tak jest.
Na przykad, uruchamiajc ponisz instrukcj:
SELECT
5,
Imi
FROM Zamwienia

otrzymamy nastpujce dane:


(no column name)

Imi

Jan

Piotr

Barbara

Mimo e warto literau rwna 5 jest w tym kontekcie cakowicie pozbawiona sensu,
jest poprawna. Poniewa nie zostaa zawarta w cudzysowie, jest interpretowana jako
warto liczbowa.

Obliczenia arytmetyczne
Wrmy do bardziej typowego przykadu pola obliczanego. Obliczenia arytmetyczne
umoliwiaj wykonywanie kalkulacji z udziaem jednej lub wicej kolumn w tabeli.
Na przykad ponisza instrukcja:
SELECT
IDZamwienia,
ZakupionaIlo,

35

36

Rozdzia 3

Obliczenia i aliasy

CenaZaSztuk,
ZakupionaIlo * CenaZaSztuk
FROM Zamwienia

zwrci nastpujce dane:


IDZamwienia

ZakupionaIlo

CenaZaSztuk

(no column name)

2,50

10,00

10

1,25

12,50

4,00

20,00

Pierwsze trzy kolumny z powyszej instrukcji SELECT nie rni si niczym od tego, co
ju wczeniej zaprezentowaem. Czwarta kolumna to kolumna obliczana, zawierajca
nastpujce wyraenie arytmetyczne:
ZakupionaIlo * CenaZaSztuk

W tym przypadku gwiazdka jest symbolem, ktry oznacza mnoenie. Nie oznacza
wic wszystkich kolumn, tak jak miao to miejsce w poprzednim rozdziale. Oprcz
gwiazdki moliwe jest zastosowanie kilku innych operatorw arytmetycznych. Najczciej wykorzystywane tego typu operatory to:
Operator arytmetyczny

Znaczenie operatora

dodawanie

odejmowanie

mnoenie

dzielenie

Zauwa rwnie, e tak jak w przypadku wartoci literau czwarta kolumna nie
ma nagwka. Dzieje si tak dlatego, e skada si ona z dwch kolumn.

Konkatenacja pl
Konkatenacja (ang. concatenation) to wyszukany termin w informatyce, ktry oznacza
poczenie lub doczenie do siebie danych o typie znakowym. Tak jak operacje arytmetyczne mog by przeprowadzane na danych liczbowych, tak dane znakowe moemy czy ze sob, dokonujc operacji konkatenacji. Skadnia konkatenacji moe
przyjmowa rn posta, w zalenoci od bazy danych, z ktr pracujesz. Oto przykad z Microsoft SQL Server:
SELECT
IDZamwienia,
Imi,
Nazwisko,
Imi + ' ' + Nazwisko
FROM Zamwienia

Aliasy kolumn

Powysza instrukcja zwrci nastpujce dane:


IDZamwienia

Imi

Nazwisko

(no column name)

Jan

Kowalski

Jan Kowalski

Piotr

Nowak

Piotr Nowak

Barbara

Kwiatkowska

Barbara Kwiatkowska

Ponownie, pierwsze trzy kolumny s ju nam znane. Czwarta kolumna to wynik wyraenia:
Imi + ' ' + Nazwisko

Znak plus oznacza konkatenacj. Poniewa w naszym przypadku operacja dodawania


dotyczy raczej danych o typie znakowym, a nie danych liczbowych, SQL potrafi rozpozna, e znak plus oznacza tu wanie konkatenacj, a nie dodawanie. W tym przypadku skada si ona z trzech elementw: kolumny Imi, spacji (' ') oraz kolumny
Nazwisko. Spacja pomidzy tymi kolumnami jest konieczna, aby np. Jan Kowalski nie
zosta wywietlony jako JanKowalski.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

W MySQL do oznaczenia konkatenacji nie jest wykorzystywany aden symbol (taki jak np. +), jednak
konieczne jest zastosowanie funkcji o nazwie CONCAT. Przyjrzymy si tej funkcji w nastpnym rozdziale, a ponisz instrukcj w MySQL potraktujmy jako przedsmak dalszych rozwaa:
SELECT
IDZamwienia,
Imi,
Nazwisko,
CONCAT(Imi, ' ', Nazwisko)
FROM Zamwienia;

W Oracle zamiast znaku plus (+) do oznaczenia konkatenacji wykorzystywane s dwie pionowe kreski
(||). Odpowiednio, instrukcja SQL w Oracle wygldaaby nastpujco:
SELECT
IDZamwienia,
Imi,
Nazwisko,
Imi || ' ' || Nazwisko
FROM Zamwienia;

Aliasy kolumn
We wszystkich poprzednich przykadach w niniejszym rozdziale widzielimy pola obliczane bez nazwy w nagwku. Teraz odpowiemy na pytanie, w jaki sposb moemy doda nazw w nagwku dla tego typu kolumn. W tym celu naley uy aliasu kolumny.
Termin alias (ang. alias) oznacza alternatywn nazw. Poniej znajduje si przykad
uycia aliasu kolumny w wersji powyszej instrukcji SELECT dla Microsoft SQL Server:

37

38

Rozdzia 3

Obliczenia i aliasy

SELECT
IDZamwienia,
Imi,
Nazwisko,
Imi + ' ' + Nazwisko AS 'Nazwa'
FROM Zamwienia

Zwr uwag, e alias kolumny ('Nazwa') zosta ujty w pojedynczy cudzysw. Wynik powyszej instrukcji jest nastpujcy:
IDZamwienia

Imi

Nazwisko

Nazwa

Jan

Kowalski

Jan Kowalski

Piotr

Nowak

Piotr Nowak

Barbara

Kwiatkowska

Barbara Kwiatkowska

Czwarta kolumna ma teraz nagwek. Sowo kluczowe AS jest stosowane w celu okrelenia aliasu kolumny, ktry podawany jest bezporednio po nim.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

Odpowiednikiem powyszej instrukcji w MySQL jest:


SELECT
IDZamwienia,
Imi,
Nazwisko,
CONCAT(Imi, ' ', Nazwisko) AS 'Nazwa'
FROM Zamwienia;

Oracle nie wymaga podania aliasu z nazw kolumny w pojedynczym cudzysowie. Jednake jeli alias
kolumny zawiera spacje, konieczne jest uycie podwjnego cudzysowu. Ta sama instrukcja w Oracle
miaaby posta:
SELECT
IDZamwienia,
Imi,
Nazwisko,
Imi || ' ' || Nazwisko AS Nazwa
FROM Zamwienia;

Poza okreleniem nazwy nagwka dla pola obliczanego aliasy kolumn s czsto wykorzystywane, gdy kolumna w tabeli ma niezrozumia nazw, ktr chcemy zmieni.
Jeli na przykad tabela zawiera kolumn o nazwie ZamIl, mona wykona nastpujc
instrukcj, aby wywietli t kolumn pod nazw Zamwiona Ilo:
SELECT
ZamIl AS 'Zamwiona Ilo'
FROM tabela

Aliasy tabel

Aliasy tabel
Poza zapewnieniem alternatywnych nazw kolumn, mona rwnie okreli aliasy dla
tabel, uywajc tego samego sowa kluczowego AS. Istniej trzy gwne powody korzystania z aliasw tabel.
Pierwszy z nich dotyczy tabel z niejasnymi lub skomplikowanymi nazwami. Na przykad, jeli tabela nosi nazw Zamwienia123, mona uy nastpujcej instrukcji SELECT,
aby nada jej alias Zamwienia.
SELECT
Nazwisko
FROM Zamwienia123 AS Zamwienia

W przeciwiestwie do aliasw kolumn, aliasy tabel nie s ujmowane w cudzysowy.


Posugujc si aliasami tabel, masz moliwo wykorzystania aliasu jako przedrostka
dla wszystkich wybranych przez Ciebie kolumn. Na przykad powysza instrukcja
mogaby mie posta:
SELECT
Zamwienia.Nazwisko
FROM Zamwienia123 AS Zamwienia

Przed kolumn Nazwisko zosta dodany przedrostek Zamwienia. Od nazwy kolumny


oddziela go kropka. W tej sytuacji zastosowanie przedrostka nie byo konieczne. Jednake gdy dane s pobierane z wielu tabel, czasami dodanie go bdzie konieczne.
Przekonamy si o tym w kolejnych rozdziaach.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W Oracle aliasy tabel s podawane bez zastosowania sowa kluczowego AS. Skadnia powyszej instrukcji w Oracle wygldaaby nastpujco:
SELECT
Zamwienia.Nazwisko
FROM Zamwienia123 Zamwienia;

Pozostae dwa powody korzystania z aliasw tabel zostan omwione w rozdziaach 11.
i 14. S to sytuacje, w ktrych:
Dane pochodz z kilku tabel.
W instrukcji SELECT korzystamy z podzapytania.
Znaczenie terminu podzapytanie (ang. subquery) zostanie objanione w rozdziale 14.,
gdy bdziemy szczegowo zajmowa si tym zagadnieniem.

39

40

Rozdzia 3

Obliczenia i aliasy

Co dalej?
W tym rozdziale zapoznae si z trzema prostymi sposobami tworzenia pl obliczanych za porednictwem instrukcji SELECT. Po pierwsze, aby w wyniku uruchomienia
instrukcji SELECT otrzyma konkretne sowa lub wartoci, mona skorzysta z wartoci
literau. Po drugie, dziki obliczeniom arytmetycznym moliwe jest wykonywanie oblicze na jednej lub wielu kolumnach. Po trzecie, moemy uy konkatenacji, aby poczy
ze sob kolumny lub wartoci literau. Ponadto, omwilimy temat pokrewny zastosowania aliasw kolumn, ktre czsto wystpuj w powizaniu z polami obliczanymi.
W nastpnym rozdziale przejdziemy do tematu funkcji, ktre umoliwiaj wykonywanie bardziej skomplikowanych oblicze. Jak wspomniano powyej, na razie nie bdziemy jeszcze potrafili zastosowa w naszych instrukcjach kryteriw selekcji. W kolejnych rozdziaach nadal bd rozbudowywa zakres zastosowa listy_kolumn w instrukcji
SELECT. Nie martw si jednak. Ani si obejrzysz, jak dojdziemy do pasjonujcych zagadnie. Twoja cierpliwo wobec zastosowanego przeze mnie metodycznego podejcia wkrtce si opaci.

R OZ DZ I A 4

K ORZYSTANIE
Z FUNKCJI
NOWE SOWA KLUCZOWE: LEFT, RIGHT, SUBSTRING, LTRIM, RTRIM, CONCAT,
UPPER, LOWER, GETDATE/NOW/CURRENT_DATE, DATEPART/DATE_FORMAT,
DATEDIFF, ROUND, RAND, PI, CAST, ISNULL/IFNULL/NVL

Uytkownicy arkuszy kalkulacyjnych, takich jak Microsoft Excel, maj wiadomo


tego, e za porednictwem udostpnionych w nich funkcji mog skorzysta z licznych
funkcjonalnoci tego rodzaju oprogramowania. Bez moliwoci korzystania z funkcji
wikszo danych dostpnych w arkuszach kalkulacyjnych miaaby ograniczon warto. To samo mona powiedzie o SQL. Dziki znajomoci niektrych funkcji SQL,
nalecych do najczciej uywanych, bdziesz mia wiksze moliwoci generowania
dynamicznych wynikw dla uytkownikw Twoich raportw.
Niniejszy rozdzia przedstawia szerok gam niektrych z najczciej uywanych funkcji
nalecych do czterech rnych kategorii: funkcje znakowe, funkcje daty i czasu, funkcje liczbowe oraz konwersji. Ponadto, bdziemy mwi o funkcjach zagniedonych,
ktre cz wiele funkcji w jednym wyraeniu.

Zastosowanie funkcji
Dziki funkcjom mamy moliwo dokonywania operacji na danych w podobny sposb, jak w przypadku wykonywanych w poprzednim rozdziale oblicze. Dowiedzielimy
si, e obliczenia s wykonywane na wielu polach, zarwno z wykorzystaniem operatorw arytmetycznych, takich jak mnoenie, jak i za pomoc konkatenacji. Funkcje natomiast s czsto stosowane w odniesieniu do pojedynczej kolumny.
Co to jest funkcja? Funkcja to po prostu regua transformacji pojedynczej wartoci
(lub kilku wartoci) do innej wartoci, przy uyciu okrelonego wzoru. Na przykad
funkcja SUBSTRING moe zosta uyta do okrelenia pierwszej litery w imieniu JOANNA,
41

42

Rozdzia 4

Korzystanie z funkcji

ktr jest litera J. Istniej dwa rodzaje funkcji: skalarne i agregujce. Termin skalarne
(ang. scalar) jest terminem matematycznym i odnosi si do operacji, ktra jest wykonywana na pojedynczej wartoci. W jzyku programowania oznacza to, e funkcja ta
jest wykonywana na danych w jednym wierszu. Na przykad funkcja LTRIM usuwa spacje wystpujce z przodu okrelonej wartoci.
W przeciwiestwie do funkcji skalarnych, funkcje agregujce (ang. aggregate) s wykonywane na wikszych zestawach danych. Na przykad funkcja SUM moe by zastosowana do obliczenia sumy wszystkich wartoci z okrelonej kolumny. Poniewa funkcje
agregujce stosuje si do zbiorw lub grup danych, ich omawianie bdziemy kontynuowa w rozdziale 10.
W ramach kadej bazy danych SQL mamy do dyspozycji dziesitki funkcji skalarnych.
Funkcje te rni si znacznie w zalenoci od bazy danych, a take pod wzgldem ich
nazewnictwa czy sposobu dziaania. Dlatego omwimy tylko kilka reprezentatywnych
przykadw niektrych z bardziej przydatnych funkcji.
Najczciej wykorzystywane rodzaje funkcji skalarnych mona podzieli na trzy kategorie: funkcje znakowe, funkcje daty i czasu oraz funkcje liczbowe. Oczywicie, chodzi
o funkcje, ktre pozwalaj wykonywa operacje odpowiednio na danych o typie znakowym, daty i czasu oraz liczbowym.
Ponadto, zapoznasz si z kilkoma przydatnymi funkcjami konwersji, ktre wykorzystywane s do konwertowania danych o okrelonym typie na inny.

Funkcje znakowe
Funkcje znakowe pozwalaj na dokonywanie operacji na danych o typie znakowym.
Tak jak typy danych znakowych nazywane s czasami acuchami znakw (ang. string
datatypes), funkcje znakowe niekiedy okrelane s mianem acuchowych (ang. string
functions). W niniejszym rozdziale omwionych zostanie osiem przykadw funkcji
znakowych: LEFT, RIGHT, SUBSTRING, LTRIM, RTRIM, CONCAT, UPPER, LOWER.
Ponadto, zamiast pobiera dane z okrelonych tabel, skorzystam z instrukcji SELECT,
za pomoc ktrej wybierane bd tylko wartoci literau. Zacznijmy od naszego pierwszego przykadu, prezentujcego dziaanie funkcji LEFT. Gdy wykonamy ponisze polecenie SQL:
SELECT
LEFT ('jasnoniebieski',5) AS 'Wynik'

otrzymamy:
Wynik
jasno

Funkcje znakowe

Zmieniem nazw kolumny za pomoc aliasu, aby uzyskany wynik by przyjemniejszy dla
oka. Zauwa, e w powyszej instrukcji SELECT nie ma klauzuli FROM. Zamiast pobiera
dane z tabeli, wybieramy w tym przypadku dane z pojedynczej wartoci literau jasnoniebieski. cile mwic, klauzula FROM nie jest konieczna w instrukcji SELECT, cho
w praktyce rzadko tak si dzieje. Umieciem powyej instrukcj SELECT zapisan wanie
w taki sposb, bez klauzuli FROM, aby jedynie uatwi zilustrowanie dziaania funkcji.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W przeciwiestwie do Microsoft SQL Server i MySQL, w Oracle zastosowanie klauzuli FROM jest konieczne w przypadku kadej instrukcji SELECT. Gdyby wszystkie przykady z niniejszego rozdziau miay zosta uruchomione na bazie danych Oracle, musiaaby zosta do nich dodana klauzula FROM. Jednake
tabela podana w tej klauzuli nie musi istnie. W Oracle dostpna jest specjalna utworzona automatycznie tabela o nazwie DUAL. Korzystanie z tabeli DUAL zostanie zilustrowane w dalszej czci tego rozdziau.
Przyjrzyjmy si teraz bardziej szczegowo formatowi funkcji LEFT, ktry wyglda nastpujco:
LEFT (WartoZnakowa, LiczbaZnakw)

Wszystkie funkcje w swojej definicji maj okrelone argumenty (ang. arguments) podawane w nawiasach. Na przykad powysza funkcja LEFT zawiera dwa argumenty
WartoZnakowa i LiczbaZnakw. Termin argument jest powszechnie stosowany w matematyce, w ktrej stanowi skadnik funkcji i nie ma adnego zwizku z argumentem
wygaszanym podczas dyskusji. Zasadniczo, kada funkcja jest wyjtkowa i to wanie
rne argumenty, ktre s zdefiniowane dla danej funkcji, w rzeczywistoci nadaj jej
znaczenie. W przypadku funkcji LEFT oba argumenty, WartoZnakowa i LiczbaZnakw,
s konieczne do zdefiniowania tego, co ma by wynikiem tej funkcji.
Funkcja LEFT ma dwa argumenty, natomiast inne funkcje mog mie mniej lub wicej
argumentw. Istniej nawet takie, ktre w ogle ich nie maj. Jednak nawet gdy jest taka
moliwo, we wszystkich funkcjach po sowie kluczowym wystpuj nawiasy. Dziki
nim wiadomo, e mamy do czynienia z funkcj, a nie z innym elementem jzyka SQL.
Wzr na funkcj LEFT sownie mona opisa w nastpujcy sposb: We okrelon
WartoZnakow, wybierz wskazan LiczbZnakw, poczwszy od lewej strony, i zwr wynik. W podanym przykadzie funkcja z podanej WartociZnakowej 'jasnoniebieski'
wybraa pierwszych pi znakw z lewej strony. Wynik, ktry otrzymalimy, to sowo
jasno.
Najwaniejsze to pamita o tym, e dla kadej funkcji, ktrej chcemy uy, trzeba bdzie
sprawdzi w dokumentacji bazy danych, ile zawiera argumentw i co one oznaczaj.
Drug funkcj znakow, ktr omwimy, jest funkcja RIGHT. Jej definicja jest analogiczna do definicji funkcji LEFT, z wyjtkiem tego, e w przypadku funkcji RIGHT wskazujemy liczb znakw do wywietlenia, poczwszy od prawej strony. Na przykad:

43

44

Rozdzia 4

Korzystanie z funkcji

SELECT
RIGHT ('jasnoniebieski',9) AS Wynik

zwraca:
Wynik
niebieski

W tym przypadku naley poda LiczbZnakw rwn 9. Gdybymy podali liczb 5, jak
w poprzednim przykadzie, wynikiem naszej instrukcji byyby znaki ieski.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W Oracle nie wystpuj funkcje LEFT i RIGHT. Analogiczn funkcjonalno w przypadku tej bazy danych zapewnia uycie funkcji SUBSTR, ktra zostanie omwiona pniej.
Musisz zdawa sobie spraw z faktu, e dane o typie znakowym czsto zawieraj spacje po prawej stronie. Spjrzmy na poniszy przykad, w ktrym jednowierszowa tabela zawiera kolumn o nazwie Prezydent. Dugo tej kolumny to 20 znakw.
Prezydent
Jerzy Waszyngton

Jeli wykonamy nastpujc instrukcj SELECT na powyszej tabeli:


SELECT
RIGHT (Prezydent,10) AS Nazwisko
FROM tabela1

otrzymamy wynik:
Nazwisko
yngton

Chcielimy, aby zwrcona zostaa warto Waszyngton, podczas gdy otrzymalimy jej
fragment yngton. Dlaczego tak si stao? Otrzymalimy tak warto, poniewa caa
kolumna ma dugo 20 znakw. Po prawej stronie wartoci Jerzy Waszyngton s jeszcze
cztery spacje. Dlatego te, gdy chcemy wywietli pierwszych 10 znakw od prawej
strony, uwzgldnione zostan te cztery spacje oraz 6 kolejnych znakw pochodzcych
z wartoci Jerzy Waszyngton. Wkrtce przekonasz si, e aby otrzyma podane
przez Ciebie dane, konieczne bdzie zastosowanie funkcji RTRIM.
By moe teraz zastanawiasz si, w jaki sposb mgby pobra dane ze rodka okrelonej
wartoci. Do tego celu wykorzystuje si funkcj SUBSTRING. Oglny format tej funkcji to:
SUBSTRING (WartoZnakowa, PozycjaPocztkowa, LiczbaZnakw)

Na przykad instrukcja:
SELECT
SUBSTRING ('czarnaowca', 7, 4) AS Wynik

Funkcje znakowe

zwraca:
Wynik
owca

Powysza funkcja wybiera cztery kolejne znaki, poczwszy od 7. pozycji. Na tej pozycji
znajduje si litera o, wic otrzymujemy sowo owca.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

MySQL wymaga niekiedy, aby nie byo spacji midzy nazw funkcji a lewym nawiasem. To zaley
od konkretnej funkcji, z ktrej chcemy skorzysta. Na przykad poprzednia instrukcja w MySQL musiaaby zosta zapisana nastpujco:
SELECT
SUBSTRING('czarnaowca', 7, 4) AS Wynik

W Oracle odpowiednikiem funkcji SUBSTRING jest funkcja SUBSTR. Jedyna rnica w wersji Oracle
jest taka, e w funkcji SUBSTR drugi argument (PozycjaPocztkowa) moe mie warto ujemn.
Ujemna warto tego argumentu oznacza, e trzeba odliczy liczb miejsc w drug stron, poczwszy
od prawej strony kolumny.
Jak ju wspomniano, w Oracle nie mona napisa instrukcji SELECT bez klauzuli FROM. Jednake
w przypadku tej bazy danych istnieje utworzona automatycznie tabela o nazwie DUAL z ktrej moemy
skorzysta w tej sytuacji. Rwnowana instrukcja SELECT z funkcj SUBSTRING bdzie wygldaa nastpujco:
SELECT
SUBSTR ('czarnaowca', 7, 4) AS "Wynik"
FROM DUAL;

Kolejne dwie funkcje znakowe, ktrymi si teraz zajmiemy, pozwalaj usun wszystkie spacje, po lewej lub po prawej stronie wartoci. Funkcja LTRIM obcina znaki z lewej strony wartoci. Na przykad instrukcja:
SELECT
LTRIM ('

dwa jabka') AS Wynik

zwrci:
Wynik
dwa jabka

Funkcja LTRIM pozwala pozby si spacji po lewej stronie wyraenia dwa jabka. Zauwa, e LTRIM nie eliminuje spacji w rodku naszego wyraenia. Usuwa tylko spacje
po lewej stronie w stosunku do caej wartoci znakowej.
Podobnie, funkcja RTRIM usuwa spacje po prawej stronie wartoci znakowej. Przykad
funkcji RTRIM zostanie podany w dalszej czci rozdziau, gdy bdziemy omawia funkcje
zagniedone.

45

46

Rozdzia 4

Korzystanie z funkcji

Inn funkcj znakow jest funkcja CONCAT. Funkcja ta omwiona zostanie tutaj wycznie w kontekcie baz danych MySQL i Oracle. Jak pokazano w poprzednim rozdziale, w Microsoft SQL Server, aby dokona konkatenacji, wystarczy uy operatora
znaku plusa (+).
Wrmy do przykadu konkatenacji z poprzedniego rozdziau. Nasze dane wejciowe
w tabeli Zamwienia miay posta:
IDZamwienia

Imi

Nazwisko

ZakupionaIlo

CenaZaSztuk

Jan

Kowalski

2,50

Piotr

Nowak

10

1,25

Barbara

Kwiatkowska

4,00

Skadnia konkatenacji kolumn Imi oraz Nazwisko za pomoc funkcji CONCAT w MySQL
bdzie nastpujca:
SELECT
IDZamwienia,
Imi,
Nazwisko,
CONCAT (Imi, ' ', Nazwisko) AS 'Nazwa'
FROM Zamwienia

W powyszym przykadzie funkcja CONCAT czy trzy wskazane wartoci: warto z kolumny Imi, spacj i warto z kolumny Nazwisko. Wynik tej instrukcji to:
IDZamwienia

Imi

Nazwisko

Nazwa

Jan

Kowalski

Jan Kowalski

Piotr

Nowak

Piotr Nowak

Barbara

Kwiatkowska

Barbara Kwiatkowska

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

Funkcja CONCAT w Oracle pozwala jedynie na zczenie dwch argumentw. Innymi sowy, jednorazowo moliwa jest konkatenacja tylko dwch wartoci. Aby dokona konkatenacji analogicznej jak w poprzednim przykadzie, naley sformuowa instrukcj SELECT w nastpujcy sposb:
SELECT
IDZamwienia,
Imi,
Nazwisko,
CONCAT (CONCAT (Imi, ' '), Nazwisko) AS "Nazwa"
FROM Zamwienia;

Instrukcja ta wykorzystuje funkcj zagniedon to pojcie zostanie omwione poniej. W tym przykadzie wewntrzna funkcja CONCAT czy warto z kolumny Imi oraz spacj. Zewntrzna funkcja
CONCAT docza do tego wyniku wartoci z kolumny Nazwisko.

Funkcje zagniedone

Ostatnie dwie funkcje znakowe, ktrym si przyjrzymy, to funkcje UPPER i LOWER. Ich
zadaniem jest przekonwertowanie dowolnego sowa lub frazy odpowiednio na pisane
w caoci wielkimi lub maymi literami. Funkcje te s czsto pomocne przy prezentowaniu danych, a ich skadnia jest prosta.
W poniszej instrukcji zastosowano obie te funkcje:
SELECT
UPPER ('Abraham Lincoln') AS 'Konwersja na wielkie litery',
LOWER ('ABRAHAM LINCOLN') AS 'Konwersja na mae litery'

Wynik to:
Konwersja na wielkie litery

Konwersja na mae litery

ABRAHAM LINCOLN

abraham lincoln

Funkcje zagniedone
Istotn cech funkcji, bez wzgldu na to, czy chodzi o funkcje znakowe, matematyczne
czy te daty i czasu, jest to, e dwie lub wicej funkcji moe zosta poczonych, aby
utworzy funkcje zagniedone. Funkcj zagniedon zoon z dwch funkcji mona uzna za funkcj funkcji. Wrmy do naszego zapytania o Jerzego Waszyngtona,
aby zilustrowa to na przykadzie. Przypominam, e nasze dane wygldaj tak:
Prezydent
Jerzy Waszyngton

Pamitaj, e kolumna Prezydent ma dugo 20 znakw. Innymi sowy, po prawej


stronie wyraenia Jerzy Waszyngton wystpuj cztery spacje. Oprcz zaprezentowania
funkcji zagniedonych nastpny przykad obejmie rwnie funkcj RTRIM, o ktrej
bya mowa w poprzednim podrozdziale.
Ponisza instrukcja:
SELECT
RIGHT (RTRIM (Prezydent),10) AS Nazwisko
FROM tabela1

zwraca nastpujce dane:


Nazwisko
Waszyngton

Dlaczego teraz otrzymujemy poprawn warto? Przyjrzyjmy si, jak to dziaa. W powyszej instrukcji wystpuj dwie funkcje: RIGHT oraz RTRIM. Podczas analizy funkcji
zagniedonych zawsze rozpoczynaj od funkcji wewntrz i przechod kolejno do zewntrznych. W tym przykadzie najbardziej wewntrz znajduje si funkcja:
RTRIM (Prezydent)

47

48

Rozdzia 4

Korzystanie z funkcji

Funkcja ta pobiera warto z kolumny Prezydent i eliminuje wszystkie spacje z prawej


strony. Po wykonaniu tej czynnoci na wyniku zastosowana zostaa funkcja RIGHT, aby
uzyska podan warto. Poniewa wynik funkcji:
RTRIM (Prezydent)

to Jerzy Waszyngton, mona powiedzie, e instrukcja:


SELECT
RIGHT (RTRIM (Prezydent),10)

jest rwnoznaczna z instrukcj:


SELECT
RIGHT ('Jerzy Waszyngton', 10)

Innymi sowy, mona uzyska podany efekt przez zastosowanie w pierwszej kolejno funkcji RTRIM w stosunku do danych wejciowych, a nastpnie dodanie do wyraenia funkcji RIGHT.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

Jak ju wspomniano, w Oracle konieczne jest uycie funkcji SUBSTR zamiast funkcji RIGHT, dostpnej
w Microsoft SQL Server i MySQL. W Oracle powysza instrukcja wygldaaby wobec tego nastpujco:
SELECT
SUBSTR (RTRIM (Prezydent), -10, 10) AS "Nazwisko"
FROM tabela1;

Funkcje daty i czasu


Funkcje daty i czasu pozwalaj na dokonywanie operacji na wartociach zwizanych
z dat i czasem. Nazwy tych funkcji s rne w zalenoci od bazy danych. W Microsoft
SQL Server funkcje, ktre tu omwimy, to: GETDATE, DATEPART i DATEDIFF.
Najprostsz funkcj daty i czasu jest funkcja zwracajca biec dat i czas. W Microsoft
SQL Server jest to funkcja GETDATE. Nie zawiera ona adnych argumentw i po prostu
zwraca biec dat i czas. Na przykad funkcja:
SELECT GETDATE ( )

zwraca wynik zawierajcy biec dat i czas. Poniewa w funkcji GETDATE nie wystpuj
adne argumenty, nawias pozostaje pusty. Pamitaj, e pole typu data i czas jest specjalnym typem danych, ktry w jednym polu zawiera zarwno dat, jak i czas, na przykad:
2009-07-15 08:48:30

Warto ta wskazuje na 15 lipca 2009 roku, 48 minut i 30 sekund po godzinie 8 rano.


R N I CE W R AM A C H IN NY CH B A Z DA NY CH: M y SQL i O r acle

W MySQL odpowiednikiem funkcji GETDATE jest funkcja NOW. W Oracle natomiast jest to funkcja
CURRENT_DATE.

Funkcje daty i czasu

Kolejna funkcja daty i czasu pozwala przeanalizowa kad okrelon dat i zwrci
warto reprezentujc takie elementy, jak dzie lub tydzie przypadajcy na dan
dat. Take w tym przypadku nazwa tej funkcji rni si w zalenoci od bazy danych,
z ktrej korzystamy. W Microsoft SQL Server jest to funkcja DATEPART. Jej oglny format jest nastpujcy:
DATEPART (ElementDaty, Data)

Argument Data wskazuje na dowoln dat, natomiast ElementDaty moe przyjmowa


rne wartoci. Niektre przykady poprawnych wartoci to year, quarter, month,
dayofyear, day, week, weekday, hour, minute oraz second. W jzyku polskim s to odpowiednio: rok, kwarta, miesic, numer dnia w roku, dzie, tydzie, dzie tygodnia, godzina, minuta i sekunda.
W poniszej tabeli pokazano, w jaki sposb dziaa funkcja DATEPART, zwracajc wartoci dla daty 2009-07-02 wskazane w argumencie ElementDaty:
Wyraenie funkcji DATEPART

Wynik

DATEPART(month,2009-07-02)

DATEPART(day, 2009-07-02)

DATEPART(week, 2009-07-02)

27

DATEPART(weekday,2009-07-02)

Analizujc zawarto powyszej tabeli, widzimy, e miesic wybrany z daty 2009-07-02 to


7. Dzie natomiast to 2. Dla tygodnia wynikiem jest liczba 27, poniewa data 2009-07-02
wystpuje w 27. tygodniu roku. Dzie tygodnia natomiast ma numer 5, gdy 2009-07-02
wypada w czwartek, ktry jest pitym dniem tygodnia.
R N I CE W R AM A CH IN NY CH BA Z DANY CH: M ySQL i O racle

W MySQL odpowiednikiem funkcji DATEPART jest funkcja DATE_FORMAT. Argument Data w tej
funkcji przyjmuje wartoci inne ni w Microsoft SQL Server. Na przykad, aby wynikiem funkcji by dzie,
naleaoby w MySQL zapisa j nastpujco:
SELECT DATE_FORMAT ('2009-07-02', '%d');

W Oracle nie istnieje funkcja bdca odpowiednikiem funkcji DATEPART.


Ostatnia funkcja daty i czasu, ktr tu omwimy, pozwala okreli liczb dni (lub tygodni, miesicy itp.) pomidzy dwiema datami. Ponownie, nazwa tej funkcji rni si
w zalenoci od bazy danych. W Microsoft SQL Server funkcja ta nosi nazw DATEDIFF
i jej oglny format jest nastpujcy:
DATEDIFF (ElementDaty, DataPocztkowa, DataKocowa)

Prawidowe wartoci, jakie powinien przyjmowa w przypadku tej funkcji argument


ElementDaty, to year, quarter, month, dayofyear, day, hour, minute oraz second. W jzyku polskim s to odpowiednio: rok, kwarta, miesic, numer dnia w roku, dzie, godzina, minuta i sekunda.

49

50

Rozdzia 4

Korzystanie z funkcji

W poniszej tabeli pokazano, w jaki sposb, dziki zastosowaniu funkcji DATEDIFF,


zwracana jest rnica midzy dat 2009-07-08 oraz 2009-08-14, przy uwzgldnieniu
rnych wartoci argumentu ElementDaty:
Wyraenie funkcji DATEDIFF

Wynik

DATEDIFF(day,2009-07-08,2009-08-14)

37

DATEDIFF (week, 2009-07-08,2009-08-14)

DATEDIFF (month, 2009-07-08,2009-08-14)

DATEDIFF (year, 2009-07-08,2009-08-14)

Z powyszej tabeli wynika, e pomidzy wskazanymi datami jest odstp wynoszcy 37 dni,
5 tygodni, 1 miesic lub 0 lat.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

W MySQL funkcja DATEDIFF pozwala jedynie na obliczenie liczby dni pomidzy dwiema datami, przy
czym data kocowa zazwyczaj jest wymieniana jako pierwsza, dziki czemu uzyskujemy warto dodatni. Oglny format tej funkcji w MySQL to:
DATEDIFF (DataKocowa, DataPocztkowa)

W Oracle nie istnieje funkcja bdca odpowiednikiem funkcji DATEDIFF.

Funkcje liczbowe
Funkcje liczbowe pozwalaj na dokonywanie operacji na wartociach liczbowych.
Czasami wystpuj rwnie pod nazw funkcji matematycznych (ang. mathematical
functions). Funkcje, ktre tu omwimy, to ROUND, RAND oraz PI.
Wykorzystujc funkcj ROUND, moemy dokona zaokrglenia kadej wartoci liczbowej. Oglny format tej funkcji to:
ROUND (WartoLiczbowa, LiczbaMiejscPoPrzecinku)

Argument WartoLiczbowa moe by dowoln liczb dodatni bd ujemn, cakowit


lub rzeczywist, tak jak 712,863 lub -42.
Argument LiczbaMiejscPoPrzecinku jest nieco bardziej zdradliwy. Moe przyjmowa dodatni lub ujemn warto bdc liczb cakowit lub by rwny 0. Gdy argument ten jest
dodatni liczb cakowit, oznacza to, e wskazana warto liczbowa zostanie zaokrglona
do wanie tylu miejsc po przecinku. Gdy natomiast argument LiczbaMiejscPoPrzecinku
jest rwny 0, wwczas nasza warto liczbowa zostanie wywietlona bez adnych miejsc
po przecinku. Wreszcie, gdy LiczbaMiejscPoPrzecinku jest wartoci ujemn, wynik
bdzie liczb zaokrglon do wanie tylu miejsc, na lewo od przecinka. W poniszej
tabeli przedstawiono, jak zaokrglana jest liczba 712,863 przy uwzgldnieniu rnych
wartoci argumentu LiczbaMiejscPoPrzecinku:

Funkcje liczbowe
Wyraenie funkcji ROUND

Wynik

ROUND (712.863, 3)

712.863

ROUND (712.863, 2)

712.860

ROUND (712.863, 1)

712.900

ROUND (712.863, 0)

713.000

ROUND (712.863, -1)

710.000

ROUND (712.863, -2)

700.000

Funkcja RAND jest wykorzystywana do generowania liczb losowych. Czym jest liczba
losowa i w jakim celu jest generowana? Liczb losow generuje si, gdy trzeba dokona wyboru losowego, takiego jak na przykad wybr zwycizcy spord klientw,
ktrzy wzili udzia w konkursie. Oglny format funkcji RAND jest nastpujcy:
RAND ([ziarno])

Nawiasy kwadratowe po obu stronach argumentu ziarno wskazuj, e jest to argument opcjonalny. Funkcja RAND zwraca inny wynik w zalenoci od tego, czy argument
ten zosta uzupeniony. W wikszoci przypadkw argument ziarno nie jest wykorzystywany. Jeli tak wanie jest, wwczas funkcja RAND zwraca losow warto z przedziau
od 0 do 1. Gdy wykonamy j 10 razy z rzdu, zwrci 10 rnych wartoci. Jej skadnia
jest nastpujca:
SELECT
RAND ( ) AS 'Warto losowa'

W przypadku gdy zostaa okrelona warto argumentu ziarno, musi to by liczba cakowita. Gdy wykonywana jest funkcja RAND z uzupenionym argumentem, zawsze zwrci
t sam warto, na przykad:
SELECT
RAND (100) AS 'Warto losowa'

Po zmianie wartoci argumentu ziarno funkcja zwrci inn warto.


Funkcja PI zwraca jedynie matematyczn warto liczby pi. (Przypomnij sobie zajcia
z geometrii). W rzeczywistoci ta funkcja jest bardzo rzadko uywana, jednak stanowi
potwierdzenie tego, co zaznaczono powyej, a mianowicie, e funkcje liczbowe nie musz
mie zdefiniowanych adnych argumentw. Na przykad instrukcja:
SELECT PI ( )

zwraca warto 3,14159265358979.


R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W Oracle nie wystpuj funkcje bdce odpowiednikami funkcji RAND lub PI.
A gdybymy potrzebowali wartoci pi zaokrglonej do dwch miejsc po przecinku? Bardzo atwo uzyska taki wynik. Wystarczy tylko utworzy funkcj zagniedon zoon

51

52

Rozdzia 4

Korzystanie z funkcji

z funkcji PI i ROUND. W pierwszej kolejnoci naleaoby uy funkcji PI i uzyska warto pocztkow, a nastpnie zastosowa funkcj ROUND, aby zaokrgli j do dwch
miejsc po przecinku. Ponisza instrukcja zwraca warto 3,14:
SELECT ROUND (PI ( ), 2)

Funkcje konwersji
Wszystkie wyej wymienione funkcje odnosz si do konkretnych sposobw dokonywania operacji na danych o typie znakowym, daty i czasu oraz liczbowym. Konieczne moe
jednak okaza si przekonwertowanie danych z jednego typu na inny lub zamiana wartoci NULL na element o konkretnej wartoci. Pozostaa cz tego rozdziau bdzie powicona dwm specjalnym funkcjom, ktre mog by stosowane w takich sytuacjach.
Funkcja CAST umoliwia konwersj danych z jednego typu danych na inny. Oglny
format tej funkcji jest nastpujcy:
CAST (Wyraenie AS TypDanych)

Funkcja CAST w wielu przypadkach jest waciwie zbdna. Wemy pod uwag sytuacj,
gdy chcemy wykona ponisz instrukcj, w ktrej kolumna Ilo jest typu znakowego:
SELECT
2 * Ilo
FROM tabela

Mona by pomyle, e powysza instrukcja nie zostanie wykonana ze wzgldu na


fakt, e Ilo nie jest kolumn o typie liczbowym. Jednake wikszo baz danych SQL
jest na tyle sprytna, e automatycznie konwertuj wartoci z kolumny Ilo na wartoci
liczbowe, tak aby moliwe byo pomnoenie przez 2 wartoci, ktre si w niej znajduj.
Poniej znajduje si przykad prezentujcy sposb uycia funkcji CAST. Powiedzmy, e
mamy kolumn o typie znakowym przechowujc daty. Chcemy przekonwertowa wartoci z tej kolumny, tak aby byy prezentowane jako wartoci o typie data i czas. Ponisza instrukcja pokazuje, jak mona dokona takiej konwersji za pomoc funkcji CAST:
SELECT
'2009-04-11' AS 'Data Pierwotna',
CAST ('2009-04-11' AS DATETIME) AS 'Data Przekonwertowana'

W wyniku tej instrukcji otrzymujemy:


Data Pierwotna

Data Przekonwertowana

2009-04-11

2009-04-11 00:00:00.000

Dane w kolumnie Data Pierwotna wygldaj tak, jakby byy dat, ale tak naprawd s
typu znakowego. Natomiast kolumna Data Przekonwertowana jest rzeczywicie typu
data i czas, o czym wiadczy widoczna teraz warto okrelajca czas.

Funkcje konwersji

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W Oracle odpowiednikiem funkcji CAST dla formatu daty jest funkcja:


SELECT
'2009-04-11' AS "Data Pierwotna",
TO_DATE('2009-04-11','YYYY-MM-DD HH24:MI:SS') AS "Data Przekonwertowana"
FROM DUAL;

Drug przydatn funkcj konwersji jest funkcja, ktra zamienia wartoci NULL na konkretn warto. W Microsoft SQL Server jest to funkcja ISNULL.
Jak wspomniano w rozdziale 1., wartoci NULL to takie, dla ktrych nie ma danych.
Warto NULL nie jest rwnoznaczna ze spacj czy zerem. Powiedzmy, e mamy nastpujc tabel produktw:
Produkt

Opis

Kolor

Krzeso A

Czerwony

Krzeso B

NULL

Lampa C

Zielony

Zauwa, e dla Krzesa B w kolumnie Kolor jest warto NULL. Oznacza to, e kolor
tego krzesa nie zosta jeszcze podany. Powiedzmy, e chcemy stworzy list wszystkich produktw. Jeli wykonamy nastpujc instrukcj SELECT:
SELECT
Opis,
Kolor
FROM Produkty

otrzymamy:
Opis

Kolor

Krzeso A

Czerwony

Krzeso B

NULL

Lampa C

Zielony

Jednake uytkownicy zamiast NULL woleliby zobaczy na przykad warto Nieznany


w przypadku brakujcych kolorw. Oto rozwizanie tego problemu:
SELECT
Opis,
ISNULL (Kolor, 'Nieznany') AS Kolor
FROM Produkty

I wynik powyszej instrukcji:


Opis

Kolor

Krzeso A

Czerwony

Krzeso B

Nieznany

Lampa C

Zielony

53

54

Rozdzia 4

Korzystanie z funkcji

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

W MySQL odpowiednikiem funkcji ISNULL jest funkcja IFNULL. Powysze zapytanie w MySQL miaoby zatem posta:
SELECT
Opis,
IFNULL (Kolor, 'Nieznany') AS 'Kolor'
FROM Produkty;

W Oracle natomiast odpowiednikiem funkcji ISNULL jest funkcja NVL. Zapytanie w Oracle wygldaoby nastpujco:
SELECT
Opis,
NVL (Kolor, 'Nieznany') AS Kolor
FROM Produkty;

W przypadku wszystkich baz danych omawianych w niniejszej ksice, gdy w danej kolumnie wystpuje
warto NULL, w poszczeglnych narzdziach bazodanowych wstawiana jest domylna warto (np.
w Oracle SQL Developer jest to (null)). Sposb wywietlania wartoci NULL mona zmieni we waciwociach danego narzdzia.

Co dalej?
W tym rozdziale opisano wiele rnych funkcji, ktre s zasadniczo predefiniowanymi reguami transformacji zestawu wartoci na inn warto. Tak jak w przypadku arkuszy kalkulacyjnych mamy do dyspozycji wbudowane funkcje umoliwiajce dokonywanie
operacji na danych, w SQL rwnie mamy podobne moliwoci. Oprcz omwienia
podstawowych funkcji znakowych, daty i czasu, liczbowych, a take funkcji konwersji
objaniem te sposb tworzenia funkcji zagniedonych, skadajcych si z dwch
lub wicej wymienionych powyej rodzajw funkcji.
Szeroki zakres materiau dotyczcego funkcji celowo zosta okrojony ze wzgldu na
fakt, e zwyczajnie istnieje wiele dostpnych funkcji oferujcych wiele rnych funkcjonalnoci. Niemoliwe jest omwienie niuansw kadej dostpnej funkcji. Naley
jednak pamita, e informacje o funkcjach, ktre maj zosta uyte, mona atwo znale
w dokumentacji do bazy danych. Materiay dostpne online mog okaza si pomocnym rdem informacji na temat tego, jak kada funkcja dokadnie dziaa. Gdy bdziesz wic chcia uy danej funkcji, wystarczy sprawdzi jej skadni w internecie.
W kolejnym rozdziale nie bdziemy zajmowa si zagadnieniami zwizanymi z list_
kolumn. Porozmawiamy o czym nieco odmiennym, a mianowicie o sortowaniu danych. Sortowanie moe suy wielu rnym celom, speniajc oczekiwania uytkownikw odnonie wywietlania danych w okrelonej kolejnoci. Dziki sortowaniu zaczniemy
myle o sposobie prezentacji naszych danych jako caoci, nie tylko o wycinku danych i poszczeglnych bitach.

R OZ DZ I A 5

S ORTOWANIE
DANYCH
NOWE SOWA KLUCZOWE: ORDER BY, ASC, DESC

Umiejtno prezentowania danych posortowanych w okrelonej kolejnoci jest czsto


nie do przecenienia w realizacji okrelonych zada. Na przykad, gdybymy otrzymali
dug list klientw wystpujcych w kolejnoci losowej, byoby nam trudno zlokalizowa
jedn, wybran osob. Gdyby jednak ta sama lista bya posortowana alfabetycznie,
wwczas odnalezienie takiego klienta nie byoby trudne.
Sortowanie danych w porzdku alfabetycznym jest czsto stosowane, nawet wwczas,
gdy dane nie s typu znakowego. Na przykad mgby chcie posortowa list zamwie
wedug daty i godziny zamwienia, aby szybko odnale zamwienie przyjte do realizacji konkretnego dnia o okrelonej godzinie. Mgby rwnie chcie posortowa
list zamwie wedug ich wartoci, aby przejrze zamwienia, poczwszy od opiewajcych na najnisz kwot do tych o najwikszej wartoci. Bez wzgldu na to, w jaki
sposb posortowae dane, taka metoda prezentacji pomaga je uporzdkowa i przedstawi uytkownikowi kocowemu w bardziej przystpnej formie.

Dodawanie sortowania
Do tej pory dane, ktrymi si zajmowalimy, nie byy zwracane w okrelonej kolejnoci.
Gdy uruchamiamy instrukcj SELECT, nigdy nie wiadomo, ktry wiersz zostanie zwrcony jako pierwszy. Jeli zapytanie jest wykonywane z poziomu rodowiska programistycznego i nikt nie widzi wwczas danych, kolejno ich wywietlania nie ma znaczenia. Jeeli jednak dane maj by widoczne bezporednio dla uytkownika, wwczas
kolejno wierszy czsto ma znaczenie. Sortowanie wierszy mona w prosty sposb
doda do instrukcji SELECT za pomoc klauzuli ORDER BY.

55

56

Rozdzia 5

Sortowanie danych

Oglny format klauzuli ORDER BY jest nastpujcy:


SELECT lista_kolumn
FROM lista_tabel
ORDER BY lista_kolumn

Klauzula ORDER BY wystpuje zawsze po klauzuli FROM, ktra z kolei jest zawsze umiejscowiona po sowie kluczowym SELECT. Element lista_kolumn wystpujcy po sowach
kluczowych SELECT i ORDER BY oznacza, e w tym miejscu wymieni mona dowoln
liczb kolumn. Na licie_kolumn mog by zarwno pojedyncze kolumny, jak i bardziej zoone wyraenia. Kolumny wymienione po sowie SELECT mog take rni
si od tych wyszczeglnionych po sowie kluczowym ORDER BY. W miejscu elementu
lista_tabel moemy wymieni dowoln liczb tabel. Niedugo dowiesz si, jak bdzie
wyglda skadnia, ktra to umoliwia.
Aby pokaza to na przykadzie, posuymy si danymi w poniszej tabeli Klienci:
IDKlienta

Imi

Nazwisko

Jan

Kowalski

Adam

Kowalski

Piotr

Nowak

Katarzyna

Dworniak

Sortowanie danych w porzdku rosncym


Jeli chcesz posortowa dane w porzdku alfabetycznym, od A do Z, do instrukcji SELECT
musisz jedynie doda klauzul ORDER BY. Na przykad, ponisza instrukcja:
SELECT
Imi,
Nazwisko
FROM Klienci
ORDER BY Nazwisko

zwraca wynik:
Imi

Nazwisko

Katarzyna

Dworniak

Jan

Kowalski

Adam

Kowalski

Piotr

Nowak

Poniewa istniej dwie osoby o nazwisku Kowalski, Jan i Adam, nie sposb przewidzie,
ktra z tych osb zostanie wymieniona jako pierwsza. Dzieje si tak dlatego, e dokonujemy sortowania tylko wzgldem nazwiska, a istnieje kilka wierszy z tym samym
nazwiskiem.

Sortowanie danych w porzdku malejcym

Podobnie bdzie w przypadku uruchomienia nastpujcej instrukcji SELECT:


SELECT
Imi,
Nazwisko
FROM Klienci
ORDER BY Imi

Jej wynik to:


Imi

Nazwisko

Adam

Kowalski

Jan

Kowalski

Katarzyna

Dworniak

Piotr

Nowak

Teraz kolejno wywietlania wierszy jest zupenie inna, jako e sortujemy dane wedug imienia.
W jzyku SQL wystpuje specjalne sowo kluczowe o nazwie ASC, ktre oznacza rosncy
(ang. ascending) sposb sortowania. To sowo kluczowe jest cakowicie opcjonalne
i z reguy zbdne, poniewa najczciej domylnie dokonuje si sortowania wanie w porzdku rosncym. Ponisza instrukcja SELECT zawierajca sowo kluczowe ASC zwraca
te same dane, co powyej:
SELECT
Imi,
Nazwisko
FROM Klienci
ORDER BY Imi ASC

Sowo kluczowe ASC w tym przypadku zastosowano, aby podkreli, e dane sortowane
s w sposb rosncy, w odrnieniu od porzdku malejcego.

Sortowanie danych w porzdku malejcym


Wykorzystujc sowo kluczowe DESC, moemy posortowa dane w odwrotnej kolejnoci ni w przypadku zastosowania sowa ASC. Zostan zatem posortowane malejco1.
Na przykad ponisza instrukcja:
SELECT
Imi,
Nazwisko
FROM Klienci
ORDER BY Imi DESC

(ang. descending) przyp. tum.

57

58

Rozdzia 5

Sortowanie danych

zwraca wynik:
Imi

Nazwisko

Piotr

Nowak

Katarzyna

Dworniak

Jan

Kowalski

Adam

Kowalski

Imiona zostay posortowane w porzdku od Z do A.

Sortowanie wzgldem wicej ni jednej kolumny


Wrmy teraz do problemu sortowania w przypadku dwch osb z tym samym nazwiskiem. Jeli chcemy posortowa dane wedug nazwiska, ale istniej dwie osoby o tym
samym nazwisku, do klauzuli sortowania musimy doda drug kolumn, Imi:
SELECT
Imi,
Nazwisko
FROM Klienci
ORDER BY Nazwisko, Imi

Otrzymamy wwczas nastpujcy wynik:


Imi

Nazwisko

Katarzyna

Dworniak

Adam

Kowalski

Jan

Kowalski

Piotr

Nowak

Poniewa sortujemy teraz dane wzgldem dwch kolumn, moemy by pewni, e


Adam Kowalski pojawi si przed Janem Kowalskim. Zauwa, e klauzula ORDER BY musi
wymieni Nazwisko przed kolumn Imi. Kolejno w tym przypadku ma znaczenie,
poniewa zamierzamy posortowa dane najpierw wedug nazwiska, a nastpnie wedug imienia. Dlatego kolumna Nazwisko musi zosta wymieniona jako pierwsza.

Sortowanie wzgldem pola obliczanego


Teraz przyda nam si wiedza z rozdziau 3. o polach obliczanych i aliasach, dziki czemu
zilustrujemy pewne dodatkowe moliwoci jzyka SQL. Ponisza instrukcja:
SELECT
Nazwisko +', ' + Imi AS Nazwa
FROM Klienci
ORDER BY Nazwa

zwraca nastpujcy wynik:

Wicej na temat sekwencji sortowania


Nazwa
Dworniak, Katarzyna
Kowalski, Adam
Kowalski, Jan
Nowak, Piotr

Jak wida, w klauzuli ORDER BY moemy odnie si do aliasu kolumny (Nazwa). To kolejny
dowd na przydatno aliasw. Ponadto, zwr uwag na konstrukcj samego pola
obliczanego. Kolumny z nazwiskiem i imieniem zostay oddzielone przecinkiem i spacj, aby nazwy zostay wywietlone w powszechnie stosowanym formacie. Format ten
sprawdza si rwnie w przypadku sortowania. Warto zatem o nim pamita, zwaszcza e uytkownicy czsto chc zobaczy nazwy wywietlane w ten wanie sposb.
A gdybymy chcieli umieci pole obliczane bezporednio w klauzuli ORDER BY, bez uycia
aliasu kolumny? Ponisza instrukcja, podobna do zamieszczonej wyej, pokazuje, jak
to zrobi:
SELECT
Imi,
Nazwisko
FROM Klienci
ORDER BY Nazwisko + Imi

Wynik bdzie nastpujcy:


Imi

Nazwisko

Katarzyna

Dworniak

Adam

Kowalski

Jan

Kowalski

Piotr

Nowak

Dane s posortowane w ten sam sposb, jak w poprzednim przykadzie. Jedyna rnica jest taka, e teraz pole obliczane znajduje si w klauzuli ORDER BY, a aliasy kolumn
nie s wykorzystywane.

Wicej na temat sekwencji sortowania


W poprzednich przykadach wszystkie dane byy typu znakowego, a wic skaday si
z liter od A do Z. Nie wystpoway w nich rwnie adne numery i znaki specjalne.
Ponadto, w sortowaniu nie byo brane pod uwag to, czy w nazwach wystpuj mae czy
wielkie litery. Czy zatem, gdy zastosujemy sortowanie w porzdku rosncym, sowo
pies wystpi przed sowem PIES, czy po nim?
Kada baza danych umoliwia uytkownikom okrelenie lub dostosowanie do swoich potrzeb ustawie sortowania, okrelajcych, w jaki sposb dane s sortowane. Ustawienia te
rni si nieco od siebie w zalenoci od bazy danych, jednak trzy z nich s dla
wszystkich wsplne.

59

60

Rozdzia 5

Sortowanie danych

Po pierwsze, gdy dokonujemy sortowania w porzdku rosncym, jakiekolwiek dane


z wartoci NULL pojawi si na pocztku. Jak ju wczeniej wspomniano, wartoci NULL
oznaczaj brak jakichkolwiek danych. Po wszystkich wartociach NULL pojawi si dane
o typie liczbowym, a nastpnie dane znakowe. Dla danych posortowanych w porzdku malejcym najpierw zostan wywietlone dane o typie znakowym, nastpnie numerycznym, a na kocu wartoci NULL.
Po drugie, w przypadku danych znakowych nie ma rnicy midzy duymi a maymi
literami. Litera e jest traktowana tak samo jak litera E.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W Oracle, w przeciwiestwie do Microsoft SQL Server i MySQL, wartoci NULL pojawiaj si na kocu listy danych posortowanych rosnco.
W Oracle do klauzuli ORDER BY mona doda specjalne sowo kluczowe NULLS FIRST, aby w przypadku sortowania rosnco wartoci NULL byy wywietlane jako pierwsze. Oglny format takiej instrukcji ma nastpujc posta:
SELECT lista_kolumn
FROM lista_tabel
ORDER BY lista_kolumn NULLS FIRST

Jeli sowo kluczowe NULLS FIRST zostanie dodane w przypadku sortowania w kolejnoci malejcej,
wartoci NULL pojawi si na kocu, tak jak mona by si tego spodziewa.
Ponadto, w przeciwiestwie do Microsoft SQL Server i MySQL, Oracle inaczej traktuje mae i wielkie litery na posortowanej licie. W tej bazie danych na licie posortowanej w porzdku rosncym wielkie litery zawsze wystpuj przed maymi. Na przykad w Oracle sowo PIES pojawi si przed sowem
pies. W Microsoft SQL Server i MySQL PIES i pies s traktowane tak samo.
Po trzecie, w przypadku danych znakowych poszczeglne znaki skadajce si na dan
warto s odczytywane od lewej do prawej. Jeli wic mwimy o literach, to AB wystpi wczeniej na licie ni AC. Spjrzmy na przykad pochodzcy z poniszej tabeli:
IDTabeli

DaneZnakowe

DaneLiczbowe

23

23

Pies

NULL

NULL

W powyszej tabeli kolumna o nazwie DaneZnakowe zawiera dane o typie znakowym,


na przykad VARCHAR (typ danych o zmiennej dugoci). Podobnie, kolumna DaneLiczbowe
to kolumna z danymi o typie liczbowym, na przykad INT (liczby cakowite). Wartoci,
dla ktrych nie ma danych, s wywietlane jako NULL.
Gdy na podstawie powyszej tabeli wykonamy nastpujc instrukcj SELECT:
SELECT DaneLiczbowe
FROM nazwa_tabeli
ORDER BY DaneLiczbowe

Wicej na temat sekwencji sortowania

otrzymamy:
DaneLiczbowe
NULL
6
5
23

Zauwa, e najpierw wystpuje warto NULL, a nastpnie liczby w kolejnoci od najmniejszej do najwikszej. Jeli chcemy, aby zamiast wartoci NULL wywietlana bya domylna warto 0, moemy uy funkcji ISNULL omwionej w poprzednim rozdziale.
Wwczas instrukcja SELECT bdzie miaa posta:
SELECT
ISNULL (DaneLiczbowe, 0)
FROM nazwa_tabeli
ORDER BY ISNULL (DaneLiczbowe, 0)

Jej wynik jest nastpujcy:


DaneLiczbowe
6
0
5
23

Funkcja ISNULL konwertuje warto NULL na 0, czego skutkiem jest inna kolejno posortowanych danych.
Decyzja co do tego, czy chcesz wywietli wartoci NULL jako NULL czy jako 0, zaley od
podanego wyniku. Zasadniczo, jeli dla uytkownika warto NULL jest rwnoznaczna
z wartoci 0, wwczas naley wywietla wartoci NULL jako 0. Jeli natomiast uytkownik postrzega wartoci NULL jako brak danych, powiniene wywietla sowo NULL.
Przyjrzyjmy si teraz innej klauzuli ORDER BY opartej na tej samej tabeli. Jeli wykonamy nastpujc instrukcj SELECT:
SELECT
DaneZnakowe
FROM nazwa_tabeli
ORDER BY DaneZnakowe

otrzymamy:
DaneZnakowe
NULL
23
5
Pies

61

62

Rozdzia 5

Sortowanie danych

Zgodnie z oczekiwaniami, warto NULL zostaa wywietlona na pierwszym miejscu, a zaraz po niej wystpuj wartoci liczbowe, ktre z kolei poprzedzaj wartoci typu znakowego posortowane w porzdku alfabetycznym. Zauwa, e warto 23 wystpuje przed
cyfr 5. Dzieje si tak dlatego, e wartoci 23 i 5 s odczytywane jako znaki, a nie liczby. Poniewa dane znakowe s odczytywane od lewej do prawej, a 2 jest mniejsze od 5,
warto 23 jest wywietlana jako pierwsza.

Co dalej?
W tym rozdziale omwilimy podstawowe sposoby sortowania danych w okrelonej kolejnoci. Pokazalimy, jak sortowa dane wzgldem wicej ni jednej kolumny, a take
poruszylimy kwesti wykorzystania w sortowaniu pl obliczanych. Na koniec wspomnielimy o niektrych osobliwych cechach sortowania, w szczeglnoci jeli chodzi
o dane z wartociami NULL oraz liczby w kolumnach o typie znakowym.
Na pocztku rozdziau przeanalizowalimy niektre z gwnych zastosowa sortowania. Najwaniejszym z nich jest moliwo rozmieszczenia danych w niebudzcej wtpliwoci kolejnoci, co pozwala uytkownikom na szybkie odnalezienie podanej informacji. Ludzie na og lubi patrze na dane uporzdkowane, a dziki sortowaniu taki
efekt jestemy w stanie uzyska. Inne interesujce zastosowanie sortowania zostanie
omwione w rozdziale 7., w ktrym wprowadzimy nowe sowo kluczowe, TOP, i inny
powizany z nim sposb wykorzystania sortowania. Technika ta, znana jako sortowanie Top N, umoliwia na przykad wywietlenie klientw, ktrzy zoyli 5 najwikszych zamwie w okrelonym czasie. W rozdziale 6. zakoczymy nasz analiz tego,
czego mona dokona za pomoc list_kolumn.
Poprzez zastosowanie instrukcji CASE i logiki obliczania wartoci wyjciowych w kolumnach wprowadzimy bardziej zaawansowane metody wykorzystania wyrae umieszczanych w listach_kolumn.

R OZ DZ I A 6

L OGIKA
OBLICZANIA
WARTOCI
WYJCIOWYCH
W KOLUMNACH
NOWE SOWA KLUCZOWE: CASE, WHEN, THEN, ELSE, END

Gwnym tematem tego rozdziau jest wyraenie CASE. Jak wskazuje jego tytu, wyraenia CASE s elementami logiki obliczania wartoci wyjciowych w kolumnach (ang.
column-based logic). Pojcie to oznacza, e tego typu wyraenia nakadaj pewne warunki
logiczne na kolumny, a nie wiersze. Wyraenia CASE wystpuj take czasami pod nazw logiki warunkowej (ang. conditional logic), co oznacza, e pozwalaj zmieni dane
wyjciowe przedstawiane uytkownikowi na podstawie warunku logicznego. Za pomoc tego warunku dokonywana jest weryfikacja wartoci w kolumnach lub okrelonych elementw danych.
Jako pocztkujcy programista SQL, powiniene wiedzie, e wyraenie CASE jest stosunkowo zaawansowanym zagadnieniem. Moesz efektywnie programowa w SQL,
nie uywajc nigdy wyraenia CASE, jednak Twoja znajomo tego tematu moe sprawi, e bdziesz si wyrnia. W rzeczy samej, jest to jeden z tematw, do ktrych
warto wrci po zapoznaniu si z ca ksik. Wwczas by moe przyjd Ci do gowy ciekawe pomysy na zastosowanie tej techniki.

63

64

Rozdzia 6

Logika obliczania wartoci wyjciowych w kolumnach

Logika IF-THEN-ELSE
Zwrmy si teraz w stron poczciwej logiki. Do tej pory dowiedziae si, w jaki sposb
wybiera kolumny z jednej tabeli, jak stosowa niektre obliczenia i funkcje oraz jak sortowa dane w kolumnach. Jednak w czynnociach tych nie bya zaszyta adna logika.
Wyraenie CASE w SQL pozwala zastosowa tradycyjn logik typu IF-THEN-ELSE w pojedynczej instrukcji SELECT. Termin IF-THEN-ELSE odnosi si do powszechnie stosowanej konstrukcji logicznej wykorzystywanej w proceduralnych jzykach programowania. Oglnie rzecz ujmujc, ten typ logiki wyglda nastpujco:
IF warunek jest prawdziwy
THEN wstaw warto1 lub wykonaj wyraenie1
ELSE wstaw warto2 lub wykonaj wyraenie2

Wyraenie CASE jest konstrukcj, ktra moe pojawi si w wielu miejscach w instrukcji SELECT. W tym rozdziale bdziemy koncentrowa si na wyraeniach CASE, ktre
pojawiaj si w miejscu listy_kolumn zaraz po sowie kluczowym SELECT. Instrukcja
SELECT, w ktrej znajduj si zarwno kolumny, jak i wyraenie CASE, mogaby przykadowo wyglda tak:
SELECT
kolumna1,
kolumna2,
WyraenieCase
FROM tabela

Format prosty
Istniej dwa oglne formaty, w jakich wystpuje wyraenie CASE. Okrela si je mianem prostego (ang. simple) oraz przeszukujcego (ang. searched). Format prosty wyglda nastpujco:
SELECT
CASE KolumnaLubWyraenie
WHEN warto1 THEN wynik1
WHEN warto2 THEN wynik2
(powtrz warunki WHEN-THEN dowoln liczb razy)
[ELSE WartoDomylna]
END

Jak wida, wyraenie CASE wykorzystuje szereg sw innych ni CASE. S to sowa kluczowe WHEN, THEN, ELSE oraz END. S one konieczne do penego zdefiniowania logiki wyraenia CASE. Sowa kluczowe WHEN i THEN okrelaj warunek, ktry jest sprawdzany pod
wzgldem logicznym. Jeli warto po sowie kluczowym WHEN jest w wyniku weryfikacji
1

W wolnym tumaczeniu: JELI warunek jest prawdziwy, TO wstaw warto1 lub wykonaj wyraenie1 i wstaw jego wynik, W PRZECIWNYM PRZYPADKU wstaw warto2 lub wykonaj wyraenie2 i wstaw jego wynik przyp. tum.

Format prosty

uznana za prawdziw, wwczas brany jest pod uwag wynik po sowie THEN. Sowa
kluczowe WHEN i THEN mona powtarza dowoln liczb razy. Gdy wystpuje WHEN, musi
istnie rwnie odpowiadajce mu sowo THEN. Sowo kluczowe ELSE suy natomiast
do okrelenia wartoci domylnej, ktra zostanie uyta w przypadku, gdy aden z warunkw WHEN-THEN nie bdzie speniony. Jak wskazano w nawiasach, sowo kluczowe
ELSE jest opcjonalne, jednake dobr praktyk jest umieszczanie go w kadym wyraeniu CASE, tak aby wyranie okreli warto domyln.
Spjrzmy na poniszy przykad oparty na tabeli Produkty, ktra ma nastpujc posta:
IDProduktu

KodKategorii

OpisProduktu

Jabko

Pomaracza

Musztarda

Marchew

Instrukcja SELECT z wyraeniem CASE pobierajca dane z powyszej tabeli mogaby by


nastpujca:
SELECT
CASE KodKategorii
WHEN 'O' THEN 'Owoc'
WHEN 'W' THEN 'Warzywo'
ELSE 'Inne'
END AS 'Kategoria',
OpisProduktu AS 'Opis'
FROM Produkty

a jej wynik to:


Kategoria

Opis

Owoc

Jabko

Owoc

Pomaracza

Inne

Musztarda

Warzywo

Marchew

Przeanalizujmy kolejno kad lini powyszej instrukcji SELECT. Pierwsza linia zawiera
sowo kluczowe SELECT. Druga linia, zawierajca sowo kluczowe CASE, wskazuje, e
przedmiotem analizy bdzie kolumna KodKategorii. W trzeciej linii znajduje si pierwszy
warunek WHEN-THEN. Ta linia mwi nam, e jeli w kolumnie KodKategorii wystpi
warto O, wwczas ma zosta wywietlona warto Owoc. Nastpna linia natomiast
wskazuje, e jeli bdzie to warto W, w wyniku ma by zastpiona wartoci Warzywo.
W linii rozpoczynajcej si sowem kluczowym ELSE podana jest warto domylna,
jaka ma si znale w wyniku w przypadku, gdy w kolumnie KodKategorii znajdzie si
inna warto ni O lub W. Linia ze sowem kluczowym END koczy instrukcj CASE.
W linii tej znajduje si take sowo kluczowe AS, ktre wprowadza alias dla kolumny
z caym wyraeniem CASE.

65

66

Rozdzia 6

Logika obliczania wartoci wyjciowych w kolumnach

Kolejna linia w instrukcji SELECT to jedynie druga kolumna pobierajca OpisProduktu


i nie ma ona nic wsplnego z wyraeniem CASE.
Wyraenie CASE okazuje si bardzo przydatne, gdy potrzebna jest zmiana niejasnych
wartoci na zrozumiae opisy. W powyszym przykadzie kolumna KodKategorii w tabeli
Produkty zawiera tylko jeden znak wskazujcy na typ produktu. Znakiem O oznaczone
zostay Owoce, za pomoc litery W Warzywa, natomiast znak P oznacza Przyprawy.
Za porednictwem klauzuli CASE moemy zatem zmieni wartoci wywietlane w kolumnach na bardziej dla nas zrozumiae.

Format przeszukujcy
Oglny format przeszukujcej klauzuli CASE wyglda nastpujco:
CASE
WHEN warunek1 THEN wynik1
WHEN warunek2 THEN wynik2
(powtrz warunki WHEN-THEN dowoln liczb razy)
[ELSE WartoDomylna]
END

Poniej znajduje si odpowiednik instrukcji SELECT z poprzedniego przykadu, w ktrym skorzystano z powyszego formatu:
SELECT
CASE
WHEN KodKategorii = 'O' THEN 'Owoc'
WHEN KodKategorii = 'W' THEN 'Warzywo'
ELSE 'Inne'
END AS 'Kategoria',
OpisProduktu AS 'Opis'
FROM Produkty

Uzyskany wynik jest identyczny jak w przypadku zastosowanego formatu prostego.


Zwr jednak uwag na subtelne rnice. W formacie prostym nazwa kolumny bdcej przedmiotem analizy jest umieszczona po sowie kluczowym CASE, natomiast wyraenie wystpujce po sowie WHEN wskazuje na prost warto literau. W formacie
przeszukujcym nazwa kolumny, ktra ma by poddana analizie, nie wystpuje obok
sowa kluczowego CASE. Zamiast tego zaprezentowany format pozwala na zbudowanie
bardziej zoonego wyraenia warunkowego, ktre umieszczane jest po sowie kluczowym WHEN.
W przypadku powyszych przykadw nie ma znaczenia, ktra klauzula CASE zostanie
zastosowana, gdy obie zwracaj ten sam wynik. Spjrzmy teraz na inny przykad,
w ktrym podany wynik uzyskamy tylko dziki zastosowaniu formatu przeszukujcego.
Kolejny przykad bdzie oparty na danych z poniszej tabeli:

Format przeszukujcy
IDProduktu

Owoc

Warzywo

Jabko

Pomaracza

Przyprawa

OpisProduktu

Musztarda
Marchew

W powyszym przykadzie baza danych zawiera wiele kolumn z informacjami o tym,


czy dany produkt jest owocem, warzywem czy przypraw. Wyraenie CASE zwracajce
analogiczny wynik to:
SELECT
CASE
WHEN Owoc = 'X' THEN 'Owoc'
WHEN Warzywo = 'X' THEN 'Warzywo'
ELSE 'Inne'
END AS 'Kategoria',
OpisProduktu AS 'Opis'
FROM Produkty

Ponownie otrzymamy wynik:


Kategoria

Opis

Owoc

Jabko

Owoc

Pomaracza

Inne

Musztarda

Warzywo

Marchew

Poniewa w danych znajduj si teraz trzy oddzielne kolumny wskazujce na to, czy
dany produkt jest owocem, warzywem czy przypraw, konieczne jest uycie przeszukujcego formatu klauzuli CASE, aby wyraenie odpowiadao naszym wymaganiom
pod wzgldem logicznym. Format prosty dziaa tylko w przypadku, gdy analizowana
jest pojedyncza kolumna.
Ze wzgldu na wewntrzn zoono logiki IF-THEN-ELSE, wyraenie CASE jest jednym z trudniejszych tematw omawianych w niniejszej ksice. W tym rozdziale skupilimy si na wykorzystaniu wyrae CASE w miejscu listy_kolumn instrukcji SELECT.
Jednak wyraenia CASE mog by take wykorzystywane w innych klauzulach SQL, takich
jak ORDER BY lub klauzule WHERE i HAVING, ktrych jeszcze nie omwilimy.
Przedstawi teraz chocia jeden przykad innego zastosowania wyraenia CASE. Pomimo e jeszcze nie omawialimy klauzuli WHERE, wyobramy sobie, e jest nam znana. Jak
przekonamy si, czytajc rozdzia 7., umoliwia ona zastosowanie kryteriw wyboru
w stosunku do wierszy prezentowanych uytkownikowi. Typowe wyraenie z klauzul
WHERE ma nastpujcy format:
WHERE OpisProduktu = 'Biaa Rkawiczka'

67

68

Rozdzia 6

Logika obliczania wartoci wyjciowych w kolumnach

Jest to bardzo specyficzne polecenie, za pomoc ktrego wskazujemy, e chcemy wywietli tylko wiersze, w ktrych produkt to biaa rkawiczka. Zalet wyraenia CASE
jest to, e pozwala ono na zastosowanie logiki warunkowej wobec wartoci przez nas
poszukiwanej, by moe na podstawie zawartoci innej kolumny. Na przykad wemy pod
uwag inn kolumn, o nazwie RodzajProduktu, ktra zawiera wicej informacji o produktach. Korzystajc z wyraenia CASE, moemy wybra produkty takie jak biaa rkawiczka, gdy RodzajProduktu to X, bd produkty, ktre s skarpetkami, jednak tylko
w przypadku, gdy RodzajProduktu to Y. Podsumowujc, aby zawrze w instrukcji SELECT
bardziej zoon logik, mona zamieni wyraenie CASE na warto 'Biaa Rkawiczka'
podan w klauzuli WHERE.

Co dalej?
Wyraenia CASE mog by wykorzystywane w celu dokonania weryfikacji pod wzgldem
logicznym zawartoci kolumny lub wyraenia wystpujcego w miejscu listy_kolumn
w instrukcji SELECT. Istniej dwa podstawowe formaty tego wyraenia: prosty i przeszukujcy. Typowym zastosowaniem CASE jest moliwo zamiany niejasnych elementw danych na zrozumiae wartoci. Na koniec naley rwnie nadmieni, e chocia rozdzia ten nosi tytu Logika obliczania wartoci wyjciowych w kolumnach,
wyraenia CASE mog by stosowane rwnie w innych miejscach ni tylko lista_kolumn
w instrukcji SELECT. Mog by wykorzystywane w dowolnym miejscu, w ktrym chciaby
okreli logik warunkow w odniesieniu do danej kolumny lub elementu danych.
W kolejnym rozdziale wyjdziemy nieco poza zagadnienia zwizane z logik obliczania
wartoci w kolumnach. Rozdzia ten bdzie traktowa o tym, jak stosowa logik przy wyborze wierszy. Z pewnoci wanie na to czekae, gdy moliwo okrelenia kryteriw
wyboru w instrukcji SELECT jest istotna z punktu widzenia wikszoci budowanych zapyta. W rzeczywistoci instrukcja SELECT bez jakichkolwiek kryteriw wyboru byaby bardzo nietypowa. Tematy poruszane w nastpnym rozdziale pozwol Ci posi t wiedz.

R OZ DZ I A 7

L OGIKA
OBLICZANIA
WARTOCI
WYJCIOWYCH
W WIERSZACH
NOWE SOWA KLUCZOWE: WHERE, TOP/LIMIT/ROWNUM

Nareszcie nadszed moment, w ktrym bd mg zaprezentowa zastosowanie kryteriw wyboru w stosunku do tabel. Do tej chwili nasze instrukcje SELECT zawsze zwracay kady wiersz znajdujcy si w tabeli. Tak w rzeczywistoci bdzie si dziao sporadycznie. Zazwyczaj chcemy bowiem pobra wycznie dane bdce przedmiotem naszego
zainteresowania i speniajce okrelone kryteria. Tym wanie problemem zajmiemy
si w tym rozdziale.
Przy wyborze klientw zazwyczaj bdziesz zainteresowany pewnym ich podzbiorem.
Jeli chcesz obejrze zamwienia zoone przez Twoich klientw, to prawdopodobnie
chcesz tylko zobaczy zamwienia speniajce okrelone kryteria. Jeli natomiast chcesz
przyjrze si produktom, to pewnie jeste zainteresowany informacj tylko o niektrych ich rodzajach. Rzadko kto chce po prostu zobaczy wszystkie dane. Zazwyczaj
interesuje nas niewielki podzbir danych w celu dokonania analizy lub przyjrzenia si
jednemu szczeglnemu aspektowi.

Zastosowanie kryteriw selekcji


Kryteria selekcji w SQL definiowane s po klauzuli WHERE. Poprzez zastosowanie sowa
kluczowego WHERE mamy moliwo wyboru podzbioru wierszy. Logika wykorzystana
w przypadku tego sowa kluczowego opiera si na logice obliczania wartoci w kolumnach,
69

70

Rozdzia 7

Logika obliczania wartoci wyjciowych w wierszach

ktr poznalimy w poprzednim rozdziale. Rnica polega na tym, e wyraenie CASE


pozwala jedynie na zastosowanie logiki do okrelonej kolumny, teraz natomiast moliwe bdzie zastosowanie logiki do wszystkich wierszy w tabeli.
Poniej zaprezentowano oglny format klauzuli SELECT wraz z klauzul WHERE oraz innymi, ktre ju wczeniej omwilimy:
SELECT lista_kolumn
FROM lista_tabel
WHERE warunek
ORDER BY lista_kolumn

Jak wida, klauzula WHERE musi zawsze znajdowa si pomidzy klauzul FROM i ORDER BY.
Waciwie kada z wymienionych powyej klauzul musi wystpowa w takiej kolejnoci, jak pokazano.
Spjrzmy na przykad oparty na danych z poniszej tabeli Zamwienia:
IDZamwienia

Imi

Nazwisko

ZakupionaIlo

CenaZaSztuk

Jan

Kowalski

2,50

Piotr

Nowak

10

1,25

Barbara

Kwiatkowska

4,00

Rozpoczniemy od instrukcji SELECT z prost klauzul WHERE:


SELECT
Imi,
Nazwisko,
ZakupionaIlo
FROM Zamwienia
WHERE Nazwisko = 'Kwiatkowska'

Wynik tej instrukcji jest nastpujcy:


Imi

Nazwisko

ZakupionaIlo

Barbara

Kwiatkowska

Poniewa w klauzuli WHERE wybieramy tylko te wiersze, dla ktrych w kolumnie


Nazwisko wystpuje warto Kwiatkowska, zwracany jest tylko jeden z trzech wierszy
znajdujcych si w tabeli.
Zauwa, e podana warto kolumny Nazwisko zostaa ujta w cudzysw. Stao si tak
ze wzgldu na fakt, e jest to kolumna typu tekstowego. W przypadku pl liczbowych cudzysw jest zbdny. Przykadowo, ponisza instrukcja SELECT zwraca dokadnie te
same dane:
SELECT
Imi,
Nazwisko,
ZakupionaIlo
FROM Zamwienia
WHERE ZakupionaIlo = 5

Operatory klauzuli WHERE

Operatory klauzuli WHERE


W powyszych dwch instrukcjach znak rwnoci (=) jest operatorem w klauzuli
WHERE. Znak rwnoci oznacza test rwnoci. Oglny format pokazany powyej wskazuje,
e po sowie kluczowym WHERE wystpuje warunek. Warunek ten skada si z operatora z dwoma wyraeniami po obu stronach.
Poniej zebrano list podstawowych operatorw, ktre mog by wykorzystywane
w klauzuli WHERE:
Operator WHERE

Znaczenie

rwny

<>

rny

>

wikszy od

<

mniejszy od

>=

wikszy lub rwny

<=

mniejszy lub rwny

Bardziej zaawansowane operatory omwimy w nastpnym rozdziale.


Znaczenie operatora rwnoci (=) i operatora wskazujcego na co rnego od danej
wartoci (<>) jest do oczywiste. Oto przykad klauzuli WHERE z operatorem wikszy
od, przy uwzgldnieniu danych z tej samej tabeli Zamwienia, co powyej:
SELECT
Imi,
LastName,
ZakupionaIlo
FROM Zamwienia
WHERE ZakupionaIlo > 6

Wynik tej instrukcji jest nastpujcy:


Imi

Nazwisko

ZakupionaIlo

Piotr

Nowak

10

W tym przykadzie tylko jeden wiersz spenia warunek mwicy o tym, e warto w kolumnie ZakupionaIlo ma by wiksza ni 6. Chocia nie jest to powszechnie stosowana
praktyka, operatora wikszy od mona take uywa w odniesieniu do kolumn zawierajcych wartoci tekstowe. Przykadem jest ponisza instrukcja:
SELECT
Imi,
Nazwisko
FROM Zamwienia
WHERE Nazwisko > 'K'

zwracajca nastpujcy wynik:


Imi

Nazwisko

Piotr

Nowak

71

72

Rozdzia 7

Logika obliczania wartoci wyjciowych w wierszach

Poniewa w przykadzie wybierane s nazwiska, ktre rozpoczynaj si od litery wystpujcej w alfabecie dalej ni litera K, zwracane jest wycznie nazwisko Nowak, a pomijane nazwiska Kowalski i Kwiatkowska. Kiedy operatory wikszy od lub mniejszy od
s stosowane w odniesieniu do pl tekstowych, wwczas selekcja wierszy odbywa si
wedug kolejnoci alfabetycznej. W naszym przypadku zwracany jest tylko wiersz z nazwiskiem Nowak, poniewa litera N wystpuje w alfabecie po literze K.
Na koniec naley nadmieni, e wszystkie wymienione powyej operatory mog by
wykorzystywane w poczeniu ze sowem kluczowym WHEN w formacie szukajcym
wyraenia CASE, ktre miaoby nastpujc posta:
CASE
WHEN kolumna1 > warto1 THEN wynik1
END

Ograniczanie liczby zwracanych wierszy


Co zrobi, jeli chcemy wybra jedynie niewielki podzbir wierszy z tabeli i jest nam
obojtne, ktre wiersze znajd si w wyniku? Powiedzmy, e mamy tabel zawierajc
50 000 wierszy i chcemy jedynie wybra kilka z nich, aby zobaczy, jak wygldaj zawarte w niej dane. W tym przypadku uycie klauzuli WHERE nie miaoby sensu, poniewa nie jest dla nas wane to, ktre wiersze pojawi si w wyniku instrukcji SELECT.
Rozwizaniem tego problemu jest uycie specjalnego sowa kluczowego pozwalajcego
okreli liczb zwracanych wierszy. Jest to kolejny przykad, gdzie skadnia rni si
w zalenoci od bazy danych, z ktrej korzystamy. W Microsoft SQL Server tym sowem
kluczowym jest TOP, a format jego zastosowania w instrukcji SELECT wyglda nastpujco:
SELECT
TOP liczba
lista_kolumn
FROM tabela

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

W MySQL zamiast sowa kluczowego TOP wystpuje sowo LIMIT. Oglny format instrukcji SELECT
prezentujcy jego zastosowanie to:
SELECT
lista_kolumn
FROM tabela
LIMIT liczba

W Oracle natomiast zamiast sowa TOP wystpuje sowo kluczowe ROWNUM, ktre jest stosowane
w klauzuli WHERE, tak jak pokazano poniej:
SELECT
lista_kolumn
FROM tabela
WHERE ROWNUM <= liczba

Ograniczanie liczby wierszy za pomoc sortowania

W dalszej czci tego rozdziau zamieszczono instrukcje z wykorzystaniem sowa kluczowego TOP, stosowanego w przypadku bazy danych firmy Microsoft. Jeli uywasz
MySQL lub Oracle, zastosuj odpowiednio sowa kluczowe LIMIT lub ROWNUM.
Powiedzmy, e chcemy zobaczy pierwszych 10 wierszy z tabeli. Instrukcja SELECT,
ktra moe nam do tego posuy, ma nastpujc skadni:
SELECT
TOP 10 *
FROM tabela

Powysza instrukcja zwraca wszystkie kolumny w pierwszych 10 wierszach z tabeli.


Jak w przypadku kadej instrukcji SELECT bez klauzuli ORDER BY, nie sposb przewidzie, ktrych 10 wierszy zostanie wywietlonych w wyniku. Zaley to od tego, w jaki
sposb dane s fizycznie przechowywane w tabeli.
Analogicznie, w nastpujcy sposb moemy okreli, ktre kolumny maj pojawi si
w wyniku:
SELECT
TOP 10
kolumna1, kolumna2
FROM tabela

Tak naprawd, stosujc sowo kluczowe TOP, uzyskujemy podobny wynik jak w przypadku
zastosowania klauzuli WHERE, poniewa w rezultacie otrzymujemy niewielki podzbir
wierszy z okrelonej tabeli. Naley jednak pamita, e wiersze zwracane przy uyciu
tego sowa kluczowego nie stanowi prby losowej w sensie statystycznym. S to jedynie pierwsze wiersze, ktre znalazy si w wyniku na podstawie sposobu fizycznego
przechowywania danych w bazie danych.

Ograniczanie liczby wierszy za pomoc sortowania


Innym zastosowaniem sowa kluczowego TOP jest uycie go w poczeniu z klauzul
ORDER BY w celu uzyskania okrelonej liczby wierszy zawierajcych najwiksze wartoci oraz na bazie okrelonej kategorii. Ten rodzaj selekcji danych nosi nazw Top N.
Poniej znajduje si przykad oparty na danych z nastpujcej tabeli Ksiki:
IDKsiki

Tytu

Autor

SprzedaWBiecymMiesicu

Duma i uprzedzenie

Austen

15

Folwark zwierzcy

Orwell

Kupiec wenecki

Szekspir

Romeo i Julia

Szekspir

Oliver Twist

Dickens

Kandyd

Wolter

Szkaratna litera

Hawthorne

12

Hamlet

Szekspir

73

74

Rozdzia 7

Logika obliczania wartoci wyjciowych w wierszach

Powiedzmy, e chcemy zobaczy trzy ksiki, ktrych sprzedano najwicej w biecym miesicu. Instrukcja SELECT, za pomoc ktrej otrzymamy taki wynik, wyglda
nastpujco:
SELECT
TOP 3
Tytu AS 'Tytu ksiki',
SprzedaWBiecymMiesicu AS 'Sprzedana ilo'
FROM Ksiki
ORDER BY SprzedaWBiecymMiesicu DESC

Wynik, ktry otrzymamy, to:


Tytu ksiki

Sprzedana ilo

Duma i uprzedzenie

15

Szkaratna litera

12

Kandyd

Przeanalizujmy szczegowo powysz instrukcj. Wyraenie TOP 3 w drugim wierszu


wskazuje na to, e zostan zwrcone tylko trzy wiersze. Podstawowe pytanie brzmi jednak, skd wiadomo, ktre wiersze powinny zosta wywietlone. Odpowied znajduje
si w klauzuli ORDER BY. Gdyby jej nie byo, instrukcja SELECT zwrciaby po prostu jakiekolwiek trzy wiersze danych, co nie byo przecie nasz intencj, jako e poszukiwalimy trzech wierszy z najwiksz liczb sprzedanych sztuk. Aby to osign, trzeba
posortowa wiersze wzgldem kolumny SprzedaWBiecymMiesicu w porzdku malejcym. Dlaczego wanie malejcym? Poniewa podczas sortowania w kolejnoci malejcej najwysze numery wywietlane s w pierwszej kolejnoci. Gdybymy posortowali
dane w kolejnoci rosncej, otrzymalibymy odwrotny wynik, a mianowicie list ksiek z najmniejsz liczb sprzedanych egzemplarzy.
Urozmaimy jeszcze odrobin nasz scenariusz. Powiedzmy, e chcemy zobaczy tylko
ksik autorstwa Szekspira, ktrej sprzeda bya najwiksza. Aby to osign, do zaprezentowanej powyej instrukcji SELECT naley doda klauzul WHERE:
SELECT
TOP 1
Tytu AS 'Tytu ksiki',
SprzedaWBiecymMiesicu AS 'Sprzedana ilo'
FROM Ksiki
WHERE Autor = 'Szekspir'
ORDER BY SprzedaWBiecymMiesicu DESC

Instrukcja SELECT zwrci nastpujcy wynik:


Tytu ksiki

Sprzedana ilo

Romeo i Julia

W klauzuli WHERE znajduje si kwalifikator wskazujcy na to, e poszukujemy jedynie


ksiek autorstwa Szekspira. Zmienilimy rwnie liczb wystpujc ze sowem kluczowym TOP na 1, tym samym wybierajc tylko jeden wiersz danych.

Co dalej?

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

Procedura ograniczania liczby wierszy oraz ich sortowania w Oracle jest nieco bardziej skomplikowana,
poniewa ROWNUM w skadni Oracle znajduje si w klauzuli WHERE. Najpierw konieczne jest posortowanie danych, a nastpnie zastosowanie ROWNUM jako kryterium selekcji. Oglny format dla tego rodzaju instrukcji SELECT w Oracle jest nastpujcy:
SELECT *
FROM
(SELECT
lista_kolumn
FROM tabela
ORDER BY lista_kolumn DESC)
WHERE ROWNUM <= liczba

Powyej mamy przykad instrukcji bdcej podzapytaniem. Podzapytania zostan szczegowo omwione w rozdziale 14. W skrcie, powysza instrukcja skada si z dwch odrbnych instrukcji SELECT.
Wewntrzny SELECT, ujty w nawiasie, sortuje dane wedug wyspecyfikowanej listy_kolumn
w kolejnoci malejcej. Zewntrzny SELECT nastpnie pobiera dane z wewntrznej instrukcji SELECT
przy uyciu sowa kluczowego ROWNUM w celu ograniczenia liczby wywietlanych wierszy.

Co dalej?
W niniejszym rozdziale omwiony zosta sposb zastosowania kryteriw selekcji w zapytaniach SQL. Zaprezentowano kilka podstawowych operatorw, takich jak rwny
czy wikszy od. Umiejtno okrelenia podstawowych kryteriw selekcji zblia nas
nieco do uczynienia naszych instrukcji SQL naprawd uytecznymi. Dziki zastosowaniu klauzuli WHERE moemy zbudowa instrukcj pobierajc wszystkich klientw
z wojewdztwa pomorskiego.
Nauczylimy si rwnie, w jaki sposb ogranicza liczb wierszy zwracanych przez
zapytanie. Ponadto, nabyta umiejtno ograniczania liczby wierszy w poczeniu z klauzul ORDER BY umoliwia nam wyselekcjonowanie TOP N danych, co, jak pokazano,
jest do uyteczne.
W nastpnym rozdziale, zatytuowanym Logika Boolea, zamierzam znacznie poszerzy Twoj wiedz odnonie kryteriw selekcji poprzez wprowadzenie kilku nowych
sw kluczowych, ktre wzbogac funkcjonalno klauzuli WHERE. Potrafisz ju wybra
klientw z wojewdztwa pomorskiego, ale jak powinna zosta zmodyfikowana klauzula
SELECT, aby wybra klientw z wojewdztwa pomorskiego lub mazowieckiego, jednoczenie niebdcych mieszkacami Gdyni ani Warszawy? Sowa kluczowe omwione
w rozdziale 8. umoliwi Ci wybr takich danych.

75

76

Rozdzia 7

Logika obliczania wartoci wyjciowych w wierszach

R OZ DZ I A 8

L OGIKA
B OOLE A
NOWE SOWA KLUCZOWE: AND, OR, NOT, BETWEEN, IN, IS, NULL

W poprzednim rozdziale wprowadzilimy pojcie kryteriw selekcji, ale tylko w najprostszej postaci. Teraz je rozbudujemy, aby znacznie zwikszy nasz zdolno wyboru
odpowiednich wierszy zwracanych przez instrukcj SELECT. Zaprezentujemy wic logik
SQL w czystej postaci. Ponadto, poznamy rne typy operatorw umoliwiajce budowanie zoonych wyrae logicznych.
Dziki tej wiedzy, gdy uytkownik poprosi Ci o list wszystkich klientek, ktrych kody pocztowe zawieraj si w przedziale od 02-100 do 02-800, jednak z wyczeniem
osb poniej 30. roku ycia bd nieposiadajcych adresu e-mail, bdziesz mg mu j
przekaza.

Zoone warunki logiczne


Klauzula WHERE zaprezentowana w poprzednim rozdziale wykorzystywaa tylko proste
kryteria selekcji. Tak klauzul bya na przykad:
WHERE ZakupionaIlo = 5

Warunek w powyszej klauzuli WHERE jest do prosty: zwraca tylko wiersze, dla ktrych warto w kolumnie ZakupionaIlo jest rwna 5.
W rzeczywistoci selekcja danych nie jest tak trywialna. W zwizku z tym pora zapozna si ze sposobami okrelania bardziej zoonych warunkw logicznych w ramach
kryteriw selekcji.
Umiejtno budowania zoonych warunkw logicznych czasami nosi nazw logiki
Boolea (ang. Boolean logic). To okrelenie, zaczerpnite z matematyki, odnosi si do
zdolnoci do formuowania zoonych warunkw, ktre s weryfikowane w kontekcie
77

78

Rozdzia 8

Logika Boolea

prawdy lub faszu. W wyej wymienionym przykadzie spenienie warunku Zakupiona


Ilo = 5 jest weryfikowane dla kadego wiersza w tabeli. Oczywicie, chcemy ostatecznie zobaczy tylko te wiersze, dla ktrych warunek ten jest speniony, czyli prawdziwy.
Podstawowe sowa kluczowe, ktrych uywa si w celu zbudowania zoonej logiki
Boolea, to AND, OR i NOT. Dziki nim klauzula WHERE zyskuje dodatkow funkcjonalno. W odpowiedniej kombinacji warunki z operatorami AND, OR i NOT, umieszczone
w nawiasach, pozwalaj na zbudowanie dowolnego wyraenia logicznego.

Operator AND
Dalsze przykady bd si odnosi do danych zebranych w poniszej tabeli Zamwienia:
IDZamwienia

Klient

Wojewdztwo

ZakupionaIlo

CenaZaSztuk

Jan Kowalski

pomorskie

2,50

Piotr Nowak

mazowieckie

10

1,25

Barbara
Kwiatkowska

wielkopolskie

4,00

Poniej znajduje si przykad klauzuli WHERE z operatorem AND:


SELECT
Klient,
ZakupionaIlo
FROM Zamwienia
WHERE ZakupionaIlo > 3
AND ZakupionaIlo < 7

Klauzula AND oznacza, e wszystkie wymienione warunki musz by dla danego wiersza spenione, aby znalaz si w wyniku powyszej instrukcji.
W instrukcji tej okrelono, e zwrcone maj by tylko te wiersze, dla ktrych warto
w kolumnie ZakupionaIlo jest wiksza od 3 oraz mniejsza od 7. Jej wynikiem s
wic tylko dwa wiersze:
Klient

ZakupionaIlo

Jan Kowalski

Barbara Kwiatkowska

Zauwa, e w wyniku nie ma wiersza zawierajcego dane Piotra Nowaka. Dlaczego tak
si stao? Piotr zakupi 10 sztuk produktu, a wic speniony jest pierwszy warunek
(ZakupionaIlo > 3). Jednake drugi warunek (ZakupionaIlo < 7) nie jest speniony,
a zatem nieprawdziwy. Gdy uywamy operatora AND, wszystkie okrelone warunki
musz by prawdziwe.

Operator OR

Operator OR
Spjrzmy teraz na operator OR. Klauzula AND oznaczaa, e wszystkie warunki musz by
spenione, aby wiersz pojawi si w wynikach zapytania SQL. Klauzula OR natomiast
oznacza, e wiersz zostanie wybrany, jeli ktrykolwiek z warunkw bdzie speniony.
Poniej znajduje si przykad instrukcji SELECT z operatorem OR, oparty na tej samej
tabeli:
SELECT
Klient,
ZakupionaIlo,
CenaZaSztuk
FROM Zamwienia
WHERE ZakupionaIlo > 8
OR CenaZaSztuk > 3

Wynik powyszego zapytania jest nastpujcy:


Klient

ZakupionaIlo

CenaZaSztuk

Piotr Nowak

10

1,25

Barbara Kwiatkowska

4,00

Dlaczego wywietlone zostay tylko wiersze z danymi dla Piotra Nowaka i Barbary Kwiatkowskiej? Wiersz z danymi dla Piotra Nowaka znalaz si w wyniku, poniewa spenia
wymagania pierwszego warunku (ZakupionaIlo > 8). Nie ma znaczenia, e drugi
warunek (CenaZaSztuk > 3) nie jest speniony, poniewa w przypadku zastosowania
operatora OR speniony musi by tylko jeden warunek.
Podobnie, wiersz z danymi dla Barbary Kwiatkowskiej zosta wybrany, poniewa speniony jest drugi warunek (CenaZaSztuk > 3) dla tego wiersza. Wiersz z danymi dla Jana
Kowalskiego nie znalaz si w wyniku, poniewa w jego przypadku nie jest speniony
aden z warunkw.

Zastosowanie nawiasw
Powiedzmy, e chcemy wybra tylko zamwienia zoone przez klientw z wojewdztwa pomorskiego lub mazowieckiego. Ponadto chcemy, aby byy to wycznie zamwienia, w ramach ktrych liczba zakupionych sztuk bya wiksza ni 8. Aby uzyska
takie dane, konieczne jest zastosowanie poniszej instrukcji SELECT:
SELECT
Klient,
Wojewdztwo,
ZakupionaIlo
FROM Zamwienia
WHERE Wojewdztwo = 'pomorskie'
OR Wojewdztwo = 'mazowieckie'
AND ZakupionaIlo > 8

79

80

Rozdzia 8

Logika Boolea

Po wykonaniu powyszego zapytania powinnimy otrzyma tylko jeden wiersz, z danymi dla Piotra Nowaka. Stanie si tak dlatego, e w tabeli znajduj si tylko dwa
wiersze z klientami z wojewdztwa pomorskiego lub mazowieckiego (Nowak i Kowalski). Jednake tylko jeden z nich (Nowak) kupi wicej ni 8 sztuk.
Jednak po wykonaniu podanej instrukcji otrzymamy nastpujcy wynik:
Klient

Wojewdztwo

ZakupionaIlo

Jan Kowalski

pomorskie

Piotr Nowak

mazowieckie

10

Co poszo nie tak? Dlaczego otrzymalimy dwa wiersze zamiast jednego? Odpowied
znajdziemy, analizujc sposb, w jaki SQL interpretuje klauzul WHERE, ktra zawiera
zarwno operator AND, jak i OR. Podobnie jak w przypadku innych jzykw programowania, w SQL wystpuje okrelona kolejno interpretacji poszczeglnych operatorw. Jeli inna kolejno nie jest wyranie okrelona, SQL zawsze przetwarza operator
AND przed operatorem OR. W poprzedniej instrukcji najpierw sprawdzany jest wic warunek z operatorem AND:
Wojewdztwo = 'mazowieckie'
AND ZakupionaIlo > 8

Wiersz, ktry spenia ten warunek, zawiera dane dla Piotra Nowaka. Nastpnie sprawdzany jest warunek z operatorem OR, zgodnie z ktrym klient ma pochodzi z wojewdztwa
pomorskiego. W wyniku tego dodawany jest wiersz z danymi dla Jana Kowalskiego.
W zwizku z tym ostatecznie oba te wiersze speniaj warunki z klauzuli WHERE.
Nie taki wynik chcielimy uzyska. Tego typu problem czsto pojawia si, gdy operatory AND i OR wystpuj razem w jednej klauzuli WHERE. Sposobem na wyeliminowanie
wieloznacznoci jest uycie nawiasw, za pomoc ktrych bdziemy mogli okreli
dokadn kolejno, w jakiej interpretowane bd warunki wprowadzane przez operatory. Dziki temu uzyskamy wynik zgodny z naszymi oczekiwaniami. Wszystko, co
zostanie ujte w nawiasy, bdzie brane pod uwag w pierwszej kolejnoci.
Aby uzyska podany wynik, dodajmy nawiasy do naszej instrukcji SELECT:
SELECT
Klient,
Wojewdztwo,
ZakupionaIlo
FROM Zamwienia
WHERE (Wojewdztwo = 'pomorskie'
OR Wojewdztwo = 'mazowieckie')
AND ZakupionaIlo > 8

Wynik powyszego zapytania bdzie nastpujcy:


Klient

Wojewdztwo

ZakupionaIlo

Piotr Nowak

mazowieckie

10

Zastosowanie wielu nawiasw

Dziki zastosowaniu nawiasw w instrukcji SELECT w pierwszej kolejnoci sprawdzone


zostanie wyraenie z operatorem OR (Wojewdztwo = 'pomorskie' OR Wojewdztwo =
'mazowieckie'). Zwrcony wynik jest teraz zgodny z naszymi oczekiwaniami.

Zastosowanie wielu nawiasw


Powiedzmy, e chcemy otrzyma w wyniku dwa rne zestawy wierszy z tabeli
Zamwienia: pierwszy zawierajcy wiersze z danymi klientw z wojewdztwa wielkopolskiego, a drugi przedstawiajcy dane klientw z wojewdztwa pomorskiego, ktrzy
dokonali zakupu co najmniej 3, jednak nie wicej ni 10 sztuk produktu. Taki wynik
moemy otrzyma, budujc nastpujc instrukcj SELECT:
SELECT
Klient,
Wojewdztwo,
ZakupionaIlo
FROM Zamwienia
WHERE Wojewdztwo = 'wielkopolskie'
OR (Wojewdztwo = 'pomorskie'
AND (ZakupionaIlo >= 3
AND ZakupionaIlo <= 10))

Wynik powyszej instrukcji bdzie nastpujcy:


Klient

Wojewdztwo

ZakupionaIlo

Jan Kowalski

pomorskie

Barbara Kwiatkowska

wielkopolskie

Zauwa, e w naszej instrukcji SELECT znajduj si dwa zestawy nawiasw. Ich wykorzystanie jest analogiczne do zastosowania nawiasw w przypadku funkcji zagniedonych zaprezentowanych w rozdziale 4. Jeli chodzi o funkcje, w przypadku gdy wystpuje
wicej ni jeden zestaw nawiasw, najpierw sprawdzana jest funkcja zagniedona
w najgbiej osadzonym nawiasie. Tak samo dzieje si w przypadku nawiasw wykorzystywanych w wyraeniach logicznych. W naszym przykadzie najgbiej osadzony
zestaw nawiasw to:
(ZakupionaIlo >= 3
AND ZakupionaIlo <= 10)

Dopiero wwczas, gdy prawdziwo powyszego wyraenia zostanie zweryfikowana


dla kadego z wierszy w tabeli, mona przej do sprawdzania wyraenia z zewntrznego zestawu nawiasw:
(Wojewdztwo = 'pomorskie'
AND (ZakupionaIlo >= 3
AND ZakupionaIlo <= 10))

Na koniec dodajemy ostatni lini z klauzuli WHERE (ktra nie jest ujta w adnych nawiasach):

81

82

Rozdzia 8

Logika Boolea

WHERE Wojewdztwo = 'wielkopolskie'


OR (Wojewdztwo = 'pomorskie'
AND (ZakupionaIlo >= 3
AND ZakupionaIlo <= 10))

Operator NOT
Gdy istnieje potrzeba zbudowania zoonego warunku logicznego, oprcz operatorw
AND i OR czsto przydatny okazuje si operator NOT. Operator ten wyraa zaprzeczenie
lub warto odwrotn, w zalenoci od tego, co po nim nastpuje. Oto prosty przykad
jego zastosowania:
SELECT
Klient,
Wojewdztwo,
ZakupionaIlo
FROM Zamwienia
WHERE NOT Wojewdztwo = 'wielkopolskie'

Wynik powyszej instrukcji jest nastpujcy:


Klient

Wojewdztwo

ZakupionaIlo

Jan Kowalski

pomorskie

Piotr Nowak

mazowieckie

10

Zwrcone wiersze zawieraj dane dla klientw, ktrzy nie s z wojewdztwa wielkopolskiego. W tym prostym przykadzie operator NOT nie jest jednak jedynym, ktry mona
w tym przypadku zastosowa. Powysz instrukcj mona rwnie zapisa w nastpujcy sposb, aby otrzyma ten sam wynik:
SELECT
Klient,
Wojewdztwo,
ZakupionaIlo
FROM Zamwienia
WHERE Wojewdztwo <> 'wielkopolskie'

W powyszym zapytaniu za pomoc operatora rny od (<>) uzyskujemy ten sam


wynik, co przy zastosowaniu operatora NOT.
Poniej znajduje si bardziej zoony przykad z zastosowaniem operatora NOT:
SELECT
Klient,
Wojewdztwo,
ZakupionaIlo
FROM Zamwienia
WHERE NOT (Wojewdztwo = 'pomorskie'
OR Wojewdztwo = 'wielkopolskie')

Wynik powyszej instrukcji to:


Klient

Wojewdztwo

ZakupionaIlo

Piotr Nowak

mazowieckie

10

Operator NOT

Gdy operator NOT zostanie zastosowany przed zestawem nawiasw, odnosi si do wszystkiego, co zostao podane w nawiasie, a wic stanowi zaprzeczenie tego, co jest w nim
zdefiniowane. W powyszym przykadzie chcielimy wywietli wszystkie wiersze, dla
ktrych wojewdztwo nie jest wojewdztwem pomorskim ani wielkopolskim.
Ponownie, zwr uwag na to, e operator NOT moe zosta zastpiony przez inny. Te
same wyniki co powyej mona rwnie uzyska, budujc nastpujc analogiczn instrukcj:
SELECT
Klient,
Wojewdztwo,
ZakupionaIlo
FROM Zamwienia
WHERE Wojewdztwo <> 'pomorskie'
AND Wojewdztwo <> 'wielkopolskie')

By moe potrzebujesz chwilki, aby dostrzec fakt, e oba powysze zapytania s rwnowane. Pierwsza instrukcja wykorzystuje operator NOT oraz wyraenie logiczne z operatorem OR. Druga natomiast prezentuj t sam logik, ale przy wykorzystaniu operatora AND.
Na koniec jeszcze jeden przykad zastosowania operatora NOT w zoonej instrukcji:
SELECT
Klient,
Wojewdztwo,
ZakupionaIlo
FROM Zamwienia
WHERE NOT (Wojewdztwo = 'pomorskie'
AND ZakupionaIlo > 3)

Jej wynik to:


Klient

Wojewdztwo

ZakupionaIlo

Piotr Nowak

mazowieckie

10

Barbara Kwiatkowska

wielkopolskie

Tak jak poprzednio, powysze zapytanie mona zmodyfikowa tak, aby zwracao taki
sam wynik przy zastosowaniu innego operatora:
SELECT
Klient,
Wojewdztwo,
ZakupionaIlo
FROM Zamwienia
WHERE Wojewdztwo <> 'pomorskie'
OR ZakupionaIlo <= 3

Jak wida na powyszych przykadach, w przypadku zoonych wyrae zawierajcych takie operatory arytmetyczne jak znak rwnoci (=) czy mniej od (<) uycie
operatora NOT nie jest do koca logiczne. Jednake lepiej jest umieci operator NOT
przed wyraeniem logicznym, ni dokonywa przeksztace tego wyraenia do postaci

83

84

Rozdzia 8

Logika Boolea

niezawierajcej takiego operatora. Innymi sowy, operator NOT moe okaza si przydatny w wyraeniach logicznych.

Operator BETWEEN
Przyjrzymy si teraz dwm szczeglnym operatorom, ktre mog uproci wyraenia
zazwyczaj wymagajce uycia operatora OR lub AND. Mowa o operatorach BETWEEN i IN.
Operator BETWEEN pozwala skrci wyraenie zawierajce operator AND, w ktrym wystpuje znak oznaczajcy wikszy lub rwny (>=) oraz znak wskazujcy na mniejszy
lub rwny (<=), do postaci prostego wyraenia z jednym operatorem.
Zobaczmy to na przykadzie. Powiedzmy, e chcemy wybra wszystkie wiersze, w przypadku ktrych liczba zakupionych przez klienta produktw wynosi co najmniej 5, ale
nie wicej ni 20. Moemy na tej podstawie zbudowa nastpujc instrukcj SELECT:
SELECT
Klient,
ZakupionaIlo
FROM Zamwienia
WHERE ZakupionaIlo >= 5
AND ZakupionaIlo <= 20

Analogiczna instrukcja, w ktrej zastosowano operator BETWEEN, bdzie miaa posta:


SELECT
Klient,
ZakupionaIlo
FROM Zamwienia
WHERE ZakupionaIlo BETWEEN 5 AND 20

W obu przypadkach instrukcja SELECT zwraca nastpujcy wynik:


Klient

ZakupionaIlo

Piotr Nowak

10

Barbara Kwiatkowska

Operator BETWEEN zawsze wymaga uycia operatora AND pomidzy dwiema podawanymi liczbami.
Zwr uwag na wzgldn prostot operatora BETWEEN, a take na fakt, e to sowo
kluczowe jest rwnoznaczne wycznie z uyciem operatorw wikszy lub rwny
(>=) oraz mniejszy lub rwny (<=). Operatora BETWEEN nie mona uy, gdy chcemy
odnie si do przedziau wyraonego za pomoc operatorw wikszy od (>) oraz
mniejszy od (<). W naszym przykadzie wiersz z danymi dla Barbary Kwiatkowskiej
pojawi si w wynikach, gdy liczba produktw zakupionych przez t klientk jest
rwna 5, a wic znajduje si w przedziale od 5 do 20.
Razem z klauzul BETWEEN mona uy operatora NOT. Przykadem moe by nastpujca instrukcja SELECT:

Operator IN
SELECT
Klient,
ZakupionaIlo
FROM Zamwienia
WHERE ZakupionaIlo NOT BETWEEN 5 AND 20

Zwraca ona nastpujcy wynik:


Klient

ZakupionaIlo

Jan Kowalski

Operator IN
Podobnie jak operator BETWEEN jest rwnoznaczny ze szczeglnym przypadkiem uycia operatora AND, zastosowanie operatora IN jest analogiczne do okrelonego uycia
operatora OR. Powiedzmy, e chcemy zobaczy wiersze z danymi dla wojewdztwa
pomorskiego lub wielkopolskiego. Podane informacje uzyskamy, budujc nastpujc instrukcj SELECT:
SELECT
Klient,
Wojewdztwo
FROM Zamwienia
WHERE Wojewdztwo = 'pomorskie'
OR Wojewdztwo = 'wielkopolskie'

Taki sam wynik otrzymamy, uruchamiajc ponisz instrukcj SELECT, w ktrej wykorzystany zosta operator IN:
SELECT
Klient,
Wojewdztwo
FROM Zamwienia
WHERE Wojewdztwo IN ('pomorskie', 'wielkopolskie')

W obu przypadkach zwrcony wynik to:


Klient

Wojewdztwo

Jan Kowalski

pomorskie

Barbara Kwiatkowska

wielkopolskie

Zauwa, e wartoci w nawiasach wystpujce po sowie kluczowym IN zostay oddzielone przecinkami.


Przedstawiony powyej przykad by moe nie dowodzi uytecznoci operatora IN,
gdy dotyczy tylko dwch wymienionych wojewdztw. Operator ten mona jednak
rwnie dobrze zastosowa w sytuacjach, gdy chcemy umieci w nawiasie dziesitki
konkretnych wartoci. To znacznie redukuje ilo elementw koniecznych do umieszczenia w instrukcji SELECT. Z innym przydatnym zastosowaniem operatora IN mamy
do czynienia w sytuacjach, gdy chcemy uy danych z pliku Excel w instrukcji SQL. Jeli
chcemy umieci w instrukcji SQL wiele wartoci z ssiednich komrek wystpujcych

85

86

Rozdzia 8

Logika Boolea

w arkuszu kalkulacyjnym, Excel umoliwia skopiowanie tych elementw z separatorem w postaci przecinka. Wynik ten mona nastpnie umieci w nawiasach wystpujcych po operatorze IN.
Tak jak w przypadku operatora BETWEEN, w instrukcji SELECT z operatorem IN rwnie
mona zastosowa sowo kluczowe NOT, co pokazano w poniszym przykadzie:
SELECT
Klient,
Wojewdztwo
FROM Zamwienie
WHERE Wojewdztwo NOT IN ('pomorskie', 'wielkopolskie')

Powysza instrukcja SELECT zwraca nastpujcy wynik:


Klient

Wojewdztwo

Piotr Nowak

mazowieckie

I ostatnia uwaga na temat operatora IN. Istnieje drugi sposb zastosowania operatora
IN, ktrego skadnia rni si zasadniczo od tej dotychczas omawianej. Polega on na
tym, e w nawiasach podana jest caa instrukcja SELECT, dziki czemu moliwy jest
wybr poszczeglnych wartoci w formie podzapytania (ang. subquery). Podzapytania
zostan szczegowo omwione w rozdziale 14.

Logika Boolea a wartoci NULL


Na pocztku tego rozdziau stwierdziem, e logika Boolea w SQL weryfikuje zoone
wyraenia pod ktem tego, czy s prawdziwe czy faszywe. Twierdzenie to nie byo do
koca prawd. W wyniku weryfikacji warunkw w klauzuli WHERE mamy waciwie
trzy moliwoci: prawda, fasz i warto nieznana. Moliwo uzyskania w wyniku wartoci nieznanej wynika z faktu, e kolumny w bazach danych SQL czasami mog zawiera wartoci NULL. Jak wspomniano w rozdziale 1., wartoci NULL to takie, dla ktrych
brak jest danych.
W SQL istnieje specjalne sowo kluczowe, ktre pozwala dokona sprawdzenia, czy
w kolumnie wymienionej w klauzuli WHERE wystpuj wartoci NULL. Tym sowem kluczowym jest IS NULL. Spjrzmy na przykad oparty na poniszej tabeli Produkty:
IDProduktu

OpisProduktu

Waga

Drukarka A

NULL

Drukarka B

Monitor C

Laptop D

Na potrzeby tego przykadu wyobra sobie, e gdy do tabeli Produkty dodawane s wiersze, pocztkowo w kolumnie Waga nie s uzupeniane adne wartoci. Jest wic w niej
wstawiana warto NULL, a uytkownik systemu dopiero pniej przypisuje wag do
konkretnego produktu.

Logika Boolea a wartoci NULL

Powiedzmy, e za pomoc poniszej instrukcji SELECT chcemy wybra te produkty, dla


ktrych nie zostaa okrelona waga:
SELECT
OpisProduktu,
Waga
FROM Produkty
WHERE Waga = 0

Powysze zapytanie zwrci nastpujcy wynik:


OpisProduktu

Waga

Drukarka B

Nie jest to wynik, o jaki nam chodzio. Waga rwna 0 nie jest tym samym, co warto
NULL. Naley zatem dokona zmiany w instrukcji SELECT do nastpujcej postaci:
SELECT
OpisProduktu,
Waga
FROM Produkty
WHERE Waga = 0
OR Waga IS NULL

Otrzymamy wwczas wynik:


OpisProduktu

Waga

Drukarka A

NULL

Drukarka B

Do sowa kluczowego IS NULL moemy rwnie doda negacj. Powstanie wwczas


sowo IS NOT NULL, ktre umoliwia pobranie wszystkich wierszy, ktre nie maj wartoci
NULL w okrelonej kolumnie.
Naley doda, e funkcja ISNULL, omwiona w rozdziale 4., moe stanowi alternatyw dla sowa kluczowego IS NULL. Odpowiednik poprzedniej instrukcji SELECT wykorzystujcy funkcj ISNULL to instrukcja o nastpujcej postaci:
SELECT
OpisProduktu,
Waga
FROM Produkty
WHERE ISNULL(Waga, 0) = 0

Powysza instrukcja pobiera te same dwa wiersze, co powyej. Funkcja ISNULL konwertuje
wszystkie wartoci w kolumnie Waga, ktre maj warto NULL, na warto 0. Chocia
klauzula WHERE zdaje si weryfikowa, czy dana warto w kolumnie jest rwna 0, to
w rzeczywistoci sprawdza, czy jest to warto 0 czy NULL.
Mona rwnie poczy w jednej instrukcji SELECT zastosowanie funkcji ISNULL oraz
sowa kluczowego IS NULL w nastpujcy sposb:

87

88

Rozdzia 8

Logika Boolea

SELECT
OpisProduktu,
ISNULL (Waga, 0) AS 'Waga'
FROM Produkty
WHERE Waga = 0
OR Waga IS NULL

Wynik powyszej instrukcji to:


OpisProduktu

Waga

Drukarka A

Drukarka B

Co dalej?
W tym rozdziale omwione zostay sposoby tworzenia zoonych wyrae logiki selekcji danych. Poznalimy rwnie podstawowe operatory logiczne, takie jak AND, OR i NOT.
Przyswoilimy rwnie wiedz dotyczc operatorw BETWEEN oraz IN, ktre pozwalaj
w niektrych sytuacjach na bardziej zwize zadeklarowanie warunkw ni w przypadku operatorw AND i OR. Nawiasy natomiast okazay si kolejnym istotnym narzdziem
w formuowaniu wyrae zoonych. Wanie za pomoc nawiasw lub wielu zestaww nawiasw moemy stworzy niemal kady moliwy warunek logiczny. Na koniec
rozmawialimy o tym, w jaki sposb mona radzi sobie z wartociami NULL przy wyborze danych.
W kolejnym rozdziale zajmiemy si alternatywnymi metodami okrelania kryteriw
selekcji. W pierwszej kolejnoci zgbimy zagadnienie dopasowywania do wzorcw,
dziki czemu bdziemy mogli przeszukiwa dane poprzez podanie czci poszukiwanego sowa lub frazy. Bdziemy wic mogli, przykadowo, znale wszystkie produkty,
ktre zawieraj sowo biay. Druga poowa rozdziau powicona bdzie moliwoci
dopasowania poszukiwanych danych poprzez analiz brzmienia danego sowa lub wyraenia. To pozwoli znale na przykad wszystkich klientw, ktrych imi brzmi jak
Haley, podczas gdy w rzeczywistoci jest nim Hailey.

R OZ DZ I A 9

D OPASOWYWANIE
NIEPRECYZYJNIE
OKRELONYCH WARTOCI
NOWE SOWA KLUCZOWE: LIKE, SOUNDEX, DIFFERENCE

Chciabym teraz przedstawi dwie sytuacje, w ktrych dane, jakie maj zosta pobrane, nie s dokadnie okrelone. W pierwszym przypadku przyjrzymy si zagadnieniu
pobierania danych na podstawie dopasowania do wzorca okrelonego dla poszukiwanych sw lub wyrae. Moglibymy na przykad chcie odnale klientw, ktrych
nazwisko zawiera sowo bank.
Drugi przypadek bdzie stanowi niejako rozszerzenie koncepcji dopasowania do wzorca.
Bdzie on dotyczy moliwoci dopasowania danych za pomoc brzmienia danego sowa
lub frazy. Na przykad, moglibymy by zainteresowani wywietleniem klientw, ktrych
nazwisko brzmi jak Smith, nawet jeli nie jest dokadnie w ten sposb zapisywane.

Dopasowywanie do wzorca
Na pocztek przyjrzyjmy si zagadnieniu dopasowywania nieprecyzyjnie okrelonych
wartoci w wyraeniach, ktre czsto jest okrelane jako dopasowywanie do wzorca
(ang. pattern matching). W SQL, aby mona byo odnale w danej kolumnie wartoci
pasujce do wskazanego wzorca, w klauzuli WHERE wykorzystuje si operator LIKE. Operator ten wymaga zastosowania specjalnych znakw wieloznacznych (ang. wildcards),
za porednictwem ktrych okrelany jest wzorzec wyszukiwania. Zacznijmy zatem od
przykadu opartego na poniszej tabeli Filmy, do ktrej zbudowana zostaa nasza
pierwsza instrukcja SELECT zawierajca operator LIKE:
SELECT
TytuFilmu AS 'Film'
FROM Filmy
WHERE TytuFilmu LIKE '%MIO%'

89

90

Rozdzia 9

Dopasowywanie nieprecyzyjnie okrelonych wartoci

Tabela Filmy zawiera nastpujce dane:


IDFilmu

TytuFilmu

To wanie mio

Dziewczyna Pitaszek

Mio i mier

Sodki dra

Taka mio si nie zdarza

Do diaba z mioci

101 dalmatyczykw

W tym przypadku znakiem wieloznacznym jest znak procentu (%). Wskazuje on na


jakiekolwiek znaki. Moe to by rwnie cig spacji. Znak procentu (%) przed sowem
MIO oznacza, e przed tym sowem akceptowalne jest kade wyraenie zawierajce
jakiekolwiek znaki. Podobnie, symbol procentu (%) po sowie MIO znaczy, e po
tym sowie akceptowane bd wszelkie zwroty zoone z jakichkolwiek znakw.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W odrnieniu od Microsoft SQL Server oraz MySQL, w Oracle przy definiowaniu wzorcw dla wartoci
literaw wielko liter ma znaczenie. W przypadku tej bazy danych sowo MIO nie jest wic traktowane tak samo jak mio. W Oracle odpowiednikiem powyszej instrukcji jest zapytanie:
SELECT
TytuFilmu AS Film
FROM Filmy
WHERE TytuFilmu LIKE '%mio%';

W przypadku Oracle lepszym rozwizaniem jest zastosowanie funkcji UPPER do dokonania konwersji
danych na sowa pisane wielkimi literami w nastpujcy sposb:
SELECT
TytuFilmu AS Film
FROM Filmy
WHERE UPPER (TytuFilmu) LIKE '%MIO%';

Innymi sowy, szukamy jakiegokolwiek tytuu filmu, ktry zawiera sowo MIO.
Oto dane zwracane przez poprzedni instrukcj SELECT:
Film
To wanie mio
Mio i mier
Taka mio si nie zdarza

Zauwa, e sowo MIO pojawia si jako pierwsze bd jako ostatnie, a take wystpuje w rodku jednego z tytuw.

Dopasowywanie do wzorca

Sprbujmy teraz wybra tylko filmy, ktrych tytu rozpoczyna si od sowa MIO.
Gdy wykonamy ponisz instrukcj SELECT:
SELECT
TytuFilmu AS 'Film'
FROM Filmy
WHERE TytuFilmu LIKE 'MIO%'

otrzymamy tylko jeden wiersz:


Film
Mio i mier

Poniewa wstawilimy znak wieloznaczny w postaci procentu (%) po sowie MIO,


w wyniku otrzymamy jedynie tytuy filmw, ktre rozpoczynaj si sowem MIO.
Analogicznie, gdy wykonamy instrukcj SELECT w postaci:
SELECT
TytuFilmu AS 'Film'
FROM Filmy
WHERE TytuFilmu LIKE '%MIO'

otrzymamy jedynie wiersz:


Film
To wanie mio

Stao si tak dlatego, e w tym przypadku wskazalimy, e tytu filmu musi koczy si
sowem MIO.
A co jeli chcielibymy wybra tylko filmy, w przypadku ktrych sowo MIO wystpuje w rodku tytuu, nie na pocztku ani na kocu? Rozwizaniem jest nastpujca instrukcja SELECT:
SELECT
TytuFilmu AS 'Film'
FROM Filmy
WHERE TytuFilmu LIKE '% MIO %'

Zauwa, e midzy sowem MIO a znakami wieloznacznymi w postaci procentu (%)


po obu stronach zostaa dodana spacja. Dziki temu wskazujemy, e po obu stronach
sowa musi si znale przynajmniej jedna spacja. Dane zwracane przez t instrukcj s
nastpujce:
Film
Taka mio si nie zdarza

91

92

Rozdzia 9

Dopasowywanie nieprecyzyjnie okrelonych wartoci

Znaki wieloznaczne
Symbol procentu (%) jest najczciej stosowanym znakiem wieloznacznym w poczeniu z operatorem LIKE. Jednake istnieje jeszcze kilka innych tego rodzaju znakw, do
ktrych naley znak podkrelenia (_), zbir_znakw podawany w nawiasach kwadratowych oraz symbol daszka (^) wraz ze zbiorem_znakw umieszczony w nawiasach
kwadratowych. Ponisza tabela zawiera list tych symboli i ich znaczenie:
Znak wieloznaczny

Znaczenie

jakiekolwiek znaki (lub spacje)

dokadnie jeden znak (jakikolwiek)

[zbir_znakw]

dokadnie jeden znak ze zbioru znakw

[^zbir_znakw]

dokadnie jeden znak spoza zbioru znakw

Aby zilustrowa sposb wykorzystania znakw wieloznacznych, w kilku dalszych


przykadach bdziemy odnosi si do poniszej tabeli Aktorzy:
IDAktora

Imi

Nazwisko

Cary

Grant

Mary

Steenburgen

Jon

Voight

Dustin

Hoffman

John

Wayne

Gary

Cooper

Julie

Andrews

Znaku wieloznacznego w postaci podkrelenia (_) moemy uy w nastpujcy sposb:


SELECT
Imi,
Nazwisko
FROM Aktorzy
WHERE Imi LIKE '_ARY'

Wynik tej instrukcji to:


Imi

Nazwisko

Cary

Grant

Mary

Steenburgen

Gary

Cooper

W wyniku otrzymujemy trzech aktorw, poniewa imi kadego z nich skada si z cigu
znakw ARY poprzedzonego dokadnie jednym znakiem.
Podobnie, gdy wykonamy nastpujce zapytanie:
SELECT
Imi,

Znaki wieloznaczne
Nazwisko
FROM Aktorzy
WHERE Imi LIKE 'J_N'

otrzymamy wynik w postaci:


Imi

Nazwisko

Jon

Voight

Aktor John Wayne nie znalaz si w wyniku, poniewa imi John nie jest zgodne z podanym wzorcem J_N. Podkrelenie zastpuje tylko jeden znak.
Ostatnie znaki wieloznaczne, ktre omwimy, a wic [zbir_znakw] i [^zbir_znakw],
umoliwiaj okrelenie wielu wartoci znakw wieloznacznych, ktre mog wystpi
w jednym miejscu.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

Znaki wieloznaczne [zbir_znakw] i [^zbir_znakw] nie wystpuj w MySQL i Oracle.


W poniszym przykadzie zaprezentowano zastosowanie znaku wieloznacznego
[zbir_znakw]:
SELECT
Imi,
Nazwisko
FROM Aktorzy
WHERE Imi LIKE '[CM]ARY'

Powysza instrukcja zwraca wszystkie wiersze, dla ktrych warto w kolumnie Imi
zaczyna si od litery C lub M, za koczy cigiem znakw ARY. Otrzymany wynik jest
nastpujcy:
Imi

Nazwisko

Cary

Grant

Mary

Steenburgen

Ponisza instrukcja przedstawia uycie znaku wieloznacznego [^zbir_znakw]:


SELECT
Imi,
Nazwisko
FROM Aktorzy
WHERE Imi LIKE '[^CG]ARY'

Zapytanie to zwraca wszystkie wiersze, dla ktrych warto kolumny Imi nie zaczyna
si od litery C ani G, ale koczy si cigiem znakw ARY. Wynik tej instrukcji to:
Imi

Nazwisko

Mary

Steenburgen

93

94

Rozdzia 9

Dopasowywanie nieprecyzyjnie okrelonych wartoci

Na koniec naley doda, e wraz z wyej zaprezentowanymi znakami wieloznacznymi


moemy zastosowa take operator NOT w poczeniu ze sowem kluczowym LIKE, na
przykad w nastpujcy sposb:
SELECT
Imi,
Nazwisko
FROM Aktorzy
WHERE Imi LIKE '%ARY%'
AND Imi NOT LIKE '[MG]ARY'

Wynik powyszej instrukcji SELECT to:


Imi

Nazwisko

Cary

Grant

Dopasowanie za pomoc brzmienia


Koczc zgbianie tematu dopasowywania liter i znakw, przyjrzyjmy si teraz dopasowywaniu za pomoc brzmienia. W SQL dostpne s dwie funkcje, ktre umoliwiaj dokonanie w ciekawy sposb porwnania brzmienia sw lub cigw znakw.
Te dwie funkcje to SOUNDEX i DIFFERENCE.
Spjrzmy najpierw na przykad wykorzystania funkcji SOUNDEX:
SELECT
SOUNDEX ('Smith') AS 'Brzmienie nazwiska Smith',
SOUNDEX ('Smythe') AS 'Brzmienie nazwiska Smythe'

Wynik powyszej instrukcji jest nastpujcy:


Brzmienie nazwiska Smith

Brzmienie nazwiska Smythe

S530

S530

Wynik funkcji SOUNDEX skada si zawsze z czterech znakw i stanowi swego rodzaju kod
okrelajcy brzmienie danego cigu znakw. Pierwszy znak zawsze oznacza pierwsz
liter z danego cigu znakw. W tym przypadku pierwsza litera to w obu przypadkach
S, poniewa zarwno Smith, jak i Smythe zaczynaj si wanie od litery S.
Pozostae trzy znaki s obliczane na podstawie analizy brzmienia pozostaej czci wyraenia. Najpierw usuwane s wszystkie samogoski, zatem do funkcji najpierw pobierana jest warto MITH z penego imienia SMITH, a nastpnie jest ona konwertowana do
wartoci MTH. Podobnie, w przypadku nazwiska SMYTHE pobierana jest warto MYTHE, ktra
z kolei jest konwertowana do wartoci MTH. Nastpnie przypisuje tym wartociom liczb reprezentujc brzmienie obu cigw znakw. W tym przypadku ta liczba to 530.
Poniewa funkcja SOUNDEX zwraca warto S530 zarwno dla nazwiska Smith, jak i Smythe,
mona wysun wniosek, e prawdopodobnie ich brzmienie jest podobne.

Dopasowanie za pomoc brzmienia

W Microsoft SQL Server dostpna jest jeszcze jedna funkcja, o nazwie DIFFERENCE.
Funkcja ta dziaa w poczeniu z funkcj SOUNDEX.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

W MySQL i Oracle nie istnieje funkcja DIFFERENCE.


Poniej znajduje si przykad uycia funkcji DIFFERENCE wykorzystujcy dane z poprzednich przykadw:
SELECT
DIFFERENCE ('Smith', 'Smythe') AS 'Wynik funkcji DIFFERENCE'

Wynik powyszej instrukcji to:


Wynik funkcji DIFFERENCE
4

Funkcja DIFFERENCE zawsze wymaga podania dwch argumentw. Najpierw pobiera


wartoci bdce wynikiem funkcji SOUNDEX dla kadego z argumentw, a nastpnie porwnuje te wartoci. Jeli zwracana jest warto 4, tak jak w powyszym przykadzie,
oznacza to, e wszystkie cztery znaki wartoci zwracanej przez funkcj SOUNDEX s identyczne. Warto 0 oznacza, e adne znaki nie s tosame. W zwizku z tym warto
funkcji DIFFERENCE rwna 4 oznacza najwyszy stopie dopasowania, natomiast warto rwna 0 stanowi o najniszym moliwym stopniu dopasowania.
Majc to na uwadze, poniej zaprezentowano przykad zastosowania funkcji DIFFERENCE
w celu pobrania wartoci brzmicych bardzo podobnie do konkretnego wyraenia.
Na podstawie danych z tabeli Aktorzy sprbujemy znale wiersze, dla ktrych warto
w kolumnie Imi brzmi jak John. Instrukcja SELECT zwracajca podany wynik ma
posta:
SELECT
Imi,
Nazwisko
FROM Aktorzy
WHERE DIFFERENCE (Imi, 'John') = 4

Jej wynik jest nastpujcy:


Imi

Nazwisko

Jon

Voight

John

Wayne

Wynik uzyskany za pomoc funkcji DIFFERENCE pokazuje, e zarwno w przypadku


imienia John, jak i Jon wystpuje warto rnicy rwna 4 midzy kadym z tych imion
a wartoci 'John' okrelon w funkcji.

95

96

Rozdzia 9

Dopasowywanie nieprecyzyjnie okrelonych wartoci

Chcc przeanalizowa rzeczywisty powd, dla ktrego wybrane zostay wanie te dwa
wiersze, naleaoby zmodyfikowa instrukcj SELECT tak, aby zwrcona zostaa warto funkcji SOUNDEX i DIFFERENCE dla wszystkich wierszy w tabeli:
SELECT
Imi,
Nazwisko,
DIFFERENCE (Imi, 'John') AS 'Warto funkcji Difference',
SOUNDEX (Imi) AS 'Warto funkcji Soundex'
FROM Aktorzy

Powysza instrukcja zwraca nastpujcy wynik:


Imi

Nazwisko

Warto funkcji Difference

Warto funkcji Soundex

Cary

Grant

C600

Mary

Steenburgen

M600

Jon

Voight

J500

Dustin

Hoffman

D235

John

Wayne

J500

Gary

Cooper

G600

Julie

Andrews

J400

Zauwa, e zarwno Jon Voight, jak i John Wayne, biorc pod uwag ich imiona, maj
warto funkcji SOUNDEX rwn J500, za warto funkcji DIFFERENCE wynoszc 4. To tumaczy, dlaczego obaj znaleli si w wyniku poprzedniego zapytania. Zauwa te, e
w przypadku Julie Andrews warto funkcji DIFFERENCE wynosi 3. Gdybymy w klauzuli WHERE wskazali, e warto funkcji DIFFERENCE ma by rwna 3 lub 4, imi i nazwisko tej aktorki rwnie znalazyby si w wyniku.

Co dalej?
Na tym zakoczymy nasze rozwaania odnonie dopasowywania wyrae do wzorca
i brzmienia. Dopasowywanie do wzorca jest wan i szeroko stosowan funkcj SQL.
Za kadym razem, gdy w polu wyszukiwania podajesz dowolne sowo, aby wybra
wszystkie obiekty, ktre je zawieraj, korzystasz z funkcji dopasowywania do wzorca.
Dopasowywanie wedug brzmienia jest stosowane znacznie rzadziej. Istnieje odpowiednia do tego celu technologia, jednak tumaczenie sw na dwiki sprawia pewn
trudno. Dzieje si tak dlatego, e zarwno jzyk angielski, jak i kady inny zawiera
zbyt wiele niestandardowych znakw i wyjtkw, aby tego typu dopasowanie zostao
uznane za wiarygodne.
W kolejnym rozdziale, zatytuowanym Dokonywanie podsumowa, poznamy sposoby rozdzielania danych na grupy oraz metody dokonywania podsumowa wartoci
w tych grupach z wykorzystaniem rnych funkcji. W rozdziale 4. czytalimy o funkcjach skalarnych, natomiast w rozdziale 10. przyjrzymy si innemu rodzajowi funkcji,

Co dalej?

a mianowicie funkcjom agregujcym (ang. aggregate functions), ktre pozwalaj na dokonywanie podsumowa na wiele uytecznych sposobw. Na przykad bdziemy mogli
dla danej grupy zamwie okreli numery zamwie, czn kwot, na jak zostay
dokonane, oraz redni wielko zamwienia. Dziki wykorzystaniu tych technik bdziesz mg odstpi od przedstawiania szczegowych danych i zaczniesz tworzy
rzeczywist warto dodan dla uytkownikw poprzez dostarczanie im informacji
zebranych wanie w formie podsumowa.

97

98

Rozdzia 9

Dopasowywanie nieprecyzyjnie okrelonych wartoci

R OZ DZ I A 10

D OKONYWANIE
PODSUMOWA
NOWE SOWA KLUCZOWE: DISTINCT, SUM, AVG, MIN, MAX,
COUNT, GROUP BY, HAVING

Do tej pory prezentowalimy dane w zasadzie w takiej postaci, w jakiej wystpoway


w bazie danych. Nauczylimy si stosowa kilka funkcji do realizacji pewnych przeksztace, a take dokonywalimy pewnych dodatkowych oblicze w odniesieniu do
istniejcych danych. W obu tych przypadkach pobierane przez nas wiersze de facto
odzwierciedlay zawarto tabeli w bazie danych. Teraz zaprezentujemy rne metody
dokonywania podsumowa naszych danych.
Termin informatyczny stosowany w odniesieniu do tego rodzaju dziaa to agregacja
(ang. aggregation); oznacza on czenie w grupy. Wychodzc poza schemat wywietlania jedynie dostpnych danych, dziki ich agregacji i dokonywaniu podsumowa
mamy moliwo uzyskania bardziej miarodajnych informacji. Uytkownicy czsto maj
wraenie, e osignlimy co wrcz niemoliwego, wywietlajc dane bdce rdem
cennych dla nich informacji, i to na podstawie tak wielu rekordw znajdujcych si
w bazie danych. Rozumiej, jaka praca si z tym wie, i doceniaj j.

Usuwanie duplikatw
Za najbardziej elementarny sposb dokonywania podsumowa danych mona uzna
usuwanie duplikatw, pomimo e nie jest to agregacja w cisym tego sowa znaczeniu. W SQL mamy do dyspozycji sowo kluczowe DISTINCT, ktre pozwala w atwy
sposb usun zduplikowane wiersze z wyniku zapytania.
Poniej znajduje si przykad zastosowania sowa kluczowego DISTINCT z wykorzystaniem tabeli TytuyUtworw o nastpujcej postaci:

99

100

Rozdzia 10

Dokonywanie podsumowa

IDUtworu

Wykonawca

Album

Tytu

The Beatles

Abbey Road

Come Together

The Beatles

Abbey Road

Sun King

The Beatles

Revolver

Yellow Submarine

The Rolling Stones

Let It Bleed

Monkey Man

The Rolling Stones

Flowers

Ruby Tuesday

Paul McCartney

Ram

Smile Away

Powiedzmy, e chcemy zobaczy zebran w tabeli list wykonawcw. Taki wynik


mona uzyska dziki poniszej instrukcji:
SELECT
DISTINCT
Wykonawca
FROM TytuyUtworw
ORDER BY Wykonawca
Wykonawca
Paul McCartney
The Beatles
The Rolling Stones

Sowo kluczowe DISTINCT jest zawsze umieszczane bezporednio po sowie kluczowym SELECT. Poprzez uycie sowa DISTINCT wskazujemy, e w wyniku zapytania pojawi si tylko unikatowe wartoci znajdujce si na licie_kolumn wystpujcej bezporednio po tym wanie sowie. W naszym przypadku istniej tylko trzy unikatowe
wiersze zawierajce nazwy wykonawcw, dlatego tylko te trzy wiersze zostan zwrcone po wykonaniu powyszej instrukcji SELECT.
Gdybymy chcieli zobaczy unikatowe kombinacje wykonawcw i ich albumw, naleaoby zastosowa ponisz instrukcj:
SELECT
DISTINCT
Wykonawca,
Album
FROM TytuyUtworw
ORDER BY Wykonawca, Album

Jej wynik byby nastpujcy:


Wykonawca

Album

Paul McCartney

Ram

The Beatles

Abbey Road

The Beatles

Revolver

The Rolling Stones

Flowers

The Rolling Stones

Let It Bleed

Funkcje agregujce

Zauwa, e album Abbey Road zosta wymieniony tylko raz, mimo e w tabeli znajduj si
dwa utwory z tego albumu. Stao si tak dlatego, e w wyniku uycia sowa kluczowego DISTINCT wywietlone zostay tylko unikatowe wartoci z wymienionych kolumn.

Funkcje agregujce
Wszystkie funkcje omwione w rozdziale 4. byy funkcjami skalarnymi (ang. scalar
functions). Funkcje te byy wykonywane na podstawie pojedynczej wartoci liczbowej lub
znakowej. W przeciwiestwie do nich funkcje agregujce (ang. aggregate functions) s stosowane w odniesieniu do grup danych. Najczciej stosowane funkcje agregujce to COUNT,
SUM, AVG, MIN i MAX. Umoliwiaj one, odpowiednio, zliczenie wystpie danych, obliczenie
sum, rednich, minimalnych i maksymalnych wartoci w odniesieniu do grup danych.
Wszystkie ponisze przykady prezentujce zastosowanie funkcji agregujcych bd
oparte na nastpujcych dwch tabelach z danymi dotyczcymi uczniw na tabeli
zawierajcej informacje o opatach oraz tabeli z punktami, ktre uczniowie uzyskali za
konkretne zadania. Tabela Opaty ma nastpujc zawarto:
IDOpaty

Ucze

RodzajOpaty

Opata

Grzegorz

Siownia

30

Grzegorz

Obiad

10

Grzegorz

Wycieczka

Joanna

Siownia

30

Andrzej

Obiad

10

Tabela Punktacja to:


IDPunktacji

Ucze

OcenianaPraca

LiczbaPunktw

Zuzia

Sprawdzian

92

Zuzia

Sprawdzian

95

Zuzia

Praca domowa

84

Kasia

Sprawdzian

62

Kasia

Sprawdzian

81

Kasia

Praca domowa

NULL

Aleksander

Sprawdzian

58

Aleksander

Sprawdzian

74

Aleksander

Praca domowa

88

Na pocztek przyjrzyjmy si funkcji SUM. Powiedzmy, e chcielibymy zobaczy czn


kwot, ktr uczniowie zapacili za korzystanie z siowni. Tak warto mona uzyska, wykonujc nastpujc instrukcj:
SELECT
SUM (Opata) AS 'Sumaryczna opata za siowni'
FROM Opaty
WHERE RodzajOpaty = 'Siownia'

101

102

Rozdzia 10

Dokonywanie podsumowa

Uzyskany wynik bdzie nastpujcy:


Sumaryczna opata za siowni
60

Jak wida, za pomoc funkcji SUM dodawane s wszystkie wartoci z kolumny Opata,
ktre zostay okrelone za porednictwem klauzuli WHERE. Poniewa jedynym wyraeniem na licie_kolumn jest funkcja agregujca, zapytanie zwraca wynik tylko dla jednego wiersza danych, w ktrym znajduje si zsumowana warto.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL

Jak nadmieniono w rozdziale 4., w MySQL czasami konieczne jest, aby midzy nazw funkcji a lewym
nawiasem nie byo spacji. Dzieje si tak w przypadku wikszoci funkcji agregujcych. Na przykad
w MySQL powysz instrukcj naleaoby zapisa w nastpujcy sposb:
SELECT
SUM(Opata) AS 'Sumaryczna opata za siowni'
FROM Opaty
WHERE RodzajOpaty = 'Siownia'

Funkcje AVG, MIN i MAX wykorzystywane s w bardzo podobny sposb. Poniej znajduje
si przykad funkcji AVG. W tym przypadku mamy na celu uzyskanie redniej punktacji ze wszystkich napisanych przez uczniw sprawdzianw z tabeli Punktacja:
SELECT
AVG (LiczbaPunktw) AS 'rednia liczba punktw za sprawdzian'
FROM Punktacja
WHERE OcenianaPraca = 'Sprawdzian'

Wynik powyszej instrukcji to:


rednia liczba punktw za sprawdzian
77

W pojedynczej instrukcji SELECT mona uy wicej ni jednej funkcji agregujcej.


Oto przykad takiej instrukcji, w ktrej wykorzystano funkcje AVG, MIN i MAX:
SELECT
AVG (LiczbaPunktw)
MIN (LiczbaPunktw)
MAX (LiczbaPunktw)
FROM Punktacja
WHERE OcenianaPraca

AS 'rednia liczba punktw za sprawdzian',


AS 'Minimalna liczba punktw za sprawdzian',
AS 'Maksymalna liczba punktw za sprawdzian''
= 'Sprawdzian'

Wynik powyszej instrukcji to:


rednia liczba
punktw za sprawdzian

Minimalna liczba
punktw za sprawdzian

Maksymalna liczba
punktw za sprawdzian

77

58

95

Funkcja COUNT

Kada z wartoci widocznych w tabeli zostaa obliczona oddzielnie. Prezentowane wyniki


dotycz redniej, minimalnej i maksymalnej liczby punktw obliczanej na podstawie
wszystkich sprawdzianw znajdujcych si w tabeli Punktacja.

Funkcja COUNT
Funkcja COUNT jest nieco bardziej skomplikowana z uwagi na fakt, e mona j wykorzysta na trzy rne sposoby.
Po pierwsze, moe by uywana do zliczenia wszystkich wierszy, ktre znajd si w wyniku, niezalenie od wartoci w kadej z kolumn. Poniej znajduje si przykad instrukcji zwracajcej liczb wszystkich wierszy z punktami uzyskanymi za prac domow:
SELECT
COUNT (*) AS 'Liczba wierszy z ocenian prac domow'
FROM Punktacja
WHERE OcenianaPraca = 'Praca domowa'

Wynik powyszego zapytania to:


Liczba wierszy z ocenian
prac domow
3

Gwiazdka w nawiasie oznacza wszystkie kolumny. Oznacza to, e SQL bierze pod
uwag wszystkie kolumny w wierszach ograniczonych poprzez warunek z klauzuli WHERE,
a nastpnie zwraca liczb tych wierszy.
Po drugie, zamiast gwiazdki w funkcji COUNT moemy wskaza okrelon kolumn.
Oto przykad takiej instrukcji:
SELECT
COUNT (LiczbaPunktw) AS 'Liczba wierszy z punktami za prac domow'
FROM Punktacja
WHERE OcenianaPraca = 'Praca domowa'

oraz jej wynik:


Liczba wierszy z punktami
za prac domow
2

Zwr uwag na subteln rnic midzy powyszymi dwiema instrukcjami SELECT.


W pierwszej zliczamy jedynie wiersze, dla ktrych w kolumnie OcenianaPraca wystpuje
warto Praca domowa. Istniej trzy takie wiersze w tabeli. W drugim zapytaniu dokonujemy zliczenia wystpie wartoci w kolumnie LiczbaPunktw, dla ktrych w kolumnie OcenianaPraca wystpia warto Praca domowa. W tym przypadku w jednym z trzech wybranych w ten sposb wierszy w kolumnie LiczbaPunktw wystpuje
warto NULL, wic wiersz ten nie jest brany pod uwag w wyniku. Jak zapewne pamitasz, warto NULL oznacza brak danych.

103

104

Rozdzia 10

Dokonywanie podsumowa

Trzeci sposb zastosowania funkcji COUNT dotyczy uycia sowa kluczowego DISTINCT
w odniesieniu do nazwy kolumny. Pokazano to na poniszym przykadzie:
SELECT
COUNT (DISTINCT RodzajOpaty) AS 'Liczba rodzajw opaty'
FROM Opaty

Za pomoc powyszej instrukcji zliczana jest liczba unikatowych rodzajw opat zdefiniowanych w kolumnie RodzajOpaty. Zwracany wynik jest nastpujcy:
Liczba rodzajw opaty
3

Liczba ta oznacza, e w kolumnie RodzajOpaty wystpuj trzy rne wartoci.

Grupowanie danych
Przytaczane dotd przykady funkcji agregujcych s ciekawe, jednak wydaje si, e
ich uyteczno jest nieco ograniczona. Dopiero wprowadzenie pojcia grupowania
danych pozwoli nam dostrzec istotne zalety tego rodzaju funkcji.
Sowo kluczowe GROUP BY suy do podzielenia danych zwracanych przez instrukcj
SELECT na dowoln liczb grup. Na przykad, posikujc si zdefiniowan w poprzednim
podrozdziale tabel Punktacja, moglibymy podj prb analizy uzyskanych punktw
w zalenoci od tego, jaka praca bya oceniana. Innymi sowy, chcielibymy rozdzieli
dane na dwie odrbne grupy sprawdziany i prace domowe. Do okrelenia, do ktrej
grupy naley dany wiersz, wykorzystane zostan wartoci w kolumnie OcenianaPraca.
Gdy dane zostan podzielone na grupy, moliwe bdzie uycie funkcji agregujcej do
dokonania, a nastpnie porwnania oblicze podsumowujcych wartoci, ktre znalazy si w kadej z grup.
Zobaczmy to na przykadzie zawierajcym sowo kluczowe GROUP BY:
SELECT
OcenianaPraca AS 'Oceniana praca',
AVG (LiczbaPunktw) AS 'rednia liczba punktw'
FROM Punktacja
GROUP BY OcenianaPraca
ORDER BY OcenianaPraca
Oceniana praca

rednia liczba punktw

Praca domowa

86

Sprawdzian

77

W tym przykadzie sowo kluczowe GROUP BY wskazuje, e grupy zostan utworzone na


podstawie wartoci w kolumnie OcenianaPraca. Dwie kolumny wystpujce na licie_
kolumn w instrukcji SELECT to OcenianaPraca oraz pole obliczane za pomoc funkcji

Grupowanie i sortowanie wzgldem kilku kolumn

AVG. Kolumna OcenianaPraca znalaza si na licie_kolumn, poniewa gdy tworzona jest

grupa, dobr praktyk jest wywietlenie kolumny, na bazie ktrej ona powstaje. Pole
obliczane o nazwie rednia liczba punktw stanowi agregacj wartoci z wszystkich
wierszy w kolumnie LiczbaPunktw w ramach danej grupy.
Zauwa, e rednia liczba punktw uzyskanych za prac domow wyniosa 86. Mimo
e w jednym wierszu w kolumnie LiczbaPunktw wystpuje warto NULL, SQL podczas obliczania redniej nie bierze pod uwag zawierajcych j wierszy. Jeli chcemy,
aby warto NULL zostaa uwzgldniona w kalkulacji jako warto 0, do konwersji tej
wartoci na 0 moemy uy funkcji ISNULL, tak jak pokazano poniej:
AVG (ISNULL (LiczbaPunktw, 0)) AS 'rednia liczba punktw'

Wane jest, aby pamita, e gdy korzystamy ze sowa kluczowego GROUP BY, wszystkie kolumny na licie_kolumn musz zosta wymienione w ramach klauzuli GROUP BY
lub uyte w funkcji agregujcej. W przeciwnym wypadku instrukcja SELECT byaby pozbawiona sensu. Na przykad, ponisze zapytanie nie zostanie wykonane wskutek komunikatu o bdzie:
SELECT
OcenianaPraca AS 'Oceniana praca',
AVG (LiczbaPunktw) AS 'rednia liczba punktw',
Ucze AS 'Ucze'
FROM Punktacja
GROUP BY OcenianaPraca
ORDER BY OcenianaPraca

Nieprawidowo powyszej instrukcji wynika z tego, e kolumna Ucze nie zostaa


wymieniona w klauzuli GROUP BY ani te wystpujce w niej wartoci nie zostay w aden
sposb zagregowane. Poniewa wszystko jest prezentowane w grupach, SQL nie wie,
co zrobi z kolumn Ucze.
R NICE W RAMA CH IN NY CH B A Z DA NY C H: M ySQL

W przeciwiestwie do Microsoft SQL Server i Oracle, w MySQL prba wykonania powyszej instrukcji nie
zakoczy si bdem, ale zwrcony zostanie niepoprawny wynik.

Grupowanie i sortowanie wzgldem kilku kolumn


Dane mona grupowa nie tylko wzgldem jednej kolumny, ale te wedug kilku kolumn. Wrmy do ostatniego przykadu instrukcji SELECT i dodajmy w niej do klauzuli GROUP BY oraz do listy_kolumn kolumn Ucze. Teraz nasze zapytanie ma nastpujc posta:
SELECT
OcenianaPraca AS 'Oceniana praca',
Ucze AS 'Ucze',
AVG (LiczbaPunktw) AS 'rednia liczba punktw'

105

106

Rozdzia 10

Dokonywanie podsumowa

FROM Punktacja
GROUP BY OcenianaPraca, Ucze
ORDER BY OcenianaPraca, Ucze

A jego wynik jest nastpujcy:


Oceniana praca

Ucze

rednia liczba punktw

Praca domowa

Aleksander

88

Praca domowa

Kasia

NULL

Praca domowa

Zuzia

84

Sprawdzian

Aleksander

66

Sprawdzian

Kasia

71,5

Sprawdzian

Zuzia

93,5

Wida teraz podzia nie tylko wzgldem ocenianej pracy, ale take wedug uczniw.
rednia liczba punktw zostaa obliczona w podziale na kad z grup. Zauwa, e
w wierszu zawierajcym informacje o pracy domowej Kasi rednia liczba punktw ma
warto NULL. Dla Kasi w tabeli istnieje tylko jeden wiersz z prac domow i w tym
wierszu w kolumnie, w ktrej podano liczb punktw wystpuje warto NULL.
Kolejno, w ktrej wymieniane s kolumny w klauzuli GROUP BY, nie ma znaczenia.
Wynik instrukcji byby taki sam, gdyby klauzula ta miaa posta:
GROUP BY Ucze, OcenianaPraca

Jeli natomiast chodzi o kolejno kolumn w klauzuli ORDER BY, to jest ona istotna.
Gdy dokonamy w niej nastpujcych zmian:
ORDER BY Ucze, OcenianaPraca

uzyskamy wynik:
Oceniana praca

Ucze

rednia liczba punktw

Praca domowa

Aleksander

88

Sprawdzian

Aleksander

66

Praca domowa

Kasia

NULL

Sprawdzian

Kasia

71,5

Praca domowa

Zuzia

84

Sprawdzian

Zuzia

93,5

Patrzc na powysze dane, trudno na pierwszy rzut oka oceni, czy s tak naprawd
posortowane wzgldem kolumny Ucze czy Oceniana praca. Z reguy pomocne okazuje si wywietlenie kolumn w tej samej kolejnoci, w jakiej s posortowanie. Wida
to na poniszym przykadzie:
SELECT
Ucze AS 'Ucze',
OcenianaPraca AS 'Oceniana praca',
AVG (LiczbaPunktw) AS 'rednia liczba punktw'

Kryteria selekcji w ramach agregacji


FROM Punktacja
GROUP BY OcenianaPraca, Ucze
ORDER BY Ucze, OcenianaPraca

Uzyskany wynik jest nastpujcy:


Ucze

Oceniana praca

rednia liczba punktw

Aleksander

Praca domowa

88

Aleksander

Sprawdzian

66

Kasia

Praca domowa

NULL

Kasia

Sprawdzian

71,5

Zuzia

Praca domowa

84

Zuzia

Sprawdzian

93,5

Tak przedstawione dane nie budz wtpliwoci, poniewa kolejno kolumn odpowiada kolejnoci sortowania.
Czasami rnica pomidzy klauzulami GROUP BY i ORDER BY moe nie by tak oczywista. Wystarczy jednak zapamita, e poprzez zastosowanie klauzuli GROUP BY moliwe
jest wycznie tworzenie grup. Aby dane wywietlay si w odpowiedniej kolejnoci,
konieczne jest zastosowanie klauzuli ORDER BY.

Kryteria selekcji w ramach agregacji


W kontekcie podsumowywania danych naley wspomnie jeszcze o jednej kwestii.
Mowa o kryteriach selekcji, ktre w przypadku zastosowania grupowania staj si nieco bardziej skomplikowane. Gdy takie kryteria s stosowane w instrukcji SELECT z klauzul GROUP BY, trzeba zada sobie pytanie, czy dotycz wwczas pojedynczych wierszy
czy caej grupy.
Znana nam ju klauzula WHERE okrela kryteria selekcji poszczeglnych wierszy, natomiast
do okrelenia kryteriw wyboru na poziomie grupy suy sowo kluczowe HAVING.
Wracajc do tabeli Punktacja, powiedzmy, e chcemy wybra tylko dane dotyczce
sprawdzianw, za ktre uczniowie zdobyli co najmniej 70 punktw. Bdziemy zatem wybiera pojedyncze wyniki uczniw, a wic w tym przypadku moemy uy klauzuli WHERE
w sposb, w jaki korzystalimy z niej dotychczas. Instrukcja SELECT bdzie wygldaa
nastpujco:
SELECT
Ucze AS 'Ucze',
OcenianaPraca AS 'Oceniana praca',
LiczbaPunktw AS 'Liczba punktw'
FROM Punkty
WHERE OcenianaPraca = 'Sprawdzian'
AND LiczbaPunktw >= 70
ORDER BY Ucze, LiczbaPunktw

107

108

Rozdzia 10

Dokonywanie podsumowa

Otrzymany wynik to:


Ucze

Oceniana praca

Liczba punktw

Aleksander

Sprawdzian

74

Kasia

Sprawdzian

81

Zuzia

Sprawdzian

92

Zuzia

Sprawdzian

95

Zauwa, e sprawdziany z wynikiem mniejszym ni 70 punktw nie znalazy si w wyniku. Przykadowo, wynik rwny 74 za jeden ze sprawdzianw Aleksandra znalaz si na
licie, w przeciwiestwie do wyniku z innego sprawdzianu napisanego przez tego ucznia,
wynoszcego 58.
A jeli chcielibymy wywietli tylko dane dla uczniw, ktrzy otrzymali za sprawdziany rednio 70 punktw lub wicej? Wwczas musielibymy obliczy redni warto dla grupy, nie dla poszczeglnych wierszy. W tym przypadku moemy wykorzysta
sowo kluczowe HAVING. W pierwszej kolejnoci konieczne jest pogrupowanie uzyskanych
punktw wzgldem uczniw, ktrzy je uzyskali, a nastpnie zastosowanie do powstaych
w ten sposb grup kryteriw selekcji. W ten sposb uzyskamy podan warto w odniesieniu do caej grupy. Taki wynik otrzymamy, wykonujc ponisz instrukcj SELECT:
SELECT
Ucze AS 'Ucze',
AVG (LiczbaPunktw) AS 'rednia liczba punktw za sprawdzian'
FROM Punkty
WHERE OcenianaPraca = 'Sprawdzian'
GROUP BY Ucze
HAVING AVG (LiczbaPunktw) >= 70
ORDER BY Ucze

Zwracane dane maj nastpujc posta:


Ucze

rednia liczba punktw


za sprawdzian

Kasia

71,5

Zuzia

93,5

W powyszej instrukcji znajduje si zarwno klauzula WHERE, jak i HAVING. Poprzez


klauzul WHERE wybieramy tylko te wiersze, w przypadku ktrych OcenianaPraca to
Sprawdzian, natomiast HAVING gwarantuje nam wybr tylko tych uczniw, ktrzy
zdobyli za swoje sprawdziany rednio co najmniej 70 punktw.
A gdybymy chcieli wywietli w wyniku dodatkowo kolumn OcenianaPraca? Jeli
sprbujemy doda j do listy_kolumn instrukcji SELECT, zapytanie nie zostanie wykonane i zwrcony zostanie bd. Stanie si tak dlatego, e wszystkie wywietlane w wyniku
kolumny musz by wymienione w klauzuli GROUP BY lub by elementami stanowicymi
przedmiot agregacji. Jeli wic chcemy pokaza wartoci z kolumny OcenianaPraca,
musi ona zosta dodana do klauzuli GROUP BY w nastpujcy sposb:

Co dalej?
SELECT
Ucze AS 'Ucze',
OcenianaPraca AS 'Oceniana praca',
AVG (LiczbaPunktw) AS 'rednia liczba punktw'
FROM Punkty
WHERE OcenianaPraca = 'Sprawdzian'
GROUP BY Ucze, OcenianaPraca
HAVING AVG (LiczbaPunktw) >= 70
ORDER BY Ucze

Wynik powyszej instrukcji jest nastpujcy:


Ucze

Oceniana praca

rednia liczba punktw

Kasia

Sprawdzian

71,5

Zuzia

Sprawdzian

93,5

Teraz, gdy do naszego zapytania dodalimy jeszcze klauzul HAVING, podsumujmy oglny
format instrukcji SELECT:
SELECT lista_kolumn
FROM lista_tabel
WHERE warunek
GROUP BY lista_kolumn
HAVING warunek
ORDER BY lista_kolumn

Naley podkreli, e stosujc w instrukcji SELECT ktrekolwiek z powyszych sw


kluczowych, trzeba pamita o umieszczeniu ich w zapytaniu dokadnie w takiej kolejnoci, jak przedstawiono powyej. Na przykad sowo kluczowe HAVING powinno
znajdowa si po klauzuli GROUP BY, ale przed sowem ORDER BY.

Co dalej?
W tym rozdziale omwilimy kilka sposobw dokonywania agregacji, poczwszy od
najprostszego, zwizanego z usuwaniem duplikatw. Nastpnie scharakteryzowalimy
szereg funkcji agregujcych, ktre rni si od funkcji skalarnych zaprezentowanych
w rozdziale 4. Funkcje agregujce okazuj si szczeglnie uyteczne, gdy s stosowane
w poczeniu ze sowem kluczowym GROUP BY, ktre umoliwia pogrupowanie danych.
Na koniec zaprezentowalimy przykady zastosowania sowa kluczowego HAVING,
dziki ktremu moliwe jest uycie kryteriw selekcji na poziomie grupy w odniesieniu do wartoci obliczanych za pomoc funkcji agregujcych.
W kolejnym rozdziale, zatytuowanym Zczenia wewntrzne tabel, zamierzamy
rozpocz omawianie jednego z gwnych zagadnie w SQL, a mianowicie moliwoci
pozyskania danych z wielu tabel. Do tej pory wszystkie zapytania, ktre budowalimy,
pobieray dane tylko z jednej tabeli. W rzeczywistoci rzadko tak wanie si dzieje,
gdy kluczow wartoci relacyjnych baz danych jest moliwo wykorzystania wielu
tabel z powizanymi ze sob danymi. Rzadko bdziemy potrzebowa tylko danych
pochodzcych z jednej tabeli.

109

110

Rozdzia 10

Dokonywanie podsumowa

Zagadnienie dostpu do danych pochodzcych z wielu tabel zostanie szczegowo


omwione w rozdziale 11. i 12. W rozdziale 11. scharakteryzowane zostanie zczenie
wewntrzne, natomiast rozdzia 12. dotyczy zczenia zewntrznego. Rozdziay od 13.
do 15. objani ten temat pod rnym ktem. Po zapoznaniu si z treci kolejnych
piciu rozdziaw bdziesz ju posiada wiedz na temat podstawowych technik pozyskiwania danych z wielu tabel.

R OZ DZ I A 11

Z CZENIA
WEWNTRZNE
TABEL
NOWE SOWA KLUCZOWE: INNER JOIN, ON

W rozdziale 1. wspomnielimy o znaczcej przewadze relacyjnych baz danych nad ich


poprzednikami. Wanym osigniciem relacyjnych baz danych jest moliwo rozmieszczenia danych w dowolnej liczbie tabel, ktre s ze sob powizane, a zarazem
od siebie niezalene. W przeciwiestwie do wczeniej wystpujcych baz danych, relacje midzy tabelami w relacyjnych bazach danych nie s wyranie okrelone za pomoc szeregu wskanikw. Zamiast tego s one definiowane na podstawie kolumn, ktre s
wsplne dla danych tabel. Czasami zwizki tego typu s formalnie okrelane za pomoc
kluczy gwnych i obcych, cho nie zawsze jest taka konieczno.
Du zalet relacyjnych baz danych jest moliwo zaprojektowania bazy danych
w zalenoci od naszych potrzeb, na podstawie analizy obiektw biznesowych1. wiadczy
to o duej elastycznoci tego podejcia.
Spjrzmy na prosty przykad. W przypadku wikszoci przedsibiorstw mona wyodrbni obiekt biznesowy o nazwie klient. Zazwyczaj w bazie danych znajduje si tabela Klienci, zawierajca informacje o kadym z nich. Taka tabela zazwyczaj bdzie miaa
okrelony klucz gwny identyfikujcy kadego takiego klienta z osobna i w sposb
unikatowy, a take dowoln liczb kolumn zawierajcych charakteryzujce go atrybuty. Atrybutami takimi s zazwyczaj numer telefonu, adres, miasto, wojewdztwo itd.

Obiekt biznesowy to element zawierajcy informacje zwizane z konkretnym obszarem tematycznym, np. dotyczcym dziaalnoci danego przedsibiorstwa. Pojcie to jest cile powizane z pojciem encji, ktre zostanie objanione w dalszej czci tego rozdziau przyp. tum.
111

112

Rozdzia 11

Zczenia wewntrzne tabel

Chodzi tu gwnie o to, e wszystkie informacje dotyczce klienta s przechowywane


wycznie w jednej tabeli. To upraszcza dokonywanie w przyszoci aktualizacji danych. Gdy klient zmienia swj numer telefonu, tylko jedna tabela musi zosta zaktualizowana. Wad takiego podejcia jest jednak to, e gdy kto potrzebuje informacji na
temat danego klienta, aby je uzyska, musi mie dostp do tabeli Klienci.
Wprowadzimy zatem teraz nowe pojcie zczenia (ang. join). Powiedzmy, e chcielibymy dokona analizy produktw, ktre zostay zakupione. Wraz z informacjami o produktach czsto konieczne jest uwzgldnienie danych na temat klientw, ktrzy zakupili
dany produkt. Na przykad, aby analityk mg dokona analizy danych z podziaem
na regiony geograficzne, prawdopodobnie potrzebowaby kodw pocztowych. Kod
pocztowy jest przechowywany wycznie w tabeli Klienci, natomiast informacje na temat
produktw znajduj si w tabeli Produkty. Aby uzyska informacje zarwno o klientach, jak i produktach, obie tabele musz zosta ze sob poczone w taki sposb, aby
dane do siebie pasoway.
Tak oto, poprzez zczenie tabel w podany sposb, bdziemy mogli w peni korzysta z dobrodziejstw relacyjnych baz.

czenie dwch tabel


Zanim przejdziemy do szczegowego omawiania procesu czenia tabel, przypomnijmy sobie zawarto tabeli Zamwienia z rozdziau 3.:
IDZamwienia

Imi

Nazwisko

ZakupionaIlo

CenaZaSztuk

Jan

Kowalski

2,50

Piotr

Nowak

10

1,25

Barbara

Kwiatkowska

4,00

Korzystanie z tej tabeli w poprzednich rozdziaach byo nieco mylce. W rzeczywistoci dowiadczony projektant baz danych nigdy nie utworzyby tabeli w takiej postaci,
poniewa zawiera ona informacje o dwch oddzielnych obiektach: klientach i zamwieniach. Takie informacje s rozdzielane i prezentowane w co najmniej dwch oddzielnych tabelach. Tabela Klienci mogaby wic wyglda nastpujco:
IDKlienta

Imi

Nazwisko

Jan

Kowalski

Piotr

Nowak

Barbara

Kwiatkowska

Adam

Piotrowski

Tabela Zamwienia mogaby natomiast zawiera nastpujce dane:

czenie dwch tabel


IDZamwienia

IDKlienta

ZakupionaIlo

CenaZaSztuk

2,50

10

1,25

12

1,50

4,00

Przykady podane w dalszej czci tego rozdziau bd oparte na danych zawartych


w powyszych tabelach. Zwr uwag, e dzielc pierwotn tabel Zamwienia na dwie,
dokonalimy szeregu zmian. Tabela Klienci zawiera teraz tylko informacje o klientach. W tabeli Zamwienia znalazy si za wycznie informacje o zakupionych produktach. Dodalimy te do niej kolumn IDKlienta, dziki ktrej wiemy, ktry klient
zoy dane zamwienie. Jak zapewne pamitasz z rozdziau 1., jest to tak zwany klucz
obcy. Dodalimy rwnie do tabeli Zamwienia wiersz wskazujcy na ponowne zoenie zamwienia przez klienta Piotra Nowaka. Ponadto, dodalimy rwnie wiersz do
tabeli Klienci zawierajcy dane potencjalnego klienta, Adama Piotrowskiego, ktry
nie zoy jeszcze adnego zamwienia.
Nadal jednak nie mamy wszystkich informacji. Na przykad tabela Zamwienia zazwyczaj zawiera rwnie kolumn przechowujc dat zoenia zamwienia. Ponadto,
zwykle znajduje si w niej take kolumna zawierajca klucz obcy z identyfikatorem
produktu, dziki czemu moliwe jest poczenie informacji o zamwieniu z informacjami o sprzedanym produkcie. Co wicej, sama tabela Zamwienia w rzeczywistoci
mogaby zosta podzielona na kilka tabel, z ktrych jedna mogaby przechowywa
wszelkie informacje o zamwieniu, takie jak data zamwienia, natomiast inna mogaby zawiera szczegy dotyczce kadego zamawianego produktu (zakadajc, e na
pojedynczym zamwieniu klienta moe znale si wicej ni jeden produkt).
Innymi sowy, nasz przykad nie oddaje jeszcze w peni rzeczywistoci. Teraz jednak,
gdy rozdzielilimy ju informacje na dwie oddzielne tabele, moemy zbudowa instrukcj SELECT, ktra bdzie pobieraa dane z dwch tabel jednoczenie.
Zanim jednak przejdziemy do tworzenia takiej instrukcji, musimy rozwiza jeszcze
jeden problem, a mianowicie zagadnienie prezentacji graficznej naszych dwch tabel
i dorozumianego zwizku midzy nimi. Wczeniej wywietlalimy kad tabel z nazwami kolumn w grnym wierszu i kolejnymi wierszami zawierajcymi odpowiednie
dane. Teraz, gdy mamy do czynienia z wicej ni jedn tabel, pokaemy inny sposb
wizualnej reprezentacji danych. Na rysunku 11.1 przedstawiono diagram z obiema tabelami. Ich nazwy znajduj si w grnym wierszu, natomiast kolejne wiersze zawieraj
nazwy poszczeglnych kolumn. Tego rodzaju diagram jest uproszczon wersj tak zwanego diagramu zwizkw encji (ang. entity-relationship diagram). Termin encja (ang.
entity) odnosi si do tabel, natomiast linia czca elementy danych w poszczeglnych
tabelach okrela zwizek (ang. relationship).

113

114

Rozdzia 11

Zczenia wewntrzne tabel

Rysunek 11.1. Diagram zwizkw encji

Zwr uwag na istotn kwesti, a mianowicie na to, e linia na diagramie czy kolumn IDKlienta z tabeli Klienci z IDKlienta w tabeli Zamwienia. Oznacza to, e te dwie
tabele s ze sob powizane. W obu tabelach przechowywane s te same dane w kolumnie IDKlienta.

Zczenie wewntrzne
Teraz ju moemy zaprezentowa instrukcj SELECT zawierajc zczenie wewntrzne
(ang. inner join):
SELECT *
FROM Klienci
INNER JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta

Przeanalizujmy kad lini powyszej instrukcji. Sowo kluczowe SELECT w pierwszej


linii i wystpujcy po nim symbol gwiazdki (*) wskazuj jedynie, e chcemy wybra
wszystkie kolumny z obu tabel. Druga linia z klauzul FROM sygnalizuje, e pierwsz
tabel, ktr wymieniamy, jest tabela Klienci. W trzeciej linii wystpuje nowe sowo
kluczowe, INNER JOIN, za pomoc ktrego okrelamy, jak tabel chcemy doczy do
uprzednio wymienionej. W tym przypadku jest to tabela Zamwienia.
Na koniec, w czwartej linii, uyto sowa kluczowego ON, ktre wystpuje w poczeniu
ze sowem INNER JOIN. Okrela ono, ktre dwie tabele i w jaki sposb zostaj ze sob
poczone. W tym przypadku czymy kolumn IDKlienta z tabeli Klienci (Klienci.
IDKlienta) z kolumn IDKlienta z tabeli Zamwienia (Zamwienia.IDKlienta). Poniewa kolumna IDKlienta ma tak sam nazw zarwno w tabeli Klienci, jak i w tabeli
Zamwienia, musimy poda nazw tabeli jako przedrostek do kolumny IDKlienta w klauzuli ON. Dziki zastosowaniu przedrostka moemy odrni, z ktrej tabeli pochodzi ta
kolumna.
Powysza instrukcja SELECT zwraca nastpujcy wynik:
IDKlienta Imi

Nazwisko

IDZamwienia IDKlienta ZakupionaIlo CenaZaSztuk

Jan

Kowalski

2,50

Piotr

Nowak

10

1,25

Piotr

Nowak

12

1,50

Barbara Kwiatkowska 4

4,00

Kolejno tabel w zczeniach wewntrznych

Przeanalizujmy otrzymane wyniki. Zarwno tabela Klienci, jak i tabela Zamwienia


zawieray cztery wiersze. Patrzc na kolumn IDZamwienia, mona wywnioskowa, e
powysza tabela zawiera dane ze wszystkich czterech wierszy z tabeli Zamwienia. Jednake
koncentrujc uwag na kolumnie IDKlienta, mona zauway, e wymienionych zostao
tylko trzech klientw. Dlaczego tak si stao? Powodem jest to, e klient z IDKlienta = 4
nie istnieje w tabeli Zamwienia. Poniewa czymy dwie tabele wedug pola IDKlienta,
w tabeli Zamwienia nie istniej wiersze pasujce do IDKlienta = 4 z tabeli Klienci.
Powysza analiza pozwala na wycignicie nastpujcego wniosku: w wyniku zastosowania klauzuli INNER JOIN zwracane s wycznie dane, ktre istniej w obu zczonych
ze sob tabelach. W nastpnym rozdziale omwimy alternatywny sposb czenia tabel, dziki ktremu informacja o kliencie, ktrego IDKlienta = 4, znajdzie si w wyniku zapytania, nawet jeli nie bd istniay dla niego wiersze w tabeli Zamwienia.
Zauwa rwnie, e dane klienta Piotra Nowaka wystpuj w powyszym wyniku
dwukrotnie. W tabeli Klienci dla tego klienta wystpowa tylko jeden wiersz, dlaczego
zatem jego dane pojawiy si w wyniku dwukrotnie? Stao si tak dlatego, e w wynikach zwrcone zostay wszystkie moliwe sparowania wierszy z obu tabel. Poniewa
w przypadku Piotra w tabeli Zamwienia wystpuj dwa wiersze, oba mona powiza
z wierszem zawierajcym informacje o tym kliencie w tabeli Klienci. Std te dane
o Piotrze Nowaku zwracane s w wyniku dwukrotnie.
By moe zastanawiasz si, dlaczego tego rodzaju zczenie nosi nazw zczenia wewntrznego. Jest tak dlatego, e istniej dwa gwne typy tego rodzaju zcze, a mianowicie zczenia wewntrzne oraz zewntrzne. Zczenia zewntrzne zostan omwione w nastpnym rozdziale.

Kolejno tabel w zczeniach wewntrznych


Dziki zastosowaniu zczenia wewntrznego dane zwracane s w przypadku, gdy istniej elementy wsplne dla obu okrelonych tabel. W poprzedniej instrukcji SELECT
w klauzuli FROM wymienilimy tabel Klienci, natomiast tabela Zamwienia znalaza si
w klauzuli INNER JOIN. Jednak czy ma znaczenie, ktra tabela jest wymieniona jako
pierwsza? Jak si okazuje, kolejno, w jakiej s one wymienione, moe zosta zmieniona bez wpywu na otrzymywane wyniki. Ponisze dwie instrukcje SELECT s identyczne w sensie logicznym i zwracaj te same dane:
SELECT *
FROM Klienci
INNER JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
SELECT *
FROM Zamwienia
INNER JOIN Klienci
ON Zamwienia.IDKlienta = Klienci.IDKlienta

115

116

Rozdzia 11

Zczenia wewntrzne tabel

Jedyna rnica midzy powyszymi instrukcjami polega na tym, e pierwsze zapytanie


wywietlioby najpierw kolumny z tabeli Klienci, a nastpnie z tabeli Zamwienia.
W przypadku wyniku otrzymanego po wykonaniu drugiej instrukcji kolejno wywietlania kolumn byaby odwrotna.
Pamitaj, e SQL nie jest jzykiem proceduralnym. Nie precyzuje zatem dokadnej
kolejnoci, w jakiej zadanie ma zosta wykonane. Okrela jedynie, jaka jest podana logika, wedug ktrej ma zosta zwrcony wynik, natomiast zadanie de facto wykonywane
jest przy uwzgldnieniu charakterystyk konkretnej bazy danych. SQL jako taki nie okrela
dokadnie, w jaki sposb baza danych fizycznie pobiera dane. Optymalny sposb wykonywania instrukcji SELECT jest zdeterminowany przez oprogramowanie bazy danych.

Alternatywna skadnia zcze wewntrznych


W poprzednich przykadach w celu zdefiniowana zcze wewntrznych uylimy
sw kluczowych INNER JOIN oraz ON. Zczenie tego typu moe by take okrelone
za pomoc klauzuli FROM i WHERE.
Ponisza instrukcja SELECT czca tabele Klienci i Zamwienia jest nam ju znana:
SELECT *
FROM Klienci
INNER JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta

Alternatywny sposb zdefiniowana zczenia wewntrznego, bez uycia sw kluczowych INNER JOIN i ON, jest nastpujcy:
SELECT *
FROM Klienci, Zamwienia
WHERE Klienci.IDKlienta = Zamwienia.IDKlienta

W zaprezentowanym powyej innym wariancie skadni, zamiast uy sowa kluczowego


INNER JOIN, aby okreli dodatkowe tabele, ktre maj zosta doczone, wymieniamy
jedynie wszystkie podane tabele w klauzuli FROM. Zamiast klauzuli ON, za porednictwem ktrej okrelalimy, w jaki sposb tabele maj zosta powizane, w tym przypadku uylimy klauzuli WHERE, aby okreli zwizek midzy tabelami.
Mimo e zaprezentowany powyej odmienny format dziaa doskonale i daje te same
wyniki, nie polecam go stosowa. Zalet sw kluczowych INNER JOIN i ON jest to, e
wyranie precyzuj logik tworzenia zcze. Taki jest ich jedyny cel. Chocia moliwe jest okrelenie zwizku midzy tabelami w klauzuli WHERE, znaczenie instrukcji SQL
nie jest w tym przypadku ju tak oczywiste, gdy klauzula ta suy do sprecyzowania
kryteriw selekcji, a jednoczenie do okrelenia zwizku midzy wieloma tabelami.

Aliasy tabel cig dalszy

Aliasy tabel cig dalszy


Przyjrzyjmy si teraz kolumnom, ktre zostay zwrcone przez poprzedni instrukcj
SELECT. Dziki zastosowaniu symbolu gwiazdki (*) w wyniku znalazy si wszystkie
kolumny z obu tabel. Kolumna IDKlienta wystpuje dwa razy, poniewa istnieje
w obu tabelach. W praktyce takie powtrzenie jest jednak zbdne. Poniej zaprezentowano wobec tego alternatywn wersj instrukcji SELECT, w wyniku ktrej zwracane
s tylko te kolumny, ktre chcemy zobaczy. Ponadto, okrelimy w niej wyranie aliasy tabel i kolumn. Aliasy tabel (K dla tabeli Klienci i Z dla tabeli Zamwienia) s podawane po sowach kluczowych FROM i INNER JOIN, zaraz po sowie AS. Skadnia naszej
instrukcji bdzie zatem nastpujca:
SELECT
K.IDKlienta AS 'ID klienta',
K.Imi AS 'Imi',
K.Nazwisko AS 'Nazwisko',
Z.IDZamwienia AS 'ID zamwienia',
Z.ZakupionaIlo AS 'Ilo',
Z.CenaZaSztuk AS 'Cena'
FROM Klienci AS K
INNER JOIN Zamwienia AS Z
ON K.IDKlienta = Z.IDKlienta

a wynik tego zapytania to:


ID klienta

Imi

Nazwisko

ID zamwienia

Ilo

Cena

Jan

Kowalski

2,50

Piotr

Nowak

10

1,25

Piotr

Nowak

12

1,50

Barbara

Kwiatkowska

4,00

Zauwa, e sowa kluczowego AS uywamy zarwno w odniesieniu do aliasw kolumn,


jak i tabel. Naley przy tym zaznaczy, e to sowo kluczowe jest cakowicie opcjonalne
i wobec tego wszystkie jego wystpienia w powyszej instrukcji SELECT mog zosta
usunite. Nie bdzie to miao wpywu ani na poprawno zapytania, ani na jego wyniki.
Moim zdaniem, warto jednak go uywa w celu zachowania przejrzystoci instrukcji.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

Jak wspomniano w rozdziale 3., aliasy tabel w przypadku bazy danych Oracle definiowane s bez uycia
sowa kluczowego AS. Skadnia powyszej instrukcji SELECT w Oracle ma wobec tego nastpujc posta:
SELECT
K.IDKlienta AS 'ID klienta',
K.Imi AS 'Imi',
K.Nazwisko AS 'Nazwisko',
Z.IDZamwienia AS 'ID zamwienia',
Z.ZakupionaIlo AS 'Ilo',
Z.CenaZaSztuk AS 'Cena'

117

118

Rozdzia 11

Zczenia wewntrzne tabel

FROM Klienci K
INNER JOIN Zamwienia Z
ON K.IDKlienta = Z.IDKlienta

Co dalej?
Umiejtno czenia tabel w zapytaniu jest istotn cech SQL. Relacyjne bazy danych
byyby mao przydatne, gdyby nie byo moliwe czenie tabel. Dlatego te niniejszy
rozdzia powicony zosta sposobom budowania zcze wewntrznych. Dziki ich
zastosowaniu zwracane s dane pochodzce ze zczonych tabel tylko wwczas, gdy
istnieje midzy nimi powizanie. Zaprezentowany zosta take alternatywny sposb
definiowania tego rodzaju zcze, a take uyteczno aliasw tabel.
W kolejnym rozdziale, zatytuowanym Zczenia zewntrzne tabel, omwiony zostanie inny wany rodzaj zczenia, a mianowicie zczenie zewntrzne. Jak wspomniano
powyej, zczenia wewntrzne pozwalaj uzyska wybrane dane pochodzce ze zczonych tabel, jedynie gdy istnieje midzy nimi powizanie. Jeli wic dany klient nie
zoy adnych zamwie, w przypadku zastosowania zczenia wewntrznego w odniesieniu do tabel Klienci i Zamwienia w wynikach na prno bdziemy szuka informacji o nim. Natomiast dziki zczeniu zewntrznemu dane tego klienta zostan
wywietlone, nawet jeli nie bd istniay adne przypisane do niego zamwienia. Innymi sowy, zczenie zewntrzne pozwala nam zobaczy dane, ktre nie znalazyby si
w wyniku, gdybymy zastosowali zczenie wewntrzne.

R OZ DZ I A 12

Z CZENIA
ZEWNTRZNE
TABEL
NOWE SOWA KLUCZOWE: LEFT JOIN, RIGHT JOIN, FULL JOIN

Przejdmy teraz do omwienia zagadnienia zcze zewntrznych. Jak zapewne pamitasz, w przypadku zcze wewntrznych, aby mogy by wywietlone dane pochodzce z kilku tabel, musz by ze sob powizane za porednictwem wybranych
kolumn. W wyniku zczenia tabeli Klienci z tabel Zamwienia dane klienta, ktry
nie zoy dotychczas adnego zamwienia, nie zostay zwrcone. Moe si to wyda
mao istotne, jednak problem ten przypuszczalnie okae si znaczcy w przypadku innych rodzajw danych.
Powiedzmy, e mamy tabel Zamwienia oraz tabel Zwroty. Tabela Zwroty jest powizana z tabel Zamwienia za pomoc kolumny IDZamwienia. Innymi sowy, kady ze
zwrotw jest powizany z konkretnym zamwieniem. Zwrot nie moe zatem istnie,
jeli nie byo uprzednio zoone zamwienie. Problem pojawia si, gdy chcemy zobaczy w wyniku pojedynczego zapytania dane zwizane z zamwieniami oraz zwrotami. Jeli poczymy te tabele za pomoc zczenia wewntrznego, w wynikach nie zobaczymy zamwie, w przypadku ktrych nie wystpiy zwroty. Prawdopodobnie taka
sytuacja wystpi w przypadku wikszoci zamwie. W przeciwiestwie do zczenia wewntrznego, zczenie zewntrzne umoliwia wywietlenie wszystkich zamwie, nawet jeli wrd nich istniej takie, w przypadku ktrych nie wystpi zwrot. Z tego
wzgldu warto zna jego skadni, by mc j odpowiednio wykorzysta.

119

120

Rozdzia 12

Zczenia zewntrzne tabel

Zczenie zewntrzne
Wszystkie zczenia zaprezentowane w poprzednim rozdziale byy zczeniami wewntrznymi. Poniewa s one najczciej wykorzystywanym rodzajem zcze, SQL
traktuje je jako domylne, dziki czemu w instrukcji moemy uwzgldni ten typ zczenia, podajc jedynie sowo kluczowe JOIN. Innymi sowy, nie jest konieczne stosowanie penego zapisu INNER JOIN.
W odrnieniu od zcze wewntrznych, do ktrych zalicza si wycznie klauzula
INNER JOIN, istniej trzy rodzaje zcze zewntrznych (ang. outer joins): LEFT OUTER
JOIN, RIGHT OUTER JOIN oraz FULL OUTER JOIN. Uywa si te po prostu zapisw LEFT
JOIN, RIGHT JOIN i FULL JOIN. Sowo OUTER jest zbdne. Podsumowujc, proponuj, abymy odnosili si do nastpujcych czterech rodzajw zcze:
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL JOIN

Dziki temu atwiej zachowamy spjno skadni i prociej bdzie nam j zapamita.
Podczas omawiania zastosowa zcze zewntrznych bdziemy odnosi si w naszych
przykadach do trzech tabel. Bdzie to tabela Klienci, zawierajca informacje o kadym z klientw, tabela Zamwienia, przechowujca dane o kadym zoonym zamwieniu, oraz tabela Zwroty, w ktrej gromadzone bd informacje o kadym dokonanym na rzecz klienta zwrocie.
Na rysunku 12.1 pokazano, w jaki sposb wyej wymienione tabele zostay ze sob
poczone.

Rysunek 12.1. Diagram zwizkw encji

W przeciwiestwie do rysunku z poprzedniego rozdziau, przedstawiajcego diagram


zwizkw encji, tabele powyej zostay poczone za pomoc strzaek, nie linii. Wida
strzak poprowadzon od pola IDKlienta w tabeli Klienci do pola IDKlienta w tabeli
Zamwienia. Jej grot wskazuje, e w tym przypadku najprawdopodobniej chodzi o jednostronne poczenie tabeli Klienci z tabel Zamwienia w tym sensie, e nie dla kadego
klienta musz istnie zamwienia. Jednoczenie moe istnie wiele zamwie zoonych
przez jednego klienta. Podobnie strzaka, ktrej grot skierowany jest od tabeli Zamwienia
w stron tabeli Zwroty, wskazuje, e nie musz istnie zwroty dla kadego z zamwie
oraz e moe istnie wiele zarejestrowanych zwrotw dla jednego zamwienia.

Zczenia lewostronne

Linia reprezentujca zczenie midzy tabelami Klienci i Zamwienia czy ze sob


kolumny IDKlienta, poniewa wanie za pomoc tej kolumny, wystpujcej w obu
tabelach, dokonywane jest ich zczenie. Podobnie zczenie midzy tabel Zamwienia
i Zwroty wystpuje przy uyciu kolumn IDZamwienia, wystpujcych w obu tabelach.
Innymi sowy, tabela Zamwienia jest zczona z tabel Klienci za porednictwem klienta.
Aby istniao zamwienie, musi istnie klient. Tabela Zwroty jest natomiast powizana
z tabel Zamwienia poprzez zamwienie. Oznacza to, e musi istnie zamwienie, aby
mona byo dokona jego zwrotu. Zauwa, e tabela Zwroty nie jest bezporednio powizana z tabel Klienci. Wystarczy jednak, e poczymy wszystkie trzy tabele, tak jak
powyej, a bdziemy w stanie okreli, ktry klient dokona zwrotu zakupionego towaru.
Zobaczmy teraz, jaka jest zawarto kadej z wyej wymienionych tabel. W tabeli
Klienci znajduj si nastpujce dane:
IDKlienta

Imi

Nazwisko

Jan

Kowalski

Piotr

Nowak

Barbara

Kwiatkowska

Adam

Piotrowski

Tabela Zamwienia ma nastpujc zawarto:


IDZamwienia

IDKlienta

DataZamwienia

KwotaZamwienia

2009-09-01

10,00

2009-09-02

12,50

2009-10-03

18,00

2009-09-15

20,00

Tabela Zwroty ma natomiast posta:


IDZwrotu

IDZamwienia

DataZwrotu

KwotaZwrotu

2009-09-02

5,00

2009-10-12

18,00

Zauwa, e trzech z czterech klientw zoyo zamwienia, natomiast na cztery zoone zamwienia dokonano tylko dwch zwrotw.

Zczenia lewostronne
Zbudujmy teraz instrukcj SELECT, w ktrej za pomoc klauzuli LEFT JOIN dokonamy
zczenia trzech powyszych tabel:
SELECT
Klienci.Imi AS 'Imi',
Klienci.Nazwisko AS 'Nazwisko',
Zamwienia.DataZamwienia AS 'Data zamwienia',

121

122

Rozdzia 12

Zczenia zewntrzne tabel

Zamwienia.KwotaZamwienia AS 'Kwota zamwienia',


Zwroty.DataZwrotu AS 'Data zwrotu',
Zwroty.KwotaZwrotu AS 'Kwota zwrotu'
FROM Klienci
LEFT JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
LEFT JOIN Zwroty
ON Zamwienia.IDZamwienia = Zwroty.IDZamwienia
ORDER BY Klienci.IDKlienta, Zamwienia.IDKlienta, IDZwrotu

Jej wynik jest nastpujcy:


Imi

Nazwisko

Data
zamwienia

Kwota
zamwienia

Data zwrotu

Kwota
zwrotu

Jan

Kowalski

2009-09-01

10,00

2009-09-02

5,00

Piotr

Nowak

2009-09-02

12,50

NULL

NULL

Piotr

Nowak

2009-10-03

18,00

2009-10-12

18,00

Barbara

Kwiatkowska

2009-09-15

20,00

NULL

NULL

Adam

Piotrowski

NULL

NULL

NULL

NULL

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W przeciwiestwie do SQL Server i MySQL, Oracle zazwyczaj wywietla daty w formacie DD-MMM-YY.
Na przykad data z powyszej tabeli, 2009-09-02, zostaaby wywietlona w Oracle jako 02-SEP-09.
Jednak bez wzgldu na to, ktrej bazy danych uywasz, format wywietlania dat bdzie si rni,
w zalenoci od ustawie bazy danych.
Zanim przeanalizujemy powysz instrukcj SELECT, zwrmy uwag na dwa interesujce aspekty widoczne w zwrconych przez ni danych. Po pierwsze, w przypadku
Adama Piotrowskiego w wyniku pojawio si tylko jego imi i nazwisko, a w pozostaych
kolumnach jest warto NULL. Powodem tego jest brak danych dla tego klienta w tabeli
Zamwienia. Dziki zastosowaniu zczenia zewntrznego, cho klient ten nie zoy
adnego zamwienia, moemy zobaczy jego podstawowe dane. Gdybymy zastosowali klauzul INNER JOIN zamiast LEFT JOIN, nie zobaczylibymy w wyniku adnych
wierszy zawierajcych dane Adama Piotrowskiego.
Podobnie, w wynikach nie ma danych o zwrotach dotyczcych zamwienia z dnia
2009-09-02 zoonego przez Piotra Nowaka, a take zamwienia Barbary Kwiatkowskiej z tego wzgldu, e w tabeli Zwroty nie istniej wiersze odnoszce si do tych zamwie. Gdybymy do zczenia wykorzystali klauzul INNER JOIN zamiast klauzuli
LEFT JOIN, w wyniku nie pojawiyby si wiersze z danymi dla tych wanie zamwie.
Spjrzmy teraz na sam instrukcj SELECT. W pierwszych kilku liniach wymieniane s kolumny, co nie jest dla Ciebie adnym zaskoczeniem. Zauwa, e zamiast wykorzystywa
aliasy tabel, wymieniamy w tym przypadku wszystkie kolumny, stosujc ich pene nazwy oraz nazw tabeli jako przedrostek.

Weryfikacja wystpowania wartoci NULL

Pierwsza wymieniona jest tabela Klienci. Zostaa ona wyszczeglniona zaraz po sowie kluczowym FROM. Druga jest tabela Zamwienia, ktra jest wymieniana po pierwszym
sowie kluczowym LEFT JOIN. Nastpujca po niej klauzula ON wskazuje, w jaki sposb
tabela Zamwienia jest powizana z tabel Klienci. Trzecia wymieniona zostaa tabela
Zwroty, ktra znajduje si po drugim sowie kluczowym LEFT JOIN. Wystpujca po
nim klauzula ON okrela, w jaki sposb tabela Zwroty jest zczon z tabel Zamwienia.
Niezwykle istotne jest zwrcenie uwagi na fakt, e kolejno, w jakiej wymieniane s
tabele w odniesieniu do sowa kluczowego LEFT JOIN, ma znaczenie. Gdy chcemy z niego
skorzysta, tabela wymieniana po jego lewej stronie jest zawsze tabel nadrzdn. Tabela
po prawej stronie sowa kluczowego LEFT JOIN to tabela podrzdna. Poprzez czenie
tabel nadrzdnych z podrzdnymi otrzymujemy wszystkie wiersze z tabeli nadrzdnej,
nawet wwczas, gdy dla niektrych wierszy z tej tabeli nie istniej do doczenia wiersze w tabeli podrzdnej.
W pierwszej klauzuli LEFT JOIN tabela Klienci znajduje si po jej lewej stronie, natomiast tabela Zamwienia po prawej stronie tej klauzuli. Oznacza to, e tabela Klienci
jest tabel nadrzdn, a tabela Zamwienia podrzdn. Innymi sowy, chcemy zobaczy
wszystkie wybrane dane z tabeli Klienci, nawet jeli w tabeli podrzdnej nie istniej
dane, ktre mona do nich doczy.
Podobnie w drugiej klauzuli LEFT JOIN, tabela Zamwienia znajduje si po jej lewej
stronie, natomiast tabela Zwroty po prawej. To oznacza, e tabela Zamwienia jest tabel
nadrzdn, za tabela Zwroty podrzdn. Chcemy tym samym wywietli wszystkie zamwienia, nawet jeli w przypadku ktrychkolwiek z nich nie wystpiy adne zwroty.
Na kocu instrukcji znajduje si klauzula ORDER BY. Zauwa, e kolumny w niej wymienione nie zostay wyszczeglnione w ramach listy_kolumn.

Weryfikacja wystpowania wartoci NULL


W wyniku powyszej instrukcji SELECT znajdowa si jeden klient, ktry nie zoy
zamwienia, a take dwa zamwienia, ktre nie podlegay zwrotowi. W przeciwiestwie do klauzuli INNER JOIN, dziki wykorzystaniu klauzuli LEFT JOIN wiersze z brakujcymi wartociami zostay uwzgldnione w wyniku.
Aby zweryfikowa zdobyt przez nas wiedz o klauzuli LEFT JOIN, sprbujmy teraz zbudowa instrukcj SELECT, za pomoc ktrej wyszczeglnimy tylko te zamwienia, dla ktrych nie mia miejsca zwrot kosztw. Rozwizaniem jest dodanie do instrukcji klauzuli
WHERE, za pomoc ktrej bdziemy mogli zweryfikowa istnienie bd brak wartoci NULL:
SELECT
Klienci.Imi AS 'Imi',
Klienci.Nazwisko AS 'Nazwisko',
Zamwienia.DataZamwienia AS 'Data zamwienia',
Zamwienia.KwotaZamwienia AS 'Kwota zamwienia'
FROM Klienci
LEFT JOIN Zamwienia

123

124

Rozdzia 12

Zczenia zewntrzne tabel

ON Klienci.IDKlienta = Zamwienia.IDKlienta
LEFT JOIN Zwroty
ON Zamwienia.IDZamwienia = Zwroty.IDZamwienia
WHERE Zamwienia.IDZamwienia IS NOT NULL
AND Zwroty.IDZwrotu IS NULL
ORDER BY Klienci.IDKlienta, Zamwienia.IDZamwienia

Wynik tej instrukcji jest nastpujcy:


Imi

Nazwisko

Data zamwienia

Kwota zamwienia

Piotr

Nowak

2009-09-02

12,50

Barbara

Kwiatkowska

2009-09-15

20,00

Klauzula WHERE weryfikuje najpierw, ktra kolumna Zamwienia.IDZamwienia nie zawiera


wartoci NULL. Dziki temu moemy by pewni, e w wyniku nie znajd si klienci,
ktrzy nigdy nie zoyli zamwienia. Za pomoc drugiej cz klauzuli WHERE wybierane s tylko te wiersze, dla ktrych kolumna Zwroty.IDZwrotu zawiera wartoci NULL.
Gwarantuje to, e zwrcone zostan tylko te zamwienia, dla ktrych nie byo zwrotu.

Zczenia prawostronne
W powyszej instrukcji SELECT wykorzystywane jest sowo kluczowe LEFT JOIN. W przypadku zcze prawostronnych dobra wiadomo jest taka, e w ich zastosowaniu mona
dostrzec pewn analogi do zcze lewostronnych (ang. left joins). Jedyna rnica pomidzy nimi dotyczy kolejnoci, w jakiej tabele s wymieniane w instrukcji.
W przypadku zcze lewostronnych tabela nadrzdna jest wymieniana po lewej stronie
sowa kluczowego LEFT JOIN. Tabela podrzdna, w ktrej mog, ale nie musz znajdowa
si pasujce wiersze, jest wyszczeglniana po prawej stronie tego sowa kluczowego.
Jeli chodzi o zczenia prawostronne (ang. right joins), tabela nadrzdna jest wymieniana
na prawo od sowa kluczowego RIGHT JOIN, natomiast tabela podrzdna umieszczana
jest po jego lewej stronie. To jest jedyna rnica midzy zczeniami lewostronnymi
a prawostronnymi.
Klauzula FROM w powyszej instrukcji SELECT miaa nastpujc posta:
FROM Klienci
LEFT JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
LEFT JOIN Zwroty
ON Zamwienia.IDZamwienia = Zwroty.IDZamwienia

Moglibymy j przeksztaci do poniszej postaci, stosujc zczenia prawostronne:


FROM Zwroty
RIGHT JOIN Zamwienia
ON Zamwienia.IDZamwienia = Zwroty.IDZamwienia
RIGHT JOIN Klienci
ON Klienci.IDKlienta = Zamwienia.IDKlienta

Kolejno tabel w zczeniach zewntrznych

Zwr uwag, e istotna jest wycznie kolejno, w ktrej tabele s wymienione przed
sowem kluczowym RIGHT JOIN i po nim. Kolejno, w jakiej wymieniane s kolumny
po sowie kluczowym ON, nie ma znaczenia.
Zasadniczo oznacza to, e zupenie nie ma potrzeby stosowania kiedykolwiek sowa
kluczowego RIGHT JOIN. Wszystko, co mona zdefiniowa za pomoc tej klauzuli, moe
by okrelone za pomoc klauzuli LEFT JOIN. Proponujemy zatem stosowa LEFT JOIN,
poniewa intuicyjnie rozpoczynamy od wymieniania waniejszych tabel, zwanych te
nadrzdnymi.

Kolejno tabel w zczeniach zewntrznych


Stwierdzilimy wczeniej, e kolejno, w jakiej wymieniane s tabele w zczeniu wewntrznym, nie jest istotna. Nie mona powiedzie tego samego o zczeniach zewntrznych. Zarwno w przypadku zcze lewostronnych, jak i prawostronnych kolejno
wymieniania tabel ma znaczenie. Jednake istnieje w tym zakresie pewna elastyczno
w sytuacjach, w ktrych wyliczane s co najmniej trzy tabele. Wwczas kolejno sw
kluczowych wskazujcych na dany typ zczenia mona dowolnie zmienia.
Spjrzmy jeszcze raz na oryginaln klauzul FROM z pierwotnej instrukcji SELECT:
FROM Klienci
LEFT JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
LEFT JOIN Zwroty
ON Zamwienia.IDZamwienia = Zwroty.IDZamwienia

Widzielimy ju, e moemy najpierw wymieni tabel Zwroty, a na kocu wyszczeglni tabel Klienci, jeli tylko zmienimy rodzaj zczenia na prawostronne, tak jak
poniej:
FROM Zwroty
RIGHT JOIN Zamwienia
ON Zamwienia.IDZamwienia = Zwroty.IDZamwienia
RIGHT JOIN Klienci
ON Klienci.IDKlienta = Zamwienia.IDKlienta

Czy jest zatem moliwe wymienienie najpierw tabeli Klienci, potem tabeli Zwroty,
a na kocu tabeli Zamwienia? Tak, jeli zastosujemy w jednej instrukcji SELECT zarwno
zczenia zewntrzne, jak i wewntrzne i dodamy kilka nawiasw. Poniszy fragment
zapytania jest rwnoznaczny z podanym powyej:
FROM Klienci
LEFT JOIN (Zwroty
RIGHT JOIN Zamwienia
ON Zamwienia.IDZamwienia = Zwroty.IDZamwienia)
ON Klienci.IDKlienta = Zamwienia.IDKlienta

To, co pocztkowo wydawao si do prost instrukcj, teraz stao si niepotrzebnie


skomplikowanym zapytaniem. Radzimy zatem zawsze stosowa sowo kluczowe LEFT

125

126

Rozdzia 12

Zczenia zewntrzne tabel

JOIN i unika wykorzystywania nawiasw przy tworzeniu zoonych klauzul FROM,

w ktrych wymienianych jest wiele tabel.

Zczenia pene
Ostatnim zczeniem typu zewntrznego jest zczenie pene (ang. full join). W przypadku
zcze zewntrznych i wewntrznych jedna tabela peni rol tabeli nadrzdnej, a druga podrzdnej. Innymi sowy, jedna z nich zawiera dane wymagane, a druga opcjonalne. Oznacza to, e gdy dokonujemy zczenia obu tabel, nie musz wystpowa wiersze doczone z tabeli podrzdnej (lub zawierajcej opcjonalne dane).
W zczeniu wewntrznym obie tabele s nadrzdne (lub wymagane). Gdy czone s
dwie tabele, aby dany wiersz pojawi si w wyniku, musi istnie powizanie danych
z obu kolumn, za pomoc ktrych dokonano zczenia.
W przypadku zczenia penego obie tabele peni rol tabeli podrzdnej (lub zawierajcej opcjonalne dane). W tej sytuacji, gdy dokonujemy zczenia tabeli A z tabel B,
wywietlamy 1) wszystkie wiersze z tabeli A, nawet jeli brak w tabeli B dopasowanych
do nich wierszy, a take 2) wszystkie wiersze z tabeli B, nawet jeli nie zosta do nich
dopasowany aden wiersz z tabeli A.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL

W odrnieniu od Microsoft SQL Server i Oracle, w MySQL nie istniej zczenia pene.
Przyjrzyjmy si teraz przykadowi zczenia dwch tabel. Pierwsz z nich bdzie tabela
Filmy:
IDFilmu

TytuFilmu

Klasyfikacja

Bezsenno w Seattle

PG

Zagubieni w Ameryce

Bambi

Pnoc pnocny zachd

brak kategorii

Forrest Gump

PG-13

Truman Show

PG

Druga tabela to KlasyfikacjaFilmw:


IDKlasyfikacji

Klasyfikacja

OpisKlasyfikacji

Dozwolony dla wszystkich grup wiekowych

PG

Wskazany nadzr rodzica/rodzicw

PG-13

Szczeglnie wskazany nadzr


rodzica/rodzicw

Film mona obejrze jedynie z rodzicami

NC-17

Film jedynie dla osb powyej 17. roku ycia

Zczenia pene

Tabela Filmy zawiera list filmw oraz ich klasyfikacj wedug Amerykaskiego Stowarzyszenia Przemysu Filmowego (ang. Motion Picture Association of America). Tabela
KlasyfikacjaFilmw zawiera list klasyfikacji wraz z ich opisami. Powiedzmy, e
chcemy wywietli wszystkie wiersze uzyskane w wyniku zczenia obu tabel. Do tego celu, a wic do wywietlenia wszystkich wierszy z tabeli Filmy oraz KlasyfikacjaFilmw,
uyjemy klauzuli FULL JOIN. Dziki zczeniu penemu otrzymamy wszystkie wiersze
z obu tych tabel, nawet jeli niektre wiersze z jednej tabeli nie znalazy dopasowania
w drugiej. Instrukcja SELECT bdzie zatem miaa nastpujc posta:
SELECT
TytuFilmu AS 'Tytu filmu',
OpisKlasyfikacji AS 'Opis klasyfikacji filmu'
FROM Filmy
FULL JOIN KlasyfikacjaFilmw
ON Filmy.Klasyfikacja = KlasyfikacjaFilmw.Klasyfikacja
ORDER BY OpisKlasyfikacji, TytuFilmu

a jej wynik to:


Tytu filmu

Opis klasyfikacji filmu

Pnoc pnocny zachd

NULL

Bambi

Dozwolony dla wszystkich grup wiekowych

NULL

Film jedynie dla osb powyej 17. roku ycia

Bezsenno w Seattle

Wskazany nadzr rodzica/rodzicw

Truman Show

Wskazany nadzr rodzica/rodzicw

Forrest Gump

Szczeglnie wskazany nadzr rodzica/rodzicw

Zagubieni w Ameryce

Film mona obejrze jedynie z rodzicami

Zauwa, e w wyniku wystpuj dwie puste komrki, co jest bezporednim skutkiem


zastosowania klauzuli FULL JOIN. Jeli chodzi o warto NULL w kolumnie Opis
klasyfikacji filmu w przypadku filmu Pnoc pnocny zachd, wynika ona z braku
dopasowania wiersza dla tej produkcji filmowej w tabeli KlasyfikacjaFilmw. W przypadku drugiej komrki z wartoci NULL aden film nie zosta przypisany do kategorii
Film jedynie dla osb powyej 17. roku ycia, poniewa w tabeli Filmy nie zostay
znalezione adne wiersze pasujce do tej klasyfikacji.
W praktyce zczenie pene jest rzadko stosowane z prostej przyczyny ten typ relacji
midzy tabelami wystpuje raczej sporadycznie. Jego celem jest wywietlenie danych,
w przypadku ktrych istniej niedopasowane wiersze w obu czonych tabelach. Zazwyczaj bdziemy jednak zainteresowani wywietleniem wycznie tych danych, w przypadku
ktrych wystpuje pene dopasowanie wierszy z obu czonych tabel (zczenie wewntrzne) bd dopasowanie jednostronne (zczenie lewostronne lub prawostronne).

127

128

Rozdzia 12

Zczenia zewntrzne tabel

Co dalej?
W tym rozdziale poszerzylimy zakres naszej analizy dotyczcej zcze o zagadnienia
zwizane ze zczeniami lewostronnymi, prawostronnymi i penymi. Zczenie lewostronne umoliwia wywietlenie wszystkich wierszy znajdujcych si w tabeli nadrzdnej, nawet wwczas, gdy w tabeli podrzdnej nie istniej wiersze, ktre mona do nich
doczy. Zczenie prawostronne stanowi swego rodzaju odwrotno zczenia lewostronnego. W przypadku zczenia prawostronnego zamieniana jest po prostu kolejno tabel nadrzdnych i podrzdnych. Jeli natomiast chodzi o zczenie pene, obie
czone tabele staj si tabelami podrzdnymi. W wyniku zapytania zawierajcego tego
rodzaju zczenie wywietlane s wszystkie wiersze, ktre s w obu tabelach, bez wzgldu
na to, czy istniej midzy nimi dopasowane wiersze.
W kolejnym rozdziale, zatytuowanym Zczenia zwrotne i widoki, przyjrzymy si
dwm pokrewnym zagadnieniom. Na pocztek zajmiemy si zczeniami zwrotnymi,
dziki ktrym moemy poczy dan tabel z sam sob. Mona powiedzie, e w ten
sposb utworzony zostanie wirtualny widok tabeli w takim sensie, e teraz bdziemy
mogli przyjrze si jej zawartoci z dwch rnych perspektyw. Drug zasadnicz
kwesti, ktra zostanie poruszona w nastpnym rozdziale, bdc niejako uoglnieniem problematyki zcze zwrotnych, jest tworzenie wirtualnych widokw opartych
na wielu tabelach.

R OZ DZ I A 13

Z CZENIA
ZWROTNE
I WIDOKI
NOWE SOWA KLUCZOWE: CREATE VIEW, ALTER VIEW, DROP VIEW

Zczenia wewntrzne i zewntrzne zaprezentowane w ostatnich dwch rozdziaach


dotyczyy rnych sposobw czenia danych pochodzcych z wielu tabel. W tym rozdziale zajmiemy si scharakteryzowaniem innych sposobw wykorzystywania i definiowania tabel. Do tej pory zakadalimy, e dane, na ktre patrzymy, fizycznie istniej
w tabelach w bazie danych. Zajmiemy si teraz dwoma technikami, ktre umoliwi
nam podgld danych w wirtualny sposb.
Pierwsza technika, technika zcze zwrotnych (ang. self joins), pozwala dwukrotnie
odnie si do tej samej tabeli, jakby chodzio o dwie oddzielne tabele. Za pomoc tego rodzaju zczenia tworzony jest de facto wirtualny widok tabeli, co pozwala na jej
wielokrotne uycie.
Druga technika dotyczy widokw baz danych, dziki ktrym utworzysz dowolne
wirtualne tabele.

Zczenia zwrotne
Za pomoc zczenia zwrotnego moemy poczy tabel z ni sam. Tego rodzaju
zczenia najczciej s stosowane w przypadku, gdy dane zawarte w tabelach wskazuj na konieczno takiego zczenia. S to tabele, w ktrych jedna z kolumn odwouje si do innej kolumny w tej samej tabeli. Typowym przykadem tego typu relacji
jest tabela, ktra zawiera informacje o pracownikach.

129

130

Rozdzia 13

Zczenia zwrotne i widoki

W poniszym przykadzie w kadym wierszu z tabeli Kadry warto w kolumnie wskazuje na inny wiersz w tej samej tabeli, zawierajcy dane przeoonego danego pracownika. W pewnym sensie tego rodzaju odwoanie jest analogiczne do zastosowania kluczy
obcych. Gwna rnica polega jednak na tym, e klucze obce wskazuj na kolumny
w innych tabelach, natomiast w tym przypadku mamy kolumny, ktre wskazuj na
wiersze w tej samej tabeli.
Spjrzmy na dane w tabeli Kadry:
IDPracownika

Pracownik

IDPrzeoonego

Zuzanna Nowak

NULL

Henryk Dbrowski

Justyna Pieczyska

Ryszard Feldman

Karolina Biaek

Joanna Mostowiak

Andrzej Borowski

Anna Musia

Bartomiej Kozio

10

Dawid Sowik

Kolumna IDPrzeoonego zawiera informacj o tym, kto jest przeoonym danego pracownika. Numery znajdujce si w tej kolumnie wskazuj na wartoci w kolumnie ID
Pracownika. Na przykad dla Henryka Dbrowskiego warto w kolumnie IDPrzeoo
nego to 1. Oznacza to, e jego przeoon jest Zuzanna Nowak, ktra ma IDPracownika
rwne 1.
Jak wynika z powyszych danych, podwadnymi Zuzanny Nowak s Henryk Dbrowski, Justyna Pieczyska i Ryszard Feldman. Zauwa, e w przypadku Zuzanny Nowak
brakuje wartoci w kolumnie IDPrzeoonego. Oznacza to, e jest ona prezesem firmy
i nie ma przeoonego.
Powiedzmy, e chcemy wywietli list wszystkich pracownikw wraz z imieniem i nazwiskiem ich przeoonego. Aby tego dokona, utworzymy zczenie zwrotne w celu zczenia tabeli Kadry z sam sob. W przypadku tego rodzaju zcze naley zawsze stosowa aliasy tabel, aby moliwe byo odrnienie kadego wystpienia danej tabeli
w instrukcji SELECT. Pierwsze z nich otrzyma alias Pracownicy, natomiast drugie alias
Przeoeni. Instrukcja bdzie miaa nastpujc posta:
SELECT
Pracownicy.Pracownik AS 'Imi i nazwisko pracownika',
Przeoeni.Pracownik AS 'Imi i nazwisko przeoonego'
FROM Kadry AS Pracownicy
INNER JOIN Kadry AS Przeoeni
ON Pracownicy.IDPrzeoonego = Przeoeni.IDPracownika
ORDER BY Pracownicy.IDPracownika

Zczenia zwrotne

a jej wynik to:


Imi i nazwisko pracownika

Imi i nazwisko przeoonego

Henryk Dbrowski

Zuzanna Nowak

Justyna Pieczyska

Zuzanna Nowak

Ryszard Feldman

Zuzanna Nowak

Karolina Biaek

Henryk Dbrowski

Joanna Mostowiak

Henryk Dbrowski

Andrzej Borowski

Justyna Pieczyska

Anna Musia

Ryszard Feldman

Bartomiej Kozio

Ryszard Feldman

Dawid Sowik

Karolina Biaek

Najciekawszy element powyszej instrukcji SELECT to klauzula ON w zczeniu. Aby


zczenie zwrotne zadziaao poprawnie, musimy uy klauzuli ON w celu okrelenia
zwizku pomidzy kolumn IDPrzeoonego w tabeli Kadry z aliasem Pracownicy oraz
kolumn IDPracownika tej samej tabeli, ktra tym razem otrzymaa alias Przeoeni.
Innymi sowy, przeoony jest rwnie pracownikiem danej firmy.
Zauwa, e Zuzanna Nowak nie znalaza si w powyszym wyniku. Stao si tak dlatego, e w instrukcji zastosowalimy zczenie wewntrzne. Poniewa nie ma ona przeoonego, nie istnieje w jej przypadku zczenie z tabel Przeoeni. Jeli chcemy, aby
wiersz z danymi dla Zuzanny Nowak zosta uwzgldniony w wynikach zapytania, konieczne jest dokonanie zmiany w nastpujcej linii:
INNER JOIN Kadry AS Przeoeni

tak aby miaa posta:


LEFT JOIN Kadry AS Przeoeni

Wwczas otrzymalibymy wynik:


Imi i nazwisko pracownika

Imi i nazwisko przeoonego

Zuzanna Nowak

NULL

Henryk Dbrowski

Zuzanna Nowak

Justyna Pieczyska

Zuzanna Nowak

Ryszard Feldman

Zuzanna Nowak

Karolina Biaek

Henryk Dbrowski

Joanna Mostowiak

Henryk Dbrowski

Andrzej Borowski

Justyna Pieczyska

Anna Musia

Ryszard Feldman

Bartomiej Kozio

Ryszard Feldman

Dawid Sowik

Karolina Biaek

131

132

Rozdzia 13

Zczenia zwrotne i widoki

Tworzenie widokw
Za pomoc zczenia zwrotnego moemy utworzy wiele widokw tej samej tabeli.
W niniejszym podrozdziale rozbudujemy to zagadnienie, omawiajc tworzenie widokw danej tabeli lub jakiegokolwiek zbioru tabel.
Widoki to po prostu instrukcje SELECT, ktre zostay zapisane w bazie danych. Po ich
zapisaniu widoki mog odnosi si do kadej z tabel w bazie danych. Tabele takie zawieraj dane fizyczne, natomiast widoki, cho nie zawieraj danych, umoliwiaj zastosowanie w stosunku do nich instrukcji SELECT, tak jakby byy tabelami zawierajcymi dane.
Do czego s nam potrzebne widoki? Odpowiemy na to pytanie szczegowo w dalej
czci tego rozdziau. Na razie w skrcie nadmiemy tylko, e dziki widokom uzyskujemy dodatkow elastyczno w zakresie dostpu do danych. Bez wzgldu na to,
czy Twoja baza danych istnieje od wczoraj czy od kilku lat, dane, ktre zawiera, przechowywane s w tabelach w bardzo specyficzny sposb. Z czasem wymagania odnonie dostpu do tych danych ulegaj zmianie, a reorganizacja danych w bazie danych
w celu spenienia nowych wymaga nie jest atwa. Du zalet stosowania widokw jest
to, e pozwalaj tworzy nowe wirtualne widoki danych istniejcych w bazie danych.
Innymi sowy, widoki umoliwiaj utworzenie odpowiednikw nowych tabel bez potrzeby fizycznej reorganizacji danych. Dziki umiejtnoci ich zastosowania Twj projekt
bazy danych w przejrzysty sposb bdzie reprezentowa jej stan faktyczny.
W jaki sposb widok jest przechowywany w bazie danych? Wszystkie relacyjne bazy
danych skadaj si z wielu rnych rodzajw obiektw. Najwaniejszym z nich jest
tabela. Jednake wikszo oprogramowania do zarzdzania bazami danych pozwala
uytkownikom zapisa dowoln liczb innych typw obiektw. S to najczciej widoki i procedury skadowane. W bazie danych istnieje wiele innych typw obiektw.
Na przykad w Microsoft SQL Server istnieje moliwo utworzenia wielu typw
obiektw innych ni widoki czy tabele, takich jak funkcje i wyzwalacze.
W SQL mamy do dyspozycji sowo kluczowe CREATE VIEW, ktre umoliwia uytkownikom tworzenie nowych widokw. Skadnia takiej instrukcji jest nastpujca:
CREATE VIEW NazwaWidoku AS
InstrukcjaSelect

Po utworzeniu widoku poprzez NazwWidoku moliwe bdzie odwoywanie si do danych zwracanych przez InstrukcjSelect.
Poniej przedstawimy przykad tworzenia widoku. Najpierw jednak przypomnijmy
sobie instrukcj SELECT zamieszczon w poprzednim rozdziale:
SELECT
Klienci.Imi AS 'Imi',
Klienci.Nazwisko AS 'Nazwisko',
Zamwienia.DataZamwienia AS 'Data zamwienia',
Zamwienia.KwotaZamwienia AS 'Kwota zamwienia',

Pobieranie danych z widokw


Zwroty.DataZwrotu AS 'Data zwrotu',
Zwroty.KwotaZwrotu AS 'Kwota zwrotu'
FROM Klienci
LEFT JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
LEFT JOIN Zwroty
ON Zamwienia.IDZamwienia = Zwroty.IDZamwienia
ORDER BY Klienci.IDKlienta, Zamwienia.IDKlienta, IDZwrotu

Powysza instrukcja zwraca nastpujce dane:


Imi

Nazwisko

Data zamwienia

Kwota
zamwienia

Data
zwrotu

Kwota
zwrotu

Jan

Kowalski

2009-09-01

10,00

2009-09-02

5,00

Piotr

Nowak

2009-09-02

12,50

NULL

NULL

Piotr

Nowak

2009-10-03

18,00

2009-10-12

18,00

Barbara

Kwiatkowska

2009-09-15

20,00

NULL

NULL

Adam

Piotrowski

NULL

NULL

NULL

NULL

W jaki sposb za pomoc instrukcji SELECT mona utworzy widok? Wystarczy j umieci w instrukcji CREATE VIEW, tak jak pokazano poniej:
CREATE VIEW KlienciZamwieniaZwroty AS
SELECT
Klienci.Imi AS 'Imi',
Klienci.Nazwisko AS 'Nazwisko',
Zamwienia.DataZamwienia AS 'Data zamwienia',
Zamwienia.KwotaZamwienia AS 'Kwota zamwienia',
Zwroty.DataZwrotu AS 'Data zwrotu',
Zwroty.KwotaZwrotu AS 'Kwota zwrotu'
FROM Klienci
LEFT JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
LEFT JOIN Zwroty
ON Zamwienia.IDZamwienia = Zwroty.IDZamwienia

Jedynym brakujcym elementem w powyszej klauzuli CREATE VIEW jest klauzula


ORDER BY znajdujc si w poprzedniej instrukcji SELECT. Poniewa widoki nie s przechowywane w formie fizycznie istniejcych danych, umieszczanie w nich klauzuli
ORDER BY nie ma sensu.

Pobieranie danych z widokw


Kiedy wykonamy powysz instrukcj CREATE VIEW, utworzony zostanie widok o nazwie KlienciZamwieniaZwroty. Gdy tworzony jest widok, nie s zwracane adne dane. Definiowana jest jedynie jego posta, aby mg by nastpnie uyty.
Aby otrzyma te same dane, co podczas uruchamiania penej instrukcji SELECT, wystarczy wykona nastpujc instrukcj:
SELECT *
FROM KlienciZamwieniaZwroty

133

134

Rozdzia 13

Zczenia zwrotne i widoki

W wyniku otrzymamy nastpujce dane:


Imi

Nazwisko

Data
zamwienia

Kwota
zamwienia

Data
zwrotu

Kwota
zwrotu

Jan

Kowalski

2009-09-01

10,00

2009-09-02

5,00

Piotr

Nowak

2009-09-02

12,50

NULL

NULL

Piotr

Nowak

2009-10-03

18,00

2009-10-12

18,00

Barbara

Kwiatkowska

2009-09-15

20,00

NULL

NULL

Adam

Piotrowski

NULL

NULL

NULL

NULL

Co jednak zrobi w przypadku, gdybymy chcieli wywietli tylko kilka kolumn z widoku dla jednego, wybranego klienta? Wwczas instrukcja SELECT miaaby posta:
SELECT
Imi,
Nazwisko,
[Data zamwienia]
FROM KlienciZamwieniaZwroty
WHERE Nazwisko = 'Nowak'

a jej wynik to:


Imi

Nazwisko

Data zamwienia

Piotr

Nowak

2009-09-02

Piotr

Nowak

2009-10-03

Zwr uwag, e aby odwoa si do kolumn w utworzonym przez nas widoku, konieczne byo podanie aliasw ich nazw, ktre zostay okrelone podczas tworzenia widoku. Nie mamy ju moliwoci odwoywania si do oryginalnych nazw kolumn. Na
przykad w widoku kolumnie Zamwienia.DataZamwienia przypisano alias Data zamwienia. W Microsoft SQL Server, w przypadku gdy w aliasach kolumn wystpuj
spacje, s one podawane w nawiasach kwadratowych.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

Jak wspomniano w rozdziale 2., w MySQL i Oracle w celu wywietlenia zawartoci kolumn, ktrych nazwy zawieraj spacje, wykorzystywane s inne rodzaje znakw. W przypadku MySQL jest to znak akcentu sabego (`), natomiast w Oracle uywa si cudzysoww ().

Zalety stosowania widokw


Powyszy przykad przedstawia jedn z najwaniejszych korzyci wynikajcych z uywania widokw. Po utworzeniu widoku mona si do niego odwoywa tak jak do tabeli.
Nawet jeli widok zosta utworzony na podstawie wielu poczonych ze sob tabel, teraz w sensie logicznym wydaje si by pojedyncz tabel.

Zalety stosowania widokw

Podsumujmy zatem zalety korzystania z widokw:


Widoki pozwalaj uproci zoone zapytania. Po pierwsze, dziki zastosowaniu
widokw mona uproci zbyt zoone instrukcje SELECT. Na przykad, jeli mamy
instrukcj, w ktrej dokonujemy zczenia szeciu tabel, przydatne moe okaza si
utworzenie widokw, z ktrych kady zawieraby dane wynikajce z poczenia
dwch lub trzech tabel. Wwczas moliwe byoby odwoywanie si w instrukcji
SELECT do tych wanie widokw. Instrukcja taka byaby mniej skomplikowana ni
jej pierwotna posta.
Widoki s obiektami wielokrotnego uycia. Jeli mamy sytuacj, w ktrej trzy tabele zawsze s ze sob czone, moemy utworzy widok oparty na tych wanie
tabelach. Wwczas, zamiast czenia za kadym razem tych samych trzech tabel,
gdy potrzebujemy wywietli z nich dane, moemy po prostu odwoa si do zdefiniowanego uprzednio widoku.
Widoki umoliwiaj zmian formatowania danych. Jeli mamy kolumn w bazie
danych, ktra nie jest poprawnie sformatowana, aby dostosowa jej format do naszych potrzeb, moemy skorzysta z funkcji CAST lub z innych tego rodzaju funkcji.
Na przykad moemy napotka kolumn zawierajc daty, ktrej zadeklarowany
typ danych wskazuje na liczby cakowite w formacie RRRRMMDD. Moemy w tym
przypadku podejrzewa, e uytkownicy prawdopodobnie woleliby zobaczy dane
w tej kolumnie w formacie daty i czasu, aby mogy by prezentowane i wykorzystywane wanie jako data. Aby to osign, na podstawie tej tabeli moemy utworzy widok, ktry zmieni format wybranej kolumny na poprawny. Od tej pory zamiast do tabeli bdziemy mogli odwoywa si do nowo utworzonego widoku.
W widokach mona tworzy kolumny obliczane. Zamy, e mamy w tabeli
dwie kolumny: Ilo i CenaZaSztuk. Uytkownicy zazwyczaj chcieliby zobaczy
dane dotyczce cznejCeny, ktr mona uzyska poprzez pomnoenie wspomnianych dwch kolumn. Moemy wic utworzy widok oparty na pierwotnie zdefiniowanej tabeli wraz z dodatkow kolumn obliczan, zawierajc wynik mnoenia. Uytkownicy mog nastpnie odwoywa si do nowego widoku, w ktrym
maj bezporedni dostp do wyniku wspomnianej kalkulacji.
Widoki mog by uywane do zmiany nazw kolumn. Jeli baza danych zawiera
niejasne nazwy kolumn, mona utworzy widoki z aliasami kolumn, aby nazwy
kolumn stay si zrozumiae dla odbiorcy.
Za pomoc widokw moemy tworzy podzbiory danych. Powiedzmy, e mamy
tabel zawierajc informacje o wszystkich klientach. Wikszo uytkownikw
chciaaby jednak zobaczy tylko tych klientw, ktrzy zoyli zamwienie w cigu
ostatniego roku. Aby to osign, wystarczy w atwy sposb utworzy widok, ktry
bdzie zawiera podzbir tylko takich danych.

135

136

Rozdzia 13

Zczenia zwrotne i widoki

Widoki mog by wykorzystywane w celu ograniczenia dostpu do danych ze


wzgldw bezpieczestwa. W pewnych sytuacjach moemy chcie udostpni
pewnym uytkownikom do wgldu tylko niektre kolumny danej tabeli. Aby to
osign, mona utworzy widok tabeli dla tych uytkownikw. Nastpnie, dziki
wykorzystaniu funkcji zabezpiecze bazy danych, naleaoby przydzieli tym uytkownikom dostp do nowo utworzonego widoku, jednoczenie odbierajc im dostp do tabeli rdowej.

Modyfikowanie i usuwanie widokw


Gdy widok zostanie ju utworzony, moe zosta zmodyfikowany przy uyciu instrukcji ALTER VIEW. Jej skadnia jest nastpujca:
ALTER VIEW NazwaWidoku AS
InstrukcjaSelect

Gdy chcemy dokona zmiany widoku, konieczne jest podanie caej, nowej instrukcji
SELECT w definicji widoku. Wwczas poprzednia instrukcja SELECT w widoku zostanie
zastpiona przez now.
Powiedzmy, e pierwotnie utworzylimy widok za pomoc nastpujcej instrukcji:
CREATE VIEW WidokKlientw AS
SELECT
Imi,
Nazwisko
FROM Klienci

Jeli chcemy zmodyfikowa ten widok, dodajc do niego now kolumn zawierajc
informacj o drugim imieniu klienta, moemy wykona nastpujc instrukcj:
ALTER VIEW WidokKlientw AS
SELECT
Imi,
DrugieImi AS 'Drugie imi',
Nazwisko
FROM Klienci

Tak jak ju wspomnielimy, podczas tworzenia i modyfikacji widoku nie s zwracane


adne dane. Uruchamiajc tego typu instrukcj, jedynie tworzymy definicj widoku
lub dokonujemy w niej zmian.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W przeciwiestwie do Microsoft SQL Server i MySQL, w Oracle polecenie ALTER VIEW ma nieco wszy
zakres. Aby w przypadku tej bazy danych dokona modyfikacji widoku, konieczne jest zastosowanie
najpierw klauzuli DROP VIEW, a nastpnie CREATE VIEW, w ramach ktrej zostanie podana nowa
definicja widoku.

Co dalej?

Aby usun utworzony widok, naley skorzysta z instrukcji DROP VIEW o nastpujcej
skadni:
DROP VIEW NazwaWidoku

Jeli wic chcielibymy usun utworzony wczeniej widok o nazwie WidokKlientw,


moemy to zrobi za pomoc poniszej instrukcji:
DROP VIEW WidokKlientw

Co dalej?
Dziki zczeniom zwrotnym i widokom moemy wywietla dane w nietypowy sposb. Zczenie zwrotne umoliwia nam poczenie tabeli z sam sob. Widoki natomiast s jeszcze bardziej elastyczne. Zasadniczo, kad instrukcj SELECT mona zapisa w formie widoku, do ktrego nastpnie moemy si odwoywa, jakby by zwyk
tabel. W przeciwiestwie do tabel, widoki jednak nie zawieraj adnych danych. Stanowi jedynie pewnego rodzaju nowy, wirtualny widok danych zawartych w istniejcych tabelach. Dziki nim mamy midzy innymi moliwo uproszczenia zbyt zoonych
instrukcji czy zmiany formatowania danych. Gdy ju istniej, mog by modyfikowane lub usuwane odpowiednio za pomoc instrukcji ALTER VIEW i DELETE VIEW.
W kolejnym rozdziale, zatytuowanym Podzapytania, wrcimy do tematu bezporednio
zwizanego z wczeniej zaprezentowanym zagadnieniem czenia tabel. Dziki podzapytaniom bdziemy mogli czy ze sob tabele bez jawnego wykorzystania zcze
wewntrznych lub zewntrznych. Ze wzgldu na wiele rodzajw podzapyta oraz sposobw ich zastosowania bdzie to prawdopodobnie najtrudniejszy temat poruszany
w niniejszej ksice. Zdobycie tej wiedzy moe jednak da Ci du satysfakcj. Podzapytania oferuj wiele moliwoci zarwno ze wzgldu na sposb, jak i miejsce ich zastosowania i ze wzgldu na to pozytywnie wpyn na nieszablonowo tworzonych
przez Ciebie zapyta.

137

138

Rozdzia 13

Zczenia zwrotne i widoki

R OZ DZ I A 14

P ODZAPYTANIA
NOWE SOWA KLUCZOWE: EXISTS

W rozdziale 4. omwilimy funkcje zagniedone. Byy to funkcje, w ramach ktrych


wystpoway inne funkcje. W podobny sposb w zapytaniach SQL mog znajdowa
si inne zapytania. Zapytania, ktre s zawarte w innych zapytaniach, okrela si mianem podzapyta (ang. subqueries).
Zagadnienie podzapyta jest nieco skomplikowane, gwnie dlatego, e istnieje wiele
rnych sposobw ich zastosowania. Podzapytania mona umieci w wielu rnych
czciach instrukcji SELECT, przy czym kade z nich bdzie miao swoje charakterystyczne cechy i zasad dziaania. Poniewa podzapytania s zawarte w innym zapytaniu, mog by zalene od gwnego zapytania i z nim powizane lub te cakowicie od
niego niezalene. Ponownie, skutkiem takiego rozrnienia s liczne sposoby ich wykorzystywania.
Bez wzgldu na to, jak uywane s podzapytania, dziki nim zapytania SQL moemy
budowa na wiele rnych sposobw. W wielu przypadkach funkcjonalno podzapytania mona uzyska, stosujc rwnie inne elementy SQL. Wwczas zastosowanie
podzapytania staje si kwesti osobistych preferencji. Przekonasz si jednak, e w pewnych sytuacjach podzapytania mog okaza si niezbdne.
Przejdmy zatem do omwienia podstawowych rodzajw podzapyta.

Rodzaje podzapyta
Podzapytania mog by wykorzystywane nie tylko w instrukcji SELECT, ale take z instrukcjami INSERT, UPDATE i DELETE, ktre zostan omwione w rozdziale 17. W tym
rozdziale zaprezentujemy sposoby zastosowania podzapyta tylko w odniesieniu do
instrukcji SELECT.

139

140

Rozdzia 14

Podzapytania

Poniej znajduje si znana nam ju skadnia oglnej instrukcji SELECT:


SELECT lista_kolumn
FROM lista_tabel
WHERE warunek
GROUP BY lista_kolumn
HAVING warunek
ORDER BY lista_kolumn

Podzapytania mona umieci praktycznie w kadej klauzuli w instrukcji SELECT. Jednake ich skadnia i sposb ich wykorzystania rni si od siebie nieznacznie w zalenoci od tego, czy zostay osadzone w miejscu listy_kolumn, listy_tabel czy warunku.
Wyjanijmy jednak najpierw, czym dokadnie jest podzapytanie. Podzapytanie to instrukcja SELECT umieszczona wewntrz innej instrukcji SELECT. Warto zaznaczy, e
w danej instrukcji mona umieci wicej ni jedno podzapytanie.
Podsumowujc, istniej trzy gwne sposoby uycia podzapytania:
Gdy podzapytanie znajduje si w miejscu listy_tabel, okrela rdo danych.
Gdy podzapytanie znajduje si w miejscu warunku, staje si czci kryteriw selekcji.
Gdy podzapytanie znajduje si w miejscu listy_kolumn, za jego pomoc tworzona
jest pojedyncza kolumna z wartoci obliczan.
W tym rozdziale objanione zostanie szczegowo zastosowanie podzapyta przy
uwzgldnieniu powyszych trzech miejsc ich wystpowania.

Wykorzystanie podzapytania jako rda danych


Gdy podzapytanie jest czci klauzuli FROM, stanowi wwczas nowe rdo danych.
Mamy tu pewn analogi do tworzenia widoku, a nastpnie odwoywania si do niego
w instrukcji SELECT. Jedyna rnica jest w tym przypadku taka, e widok jest na stae
zapisywany w bazie danych, natomiast podzapytanie wykorzystywane jako rdo danych nie jest zapisywane. Ma charakter tymczasowy, wystpujc jedynie jako cz instrukcji SELECT.
Przyjrzyjmy si najpierw przykadowi obrazujcemu sposb zastosowania podzapyta
jako rde danych. Bdziemy przy tym korzysta z danych z poniszej tabeli Klienci:
IDKlienta

NazwaKlienta

Jan Kowalski

Piotr Nowak

Barbara Kwiatkowska

Adam Piotrowski

oraz z tabeli Zamwienia o nastpujcej postaci:

Wykorzystanie podzapytania jako rda danych


IDZamwienia

IDKlienta

KwotaZamwienia

SposbZapaty

22,25

Gotwka

11,75

Karta kredytowa

5,00

Karta kredytowa

8,00

Gotwka

9,33

Karta kredytowa

10,11

Karta kredytowa

Uwzgldniajc dane z powyszych tabel, chcielibymy zobaczy list klientw wraz


z czn kwot zamwie opaconych gotwk. Taki wynik otrzymamy za pomoc
nastpujcej instrukcji SELECT:
SELECT
NazwaKlienta AS 'Nazwa klienta',
ISNULL (ZamwieniaGotwka.ZsumowanaKwotaZamwie, 0) AS 'cznie zamwienia gotwka'
FROM Klienci
LEFT JOIN
(SELECT
IDKlienta,
SUM (KwotaZamwienia) as 'ZsumowanaKwotaZamwie'
FROM Zamwienia
WHERE SposbZapaty = 'Gotwka'
GROUP BY IDKlienta) AS ZamwieniaGotwka
ON Klienci.IDKlienta = ZamwieniaGotwka.IDKlienta
ORDER BY Klienci.IDKlienta

Dwie puste linie widoczne w instrukcji maj na celu wizualne oddzielenie podzapytania od pozostaych czci instrukcji. Podzapytanie znajduje si w jej rodkowej czci.
Wynik powyszej instrukcji jest nastpujcy:
Nazwa klienta

cznie zamwienia gotwka

Jan Kowalski

22,25

Piotr Nowak

8,00

Barbara Kwiatkowska

Adam Piotrowski

W przypadku Adama Piotrowskiego czna kwota zamwie zapaconych gotwk


wyniosa 0, poniewa klient ten nie zoy adnego zamwienia. Jeli chodzi o Barbar
Kwiatkowsk, pomimo zoenia przez ni dwch zamwie, warto ta rwnie jest rwna 0, gdy klientka za oba dokonaa patnoci kart kredytow. Zauwa, e w przypadku obu tych osb w tabeli zostayby wywietlone wartoci NULL, gdyby nie zastosowanie funkcji ISNULL konwertujcej wartoci NULL na 0.
Przeledmy teraz sposb dziaania podzapytania. W powyszej instrukcji ma ono posta:
SELECT
IDKlienta,
SUM (KwotaZamwienia) as 'ZsumowanaKwotaZamwie'

141

142

Rozdzia 14

Podzapytania

FROM Zamwienia
WHERE SposbZapaty = 'Gotwka'
GROUP BY IDKlienta

Stosujc oglny zapis, caa instrukcja SELECT miaaby posta:


SELECT
NazwaKlienta AS 'Nazwa klienta',
ISNULL (ZamwieniaGotwka.ZsumowanaKwotaZamwie, 0) AS 'cznie zamwienia gotwka'
FROM Klienci
LEFT JOIN
(podzapytanie) AS ZamwieniaGotwka
ON Klienci.IDKlienta = ZamwieniaGotwka.IDKlienta
ORDER BY Klienci.IDKlienta

Gdybymy wykonali samo podzapytanie, otrzymalibymy wynik:


IDKlienta

ZsumowanaKwotaZamwie

22,25

8,00

W wyniku znajduj si tylko dane dla klienta 1 i 2. Klauzula WHERE w podzapytaniu ogranicza natomiast zwracane wyniki wycznie do zamwie opaconych gotwk.
W powyszym przykadzie wystpuje odniesienie do caego podzapytania w takiej
formie, jakby byo ono oddzieln tabel lub widokiem. Zauwa, e do podzapytania
przypisano alias tabeli ZamwieniaGotwka, za porednictwem ktrego moliwe jest
odwoywanie si w gwnej instrukcji SELECT do kolumn zawartych w podzapytaniu.
W poniszym wierszu z gwnej instrukcji SELECT wystpuje odniesienie do danych
zawartych w podzapytaniu:
ISNULL (ZamwieniaGotwka.ZsumowanaKwotaZamwie, 0) AS 'cznie zamwienia gotwka'

ZamwieniaGotwka.ZsumowanaKwotaZamwie to kolumna pochodzca z podzapytania.

Jednak czy naprawd konieczne jest zastosowanie podzapytania w celu uzyskania podanego wyniku caego zapytania? W tym przypadku odpowied brzmi: tak. Moglibymy sprbowa po prostu poczy tabele Klienci i Zamwienia za pomoc zczenia lewostronnego, tak jak pokazano poniej:
SELECT
NazwaKlienta AS 'Nazwa klienta',
SUM (KwotaZamwienia) as 'ZsumowanaKwotaZamwie'
FROM Klienci
LEFT JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
WHERE SposbZapaty = 'Gotwka'
GROUP BY Klienci.IDKlienta, NazwaKlienta
ORDER BY Klienci.IDKlienta

Powysze zapytanie zwraca jednak nastpujce dane:

Wykorzystanie podzapytania w kryteriach selekcji


Nazwa klienta

ZsumowanaKwotaZamwie

Jan Kowalski

22,25

Piotr Nowak

8,00

W wynikach nie zostay wywietlone wiersze dla Barbary Kwiatkowskiej i Adama


Piotrowskiego, poniewa klauzula WHERE, ktra wykluczya ze zwracanych danych zamwienia opacone gotwk, jest teraz elementem gwnej instrukcji, nie podzapytania. Wskutek tego nie s zwracane wiersze dla klientw, ktrzy uregulowali patno
za zoone zamwienia w innej formie ni gotwk.

Wykorzystanie podzapytania w kryteriach selekcji


W rozdziale 8. zaprezentowalimy pierwszy format operatora IN. Przykad, ktrego
uylimy, to:
WHERE Wojewdztwo IN ('pomorskie', 'wielkopolskie')

W przypadku tego formatu operator IN suy jedynie do wymienienia w nawiasie listy


wartoci. Istnieje rwnie drugi format operatora IN, w przypadku ktrego w nawiasach jest umieszczana caa instrukcja SELECT. Na przykad lista wojewdztw zostaaby
przy jego uyciu wyszczeglniona nastpujco:
WHERE Wojewdztwo IN
(SELECT
Wojewdztwa
FROM TabelaWojewdztw
WHERE Region = 'Zachd')

Drugi format, zamiast wymieniania poszczeglnych wojewdztw, umoliwia wygenerowanie ich listy poprzez zastosowanie bardziej zoonej logiki.
Pokamy to na przykadzie opartym na zdefiniowanych przez nas powyej tabelach
Klienci i Zamwienia. Zamy, e chcemy wybra list klientw, ktrzy kiedykolwiek
zapacili gotwk za jakiekolwiek zoone przez nich zamwienie. Instrukcja SELECT
bdzie miaa posta:
SELECT NazwaKlienta AS 'Nazwa klienta'
FROM Klienci
WHERE IDKlienta IN
(SELECT IDKlienta
FROM Zamwienia
WHERE SposbZapaty = 'Gotwka')

a jej wynik to:


Nazwa klienta
Jan Kowalski
Piotr Nowak

143

144

Rozdzia 14

Podzapytania

Barbara Kwiatkowska nie znalaza si w wyniku naszego zapytania, poniewa nigdy nie
zoya zamwienia, za ktre zapacia gotwk. Zauwa, e podzapytanie z instrukcj
SELECT zostao w caoci umieszczone w nawiasach bdcych elementem skadni sowa
kluczowego IN. Zwr rwnie uwag na to, e kolumna IDKlienta zostaa uyta do
poczenia dwch zapyta. Pomimo e w wyniku wywietlamy Nazw klienta, kolumny
IDKlienta uywamy w celu okrelenia relacji midzy tabelami Klienci i Zamwienia.
Po raz kolejny moemy wic zada pytanie, czy powysze podzapytanie mona rwnie zapisa w formie zwykego zapytania. Take w tym przypadku odpowied brzmi:
tak. Oto odpowiednik zapytania, zwracajcy te same dane:
SELECT NazwaKlienta AS 'Nazwa klienta'
FROM Klienci
INNER JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
WHERE SposbZapaty = 'Gotwka'
GROUP BY Klienci.IDKlienta, Klienci.NazwaKlienta

Jak wida powyej, moemy poczy tabel Klienci z tabel Zamwienia bezporednio, bez uycia podzapytania. Teraz jednak konieczne byo zastosowanie klauzuli
GROUP BY w celu upewnienia si, e otrzymamy tylko jeden wiersz dla kadego klienta.

Podzapytania skorelowane
Podzapytania, ktre do tej pory nam towarzyszyy, byy podzapytaniami nieskorelowanymi. Oglnie rzecz biorc, podzapytania mona podzieli na nieskorelowane (ang.
uncorrelated) lub skorelowane (ang. correlated). Terminy te wskazuj na to, czy dane
podzapytanie jest powizane z zapytaniem, w ktrym zostao umieszczone. Podzapytania nieskorelowane nie s powizane z zewntrznym zapytaniem i s od niego cakowicie niezalene. Zapytania nieskorelowane s weryfikowane pod wzgldem poprawnoci i wykonywane tylko raz, jako element caej instrukcji SELECT.
W przeciwiestwie do podzapyta nieskorelowanych, podzapytania skorelowane s
w szczeglny sposb powizane z zewntrznym zapytaniem. Z uwagi na ten wyranie
okrelony zwizek, kady wiersz tego rodzaju podzapytania musi by weryfikowany
pod wzgldem poprawnoci i przy kadym jego uruchomieniu moe zwraca rne
wyniki.
Najprociej wyjani to na przykadzie. Wracajc do tabeli Klienci i Zamwienia, powiedzmy, e chcemy wywietli list klientw, w przypadku ktrych cakowita kwota
zoonych zamwie jest mniejsza ni 20 zotych. Podany wynik uzyskamy dziki
nastpujcej instrukcji:
SELECT
NazwaKlienta as 'Nazwa klienta'
FROM Klienci
WHERE
(SELECT

Podzapytania skorelowane
SUM (KwotaZamwienia)
FROM Zamwienia
WHERE Klienci.IDKlienta = Zamwienia.IDKlienta)
< 20

Zwrcone dane to:


Nazwa klienta

Barbara Kwiatkowska

Skd wiadomo, e powysza instrukcja zawiera podzapytanie skorelowane zamiast


nieskorelowanego? Odpowied na to pytanie uzyskamy, przygldajc si bliej samemu podzapytaniu:
SELECT
SUM (KwotaZamwienia)
FROM Zamwienia
WHERE Klienci.IDKlienta = Zamwienia.IDKlienta

Powysze podzapytanie jest skorelowane, poniewa samo nie moe zosta wykonane.
Jeli podjta zostanie taka prba, zwrcony zostanie bd, poniewa kolumna Klienci.
IDKlienta nie wystpuje w kontekcie tego podzapytania.
Aby lepiej to zrozumie, spjrzmy na oglny format caej instrukcji SELECT zawierajcej powysze podzapytanie:
SELECT
NazwaKlienta as 'Nazwa klienta'
FROM Klienci
WHERE
WynikPodzapytania < 20

Poniewa mowa o podzapytaniu skorelowanym, musi by ono zweryfikowane pod


wzgldem poprawnoci dla kadego klienta. Zauwa rwnie, e ten rodzaj podzapytania dziaa tylko wtedy, gdy zwracana jest pojedyncza warto.
Ponownie, mona by zapyta, czy powysze podzapytanie moe by przeksztacone
w zwyk instrukcj SELECT. W tym przypadku rwnie jest to moliwe. Poniej zaprezentowano rwnowan mu instrukcj zwracajc te same wyniki:
SELECT
NazwaKlienta as 'Nazwa klienta'
FROM Klienci
LEFT JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
GROUP BY Klienci.IDKlienta, NazwaKlienta
HAVING SUM (KwotaZamwienia) < 20

Zauwa, e bez zastosowania podzapytania rwnowana mu instrukcja SELECT wymaga uycia klauzul GROUP BY i HAVING. Klauzula GROUP BY tworzy grupy klientw, natomiast klauzula HAVING wymusza dla kadej z tych grup weryfikacj warunku dotyczcego cakowitej kwoty zoonych zamwie, ktra ma wynosi mniej ni 20 zotych.

145

146

Rozdzia 14

Podzapytania

Operator EXISTS
W odniesieniu do podzapyta skorelowanych moliwe jest take zastosowanie specjalnego operatora o nazwie EXISTS. Operator ten pozwala ustali, czy podane przez
nas dane znajduj si w wyniku podzapytania skorelowanego. Powiedzmy, e chcemy
dowiedzie si, ktrzy klienci zoyli zamwienia. Jednym ze sposobw realizacji takiego
wymagania jest zbudowanie nastpujcej instrukcji:
SELECT
NazwaKlienta as 'Nazwa klienta'
FROM Klienci
WHERE EXISTS
(SELECT *
FROM Zamwienia
WHERE Klienci.IDKlienta = Zamwienia.IDKlienta)

Zwrcony wynik to:


Nazwa klienta
Jan Kowalski
Piotr Nowak
Barbara Kwiatkowska

Adam Piotrowski nie pojawi si w wyniku zapytania, poniewa nie zoy adnych
zamwie. Sowo kluczowe EXISTS w powyszej instrukcji w odniesieniu do podzapytania zweryfikuje jego wynik jako prawdziwy, jeli instrukcja SELECT w podzapytaniu
skorelowanym zwrci jakiekolwiek dane. Zauwa, e podzapytanie wybiera wszystkie
kolumny (SELECT *). Poniewa nie ma znaczenia, jakie dane s wybierane w podzapytaniu, uywamy symbolu gwiazdki, aby zwrcone zostay wszystkie dane. Interesuje
nas natomiast to, czy podzapytanie zwraca jakiekolwiek dane.
Tak jak w dotychczas omawianych przypadkach, t sam logik, zawart w powyszej instrukcji, mona rwnie wyrazi w inny sposb. Poniej znajduje si instrukcja, w ktrej
razem z podzapytaniem zastosowano operator IN. Zwraca ona te same wyniki co zapytanie powyej.
SELECT
NazwaKlienta AS 'Nazwa klienta'
FROM Klienci
WHERE IDKlienta IN
(SELECT IDKlienta
FROM Zamwienia)

Te same dane otrzymamy rwnie, budujc nastpujc instrukcj niezawierajc podzapytania:


SELECT
NazwaKlienta AS 'Nazwa klienta'
FROM Klienci
INNER JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
GROUP BY NazwaKlienta

Zastosowanie podzapytania do wyznaczenia wartoci kolumny obliczanej

Zastosowanie podzapytania
do wyznaczenia wartoci kolumny obliczanej
Ostatnim z fundamentalnych zastosowa podzapyta jest wyznaczanie za ich pomoc
wartoci w kolumnie obliczanej. Powiedzmy, e chcielibymy zobaczy list klientw
wraz z obliczon liczb zamwie, ktre zoyli.
Podany wynik moemy rwnie dobrze uzyska, tworzc ponisz instrukcj niezawierajc podzapytania:
SELECT
NazwaKlienta AS 'Nazwa klienta',
COUNT (IDZamwienia) AS 'Liczba zamwie'
FROM Klienci
LEFT JOIN Zamwienia
ON Klienci.IDKlienta = Zamwienia.IDKlienta
GROUP BY Klienci.IDKlienta, NazwaKlienta
ORDER BY Klienci.IDKlienta

Jej wynik to:


Nazwa klienta

Liczba zamwie

Jan Kowalski

Piotr Nowak

Barbara Kwiatkowska

Adam Piotrowski

Ten sam rezultat moemy uzyska take w inny sposb, a mianowicie poprzez zastosowanie podzapytania do wyznaczenia wartoci w kolumnie obliczanej. Instrukcja SELECT
bdzie wwczas miaa nastpujc posta:
SELECT
NazwaKlienta AS 'Nazwa klienta',
(SELECT
COUNT (IDZamwienia)
FROM Zamwienia
WHERE Klienci.IDKlienta = Zamwienia.IDKlienta)
AS 'Liczba zamwie'
FROM Klienci
ORDER BY Klienci.IDKlienta

Zauwa, e w tym przypadku podzapytanie jest skorelowane. Zostao ono uyte do


wyznaczenia kolumny obliczanej w ramach listy_kolumn instrukcji SELECT. Innymi
sowy, po zweryfikowaniu poprawnoci podzapytania zwraca ono pojedyncz warto,
ktra nastpnie jest umieszczana na licie_kolumn. Poniej zamieszczono oglny format dla powyszej instrukcji:
SELECT
NazwaKlienta AS 'Nazwa klienta',
WynikPodzapytania AS 'Liczba zamwie'
FROM Klienci
ORDER BY Klienci.IDKlienta

147

148

Rozdzia 14

Podzapytania

Co dalej?
W tym rozdziale poznalimy trzy sposoby zastosowania podzapyta: jako rda danych,
w kryteriach selekcji oraz do wyznaczania wartoci kolumny obliczanej. Widzielimy
te przykady zarwno podzapyta skorelowanych, jak i nieskorelowanych. Omwilimy jednak tylko kilka z szerokiego spektrum zastosowa podzapyta, nie poruszajc
zagadnienia ich nadmiernego stosowania. Naley rwnie pamita, e wiele podzapyta zastpi mona innymi elementami instrukcji, co czyni je jeszcze bardziej
skomplikowanymi. To, czy bdziesz chcia z nich skorzysta, jest kwesti gustu, a czasem wydajnoci wykonywania instrukcji SELECT. Instrukcje zawierajce podzapytania
zazwyczaj wykonuj si wolniej ni w przypadku zastosowania rwnowanych podzapytaniom elementw zapytania. To zagadnienie omawiane jest w innych, bardziej zaawansowanych ksikach o SQL, w ktrych opisywane s liczne wady i zalety korzystania z podzapyta.
Zapoznajc si z wykorzystaniem zcze i podzapyta, zidentyfikowalimy rne
sposoby wybierania danych z wielu tabel. W kolejnym rozdziale, zatytuowanym Logika
zbiorw, przyjrzymy si sposobom umieszczania caych zapyta w jednej instrukcji SQL.
Jest to specjalny rodzaj logiki, ktra pozwala na czenie kilku zbiorw danych tak, aby
otrzyma jeden wynik. Jak zauwaymy, dziaania zwizane z logik zbiorw s czsto niezbdne, aby moliwe byo wywietlenie zbiorw danych powizanych ze sob jedynie
czciowo. Tak jak w przypadku podzapyta, techniki zastosowania logiki zbiorw
zapewniaj dodatkow elastyczno oraz umoliwiaj wykorzystanie dodatkowej logiki w budowanych przez Ciebie instrukcjach SQL.

R OZ DZ I A 15

L OGIKA
ZBIORW
NOWE SOWA KLUCZOWE: UNION, UNION ALL, INTERSECT, EXCEPT/MINUS

W kilku poprzednich rozdziaach, prezentujcych zczenia i podzapytania, omawiane


byy rne sposoby czenia danych z wielu tabel. Wszystko to jednak miao miejsce
w obrbie jednej instrukcji SELECT. W tym rozdziale poszerzymy nasz wiedz odnonie czenia tabel o moliwo wizania ze sob danych pochodzcych z odrbnych
instrukcji. Innymi sowy, poznamy sposb na zbudowanie pojedynczej instrukcji SQL,
w ramach ktrej dane pobrane bd za pomoc co najmniej dwch oddzielnych instrukcji SELECT.
W odniesieniu do koncepcji czenia zapyta czsto stosuje si termin logiki zbiorw
(ang. set logic), ktry jest pojciem matematycznym. Kade zapytanie SELECT moe
by takim wanie zestawem danych. Zatem w tym rozdziale omwimy cztery scenariusze prezentujce sposb zastosowania logiki zbiorw. Zakadajc, e do dyspozycji s
dwa zbiory danych, ZBIR A i ZBIR B, mamy nastpujce sposoby wybrania znajdujcych si w nich danych:
Dane, ktre s w ZBIORZE A lub w ZBIORZE B.
Dane, ktre s zarwno w ZBIORZE A, jak i w ZBIORZE B.
Dane, ktre s w ZBIORZE A, ale nie ma ich w ZBIORZE B.
Dane, ktre s w ZBIORZE B, ale nie ma ich w ZBIORZE A.
Zacznijmy od pierwszego scenariusza, w ktrym dane znajduj si w ZBIORZE A lub
w ZBIORZE B. Jak si pniej przekonamy, taki przypadek jest najbardziej powszechny i zasadniczy z punktu widzenia logiki zbiorw.

149

150

Rozdzia 15

Logika zbiorw

Zastosowanie operatora UNION


Operator UNION w SQL jest uywany do obsugi logiki dotyczcej wyboru danych pochodzcych ze ZBIORU A albo ze ZBIORU B. Zacznijmy zatem od przykadu. Zamy, e w naszej bazie danych mamy dwie tabele. Pierwsza z nich to tabela o nazwie
Zamwienia, zawierajca dane o zamwieniach zoonych przez klientw. Jej posta
jest nastpujca:
IDZamwienia

IDKlienta

DataZamwienia

LiczbaZamwionychSztuk

2009-10-13

10

2009-10-13

2009-12-05

2009-12-15

21

2009-12-28

11

Druga tabela, o nazwie Zwroty, zawiera dane dotyczce towaru, ktry zosta przez
klientw zwrcony:
IDZwrotu

IDKlienta

DataZwrotu

LiczbaZwrconychSztuk

2009-10-23

2009-12-07

2009-12-28

Zauwa, e w przeciwiestwie do tabeli Zwroty przedstawionej w rozdziale 12., tabela


o tej samej nazwie zaprezentowana powyej nie jest bezporednio powizana z tabel
Zamwienia. Innymi sowy, zwroty nie s zwizane z konkretnym zamwieniem. W tym
scenariuszu klient moe dokona zwrotu towaru pochodzcego z wielu zamwie.
Chcemy stworzy raport prezentujcy wszystkie zamwienia i zwroty odnoszce si
do konkretnego klienta. Chcielibymy rwnie posortowa zamwienia wedug daty
zamwienia, natomiast zwroty wzgldem daty zwrotu. Moemy uzyska taki wynik,
stosujc zamieszczon poniej instrukcj. Puste linie su jedynie unaocznieniu zastosowania w niej dwch cakowicie odrbnych instrukcji SELECT powizanych ze sob
za pomoc operatora UNION:
SELECT
DataZamwienia AS 'Data',
'Zamwienie' AS 'Rodzaj',
LiczbaZamwionychSztuk AS 'Liczba sztuk'
FROM Zamwienia
WHERE IDKlienta = 2
UNION
SELECT
DataZwrotu AS 'Data',
'Zwrot' AS 'Rodzaj',
LiczbaZwrconychSztuk AS 'Liczba sztuk'

Zastosowanie operatora UNION


FROM Zwroty
WHERE IDKlienta = 2
ORDER BY Data

Wynik powyszej instrukcji jest nastpujcy:


Data

Rodzaj

Liczba sztuk

2009-10-13

Zamwienie

2009-12-05

Zamwienie

2009-12-07

Zwrot

2009-12-15

Zamwienie

21

Jak wida, operator UNION oddziela dwie cakowicie odrbne instrukcje SELECT. Na samym
kocu mamy rwnie klauzul ORDER BY, ktra odnosi si do wynikw zwracanych przez
obie instrukcje SELECT. Oglny format powyszej instrukcji jest nastpujcy:
InstrukcjaSelect_1
UNION
InstrukcjaSelect_2
ORDER BY lista_kolumn

Aby operator UNION zadziaa poprawnie, musz by spenione trzy ponisze zasady:
Wszystkie instrukcje SELECT poczone ze sob za pomoc operatora UNION musz
mie tak sam liczb kolumn na licie_kolumn.
Wszystkie kolumny na licie_kolumn w kadej instrukcji SELECT musz by wymieniane w tej samej kolejnoci.
Wszystkie odpowiadajce sobie kolumny na licie_kolumn kadej instrukcji
SELECT musz mie takie same lub zgodne ze sob typy danych.
Nawizujc do powyszych zasad, zauwa, e w obu instrukcjach SELECT wybierane s trzy
kolumny. Kada z nich zawiera dane uporzdkowane w tej samej kolejnoci i o takim
samym typie.
Ponadto, gdy korzystamy z operatora UNION, powinnimy uy aliasw kolumn, aby
wszystkie odpowiadajce sobie kolumny w poszczeglnych zapytaniach miay takie
same nazwy. W naszym przykadzie pierwsza kolumna z pierwszej instrukcji SELECT ma
pierwotnie stosowan nazw pochodzc z tabeli, a wic DataZamwienia. Analogicznie, pierwsza kolumna w drugiej instrukcji to DataZwrotu. Aby upewni si, e pierwsza kolumna w wyniku kocowym bdzie miaa jedn, podan przez nas nazw,
obie wyej wymienione kolumny otrzymay alias Data. Dziki temu moemy odwoa si
do tej kolumny w ramach listy_kolumn w klauzuli ORDER BY.
Zauwa rwnie, e druga kolumna kadej z instrukcji SELECT wykorzystuje wartoci
literau. Utworzona zostaa kolumna obliczana o nazwie Rodzaj, w ktr wstawiana
jest warto Zamwienie lub Zwrot. Dziki temu wiemy, z ktrej tabeli pochodzi kady
wiersz z wyniku.

151

152

Rozdzia 15

Logika zbiorw

Na koniec zwr uwag na to, e klauzula ORDER BY odnosi si do kocowych wynikw zwracanych przez oba poczone ze sob zapytania. Jest to prawidowe dziaanie,
poniewa zastosowanie sortowania oddzielnie do kadej z instrukcji nie miaoby sensu.
W tym momencie warto si zatrzyma, aby zada sobie pytanie, dlaczego w powyszym przypadku konieczne byo zastosowanie operatora UNION zamiast zwykego zczenia tabeli Zamwienia z tabel Zwroty za pomoc pojedynczej instrukcji SELECT.
Skoro w obu tabelach istniej kolumny o nazwie IDKlienta, dlaczego nie moemy po
prostu poczy tych dwch tabel za pomoc tej wanie kolumny? Problem polega na
tym, e obie te tabele s tak naprawd powizane ze sob jedynie porednio. Klienci mog
skada zamwienia oraz dokonywa zwrotw, ale nie istnieje bezporedni zwizek
pomidzy zamwieniami a zwrotami.
Ponadto, nawet gdyby istniao bezporednie poczenie midzy tymi dwoma tabelami,
zczenie, o ktrym mowa powyej, nie daoby oczekiwanych rezultatw. Dziki zastosowaniu odpowiedniego zczenia powizane ze sob informacje mog by wywietlone w tym samym wierszu. Jednake w tym przypadku nasz intencj jest wywietlenie
zamwie i zwrotw w oddzielnych wierszach. Nasz cel osigniemy wanie poprzez
zastosowanie operatora UNION.
Podsumowujc, operator UNION umoliwia nam wywietlenie za pomoc jednego zapytania niepowizanych ze sob danych lub danych powizanych czciowo.

Doczanie lub eliminowanie duplikatw


za pomoc operatora UNION
Istniej dwa warianty operatora UNION: UNION i UNION ALL. Istnieje midzy nimi tylko
niewielka rnica, a mianowicie za pomoc operatora UNION eliminowane s wszystkie
zduplikowane wiersze, natomiast stosujc operator UNION ALL, wywietlimy wszystkie
wiersze, nawet gdy s wrd nich duplikaty.
Operator UNION umoliwia wyeliminowane duplikatw, dziaajc w podobny sposb
jak sowo kluczowe DISTINCT, omwione w poprzednich rozdziaach. Rnica polega
na tym, e DISTINCT stosowane jest w pojedynczej instrukcji SELECT, podczas gdy korzystajc z operatora UNION, eliminujemy duplikaty z wszystkich instrukcji SELECT poczonych ze sob wanie za pomoc tego operatora.
W poprzednim przykadzie zwizanym z tabelami Zamwienia i Zwroty nie wystpoway duplikaty, wic nie miao znaczenia, czy zastosujemy UNION czy UNION ALL. Poniej
przedstawimy przykad ilustrujcy rnic midzy nimi. Powiedzmy, e chcielibymy
wywietli w wynikach jedynie daty zoenia wszystkich zamwie i dokonania zwrotw.
Nie chcemy jednak zobaczy zduplikowanych wierszy zawierajcych t sam dat.
Ponisza instrukcja pozwala uzyska podany wynik:

Doczanie lub eliminowanie duplikatw za pomoc operatora UNION


SELECT
DataZamwienia AS 'Data'
FROM Zamwienia
UNION
SELECT
DataZwrotu AS 'Data'
FROM Zwroty
Order by Data

Zwrcone dane maj nastpujc posta:


Data
2009-10-13
2009-10-23
2009-12-05
2009-12-07
2009-12-15
2009-12-28

Zauwa, e data 2009-12-28 zostaa wymieniona tylko raz. Mimo e wiersz z dat
2009-12-28 istnieje zarwno w tabeli Zamwienia, jak i w tabeli Zwroty, dziki zastosowaniu operatora UNION data 2009-12-28 pojawia si w wyniku zapytania tylko raz.
Zmiemy teraz nasze zapytanie, dodajc sowo DISTINCT do kadej instrukcji SELECT
bdcej jej skadow. Zastpmy take sowo UNION sowem UNION ALL. Instrukcja bdzie teraz miaa nastpujc posta:
SELECT
DISTINCT
DataZamwienia AS 'Data'
FROM Zamwienia
UNION ALL
SELECT
DISTINCT
DataZwrotu AS 'Data'
FROM Zwroty
ORDER BY Data

Jej wynik to:


Data
2009-10-13
2009-10-23
2009-12-05
2009-12-07
2009-12-15
2009-12-28
2009-12-28

153

154

Rozdzia 15

Logika zbiorw

Dziki zastosowaniu sowa DISTINCT kada data zamwienia lub zwrotu jest wymieniana w wyniku tylko raz. Pomimo e istniej dwa zamwienia z dat 2009-10-13, jest
tylko jeden wiersz zawierajcy tak dat. Gdy natomiast uyjemy operatora UNION ALL,
w wyniku zobaczymy duplikaty w przypadku, gdy dany wiersz znajdzie si zarwno
w danych zwrconych przez zapytanie oparte na tabeli Zamwienia, jak i w wyniku
uruchomienia instrukcji SELECT pobierajcych dane z tabeli Zwroty. Widzimy wic, e
data 2009-12-28 pojawia si w powyszej tabeli dwukrotnie. Jedna z nich pochodzi
z tabeli Zamwienia, natomiast druga z tabeli Zwroty.

Krzyowanie zapyta
Operatory UNION i UNION ALL umoliwiaj pozyskanie danych, ktre znajduj si w obu
zbiorach okrelonych za pomoc dwch poczonych instrukcji SELECT. Mona to porwna do zastosowania operatora OR, dziki ktremu mona poczy dane pochodzce z dwch zbiorw logicznych.
W SQL mamy do dyspozycji operator INTERSECT, umoliwiajcy wybranie danych,
ktre znajduj si w obu zestawach danych bdcych wynikiem instrukcji SELECT. Zastosowanie operatora INTERSECT jest analogiczne do operatora AND i odnosi si do drugiego scenariusza wymienionego na pocztku tego rozdziau:
Dane, ktre s zarwno w ZBIORZE A, jak i w ZBIORZE B.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL

W MySQL nie wystpuje operator INTERSECT.


Korzystajc z tych samych tabel, Zamwienia i Zwroty, powiedzmy, e chcielibymy
zobaczy daty, w ktrych zarwno zoono zamwienia, jak i dokonano zwrotw. Instrukcja, ktra nam to umoliwi, ma nastpujc posta:
SELECT
DataZamwienia AS 'Data'
FROM Zamwienia
INTERSECT
SELECT
DataZwrotu AS 'Data'
FROM Zwroty
ORDER BY Data

Jej wynik to:


Data
2009-12-28

Krzyowanie zapyta

W wyniku znajduje si tylko jeden wiersz, poniewa jako jedyny wystpuje w obu wyej wymienionych tabelach.
Pewn odmian operacji krzyowania jest dziaanie wykonywane przy zastosowaniu
operatora EXCEPT. Podczas gdy w przypadku INTERSECT zwracane s dane znajdujce si
w obu zbiorach, operator EXCEPT umoliwia wywietlenie danych, ktre znajduj si
tylko w jednym z dwch zbiorw. Odpowiada to trzeciemu i czwartemu scenariuszowi wymienionemu na pocztku rozdziau:
Dane, ktre s w ZBIORZE A, ale nie ma ich w ZBIORZE B.
Dane, ktre s w ZBIORZE B, ale nie ma ich w ZBIORZE A.
Oglny format instrukcji zawierajcej operator EXCEPT jest nastpujcy:
InstrukcjaSelect_1
EXCEPT
InstrukcjaSelect_2
ORDER BY lista_kolumn

Stosujc powyszy format, otrzymamy dane bdce wynikiem InstrukcjiSelect_1,


ktre jednoczenie nie znajduj si w wyniku InstrukcjiSelect_2. Oto przykad:
SELECT
DataZamwienia AS 'Data'
FROM Zamwienia
EXCEPT
SELECT
DataZwrotu AS 'Data'
FROM Zwroty
ORDER BY Data

Wynik tej instrukcji jest nastpujcy:


Data
2009-10-12
2009-12-05
2009-12-15

Daty znajdujce si w wyniku to daty zoenia zamwie, w ktrych jednoczenie nie


nastpi zwrot towaru. Zauwa, e data 2009-12-28 nie pojawia si w powyszej tabeli, poniewa w tym dniu mia miejsce zwrot.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

W MySQL nie wystpuje operator EXCEPT.


Odpowiednikiem operatora EXCEPT w Oracle jest operator MINUS.

155

156

Rozdzia 15

Logika zbiorw

Co dalej?
W tym rozdziale zaprezentowalimy rne sposoby czenia wielu zbiorw uosabianych przez instrukcje SELECT w jedn instrukcj. Najczciej stosowanym do tego celu
operatorem jest operator UNION, ktry pozwala uzyska w wyniku poczone dane znajdujce si w jednym z dwch rnych zbiorw. Operator UNION jest analogiczny w zastosowaniu do operatora OR. Operator UNION ALL, bdcy odmian operatora UNION, pozwala
na wywietlenie zduplikowanych wierszy. Podobnie operator INTERSECT umoliwia
zaprezentowanie tylko tych danych, ktre znajduj si w obu czonych ze sob zbiorach.
Jego zastosowanie jest analogiczne do operatora AND. Jeli natomiast mowa o operatorze EXCEPT, dziki niemu moemy wybra dane, ktre znajduj si wycznie w jednym z dwch zbiorw.
W nastpnym rozdziale, pod tytuem Procedury skadowane i parametryzacja, przedstawiony zostanie sposb zapisu wielu instrukcji SQL za porednictwem procedury
oraz metody wykorzystania parametrw w ramach tych procedur. Dziki temu budowane przez nas polecenia SQL zyskaj bardziej oglny charakter. Bdziemy take zajmowa si moliwoci tworzenia wasnych niestandardowych funkcji oraz wyjanieniem
rnicy midzy funkcjami a procedurami skadowanymi. Podobnie jak widoki omwione
w rozdziale 13., procedury skadowane i funkcje niestandardowe s uytecznymi obiektami, ktre mona tworzy i przechowywa w bazie danych. Dziki temu tworzone przez
nas systemy zyskaj na funkcjonalnoci, a ich budowa bdzie bardziej przejrzysta.

R OZ DZ I A 16

P ROCEDURY
SKADOWANE
I PARAMETRYZACJA
NOWE SOWA KLUCZOWE: CREATE PROCEDURE, BEGIN, EXEC/CALL, ALTER
PROCEDURE, DROP PROCEDURE

Dotychczas wszystkie otrzymywane przez nas wyniki uzyskiwalimy przy wykorzystaniu pojedynczej instrukcji. Nawet te otrzymane przy zastosowaniu logiki zbiorw
omwionej w poprzednim rozdziale powstay w wyniku poczenia wielu instrukcji
SELECT w jedn. Teraz zajmiemy si omwieniem nowego scenariusza, w ktrym wiele
instrukcji moe zosta zapisanych w jednym obiekcie, okrelanym mianem procedury
skadowanej (ang. stored procedure).
Oglnie mwic, istniej dwa powody, dla ktrych warto korzysta z procedur skadowanych:
moliwo zapisywania kilku instrukcji SQL w jednej procedurze,
wykorzystanie parametrw w poczeniu z instrukcjami SQL.
Procedury skadowane mog w rzeczywistoci skada si z pojedynczej instrukcji SQL
i nie zawiera adnych parametrw. Ich uyteczno dostrzec mona dopiero wwczas, gdy zawieraj wiele instrukcji bd parametrw.
Zagadnienie procedur skadowanych jest do skomplikowane. W tym rozdziale w zwizy sposb omwimy drugi z wyej wymienionych powodw ich zastosowania, a wic
wykorzystanie parametrw w procedurach skadowanych. Jest to temat bezporednio
powizany z kwesti wyboru najlepszego sposobu pobierania danych z bazy danych.
Jak si zaraz przekonamy, moliwo dodawania parametrw do instrukcji SELECT
okae si bardzo przydatna w ich codziennym uytkowaniu.
157

158

Rozdzia 16

Procedury skadowane i parametryzacja

Korzystanie z procedur skadowanych w celu zapisu wielu instrukcji jest poza zakresem tej ksiki. Zasadniczo, moliwo przechowywania w procedurze wielu instrukcji oznacza, e mamy moliwo tworzenia zoonej logiki i generowania wynikw
wszystkich zapyta naraz w jednej transakcji. Na przykad mogoby pojawi si wymaganie biznesowe mwice o tym, e zoone przez klienta zamwienie musi zosta
zweryfikowane przed jego zaakceptowaniem. Procedura sprawdzania mogaby obejmowa weryfikacj stanu zapasw w celu upewnienia si, e dane produkty s dostpne, zbadanie zdolnoci kredytowej klienta i wstpne oszacowanie, kiedy zamwione
produkty mog zosta wysane. Taka sytuacja wymagaaby zbudowania wielu instrukcji
SQL zawierajcych stosown logik w celu uzyskania odpowiednich wynikw w przypadku, gdy niektre warunki nie zostayby spenione odnonie danego zamwienia.
Taka logika byaby zawarta w pojedynczej procedurze skadowanej, na czym zyskaaby moduowo systemu. Dziki zamieszczeniu wszystkiego w jednej procedurze logika ta mogaby zosta wyegzekwowana z poziomu kadego programu wywoujcego
procedur, a jej wynik byby zawsze taki sam.

Tworzenie procedur skadowanych


Zanim przejdziemy do szczegw odnonie wykorzystania procedur skadowanych,
poznajmy najpierw sposoby ich tworzenia i utrzymywania. Na pocztku naley zaznaczy,
e skadnia procedur skadowanych rni si znacznie w zalenoci od bazy danych.
Oglny format, ktry posuy nam do tworzenia procedury skadowanej w Microsoft
SQL Server, ma nastpujc posta:
CREATE PROCEDURE NazwaProcedury
AS
DeklaracjeOpcjonalnychParametrw
BEGIN
InstrukcjeSQL
END

Dziki sowu kluczowemu CREATE PROCEDURE procedura tworzona jest za pomoc jednego polecenia. Sama procedura moe zawiera dowoln liczb instrukcji SQL, a take
deklaracje parametrw. O skadni zwizanej z deklarowaniem parametrw porozmawiamy jednak pniej. Instrukcje SQL s natomiast wymienione midzy sowami kluczowymi BEGIN i END.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

Oglny format wykorzystywany do utworzenia procedury skadowanej w MySQL jest do skomplikowany:


DELIMITER $$
CREATE PROCEDURE NazwaProcedury ()
BEGIN

Tworzenie procedur skadowanych


InstrukcjeSQL
END$$
DELIMITER ;

MySQL wymaga podania ogranicznikw, gdy wykonywanych jest kilka instrukcji. Zazwyczaj takim ogranicznikiem jest rednik. Pierwsza linia w powyszym kodzie tymczasowo zmienia ogranicznik ze rednika na dwa znaki dolara. Wszelkie potrzebne parametry s okrelone w nawiasach w linii zawierajcej
klauzul CREATE PROCEDURE. Nastpnie kada instrukcja SQL wymieniona midzy sowami kluczowymi BEGIN i END musi by zakoczona rednikiem. Znaki dolara umieszczane s po sowie kluczowym END w celu pokazania, e polecenie CREATE PROCEDURE jest zakoczone. Wreszcie na kocu
umieszczone jest sowo DELIMITER, zmieniajce ogranicznik z powrotem na rednik.
Sposb tworzenia procedur skadowanych w Oracle jest troch bardziej skomplikowany i wykracza poza
zakres tej ksiki. Aby utworzy w Oracle procedur skadowan dla instrukcji SELECT, trzeba najpierw
utworzy obiekt typu pakiet. Pakiet bdzie wwczas zawiera dwa podstawowe skadniki: specyfikacj
i tre. Skadnik specyfikacja okrela, w jaki sposb odbdzie si komunikacja ze skadnikiem tre.
Skadnik tre zawiera instrukcje SQL, ktre s gwnym elementem procedury skadowanej.
Poniej pokazano na przykadzie, w jaki sposb utworzy procedur skadowan, ktra moe zosta uyta do wykonania pojedynczej instrukcji SELECT:
SELECT *
FROM Klienci

Procedura bdzie nosi nazw Procedura_1. W Microsoft SQL Server instrukcja, za


pomoc ktrej zostanie utworzona, ma nastpujc posta:
CREATE PROCEDURE Procedura_1
AS
BEGIN
SELECT *
FROM Klienci
END

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL

W MySQL instrukcja zaprezentowana powyej miaaby posta:


DELIMITER $$
CREATE PROCEDURE Procedura_1 ()
BEGIN
SELECT *
FROM Klienci;
END$$
DELIMITER ;

Pamitaj, e samo utworzenie procedury skadowanej nie skutkuje jej wykonaniem.


Tworzona jest jedynie procedura, po to, aby moga zosta pniej wykonana. Procedura bdzie widoczna w narzdziu zarzdzania baz danych obok tabel i widokw.
Dziki temu moliwe bdzie obejrzenie tego, co zawiera.

159

160

Rozdzia 16

Procedury skadowane i parametryzacja

Parametry w procedurze skadowanej


Wszystkie instrukcje SELECT, ktre do tej pory prezentowalimy, byy w pewien sposb charakterystyczne ze wzgldu na to, e byy tworzone w celu pobrania danych
w konkretny sposb. Dziki moliwoci dodawania parametrw do instrukcji SELECT
zyskuje ona znacznie na elastycznoci.
Termin parametr (ang. parameter) w instrukcjach SQL ma podobne znaczenie, co
zmienna (ang. variable) stosowana w innych jzykach programowania. Parametr to po
prostu warto przekazywana do instrukcji SQL przez program wywoujcy. Moe
przyjmowa dowoln warto okrelon przez uytkownika w momencie wywoania.
Zacznijmy od prostego przykadu. Mamy instrukcj SELECT, ktra pobiera dane z tabeli Klienci. Zamiast wybiera wszystkich klientw, chcielibymy za pomoc instrukcji wybra dane tylko jednego klienta o okrelonym IDKlienta. Nie chcemy jednak
poda tego numeru bezporednio w instrukcji SELECT, poniewa nasz intencj jest, by
instrukcja ta bya na tyle oglna, aby moliwe byo podanie jakiegokolwiek IDKlienta,
a nastpnie wykonanie jej z uwzgldnieniem tej wartoci. Instrukcja SELECT niezawierajca adnych parametrw to:
SELECT *
FROM Klienci

Naszym celem jest dodanie do niej klauzuli WHERE, ktra pozwoli nam wybra dane dla
konkretnego klienta. Chcemy wic, aby w oglnej formie instrukcja SELECT miaa posta:
SELECT *
FROM Klienci
WHERE IDKlienta = WartoParametru

W Microsoft SQL Server tego rodzaju procedur skadowan mona utworzy za pomoc poniszej instrukcji:
CREATE PROCEDURE ProceduraKlient
(@KlientID INT)
AS
BEGIN
SELECT *
FROM Klienci
WHERE IDKlienta = @KlientID
END

Zwr uwag na dodany do znanej nam ju instrukcji drugi wiersz, w ktrym zdefiniowano w procedurze parametr KlientID. W Microsoft SQL Server symbol @ jest uywany do okrelenia parametru. Sowo kluczowe INT, oznaczajce, e parametr przyjmuje
wartoci cakowite, jest umieszczane po nim. Nazwa parametru jest ponownie wykorzystana w klauzuli WHERE.

Wykonywanie procedur skadowanych

R N I CE W R AM A CH IN NY CH B A Z DA NY C H : M y SQL

W MySQL polecenie, za pomoc ktrego mona utworzy procedur skadowan analogiczn do powyszej, ma posta:
DELIMITER $$
CREATE PROCEDURE ProceduraKlient
(KlientID INT)
BEGIN
SELECT *
FROM Klienci
WHERE IDKlienta = KlientID;
END$$
DELIMITER ;

Zauwa, e w MySQL nie jest konieczne uycie symbolu @ w celu oznaczenia parametru.
Gdy procedura skadowana jest wykonywana, program wywoujcy przekazuje warto parametru, a wwczas instrukcja SQL jest wykonywana z uwzgldnieniem tej
wartoci, jakby bya czci instrukcji.
Naley rwnie zaznaczy, e omwione wczeniej parametry s parametrami wejciowymi. Jako takie, zawieraj one wartoci, ktre s przekazywane do procedury
skadowanej. Procedury te mog rwnie zawiera parametry wyjciowe, ktre z kolei
mog zawiera wartoci przekazywane z powrotem do programu wywoujcego. Sposoby definiowana parametrw wejciowych i wyjciowych w procedurach skadowanych wykraczaj poza zakres tej ksiki.

Wykonywanie procedur skadowanych


W jaki sposb utworzone procedury s nastpnie wykonywane? Skadnia, ktra jest w tym
celu wykorzystywana, rni si w zalenoci od bazy danych. W Microsoft SQL Server
w celu uruchomienia procedur skadowanych wykorzystywane jest sowo kluczowe EXEC.
W Microsoft SQL Server zdefiniowan powyej procedur o nazwie Procedura_1
mona wykona za pomoc nastpujcej instrukcji:
EXEC Procedura_1

Wskutek wykonania powyszej instrukcji otrzymujemy wyniki instrukcji SELECT zawartej w procedurze przechowywanej.
W procedurze o nazwie Procedura_1 nie zostay zdefiniowane adne parametry, wic jej
skadnia jest prosta. Jak jednak wykona procedury zawierajce parametry wejciowe?
Za pomoc poniszej instrukcji wykonana zostanie procedura o nazwie ProceduraKlient,
w ktrej parametr KlientID przyjmuje warto rwn 2.
EXEC ProceduraKlient
@KlientID = 2

161

162

Rozdzia 16

Procedury skadowane i parametryzacja

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL

W MySQL zamiast sowa EXEC do wykonania procedury skadowanej wykorzystywane jest sowo kluczowe
CALL, a skadnia stosowana w przypadku procedur skadowanych zawierajcych parametry jest nieco
inna. W MySQL odpowiednikami dwch powyszych instrukcji zawierajcych sowo EXEC s instrukcje:
CALL Procedura_1;
CALL ProceduraKlient (2);

Modyfikowanie i usuwanie procedur skadowanych


Po utworzeniu procedury skadowanej moemy j zmodyfikowa. Tak jak sowo kluczowe ALTER VIEW suyo do modyfikacji widokw, sowo ALTER PROCEDURE wykorzystywane jest do dokonywania zmian w procedurach skadowanych. Skadnia instrukcji,
ktra to realizuje, jest taka sama jak w przypadku skadni polecenia CREATE PROCEDURE,
z t rnic, e sowo CREATE zastpowane jest przez sowo ALTER. Ponadto, skadnia
instrukcji ALTER PROCEDURE, tak jak w przypadku skadni CREATE PROCEDURE, rni si
w zalenoci od bazy danych.
Widzielimy ju przykad tworzenia procedury skadowanej w Microsoft SQL Server:
CREATE PROCEDURE ProceduraKlient
(@KlientID INT)
AS
BEGIN
SELECT *
FROM Klienci
WHERE IDKlienta = @KlientID
END

Po utworzeniu powyszej procedury, w celu wybrania tylko pierwszych piciu wierszy


z tabeli Klienci moemy dokona jej modyfikacji w nastpujcy sposb:
ALTER PROCEDURE ProceduraKlient
(@KlientID INT)
AS
BEGIN
SELECT
TOP 5 *
FROM Klienci
WHERE IDKlienta = @KlientID
END

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL

W MySQL mamy do dyspozycji polecenie ALTER PROCEDURE, jednake jego funkcjonalno jest
ograniczona. Aby zmieni w MySQL zawarto procedury skadowanej, trzeba wykona polecenie DROP
PROCEDURE, a nastpnie CREATE PROCEDURE, w ktrym znajdzie si nowa definicja procedury.

Funkcje cig dalszy

Usuwanie procedury skadowanej jest jeszcze prostsze. Tak jak w przypadku widokw
do ich usunicia wykorzystywane jest polecenie DROP VIEW, w przypadku procedury wystarczy uy instrukcji DROP PROCEDURE.
Procedur o nazwie ProceduraKlient moemy usun w nastpujcy sposb:
DROP PROCEDURE ProceduraKlient

Funkcje cig dalszy


W rozdziale 4. omawialimy dostpne w SQL wbudowane funkcje skalarne. Przedstawilimy na przykad uycie funkcji znakowych, jak funkcja LEFT, oraz funkcji matematycznych, jak funkcja ROUND. Ponadto, w rozdziale 10. scharakteryzowane zostay
funkcje agregujce, takie jak funkcja MAX.
Oprcz funkcji wbudowanych wystpujcych w SQL programici mog tworzy wasne
funkcje i zapisywa je w bazie danych. Postpowanie w przypadku tworzenia funkcji
jest bardzo podobne do tego, ktre jest stosowane do tworzenia procedur skadowanych. W SQL mamy dostpne sowa kluczowe CREATE FUNCTION, ALTER FUNCTION i DROP
FUNCTION, ktrych zastosowanie jest analogiczne do znanych nam ju sw CREATE
PROCEDURE, ALTER PROCEDURE oraz DROP PROCEDURE.
Ze wzgldu na fakt, e zagadnienie to naley do zaawansowanych, nie zaprezentujemy
przykadw zastosowania powyszych funkcjonalnoci. Powicimy jednak kilka poniszych akapitw na omwienie rnic midzy uyciem procedur skadowanych a wykorzystaniem funkcji.
Zarwno procedury skadowane, jak i funkcje mog by zapisywane w bazie danych
jako oddzielne obiekty, podobnie jak tabele i widoki. Sposoby postpowania w przypadku zapisywania i modyfikacji procedur skadowanych oraz funkcji s bardzo podobne.
Takie same polecenia jak wykorzystywane w przypadku procedur skadowanych, a wic
CREATE, ALTER i DROP, mog by stosowane w odniesieniu do funkcji.
Rnica pomidzy procedurami a funkcjami wynika ze sposobu ich wykorzystywania
oraz celu, w jakim mona je zastosowa. Wobec powyszego wymieni mona dwie
podstawowe rnice:
Procedury skadowane mog zawiera dowoln liczb parametrw wyjciowych.
Mog nie zawiera take adnych tego rodzaju parametrw. W przeciwiestwie do
procedur, funkcje zawsze musz zawiera dokadnie jeden parametr wyjciowy.
Innymi sowy, wskutek wywoania funkcji otrzymamy zawsze pojedyncz warto.
Procedury skadowane s wykonywane przez program wywoujcy. W instrukcji
SELECT nie moe istnie bezporednie odwoanie do procedury skadowanej. Jeli
natomiast mowa o funkcjach, odniesienia do nich mog istnie w instrukcjach, jak
pokazano w rozdziale 4. i 10. Po zdefiniowaniu wasnej funkcji moemy odwoywa si do niej za porednictwem jej nazwy okrelonej podczas jej tworzenia.

163

164

Rozdzia 16

Procedury skadowane i parametryzacja

Co dalej?
Po zapoznaniu si z treci tego rozdziau zaobserwowalimy, e dziki zastosowaniu
parametrw proces pobierania danych z bazy danych moe sta si duo bardziej elastyczny. Na przykad parametry umoliwiaj zapisanie instrukcji SQL w oglnej postaci,
dziki czemu wartoci kryteriw selekcji mog zosta okrelone dopiero podczas wykonywana instrukcji. Poznalimy rwnie podstawy tworzenia i modyfikowania procedur skadowanych. Wreszcie, objanione zostay niektre rnice midzy procedurami skadowanymi a zdefiniowanymi przez uytkownika funkcjami.
Pomimo e przykady zaprezentowane w niniejszym rozdziale dotyczyy wykorzystania procedur skadowanych i funkcji w celu pobierania danych z bazy danych, s one
rwnie bardzo przydatne w dokonywaniu aktualizacji danych. W nastpnym rozdziale, zatytuowanym Modyfikowanie danych, zajmiemy si wobec tego zagadnieniem
odbiegajcym od tematu pobierania danych, a mianowicie omwimy kwestie wynikajce z potrzeby ich aktualizacji. Chocia w kontekcie utrzymania danych na prno
moemy szuka moliwoci dokonywania analiz, to jest ono istotn kwesti z punktu
widzenia kadego przedsibiorstwa. Na szczcie, wikszo technik stosowanych
w odniesieniu do instrukcji SELECT, ktre ju poznalimy, stosuje si rwnie w przypadku sposobw dokonywania modyfikacji danych, ktre zostan omwione w nastpnym rozdziale.

R OZ DZ I A 17

M ODYFIKOWANIE
DANYCH
NOWE SOWA KLUCZOWE: INSERT INTO, VALUES, DELETE,
TRUNCATE TABLE, UPDATE

Po wyczerpaniu zagadnienia pobierania danych z bazy danych pora przej do tematu


modyfikacji danych. Istniej trzy podstawowe sposoby modyfikacji danych, na ktre
wskazuj ponisze scenariusze:
wstawianie nowych wierszy do tabeli,
usuwanie wierszy z tabeli,
aktualizacja istniejcych danych w okrelonych wierszach lub kolumnach w tabeli.
Jak mona przypuszcza, wstawianie i usuwanie wierszy jest stosunkowo proste, natomiast dokonywanie zmiany istniejcych danych jest nieco bardziej skomplikowane.
Zaczniemy zatem od omwienia funkcji zwizanych z wstawianiem i usuwaniem wierszy,
a zagadnieniem aktualizacji zajmiemy si na kocu.

Sposoby modyfikacji danych


Sam sposb dokonywania modyfikacji danych jest do prosty, jednak jego forma
moe nie ze sob pewne ryzyko popenienia bdu. Czasami moe si zdarzy, e za
pomoc jednego polecenia niepotrzebnie zostan usunite tysice wierszy. W wyniku
bdnego zapisu instrukcji modyfikujcej dane mog rwnie zosta dokonane liczne
ich aktualizacje. Cofnicie takich zmian moe za okaza si trudne.
W praktyce istnieje wiele sposobw, dziki ktrym moemy unikn tego typu pomyek, ktrych skutki mog by katastrofalne. Na przykad, gdy chcemy usun wiersze z tabeli, moemy w tym celu zastosowa technik mikkiego usuwania, co oznacza,
165

166

Rozdzia 17

Modyfikowanie danych

e zamiast faktycznego usunicia wierszy w tabeli moemy zamieci specjaln kolumn, w ktrej w przypadku kadego wiersza znajdzie si informacja, czy jest on aktywny czy nieaktywny. Zatem zamiast usuwa wiersze, oznaczamy je tylko jako nieaktywne. W ten sposb, jeli dany wiersz zosta niepotrzebnie usunity, mona go
atwo przywrci, zmieniajc jedynie warto w tej kolumnie.
Podobn technik moemy zastosowa w odniesieniu do wstawiania wierszy. Wwczas
w specjalnej kolumnie moemy umieszcza dokadn dat i godzin dodania wiersza.
Jeli okae si, e dany wiersz nie powinien zosta dodany, mona znale wszystkie
wiersze dodane w okrelonym przedziale czasu i je usun.
Problem staje si bardziej zoony, gdy chodzi o aktualizacj danych. Oglnie rzecz biorc,
powinno si utrzymywa osobn tabel zawierajc informacje o planowanych aktualizacjach. Jeli popeniany jest jakikolwiek bd, mona wwczas odnie si do takiej
tabeli, aby zweryfikowa, jakie byy wartoci danych sprzed aktualizacji oraz jak si
zmieniy w jej wyniku, i wykorzysta te informacje do cofnicia zmian.
Wyej wymienione podejcia stanowi tylko kilka z wielu moliwych rozwiza. Jest
to jednak temat, ktry wykracza daleko poza zakres tej ksiki. Pamitaj jedynie, aby
zawsze zachowa du ostrono podczas aktualizacji danych. W przeciwiestwie do
wielu aplikacji przyjaznych dla uytkownika, w SQL nie ma polecenia cofnij.

Wstawianie danych
Aby w SQL doda dane do tabeli, moemy skorzysta ze sowa kluczowego INSERT.
Mona tego dokona na dwa rne sposoby, poprzez:
dodanie okrelonych danych wyszeglnionych w instrukcji INSERT,
dodanie danych bdcych wynikiem instrukcji SELECT.
Zacznijmy od przykadu, w ktrym pokazano, jak wstawia dane do tabeli w przypadku, gdy wstawiane wartoci s okrelone w instrukcji INSERT. Zamy, e mamy tabel Klienci, ktra zawiera ju nastpujce dane:
IDKlienta

Imi

Nazwisko

Wojewdztwo

Jan

Kowalski

pomorskie

Piotr

Nowak

mazowieckie

Barbara

Kwiatkowska

wielkopolskie

Zamy rwnie, e pierwsza kolumna w tabeli, IDKlienta, jest kluczem gwnym.


Wracajc do tego, o czym mwilimy w rozdziale 1. i 2., klucze gwne umoliwiaj
realizacj wymagania odnonie jednoznacznej identyfikacji kadego wiersza w tabeli.
Wspomnielimy rwnie, e czsto bywa tak, e kolumny bdce kluczem gwnym
zawieraj wartoci przyrastajce automatycznie. Oznacza to, e kademu wierszowi
dodawanemu do tabeli automatycznie przypisywany jest nastpny w kolejnoci numer.

Wstawianie danych

To, e kolumna IDKlienta zostaa zdefiniowana jako kolumna, w ktrej wartoci przyrastaj automatycznie, oznacza, e gdy dodamy wiersz do tabeli Klienci, nie bdziemy
okrela wartoci w kolumnie IDKlienta. Zostanie ona automatycznie okrelona, gdy
tylko wiersz zostanie dodany do tabeli. Musimy tylko poda wartoci, jakie maj znale si w pozostaych trzech kolumnach.
Sprbujmy zatem doda dwch nowych klientw do tabeli Klienci. Bd to: Wiktoria
Janas z wojewdztwa podlaskiego oraz Krzysztof Wodecki z wojewdztwa lubelskiego.
Wiersze z danymi wyej wymienionych klientw dodamy do tabeli za pomoc poniszej instrukcji:
INSERT INTO Klienci
(Imi, Nazwisko, Wojewdztwo)
VALUES
('Wiktoria', 'Janas', 'podlaskie'),
('Krzysztof', 'Wodecki', 'lubelskie')

Po dodaniu wierszy tabela Klienci zawiera nastpujce dane:


IDKlienta

Imi

Nazwisko

Wojewdztwo

Jan

Kowalski

pomorskie

Piotr

Nowak

mazowieckie

Barbara

Kwiatkowska

wielkopolskie

Wiktoria

Janas

podlaskie

Krzysztof

Wodecki

lubelskie

Przyjrzyjmy si teraz dokadniej naszej instrukcji. Po pierwsze, zauwa, e sowo kluczowe VALUES znajduje si przed list wartoci, ktre maj by umieszczone w tabeli. Kady z wierszy, ktry ma zosta wstawiony, zosta umieszczony w oddzielnym zestawie
nawiasw. Wiktoria Janas z wojewdztwa podlaskiego zostaa wstawiona w jednym zestawie nawiasw, za Krzysztof Wodecki w drugim. Oba zestawy nawiasw oddzielone zostay przecinkiem. Gdybymy chcieli doda tylko jeden wiersz, potrzebny byby
nam zestaw danych do wstawienia ujty w jeden zestaw nawiasw.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W Oracle nie jest moliwe umieszczenie po sowie kluczowym VALUES wartoci kilku wstawianych
wierszy. Powyszy przykad musiaby zatem zosta rozdzielony na dwie oddzielne instrukcje:
INSERT INTO Klienci
(Imi, Nazwisko, Wojewdztwo)
VALUES
('Wiktoria', 'Janas', 'podlaskie');
INSERT INTO Klienci
(Imi, Nazwisko, Wojewdztwo)
VALUES
('Krzysztof', 'Wodecki', 'lubelskie');

167

168

Rozdzia 17

Modyfikowanie danych

Zauwa rwnie, e kolejno wartoci po sowie kluczowym VALUES odpowiada kolejnoci kolumn wymienionych na licie_kolumn po sowie INSERT INTO. Kolejno, w jakiej
zostay wymienione kolumny, nie musi by taka sama, jak w tabeli znajdujcej si
w bazie danych. Innymi sowy, powysza instrukcja rwnie dobrze mogaby mie nastpujc posta:
INSERT INTO Klienci
(Wojewdztwo, Nazwisko, Imi)
VALUES
('podlaskie', 'Janas', 'Wiktoria'),
('lubelskie', 'Wodecki', 'Krzysztof')

W powyszej instrukcji INSERT kolumna Wojewdztwo zostaa wymieniona jako pierwsza,


a nie, jak poprzednio, jako ostatnia. Tak jak przed chwil powiedzielimy, kolejno,
w ktrej kolumny s wymieniane, nie ma znaczenia.
Podsumowujc, oglny format instrukcji INSERT INTO ma zatem posta:
INSERT INTO tabela
(lista_kolumn)
VALUES
(WartociWiersza1),
(WartociWiersza2)
(powtrz dowoln liczb razy)

Kolumny na licie_kolumn musz odpowiada wartociom zdefiniowanym w elemencie


WartociWiersza.
Ponadto, jeli wszystkie kolumny na licie_kolumn wymienione s w tej samej kolejnoci, w jakiej istniej fizycznie w bazie danych, oraz jeli w tabeli nie istniej kolumny
z automatycznym przyrostem wartoci, wwczas instrukcja INSERT INTO moe zosta
wykonana bez podawania listy_kolumn. Takie podejcie nie jest jednak zalecane ze wzgldu na wiksze prawdopodobiestwo popenienia bdu.
Co natomiast stanie si, gdy nie wszystkie kolumny zostan wyszczeglnione w instrukcji
INSERT? To proste. Do takich kolumn zostanie wstawiona warto NULL. Na przykad,
powiedzmy, e chcemy wstawi jeden dodatkowy wiersz do tabeli Klienci. Bdzie on
zawiera dane Tomasza Morawskiego. Nie wiemy jednak, z jakiego wojewdztwa klient
ten pochodzi. Instrukcja INSERT bdzie wygldaa tak jak poniej:
INSERT INTO Klienci
(Imi, Nazwisko)
VALUES
('Tomasz', 'Morawski')

Wiersz zawierajcy dane tego klienta bdzie mia w tabeli nastpujc posta:
IDKlienta

Imi

Nazwisko

Wojewdztwo

Tomasz

Morawski

NULL

Poniewa nie okrelilimy, jaka warto powinna znale si w kolumnie Wojewdztwo


w przypadku tego nowego wiersza, wstawiona zostaa warto NULL.

Wstawianie danych

Jak wspomnielimy na pocztku tego rozdziau, istniej dwa warianty instrukcji


INSERT INTO. Drugi format odnosi si do sytuacji, w ktrych wstawiane do tabeli dane s
wynikiem instrukcji SELECT. Oznacza to, e zamiast wymienia wartoci po sowie kluczowym VALUES, do uzyskania wartoci, ktre maj zosta wstawione do tabeli, wykorzystywana jest instrukcja SELECT.
Powiedzmy, e mamy do dyspozycji kolejn tabel, o nazwie TransakcjeKlientwa,
zawierajc dane, ktre chcielibymy wstawi do tabeli Klienci. Tabela Transakcje
Klientwa wyglda nastpujco:
IDKlienta

Wojewdztwo

Nazwa1

Nazwa2

lskie

Zuzanna

Hodys

dolnolskie

Micha

Bielecki

lskie

Andrzej

Cendrowski

Aby doda do tabeli Klienci dane wszystkich klientw z tabeli TransakcjeKlientwa


pochodzcych z wojewdztwa lskiego, naleaoby zastosowa ponisz instrukcj:
INSERT INTO Klienci
(Imi, Nazwisko, Wojewdztwo)
SELECT
Nazwa1,
Nazwa2,
Wojewdztwo
FROM TransakcjeKlientw
WHERE Wojewdztwo = 'lskie'

Po wykonaniu tej instrukcji INSERT tabela Klienci zawiera teraz nastpujce dane:
IDKlienta

Imi

Nazwisko

Wojewdztwo

Jan

Kowalski

pomorskie

Piotr

Nowak

mazowieckie

Barbara

Kwiatkowska

wielkopolskie

Wiktoria

Janas

podlaskie

Krzysztof

Wodecki

lubelskie

Tomasz

Morawski

NULL

Zuzanna

Hodys

lskie

Andrzej

Cendrowski

lskie

W powyszej instrukcji INSERT prezentowana wczeniej klauzula VALUE zostaa zastpiona


instrukcj SELECT. Jak mona si byo spodziewa, wiersz z danymi Michaa Bieleckiego
nie zosta dodany do tabeli Klienci, poniewa klient ten nie pochodzi z wojewdztwa lskiego. Zauwa rwnie, e nazwy kolumn w tabelach Klienci oraz TransakcjeKlientwa
nie s identyczne. Nazwy kolumn nie maj jednak znaczenia, dopki kolumny s wymieniane w prawidowej kolejnoci i odpowiadaj sobie w obu wspomnianych tabelach.

169

170

Rozdzia 17

Modyfikowanie danych

Usuwanie danych
Usuwanie danych jest o wiele prostsze ni ich dodawanie. Do usuwania danych suy
instrukcja DELETE. Gdy jest wykonywana, usuwane s cae wiersze, nie za poszczeglne kolumny w wierszu. Oglny format tej instrukcji jest nastpujcy:
DELETE
FROM tabela
WHERE warunek

Oto prosty przykad instrukcji usuwajcej dane. Powiedzmy, e ze wspomnianej powyej tabeli Klienci chcemy usun wiersze zawierajce dane klientw z wojewdztwa lskiego. Instrukcja, ktra nam do tego posuy, bdzie miaa posta:
DELETE
FROM Klienci
WHERE Wojewdztwo = 'lskie'

I to wszystko. Gdybymy przed wykonaniem powyszej instrukcji DELETE chcieli sprawdzi, jaki bdzie jej wynik, moemy po prostu zastpi j instrukcj SELECT, tak jak
pokazano poniej:
SELECT
COUNT (*)
FROM Klienci
WHERE Wojewdztwo = 'lskie'

Wynikiem tej instrukcji jest liczba wierszy, ktre maj by usunite, dziki czemu
wiemy zawczasu, ile wierszy zostanie usunitych z tabeli Klienci.
W tym miejscu warto wspomnie o jeszcze jednej moliwoci usuwania danych. Gdybymy chcieli usun wszystkie dane z okrelonej tabeli, moemy do tego celu wykorzysta instrukcj TRUNCATE TABLE. Jej zalet jest to, e jest wykonywana o wiele szybciej
ni instrukcja DELETE. Dzieje si tak, poniewa w przeciwiestwie do DELETE, polecenie
TRUNCATE TABLE nie rejestruje wynikw transakcji w dzienniku. Nie omawialimy jeszcze procesw zapisu do dziennika transakcji, ale jest to funkcja dostpna w przypadku
wikszoci baz danych. Dziki niej w przypadku awarii systemu i innych tego typu
problemw administratorzy mog odzyska baz danych.
Gdybymy wic chcieli usun wszystkie wiersze z tabeli Klienci, moemy wykorzysta nastpujc instrukcj:
TRUNCATE TABLE Klienci

Taki sam wynik uzyskamy, stosujc instrukcj:


DELETE
FROM Klienci

Midzy instrukcj DELETE a TRUNCATE TABLE istnieje jedna niewielka rnica polecenie TRUNCATE TABLE resetuje biece wartoci w kolumnie, w ktrej przyrastaj one
automatycznie. Instrukcja DELETE nie wpywa na wartoci tego rodzaju.

Aktualizacja danych

Aktualizacja danych
Procedura aktualizacji danych obejmuje wyszczeglnienie kolumn, ktre maj zosta
zaktualizowane, a take logik wyboru wierszy. Oglny format instrukcji UPDATE ma
nastpujc posta:
UPDATE tabela
SET Kolumna1 = Wyraenie1,
Kolumna2 = Wyraenie2
(powtrz dowoln liczb razy)
WHERE warunek

Powysza instrukcja przypomina podstawow instrukcj SELECT, poza sowem kluczowym SET, za pomoc ktrego okrelonym kolumnom przypisywane s nowe wartoci.
Warunek WHERE determinuje, ktre wiersze maj zosta zaktualizowane, natomiast instrukcja UPDATE moe dokona zmian w wielu kolumnach naraz. Jeli aktualizowana jest
wicej ni jedna kolumna, sowo kluczowe SET jest wymieniane tylko raz, ale wszystkie
wyraenia, za pomoc ktrych jest dokonywana zmiana w danych, musz by wwczas oddzielone od siebie przecinkiem.
Zaczynajc od prostego przykadu, powiedzmy, e chcemy zmieni nazw klienta
z Jan Kowalski na Bartomiej Kowalewski. Obecnie wiersz dla tego klienta w tabeli
Klienci zawiera nastpujce dane:
IDKlienta

Imi

Nazwisko

Wojewdztwo

Jan

Kowalski

pomorskie

Instrukcja UPDATE, za pomoc ktrej dokonamy zmiany nazwy tego klienta, ma posta:
UPDATE Klienci
SET Imi = 'Bartomiej',
Nazwisko = 'Kowalewski'
WHERE IDKlienta = 1

Po wykonaniu powyszej instrukcji zmieniony wiersz w tabeli Klienci zawiera nastpujce dane:
IDKlienta

Imi

Nazwisko

Wojewdztwo

Bartomiej

Kowalewski

pomorskie

Zauwa, e warto w kolumnie Wojewdztwo pozostaa bez zmian. Stao si tak dlatego, e ta kolumna nie zostaa wymieniona w instrukcji UPDATE. Klauzula WHERE take
jest tu istotna, gdy bez niej w kadym wierszu w tabeli, w kolumnie z imieniem i nazwiskiem klienta, znalazaby si warto Bartomiej Kowalewski.

171

172

Rozdzia 17

Modyfikowanie danych

Aktualizacja danych w tabeli


za pomoc podzapyta skorelowanych
Poprzedni przykad instrukcji UPDATE jest do prosty, jednak ma niewielki zwizek
z rzeczywistoci. Czciej instrukcja ta jest stosowana w sytuacjach, w ktrych dokonywana jest aktualizacja danych w jednej tabeli na podstawie danych z innej. Powiedzmy,
e mamy do dyspozycji nastpujc tabel Klienci:
IDKlienta

Wojewdztwo

KodPocztowy

pomorskie

77-131

lubelskie

21-515

mazowieckie

09-166

podkarpackie

36-221

dzkie

97-407

Tabela TransakcjeKlientw zawiera ostatnio dokonane zmiany w odniesieniu do dotychczasowych klientw:


IDTransakcji

IDKlienta

Wojewdztwo

KodPocztowy

pomorskie

77-121

kujawsko-pomorskie

87-705

dzkie

97-427

Tabela Klienci jest gwnym rdem danych o kliencie. Aby dokona jej aktualizacji
na podstawie tabeli TransakcjeKlientw, zastosujemy technik tworzenia podzapyta
skorelowanych, omwion w rozdziale 14. Uycie tej techniki jest konieczne, poniewa za
pomoc instrukcji UPDATE moe zosta zaktualizowana tylko pojedyncza tabela. Nie
jest moliwe poczenie kilku tabel i dokonanie w nich zmian. Wobec tego, aby w takim
przypadku wskaza rdo pochodzenia danych, bdziemy musieli uy podzapytania
skorelowanego, ktre zostanie umieszczone po sowie kluczowym SET.
Aktualizacji wartoci w kolumnach Wojewdztwo i KodPocztowy w tabeli Klienci na
podstawie transakcji z tabeli TransakcjeKlientw mona dokona przy wykorzystaniu
zaprezentowanej poniej instrukcji. Poniewa jest ona do skomplikowana, zostaa
podzielona na cztery sekcje odseparowane od siebie pustymi liniami, co uatwi rwnie ich omwienie:
UPDATE Klienci
SET Klienci.Wojewdztwo =
(SELECT TransakcjeKlientw.Wojewdztwo
FROM TransakcjeKlientw
WHERE TransakcjeKlientw.IDKlienta = Klienci.IDKlienta),
Klienci.KodPocztowy =
(SELECT TransakcjeKlientw.KodPocztowy
FROM TransakcjeKlientw
WHERE TransakcjeKlientw.IDKlienta = Klienci.IDKlienta)

Aktualizacja danych w tabeli za pomoc podzapyta skorelowanych


WHERE EXISTS
(SELECT *
FROM TransakcjeKlientw
WHERE TransakcjeKlientw.IDKlienta = Klienci.IDKlienta)

Po wykonaniu instrukcji UPDATE tabela Klienci zawiera nastpujce dane:


IDKlienta

Wojewdztwo

KodPocztowy

pomorskie

77-121

lubelskie

21-515

mazowieckie

09-166

podkarpackie

36-221

dzkie

97-427

Dokonajmy teraz szczegowej analizy powyszej instrukcji UPDATE. Pierwsza cz instrukcji, a wic jej pierwsza linia, wskazuje, e zaktualizowana zostanie tabela Klienci.
Druga cz instrukcji precyzuje, w jaki sposb zostan dokonane zmiany w kolumnie
Wojewdztwo. Aktualizacja ta jest oparta na wyniku podzapytania skorelowanego:
SELECT TransakcjeKlientw.Wojewdztwo
FROM TransakcjeKlientw
WHERE TransakcjeKlientw.IDKlienta =
Klienci.IDKlienta

O tym, e jest to podzapytanie skorelowane, wiadczy fakt, e prba wykonania go


w takiej postaci jak powyej zakoczyaby si bdem. Podzapytanie pobiera dane z tabeli
TransakcjeKlientw i dokonuje ich powizania z danymi w tabeli Klienci za porednictwem kolumny IDKlienta.
Trzecia cz instrukcji jest taka sama jak druga, z tym jednak wyjtkiem, e zmiany,
ktre specyfikuje, dotycz kolumny KodPocztowy. Zauwa rwnie, e sowo kluczowe
SET wystarczyo zastosowa tylko raz, w drugiej czci instrukcji. W trzeciej sekcji nie
jest ju konieczne jego zastosowanie.
W ostatniej czci w klauzuli WHERE zastosowano logik wyboru danych dla caej instrukcji
UPDATE. Operator EXISTS zosta uyty wraz z innym podzapytaniem skorelowanym
w celu ustalenia, czy w tabeli TransakcjeKlientw istniej wiersze odpowiadajce
IDKlienta z tabeli Klienci. Bez wspomnianej klauzuli WHERE instrukcja UPDATE niepoprawnie zmieniaby wartoci w kolumnach Wojewdztwo i KodPocztowy na NULL w przypadku
klientw z IDKlienta rwnym 3 i 4. Staoby si tak dlatego, e dla tych klientw nie
istniej wiersze w tabeli TransakcjeKlientw. Dziki podzapytaniu skorelowanemu
zamieszczonemu w klauzuli WHERE aktualizacja rekordw ma zastosowanie tylko do
klientw, dla ktrych de facto istniej dane w tabeli TransakcjeKlientw.
Jak wida, zagadnienie zastosowania podzapyta skorelowanych jest do skomplikowane
i jako takie zasadniczo wykracza poza zakres tej ksiki. Zdecydowalimy si jednak omwi powyszy przykad, aby uzmysowi Ci zoono niektrych tematw zwizanych

173

174

Rozdzia 17

Modyfikowanie danych

z aktualizacj danych. Naley rwnie mie na uwadze fakt, e podzapytania skorelowane mona rwnie z powodzeniem stosowa w instrukcjach usuwajcych dane.

Co dalej?
W tym rozdziale przedstawiono rne metody aktualizacji danych. Sposoby budowania prostych instrukcji dodajcych, usuwajcych lub zmieniajcych zawarto tabeli
mona uzna za stosunkowo proste, natomiast technika podzapyta skorelowanych
moe nastrcza pewnych trudnoci. Warto jednak j opanowa, gdy czsto okazuje
si niezbdna do dokonywania rzeczywistych aktualizacji lub usuwania danych. Ponadto, caa idea stosowania aktualizacji danych jest do wymagajca. Majc na uwadze moliwoci aktualizacji tysicy wierszy danych za pomoc jednego polecenia SQL,
przy zmienianiu jakichkolwiek danych trzeba by pomimo wszystko ostronym. Procedury cofania dokonanych zmian powinny by starannie zaplanowane, zanim zostan zastosowane jakiekolwiek modyfikacje istniejcych danych.
Teraz, gdy omwilimy ju zagadnienie modyfikacji danych w tabelach, przejdziemy
do analizy tabel jako obiektw. W nastpnym rozdziale, zatytuowanym Utrzymanie
tabel, przyjrzymy si sposobom ich tworzenia oraz wszystkim atrybutom niezbdnym do prawidowego przechowywania danych w tabelach. Bdziemy przy tym ponownie nawizywali do niektrych zagadnie poruszonych w rozdziale 1., takich jak
temat kluczy gwnych i obcych, poszerzajc jednoczenie nasz wiedz odnonie tej
problematyki. A do teraz zakadalimy bowiem, e tabele s po prostu dostpne do
naszego uytku. Po zapoznaniu si z kolejnym rozdziaem poznasz sposoby tworzenia
tabel przechowujcych wycznie okrelone przez Ciebie dane.

R OZ DZ I A 18

U TRZYMANIE
TABEL
NOWE SOWA KLUCZOWE: CREATE TABLE, DROP TABLE,
CREATE INDEX, DROP INDEX

W tym rozdziale odejdziemy od tematu pobierania danych oraz ich aktualizacji i skupimy
si na zagadnieniach zwizanych z projektowaniem. A do teraz zakadalimy, e nasze tabele po prostu istniej w bazie danych i mamy do nich dostp. W rzeczywistoci jednak najpierw trzeba te tabele utworzy, zanim bdzie moliwy dostp do przechowywanych w nich danych. Przejdmy wic teraz do kwestii tworzenia i utrzymywania tabel.
W poprzednich rozdziaach omwilimy kilka zagadnie, do ktrych teraz wrcimy,
a mianowicie kwestie kluczy gwnych i obcych. Teraz jednak zgbimy je w sposb bardziej szczegowy, a ponadto zaprezentujemy pokrewny im temat indeksowania tabel.

Jzyk definicji danych


W rozdziale 1. wspomnielimy, e istniej trzy gwne elementy jzyka SQL: DML (jzyk
manipulowania danymi; ang. Data Manipulation Language), DDL (jzyk definicji danych;
ang. Data Definition Language) oraz DCL (jzyk kontroli danych; ang. Data Control
Language). Do tej pory najwicej miejsca powicilimy na omwienie polece DML,
dziki ktrym moemy dokonywa operacji na danych znajdujcych si w relacyjnych
bazach danych, a mianowicie ich pobierania, wstawiania, usuwania lub aktualizacji.
Operacji tych dokonywalimy za pomoc instrukcji SELECT, INSERT, DELETE i UPDATE.
Chocia skupilimy si gwnie na omwieniu polece DML, pojawio si te kilka
przypadkw uycia DDL (jzyka definicji danych; ang. Data Definition Language). Instrukcjami typu DDL s instrukcje CREATE VIEW i CREATE PROCEDURE, a take zwizane
z nimi polecenia ALTER i DROP.

175

176

Rozdzia 18

Utrzymanie tabel

Instrukcje CREATE VIEW i CREATE PROCEDURE nale do instrukcji DDL, poniewa pozwalaj jedynie na dokonywanie operacji na samej bazie danych, nie za na danych,
ktre zawiera.
W tym rozdziale omwimy jeszcze kilka innych instrukcji DDL, ktre mog by wykorzystywane do tworzenia i modyfikowania tabel oraz indeksw.
W kadej bazie danych obiekty s zorganizowane w rny sposb, a co za tym idzie, w jej
ramach dostpne s rne instrukcje DDL. Na przykad w bazie MySQL istnieje 11 rnych instrukcji CREATE, w zalenoci od typu obiektu: bazy danych, zdarzenia, funkcji, indeksu, grupy pliku logw, procedury, serwera, tabeli, przestrzeni tabel, wyzwalacza i widoku.
W Oracle wystpuje ponad 30 polece CREATE w odniesieniu do rodzaju obiektu w bazie danych, natomiast w Microsoft SQL Server jest ich ponad 40.
Tak naprawd wikszoci zmian w obiektach znajdujcych si w bazie danych, takich
jak tabele czy widoki, mona dokona za porednictwem wizualnego edytora GUI (graficznego interfejsu uytkownika; ang. Graphical User Interface), ktry jest dostarczany
przez kadego producenta oprogramowania, aby uytkownik mg nim zarzdza. Czsto
wic znajomo DDL nie jest nawet konieczna, jako e wszelkie operacje zwizane z zarzdzaniem baz danych mona wykona wanie za pomoc oprogramowania GUI.
Podsumowujc, dobrze jest zdawa sobie przynajmniej spraw z istnienia kilku kluczowych instrukcji sucych do dokonywania operacji na obiektach bazy danych. Poznalimy ju kilka z nich, wykorzystywanych do modyfikacji widokw i procedur skadowanych. W tym rozdziale pokaemy kilka moliwoci dokonywania modyfikacji tabel
i indeksw za pomoc DDL.

Atrybuty tabel
W rozdziale 1. pokrtce omwilimy kilka atrybutw tabel bazodanowych, takich jak klucze gwne, klucze obce oraz typy danych. W rozdziale 2. natomiast poszerzylimy to
zagadnienie o wiedz odnonie kolumn, w ktrych wartoci przyrastaj automatycznie.
Jak ju wspomniano, w ramach DDL w SQL znajduj si instrukcje CREATE odnoszce si
do wielu rnych typw obiektw bazy danych. W rozdziale 13. omwilimy w tym
zakresie zastosowanie instrukcji CREATE PROCEDURE i CREATE VIEW, za pomoc ktrych
mona utworzy odpowiednio procedur skadowan i widok.
Wrmy teraz do tabeli, ktr waciwie mona uzna za podstawowy i najbardziej istotny typ obiektu w bazie danych. Gdy nie ma tabel, nic innego nie ma waciwie znaczenia, jako e wszystkie dane znajdujce si w bazie danych s fizycznie przechowywane
wanie w tabelach. Wikszo innych typw obiektw odnosi si do tabel w taki czy inny
sposb. Dziki zastosowaniu widokw otrzymujemy wirtualny widok tabel, natomiast
procedury skadowane na og dziaaj na podstawie danych zawartych w tabelach.
Funkcje umoliwiaj wykonywanie szczeglnego rodzaju operacji na danych w tabelach.

Kolumny w tabelach

W tym rozdziale przestawimy inicjalny sposb tworzenia tabel. Z ich definicjami powizanych moe by wiele atrybutw. Poniej zaprezentujemy kilka istotniejszych
i omwimy ich znaczenie.
Temat atrybutw tabeli jest ponadto powizany z zagadnieniem o jeszcze szerszym zakresie, a mianowicie z projektowaniem baz danych, ktre zostanie omwione w nastpnym rozdziale. Na razie jednak skupmy si na sposobach wykorzystania samych tabel.
Sposoby projektowania i modyfikowania tabel w Microsoft SQL Server, MySQL i Oracle
rni si od siebie diametralnie. Przyjrzymy si zatem gwnie tym atrybutom, ktre
s wsplne dla tabel we wszystkich trzech bazach danych.

Kolumny w tabelach
Tabele mog zawiera dowoln liczb kolumn, a kada z nich ma wiele charakterystycznych dla siebie atrybutw. Pierwszym i najbardziej oczywistym jest nazwa kolumny. Kada kolumna musi mie nazw niepowtarzaln w ramach danej tabeli.
Drugi atrybut kolumn to typ danych, a wic zagadnienie omwione w rozdziale 1.,
w ktrym opisanych zostao kilka istotnych typw danych wystpujcych w ramach trzech
gwnych kategorii: numeryczne, znakowe oraz daty i czasu. Typ danych jest kluczowym
czynnikiem decydujcym o tym, jaki typ danych moe zawiera dana kolumna.
Trzeci atrybut kolumn wskazuje na to, czy dana kolumna zawiera wartoci przyrostowe czy nie. Pokrtce zosta on zaprezentowany w rozdziale 2. oraz w poprzednim rozdziale, przy okazji zgbiania tematu modyfikowania danych. Zasadniczo, kolumna,
w ktrej wartoci przyrastaj automatycznie, oznacza, e przy dodawaniu kadego
kolejnego wiersza uzupeniana jest w nim automatycznie i w kolejnoci rosncej warto liczbowa. Kolumny tego rodzaju s czsto oznaczane kluczami gwnymi, lecz
mog to by rwnie zwyke kolumny.
Pamitajmy jednak, e termin automatyczny przyrost (ang. auto-increment) jest stosowany w odniesieniu do MySQL. W Microsoft SQL Server wykorzystuje si pojcie kolumny identyfikujcej (ang. identity) w odniesieniu do tego samego rodzaju atrybutu.
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W Oracle nie istnieje atrybut automatycznego przyrostu. Zamiast tego w przypadku tej bazy danych konieczne jest zdefiniowanie kolumny jako sekwencji, a nastpnie utworzenie wyzwalacza w celu wypenienia kolumny wartociami sekwencji. Procedura ta wykracza jednak poza zakres tej ksiki.
Czwarty atrybut kolumny wskazuje na to, czy dopuszczalne s w niej wartoci NULL czy
nie. Domylnie w kolumnach dopuszczalne s wartoci NULL, jeli jednak nie chcemy,
aby w kolumnie znajdoway si takie wartoci, przy opisywaniu kolumny moemy zastosowa sowo kluczowe NOT NULL.

177

178

Rozdzia 18

Utrzymanie tabel

Ostatnim atrybutem kolumny, ktry tu wymienimy, jest atrybut wskazujcy na to, czy
w kolumnie zdefiniowana zostaa warto domylna. Jest to warto, ktra jest automatycznie wstawiana do kolumny, gdy w dodawanym wierszu nie zostaa podana adna
warto. Na przykad, jeli wikszo klientw pochodzi ze Stanw Zjednoczonych,
mgby chcie wstawia domyln warto USA do kolumny zawierajcej kod kraju.

Klucze gwne i indeksy


Wrmy do tematu kluczy gwnych, aby wyjani, w jaki sposb atrybut ten jest powizany z indeksami tabeli.
Indeks to struktura fizyczna, ktra moe zosta dodana do kadej kolumny w tabeli
bazy danych. Indeksy s stosowane w celu przyspieszenia pobierania danych, gdy dana kolumna jest elementem instrukcji SQL. Rzeczywiste dane w indeksie nie s widoczne,
a w zasadzie jest w nim zawarta struktura, ktra przechowuje informacje o porzdku
sortowania kolumny, co pozwala na szybsze pobieranie danych, gdy chcemy wybra
okrelone wartoci.
Jednym z minusw indeksowania kolumn jest to, e wymaga ono wicej miejsca na
dysku przeznaczonego na baz danych. Kolejnym negatywnym aspektem jest to, e
indeksy oglnie spowalniaj aktualizacj danych w kolumnie, do ktrej je zastosowano. Dzieje si tak dlatego, e za kadym razem, gdy wiersz jest dodawany lub modyfikowany, indeks musi ponownie obliczy prawidow kolejno sortowania dla wartoci w tej kolumnie.
Indeks moe zosta utworzony na jakiejkolwiek kolumnie, ale tylko jedna kolumna
moe by oznaczona jako klucz gwny. Gdy kolumna zostaa okrelona jako klucz
gwny, oznacza to dwie rzeczy: kolumna bdzie indeksowana i znajd si w niej tylko
unikalne wartoci.
Jak to opisano w rozdziale 1., dziki zastosowaniu kluczy gwnych uytkownik bazy
danych zyskuje dwie gwne korzyci: umoliwiaj one jednoznaczn identyfikacj pojedynczego wiersza w tabeli oraz poczenie tabel w prosty sposb. Teraz moemy do tej
listy doda jeszcze jedn zalet: dziki indeksowaniu klucza gwnego moliwe jest
szybsze pobieranie danych z wierszy w kolumnie zawierajcej indeks.
Gwnym powodem, dla ktrego powinnimy stosowa klucze gwne, jest zapewnienie
unikalnych wartoci we wszystkich wierszach w tabeli. Dziki nim mamy moliwo
zidentyfikowania pojedynczych wierszy w celu dokonania ich aktualizacji lub usunicia.
Klucz gwny moe take obejmowa wicej ni jedn kolumn, skadajc si z dwch
lub trzech kolumn. Jeeli klucz gwny zawiera wicej ni jedn kolumn, oznacza to
po prostu, e wszystkie kolumny cznie, ktre obejmuje, bd zawieray unikaln warto. Ten typ klucza gwnego okrelany jest zwykle jako zoony klucz gwny (ang.
composite primary key). Aby pokaza sposb uycia tego rodzaju klucza, posumy si

Klucze obce

przykadem opartym na tabeli Filmy. Powiedzmy, e chcielibymy, aby nasz klucz jednoznacznie identyfikowa kady film w tabeli. Zamiast wic uy jako klucza wartoci
cakowitej w kolumnie IDFilmu, chcemy, aby kluczem by tytuu filmu. Problem jednak polega na tym, e filmy, gdy powstaje ich nowsza wersja, maj ten sam tytu. Aby go
rozwiza, moemy uy dwch kolumn w celu utworzenia zoonego klucza gwnego, ktry jednoznacznie identyfikowaby dany film w tabeli. Do tego celu posuyaby
nam kolumna zawierajca tytu filmu oraz kolumna z rokiem jego produkcji.
Poniewa klucze gwne musz zawiera unikalne wartoci, nigdy nie mog zawiera
wartoci NULL. W kolumnie tego typu musi znale si jakakolwiek warto.
Na koniec nadmiemy, e klucze gwne czsto stosowane s w odniesieniu do kolumn
zawierajcych automatycznie przyrastajce wartoci. Dziki temu programici baz danych nie musz martwi si o przypisanie kolumnie unikalnych wartoci. Wymaganie
to jest realizowane przez automatyczny przyrost wartoci w kolumnie.

Klucze obce
W bazach danych SQL niektre kolumny s rwnie oznaczane jako klucze obce.
Klucz obcy stanowi po prostu odniesienie danej kolumny w tabeli do kolumny w innej tabeli. Obie te kolumny musz zosta okrelone, gdy klucz obcy jest definiowany. Kolumna
zawierajca tego rodzaju klucz znajduje si zazwyczaj w tabeli okrelanej jako tabela podrzdna (ang. child table). Kolumna, do ktrej si odnosimy za pomoc klucza obcego,
znajduje si natomiast w tabeli okrelanej mianem tabeli nadrzdnej (ang. parent table).
Na przykad, powiedzmy, e mamy tabel Klienci, w ktrej znajduje si kolumna
IDKlienta, bdca kluczem gwnym. Mamy rwnie do dyspozycji tabel Zamwienia,
zawierajc kolumn IDZamwienia w roli klucza gwnego, oraz kolumn IDKlienta.
Chcemy zatem, aby kolumna IDKlienta w tabeli Zamwienia zostaa oznaczona jako
klucz obcy, ktry odwouje si do kolumny IDKlienta w tabeli Klienci. W tym przypadku tabela Zamwienia jest tabel podrzdn, a tabela Klienci nadrzdn.
Gdy definiujemy klucze obce, moemy okreli, jakie dziaania maj zosta podjte
w przypadku dokonywania modyfikacji i usuwania wierszy z tabeli nadrzdnej. Mowa
tu o nastpujcych najczciej wystpujcych akcjach:
No Action (niepodejmowanie adnego dziaania),
Cascade (kaskada),
Set Null (wstawienie wartoci NULL).
Wrmy do naszego przykadu z tabel Klienci i Zamwienia. Zazwyczaj, gdy zdefiniujemy klucz obcy, w stosunku do tabeli nadrzdnej wybieramy dziaanie No Action. Jest
to domylna operacja, jeli adna inna nie zostaa okrelona. Jeli ustawimy, aby w przypadku prby dokonania modyfikacji kolumny IDKlienta w tabeli Zamwienia zostaa

179

180

Rozdzia 18

Utrzymanie tabel

wzita pod uwag opcja No Action, oznacza to, e dokonywane jest za kadym razem
sprawdzenie, czy taka prba jest podejmowana w stosunku do kolumny IDKlienta
w tabeli nadrzdnej. Jeli ma miejsce prba modyfikacji wartoci w kolumnie, ktrej
skutkiem byoby wskazanie kolumny z tabeli podrzdnej na nieistniejc ju warto
w tabeli nadrzdnej, nie dojdzie ona do skutku. Tak samo stanie si w przypadku okrelenia opcji No Action w odniesieniu do prby usunicia danych w kolumnie. Dziki temu
mamy gwarancj, e przy poczeniu obu tabel za pomoc kolumny IDKlienta wszystkie
wiersze w tabeli Zamwienia wskazuj prawidowo na istniejce wiersze w tabeli Klienci.
Drugim rodzajem dziaania w przypadku wystpienia kluczy obcych jest operacja
Cascade. W tym przypadku, gdy dokonywana jest zmiana wartoci w kolumnie nadrzdnej, a ma ona jednoczenie wpyw na wartoci w wierszach w tabeli podrzdnej,
wszystkie wiersze w tabeli podrzdnej zostan automatycznie zaktualizowane tak, aby
odzwierciedlay nowe wartoci w tabeli nadrzdnej. Analogicznie, gdy z tabeli nadrzdnej usunity zostanie wiersz, w przypadku gdy bdzie to miao wpyw na wartoci
w wierszach w tabeli podrzdnej, odpowiednie wiersze zostan z niej usunite.
Trzecim sposobem postpowania w przypadku zastosowania kluczy obcych jest opcja
Set Null. Dziki jej zastosowaniu gdy warto w tabeli nadrzdnej jest modyfikowana lub
z niej usuwana, a jednoczenie takie dziaanie wpywa na wiersze w tabeli podrzdnej,
w przypadku wszystkich wierszy z tabeli podrzdnej, ktrych ta operacja porednio dotyczy, kolumna z kluczem obcym zostanie automatycznie uzupeniona wartoci NULL.

Tworzenie tabel
Instrukcja CREATE TABLE jest wykorzystywana do tworzenia nowych tabel w bazie danych. Jej skadnia i waciwoci rni si jednak w zalenoci od bazy danych. Jej zastosowanie pokaemy zatem na prostym przykadzie, w ktrym utworzymy tabel o nastpujcych cechach:
Nazwa tabeli to MojaTabela.
Pierwsza kolumna w tabeli nowi nazw Kolumna_1 i jest ona kluczem gwnym.
Kolumna ta jest typu INT (zawiera liczby cakowite), ktre przyrastaj automatycznie.
Druga kolumna w tabeli nosi nazw Kolumna_2, a typ danych, ktre przechowuje,
to rwnie INT. W kolumnie tej nie s dopuszczalne wartoci NULL. Ponadto jest
ona kluczem obcym, z okrelon opcj No Action w odniesieniu do modyfikacji
i usuwania wierszy. Jest zczona z inn tabel, o nazwie PowizanaTabela, za porednictwem kolumny PierwszaKolumna.
Trzecia kolumna nosi nazw Kolumna_3 i jest typu VARCHAR o dugoci 25 znakw.
W tej kolumnie wartoci NULL s dopuszczalne.
Czwarta kolumna to Kolumna_4 o typie FLOAT, w ktrej mog wystpowa wartoci
NULL. Jej warto domylna to 10.

Tworzenie tabel

Oto instrukcja CREATE TABLE w Microsoft SQL Server, za pomoc ktrej utworzymy
tak zdefiniowan tabel:
CREATE TABLE MojaTabela
(Kolumna_1 INT IDENTITY (1,1) PRIMARY KEY NOT NULL,
Kolumna_2 INT NOT NULL
REFERENCES PowizanaTabela (PierwszaKolumna),
Kolumna_3 VARCHAR (25) NULL,
Kolumna_4 FLOAT NULL DEFAULT (10) )

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL i O racle

Powysza instrukcja CREATE TABLE w MySQL miaaby nastpujc posta:


CREATE TABLE MojaTabela
(Kolumna_1 INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
Kolumna_2 INT NOT NULL,
Kolumna_3 VARCHAR (25) NULL,
Kolumna_4 FLOAT NULL DEFAULT 10,
CONSTRAINT FOREIGN KEY (Kolumna_2)
REFERENCES TabelaPowizana (PierwszaKolumna) );

W Oracle jej skadnia byaby natomiast taka:


CREATE TABLE MojaTabela
(Kolumna_1 INT PRIMARY KEY NOT NULL,
Kolumna_2 INT NOT NULL,
Kolumna_3 VARCHAR2 (25) NULL,
Kolumna_4 FLOAT DEFAULT 10 NULL,
CONSTRAINT "KluczObcy" FOREIGN KEY (Kolumna_2)
REFERENCES TabelaPowizana (PierwszaKolumna) );

Tak jak wspomnielimy powyej, w Oracle nie moliwoci zdefiniowana kolumny automatycznego
przyrostu.
Po utworzeniu tabeli jej poszczeglne atrybuty moemy zmodyfikowa przy uyciu
instrukcji ALTER TABLE. Jednake, ze wzgldu na jej zoono i duy stopie zrnicowania w ramach innych baz danych, skadnia ALTER TABLE nie zostanie w tej ksice
omwiona.
Poniej znajduje si jeden przykad jej zastosowania, w ktrym pokazano, w jaki sposb z tabeli MojaTabela moemy usun kolumn o nazwie Kolumna_3:
ALTER TABLE MojaTabela
DROP COLUMN Kolumna_3

Skadnia instrukcji sucej do usunicia caej tabeli jest prosta. Aby usun tabel
MojaTabela, naley wykorzysta ponisz instrukcj:
DROP TABLE MojaTabela

181

182

Rozdzia 18

Utrzymanie tabel

Tworzenie indeksw
W SQL mamy do dyspozycji instrukcj CREATE INDEX, za pomoc ktrej po utworzeniu tabeli moemy stworzy indeks. Aby doda lub zmodyfikowa indeksy, moemy
rwnie uy instrukcji ALTER TABLE.
W celu dodania nowego indeksu na kolumnie Kolumna_4 w tabeli o nazwie MojaTabela
w przypadku Microsoft SQL Server naley zastosowa nastpujc skadni:
CREATE INDEX Indeks2
ON MojaTabela (Kolumna_4)

Powysza instrukcja tworzy indeks o nazwie Indeks2.


Aby usun indeks, wystarczy uy instrukcji DROP INDEX, tak jak pokazano poniej:
DROP INDEX Indeks2
ON MojaTabela

R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle

W Oracle odpowiednikiem powyszej instrukcji DROP INDEX jest instrukcja:


DROP INDEX Indeks2;

Co dalej?
Instrukcje SQL, dziki ktrym moliwe jest dodawanie i modyfikowanie tabel oraz indeksw, s zoone, ale zgbianie ich szczegw wydaje si stosunkowo mao istotne.
W oprogramowaniu do baz danych zazwyczaj s dostpne narzdzia graficzne umoliwiajce dokonanie zmiany struktury tabel bez koniecznoci budowania instrukcji
SQL. Natomiast istotne zagadnienia poruszane w tym rozdziale to znajomo rnych
atrybutw tabel oraz tego, w jaki sposb s ze sob powizane indeksy, klucze gwne
i klucze obce.
W kolejnym rozdziale, zatytuowanym Zasady projektowania baz danych, przejdziemy do zagadnienia o znacznie szerszym zakresie, a mianowicie do projektowania
baz danych. Podobnie jak w przypadku tabel, ktre zwykle s tworzone, zanim uzyskamy dostp do zawartych w nich danych, bazy danych zazwyczaj s projektowane,
zanim powstan tabele. Zatem w pewnym sensie nadal poruszamy si w odwrotnym
kierunku, omawiajc kolejno tematy, ktre zwykle s referowane przed podjciem jakichkolwiek prb pobierania danych z bazy danych. Specyficzny projekt stworzonej
przez Ciebie bazy danych jest oczywicie istotnym elementem stanowicym o Twojej
moliwoci pozyskiwania za pomoc SQL podanych wynikw. Jeli baza danych jest
le zaprojektowana, przy kadej kolejnej prbie pobrania danych bdziesz napotyka
trudnoci. Dlatego te zapoznanie si z podstawowymi informacjami odnonie zasad
projektowania baz danych zaprezentowanymi w nastpnym rozdziale zbliy Ci do
celu, ktrym ostatecznie jest budowa wysokiej jakoci rodowiska bazy danych.

R OZ DZ I A 19

Z ASADY
PROJEKTOWANIA
BAZ DANYCH

W pierwszym rozdziale powiedzielimy, e relacyjna baza danych to zbir danych


przechowywanych w dowolnej liczbie tabel. Ponadto zakada si, e tabele te s ze sob w jaki sposb powizane. W poprzednim rozdziale, dotyczcym utrzymania tabel,
jasno stwierdzilimy, e projektanci baz danych mog, jeli chc, przypisa kolumnom
klucze obce, aby mie pewno, e niektre relacje midzy tabelami s utrzymywane
we waciwy sposb.
Jednake, pomimo e dysponujemy ju wiedz odnonie kluczy gwnych i obcych,
wci jeszcze nie poruszylimy zasadniczej kwestii zwizanej z projektowaniem bazy
danych. Podstawowe pytania, na ktre odpowiemy w tym rozdziale, to:
W jaki sposb rozdzieli dane na poszczeglne tabele, ktre bd ze sob powizane?
Jakie elementy danych powinny si znale w kadej tabeli?
Gdy zdefiniujemy ju tabele i ich elementy danych, administrator bazy danych bdzie
mg wwczas przej do tworzenia kluczy obcych, indeksw, odpowiednich typw
danych itd.
Na powysze dwa pytania nigdy nie uzyskamy jednoznacznej odpowiedzi. Poza tym,
kada organizacja czy dziaalno gospodarcza ma unikatowy charakter i nie istnieje
te jedno ostateczne rozwizanie w przypadku kadej z nich. Wiele zaley od tego, jaki
jest podany przez dane przedsibiorstwo stopie elastycznoci projektu bazy danych. Innym oczywistym czynnikiem jest dostpno aktualnych danych. Projektowanie bazy danych niezalenie od ju istniejcych danych to w przypadku wikszoci
organizacji wci jeszcze dobro luksusowe.

183

Rozdzia 19

Zasady projektowania baz danych

Pomimo tych zastrzee z biegiem czasu doszo do usystematyzowania pewnych zasad projektowania baz danych, dziki ktrym moliwe stao si zbudowanie optymalnego projektu jej struktury. W tym miejscu naley zaznaczy, e za najbardziej wpywowego architekta relacyjnych baz danych uznaje si E. F. Codda, ktry w 1970 roku
opublikowa swj przeomowy artyku, zatytuowany A Relational Model of Data for
Large Shared Data Banks (Relacyjny model danych dla duych wspdzielonych bankw danych). Artyku ten stanowi podwaliny tego, co obecnie nazywamy modelem
relacyjnym, a take idei normalizacji.

Cele normalizacji
Termin normalizacja (ang. normalization) odnosi si do konkretnego procesu, ktry
umoliwia projektantom utworzenie odpowiednio zaprojektowanego zestawu tabel
i elementw danych na podstawie nieustrukturyzowanych danych.

MaksymalnaLicz
baPunktw

ZdobytePunkty

RodzajTestu

Nauczyciel

Asystent

Test z zaimkw Anna

2009-03-02

10

Test
wielokrotnego
wyboru

Nowak

Kowalski

Test z zaimkw Jan

2009-03-02

10

Test
Janas
wielokrotnego
wyboru

Borwka

Bryy
trjwymiarowe

2009-03-03

20

17

Test
Kapan
wielokrotnego
wyboru

NULL

Test
Karolina 2009-02-04
z j. chiskiego

50

45

Wypowied
pisemna

Chylew- Terlecki
ski

Test
Andrzej
z j. chiskiego

2009-03-04

50

38

Wypowied
pisemna

Chylew- Terlecki
ski

Test
z gramatyki

2009-03-05

100

88

Test
Nowak
wielokrotnego
wyboru,
Wypowied
pisemna

Ucze

DataTestu

Aby zrozumie, czym jest normalizacja, najprociej jest pokaza, czym nie jest. Zacznijmy zatem od zaprezentowania le zaprojektowanej tabeli, w ktrej wida wiele oczywistych problemw. Chodzi o ponisz tabel o nazwie Punktacja, w ktrej zebrano
informacje o wszystkich punktach otrzymanych przez uczniw za napisane testy. Kady
wiersz zawiera m.in. informacje o uczniu i punktach, jakie zdoby:

OpisTestu

184

Barbara

Karolina

Kowalski

Cele normalizacji

Na pocztek przedstawmy, jakie informacje znajduj si w kadej kolumnie w wyej


zaprezentowanej tabeli. Kolumny te to:
OpisTestu: Opis sprawdzianu, jaki pisali uczniowie.
Ucze: Imi ucznia, ktry napisa dany test.
DataTestu: Data napisania testu.
MaksymalnaLiczbaPunktw: Maksymalna liczba punktw, jak mona byo uzyska
za dan prac.
ZdobytePunkty: Liczba punktw zdobytych przez danego ucznia.
RodzajTestu: Rodzaj testu napisanego przez ucznia (czy bya to wypowied pisemna, test wielokrotnego wyboru, czy moe oba te rodzaje).
Nauczyciel: Nazwisko nauczyciela, ktry przeprowadza dany test.
Asystent: Nazwisko osoby, ktra pomagaa nauczycielowi podczas zaj.
Ponadto, zaoymy, e klucz gwny dla tej tabeli jest kluczem zoonym i skada si
z kolumn OpisTestu i Ucze. Kady wiersz w powyszej tabeli ma wic na celu przedstawienie informacji o uczniu oraz pracy przedoonej przez niego do oceny.
Omwmy teraz dwa oczywiste problemy, ktre mona zaobserwowa, analizujc dane
z powyszej tabeli. Po pierwsze, niektre dane s niepotrzebnie powielane. Na przykad za
test z zaimkw, ktry uczniowie pisali 2009-03-02, mona byo zdoby maksymalnie
10 punktw. Problem jednak polega na tym, e ta informacja musi by powtarzana
w kadym wierszu, ktry dotyczy tego wanie testu. Byoby lepiej, gdybymy po prostu mogli maksymaln liczb punktw za ten test zarejestrowa tylko raz.
Drugi problem polega na tym, e w ramach pojedynczych komrek powtarzane s dane.
Mamy wiersz, w ktrym w kolumnie RodzajTestu podano zarwno Test wielokrotnego
wyboru, jak i Wypowied pisemna. Stao si tak dlatego, e na tecie pojawiy si zarwno pytania wymagajce zaznaczenia co najmniej jednej poprawnej odpowiedzi, jak
i pytania opisowe. Powoduje to jednak trudnoci w korzystaniu z tak zaprezentowanych danych w bazie danych. Jak w tym przypadku wybra dane dotyczce wszystkich
testw zawierajcych wypowied pisemn?
Mwic bardziej oglnie, gwnym problemem w przypadku powyszej tabeli jest to,
e podjto tu prb umieszczenia wszystkich informacji w jednej tabeli. Powyszych
bdw uniknlibymy, gdyby zawarte w niej dane zostay rozbite na osobne encje, takie jak uczniowie, punktacja i nauczyciele, przy czym kada z encji reprezentowaaby osobn tabel. Wwczas, wykorzystujc SQL, moemy dokona zczenia tabel, by
mc nastpnie pobiera z nich potrzebne nam informacje.
Majc na uwadze powysz analiz, okrelmy teraz formalnie oczekiwania w stosunku
do procesu normalizacji. S to nastpujce dwa gwne cele:

185

186

Rozdzia 19

Zasady projektowania baz danych

Wyeliminowanie nadmiarowych danych. Powyszy przykad dobrze pokazuje


problem istnienia nadmiarowych danych. Dlaczego jednak jest to takie wane?
W czym dokadnie tkwi problem w przypadku pojawienia si tych samych danych
w wielu wierszach? Oprcz oczywistego powielania nakadw naszej pracy, jedna
z odpowiedzi na to pytanie jest taka, e redundancja danych zmniejsza ich elastyczno. Gdy dane s powtarzane, oznacza to, e wszelkie zmiany w odniesieniu
do poszczeglnych wartoci maj wpyw na wiele wierszy, zamiast tylko na jeden.
Wyeliminowanie anomalii wystpujcych w przypadku dodawania, usuwania
i aktualizacji danych. Problem nadmiarowych danych odnosi si take do drugiego celu normalizacji, ktrym jest wyeliminowanie anomalii wystpujcych w przypadku dodawania, usuwania i aktualizacji danych. Powiedzmy na przykad, e jedna z nauczycielek wychodzi za m i zmienia nazwisko. Chcemy wwczas, aby taka zmiana
zostaa odzwierciedlona w naszych danych. Konieczna jest zatem aktualizacja wszystkich wierszy, w ktrych pojawia si jej nazwisko. Poniewa w naszym przypadku wystpuje redundancja danych, konieczna jest aktualizacja wielu wierszy zamiast jednego.
W tym zakresie mowa rwnie o nieprawidowociach zwizanych z wstawianiem
i usuwaniem danych. Na przykad, powiedzmy, e zatrudnilimy nowego nauczyciela, ktry bdzie uczy muzyki, i chcielibymy odnotowa tak informacj w naszej
bazie danych. Jednake, poniewa nauczyciel nie przeprowadzi jeszcze adnych testw, nie mamy gdzie umieci o nim informacji, poniewa nie mamy w naszej bazie
tabeli zawierajcej dane o samych nauczycielach.
Analogicznie, zaobserwujemy rwnie anomali w przypadku, gdy bdziemy chcieli
usun wiersz. Spowoduje to jednak usunicie take innych zwizanych z nim informacji. Posugujc si przykadem, powiedzmy, e mamy baz danych dotyczc ksiek i chcemy usun wiersz zawierajcy informacje o ksice Nathaniela Hawthornea.
Gdyby istniaa tylko jedna taka ksika, wwczas z bazy danych usunity zostaby
nie tylko jeden wiersz, ale rwnie i informacja o tym, e istnieje taki autor jak
Nathaniel Hawthorne, ktry napisa rwnie inne ksiki, ktre by moe nabdziemy w przyszoci.

W jaki sposb dokonywa normalizacji danych


Od pewnego czasu pojawia si w tekcie niniejszej ksiki pojcie normalizacji (ang.
normalization). Nadszed wic czas na wyjanienie, co ten termin oznacza.
Termin normalizacja po raz pierwszy pojawi si w artykuach autorstwa E. F. Codda i odnosi si do szeregu zalecanych dziaa majcych na celu usunicie z projektu
bazy danych anomalii zwizanych z redundancj oraz wystpujcych w przypadku jej
aktualizacji. Etapy procesu normalizacji s powszechnie okrelane jako pierwsza posta
normalna (ang. first normal form), druga posta normalna (ang. second normal form)
oraz trzecia posta normalna (ang. third normal form) itd. Chocia niektrzy autorzy

W jaki sposb dokonywa normalizacji danych

opisuj podejmowane kroki a do szstej postaci normalnej (ang. sixth normal form),
powszechn praktyk jest omawianie kolejno tylko pierwszej, drugiej i trzeciej postaci
normalnej. Gdy dane s w trzeciej postaci normalnej, powszechnie uznaje si je za wystarczajco znormalizowane.
Nie zamierzamy tu jednak opisywa penego zestawu zasad i sposobw dokonywania
przeksztace danych do pierwszej, drugiej i trzeciej postaci normalnej. Proces ten jest
bardzo szczegowo opisany w licznych pozycjach ksikowych i artykuach, w ktrych prezentowane s sposoby dokonywania przeksztace danych najpierw do pierwszej, nastpnie do drugiej, a na koniec do trzeciej postaci normalnej.
Zamiast tego skupimy si na prezentacji zasad, dziki ktrym doprowadzimy nasze
dane do trzeciej postaci normalnej. W praktyce dowiadczony administrator bazy danych
moe dokona przejcia od nieuporzdkowanych danych do trzeciej postaci normalnej bez koniecznoci trzymania si szczegowych sposobw postpowania. Tak te
postpimy i my.
Trzy gwne zasady dokonywania normalizacji danych s nastpujce:
Wyeliminuj powtarzajce si dane. Ta zasada oznacza, e wielowartociowe atrybuty nie s dozwolone. Nawizujc do poprzedniego przykadu, nie moemy pozwoli
na to, aby warto taka jak Test wielokrotnego wyboru, Wypowied pisemna istniaa
w pojedynczej komrce danych. Istnienie wielu wartoci w pojedynczej komrce
skutkuje wystpowaniem oczywistych trudnoci w pobieraniu danych dla okrelonej przez nas wartoci.
Konsekwencj tej zasady jest to, e nie s dozwolone powtarzajce si kolumny.
W naszym przykadzie baza danych mogaby zosta zaprojektowana w taki sposb, e
zamiast pojedynczej kolumny o nazwie RodzajTestu mielibymy dwie oddzielne kolumny o nazwie RodzajTestu1 i RodzajTestu2. Dziki zastosowaniu takiego podejcia
moglibymy umieci warto Test wielokrotnego wyboru w kolumnie RodzajTestu1,
natomiast Wypowied pisemna w kolumnie RodzajTestu2. To nie byoby jednak dozwolone. Nie chcemy bowiem, aby w naszej bazie znalazy si powtarzajce si dane, niezalenie od tego, czy chodzi o wiele wartoci w jednej kolumnie czy wiele
kolumn zawierajcych podobne dane.
Usu czciowe zalenoci. Zasada ta odnosi si przede wszystkim do sytuacji, w ktrej klucz gwny dla tabeli jest zoony, a wic jest kluczem skadajcym si z wielu
kolumn. W myl tej reguy adna kolumna w tabeli nie moe by powizana tylko
z czci klucza gwnego.
Pokamy to na przykadzie. Jak wspomniano, klucz gwny w tabeli Punktacja jest
kluczem zoonym, skadajcym si z kolumny Ucze i OpisTestu. Problem pojawia si w przypadku takich kolumn, jak na przykad MaksymalnaLiczbaPunktw.
Kolumna ta jest tak naprawd atrybutem pisanego przez ucznia testu i nie ma nic
wsplnego z uczniami. Zgodnie z t zasad wszystkie kolumny, ktre nie wchodz

187

188

Rozdzia 19

Zasady projektowania baz danych

w skad klucza danej tabeli, odnosz si do caego klucza, a nie tylko do jego czci.
Mwic w skrcie, tego rodzaju czciowa zaleno wskazuje na to, e dane zawarte w tabeli odnosz si do wicej ni jednej encji.
Wyeliminuj przechodnie zalenoci. Zasada ta odnosi si do sytuacji, w ktrych
kolumna w tabeli nie odnosi si do klucza gwnego, ale do innej kolumny w tej samej
tabeli, niebdcej kluczem. W tym przykadzie kolumna Asystent jest tak naprawd atrybutem kolumny Nauczyciel. Fakt, e kolumna Asystent odnosi si do nauczyciela, a nie kolumny wchodzcej w skad klucza gwnego (OpisTestu lub
Ucze), wskazuje na to, e informacja ta nie powinna znale si w tej tabeli.
Tym sposobem poznalimy problemy wynikajce z niewaciwego projektu bazy danych
oraz reguy postpowania w celu ich rozwizania. Naley jednak zada sobie jeszcze
pytanie, w jaki sposb podejmowane s decyzje o dokonaniu odpowiednich zmian
w projekcie bazy danych. Odpowied brzmi: na podstawie dowiadczenia. Z reguy
nie istnieje bowiem jedno rozwizanie dla tego rodzaju problemw.
Majc na uwadze powysze stwierdzenie, poniej przedstawiamy jedno z rozwiza
problemu zego projektu bazy danych. W nowym projekcie na podstawie pierwotnej
tabeli utworzono kilka nowych tabel i wszystkie dane s ju w postaci znormalizowanej. Nowy projekt bazy danych przedstawiono na rysunku 19.1. Tabele przedstawiono
w postaci encji niezawierajcych adnych danych.

Rysunek 19.1. Projekt znormalizowany

Klucze gwne w kadej tabeli zostay zapisane pogrubion czcionk. Do tabel dodano
rwnie kilka kolumn zawierajcych automatycznie przyrastajce wartoci. S to kolumny bdce identyfikatorami, dziki ktrym moliwe byo zdefiniowanie relacji
midzy tabelami. Nazwy wszystkich pozostaych kolumn pozostay niezmienione.
Zwr uwag przede wszystkim na to, e wszystkie encje omwione w tym przykadzie
zostay podzielone na osobne tabele. I tak, tabela Uczniowie zawiera informacje o kadym z uczniw, a jedyny atrybut, ktry w niej wystpuje, to imi ucznia. Natomiast
w tabeli Punktacja znajduj si informacje o wszystkich zdobytych punktach. Wystpuje w niej zoony klucz gwny, skadajcy si z kolumny IDUcznia i IDTestu, poniewa kade uzyskane punkty s powizane z uczniem oraz z testem, ktrego dotycz.
W tabeli Testy znajduj si informacje o kadym napisanym tecie, takie jak data napisania testu, IDNauczyciela, opis danego testu oraz maksymalna liczba punktw, ktr mona byo za niego uzyska.

W jaki sposb dokonywa normalizacji danych

Tabela RodzajeTestw zawiera dane o rodzajach pisanych testw. Do tej tabeli dodawane s wiersze okrelajce rodzaj danego testu, a wic test wielokrotnego wyboru lub
wypowied pisemna. Odnonie jednego testu moe by te dodanych wiele wierszy
w przypadku, gdy odnosi si do niego wicej ni jeden rodzaj wykonywanego w ramach testu zadania, na przykad test wielokrotnego wyboru oraz wypowied pisemna.
W tabeli Nauczyciele znajduj si informacje o kadym nauczycielu oraz jego asystencie, jeli taki istnieje.
Poniej przedstawiono dane z pierwotnej tabeli Punktacja umieszczone w nowych tabelach:
Tabela Uczniowie:
IDUcznia

Ucze

Anna

Jan

Barbara

Karolina

Andrzej

Tabela Nauczyciele:
IDNauczyciela

Nauczyciel

Asystent

Nowak

Kowalski

Janas

Borwka

Kapan

NULL

Chylewski

Terlecki

Tabela Testy:
IDTestu

IDNauczyciela

OpisTestu

DataTestu

MaksymalnaLiczba
Punktw

Test z zaimkw

2009-03-02

10

Test z zaimkw

2009-03-02

10

Bryy trjwymiarowe

2009-03-03

20

Test z j. chiskiego

2009-03-04

50

Test z gramatyki

2009-03-05

100

Tabela RodzajeTestw:
IDTestu

RodzajTestu

Test wielokrotnego wyboru

Test wielokrotnego wyboru

Test wielokrotnego wyboru

Wypowied pisemna

Test wielokrotnego wyboru

Wypowied pisemna

189

190

Rozdzia 19

Zasady projektowania baz danych

Tabela Punktacja:
IDUcznia

IDTestu

ZdobytePunkty

17

45

38

88

Na pocztku moesz odnie wraenie, e raczej niepotrzebnie skomplikowalimy cay


projekt, zamiast go uproci. Na przykad tabela Punktacja zawiera teraz same liczby,
ktrych znaczenie na pierwszy rzut oka trudno okreli.
To prawda, jednak majc na wzgldzie moliwo czenia tabel w prosty sposb za pomoc SQL, dostrzec mona o wiele wiksz elastyczno nowego projektu naszej bazy
danych. Moemy teraz czy ze sob tylko tabele, z ktrych dane potrzebne s nam
do wykonania podanej analizy. Co wicej, moemy te znacznie atwiej dodawa do
nich nowe kolumny, bez wpywu na inne dane.
Informacje, ktrymi teraz dysponujemy, zyskay bardziej modularny charakter. Na przykad, gdybymy chcieli doda wicej informacji na temat kadego ucznia, takich jak adres
i numer telefonu, moemy po prostu doda nowe kolumny do tabeli Uczniowie. Ponadto,
gdybymy potem chcieli zmieni adres lub telefon wybranego ucznia, taka zmiana bdzie dotyczy tylko jednego wiersza w tabeli.

Sztuka projektowania bazy danych


W rzeczy samej projektowanie bazy danych to bardziej zoony proces, niepolegajcy
jedynie na zastosowaniu procedur normalizacyjnych. Projekt bazy danych ma tak naprawd wicej wsplnego ze sztuk ni z nauk, jako e wymaga umiejtnoci zadawania odpowiednich pyta i rozpatrywania istotnych kwestii biznesowych.
W naszym przykadzie dotyczcym punktacji przedstawilimy jeden z moliwych projektw bazy danych, ukazujcy, w jaki sposb dokonywana jest normalizacja danych.
W rzeczywistoci mamy do dyspozycji wiele moliwoci zaprojektowania bazy danych
tego rodzaju. Naley jednak mie na wzgldzie elastyczno naszego projektu oraz jego
warto informacyjn, odpowiadajc na ponisze pytania. Na przykad:
Czy istniej inne tabele, ktre musz zosta dodane do naszej bazy danych? Tak
tabel, bdc w naszym przypadku oczywistym wyborem, byaby tabela o nazwie
Przedmioty, umoliwiajca wybranie w prosty sposb testw wedug przedmiotw,
ktrych dotycz, takich jak jzyk angielski czy matematyka. Gdyby taka tabela istniaa,
czy utworzyby powizanie midzy ni a tabel Testy czy tabel Nauczyciele, zawierajc informacje o autorach testw?

Alternatywy dla normalizacji

Czy punktacja z jednego testu mogaby zosta uwzgldniona w odniesieniu do


wicej ni jednego przedmiotu? Mogo si przecie zdarzy, e nauczyciel jzyka
angielskiego i nauczyciel WOS poprowadzili wsplnie lekcj i chcieliby, aby wyniki
z okrelonych testw liczyy si w przypadku obu przedmiotw. Jak zaprojektowaby co takiego?
Co zrobi, jeli dziecko nie zaliczy testu i bdzie musiao go powtarza? Jak
w takim przypadku odrni poprzedni wynik testu od nowego?
Jak uwzgldni specjalne zasady wprowadzane przez nauczycieli, takie jak obnienie w pewnym okresie minimalnej liczby punktw, ktr ucze musiaby
uzyska, aby zaliczy dany test?
Czy istniej szczeglne wymogi dotyczce pniejszej analizy danych na podstawie zaprojektowanego modelu danych? Jeli dany przedmiot jest wykadany przez
wicej ni jednego nauczyciela, czy chcielibymy mie moliwo porwnania redniej
liczby punktw uzyskanych przez uczniw w odniesieniu do kadego z tych nauczycieli? Takie dziaanie pozwolioby nam upewni si, e aden z nich nie zawya
niesprawiedliwie wynikw swoich testw.
Lista moliwych pyta jest nieskoczona. Chodzi przede wszystkim o to, eby zda
sobie spraw, e dane nie s odizolowane od wiata zewntrznego. Midzy projektem bazy
a wymaganiami uytkownikw co do sposobu wykorzystywania danych musi istnie
zaleno. Bazy danych musz by projektowane tak, aby umoliwi podane przez
nas elastyczne ich wykorzystanie. Jednoczenie naley mie rwnie na uwadze potencjalne ryzyko nadmiernej szczegowoci modelu bazy danych, wskutek czego dane
w nich przechowywane stan si nieczytelne. Gorliwy administrator bazy danych mgby,
przykadowo, podj decyzj o utworzeniu 20 tabel, aby uwzgldni wszelkie moliwe
sposoby odniesienia do danych w modelu. Takie postpowanie rwnie nie jest wskazane. Projekt bazy danych polega w pewnym sensie na odnalezieniu rwnowagi pomidzy jego podan elastycznoci a zrozumia form interpretowan przez uytkownikw w intuicyjny sposb.

Alternatywy dla normalizacji


Powyej scharakteryzowalimy normalizacj jako nadrzdn zasad, ktra powinna
by stosowana w projektowaniu bazy danych. Jednake w niektrych sytuacjach by moe
warto skorzysta z innych moliwoci, ktre w pewnych przypadkach mog okaza si
lepszym wyborem.
Na przykad w odniesieniu do systemw i oprogramowania opartego na hurtowni danych wielu praktykw opowiada si za opracowywaniem projektu bazy danych w postaci schematu gwiazdy (ang. star schema), bez dokonywania normalizacji. W schemacie gwiazdy dobrze jest, aby miaa miejsce redundancja danych, jednake do pewnego
stopnia. Nacisk w tym przypadku jest pooony na tworzenie struktury danych, ktra

191

192

Rozdzia 19

Zasady projektowania baz danych

w bardziej intuicyjny sposb odzwierciedla realia biznesowe, a jednoczenie umoliwia


szybkie przetwarzanie danych za pomoc specjalnego oprogramowania analitycznego.
Nakrelajc pokrtce zagadnienia zwizane z projektowaniem schematu gwiazdy, naley na wstpie nadmieni, e gwnym elementem tego rodzaju schematw jest centralna tabela faktw, ktra jest powizana z dowoln liczb tabel wymiarw. Tabela
faktw zawiera wszystkie wartoci liczbowe o charakterze addytywnym. W naszym poprzednim przykadzie tego rodzaju wartoci znajduj si w kolumnie ZdobytePunkty,
poniewa moliwe jest dodawanie do siebie punktw, aby w wyniku mc uzyska ich sum. Tabele wymiarw zawieraj natomiast informacje o wszystkich podmiotach, ktre
s powizane z danymi znajdujcymi si w centralnej tabeli faktw, takich jak przedmiot, czas, nauczyciel, ucze itd.
Ponadto, programici baz danych maj do dyspozycji specjalne oprogramowanie analityczne, za pomoc ktrego na podstawie baz danych o schemacie gwiazdy mog budowa
tzw. kostki (ang. cubes). Kostki stanowi niejako rozszerzenie moliwoci dokonywania analiz, umoliwiajc uytkownikom drenie (ang. drill down) predefiniowanych
hierarchii, okrelonych w poszczeglnych wymiarach w celu obejrzenia szczegw.
Uytkownik takiego systemu bdzie mg dokonywa drenia danych w d, przechodzc od cznej liczby punktw uzyskanych przez ucznia w cigu semestru do sumy punktw w poszczeglnych tygodniach.
Na rysunku 19.2 zaprezentowano przykad schematu gwiazdy dla bazy danych zawierajcej informacje o punktach zdobytych przez uczniw z testw.

Rysunek 19.2. Schemat gwiazdy

Na powyszym schemacie tabela Punktacja peni rol centralnej tabeli faktw, natomiast wszystkie inne tabele s tabelami wymiarw.
Pierwsze cztery kolumny w tabeli Punktacja (Data, IDTestu, IDUcznia i IDNauczyciela)
znalazy si w niej tylko po to, aby mona byo poczy t tabel z kadym z wymiarw. Pozostae dwie kolumny zawieraj addytywne wartoci liczbowe, o ktrych ju
wspomnielimy. Zauwa, e kolumna MaksymalnaLiczbaPunktw zostaa przeniesiona
do tabeli Punktacja, podczas gdy w naszym znormalizowanym modelu by to atrybut
tabeli Testy. Dziki umieszczeniu w tabeli Punktacja kolumny ZdobytePunkty oraz

Co dalej?

MaksymalnaLiczbaPunktw moemy skorzysta z oprogramowania analitycznego, przy wy-

korzystaniu ktrego dla kadego zestawu danych atwo zsumujemy uzyskane punkty oraz
obliczymy ich redni liczb (poprzez podzielenie wartoci w kolumnie ZdobytePunkty
przez wartoci z kolumny MaksymalnaLiczbaPunktw).
Oczywicie, przedstawione powyej informacje stanowi jedynie krtkie wprowadzenie
do zagadnie zwizanych z projektowaniem baz danych w przypadku hurtowni danych. Jednoczenie s one potwierdzeniem faktu, e istnieje wiele rnych sposobw
projektowania baz danych, a wybr najlepszego z nich czsto jest uwarunkowany rodzajem oprogramowania, za porednictwem ktrego bdziemy z tych danych korzystali.

Co dalej?
W tym rozdziale zaprezentowalimy zasady projektowania baz danych. Omwilimy
podstawy procesu normalizacji, pokazujc, w jaki sposb baza danych skadajca si
z jednej tabeli moe zosta przeksztacona w bardziej elastyczn struktur, zoon
z wielu powizanych ze sob tabel. Zwrcilimy rwnie uwag na fakt, e projektowanie bazy danych nie powinno by postrzegane jako dziaanie wycznie o naturze technicznej. Naley mie na uwadze rwnie realia biznesowe w danej organizacji oraz
sposb korzystania z danych. Wreszcie, pokrtce opisalimy jedn z alternatyw dla konwencjonalnego projektu o charakterze znormalizowanym w celu podkrelenia, e czsto moliwe jest zastosowanie wicej ni jednego podejcia do tego zagadnienia.
W ostatnim rozdziale, zatytuowanym Sposoby prezentacji danych, omwimy kilka
ciekawych moliwoci zastosowania narzdzi do raportowania. Bdzie to niejako uzupenienie dotychczas zdobytej wiedzy o SQL. W naszym deniu do doskonalenia swoich
umiejtnoci w zakresie SQL nie moemy jednak zapomnie, e nie jest to jedyny jzyk
programowania. Warto wic upewni si, e nie koncentrujemy si wycznie na zastosowaniu SQL do realizacji kadego celu, gdy naszej uwadze umkn moe inne,
bardziej efektywne rozwizanie problemu.

193

194

Rozdzia 19

Zasady projektowania baz danych

R OZ DZ I A 20

S POSOBY
PREZENTACJI
DANYCH

W ostatnim rozdziale powrcimy do gwnego zagadnienia omawianego w niniejszej


ksice, a mianowicie do sposobu pobierania danych z relacyjnej bazy danych. W ostatnich kilku rozdziaach odeszlimy nieco od zwizanych z tym zagadnie, prezentujc
kwestie dotyczce aktualizacji danych, utrzymywania tabel i projektowania baz danych.
Teraz jednak chcielibymy ponownie skupi si na roli SQL w pobieraniu danych, a dokadniej na sytuacjach, w ktrych dane s prezentowane uytkownikom za pomoc
oprogramowania do raportowania.

Kilka sw o warstwie prezentacji danych


Prezentacja danych uytkownikom jest czsto moliwa dziki wykorzystaniu specjalistycznych narzdzi do raportowania. Do tego rodzaju oprogramowania nale m.in.
Microsoft Reporting Services i Crystal Reports. Za porednictwem tych pakietw oprogramowania programici mog poczy si z bazami danych za pomoc SQL, a dziki
dobrze zaprojektowanemu interfejsowi uytkownika, ktry jest ich czci, uytkownicy za pomoc predefiniowanych raportw mog w atwy sposb uzyska dostp do
danych. Narzdzia te umoliwiaj programistom systemw raportowych zaprezentowanie danych na rne sposoby przy minimalnym nakadzie pracy.
Ponadto, wikszo narzdzi do raportowania pozwala uytkownikom na wyeksportowanie pobranych danych do arkusza kalkulacyjnego, takiego jak Excel. To stwarza
im moliwoci wykonywania na nich dowolnych operacji, wczajc w to dokonywanie
przeksztace danych do formatw charakterystycznych dla arkuszy kalkulacyjnych.

195

196

Rozdzia 20

Sposoby prezentacji danych

Majc to na uwadze, w tym rozdziale uzmysowimy programistom baz danych, jakie s


moliwoci oprogramowania do raportowania, a take samych uytkownikw dokonujcych rnych dziaa na danych w arkuszach kalkulacyjnych. W ten sposb mamy
moliwo niejako uproszczenia skomplikowanych instrukcji SQL i przeniesienia niektrych funkcjonalnoci do narzdzi raportowych lub na uytkownika kocowego. Czsto
prostszym i po prostu lepszym wyjciem jest umoliwienie uytkownikowi wywarcia
bezporedniego wpywu na kocowy ukad danych ni podejmowanie przez programist prb budowania instrukcji SQL majcej na celu osignicie oczekiwanego przez
uytkownika rezultatu.
Zasadniczo, bdziemy wic za kadym razem rozwaali moliwo uniknicia konstruowania nadmiernie skomplikowanych instrukcji SQL, gdy tylko podobna funkcjonalno bdzie moga by zrealizowana przy pomocy narzdzia do raportowania
lub przez samego uytkownika majcego wgld do danych.

Narzdzia do raportowania i raporty krzyowe


Aby zaprezentowa moliwoci narzdzi do raportowania, posuymy si przykadami
opartymi na Microsoft Reporting Services, bdcym jednym z wielu dostpnych narzdzi, takich jak Crystal Reports, Cognos oraz MicroStrategy.
W szczeglnoci przyjrzymy si budowie raportu, ktry w Microsoft nosi nazw raportu macierzowego (ang. matrix report). W innych technologiach raporty tego typu wystpuj pod nazw raportw krzyowych (ang. crosstab reports).
Najprostszym sposobem na utworzenie nowego raportu w Microsoft Reporting Services
jest uycie Kreatora raportw (ang. Report Wizard). Po uruchomieniu kreator wywietla
kolejno nastpujce kroki, ktre uytkownik powinien wykona:
1. Zdefiniuj rdo danych i poczenie do niego.
2. Utwrz zapytanie, wpisujc gotow instrukcj SELECT lub korzystajc z wbudowanego narzdzia Query Builder.
3. Okrel typ raportu, ktry chcesz utworzy. Do wyboru masz raport tabelaryczny
lub macierzowy.
4. Przyporzdkuj okrelone kolumny z instrukcji SELECT lub z Query Builder do rnych obszarw raportu.
5. Wybierz styl wizualnej prezentacji raportu.

Krok 3. pozwala okreli typ raportu. W terminologii Microsoft raport tabelaryczny (ang.
tabular report) prezentuje dane w formie prostej tabeli. Elementy danych s prezentowane jako kolumny, a przy kadorazowym pojawieniu si nowych danych dodawany jest nowy wiersz. Dane przedstawione w raporcie s wynikiem instrukcji SELECT
lub definicji z Query Builder.

Narzdzia do raportowania i raporty krzyowe

Wicej uwagi powicimy raportom macierzowym, ktre s stosunkowo nowym sposobem prezentacji danych. W przypadku tego raportu dane nie s umieszczane tylko
kolumnach, tak jak w standardowym raporcie tabelarycznym, ale w czterech rnych
obszarach raportu: w wierszach, kolumnach, szczegach oraz w obszarze stron.
Aby przedstawi rnic midzy raportem tabelarycznych a macierzowym, posuymy
si prostym przykadem. Powiedzmy, e mamy nastpujc instrukcj SELECT:
SELECT
NazwaKlienta AS 'Klient',
KategoriaProduktu AS 'Kategoria Produktu',
ZamwionaIlo AS 'Ilo'
FROM TabelaSprzeday

Gdy na podstawie powyszej instrukcji utworzymy raport tabelaryczny, wyglda on


tak, jak pokazano na rysunku 20.1.

Rysunek 20.1. Raport tabelaryczny

Dane w raporcie tabelarycznym s przedstawione w standardowym ukadzie kolumn


i wierszy.
Zobaczymy teraz, jak bdzie wyglda raport macierzowy oparty na tych samych danych,
bdcych wynikiem powyszej instrukcji SELECT. Okrelajc ukad takiego raportu, kolumn Klient moemy umieci w obszarze wierszy, kolumn Kategoria Produktu
w obszarze kolumn, natomiast kolumn Ilo dodamy do obszaru szczegw. Na rysunku 20.2 zaprezentowany zosta utworzony przez nas w ten sposb raport macierzowy:

Rysunek 20.2. Raport macierzowy

Raport macierzowy prezentuje dane w zupenie inny sposb. Zamiast wywietla je w pojedynczych wierszach, sumuje je wedug dwch grup: klientw i produktw. W raporcie dynamicznie okrelone zostay unikatowe wartoci w tych grupach, a zsumowane
wyniki wywietlone przy uwzgldnieniu odpowiednich wierszy i kolumn.
W obszarze szczegw w raporcie powinny znale si wartoci o charakterze ilociowym, poniewa zostan one w raporcie macierzowym automatycznie zsumowane.

197

198

Rozdzia 20

Sposoby prezentacji danych

Zauwa, e w raporcie tabelarycznym w przypadku klienta o nazwisku Polecki wystpiy


dwa zamwienia krzese, jedno na 40 sztuk, a drugie na 200. W raporcie macierzowym obie te wartoci zostay automatycznie zsumowane, aby wywietlona zostaa ich
suma, czyli 240.
Istnieje, oczywicie, wiele innych funkcji i moliwoci tego i innych narzdzi do raportowania. Najistotniejsze jest jednak to, aby mie wiadomo, co mona osign
za pomoc narzdzi do raportowania, aby ograniczy potrzeb budowania przez programist bazy danych instrukcji SQL.

Arkusze kalkulacyjne i tabele przestawne


Oprcz narzdzi do raportowania, wiele funkcjonalnoci umoliwiajcych dokonywanie rnorakich operacji na danych jest dostpnych rwnie w arkuszach kalkulacyjnych. Wikszo narzdzi sucych do raportowania pozwala na wyeksportowanie
danych do arkusza kalkulacyjnego Excel. Od tego momentu mamy wic moliwo
dokonania dowolnych analiz i przeksztace w programie Excel.
Wiele podstawowych funkcji i funkcjonalnoci dostpnych w programie Excel pokrywa si z tym, co mona osign, budujc instrukcj SELECT. Na przykad w Excelu
w atwy sposb posortujemy dane. Ponadto s w nim dostpne liczne wbudowane
funkcje, ktre s podobne lub takie same jak funkcje wbudowane w SQL.
Inn wan cech programu Excel jest moliwo grupowania danych i wywietlenia
sum czciowych dla utworzonych grup. Oznacza to, e jeli potrzebujemy zarwno
danych szczegowych, jak i sum czciowych obliczonych na podstawie grup danych,
w Excelu mona to bardzo prosto wykona. W tym przypadku programista SQL musiaby
jedynie dostarczy dane na najniszym poziomie szczegowoci. Dane w takiej postaci mogyby nastpnie, za pomoc kilku klikni myszk, zosta w Excelu w podany
sposb zgrupowane, a podane sumy czciowe dodane w kolejnym kroku.
Jednak najwaniejsz funkcjonalnoci dostpn w Excelu w kontekcie analizy danych
bdcej przedmiotem tego rozdziau jest moliwo zbudowania tabeli przestawnej
(ang. pivot table). W Excelu mamy moliwo wyboru dowolnego obszaru danych w arkuszu i przeksztacenia ich do postaci tabeli przestawnej. Na poziomie podstawowym
tabel przestawn mona porwna do raportu macierzowego (krzyowego) przedstawionego w poprzednim przykadzie.
Poniej zaprezentujemy jednak kilka kluczowych elementw, dziki ktrym jest ona
o wiele bardziej uyteczna:
Po pierwsze, tabela przestawna jest cakowicie interaktywna. Zamiast wywietla
statyczny raport krzyowy, uytkownik moe szybko zmodyfikowa zawarto tabeli
przestawnej przez rozmieszczanie elementw danych w rnych obszarach: w wierszach, kolumnach oraz w obszarze danych. Ponadto, w przypadku tabel przestawnych

Arkusze kalkulacyjne i tabele przestawne

mamy do dyspozycji jeszcze jeden obszar, w ktrym moemy umieci dane, a mianowicie obszar strony (ang. page). Umieszczamy w nim elementy, ktre chcemy
zastosowa jako filtry danych, nie wywietlajc ich w raporcie.
Dane w tabelach przestawnych istniej jako odrbne magazyny danych i mog by
nawet zapisane w oddzielnym pliku. Poniewa dane w tabeli przestawnej s niezalene od jej danych rdowych, uytkownicy mog dowolnie przegrupowywa
dane w ramach tabeli przestawnej bez wpywu na dane, na podstawie ktrych pierwotnie zostaa utworzona.
Tabele przestawne umoliwiaj dodatkow selekcj danych. Na przykad konkretne wartoci rnych elementw danych mog zosta wykluczone z tabeli przestawnej. Sposb agregacji wartoci w obszarze danych tabeli przestawnej moe rwnie
zosta zmieniony z sumy na funkcj suc do zliczenia wystpie danej wartoci.
W przypadku tabel przestawnych moliwe jest zastosowanie funkcjonalnoci
drenia danych w celu obejrzenia bardziej szczegowych informacji. Na przykad, jeli dane rdowe zawieraj kolumny, takie jak pastwo, wojewdztwo
i miasto, tabela przestawna moe zosta skonfigurowana tak, aby po dwukrotnym
klikniciu na pastwo wywietliy si wszystkie wojewdztwa w tym pastwie, a po
dwukrotnym klikniciu na wybrane wojewdztwo pojawiyby si wszystkie miasta,
ktre si w nim znajduj.
Tabele przestawne umoliwiaj uytkownikom drenie wskro (ang. drill through),
a wic przechodzenie z poziomu zsumowanych danych do ich szczegw. W ten
sposb po dwukrotnym klikniciu na jakkolwiek pojedyncz warto w obszarze danych moemy zobaczy poszczeglne wiersze, na podstawie ktrych zostaa obliczona.
Dalsze wchodzenie w szczegy dotyczce sposobw budowania i funkcjonalnoci tabel przestawnych wykracza poza zakres tej ksiki. Jednake sama wiadomo tego,
co moemy osign dziki zastosowaniu tabel przestawnych, dla programisty SQL
moe okaza si bardzo przydatna.
Na rysunku 20.3 przedstawiono przykad tabeli przestawnej utworzonej na podstawie
tych samych danych, co powyej, ale z uwzgldnieniem dwch nowych kolumn: Data
i Podkategoria. Kolumna Podkategoria stanowi dalszy podzia wartoci zawartych w kolumnie KategoriaProduktu. W poniszej tabeli przestawnej data, kategoria produktu
oraz podkategoria zostay umieszczone w obszarze wierszy. Na rysunku wida, jak elastycznie dokonywane jest dalsze rozbicie danych na bardziej szczegowe informacje.
Zwr uwag, e w powyszej tabeli przestawnej wystpuj trzy rne poziomy grupowania wierszy. Najpierw dane grupowane s wedug daty, potem wedug kategorii
produktw, a na koniec wzgldem podkategorii. Wida, e w dniu 2009-12-05 sprzedane
zostay produkty nalece do dwch rnych kategorii: krzesa i papier. W przypadku
krzese sprzedano towary z dwch podkategorii: metal i plastik. Dla kadej z tych kategorii
w tabeli przestawnej przedstawiono liczb sprzedanych sztuk w podziale na poszczeglnych klientw.

199

200

Rozdzia 20

Sposoby prezentacji danych

Rysunek 20.3. Tabela przestawna

Dziki tabelom przestawnym moemy dokonywa sumowania danych na wiele rnych


sposobw. Ponadto, uytkownicy maj moliwo rozmieszczenia elementw danych
niemal w dowolny sposb.

Co dalej?
W tym rozdziale zaprezentowalimy kilka moliwoci prezentacji danych w nietypowy sposb przy wykorzystaniu narzdzi do raportowania oraz arkuszy kalkulacyjnych.
W szczeglnoci, dziki zastosowaniu raportu krzyowego mamy moliwo zsumowania
danych w sposb trudny do osignicia za pomoc instrukcji SQL. Jeli za chodzi
o tabele przestawne w Excelu, s one oparte na koncepcji raportu krzyowego, ale stanowi jej rozszerzenie, bdc dla uytkownika bardziej elastycznym narzdziem o wielu
funkcjonalnociach. Dziki wiadomoci istnienia narzdzi do raportowania oraz tych
sucych uytkownikowi do dokonywania rnego rodzaju przeksztace danych programici SQL mog wykorzysta swoj wiedz bardziej produktywnie, koncentrujc
si na zagadnieniach zwizanych z pobieraniem danych. Za bardziej skomplikowane
formy prezentacji wynikw bd wwczas odpowiedzialni sami uytkownicy korzystajcy z narzdzi do raportowania.
Teraz, gdy zapoznae si ju z caym materiaem przedstawionym w niniejszej ksice, by moe warto, aby sprbowa samodzielnie wykona kilka instrukcji SQL. Jeli
jeszcze tego nie zrobie, w dodatkach A, B i C na pocztek znajdziesz kilka wskazwek
odnonie pracy z bazami danych Microsoft SQL Server, MySQL i Oracle. W dodatkach
zamieszczono instrukcje instalacji darmowych wersji tych baz danych, a take podstawowe informacje na temat korzystania z tych rodzajw oprogramowania w celu
wykonywania polece SQL.
Jako autor, mam szczer nadziej, e ta ksika okazaa si dla Ciebie uytecznym przewodnikiem po meandrach SQL. Na pocztku wspomniaem, e w przypadku SQL moemy zarwno mwi o zastosowaniu pewnej logiki, jak i rozpatrywa go w kategoriach
jzyka. Ta jego cecha jest do oczywista. W kadym z rozdziaw podkrelaem uycie sw kluczowych oraz ich znaczenie. Teraz jednak, gdy zapoznae si ju z caym
zaprezentowanym przeze mnie materiaem, mam nadziej, e dostrzeesz istotne znaczenie logiki zawartej w SQL.

Co dalej?

Tak naprawd dziki logice w czystej postaci mamy moliwo przeksztacenia rozmieszczonych w kolumnach i wierszach kilku wartoci w co, co moe by uyteczn informacj. Wyzwaniem jest jednak okrelenie odpowiedniego sposobu zastosowania logiki
jzyka SQL, gdy mamy do czynienia z rzeczywistym zestawem danych. Wwczas nastpuje zderzenie naszej wiedzy teoretycznej z praktyk.
Stosujc funkcje, agregacj, zczenia, podzapytania, widoki i inne elementy SQL, bdziesz
niejednokrotnie zmaga si z rzeczywistoci wystpowania surowych danych i uczy,
w jaki sposb z nich korzysta, czasem bdc na bakier z logik.
Logika to jednak nie wszystko. Sam jzyk SQL odgrywa rwnie wan rol. Rzekbym,
e prawdziwe pikno SQL polega na tym, e jzyk ten jest do wyjtkowy, gdy nie
jest ani enigmatyczny, ani nadmiernie opisowy. Kade sowo kluczowe suy do osignicia konkretnego celu i okrela pewien element logiki, nic poza tym. Cho bybym
daleki od stwierdzenia, e SQL nosi pewne znamiona o poetyckim charakterze, to jednak, gdy mowa o jzykach programowania, wyrnia si pod wzgldem estetycznym.

201

202

Rozdzia 20

Sposoby prezentacji danych

DODATEK A

P RACA
Z BAZ DANYCH

M ICROSOFT SQL S ERVER

Wstp
Poniej przedstawiono procedur instalacji bezpatnej wersji Microsoft SQL Server.
Procedura ta zostaa przetestowana na komputerze z systemem operacyjnym Windows 7. Pamitaj jednak, e szczegowe instrukcje mog si rni od tego, co pokazano
poniej, w zalenoci od tego, co zostao ju zainstalowane na Twoim komputerze.
Poniewa procedury instalacji mog z czasem ulec zmianie, odwied stron producenta w celu uzyskania niezbdnych informacji.
Ponisza procedura obejmuje instalacj dwch komponentw:
SQL Server Express 2014,
SQL Server Management Studio.
Microsoft SQL Server Express 2014 pozwala utworzy baz danych, natomiast SQL
Server Management Studio jest interfejsem graficznym, umoliwiajcym uruchamianie polece SQL w celu nawizania komunikacji z serwerem i kad baz danych, ktr
utworzysz.
Plik, za pomoc ktrego mona dokona instalacji obu wyej wymienionych elementw
oprogramowania, jest dostpny na stronie internetowej http://www.microsoft.com/sqlserver.

203

204

Dodatek A

Praca z baz danych Microsoft SQL Server

Instalacja SQL Server Express 2014


i SQL Server Management Studio
Aby zainstalowa oprogramowanie bazodanowe Microsoft SQL Server, naley wykona nastpujce kroki:
1. Wejd na stron http://www.microsoft.com/sqlserver.
2. Bdc na zakadce Wyprbuj, wybierz opcj Oce SQL Server 2014 Express.
3. Gdy otworzy si nowe okno przegldarki, kliknij na przycisk z napisem GET
STARTED NOW.
4. Aby pobra oprogramowanie, naley posiada konto. Jeli wic jeszcze go nie masz,
powiniene je zaoy, a nastpnie zalogowa si, podajc swj adres e-mail i haso.
5. Na formularzu zaznacz do pobrania opcj Express with Tools i kliknij Continue,
a nastpnie wybierz wersj, ktr chcesz zainstalowa, w zalenoci od tego, czy Twj
system operacyjny jest 34- czy 64-bitowy. Wska te wersj jzykow oprogramowania i kliknij Continue. Pobieranie oprogramowania rozpocznie si automatycznie.
6. Jeli zostaniesz poproszony o instalacj oprogramowania Acamai NetSession Interface, zaakceptuj j i postpuj zgodnie ze wskazwkami.
7. Po pobraniu instalatora uruchom go, a nastpnie wybierz opcj New SQL Server
stand-alone installation or add features to an existing installation (pierwsza instalacja
SQL Server lub instalacja dodatkw do oprogramowania istniejcego ju na Twoim
komputerze).
8. Zaakceptuj warunki licencji i zainstaluj oprogramowanie, klikajc kolejno Next.
9. Podczas kroku Product Updates moe wywietli si ostrzeenie o braku odnalezionych aktualizacji. Pomi je, klikajc przycisk Next.
10. Po zakoczeniu instalacji kliknij przycisk Close.

Po wykonaniu powyszych krokw na Twoim komputerze zostanie zainstalowane nastpujce oprogramowanie:


Microsoft SQL Server Management Studio,
elementy oprogramowania Microsoft SQL Server Integration Services oraz Microsoft SQL Server Analysis Services.

Praca z SQL Server Management Studio


Po uruchomieniu SQL Server Management Studio wywietli si okno z prob o okrelenie poczenia z Microsoft SQL Server, ktre zainstalowae. W polu Server name
wpisz localhost\SQLEXPRESS lub(local)\SQLEXPRESS. W licie wyboru Authentication

Praca z SQL Server Management Studio

wybierz z listy rozwijanej Windows Authentication. Nie musisz wpisywa nazwy uytkownika ani hasa. Nastpnie kliknij przycisk Connect (pocz).
Gdy ju si poczysz, bdziesz musia utworzy baz danych, na ktrej bdziesz pracowa. Aby to zrobi, zlokalizuj po lewej stronie panel Object Explorer, nastpnie kliknij prawym przyciskiem myszy na Databases i wybierz opcj New Database (nowa baza danych). W oknie New Database w Database name wpisz nazw bazy danych (na
przykad PierwszaBazaDanych). Nastpnie kliknij przycisk OK. Twoja baza danych bdzie od teraz widoczna po rozwiniciu folderu Databases w Object Explorer.
Aby wykona dowolny kod SQL, moesz klikn na swoj baz danych, jedynie j zaznaczajc, a nastpnie klikn przycisk New Query (nowe zapytanie). Otworzy si nowe
okno, w ktrym moesz umieci swoje zapytanie. Mona umieci tu dowoln instrukcj
SQL, a nastpnie klikn przycisk Execute (wykonaj). Jeli chcesz umieci w tym oknie
kilka zapyta SQL, moesz zaznaczy dowoln ich liczb, a nastpnie wykona tylko te,
ktre zostay przez Ciebie zaznaczone. Wyniki Twojego zapytania bd widoczne w panelu Results lub Messages. Jeeli zapytanie zwraca dane, zostan wywietlone w panelu
Results. W przeciwnym wypadku w panelu Messages wywietlona zostanie informacja
o powodach niepowodzenia wykonania Twojej instrukcji.
Dokumentacja dotyczca SQL Server jest dostpna w internecie w obszarze MSDN
(Microsoft Development Network) na stronie internetowej Microsoft. Punktem wyjcia
w odniesieniu do skadni Transact-SQL jest strona internetowa http://msdn.microsoft.
com/pl-pl/library/bb510741.aspx.

205

206

Dodatek A

Praca z baz danych Microsoft SQL Server

DODATEK B

P RACA
Z BAZ DANYCH

M Y SQL

Wstp
Poniej przedstawiono procedur instalacji bezpatnej wersji MySQL. Procedura ta
zostaa przetestowana na komputerze z systemem operacyjnym Windows 7. Pamitaj
jednak, e szczegowe instrukcje mog si rni od tego, co pokazano poniej, w zalenoci od tego, co zostao ju zainstalowane na Twoim komputerze.
Poniewa procedury instalacji mog z czasem ulec zmianie, odwied stron producenta w celu uzyskania niezbdnych informacji.
Ponisza procedura obejmuje instalacj dwch komponentw:
MySQL Server,
MySQL Workbench, wersja 5.2 lub pniejsza.
MySQL Server pozwala utworzy baz danych, natomiast MySQL Workbench jest
interfejsem graficznym, umoliwiajcym uruchamianie polece SQL w celu nawizania komunikacji z serwerem i kad baz danych, ktr utworzysz.
MySQL Server mona pobra ze strony internetowej http://www.mysql.com. W czasie
gdy powstawaa ta ksika, w przygotowaniu bya kolejna wersja MySQL Workbench.
Aby mc uruchamia instrukcje SQL, naley wic pobra wersj 5.2 lub wysz. Obecnie
na stronie http://dev.mysql.com dostpna jest wersja 6.1.

207

208

Dodatek B

Praca z baz danych MySQL

Instalacja MySQL Server oraz MySQL Workbench


Aby zainstalowa oprogramowanie bazodanowe MySQL Server oraz MySQL Workbench, naley wykona nastpujce kroki:
1. Wejd na stron http://dev.mysql.com/downloads/installer/1.
2. Wybierz platform Microsoft Windows oraz wersj mysql-installer-web-community.
3. Jeli masz ju swoje konto, zaloguj si. W przeciwnym wypadku zarejestruj si,
wybierajc opcj Sign Up.
4. Nastpnie kliknij Download Now oraz przycisk Uruchom.
5. Gdy pobieranie si zakoczy, otworzy si okno instalatora.
6. Na powitalnej stronie wybierz opcj Install MySQL products.
7. Zapoznaj si z wywietlonymi warunkami umowy licencyjnej, zaakceptuj je, zaznaczajc opcj I accept the license terms, i kliknij Next.
8. Zaznacz opcj Skip the check for updates (not recommended) i kliknij Next.
9. W oknie Choosing a Setup Type wybierz opcj Developer Default i kliknij Next.
10. W oknie Check Requirements rwnie kliknij Next, a gdy pojawi si okno Installation Progress, kliknij Execute.
11. Wyra zgod na dokonanie przez instalator konfiguracji MySQL Server, klikajc
przycisk Next.
12. W kolejnym kroku (MySQL Server Configuration) nie dokonuj adnych zmian, klikajc Next.
13. Okrel teraz swoje MySQL Root password, ktrego bdziesz uywa, czc si z serwerem, oraz skorzystaj z opcji Add User w celu utworzenia dodatkowego uytkownika bazy danych.
14. W nowym oknie podaj nazw uytkownika, ktrej chcesz uywa, a z listy rozwijanej
Host wybierz localhost. Ponownie okrel haso dostpu i kliknij OK, a nastpnie klikaj
Next, a pojawi si komunikat The installation procedure has been completed
(procedura instalacji zostaa zakoczona).
15. Kliknij przycisk Finish.

Po wykonaniu powyszych krokw na Twoim komputerze zostanie zainstalowane nastpujce oprogramowanie:


1

Dziki zastosowaniu MySQL Installer 5.6.19 moliwe jest zainstalowanie zarwno MySQL Server,
jak i MySQL Workbench. MySQL Workbench mona take zainstalowa oddzielnie, wchodzc na
stron http://dev.mysql.com/downloads/workbench/ przyp. tum.

Praca z MySQL Workbench

MySQL Workbench 6.1.6 CE,


MySQL Server 5.6.19,
MySQL Notifier 1.1.5.

Praca z MySQL Workbench


Gdy po raz pierwszy uruchomisz MySQL Workbench, konieczne bdzie ustanowienie
poczenia z instancj zainstalowanego przez Ciebie MySQL Server.
Aby utworzy takie poczenie, wybierz opcj Manage Connections w menu Database.
Nastpnie kliknij przycisk New, aby doda nowe poczenie. Wpisz nazw poczenia
(na przykad MojePolaczenie) i kliknij Test Connection. Wpisz haso, jeli wczeniej je podae, i kliknij OK, aby zweryfikowa poczenie. Po poprawnej weryfikacji kliknij
przycisk Close.
Gdy utworzysz ju poczenie, musisz utworzy baz danych, na ktrej bdziesz mg
pracowa. Aby to zrobi, wybierz opcj Connect to Database, ktr znajdziesz w menu
Database. Nastpnie z listy rozwijanej Stored Connection wybierz utworzone przez
Ciebie w poprzednim kroku MojePolaczenie i kliknij OK. Pojawi si okno edytora,
a po lewej stronie obszar Navigator. Kliknij prawym przyciskiem myszy na domyln baz
danych i wybierz opcj Create Schema. Nastpnie podaj nazw nowej bazy danych (na
przykad MojaPierwszaBazaDanych) w polu Name i kliknij dwa razy z rzdu przycisk
Apply, a nastpnie Finish. Twoja baza danych pojawi si w oknie Navigatora. W ostatnim kroku kliknij na swoj baz prawym przyciskiem myszy i wybierz opcj Set as
Default Schema.
Teraz, gdy utworzye ju poczenie do swojej bazy danych, w edytorze moesz umieci
dowoln instrukcj SQL. Jeli nadal nie widzisz okna edytora, wr do wyboru bazy
danych w menu Database, tak jak opisano powyej. Tak jak poprzednio, zostaniesz
poproszony o wybranie poczenia do serwera.
Po umieszczeniu w edytorze instrukcji SQL kliknij przycisk Execute, ktry wyglda jak
byskawica. Gdy umiecisz w oknie wicej ni jedno zapytanie, moesz zaznaczy dowolne instrukcje i tylko je wykona.
Wyniki Twojego zapytania bd widoczne w panelu Output lub Result. Jeeli zapytanie
zwraca dane, zostan wywietlone w panelu Result. W przeciwnym wypadku w panelu
Output wywietlona zostanie informacja o powodach niepowodzenia wykonania Twojej
instrukcji.
Pena dokumentacja dotyczca MySQL jest dostpna w internecie. Podrczniki do
kadej wersji MySQL, dziki ktrym nauczysz si nim posugiwa i poznasz jego moliwoci, s dostpne pod adresem http://dev.mysql.com/doc/refman/5.1/en.

209

210

Dodatek B

Praca z baz danych MySQL

DODATEK C

P RACA
Z BAZ DANYCH

O RACLE
Wstp
Poniej przedstawiono procedur instalacji bezpatnej wersji bazy danych Oracle. Procedura ta zostaa przetestowana na komputerze z systemem operacyjnym Windows 7.
Pamitaj jednak, e szczegowe instrukcje mog si rni od tego, co pokazano poniej, w zalenoci od tego, co zostao ju zainstalowane na Twoim komputerze.
Poniewa procedury instalacji mog z czasem ulec zmianie, odwied stron producenta w celu uzyskania niezbdnych informacji.
Ponisza procedura obejmuje instalacj jednego komponentu Oracle Database
Express Edition.
W wyniku instalacji oprogramowania utworzona zostanie pojedyncza baza danych, a take udostpniony zostanie graficzny interfejs webowy, ktry pozwoli Ci na wykonywanie polece SQL na bazie danych.
Instalator bazy danych Oracle mona pobra ze strony internetowej http://www.oracle.
com/database.
Podczas procesu instalacji moesz zosta poproszony o podanie nazwy uytkownika
bazy danych. Nazwa, ktr w takim przypadku powiniene poda, to SYSTEM.

Instalacja Oracle Database Express Edition


Aby zainstalowa Oracle Database Express Edition, naley wykona nastpujce kroki:
1. Wejd na stron http://www.oracle.com/database.
2. Z grnego menu wybierz Downloads, a nastpnie Oracle Database 11g Express Edition.

211

212

Dodatek C

Praca z baz danych Oracle

3. Zaakceptuj warunki licencji i kliknij na Oracle Database Express Edition 11g Release 2
for Windows x32 (lub x64, jeli chcesz zainstalowa 64-bitow wersj bazy danych).
4. Jeli masz ju swoje konto, zaloguj si. W przeciwnym wypadku zarejestruj si, wybierajc opcj Za konto.
5. Gdy plik zostanie pobrany, rozpakuj go i uruchom instalator setup.exe.
6. Kliknij przycisk Next, zaakceptuj warunki licencji i kliknij dwukrotnie Next.
7. Podaj haso, ktrego chcesz uywa przy logowaniu si do bazy danych, i kliknij Next,
a nastpnie Install.
8. Po zakoczeniu instalacji kliknij Finish.

Tym samym zainstalowae oprogramowanie Oracle Database 11g Express Edition.


Interfejs tej bazy danych jest webowy. Poszczeglne funkcje s dostpne z poziomu
katalogu Oracle Database 11g Express Edition w menu Start. Gwn aplikacj, z ktrej
bdziemy korzysta, jest Oracle Application Express w katalogu Get Started.
Po klikniciu w menu Start na Get Started pojawi si okno w przegldarce. Wybierz
na nim z gwnego menu opcj Application Express. Zostaniesz przeniesiony do strony
logowania do bazy danych. Zaloguj si podanym podczas instalacji hasem na uytkownika SYSTEM.

Praca z Oracle Database Express Edition


Aby uzyska dostp do bazy danych Oracle, kliknij na Get Started z poziomu katalogu
Oracle Database 11g Express Edition w menu Start. Otworzy si aplikacja webowa bdca interfejsem dla bazy danych.
Aby zalogowa si do bazy danych, kliknij na zakadk Application Express. Zaloguj si,
podajc uytkownika SYSTEM i haso, ktre okrelie podczas instalacji, i nacinij przycisk LOGIN.
Pojawi si kolejny formularz, w ktrym zostaniesz poproszony o podanie nazwy bazy
danych (Database name), nazwy uytkownika (Application Express Username) oraz hasa. Nastpnie kliknij Create Workspace. Pojawi si komunikat o poprawnym wykonaniu operacji. Kliknij na link oznaczony jako click here, aby zalogowa si do bazy
danych. Nastpnie podaj swoje haso i kliknij Login.
Jeli bdziesz chcia wykona pojedyncz instrukcj SQL, z gwnego menu rozwi
zakadk SQL Workshop, a nastpnie wybierz SQL Commands. Bdziesz mg teraz wykona pojedyncze polecenie SQL. Jeli bdziesz chcia wpisa w oknie wiele polece, wystarczy, e zaznaczysz wybran instrukcj i uruchomisz j za pomoc przycisku RUN.

Praca z Oracle Database Express Edition

Jeli bdziesz chcia wykona kilka instrukcji SQL, ale nie potrzebujesz oglda zwracanych przez nie wynikw, z gwnego menu rozwi zakadk SQL Workshop, a nastpnie wybierz SQL Scripts. Po wybraniu tej opcji moesz utworzy nowy skrypt lub
edytowa istniejcy. Aby utworzy nowy skrypt, kliknij przycisk CREATE, a nastpnie
podaj nazw skryptu i wprowad instrukcje, ktre ma on zawiera.
Aby uruchomi skrypt, kliknij przycisk RUN. Zostaniesz poproszony o potwierdzenie,
czy skrypt ma zosta uruchomiony. Ponownie kliknij przycisk RUN. Raport z wykonania skryptu moesz podejrze, klikajc na ikon pod nazw kolumny View Results.
Pena dokumentacja dotyczca Oracle jest dostpna w internecie pod adresem http://
www.oracle.com/pls/db112.

213

214

Dodatek C

Praca z baz danych Oracle

DODATEK D

L ISTA
WSZYSTKICH
INSTRUKCJI

SQL

Lista wszystkich instrukcji SQL zawartych w tej ksice znajduje si pod adresem:
ftp://ftp.helion.pl/przyklady/jsqlpp.zip.
W powyszej lokalizacji znajdziesz 3 pliki:
Instrukcje SQL i dane dla SQL Server.doc,
Instrukcje SQL i dane dla MySQL.doc,
Instrukcje SQL i dane dla Oracle.doc.
W tych trzech plikach znajduj si wszystkie instrukcje SQL przedstawione w niniejszej
ksice, oddzielnie dla kadej z trzech baz danych. Ponadto, pliki te zawieraj skrypty
SQL, ktre umoliwiaj utworzenie elementw bazy danych zawierajcych dane wykorzystywane w wymienionych instrukcjach. Po uruchomieniu skryptw, za pomoc
ktrych wykonywane s operacje na elementach bazy danych, moesz wykona kade
polecenie przedstawione w tej ksice i zobaczy taki sam wynik, jak pokazany w treci.
Szczegowe instrukcje odnonie uruchamiania skryptw, o ktrych mowa powyej,
zostay opisane w kadym z trzech plikw.

215

216

Dodatek D

Lista wszystkich instrukcji SQL

S KOROWIDZ

A
aggregate function, Patrz: funkcja agregujca
aggregation, Patrz: agregacja
agregacja, 99
kryteria selekcji, 107
arkusz kalkulacyjny, 195, 198
atrybut, 187
auto-increment, Patrz: przyrost automatyczny

B
baza danych, 15
projektowanie, 183, 184, 190
relacyjna, 20, 183
schemat gwiazdy, 191
kostka, 192
SQL, 16
struktura, 17
Boolean logic, Patrz: logika Boolea

C
calculated field, Patrz: pole obliczane
character string, Patrz: cig znakw
child table, Patrz: tabela podrzdna
cig znakw, 23
Cognos, 196
column-based logic, Patrz: logika obliczania
wartoci wyjciowych w kolumnach
composite primary key, Patrz: klucz gwny
zoony
concatenation, Patrz: konkatenacja
conditional logic, Patrz: logika warunkowa

correlated subquery, Patrz: podzapytanie


skorelowane
crosstab report, Patrz: raport krzyowy
Crystal Reports, 195, 196
cube, Patrz: baza danych schemat gwiazdy
kostka

D
dane
agregacja, Patrz: agregacja
aktualizacja, 165, 166, 171, 172, 186
duplikat, Patrz: duplikat
grupowanie, 104, 105
modyfikacja, 165, 170, 179
nadmiarowe, 186
ograniczenie dostpu, 136
pobieranie, 27
podzbir, 135
prezentacja, 195
redundancja, Patrz: redundancja
selekcja Top N, 73
sortowanie, 55
w porzdku malejcym, 57, 60
w porzdku rosncym, 56, 60
wzgldem pola obliczanego, 58
wzgldem wicej ni jednej kolumny, 58
typ, 22, 177
daty i czasu, 22, 23
konwersja, 52
liczbowy, 22, 60
znakowy, 22, 23, 42, 44, 60
rdo, 140

217

218

Skorowidz
Data Control Language, Patrz: DCL
Data Definition Language, Patrz: DDL
Data Manipulation Language, Patrz: DML
Database Management Systems, Patrz: DBMS
DB2, 19
DBMS, 16
DCL, 17, 175
DDL, 17, 175
diagram zwizkw encji, 113
DML, 17, 175
dopasowywanie
do wzorca, 89
za pomoc brzmienia, 94
drenie, 192
wskro, 199
drill down, Patrz: drenie
drill through, Patrz: drenie wskro
duplikat, 152
usuwanie, 99, 152

E
encja, 113
entity, Patrz: encja
entity-relationship diagram, Patrz: diagram
zwizkw encji
Excel, 195, 198
tabela przestawna, 198

IFNULL, 54
ISNULL, 53, 54, 61, 87, 141
konwersji, 52
LEFT, 42, 43, 44
liczbowa, 42
LOWER, 47
LTRIM, 42, 45
acuchowa, 42
matematyczna, 50
MAX, 101, 102
MIN, 101, 102
NOW, 48
NVL, 54
PI, 50, 51
RAND, 50, 51
RIGHT, 43, 44, 48
ROUND, 50
RTRIM, 44, 45
skalarna, 42, 101
SOUNDEX, 94, 95
SUBSTR, 44, 45, 48
SUBSTRING, 41, 44, 45
SUM, 42, 101
UPPER, 47
zabezpiecze bazy danych, 136
zagniedona, 47, 51
znakowa, 42

G
F
first normal form, Patrz: posta normalna
pierwsza
foreign key, Patrz: klucz obcy
funkcja, 41, 132
agregujca, 42, 101, 104
argument, 43
AVG, 101, 102
CAST, 52, 53
CONCAT, 37, 46
COUNT, 101, 103
CURRENT_DATE, 48
DATE_FORMAT, 49
DATEDIFF, 48, 49, 50
DATEPART, 48, 49
daty i czasu, 42, 48
DIFFERENCE, 94, 95
GETDATE, 48

generator liczb losowych, 51


Graphical User Interface, Patrz: GUI
GUI, 176

I
identity column, Patrz: kolumna identyfikujca
indeks, 182
Informix, 19
inner join, Patrz: zczenie wewntrzne
instrukcja, 215
ALTER FUNCTION, 163
ALTER PROCEDURE, 162, 163
ALTER TABLE, 182
ALTER VIEW, 136
CREATE, 176
CREATE FUNCTION, 163
CREATE INDEX, 182
CREATE PROCEDURE, 162, 175, 176

Skorowidz
CREATE TABLE, 180, 181
CREATE VIEW, 133, 175, 176
DDL, 176
DELETE, 139, 170, 175
DML, 175
DROP FUNCTION, 163
DROP INDEX, 182
DROP PROCEDURE, 162, 163
INSERT, 139, 175
INSERT INTO, 168, 169
SELECT, 27, 39, 42, 64, 139, 175, 198
czenie, 149
ORDER BY, 55, 56, 57, 58
TRUNCATE TABLE, 170
UPDATE, 139, 171, 172, 175
interfejs uytkownika graficzny, Patrz: GUI

J
jzyk
definicji danych, 17
deklaratywny, 17
kontroli danych, Patrz: DCL
manipulowania danymi, 17
proceduralny, 17
SQL, Patrz: SQL
join, Patrz: zczenie

K
keyword, Patrz: sowo kluczowe
klauzula, Patrz te: sowo kluczowe
CREATE PROCEDURE, 159
CREATE VIEW, 136
DROP VIEW, 136
FROM, 43, 45, 56, 140
GROUP BY, 145
HAVING, 145
LEFT JOIN, 121
ON, 131
ORDER BY, 55, 56, 58, 59, 73, 152
WHERE, 67, 69, 71, 74, 75, 103, 107, 123
klucz
gwny, 21, 22, 24, 28, 111, 176, 177, 178
zoony, 178, 187
obcy, 22, 111, 113, 176, 179
kolumna, 20, 177
alias, 35, 37, 38, 43, 59
atrybut, 177, 178

identyfikujca, 177
logika obliczania wartoci wyjciowych,
Patrz: logika obliczania wartoci
wyjciowych w kolumnach
nagwek, 34
nazwa, 30, 177
zmiana, 135
obliczana, 135
warto
domylna, 178
przyrostowa, 177, 179
wybieranie, 29
konkatenacja, 36
Kreator raportw, 196

L
liczba
losowa, 51
pi, 51
literal value, Patrz: litera warto
litera, 34, 35, 42
logika
Boolea, 77
NULL, 86
IF-THEN-ELSE, 64
obliczania wartoci wyjciowych
w kolumnach, 63
warunkowa, 63
zbiorw, 149

acuch znakw, 23, 42

M
matrix report, Patrz: raport macierzowy
Microsoft Access, 19
Microsoft Reporting Services, 195, 196
Microsoft SQL Server, 18
instalacja, 203, 204
wersja, 18
MicroStrategy, 196
model relacyjny, 184
MySQL, 18
instalacja, 207, 208
MySQL Server, 207
MySQL Workbench, 207, 209

219

220

Skorowidz

N
normalizacja, 184, 185, 186, 187, 188, 191
zasady, 187
NULL, 24, 52, 53, 60, 177
numeric datatype, Patrz: dane typ liczbowy

O
obiekt, 132
biznesowy, 111
pakiet, Patrz: pakiet
operator
AND, 78, 80
arytmetyczny, 36
BETWEEN, 84
EXCEPT, 155
EXISTS, 146, 173
IN, 84, 85, 143
INTERSECT, 154, 155
kolejno, 80
LIKE, 89
MINUS, 155
NOT, 78, 82, 84
OR, 78, 79, 80, 154
UNION, 150, 151, 154
UNION ALL, 152, 154
NOT, 84
Oracle, 211
Oracle Database, 18
Oracle Database Express Edition, 212
instalacja, 211
outer join, Patrz: zczenie zewntrzne

P
pakiet, 159
parametr, 160
parent table, Patrz: tabela nadrzdna
pattern matching, Patrz: dopasowywanie
do wzorca
pivot table, Patrz: Excel tabela przestawna
podzapytanie, 39, 75, 86, 139, 140
nieskorelowane, 144
skorelowane, 144, 145, 172, 173
w miejscu
listy_kolumn, 140
listy_tabel, 140
warunku, 140, 143
warto w kolumnie obliczanej, 147

pole obliczane, 33, 34, 35, 58


w klauzuli ORDER BY, 59
posta normalna
druga, 186
pierwsza, 186
trzecia, 186
PostgreSQL, 19
primary key, Patrz: klucz gwny
procedura
skadowana, 157, 162, 176
modyfikowanie, 162
parametry, 160, 163
tworzenie, 158, 159
wykonywanie, 161, 163
przyrost automatyczny, 21, 177

Q
Query Builder, 196

R
raport
krzyowy, 196
macierzowy, 196, 198
tabelaryczny, 196
tworzenie, 196
raportowanie, 195
redundancja, 186, 191
relationship, Patrz: zwizek
Report Wizard, Patrz: Kreator raportw

S
samogoska, 94
second normal form, Patrz: posta normalna
druga
sekwencja, 177
selekcja, 140, 143
self join, Patrz: zczenie zwrotne
set logic, Patrz: logika zbiorw
sowo kluczowe, 27, 28, Patrz te: klauzula
ALTER FUNCTION, 163
ALTER PROCEDURE, 162, 163
AND, 78
AS, 39, 117
ASC, 57
BEGIN, 159
BETWEEN, 84
CALL, 162

Skorowidz
CASE, 63
CREATE FUNCTION, 163
CREATE PROCEDURE, 158, 159, 162
CREATE VIEW, 132, 136
DESC, 57
DISTINCT, 99, 152
DROP FUNCTION, 163
DROP PROCEDURE, 162, 163
DROP VIEW, 136
ELSE, 64
END, 64, 159
EXEC, 161
EXISTS, 146
FROM, 27, 43, 56, 116, 117, 140
GROUP BY, 104, 105
HAVING, 107
IN, 84
INNER JOIN, 114, 115, 116, 117
INSERT, 166
IS NOT NULL, 87
IS NULL, 86
LIMIT, 73
NOT, 78, 82, 86
NULLS FIRST, 60
ON, 114, 116
OR, 78, 79
ROWNUM, 73, 75
SELECT, 27
THEN, 64
TOP, 72, 73
VALUES, 167, 168
WHEN, 64
WHERE, 69, 70, 116
operator, 71
SQL, 15, 16
baza danych, 16
definicja, 17
jzyk, 16
skadnia, 17, 29, 30
SQL Anywhere, 19
SQL Server Express 2014, 203
SQL Server Management Studio, 203, 204
stored procedure, Patrz: procedura skadowana
string, Patrz: acuch znakw
string function, Patrz: funkcja acuchowa
subquery, Patrz: podzapytanie
system zarzdzania bazami danych, Patrz: DBMS

T
tabela, 111, 132
alias, 39, 117
atrybut, 176, 177
DUAL, 45
faktw, 192
indeks, 178
czenie, 112, 149
nadrzdna, 179
podrzdna, 179
tworzenie, 175, 177, 180, 181
widok, Patrz: widok
zczenie, 152, Patrz: zczenie
tabular report, Patrz: raport tabelaryczny
third normal form, Patrz: posta normalna
trzecia

U
uncorrelated subquery, Patrz: podzapytanie
nieskorelowane

V
variable, Patrz: zmienna

W
warto NULL, Patrz: NULL
widok, 132, 134, 176
dane, 133
modyfikowanie, 136
usuwanie, 137
wiersz, 20
sortowanie, 55
usuwanie, 165, 170, 179
mikkie, 165
wstawianie, 165, 166, 167
zliczanie, 103
wildcard, Patrz: znak wieloznaczny
wyraenie
CASE, 63, 64, 67
proste, 64
przeszukujce, 64, 66
wyzwalacz, 132, 177

221

222

Skorowidz

Z
zapytanie, 196
zczenie, 112
pene, 126
prawostronne, 124
wewntrzne, 114, 115, 116
kolejno tabel, 115
zewntrzne, 119, 120
FULL JOIN, 120, 127
FULL OUTER JOIN, 120
INNER JOIN, 120
kolejno tabel, 125
LEFT JOIN, 120, 121
LEFT OUTER JOIN, 120
RIGHT JOIN, 120, 124
RIGHT OUTER JOIN, 120
zwrotne, 129
zmienna, 160
znak
$$, 159
%, Patrz: znak procentu
*, Patrz: znak gwiazdki
/, 36
;, 29, 30

[ ], Patrz: znak nawias kwadratowy


^, Patrz: znak daszka
_, Patrz: znak podkrelenia
`, Patrz: znak akcentu sabego
||, 37
+, Patrz: znak plus
<, 84
<=, 84
=, Patrz: znak rwnoci
>, 84
>=, 84
akcentu sabego, 134
cudzysw, 134
daszka, 92
gwiazdki, 36, 103, 114, 117
nawias kwadratowy, 92
plus, 37
podkrelenia, 92
procentu, 90, 92
rwnoci, 71
rednika, 159
wieloznaczny, 89, 92
zwizek, 113

Upload dla
www.ebook4all.pl
by bloff

You might also like