Professional Documents
Culture Documents
Ksigarnia internetowa
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
Spis treci
Spis treci
Spis treci
Operator EXISTS . ........................................................ 146
Zastosowanie podzapytania do wyznaczenia wartoci kolumny obliczanej . ........ 147
Co dalej? . .............................................................. 148
Spis treci
Arkusze kalkulacyjne i tabele przestawne . ................................... 198
Co dalej? . .............................................................. 200
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
R OZ DZ I A 1
R ELACYJNE
BAZY DANYCH
I
SQL
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
HAVING, ktre stanowi sowa kluczowe w jego skadni. W rezultacie SQL ma charakter
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.
17
18
Rozdzia 1
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.
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.
19
20
Rozdzia 1
Imi
Nazwisko
Jan
Kowalski
Andrzej
Nowak
Anna
Kwiatkowska
Tabela Zamwienia:
IDZamwienia
IDKlienta
KwotaZamwienia
50,00
60,00
33,50
20,00
21
22
Rozdzia 1
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
bit
(brak)
int
int
number
43
decimal
decimal
number
58,63
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
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
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?
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
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.
27
28
Rozdzia 2
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
Imi
Nazwisko
ZakupionaIlo
Jan
Kowalski
Piotr
Nowak
10
Barbara
Kwiatkowska
Wybieranie kolumn
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
29
30
Rozdzia 2
Jeli chcesz wybra wicej ni jedn, ale nie wszystkie kolumny, instrukcja SELECT mogaby wyglda tak:
SELECT
Imi,
Nazwisko
FROM Klienci
Nazwisko
Jan
Kowalski
Piotr
Nowak
Barbara
Kwiatkowska
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.
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
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
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:
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
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
ZakupionaIlo
CenaZaSztuk
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
Imi
Nazwisko
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
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
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 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
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
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 ('
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
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
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
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;
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
W MySQL odpowiednikiem funkcji GETDATE jest funkcja NOW. W Oracle natomiast jest to funkcja
CURRENT_DATE.
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)
Wynik
DATEPART(month,2009-07-02)
DATEPART(day, 2009-07-02)
DATEPART(week, 2009-07-02)
27
DATEPART(weekday,2009-07-02)
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');
49
50
Rozdzia 4
Korzystanie z funkcji
Wynik
DATEDIFF(day,2009-07-08,2009-08-14)
37
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)
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)
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
710.000
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'
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
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
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
Kolor
Krzeso A
Czerwony
Krzeso B
Nieznany
Lampa C
Zielony
53
54
Rozdzia 4
Korzystanie z funkcji
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
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
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
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.
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.
57
58
Rozdzia 5
Sortowanie danych
zwraca wynik:
Imi
Nazwisko
Piotr
Nowak
Katarzyna
Dworniak
Jan
Kowalski
Adam
Kowalski
Nazwisko
Katarzyna
Dworniak
Adam
Kowalski
Jan
Kowalski
Piotr
Nowak
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
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.
59
60
Rozdzia 5
Sortowanie danych
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
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)
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 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
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
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
Format przeszukujcy
IDProduktu
Owoc
Warzywo
Jabko
Pomaracza
Przyprawa
OpisProduktu
Musztarda
Marchew
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
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.
70
Rozdzia 7
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
Nazwisko
ZakupionaIlo
Barbara
Kwiatkowska
Znaczenie
rwny
<>
rny
>
wikszy od
<
mniejszy od
>=
<=
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'
Nazwisko
Piotr
Nowak
71
72
Rozdzia 7
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
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
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
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.
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
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
Sprzedana ilo
Duma i uprzedzenie
15
Szkaratna litera
12
Kandyd
Sprzedana ilo
Romeo i Julia
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
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.
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
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
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
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
Wojewdztwo
ZakupionaIlo
Piotr Nowak
mazowieckie
10
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)
Na koniec dodajemy ostatni lini z klauzuli WHERE (ktra nie jest ujta w adnych nawiasach):
81
82
Rozdzia 8
Logika Boolea
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'
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'
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)
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
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
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')
Wojewdztwo
Jan Kowalski
pomorskie
Barbara Kwiatkowska
wielkopolskie
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')
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.
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.
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
Waga
Drukarka A
NULL
Drukarka B
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
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
TytuFilmu
To wanie mio
Dziewczyna Pitaszek
Mio i mier
Sodki dra
Do diaba z mioci
101 dalmatyczykw
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%'
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 %'
91
92
Rozdzia 9
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
[zbir_znakw]
[^zbir_znakw]
Imi
Nazwisko
Cary
Grant
Mary
Steenburgen
Jon
Voight
Dustin
Hoffman
John
Wayne
Gary
Cooper
Julie
Andrews
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'
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
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
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
Nazwisko
Cary
Grant
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.
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
Nazwisko
Jon
Voight
John
Wayne
95
96
Rozdzia 9
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
Nazwisko
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
R OZ DZ I A 10
D OKONYWANIE
PODSUMOWA
NOWE SOWA KLUCZOWE: DISTINCT, SUM, AVG, MIN, MAX,
COUNT, GROUP BY, HAVING
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
Let It Bleed
Monkey Man
Flowers
Ruby Tuesday
Paul McCartney
Ram
Smile Away
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
Album
Paul McCartney
Ram
The Beatles
Abbey Road
The Beatles
Revolver
Flowers
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
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
101
102
Rozdzia 10
Dokonywanie podsumowa
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'
Minimalna liczba
punktw za sprawdzian
Maksymalna liczba
punktw za sprawdzian
77
58
95
Funkcja COUNT
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'
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'
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
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
Praca domowa
86
Sprawdzian
77
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
W przeciwiestwie do Microsoft SQL Server i Oracle, w MySQL prba wykonania powyszej instrukcji nie
zakoczy si bdem, ale zwrcony zostanie niepoprawny wynik.
105
106
Rozdzia 10
Dokonywanie podsumowa
FROM Punktacja
GROUP BY OcenianaPraca, Ucze
ORDER BY OcenianaPraca, Ucze
Ucze
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
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'
Oceniana praca
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.
107
108
Rozdzia 10
Dokonywanie podsumowa
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
Kasia
71,5
Zuzia
93,5
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
Oceniana praca
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
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
R OZ DZ I A 11
Z CZENIA
WEWNTRZNE
TABEL
NOWE SOWA KLUCZOWE: INNER JOIN, ON
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
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
IDKlienta
ZakupionaIlo
CenaZaSztuk
2,50
10
1,25
12
1,50
4,00
113
114
Rozdzia 11
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
Nazwisko
Jan
Kowalski
2,50
Piotr
Nowak
10
1,25
Piotr
Nowak
12
1,50
Barbara Kwiatkowska 4
4,00
115
116
Rozdzia 11
Alternatywny sposb zdefiniowana zczenia wewntrznego, bez uycia sw kluczowych INNER JOIN i ON, jest nastpujcy:
SELECT *
FROM Klienci, Zamwienia
WHERE Klienci.IDKlienta = Zamwienia.IDKlienta
Imi
Nazwisko
ID zamwienia
Ilo
Cena
Jan
Kowalski
2,50
Piotr
Nowak
10
1,25
Piotr
Nowak
12
1,50
Barbara
Kwiatkowska
4,00
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
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
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.
Zczenia lewostronne
Imi
Nazwisko
Jan
Kowalski
Piotr
Nowak
Barbara
Kwiatkowska
Adam
Piotrowski
IDKlienta
DataZamwienia
KwotaZamwienia
2009-09-01
10,00
2009-09-02
12,50
2009-10-03
18,00
2009-09-15
20,00
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
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.
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.
123
124
Rozdzia 12
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
Nazwisko
Data zamwienia
Kwota zamwienia
Piotr
Nowak
2009-09-02
12,50
Barbara
Kwiatkowska
2009-09-15
20,00
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
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.
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
125
126
Rozdzia 12
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
brak kategorii
Forrest Gump
PG-13
Truman Show
PG
Klasyfikacja
OpisKlasyfikacji
PG
PG-13
NC-17
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
NULL
Bambi
NULL
Bezsenno w Seattle
Truman Show
Forrest Gump
Zagubieni w Ameryce
127
128
Rozdzia 12
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 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
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
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
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
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',
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
133
134
Rozdzia 13
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'
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 ().
135
136
Rozdzia 13
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
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
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
R OZ DZ I A 14
P ODZAPYTANIA
NOWE SOWA KLUCZOWE: EXISTS
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
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.
NazwaKlienta
Jan Kowalski
Piotr Nowak
Barbara Kwiatkowska
Adam Piotrowski
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
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
Jan Kowalski
22,25
Piotr Nowak
8,00
Barbara Kwiatkowska
Adam Piotrowski
141
142
Rozdzia 14
Podzapytania
FROM Zamwienia
WHERE SposbZapaty = 'Gotwka'
GROUP BY 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'
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
ZsumowanaKwotaZamwie
Jan Kowalski
22,25
Piotr Nowak
8,00
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')
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
Barbara Kwiatkowska
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
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)
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)
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
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
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
149
150
Rozdzia 15
Logika zbiorw
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
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.
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
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
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
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
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.
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
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
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: M ySQL
159
160
Rozdzia 16
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.
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.
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
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);
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.
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
163
164
Rozdzia 16
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
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
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')
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')
Wiersz zawierajcy dane tego klienta bdzie mia w tabeli nastpujc posta:
IDKlienta
Imi
Nazwisko
Wojewdztwo
Tomasz
Morawski
NULL
Wstawianie danych
Wojewdztwo
Nazwa1
Nazwa2
lskie
Zuzanna
Hodys
dolnolskie
Micha
Bielecki
lskie
Andrzej
Cendrowski
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
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
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
Wojewdztwo
KodPocztowy
pomorskie
77-131
lubelskie
21-515
mazowieckie
09-166
podkarpackie
36-221
dzkie
97-407
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)
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
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.
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 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) )
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)
R N I CE W R AM A CH IN NY CH BA Z DA NY CH: O racle
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
183
Rozdzia 19
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
2009-03-02
10
Test
wielokrotnego
wyboru
Nowak
Kowalski
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
185
186
Rozdzia 19
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
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.
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.
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
Wypowied pisemna
Wypowied pisemna
189
190
Rozdzia 19
Tabela Punktacja:
IDUcznia
IDTestu
ZdobytePunkty
17
45
38
88
191
192
Rozdzia 19
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?
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
R OZ DZ I A 20
S POSOBY
PREZENTACJI
DANYCH
195
196
Rozdzia 20
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.
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
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
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
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
DODATEK A
P RACA
Z BAZ DANYCH
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
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
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
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.
209
210
Dodatek B
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.
211
212
Dodatek C
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.
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
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
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
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
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
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
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
Upload dla
www.ebook4all.pl
by bloff