Professional Documents
Culture Documents
SQL. Rusz Głową! - Lynn Beighley
SQL. Rusz Głową! - Lynn Beighley
ISBN: 978-83-246-6059-9
All rights reserved. No part of this book may be reproduced or transmitted in any
form or by any means, electronic or mechanical, including photocopying, recording
or by any information storage retrieval system, without permission from the Publisher.
Wydawnictwo HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (księgarnia internetowa, katalog książek)
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie?sqlrug_ebook
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Printed in Poland.
„Są książki, które kupujemy, które zatrzymujemy, które trzymamy na biurku, a dzięki
wydawnictwu O’Reilly i zespołowi serii Rusz głową! jest także nowa kategoria książek:
książki Rusz głową!. Te książki są zniszczone, wymięte i zabieramy je wszędzie ze sobą.
SQL. Rusz głową! leży na samym wierzchu stosu książek na moim biurku. Ta książka,
nawet w formacie PDF, jest wystrzępiona i podarta”
„W tej książce język SQL nie został przedstawiony w sposób prosty — przedstawiono
go w sposób stanowiący wyzwanie, interesujący i zabawny. Autorom tej książki udało się
nawet znaleźć odpowiedź na odwieczne pytanie:
»W jaki sposób uczyć podzapytań nieskorelowanych tak, aby nie odebrać czytelnikowi
ochoty do życia«. Ta książka pokazuje właściwy sposób nauki — szybki, nieco
nonszalancki; a poza tym wygląda niesamowicie”
„Godna podziwu klarowność, humor i ogromna dawka fachowej wiedzy, jaką można znaleźć
w tej książce, sprawiają, że nawet osoby, które nie mają wiele wspólnego z programowaniem,
nie będą się obawiać rozwiązywania problemów”
— Cory Doctorow, współredaktor witryny Boing Boing, autor książek Down and Out in the
Magic Kingdom oraz Someone Comes to Town, Someone Leaves Town
„Jeśli sądziłeś, że Ajax jest technologią rakietową, to ta książka jest właśnie dla Ciebie.
Książka Head Rush Ajax. Edycja polska sprawi, że tworzenie dynamicznych, atrakcyjnych stron
WWW będzie w zasięgu każdego twórcy aplikacji internetowych”
„Dostałem tę książkę wczoraj, zacząłem ją czytać i… nie mogłem skończyć. Bez wątpienia jest
ona very fajna! Jest zabawna, a jednocześnie autorzy poruszają wiele zagadnień i prezentują
informacje dokładne i trafne. Jestem pod wrażeniem”
„Autorom książki Wzorce projektowe. Rusz głową! udało się połączyć zabawę, dużo śmiechu,
wyczerpujące i precyzyjne techniczne informacje oraz wiele praktycznych porad, dzięki czemu
stworzyli książkę, której lektura jest nie tylko zabawna, lecz także zmusza do zastanowienia
i przemyśleń. Niezależnie od tego, czy Czytelnik dopiero teraz zetknął się z wzorcami
projektowymi, czy też korzysta z nich od lat, na pewno skorzysta na odwiedzeniu Obiektowa”
„e książkę Head First HTML with CSS & XHTML. Edycja polska — uczy nas wszystkiego,
czego możemy potrzebować, w ciekawy i zabawny sposób”
„Jest szybka, nonszalancka, zabawna i zajmująca. Uważaj — możesz się czegoś nauczyć!”
— Ken Arnold, były starszy inżynier w Sun Microsystems, współautor (wraz z Jamesem
Goslingiem) książki The Java Programming Language
„Czuję się tak, jakby z mojej głowy zdjęto ciężar tysiąca książek”
„Ta książka, ze względu na sposób, w jaki łączy specjalistyczną wiedzę z łatwością lektury,
jest niemal doskonała. Jej treść jest przekonująca, a czyta się ją doskonale”
— Travis Kalanick, twórca sieci Scour i witryny Redswash, członek MIT TR100
]\PWZWN0MIL.QZ[\;94
Autorka książki SQL. Rusz głową!
ley
Lynn Beigh
Lynn Beighley
/\QQ chciałaby pisać fantastykę, lecz utknęła w ciele autorki
książek na tematy techniczne. Kiedy odkryła, że honoraria za
nntechniczne
książki is a fictionwystarczają
writer stuck
nain a technical
płacenie book writer’s
rachunków, nauczyłabody.
on discovering that technical book writing actually
się akceptować ten stan rzeczy i czerpać z niego radość. paid real
ney, she learned to accept and enjoy it.
Po powrocie do szkoły, gdzie chciała zdobyć tytuł magistra
r going back
informatyki, Lynnto school todla
pracowała getfirm,
a Masters
którychinnazwy
computer science, she
określane
są tajemniczo brzmiącymi akronimami NRL oraz LANL.
Jednak nadszedł czas, gdy Lynn odkryła Flasha i napisała Widok z okna Lynn
swój pierwszy bestseller.
Lynn miała niewłaściwe wyczucie czasu i przeniosła się do Doliny Krzemowej tuż przed wielkim
krachem. Spędziła kilka lat, pracując w firmie Yahoo!, pisząc książki i kursy treningowe. W końcu
jednak posłuchała swego twórczego, pisarskiego zacięcia i przeniosła się do Nowego Jorku, gdzie
obroniła tytuł magistra sztuk pięknych na kierunku kompozycji literackiej.
Jej praca magisterska w stylu książek Rusz głową! została przedstawiona pełnemu audytorium
profesorów i studentów. Odebrano ją bardzo dobrze, a Lynn obroniła tytuł, dokończyła książkę
SQL. Rusz głową! i wprost nie może się doczekać swego następnego projektu literackiego.
Lynn kocha podróże, gotowanie i tworzenie rozbudowanych opowieści o całkowicie nieznanych osobach.
I trochę boi się klownów.
*) Gra słów, w której „SQRL” to skrót od angielskiego słowa „squirrel” oznaczającego wiewiórkę – przyp. tłum.
8
Spis treści
W
Wprowadzenie
Twój mózg myśli o SQL-u. Czytając książkę, Ty starasz się czegoś nauczyć, natomiast
Twój mózg wyświadcza Ci przysługę, dbając o to, by te informacje nie zostały zbyt długo
w Twej głowie. Twój mózg myśli sobie: „Lepiej zostawić miejsce na jakieś ważne rzeczy, takie
jak: których dzikich zwierząt należy unikać albo czy jeżdżenie nago na snowboardzie jest
dobrym pomysłem, czy nie”. Zatem w jaki sposób możesz przekonać swój mózg, by uznał,
że poznanie SQL-a to dla Ciebie kwestia życia lub śmierci?
9
Spis treści
Dane i tabele
1
Na wszystko znajdzie się odpowiednie miejsce
Czy także i Ty nie cierpisz gubienia czegokolwiek? Niezależnie od tego, czy są to kluczyki
do samochodu, bon uprawniający do zakupu mieszkania z 25-procentową zniżką, dane używanej
aplikacji, nie ma nic gorszego niż niemożność sprostania własnym potrzebom… wtedy gdy tego
najbardziej potrzebujemy. A jeśli chodzi o używane aplikacje, to trzeba wiedzieć, że nie ma lepszego
miejsca na przechowywanie ważnych informacji niż tabele. A zatem przewróć kartkę i zacznij, krok
za krokiem, poznawać świat relacyjnych baz danych.
Definiowanie danych 38
Przeanalizuj swoje dane pod względem kategorii 43
Co znajduje się w bazie danych? 44
Twoja baza danych widziana przez rentgenowskie okulary… 46
Bazy danych zawierają powiązane ze sobą informacje 48
Tabele w zbliżeniu 49
Przejmij kontrolę! 53
Tworzenie tabeli: Polecenie CREATE TABLE 55
Tworzenie bardziej złożonych tabel 56
Przekonajmy się, jak łatwo można pisać kod SQL 57
Utwórzmy w końcu tabelę moje_kontakty 58
Twoja tabela jest gotowa 59
Spotkajmy się z niektórymi typami danych SQL 60
Twoja tabela bez tajemnic 64
Nie można ponownie stworzyć już istniejącej bazy danych lub tabeli! 66
Do kosza ze starą tabelą — czas na nową 68
Aby dodać dane do tabeli, będziesz musiał skorzystać z polecenia INSERT 70
Utworzenie polecenia INSERT 73
Wariacje na temat polecenia INSERT 77
Kolumny bez wartości 78
Zerknij na swoją tabelę, używając polecenia SELECT 79
SQL bez tajemnic: Wyznania wartości NULL 80
Twoja baza danych widziana
przez rentgenowskie okulary… Kontrola wewnętrznych wartości NULL 81
Wyobraź sobie bazę
NOT NULL pojawia się w wynikach polecenia DESC 83
danych jako pojemnik
zawierający informacje… Wypełnij pustkę słowem kluczowym DEFAULT 84
Przybornik SQL 86
kolumna1 kolumna2 kolumna3 kolumna4
dane kolumna5 kolumna6
Tabela. dane
dane
dane
dane
dane
dane dane dane
dane dane dane
dane dane dane
dane dane dane
dane dane dane
dane dane dane
To są kolumny.
kolumna3 kolumna4
kolumna1 kolumna2
dane dane
dane
Jeszcze
dane dane
dane dane kolumna1 kolumna2
dane kolumna3
la. dane dane
dane
inna tabe
dane dane dane dane
dane dane
dane dane dane dane
dane
dane dane
A to są kolumna1
kolumna2 dane dane
dane
dane
dane
wiersze. dane
dane
dane
dane
dane
dane
dane
dane dane
dane dane
dane dane dane
dane
dane
10
Spis treści
Polecenie SELECT
2
Pobieranie podarowanych danych
Czy naprawdę lepiej jest dawać, niż brać? W przypadku korzystania z baz danych
najprawdopodobniej częściej będziesz musiał pobierać z nich dane, niż je zapisywać. I właśnie w tych
wszystkich sytuacjach przydadzą Ci się informacje przedstawione w tym rozdziale: poznasz w nim
bardzo przydatne polecenie 6(/(&7 i dowiesz się, jak uzyskać dostęp do tych wszystkich ważnych
informacji, które wcześniej zapisywałeś w swoich tabelach. Co więcej, dowiesz się także, jak stosować
klauzulę :+(5( i operatory $1' i 25, by nie tylko pobierać dane, lecz wyświetlać te, które są Ci
potrzebne.
11
Spis treści
DELETE i UPDATE
3
Są szanse, że wszystko będzie w porządku
Cały czas zmieniasz zdanie? Teraz nie przysporzy Ci to najmniejszego problemu!
Dzięki poleceniom '(/(7( i 83'$7(, które poznasz w tym rozdziale, nie będziesz już dłużej musiał
ponosić konsekwencji decyzji podjętych pół roku temu, kiedy to zapisałeś w bazie dane o spodniach
w kształcie dzwonów, które właśnie z powrotem zaczynały być modne. Dzięki poleceniu 83'$7(
będziesz mógł zmieniać dane, natomiast polecenie '(/(7( pozwoli usnąć z bazy dane, które nie
będą Ci już dłużej potrzebne. Jednak w tym rozdziale nie tylko pokażemy Ci te dwa nowe polecenia
SQL, lecz także nauczymy, jak można używać ich w precyzyjny sposób, by przez przypadek nie usunąć
danych, które cały czas są potrzebne.
Czy Cię
przerażamy?
12
Spis treści
4
Po co być normalnym?
Dotychczas tworzyłeś tabele bez zwracania na nie szczególnej uwagi.
I wszystko było w porządku, tabele działały bez problemów. Mogłeś w nich zapisywać,
modyfikować, usuwać i pobierać dane. Jednak wraz ze zwiększaniem się ilości danych w tabelach
zaczniesz zauważać, że są rzeczy, które mogłeś zrobić wcześniej, by ułatwić sobie w przyszłości
tworzenie klauzul :+(5(. Innymi słowy, musisz znormalizować swoje tabele.
13
Spis treści
Polecenie ALTER
5
Korygowanie przeszłości
Czy kiedykolwiek marzyłeś, by mieć możliwość naprawiania błędów
popełnionych w przeszłości? Cóż, teraz masz taką możliwość. Dzięki poleceniu $/7(5
możesz zastosować wszystkie nowe wiadomości i doświadczenia, by zmodyfikować strukturę tabel
utworzonych kilka dni, miesięcy lub nawet lat wcześniej. Ale to jeszcze nie wszystko — możesz
to zrobić bez wprowadzania jakichkolwiek zmian w istniejących danych. Skoro tu dotarłeś,
zapewne już wiesz, co naprawdę oznacza normalizacja, i będziesz mógł zastosować tę wiedzę
do zapewnienia odpowiedniej struktury swym tabelom; tym starym i nowym.
14
Spis treści
6
Nowy sposób spojrzenia na dane
Nadszedł czas, byś dodał do swojego SQL-owego przybornika nieco finezji.
Już wiesz, jak pobierać dane przy użyciu polecenia 6(/(&7 i klauzuli :+(5(. Jednak czasami
będziesz potrzebował nieco większej precyzji niż ta, jaką one zapewniają. W tym rozdziale dowiesz
się o określaniu kolejności oraz grupowaniu danych, jak również o wykonywaniu operacji
matematycznych na wynikach zapytań.
15
Spis treści
7
Wyrastamy z naszych starych tabel
Kiedyś może nadejść moment, gdy pojedyncza tabela przestanie Ci
wystarczać. Twoje dane stały się bardziej złożone i jedna tabela, której do tej pory używałeś, nie jest
już w stanie sprostać Twoim potrzebom. W tabeli jest bardzo dużo powtarzających się, nadmiarowych
informacji, które niepotrzebnie zajmują miejsce na dysku i spowalniają zapytania. Wytrwałeś, używając
tej jednej tabeli, tak długo, jak to było możliwe. Jednak świat, w którym żyjemy, jest ogromny
i czasami potrzeba będzie więcej niż jednej tabeli, by zapisać wszystkie dane, zapanować nad nimi
i w ostatecznym rozrachunku cały czas być panem własnej bazy danych.
zainteresowania zainteresowania
id_zainteresowania
zainteresowanie
16
Spis treści
8
Czy nie możemy się wszyscy dogadać?
Witam w skomplikowanym świecie wielu tabel. Wspaniale jest mieć w bazie więcej
niż jedną tabelę, jednak abyś mógł się nimi posługiwać, będziesz musiał poznać nowe narzędzia
i techniki. Jednoczesne korzystanie z wielu tabel może być kłopotliwe, dlatego też, by wszystko
było jasne, będziesz potrzebował nazw zastępczych (nazywanych także „aliasami”). Oprócz tego
złączenia pomogą Ci połączyć tabele, dzięki czemu będziesz mógł korzystać ze wszystkich danych,
zapisanych w wielu różnych miejscach. Przygotuj się — teraz ponownie odzyskasz pełną kontrolę
nad swoją bazą danych.
17
Spis treści
Podzapytania
9
Zapytania w zapytaniach
Janie, dwuczęściowe zapytanie, proszę. Złączenia są wspaniałe, jednak czasami musisz
zadać swojej bazie danych więcej niż jedno zapytanie. Bądź użyć wyników jednego zapytania
jako danych wejściowych dla drugiego. I właśnie w takich sytuacjach przydają się podzapytania.
Pozwolą Ci one uniknąć powielania danych, sprawią, że Twoje zapytania staną się bardziej
dynamiczne, a może nawet pozwolą się wkręcać na koncerty i przyjęcia dla wyższych sfer.
(No, na to ostatnie bym nie liczyła, ale dwa punkty z trzech to i tak nieźle).
Zapytanie zewnętrzne.
6(/(&7MDNDVBNROXPQDLQQDBNROXPQD
Zapytanie wewnętr
)520WDEHOD zne.
:+(5(NROXPQD 6(/(&7NROXPQD)520WDEHOD
18
Spis treści
10
Nowe manewry
To wszystko, czego do tej pory dowiedziałeś się o złączeniach, to jedynie
pół prawdy na ich temat. Widziałeś już złączenia krzyżowe tworzące wszystkie możliwe pary
rekordów pochodzących z dwóch tabel oraz złączenia wewnętrzne zwracające jedynie pasujące
do siebie rekordy obu tabel. Nie spotkałeś się jeszcze natomiast ze złączeniami zewnętrznymi,
zwracającymi także te wiersze, które nie mają pasujących odpowiedników w drugiej tabeli,
złączeniami zwrotnymi, które łączą tabelę z nią samą, oraz uniami, które scalają wyniki z kilku
różnych zapytań. Kiedy poznasz te wszystkie sztuczki, będziesz w stanie pobierać dane z bazy
dokładnie w taki sposób, jaki będzie Ci potrzebny. (Nie zapomnimy także ujawnić całej szokującej
prawdy o podzapytaniach!).
które
anowiska,
W wynikach całego Wszelkie st zwróconych
polecenia zostan w wynikach
ą wyświetlone występują ta ni a, nie zostaną
tylko te wiersze za py
z pierwszego przez oba ch całego
e w wynika
zapytania, które
nie występują uwzględnion
w drugim zapyta po lec en ia .
niu.
19
Spis treści
11
Zbyt wielu kucharzy psuje bazę danych
Twoje bazy danych rozrosły się i muszą z nich korzystać także inne osoby.
Problem polega na tym, że niektóre z nich nie będą znały języka SQL równie dobrze jak Ty. Musisz
zatem mieć jakieś sposoby, by uniemożliwić im wprowadzanie nieprawidłowych danych, techniki
pozwalające ukryć przed nimi wybrane dane oraz mechanizmy, które uchronią te osoby przed
wzajemnym przeszkadzaniem sobie, gdy jednocześnie będą modyfikować zawartość bazy.
W tym rozdziale zaczniemy ochraniać nasze dane przed błędami popełnianymi przez inne osoby.
Witamy w Bazie Obronnej, w części 1.
20
Spis treści
Bezpieczeństwo
12
Zabezpieczanie swych dóbr
Włożyłeś niezwykle dużo wysiłku i czasu w utworzenie swojej bazy danych.
I na pewno byłbyś zdruzgotany, gdyby przydarzyło się jej coś złego. Jednak musisz zapewnić dostęp
do swoich danych innym osobom i obawiasz się, że mogłyby zapisać w bazie niewłaściwe dane lub,
co gorsza, usunąć nie te dane, które powinny. Na szczęście w tym rozdziale dowiesz się, w jaki
sposób można dodatkowo zabezpieczyć bazę danych oraz obiekty w niej umieszczone oraz w jaki
sposób uzyskać pełną kontrolę nad tym, kto i jakie operacje na bazie może wykonywać.
21
Spis treści
Pozostałości
A
Dziesięć najważniejszych zagadnień
(których nie opisaliśmy wcześniej)
Nawet po tym wszystkim jest jeszcze coś więcej. Jest jeszcze dosłownie kilka rzeczy,
o których, jak sądzimy, powinieneś wiedzieć. Nie czulibyśmy się w porządku, gdybyśmy je całkowicie
zignorowali i nie poświęcili im choćby krótkiej wzmianki. A zatem: nim będziesz mógł odłożyć tę
książkę na półkę, przeczytaj o tych drobnych, lecz ważnych sprawach.
Poza tym kiedy skończysz lekturę tego dodatku, pozostaną Ci jeszcze dwa następne… oraz indeks…
no i może jeszcze jakieś reklamy… a potem już naprawdę skończysz. Obiecujemy!
$%62/87($&7,21$''$'0,1$)7(5$**5(*$7($/,$6$//$//2&$7($/7(5$1'$1<$5(
$
$55$<$6$6&$66(57,21$7$87+25,=$7,21
% %()25(%(*,1%,1$5<%,7%/2%%22/($1%27+%5($'7+%<
&$//&$6&$'(&$6&$'('&$6(&$67&$7$/2*&+$5&+$5$&7(5&+(&.&/$66&/2%&/26(
&2//$7(&2//$7,21&2/801&200,7&203/(7,21&211(&7&211(&7,21&21675$,17
& &21675$,176&216758&725&217,18(&255(6321',1*&5($7(&5266&8%(&855(17
&855(17B'$7(&855(17B3$7+&855(17B52/(&855(17B7,0(&855(17B7,0(67$03&855(17B
86(5&85625&<&/(
'$7$'$7('$<'($//2&$7('(&'(&,0$/'(&/$5('()$8/7'()(55$%/('()(55(''(/(7(
' '(37+'(5()'(6&'(6&5,%('(6&5,3725'(6752<'(6758&725'(7(50,1,67,&',&7,21$5<
',$*1267,&6',6&211(&7',67,1&7'20$,1'28%/('523'<1$0,&
( ($&+(/6((1'(1'B(;(&(48$/6(6&$3((9(5<(;&(37(;&(37,21(;(&(;(&87((;7(51$/
) )$/6()(7&+),567)/2$7)25)25(,*1)281')520)5(()8//)81&7,21
* *(1(5$/*(7*/2%$/*2*272*5$17*5283*5283,1*
+ +$9,1*+267+285
,'(17,7<,*125(,00(',$7(,1,1',&$725,1,7,$/,=(,1,7,$//<,11(5,1287,1387
,
,16(57,17,17(*(5,17(56(&7,17(59$/,172,6,62/$7,21,7(5$7(
- -2,1
. .(<
/$1*8$*(/$5*(/$67/$7(5$//($',1*/()7/(66/(9(//,.(/,0,7/2&$//2&$/7,0(
/
/2&$/7,0(67$03/2&$725
0 0$30$7&+0,187(02',),(602',)<02'8/(0217+
1 1$0(61$7,21$/1$785$/1&+$51&/2%1(:1(;712121(12718//180(5,&
2%-(&72)2))2/'2121/<23(123(5$7,21237,212525'(525',1$/,7<287287(5
2
287387
3$'3$5$0(7(53$5$0(7(563$57,$/3$7+3267),;35(&,6,2135(),;35(25'(535(3$5(
3
35(6(59(35,0$5<35,2535,9,/(*(6352&('85(38%/,&
4
5($'5($'65($/5(&856,9(5()5()(5(1&(65()(5(1&,1*5(/$7,9(5(675,&75(68/7
5
5(78515(785165(92.(5,*+752/(52//%$&.52//835287,1(52:52:6
6$9(32,176&+(0$6&52//6&23(6($5&+6(&21'6(&7,216(/(&76(48(1&(6(66,21
6(66,21B86(56(76(766,=(60$//,17620(63$&(63(&,),&63(&,),&7<3(64/
6
64/(;&(37,2164/67$7(64/:$51,1*67$5767$7(67$7(0(1767$7,&6758&785(
6<67(0B86(5
7$%/(7(0325$5<7(50,1$7(7+$17+(17,0(7,0(67$037,0(=21(B+2857,0(=21(B0,187(
7
7275$,/,1*75$16$&7,2175$16/$7,2175($775,**(5758(
8 81'(581,2181,48(81.12:1811(6783'$7(86$*(86(586,1*
9 9$/8(9$/8(69$5&+$59$5,$%/(9$5<,1*9,(:
: :+(1:+(1(9(5:+(5(:,7+:,7+287:25.:5,7(
;
< <($5
= =21(
22
Spis treści
Instalacja MySQL-a
B
Spróbuj to zrobić sam
Cała zdobyta przez Ciebie wiedza i umiejętności nie na wiele się zdadzą, jeśli
nie wykorzystasz ich w praktyce. W tym dodatku znajdziesz instrukcje dotyczące instalacji
swojego własnego serwera MySQL, którego będziesz mógł używać do zabawy i pracy.
Przypomnienie narzędzi
C
Wszystkie nowe narzędzia SQL
W tym dodatku, w jednym jedynym miejscu, zostały po raz pierwszy zebrane
wszystkie podpowiedzi dotyczące SQL-a… ale będą tu tylko przez jedną noc
(żartujemy)! Znajdziesz tu podsumowanie wszystkich porad i informacji o SQL-u, jakie zamieściliśmy
w całej książce. Poświęć chwilkę, by przejrzeć listę, i rozkoszuj się poczuciem dumy — już znasz
SE
wszystkie te rady i informacje.
DATABA
CREATE do
o polecenia ,
Używaj teg całej bazy danych
a
utworzeni zawierać wszystkie
zie
która będ .
ele
Twoje tab
DELETE
To narzędzi
e,
używać do usuktórego możesz
Symbole 576
z tabeli. Sto wania wierszy
suj w nim klau
WHERE, by zulę
prec
określać wier yzyjnie
sze, których
się pozbyć. chcesz
S
eś także ez
ryc do tabeli
war
nie podana
. wiersze z obu tabel w żade ależne po wane
Powinien kolumny, w któ ści jaw
ć rto nie zostan
ie i wykorzystujące jakiś do za n sposób dzapytan
i wskaza występować wa o, pytani ni ie
a zew e odwołu , które
nie mogą przykład dlategsze
NULL, na oby to później danych. KRZYŻO
WE
warunek logiczny.
nętrzn je
ego. się Skorowidz 583
nił
że utrud anie i sortowanie kolumn Złączenie IN)
JO
wyszukiw tworzenia takich h słów DROP TABLE (CROSS z pierwszej
Złączenie
nic dy wiersz i RÓŻN RÓWNOŚC
Podczas musiał użyć w To polecenie pozwala usunąć Zwraca każ ony kolejno OŚCIOW IOWE
. E
będziesz ch NOT NULL tabelę z bazy, na przykład
ącz
tabeli, poł rszem z drugiej a To dwa
ro
kluczowy z każdym
wie wielom wewnętr dzaje złączeń
w sytuacji, gdy tworząc ją, Zn ane także pod jak: zn
zwraca ych. Pierwsz
tabeli. wami, tak
imi wi
popełnisz jakiś błąd. Jednak
innymi naz KARTEZJAŃSK
IE równe, ersze, które y z nich
a są
powinieneś z niego korzystać,
ZŁ ĄC ZE NIE Z od siebie drugi wiersze sobie
jeszcze zanim zaczniesz dodawać ZENIE BE różne. , które
do tabeli dane przy użyciu oraz ZŁĄC . są
polecenia INSERT. ZŁĄCZENIA
23
24
-DNNRU]\VWDÊ]WHMNVLÈĝNL
Wprowadzenie
Nie mogę uwierzyć, że
umieścili takie rzeczy
w książce o SQL-u!
amy na palące
W tej części odpowiad orzy UMIEŚCILI
pytani e: „Dl acz ego aut
książce
te wszystkie rzeczy w
o języku SQ L?”
Jak korzystać z tej książki
3 Boisz się spróbować czegoś innego? Wolałbyś raczej poddać się leczeniu
kanałowemu niż połączyć paski z kratą? Nie wierzysz, że książka techniczna
może być poważna, jeśli pojęcia programistyczne będą personifikowane?
26 Wprowadzenie
Wprowadzenie
„Czy w taki sposób można się czegokolwiek nauczyć?” Twój mózg myśli, że
właśnie TO jest istotn
e.
W jaki sposób Twój mózg wie, co jest istotne? Załóżmy, że jesteś na codziennej
przechadzce i nagle przed Tobą staje tygrys, co się dzieje wewnątrz Twej głowy i ciała?
W dzisiejszych czasach jest mało prawdopodobne, abyś stał się przekąską dla tygrysa.
Ale Twój mózg wciąż obserwuje. W końcu nigdy nic nie wiadomo.
Wspaniale.
Neurony płoną. Emocje szaleją. Adrenalina napływa falami. Pozostało jeszcze jedynie
560 głupich, nudnych
I właśnie dlatego Twój mózg wie, że… i drętwych stron.
jesteś tutaj 27
Jak korzystać z tej książki
nie.
NKXO
krot
NKXO
dwu
NKXO NKXO
UYV_WXK UYV_WXK
UYV_WXK UYV_WXK
NKXO NKXO
NKXO NKXO
NKXO NKXO
NKXO UYV_WXK UYV_WXK UYV_WXK
NKXO NKXO
NKXO NKXO NKXO NKXO
NKXO NKXO
cje.
NKXO NKXO
NKXO NKXO NKXO NKXO
zi mi
NKXO NKXO
śmieszny? Chod
NKXO NKXO NKXO
końcowych
NKXO NKXO
NKXO
cię
o to, czy śmieszę
e, jeśli treść
studenci uzyskiwali wyniki o 40% lepsz jako klown?
dni, w pierwszej osobie i w konwencji
była przekazywana w sposób bezpośre aj
iast wykładać, opowiadaj historyjki. Używ
rozmowy, a nie w sposób formalny. Zam y byłb yś bard ziej uważny: podczas
osoby zbyt poważnie. Kied
zwyczajnego języka. Nie traktuj swojej ?
podczas wykładu
stymulującej rozmowy przy obiedzie czy
zmusisz neuronów
anowienia się. Innymi słowy, jeśli nie
Zmuś uczniów do głębszego zast
zdar zy się nic wielkiego. Czytelnik mus i być zmotywowany, zaangażowany,
Two jej głow ie nie
do aktywne go wysi łku, w i zdobywaniem nowej wiedzy.
ny rozw iązyw aniem problemów, wyciąganiem wniosków
zacie kaw iony i pode kscy towa ie ćwiczeń i pytań zmuszających do
liwe poprzez stawianie wyzwań, zadawan
A osiągnięcie tego wszystkiego jest moż któr e wymagają zaangażowania obu półkul
mózgowych i wielu zmysłów.
popr zez zmu szan ie do dział ań,
zastanowienia oraz
Każdy znalazł się kiedyś w sytuacji,
— uwa gę i zainteresowanie czytelnika.
Zdobądź — prz ycią gnij na dłuż ej
g zwraca uwagę na rzeczy niezwykłe,
zyć, lecz zasy piał po przeczytaniu pierwszej strony. Móz
gdy bard zo chcia ł się czeg oś nauc ego technicznego zagadnienia wcale nie
k, nieoczekiwane. Jednak poznawanie now
interesujące, dziwne, przykuwające wzro sobie znacznie szybciej.
nie interesujące, Twój mózg przyswoi je
musi być nudne. Jeśli będzie to zagadnie
Wyzwól emocje. Teraz już wiemy,
że zdolność zapamiętywania
ze zależ na od ich zawartości emocjonalnej.
informacji jest w znacznej mier
Zapamiętujemy w sytuacjach,
Zapamiętujemy to, na czym nam zależy.
nie mamy tu na myśli wzruszających
w których coś odczuwamy. Oczywiście
o emocje
historii o chłopcu i jego psie. Chodzi nam
sne pode kscy towanie,
takie jak zaskoczenie, ciekawość, rado
em wielk i!” — jakie
„a niech to…” i uczucie satysfakcji — „Jest
iu zagadki, nauczeniu się czegoś,
odczuwamy po poprawnym rozwiązan
zdaniu sobie sprawy, że znamy więcej
co powszechnie uchodzi za trudne, lub
u inżynierii.
szczegółów technicznych niż Robert z dział
28 Wprowadzenie
Wprowadzenie
Jednak zakładamy, że jeśli trzymasz w ręku tę książkę, to chcesz nauczyć się SQL-a.
I prawdopodobnie nie chcesz na to stracić zbyt wiele czasu. Jeśli chcesz zapamiętać
wszystkie zdobyte informacje, musisz je wcześniej zrozumieć. Aby w jak największym
stopniu skorzystać z tej książki, bądź z jakiejkolwiek innej książki, lub z dowolnych prób
uczenia się czegokolwiek, musisz wziąć odpowiedzialność za swój mózg. Myśl
o tym, czego się uczysz.
Można to zrobić w sposób wolny i męczący lub szybki i bardziej efektywny. Wolny sposób polega na wielokrotnym
powtarzaniu. Oczywiście wiesz, że jesteś w stanie nauczyć się i zapamiętać nawet najnudniejsze zagadnienie, mozolnie
je „wkuwając”. Po odpowiedniej liczbie powtórzeń Twój mózg stwierdzi: „Wydaje się, że to nie jest dla niego
szczególnie ważne, lecz w kółko to czyta i powtarza, więc przypuszczam, że jakąś wartość to jednak musi mieć”.
Szybszy sposób polega na zrobieniu czegokolwiek, co zwiększy aktywność mózgu, a najlepiej czegoś, co wyzwoli kilka
różnych typów aktywności. Wszystkie zagadnienia, o których pisaliśmy na poprzedniej stronie, są kluczowymi
elementami rozwiązania i udowodniono, że wszystkie z nich potrafią pomóc w zmuszeniu mózgu, aby pracował
na Twoją korzyść. Badania wykazują na przykład, że umieszczenie słów na opisywanych rysunkach (a nie w innych
miejscach tekstu na stronie, na przykład w nagłówku lub wewnątrz akapitu) sprawia, że mózg stara się zrozumieć
relację pomiędzy słowami i rysunkiem, a to z kolei zwiększa aktywność neuronów. Większa aktywność neuronów
to z kolei większe szanse, że mózg uzna informacje za warte zainteresowania i, ewentualnie, zapamiętania.
Prezentowanie informacji w formie konwersacji pomaga, gdyż ludzie zdają się wykazywać większe zainteresowanie
w sytuacjach, gdy uważają, że biorą udział w rozmowie, gdyż oczekuje się od nich, że będą śledzić jej przebieg i brać
w niej czynny udział. Zadziwiające jest, iż mózg zdaje się nie zważać na to, że rozmowa jest prowadzona z książką!
Z drugiej strony, jeśli sposób przedstawiania informacji jest formalny i suchy, mózg postrzega to tak samo jak
w sytuacji, gdy uczestniczysz w wykładzie na sali pełnej sennych słuchaczy. Nie ma potrzeby wykazywania jakiejkolwiek
aktywności.
jesteś tutaj 29
Jak korzystać z tej książki
Lewostronne złączenie
zewnętrzne
Używaliśmy rysunków, ponieważ Twój mózg zwraca większą uwagę na obrazy niż na tekst. Prawa tabela
Jeśli chodzi o mózg, to faktycznie jeden obraz jest wart 1024 słów. W sytuacjach, gdy pojawiał się
zarówno tekst, jak i rysunek, umieszczaliśmy tekst na rysunku, gdyż mózg działa bardziej
efektywnie, gdy tekst jest wewnątrz czegoś, co opisuje, niż kiedy jest umieszczony w innym
miejscu i stanowi część większego fragmentu tekstu.
Stosowaliśmy powtórzenia: wielokrotnie podawaliśmy tę samą informację na różne sposoby
i przy wykorzystaniu różnych środków przekazu oraz odwoływaliśmy się do różnych zmysłów.
Wszystko po to, aby zwiększyć szanse, że informacja zostanie zakodowana w większej ilości
obszarów Twojego mózgu.
Używaliśmy pomysłów i rysunków w zaskakujący sposób, ponieważ Twój mózg oczekuje ]DEDZNL]DEDZND FKORSF\FKORSLHF
i pragnie nowości; poza tym staraliśmy się zawrzeć w nich chociaż trochę emocji, gdyż mózg zabawka chlopiec
hula-hoop Darek
jest skonstruowany w taki sposób, iż zwraca uwagę na biochemię związaną z emocjami.
model szybowca Bartek
Prawdopodobieństwo zapamiętania czegoś jest większe, jeśli to „coś” sprawia, że coś poczujemy,
żołnierzyki Daniel
nawet jeśli to uczucie nie jest niczym więcej niż lekkim rozbawieniem, zaskoczeniem lub harmonijka Rysiek
zainteresowaniem. karty z piłkarzami
30 Wprowadzenie
Wprowadzenie
jesteś tutaj 31
Jak korzystać z tej książki
Przeczytaj to
To książka do nauki, a nie encyklopedia. Celowo usunęliśmy wszystko, co mogłoby Ci
przeszkadzać w nauce, niezależnie od tego, nad czym pracujesz w danym miejscu książki.
Podczas pierwszej lektury książki należy zaczynać od jej samego początku, gdyż kolejne
rozdziały bazują na tym, co widziałeś i czego się dowiedziałeś wcześniej.
32 Wprowadzenie
Wprowadzenie
Ćwiczenia SĄ obowiązkowe.
Ćwiczenia oraz wszelkie dodatkowe polecenia nie są jedynie dodatkami — stanowią integralną
część podstawowej treści książki. Niektóre z nich zostały umieszczone po to, by pomóc
w zapamiętaniu informacji, inne, by pomóc w zrozumieniu opisywanego materiału, a jeszcze
inne — by pomóc Ci w praktycznym zastosowaniu zdobytej wiedzy. Nie pomijaj ich!
jesteś tutaj 33
Zespół recenzentów
St
Ste ve Mi
eve lannoo
Mila
Maazzza za
LLuAnn M
Chauc
Chaucerer helped
too. pomagał
również
Ogromne podziękowania należą się naszemu zespołowi ani nie gra punk rocka ze swoją kapelą Onion Flavored Rings
recenzentów. Wychwycili ono masę rażących błędów, w jakichś dusznych piwnicach, to można go znaleźć w domu
błędów subtelnych oraz marnych błędów literowych. z jego dwoma kotami Ralphem i Squeakiem.
Bez nich niniejsza książka byłaby nieporównywalnie gorsza.
Wykonali wspaniałą robotę, jeśli chodzi o odnajdywanie ķ6KHOOH\ĵ0RLUD0LFKHOOH5KHDPV jest magistrem
i usuwanie błędów. pedagogiki, ma tytuły MCP, MCSE i prowadzi Early
Childhood Education Program (program wczesnego
&DU\&ROOHWW wykorzystał podczas poprawiania tej książki nauczania) w Delgado Community College w West Bank
swoje 15-letnie doświadczenia wyniesione z pracy z literackimi Campus w Nowym Orleanie. Obecnie fascynuje się
nowicjuszami w laboratoriach rządowych i ostatnio w sektorze tworzeniem kursów edukacyjnych prowadzonych w internecie,
finansowym, i teraz z radością oczekuje na chwilę, kiedy które sprostałyby nowym wymaganiom mieszkańców miasta
znów będzie się mógł zająć sprawami niezwiązanymi odbudowującego się po huraganie Katrina. Dziękujemy Ci
z pracą zawodową, takimi jak: gotowanie, spacery, czytanie za to, że zdołałaś umieścić pracę nad tą książką w swoim
i terroryzowanie swoich psów. i tak przepełnionym terminarzu.
/X$QQ0D]]Dznalazła nieco czasu mimo swojej pracy -DPLH+HQGHUVRQ jest starszym architektem systemów;
zawodowej w Illinois, gdzie pracuje jako programistka ma fioletowe włosy i dzieli swój wolny czas pomiędzy grę na
i analityk, by pisać bardzo cenne i celne recenzje. Cieszymy wiolonczeli, czytanie, gry wideo i oglądanie filmów na DVD.
się, że już będzie mieć nieco więcej czasu na swoje hobby,
takie jak jazda na rowerze, fotografia, komputery, muzyka To właśnie dzięki temu fantastycznemu zespołowi przykłady
czy też tenis. i ćwiczenia zamieszczone w tej książce faktycznie będą robić
to, co powinny, a Ty po skończeniu lektury będziesz bardzo
Kiedy6WHYH0LODQR nie programuje w jednym dobrym i pewnym siebie programistą SQL. Ich dbałość o detale
z przynajmniej kilku języków, co jest jego codziennym sprawiła, że byliśmy mniej przemądrzali i protekcjonalni,
zajęciem, ani nie recenzuje książki SQL. Rusz głową!, a czasami nawet nie aż tak bardzo „zakręceni”.
34 Wprowadzenie
Wprowadzenie
Podziękowania
Moim redaktorom:
Z powodu niesłychanego pecha, jaki miałam pod koniec prac redakcyjnych nad tą
książka, redaktor &DWKHULQH1RODQ ma teraz olbrzymi wrzód. To tylko dzięki niej
ta książka nie ukazała się w roku 2008, a może lepiej byłoby powiedzieć, że tylko
dzięki niej w ogóle się ukazała. Sytuację, jaka zaistniała pod koniec prac, można
by porównać z żonglowaniem kociakami, ale Catherine nie upuściła ani jednego.
Strasznie były mi potrzebne wyznaczone terminy, a ona doskonale sobie z tym
poradziła. Sądzę, że byłam jej największym zawodowym wyzwaniem. Mam nadzieję,
że jej następny projekt będzie realizowany znacznie sprawniej i spokojniej; bardzo
Mary O’Brien sobie na to zasłużyła.
Catherine Nolan
W wydawnictwie O’Reilly:
Redaktor projektu, /RXLVH%DUU, była nie tylko wspaniałą przyjaciółką, lecz także
doskonałą projektantką grafiki. W jakiś tajemniczy sposób była w stanie przekształcić
moje szalone pomysły w imponujące rysunki, które cudownie wyjaśniały nawet bardzo
trudne pojęcia. Wszystkie te wspaniałe projekty graficzne zdobiące książkę są jej
autorstwa i nie mam najmniejszych wątpliwości, że w wielu miejscach tej książki także
Ty będziesz chciał jej podziękować.
Niemniej jednak ta książka trafiłaby do druku z całą masą błędów, gdyby nie korekta
techniczna, którą przeprowadził 6DQGHUV.OHLQIHOG. Wykonał on wspaniałą
robotę jako redaktor wykonawczy i przygotował tę książkę do druku. Oprócz tego
Sanders wyszedł znacznie poza zakres swych obowiązków i wskazał kilka pojęciowych
Lou Barr
przepaści, których krawędzie trzeba było ze sobą połączyć.
I w końcu chciałabym podziękować .DWK\6LHUUD oraz %HUWRZL%DWHVRZL za stworzenie tej wspaniałej serii
książek oraz za najlepszy i najbardziej wyzywający duchowo trening, jaki przeszłam na obozie szkoleniowym Rusz
głową!. Nawet nie chcę myśleć, o ile trudniej byłoby mi napisać tę książkę, gdyby nie te trzy dni. Poza tym ostatnie
redakcyjne komentarze Berta były boleśnie trafne i w ogromnym stopniu wpłynęły na jakość książki.
jesteś tutaj 35
36 Wprowadzenie
'DQHLWDEHOH
Na wszystko znajdzie się
odpowiednie miejsce
Kiedyś wszystkie
informacje o moich pacjentach notowałam
na papierze, lecz ciągle gubiłam te notatki.
W końcu nauczyłam się SQL-a i teraz
już nikt mi się nie gubi. Trochę wiedzy
o tabelach jeszcze nikomu
nie zaszkodziło!
Definiowanie danych
Grzegorz zna wiele samotnych osób. Lubi notować sobie informacje
o zainteresowaniach swoich przyjaciół i poznawać ich ze sobą. Grześ ma
bardzo dużo informacji o swoich znajomych, zapisanych na samoprzylepnych
karteczkach, takich jak te przedstawione poniżej:
Dani
el
Data Rysiński
urod
Proje zin:
ktan 13.0
Bez t stron 6.19
pary WWW 80
Wejh
erow
dand o
ys@
Zain m ojage
t
czas eresowan s.com.pl
u
słuch na świe ia: aktyw
goto anie mu żym pow ne spęd
wani zyki, ie za
Posz e podr trzu, czy nie
ukuj ó żowa t
e: pr nie, anie,
zyjac
iół i
dziew
czyn
y
38 Rozdział 1.
Dane i tabele
kilka
o j e dynie otatek
T ód n
spośrśka
G r z e 0LNXOVNL-DQH
7NDF]0DUW\QD
GDWDXURG]HQLD /HZDQGRZLF]%DUEDUD QD
N 5DF]\ĚVND$Q
GDWDXURG]HQL .XEDVNL0LâRV] GDWDXURG]HQLD LD
RQLND D SDQQD GDWDXURG]HQ
=HÀUHN0 ]HQLD İRQDW\
GDWDXURG]HQLD
SDQQD
3LHNDUVND.DVLD
XU RG OHNDU]SHGLDWUD ]DPĐİQD
.XEDVNL$QGU]HM GDWD XF]HĚ GDWDXURG]HQL
D
D XU]Đ GQLN SRF]WRZ\ :URFâDZ SLHOĐJQLDUND SUH]HV
GDWDXURG]HQLD ]DPĐİQ :DUV]DZD ]DPĐİQD
DUND 3R]QDĚ PSWNDF]#RHX :URFâDZ
SURMHNWDQWVWURQ::: G]LHQQLN
GMBPLOR#QIDODIP
NVLĐ .UDNyZ
PLNXQHN#ZSS EEDVND#SL]]DQ]NFRPSO JRZD PEL]QHVHX
SO O ]DLQWHUHVRZDQLDWXU\VW\NDPRGD ]DLQWHUHVRZDQLDPRWRU\]DFMD DUDF]\QVND#
NDZDOHU 7\FK\ ]NFRP .DWRZLFH QLDSV\FKROR
JLD
#SL]]DQ ND NLQRWHOHZL]MDP ÀWQHVV PX]\NDWDQLHF NVLċİNLPRGDSRH]MDJRWRZDQLH ]DLQWHUHVRZD
1RZDN-RDQQDPRQLD]H XU \V W\ RWRU \]DFMD.RZDOVNL0LUHN %LOHFNL- P\VL
DQXV]DBNDVLD#RH
.XEDVNLB$QGU]HM#SL]]DQ]NFRPSO UVWZRW SRV]XNXMHWRZDU]\VWZDQDLPSUH]\ X yİH
GDWDXURG]HQLDNVLċİNLİHJOD SRV]XNXMHQR
ZHMSUDF\ GDWD XURG]HQLD
SRV]XNXMHV\PSDWLLSU]\MDFLyâWR SRV]XNXMHQRZHMSUDF\GDWDXUR G]HQLD
]DLQWHUH
SRGU
WDNWyZ
MRP\FK
] QD SDUWQHUD ZDU]\VWZDQDLPSUH]\ VRZDQLD
İHJO DUVW XNXM H]Q DMRP\FKNRQ
]DLQWHUHVRZDQLDNVLċİNLNLQR ZRÀWQH SRV]
VHNUHWDUND SRV]XNXMH NDZDOHU NDZDOHU JRWRZDQLH VV FK 1HUF]\ĚVNL3LRWU
WHOHZL]MD
.RZDOVND=RVLD PLĐG]\OXG]NL GDWDXURG]HQLD
D KDQGORZLHF PRWRUQLF]\ SRV]XNXMHQR
SDQQD VND0DUW ZHMSUDF\SU
SRV]XNXMHQRZHMSUDF\WRZDU]\VW .DUF]\Ě 2OLYL HQ HU
LDD)DG GDWDXURG]HQLD 7\FK\
]\MDFLyâ İRQDW\
G] :DU V]DZ
ZDQDZDNDFMH .UDNyZ GDWDXUR %GD D
WUDPMDQ#LQWHULDSO
VXSHUBPLUR# .RZDOVNL-HU]\ UHGDNWRU
2F]NLHZLF]$GDP QRZMQ#RSSO D
\
RSSO =RÀN7DGHXV] SDQQD
GDWDXURG]HQLD ]DPĐİQ &KLOGUHQ·V%RRN :: :
$XWK WHOHZL]MDNLQR GDWDXURG]HQLDVHNU PRWRU\]DFMDÀWQHVV GDWDXURG]HQLD
]DLQWHUHVRZDQ 0DUUVWURQ RU
SRGUyİH HWDUND *GDĚVN
LDVSRUW\HNVW MHNWDQWND LHG NDZDOHU
İRQDW\ NUDZLHFWZRPR UHPDOQH SUR 1HZ<RUN1< SRV]XNXMHSD İRQDW\ .DWRZLFH SRV]XNXMHNRQWDNWyZP
LĐG]\OXG
SQHUD#ZSSO
GD UWQH UDS U]\MDFLyâ ]NLFK
.DWRZLFH RIDGHU#K O GRUDGFDSRGDWNR Z\ ]HWND#RSSO VWXGHQW ]DLQWHUHVRZDQLDNLQR
ELEOLRWHNDU] SRV]XNXMH]QD LQWHULDS RWPD LOFRP
MRP\FKNRQWD NDUPDU# UĐF]QH *OLZLFH PRWRU\]DFMD
PLĐG]\OXG]NLFK NWyZ ,QWHUHVWV$QW UREyWNL 0LNRâyZ ]DLQWHUHVRZDQ
(OEOċJ SDUWQHUD VRZDQLD LTXHVWR\V/LWHUDWXUH W]RÀN#SL]]DQ]NFRPSO NVLċİNL
LDİHJODUVWZR MNRZDOVNL#EHWUHQG\SO
RF]DP#]\J]\JHX ]DLQWHUH 6HHNLQJ1RWD SRH]MD SRV]XNXMHQRZHMSUDF\
LQR WKLQJ
PRGDN LHN XQ NL .RZDOVND0DJGD ċİNLNLQR %LOHFNL-DQXV] ]DLQWHUHVRZDQLDVSRUW\NVLċİNL ]QDMRP\FK
]DLQWHUHVRZDQLDNVLċİNLJRWRZDQLH NL0H ]\MDFLyâ
SUOFKLRU RS PRWRU\]DFMDNVL SRV]XNXMHV\P
SDWLLSU]\MDFL
$UEDF NX MH GDWDXURG]HQLD yâ GDWDXURG]HQLD PRGD
/HZDQ GRZLF]%DUEDUD
WXU\VW\ND SRV]X URG]HQLD SRV]XNXMH]QDMRP\FKSU]\MDFLyâ 7DUF]\ĚVNL3LRWU
0DOLQLDN.RQUD GDWDX L
GDWDXURG]HQLD
G GRG]LHF SDQQD GDWDXURG]HQLD NDZDOHU SRV]XNXMHSUDF\ 3LHNDUVND0D
SRV]XNXMHQRZHMSUDF\]QDMRP\FK GDWDXURG]HQLD İRQDW\ UWD
DQDOLW\N İRQDW\ PRWRUQLF]\ GDWDXURG]HQL
SDQQD İRQDW\ D
G]LHQQLNDU] :DUV]DZD SURMHNWDQW 7\FK\ ]DPĐİQD
SLHOĐJ QLDUND 1RZDN$QGU]HM
DGPLQLVWUDWRU
3R]QDĚ PL]LDN#RSSO 0DOLQLDN0DFLHM WUDPMDQ#LQWHULDSO JUDÀ
3R]QDĚ GDWDXURG]HQLD N
:URFâDZ
SO /XEDUWyZ PHOFK LRUBD#SL]]DQ]NFR
PSO GDWDXURG]HQLD PRWRU\]DFMDÀ WQHVV
NFRP ]DLQWHUHVRZDQLD NVLċİNLPRGD SWDUF]\QVNL#\QWH ULDSO
EEDVND#SL]]DQ] İRQDW\ áyGĮ
NRQBPDOLQND#R VLċİNLSRH]MDNLQV]\ENLHVDPRFKRG\ İRQDW\
VLċİNLPRGD SSO ]DLQWHUHVRZDQLDN QDUFLDUVWZRİHJODUVWZRNVLċİNLNLQR SRV]XNXMHNRQWDNWyZPLĐG]\OXG]NLFK SLHNDW#RQHWSO
]DLQWHUHVRZDQLDN ]DLQWHUHVRZDQ NXFKDU] SROLFMDQW
SUDF\ RWU SRV]XNXMHSU]\MDFLyâV\PSDWLL
SRH]MDJRWRZDQLH NVLċİNLNLQR
LDVQRZERDUG SRV]XNXMHQRZHM 0DOLQLDN3L LD SRV]XNXMHQRZHMSUDF\SU]\MDFLyâ 0DOLQLDN3LRWU
.DWRZLFH
]DLQWHUHVRZD
QLDWXU\VW\N
G]HQ 6âXSVN GDWDXURG]HQLD DJRWRZ
1RZD N0RQ LND GDWDXUR HX QDQGUHZ#
DQLHOLWHUDWX
UDSLĐNQD
SRV]XNXMHSU]
\MDFLyâRVRE\ NLV]ND#]\J]\J LQWHULDSO
GRUR]PyZ GDWDXURG]HQLD İRQDW\ JRWRZDQLH
İRQDW\ SRV]
]DLQWHUHVRZDQLDVSRUW\ZDONLPXNXMHSU]\MDFLyâNRQWDNWy
0LNXOVNL.U]\V]WRI ]DLQWHUHVRZDQLD DFN L PLĐG]\OXRWR G]NL Z
$UE OHNDU] FK
GDWDXURG]HQLDİRQDW\ .DUF]\ĚVN ]DPĐİQD OHNDU] 5DF ]\ĚVND=RVLD WHOHZL]MD FKLR U
U\]DFMDEURĚSDOQD
D.DWDU]\ HQLD 0HO H]\ SRV]XNXMH
GDWDXURG QD SURJUDPLVWD GDWDXURG] U]\VWZDQDLPSU HQLD
SROLW\N ]HQLD .DWRZLFH #RSSO SRV]XNXMHWRZD GDWDXURG]
.DWRZLFH SU]\MDFLyâ
PD OLQND ZD UV]DZD
QLH:D SBPDOLQND#RSSO 5DF]\ĚVND=RVLD
]DPĐİQD :DUV]DZD SB WHU NR
PDMV İRQDW\ 5DF]\ĚVND=RVLD
:DUV]DZD
WRSFRGHU#RSSO VRZDQLD ]DLQWHUHVRZDQLDPDMVWHUNRZDQLH GDWDXURG]HQLD
VODDQGFKZ#RSSO KDQGORZLH ]DLQWHUH ]BU#RSO GDWDXURG]HQLD
F DFMD K DU]
G]LHQQLNPRWRU\]DFMD
7DUF]\ĚVNL3LRWU RPDWHPDW\NDPRWRU\] HMSUDF\ LL]QDMRP\F :DUV]DZD
]DLQWHUHVRZDQLDSV\FKRORJLDÀOR]RÀD.UD NVLċİNLNUDZLHFWZ HUDQRZ SRV]XNXMHV\PSDW RU :DUV]DZD
NyZ
GDWDXURG]HQLD MHSDUWQ $UEDFNL0HOFKL 3R]QDĚ SRV]XNXMHSDUWQHUDQRZHMSUDF\ SO
V]\GHâNRZDQLH NDND#RS SRV]X NXMH QRZHM
3LHNDU VND- XOLDQD
SUDF\ ]QDMRP\FK SRV]XNX HQLD UBD #SL ]]DQ]NFRP ]BU#RSO
İRQDW\ SO GDWD XURG] PHOFKLR ]BU#RSO
GDWDXURG]HQLD SRV]XNXMHV\PSDWLL]QDMRP\FK
SRV]XNXMHVSRQVRUyZ PRGDNLQ ]MDNLQR
RÀWQHVV
SURMHNWDQW QD $UEDF NL0HOFKLRU İRQDW\ NVLċİNLSRH SRV]XNXMHV\PSDWLL
]DPĐİ
GDWDXURG]HQLD G]LHQQLNDU] QRZHMSUDF\ ]QDMRP\FK
3R]QDĚ
VHNUHWDUND SRV]XNXMH 0LNXOVNL.U]\V]WRI
SWDUF]\QVNL#\QWHULDSO %LOHFNL-DQXV] LND
İRQDW \ RQ GDWDXURG]HQLDİRQDW\
1RZDN0RQLND *OLZLFH GDWDXURG]HQLD 3R]QDĚ
]DQ]NFRPSO 1RZDN0 HQLD
]DLQWHUHVRZDQLDQDUFLDUVWZR PHOFKLRUBD#SL] G]
GDWDXURG]HQLD MXOND#]\J]\JHX G]LHQQLNDU] NDZDOHU L0HOFKLRU GDWDXUR SROLW\N
İHJODUVWZRNVLċİNLNLQR $UEDFNNVLċ
İNL
HJODUVWZRNVLċİNL ]DLQWHUHVR ZDQLD HQLD D
]DPĐİQD ]DLQWHUHVRZDQLDİ 3R]QDĚ PRWRUQLF]\ GDWDXURG] ]DPĐİQ :DUV]DZD
SRV]XNXMHQRZHMSUDF\SU]\MDFLyâ
PRGD PHOFK LRUBD# SL]]DQ]NFRPSO SRH]MDNLQR PL VWD VODDQGFKZ#RSSO3LHN
SURJUDPLVWD 1RZDN0RQLND NRQWDNWyZ 7\FK\ $UEDFNL0HOFKLRU İRQDW\ MSUDF\ SURJUD DUVND-XOLDQD
SRV]XNXMH ]QDMR P\FK LQR SO NXMH QRZH
GDWDXURG]HQLD NVLċİNLSRH]MDN WUDPMDQ#LQ WHULD SRV]X ZD SV\FKRORJLDÀOR]RÀ GDWDDV]\GHâNRZDQLH
XURG]HQLD
:DUV]DZD PLĐG]\OXG]NLFKSDUWQ
HUD GDWDXURG]HQLD ]DFMDÀWQHVV G]LH
QQLNDU] :DUV]D RSSO
UHVRZDQLDPRWRU\
SUDF\ FRGHU# W
WRSFRGHU#RSSO ]DPĐİQD VLD SRV]XNXMHQRZHM ]DLQWH WRS NUDZLHF SRV]XNXMHVSRQVRUyZ ]DPĐİQD
0LNX 5DF]\ĚVND=R 3R]QDĚ SO NVLċİNL
UHVRZ DQLDN VLċİNLNUDZLHFWZ
R OVNL-DQHN
D RG] HQLD İRQDW\
NXMH NRQWD NWyZPLĐG]\OXG]NLFK FKLR UBD #SL ]]DQ]NFRP
LQW HUH VRZDQLD
GDWDXURG]HQL DXU SRV]X ]D VHNUHWDUND
]DLQWH DSURJUDPLVW GDW
G]LHQQLNDU]
PHO
R P DWH PDW\ND P\ FK
PDWHP DW\ND ]MD NLQ ZR ]Q DMR
İRQDW\ :DUV]DZD :DUV]DZD NVLċİNLSRH MSUDF\ WDU]\QD *OLZLFH
SUDF\]QDMRP\FK 3R]QDĚ MHQRZH ĚVND.D MXOND
SRV]XNXMHQRZHM XU]ĐGQLNSRF]WRZ WRSFRGHU#RSSO QRZHMSUDF\ SRV]XNX .DUF]\ ]HQLD #]\J]\JHX
\ ]BU#RSO PHOFKLRUBD#SL]]DQ]NFRPSO SRV]XNXMH 0LNX OVNL-DQHN RG
%LOHFNL-DQXV] RPDWHPDW\ND QDMRP\FK GDWDXU
3R]QDĚ NVLċİNLNUDZLHFWZ V\PSDWLL] GDWDXURG]HQL İHJODUVWZRN
GDWDXURG]HQL SRV]XNXMH NVLċİNLSRH]MDNLQR D
PĐ İQD VLċİNLPRGD
D PLNXQHN#ZSS SUDF\
.RZDOVND0DJG -RKQ 6SDWQHU İRQDW\ ]D
O SRV]XNXMHQRZHM D 6DII\ UH.URJHU LHF
SRV]XNXMH]Q
DMRP\FKNRQ
NDZDOHU SRV]XNXMHQRZHM
%GD \ SUDF\ ORZ WDNWyZ
]DLQWHUH
$QJHOL QD0HQGR]D
VRZD QLDNLQRWHOHZL] ]QDMRP\FK GDWDXURG]HQLD 6DOHVPDQ
XU]ĐGQLNSRF]WRZ KDQG PLĐG]\OXG]NL
FKSDUWQHUD
PRWRUQLF]\ PRWRU\]DFMD MD \
SDQQD %GD\ +DSSLO\0DUULH 3R]QDĚ .UDNyZ
%GD\ G SS O
7\FK\ SRV]XNXM HQR ZHMLQSUDF\
\VDGP DQDOLW\N 6HFUHWDU\ PLNXQHN#ZSS NDND#R RG D NLQR
8QL[6 0DUULHG O LDP
WUDPMDQ#LQWHU
LDSO 0DUULHG :DUV]DZD QQ D
:RRGVWRFN1
8 ]DLQ LQW HU HVRZDQ 0LNXOVNL-DQHN
RD WHUH VRZDQLDNLQR ]D
1RZDN- HQLDMSRHW #KDU YDUGHGX WHOHZL]MD GDWDXURG]HQLD
5DF]\ĚVND
$QQD
PRWRU\]DFMD
ÀWQHVV PL]LDN#RSSO 0RQWU HDO&D
WDXUR G]
QDGD PRWRU\]DFMD ÀWQHVV FLyâ
GDWDXURG 6DQ)UDQFLVFR&$ GD XPEDOOQHW \ SU]\MD
KDSS\VDII#PLJKW\J /\QQ%HLJKOH İRQDW\
SRV]XNXMHNR
]HQLD QWDNWyZ
3LHNDUVND-XOL
DQD D#VWDUEX]]FRIIHHFRP ]DLQWHUHVRZDQ ND ,QWHUHVWV3RH SRV]XNXM HQR " SUDF SRV]XNXMH
]DPĐİQD
PLĐG ]\OXG]NLFK GDWDXURG]HQLD DQJHOLQ
V]\ENLHVDPRF
LDNVLċİNLPRG
D VHNUHWDU WU\6FUHHQSOD\
ZULWLQJ %GD\""ZHM FWLR\ Q:ULWHU XU]ĐGQLNSRF]WRZ\
5DF]\ĚVND=RVLD
J KRG\ ,QWHUH VWV53
D * 6HHN 3LHNDUVND-XOLDQD 7HF K:ULWHU)L
SUH]HV ,QWHUHVWV$FWLQJ
'DQFLQ SDQQ LQJ1RWKLQJDW
GDWDXURG]HQLD ]DPĐİQD SRV]XNXMHSU]
\MDFLyâV\PSDW
DOO
GDWDXURG]HQLD (QJDJHG 0DOLQLDN3LRWU 3R]QDĚ
.UDNyZ LL %LOHFN
.U DN
J1RW yZKLQJ
L-DQX V] GDWDXURG]HQLDPLNXQHN#ZSSO
:DUV]DZD VHNUHWDUND 6HHNLQ SO ]DPĐİQD
DUDF]\QV GDWDXQRZM Q#RS
URG]H QLD
\H NVWUH 1HZ-HUVH\ DLOF RP 0LNX ]DLQWHUHVRZDQLDNLQRWHOHZL]MD
ND#PEL]Q *OLZLFH VS RUW KOH\ #JP İRQDW\
OVNL.U]\V]WR
]DLQWHUHV HVHX ]BU#RSO
NDZDO HULQW HUH VRZDQLD PR GD VHNUHWDUND O\QQEHLJ
GDWD I /HZDQGRZLF]%DU
PRWRU\]DFMD
EDUD
MXONDDMRP\ FK 7NDF]0 ]D LHFWZ R XURG UH
RZDQLDS
NXMHV\PSDWLL]Q
#]\J]\JH X DUW\QD N OQHNUDZ $UEDFNL0HOFKLRU LWLQJOLWHUDWX ]HQL D
OHNDU] GDWDXURG]HQLD
SRV]XNXMH V\FKRORJL
DSRGUSRV]X .RZDOVNL0LUH PDQLF]\ RQWDNWyZ V7UDYHOZU İRQDW\ SRV]XNXMHQRZHMSUDF\
]QDMRP\ yİH 7NDF]
]DLQW
GDWDXUR
G]HQLD XURG]HQLD PRWRU P\FKN *OLZLFH GDWDXURG]HQLD,QWHUHVWQJHOVH
HUHV
0DUWRZDQ LDİHJODUVWZR GDWD MH]QDMR HYHU\WKL .DWRZLFH SDQQD
PLĐG]\OXG
]NLFK
FKOVNL
0LNX NRQWD
-DQH
NWyN GDWDNLP
NVLċİ \QD SDQQD
7\FK\ SRV]XNX ]NLFKSDUWQHUD MXOND#]\J]\JHX SROLW\N
GDWDXURG]HQL Z XURG] RGDHQLD ]\ OXG
ĐG WHULD SO İRQDW \ SBPDOLQND#RSSO
SLHOĐJQLDUND
D SDQQD OHNDU]SH NDZDOHU WUDPMPL DQ#LQ ]DLQWHUHVRZDQLDİHJODUVWZR NLQJ DELJEUHDN :DUV]DZD
SRV] XNXMH]QDMRP\ GLDWUD ]DFMD G]LHQQLNDU] 6HH PDMVWHUNRZDQLHP RWRU\]DFMD
İRQDW\
PLĐG FKNRQWDNWyZ
:U RFâDZ KDQGORZLHF ]DLQWHQQD UHVRZDQLDPRWRU\ NVLċİNLPRGD VODDQGFKZ#RS :URFâDZ
OHNDU]]\OXG ]NLFKSDUWQHU SO NFRPSO
XU]ĐGQLNSRF]WRZ SHGLD WUD D 5DF]\ĚVND$ ÀWQHVV SRV]XNXMH]QDMRP\FKNRQWDNWyZ 3R]QDĚ SRV]XNXMHSDUWQHUDQRZHMSUDF\ EEDVND#SL]]DQ]
PSWNDF]# Q]NFRPSO ]DLQWHUHVRZD
\ :URFâDZ RHX :DUV]DZD GDWDXURG]HQLD NRQWDNWyZ U 0LNX
PHOFKLRUBD#SL]]D OVNL-DQHN QLDSV\FKRORJLD ]MDJRWRZDQLH
3R]QDĚ RSSO SRV]XNXMH 0DOLQLDN3LRW ÀOR]RÀDV]\GH NVLċİNLPRGDSRH
PSWNDF]# WXU\VW\N
DPRGD VXSHUBPLUR# ]DPĐİ QD NLFK GDWD XURG]HQLD
GDWDXURGSRH]
DQLDN VLċİNL ]HQLD MD âNRZDQLH SUDF\
PLNXQHN#ZSS RHX ÀWQHVV DNL QR PLĐG] \OXG] ]DLQWH UHVRZ SRV]X NXMH QRZHM
O SRV]XNX QLDWHOHZL]M İRQDW\ SRV]XNXMHVS
]DLQWHUHV
RZDQLD MHWRZD ]DLQWHUHVRZD SUH]HV İRQDW\ NLQR RQVRUyZ
]DLQWHUHVRZD
QLDNLQRWHOHZL] ÀWQHVV WXU\VW\N
DPR 3LHSDU
NDUVNWQHUD U]\VWZDQyİH
SRGU DL XU]Đ GQLN
SUDF\ SRF 3LHNDUVND-XOLDQD
D-XOLDQ PS UH]\ DFLyâ .UDNyZ SRV]XNXMHQRZHM ]WRZ\
PRWRU\]DFMD MD SR
V]XNXMH GDGD
WDXURG] D UWQHUDSU]\M ]QHVHX OHNDU] GDWDXURG]HQLD
HQLD SRV]XNXMHSD DUDF]\QVND#PEL 3R]QDĚ
SRV]XNXMHQR SDUWQHUD WRZDU]\VWZDQ ]DPĐİQ
yİH .DWRZLFH PLNXQHN#ZSS ]DPĐİQD
1RZDN-RDQQD
ZHMSUDF\ DLPS UH]\D SV\FKRORJLDSRGU SSO O GDWDXURG]HQLD
1RZDN0RQLND SBPDOLQND#R NLQRWHOHZL]MDP
/HZDQGRZLF]%DUEDUD VHNUHWDUN NXMH]QDMRP\FK
NRQ
PDMV WHUNRZDQLH RWRU VHNUHWDUND
OFKLRU D SRV]X QLD \]DF MD VHNUHWDUND
GDWDXURG]HQLD $UEDFNL0H
GDWDXURG]HQLD
WDNWy
ZPLĐ G]\OXG]NLFK ]DLQWHUHVRZD SRV]XNXMHQR H
QLD *OL ZLF FMD ZHM SUDF\ *OLZLF
GDWDXURG]H H PRWRU\]D SDQQD
SDQQD MXOND#] ]DPĐİQD SUDF\ MXOND#]\J]\JHX
İRQDW\ \J]\JH UWQHUDQRZHM
X SRV]XNXMHSD HJODUVWZRNVLċİNL .UDNyZ
SLHOĐJQLDUND ]DLQWHU
HVRZDQ
SURJUDPLVWD
/HZDQGRZLF]%DUEDUD 1RZDN0RQLN ]DLQWHUHVRZDQLDİ
G]LHQQLNDU] LDİHJOD .DUF]\ĚVND.DWDU]\QD D QRZMQ#RSSO
:URFâDZ
NVLċİNL
PRGD UVWZR :DUV]DZD GDWDXURG]HQLD GDWDXURG]HQLD PRGD
3R]QDĚ GDWDXURG]HQLD NRQWD NWyZ VSRUW\HNVWUHPDOQHNUDZLHFWZR
EEDVND#SL]]DQ]NFRPSO PHOFKLRUBD#SL]]D
Q]NFRPSO SRV]XN
XMH]QD
WRSFRGHU#RS
SO SDQQD ]DPĐİQD SRV]XNXMH]QDMRP\FK
HUD PRGD
PLĐG]\ MRP\FK ]DPĐİQD PLĐG]\OXG]NLFKSDUWQ
]DLQWHUHVRZDQLDNVLċİNLPRGD ]DLQWHUHVRZDQLDN
VLċİNLSR OXG]NLFK
SDUWQH QWD NWyZ 3LRWU]DLQWHUHVRZDQLDNVLċİNLNUD
NR 0DOLQLDN SLHOĐJQLDUND SURJUDPLVWD 3LHNDUVND-XOLDQD
SRV]XNXMH]QDMRP\FKNRQWDNWyZ
UD GDWDXURG]HQLD ZRP
DWHPDW\ND ZLHFWKDQGORZLHF $UEDFNL0HOFK GDWDXURG]HQLD
SRH]MDJRWRZDQLH H]MDNLQR :URFâDZ :DUV]DZD LRU PLĐG]\OXG]NLFKSDUWQHUD
SRV]XNXMHQRZ 0DOLQLD .UDNyZ EEDVND#SL]]DQ] NFRPSO
7NDF]0DUW\QD GDWDXURG]HQL
D ]DPĐİQD
SRV]XNXMHQRZHMSUDF\ WDU QD
]\SRV]X NXMHQRZHMSUDF\ VNL.U ]\V]WRI İRQDW\
GD
N3LRWU
HMSUDF\ ]QDMR
WRSFRGHU#RS
SO
VND .D 0LNXO WD XURG]H P\FK NDND#RSSO RH]MDJRWRZDQL
GDWDXURG]HQLD H İRQDW\
.DUF]\Ě HQLD GDWDX URG]H QLD İRQDW\ OHNDU] QLD NVLċİNLPRGDS NVLċİ NLN
VHNUHWDUND
G] İRQDW\ UDZLHFWZRP
GDWDXUR PRGDNLQRÀ
WQHVV
$UEDF NL0HOFKLRU SRV]XNXMHQRZH SDQQD MSUDF\ DWHPDW\ND G]LHQQLNDU]
.DWRZLFH SRV]XNXMHQR *OLZLFH
D SROLW\N OHNDU] ZHMSUDF\]Q
]DPĐİQ SBPDOLQN D#RSSO GDWDXURG]HQLD
SRV]XNXMHSU]\MDFLyâ OHNDU]SHGLDWUD DMRP\FK 3R]Q DĚ MXOND#]\J]\JHX
LHF :DUV ]DZD .D 0DOLQLDN3LRWU PHOF
KDQGORZ WRZLMDFH İRQDW\ :URFâDZ KLRUBD#SL]]DQ]
VODDQGFKZ#RSSO PDMVWHUNRZDQLHPRWRU\]DF SBPDOLQ GDWDXURG]HQLD NFRPSOİHJODUVWZRNVLċİNLPRGD
PSWNDF]#RHX ]DLQWHUHVRZD
.UDNyZ V\FKRORJLD ND#RS
SUDF\ G]LHQQLNDU]
SSO V ]DLQWHUHVRZDQLDS SRV]XNXMHSDUWQHUDQRZHM SO İRQDW\ QLDNVLċİNLS SRV]XNXMH]QDMRP\FKNRQWDNWyZ
RH]MDNLQR
NDND#R RÀWQHV ZDQLH ]DLQWHU ]DLQWHUHVRZDQLDWXU\VW\NDPRGD PLĐG]\OXG]NLFKSDUWQHUD
PRGDNLQ ÀOR]RÀDV]\GHâNR HV
PRWRU\ RZDQLDPDM 3R]QDĚ ÀWQHVV
SRV]XNXMHQR
ZHMSUDF\
VRZDQLD ]DFMD VWHUNR OHNDU]
]DLQWHUH RUyZ ZDQLH PHOFKLRUBD#SL]]DQ]NFRPSO SRV]XNXMHWRZDU]\VWZDQDLPSUH]\
SU ]\MDFLyâ SRV]XNXMHVSRQV SRV]XN .DWRZLFH
MH XMHSD
SRV]XNX UWQHUD ]DLQWHUHVRZDQLDN
VLċİNLSRH]MDSDUWQHUD SBPDOLQND#RSSO
QRZHM NLQR
SUDF\
]DLQWHUHVRZDQLDPDMVWHUNRZDQLH
SRV]XNXMHQRZHM
SUDF\ PRWRU\]DFMD
SRV]XNXMHSDUWQHUDQRZHMSUDF\
WYSIL
SZARE KOMÓRKI
Czy istnieje lepszy sposób zorganizowania tych informacji?
Co Ty byś zrobił?
jesteś tutaj 39
Kategoryzowanie danych
40 Rozdział 1.
Dane i tabele
Zaostrz ołówek
Oto kilka notatek Grześka. Poszukaj podobnych informacji, które Grzesiek notuje na temat każdej
z osób. Każdej z odnalezionych wspólnych informacji nadaj nazwę określającą kategorię, do jakiej
dana informacja należy. Następnie zapisz te nazwy w pustych wierszach na poniższym rysunku.
Bilecki Janusz
data urodzenia:
ją 19.06.1983
Szuka kawaler
motorniczy
Tychy
tramjan@interia
.pl
zainteresowania:
motoryzacja,
fitness
poszukuje: kontak
tów międzyludzk
ich
Nowak Andrzej
data urodzenia: 12.03.1957
żonaty
policjant
Katowice
n.andrew@interia.pl
zainteresowania: sporty walki,
motoryzacja, broń palna
poszukuje: przyjaciół
jesteś tutaj 41
Rozwiązanie zadania
Zaostrz ołówek
Rozwiązanie Oto kilka notatek Grześka. Poszukaj podobnych informacji, które Grzesiek notuje na temat
każdej z osób. Każdej z odnalezionych wspólnych informacji nadaj nazwę określającą
kategorię, do jakich dana informacja należy. Następnie zapisz te nazwy w pustych wierszach
na poniższym rysunku.
ż
Skoro juśmy Nazwisko
k r e ś li li emy
o ie, moż
kategor ć do
ich uży owania Imię
zorganizGrześka. Karczyńska Katarzyna
danych data urodzenia: 02.07.1967
zamężna
Kubaski Andrzej
.11.1983 handlowiec
data urodzenia: 12
W WW
projektant stron Kraków
kaka@op.pl
kawaler
Stan Szczecin zainteresowania: moda, kino, fitness
pizza-nzk.com.pl
Kubaski_Andrzej@ poszukuje: przyjaciół
iążki, kino,
zainteresowania: ks
telewizja
cy, towarzystwa
poszukuje: nowej pra
na wakacje
Nowak Andrzej
data urodzenia:
12 .03.1957
Zawód żonaty
Jak widać, rozróżniamy
osobno imię oraz policjant
nazwisko. Dzięki temu Miejsce
łatwiej nam będzie zamieszkania Katowice
sortować dane. n.andrew@interia
E-mail .pl
Imię zainteresowania:
sporty walki,
motoryzacja, broń
Nazwisko palna
poszukuje: przyja
ciół
Data urodzenia
Zawód Mendralska Agnieszka
data urodzenia: 19.08.1979
Stan zamężna
administrator systemów Unix
Lokalizacja Sandomierz
Grzesie
agimedra@swiatkawy.com.pl pewnym k przypisał ju
E-mail kategori informacjom
ż
zainteresowania: aktorstwo, taniec n
urodzen i, takie jak „D azwy
Zainteresowania poszukuje: nowej pracy czy też ia”, „Zainteres ata
i zanoto „Poszukuje”, owania”
kartecz wał je na swo
kach.
Poszukuje ich
42 Rozdział 1.
Dane i tabele
data_
nazwisko imie email zawod lokalizacja stan zainteresowania szuka
urodzenia
Barańska Anna ania@ 01.07.1962 inżynier lotniczy Warszawa panna, ale ma gry RPG, nowej pracy
megadeski.com.pl partnera programowanie
Homilski Janusz hojan@ 10.09.1966 administrator Darłówek kawaler wędrówki piesze, przyjaciół,
pizza-nzk.com.pl systemów pisanie blogów kobiety
komputerowych na randki
Samotek Adrian asamotek@ 02.12.1975 inżynier lotniczy Warszawa żonaty gry RPG, niczego
pizza-nzk.com.pl programowanie
Mendralska Agnieszka agimedra@ 19.08.1979 administrator Sandomierz zamężna aktorstwo, taniec nowej pracy
swiatkawy.com.pl systemów Unix
jesteś tutaj 43
Bazodanowy objazd
Co znajduje się w bazie danych?
Zanim zajmiemy się znalezieniem szczegółowych odpowiedzi na pytanie,
czym są tabele, wiersze i kolumny, warto się zatrzymać i przyjrzeć całemu
zagadnieniu w sposób nieco bardziej ogólny. Pierwszą strukturą SQL, jaką
musisz poznać, strukturą, która przechowuje wszystkie tabele, jest baza danych.
moja_baza danych
44 Rozdział 1.
Bazodanowy objazd
Konta bankowe
Lista odtwarzania
na iPodzie
Bazy danych
są wszędzie
Pożyczka studencka
Rachunek
telefoniczny
Lista najlepszych wyników
w automacie do gry
Internetowa
baza filmów
Karta kredytowa
Wyszukiwarka
Google
Karta biblioteczna
Rezerwacja pokojów
w hotelu Ekologiczna pralnia
chemiczna
Ty i zaledwie kilka
z otaczających Cię
baz danych.
jesteś tutaj 45
Bazodanowy objazd
Anatomia bazy danych
To są kolumny
. Baza danych zawiera tabele.
kolumna3 kolumna4
kolumna1 kolumna2
inna dane dane Tabela jest wewnętrzną strukturą bazy danych;
Jeszcze dane dane
dane dane
kolumna1
la . dane dane
dane
kolumna2 kolumna3 są w niej umieszczane informacje. Informacje
tab e dane dane dane
dane
dane dane dane
dane dane dane dane dane dane w tabelach są rozmieszczane w wierszach
dane dane dane
A to są kolumna1
kolumna2 dane dane dane
i kolumnach.
wiersze. dane dane dane
dane dane
dane dane dane
dane
dane
dane dane
dane
Czy pamiętasz te kategorie, które wyróżniłeś
dane dane
dane
dane na jednej z poprzednich stron? Każda z nich
stanie się kolumną tabeli. W jednej kolumnie
Jeszcze inna tabela. mogłyby się znaleźć na przykład następujące
I kolejna tabela.
wartości: Kawaler, Żonaty, Rozwiedziony.
46 Rozdział 1.
Bazodanowy objazd
Bądź tabelą
Poniżej przedstawionych zostało kilka
karteczek oraz tabela. Twoim zadaniem jest
wcielenie się w rolę częściowo wypełnionej
tabeli i uzupełnienie wszystkich
pustych miejsc w celu uzyskania
wewnętrznego spokoju i harmonii.
Kiedy rozwiążesz zadanie, przewróć Pączki u Donalda
kartkę i sprawdź, czy Ty i tabela 7
staliście się jednością. 24.4
za mało dżemu
10:35
Pączki u Donalda z dżemem
5
y Pył
25.4 Kawiarnia Gwiezdn
z dżemem 23.4
8:56 z dżemem
tłuste 9 z dżemem
7:43 twardawe, ale smaczne
niemal doskonałe 6
Chrupki Kąsek
26.4
9:39
z pól jako
Użyj jednego
która określi
nazwy tabeli,
.
jej zawartość
sklep
9
25.4 5
za mało dżemu
jesteś tutaj 47
Bazodanowy objazd
Bądź tabelą. Rozwiązanie
Twoim zadaniem było wcielenie się w rolę
częściowo wypełnionej tabeli i uzupełnienie
Nazwę tabeli bez większ
wszystkich pustych miejsc w celu uzyskania problemów mogłeś określ ych
na podstawie zawartośc ić
wewnętrznego spokoju i harmonii. przedstawionych kartec i
zek.
SDF]NLB]BG]HPHP
sklep godzina data ocena komentarze
Kawiarnia Gwiezdny Pył 7:43 23.4 9 niemal doskonałe
Pączki u Donalda 8:56 25.4 5 tłuste
Chrupki Kąsek 9:39 26.4 6 twardawe, ale smaczne
Nie przejmuj się, jeśli
podane przez Ciebie nazwy Pączki u Donalda 10:35 24.4 7 za mało dżemu
kolumn nie są dokładnie
takie same jak nasze.
SDF]NLB]BG]HPHP
data ocena komentarze
sklep godzina
23.4 9 niemal doskonałe
7:43
Kawiarnia Gwiezdny Pył tłuste
25.4 5
8:56
Pączki u Donalda
Tabela zawierająca 9:39 26.4 6 twardawe, ale smaczne
informacje o pączkach Chrupki Kąsek
10:35 24.4 7 za mało dżemu
Pączki u Donalda
z dżemem. Tabela zawierająca
SDF]NLBOXNURZDQH
sklep
informacje o pączkach
godzina
Kawiarnia Gwiezdny Pył
data ocena komentarze z lukrem.
9:39 26.5
Pączki u Donalda 8 ciepły, ale nie gorący
7:43 23.5
Chrupki Kąsek 4 mało lukru
8:56 25.5
Ciastkarnia u Misia 6 smaczny
10:35 24.5 7 nieco twardawy
48 Rozdział 1.
Bazodanowy objazd
Tabele
w zbliżeniu
To są kolumny tabeli.
jesteś tutaj 49
Tworzenie własnych tabel
data_
nazwisko imie email zawod lokalizacja stan zainteresowania szuka
urodzenia
Barańska Anna ania@ 01.07.1962 inżynier lotniczy Warszawa panna, ale gry RPG, nowej pracy
megadeski.com.pl ma partnera programowanie
Homilski Janusz hojan@ 10.09.1966 administrator Darłówek kawaler wędrówki piesze, przyjaciół,
pizza-nzk.com.pl systemów pisanie blogów kobiety na
komputerowych randki
Samotek Adrian asamotek@ 02.12.1975 inżynier lotniczy Warszawa żonaty gry RPG, niczego
pizza-nzk.com.pl programowanie
Mendralska Agnieszka agimedra@ 19.08.1979 administrator Sandomierz zamężna aktorstwo, taniec nowej pracy
swiatkawy.com.pl systemów Unix
50 Rozdział 1.
Dane i tabele
NVLD]NL
NVLD]NL
ELEOLRWHNDU]
ELEOLRWHNDU]
EDQNBGE
Baza danych banku.
NOLHQWBLQIRUPDFMH
NOLHQWBLQ
IRUPDFMH
NRQWR
NRQWR
VNOHSLQWHUQHWRZ\BGE
NRV]\N
NRV]\N
jesteś tutaj 51
Rozwiązanie ćwiczenia
Przyjrzyj się poniższym bazom danych i tabelom. Zastanów się, jakie kategorie
informacji możesz znaleźć w każdej z nich. Podaj nazwy kolumn, jakie
Rozwiązanie najprawdopodobniej mogłyby się w nich znaleźć.
ćwiczenia Nie przejmuj się, jeśli
podane przez Ciebie
ELEOLRWHNDBGE Baza danych z informacjami
o bibliotece i zgromadzonych
nazwy kolumn nie są
dokładnie takie same
w niej książkach. jak nasze.
ELEOLRWHNDU]
EDQNBGE
Baza danych banku.
NRQWR
VNOHSLQWHUQHWRZ\BGE
SURGXNW\
52 Rozdział 1.
Dane i tabele
Przejmij kontrolę!
A teraz uruchom swój system zarządzania relacyjną bazą danych SQL (ang. relational
database management system — RDBMS) i otwórz okno wiersza poleceń lub interfejs
graficzny pozwalający na komunikację z systemem. Poniżej przedstawiliśmy okno
wiersza poleceń pozwalające na zarządzanie serwerem MySQL.
Wpisane
&5($7('$7$%$6(OLVWDBJU]HVLD polecenie musi
się kończyć
BASE średnikiem.
CREATE DATA em . Nazwa bazy
jest po le ce ni
to lista_grze danych
sia.
jesteś tutaj 53
Polecenie USE
2 Teraz musisz przekazać systemowi obsługi baz danych, której bazy faktycznie chcesz używać.
Nie istnieją
głupie pytania
P.: Dlaczego muszę tworzyć bazę P.: Czy jest coś, co powinienem wiedzieć P.: A gdybym chciał nadać bazie danych
danych, skoro chcę korzystać tylko o sposobie określania nazw baz danych, nazwę zapisaną w języku angielskim,
z jednej tabeli? tabel i kolumn? czy mógłbym ją nazwać na przykład:
greg’s_list?
O.: Język SQL wymaga, by wszystkie tabele O.: Na pewno warto, by nazwy te były opisowe.
były umieszczane w jakiejś bazie danych. Czasami będzie to wymagało zastosowania O.: Nie. Nazwa powinna mieć postać: gregs_list.
Przemawiają za tym ważkie powody. Jedną więcej niż jednego słowa. Ponieważ w nazwach W języku SQL apostrofy i cudzysłowy są
z cech języka SQL jest możliwość kontrolowania nie można używać odstępów, zatem jeśli składają używane w innym celu. Choć istnieją sposoby
dostępu do tabel przy wykorzystaniu się one z kilku wyrazów, wyrazy są przeważnie pozwalające na ich zastosowanie w nazwach,
użytkowników. Możliwość udzielenia lub oddzielane od siebie znakami podkreślenia. Poniżej to jednak znacznie łatwiej jest po prostu z nich
zabronienia dostępu do całej bazy danych podaliśmy kilka przykładowych sposobów zapisu zrezygnować.
niejednokrotnie jest znacznie wygodniejsza niż
określanie praw dostępu do wszystkich tabel
nazw, z którymi możesz się spotkać w praktyce:
OLVWDBJU]HVLD
P.: Zauważyłem także, że na końcu
umieszczonych w tej bazie. polecenia CREATE DATABASE został
OLVWDJU]HVLD umieszczony średnik. Czy był on
P.: Zauważyłem, że polecenie CREATE /LVWDJU]HVLD konieczny, a jeśli tak, to do czego służy?
DATABASE zostało zapisane wielkimi
literami. Czy taki sposób zapisu jest
OLVWD*U]HVLD
O.:Owszem, średnik jest potrzebny
Ogólnie rzecz biorąc, lepiej unikać stosowania — oznacza on zakończenie polecenia.
konieczny?
wielkich liter, aby uniknąć zamieszania. Język SQL
O.: Niektóre systemy obsługi baz danych nie rozpoznaje bowiem wielkości liter. Zastosowanie wielkich liter oraz
faktycznie wymagają, by pewne słowa znaków podkreślenia pomaga
kluczowe były zapisywane wielkimi literami. P.: A jeśli wolałbym użyć nazwy w pisaniu kodu poleceń SQL (choć
Jednak język SQL nie zwraca uwagi na wielkość „listaGrzesia” i nie oddzielać słów sam język SQL ich nie wymaga!).
znaków. Oznacza to, że polecenia nie muszą znakiem podkreślenia?
być zapisywane wielkimi literami, choć jest to Obsługiwany z poziomu wiersza poleceń
uważane za dobrą praktykę programistyczną. O.: Nic nie stoi na przeszkodzie, byś tak zrobił. klient bazy danych, którego w tej książce
Przyjrzyjmy się zastosowanemu wcześniej Należy tylko pamiętać o tym, by zachować spójność używamy do prezentowania poleceń
i konsekwentnie używać jednego sposobu zapisu SQL, nie pozwala na stosowanie polskich
poleceniu CREATE:
nazw. Jeśli wolisz nadać swojej bazie danych nazwę znaków diakrytycznych; dlatego też
&5($7('$7$%$6(OLVWDBJU]HVLD OLVWD*U]HVLD, w której nie będzie znaków w prezentowanych poleceniach oraz na
Dzięki zastosowaniu wielkich liter już na podkreślenia, a drugi wyraz zostanie zapisany rysunkach polskie litery nie są stosowane.
pierwszy rzut oka możemy odróżnić wydane z wielkiej litery, to tej samej konwencji powinieneś Niedogodność tę można ominąć, stosując
użyć do określenia nazw wszystkich innych tabel bardziej zaawansowane programy do
polecenie&5($7('$7$%$6( oraz nazwę
w bazie danych, na przykład: PRMH.RQWDNW\. obsługi bazy danych MySQL, choćby
bazy danych OLVWDBJU]HVLD.
MySQL Administrator i MySQL Query
Browser, które można pobrać z witryny
http://www.mysql.com/.
54 Rozdział 1.
Dane i tabele
Naciśnij
Zastosowana nazwa tabeli Enter, by klawisz
L, które polecenia dalszą część
cenie SQ powinna być zapisana
Oto pole am utworzyć w nowym wpisywać
n małymi literami, a zamiast
pozwoli zwróć uwagę temu pop wierszu i dzięk
tabelę — litery. odstępów należy użyć znaków i
ie podkreślenia. przejrzys rawić jego
na wielk tość.
Nawias otwierający
rozpoczyna listę kolum
n, &5($7(7$%/(OLVWDBSDF]NRZ lumny
jakie należy utworzyć. Poszczególne ko
są od dz ie lan e do
mi.
siebie przecinka
Nazwa pierwsze
kolumny tabeli.
j
QD]ZDBSDF]ND9$5&+$5
W\SBSDF]ND9$5&+$5
Nazwa drugiej
kolumny tabeli.
jego nazwa —
Nawias zamykając
y kończy To jest TYP DANYCH. W tym przypadku able CHARacter
listę kolumn. 9$5&+$5 — (skró t od angie lskich słów VARi
informuje nas, że
Ten średnik informuje — łańcuch znaków o zmiennej długości) tekst. Wyrażenie
system obsługi baz informacje w polu będą zapis ywan e jako
za, że długość
danych, że dotarł umieszczone za nazwą kolumny oznac
mogła przekroczyć
do końca polecenia. zapisywanego w niej tekstu nie będzie
20 znaków.
jesteś tutaj 55
Skomplikowane tabele
WYSIL
SZARE KOMÓRKI
Pod jakimi względami nazwy z karteczki
różnią się od nazw kolumn wynikowych
tabeli? Dlaczego różnice te są ważne?
56 Rozdział 1.
Dane i tabele
Zaostrz ołówek
&5($7(7$%/(PRMHBNRQWDNW\
QD]ZLVNR9$5&+$5
LPLH9$5&+$5
HPDLO9$5&+$5
GDWDBXURG]HQLD'$7(
]DZRG9$5&+$5
ORNDOL]DFMD9$5&+$5
VWDQ9$5&+$5
]DLQWHUHVRZDQLD9$5&+$5
V]XND9$5&+$5
jesteś tutaj 57
Polecenie CREATE TABLE
Równie dobrze możesz wpisać całe polecenie w jednym, bardzo długim wierszu:
&5($7(7$%/(PRMHBNRQWDNW\QD]ZLVNR9$5&+$5LPLH9$5&+$5HPDLO9$5&+$5GDWDBXURG]HQLD'$7(]DZRG9$5&+$5ORNDOL]DFMD9$5&+$5VWDQ9$5&+$5]DLQWHUHVRZDQLD9$5&+$5V]XND9$5&+$5
Niezależnie od tego, jaki sposób wybierzesz, nim naciśniesz klawisz — to jest nasze
Możesz nam wierzyć liśmy je jednak
Enter, upewnij się, że przepisałeś je dokładnie w podanej postaci polecenie SQ L, zap isa
ionką, by zmieściło
— co do jednego znaku. GDWDBXURG]HQLD'$7( to nie to samo b-a-r-d-z-o małą czc na stronie.
wie rsz u
co GDWDXURG]HQLD'$7$, podobnie jak 9$5&+$5 to nie to samo się w jednym
co 9$5&+$5.
58 Rozdział 1.
Dane i tabele
WYSIL
SZARE KOMÓRKI
Zanim zajmiemy się kolejnymi zagadnieniami, spróbuj określić, jakie inne
typy danych, oprócz VARCHAR i DATE, mogą być nam potrzebne.
jesteś tutaj 59
Typy danych SQL
n
ARACTER. Te INT lub INTEGER uważa, że
CHAR lub CH zo sztywny i woli, liczby nie powinny mieć części
je st ba rd
facet e przechowuj
e,
ułamkowej. Na szczęście nie
by dane, któr reśloną długość. obawia się liczb ujemnych.
le ok
miały ściś
Tego pana ni
L, ale znajom
i — wprosił si e znamy
To DECIMA DEC. Udostępni imprezę.
ę na naszą
mówią o nim miejsca
Ci wszystkie jakie poprosisz.
o
dziesiętne,
Ten gość to BLOB.
Lubi przechowywać
duże ilości danych
tekstowych.
To jest DATETIME lub
TIMESTAMP (zależnie
od używanego systemu
zarządzania bazami
danych). Specjalizuje się DATE przechowuje jedyni
w przechowywaniu daty daty. Nie zaprząta sob e
i godziny. Jej siostra ie
głowy godzinami.
bliźniaczka — TIME —
także przechowuje godziny,
lecz nie zaprząta sobie
głowy datami.
chowuje
VARCHAR prze o długości
dane te ks to we ów.
ącej 255 znak
nieprzekraczaj i dostosowuje
Jest elas ty cz na
zapisywanego
się do długości
łańcucha.
60 Rozdział 1.
Dane i tabele
Ñ Ñ
Przykład
Optymalny typ
danych
cena Wartość wszystkich zamówionych towarów. 5678,39 DEC(5,2)
kod_pocztowy
waga_atomowa Waga atomowa pierwiastka z dokładnością
do sześciu miejsc po przecinku.
Jarku, jestem na spotkaniu akcjonariuszy. Właśnie
komentarze Duży fragment tekstu, o długości większej pokazali demo programu — na ekranie latało
mnóstwo malutkich kaczuszek. Czy to miał być jakiś
niż 255 znaków. żart? Może jest ci potrzebny urlop, bo poczucie
humoru świadczy o tym, że jesteś przemęczony.
Nie istnieją
głupie pytania
P.: A czy nie można by zapisywać można stosować w kolumnach typu 9$5&+$5 P.: I to wszystko? Czy to wszystkie
wszystkich danych tekstowy oraz &+$5 (poznasz je w dalszej części książki). typy danych dostępne w języku SQL?
w kolumnie typu %/2%?
P.: Do czego będą mi potrzebne liczbowe O.: Nie, jednak są to typy najczęściej
O.: Można, ale byłoby to niepotrzebne typy danych, takie jak ,17 lub '(&? używane. Co więcej, różne systemy
marnowanie miejsca. Kolumny typu 9$5&+$5 zarządzania bazami danych udostępniają
lub &+$5 zajmują konkretną ilość miejsca, nie O.: Wszystko sprowadza się do zagadnień nieco odmienne zestawy typów danych,
przekraczając przy tym długości 256 znaków. związanych z efektywnością działania zatem szczegółowych informacji należy
Z kolei %/2% zajmuje znacznie więcej przestrzeni. baz danych oraz używanymi przez nie szukać w dokumentacji używanej bazy
Wraz z powiększaniem się bazy danych rośnie mechanizmami przechowywania informacji. danych. Polecamy książkę MySQL. Almanach
także ryzyko, że zabraknie wolnego miejsca na Wybór optymalnego typu danych dla każdej (wydaną przez Wydawnictwo Helion),
dysku. Co więcej, na kolumnach typu %/2% nie z kolumn w bazie danych pomoże ograniczyć w której można znaleźć informacje
można wykonywać pewnych istotnych operacji wielkość tabel i sprawić, że wszelkie operacje o różnicach pomiędzy dostępnymi systemami
na łańcuchach znaków, które bez przeszkód na nich będą wykonywane szybciej. obsługi relacyjnych baz danych.
jesteś tutaj 61
Rozwiązanie – typy danych
Ñ Ñ
Numery telefonów
plec Jedna litera — M lub K. M CHAR(1) zawsze będą miały
dokładnie tę długość.
Dziesięć cyfr bez żadnych znaków Potraktowaliśmy je
numer_telefonu 0181519523 CHAR(10) jako dane tekstowe,
przestankowych. bo choć są to
numery, to nigdy
wojewodztwo Dwuliterowy skrót nazwy województwa. SL, KP CHAR(2) nie będziemy musieli
wykonywać na nich
żadnych operacji
rocznica Dzień, miesiąc i rok 22.11.2006 DATE matematycznych.
62 Rozdział 1.
Dane i tabele
CELNE
SPOSTRZEŻENIA
Zanim utworzysz tabelę, podziel dane na kategorie. Zwróć Wszystkie tabele są tworzone przy użyciu polecenia
szczególną uwagę na typy danych, jakie będą zapisywane &5($7(7$%/(, w którym umieszczana jest lista nazw
w poszczególnych kolumnach. kolumn oraz ich typów danych.
Użyj polecenia &5($7('$7$%$6(, by utworzyć bazę danych, Kilka spośród najpopularniejszych typów danych to: &+$5,
w której następnie utworzysz swoje tabele. 9$5&+$5, %/2%, ,17, '$7( oraz '$7(7,0(. Każdy z tych
typów kolumn ma odrębne reguły określające, co można
Użyj polecenia 86('$7$%$6(, by wskazać, na jakiej bazie danych
w nim zapisywać.
chcesz pracować — to właśnie w niej później utworzysz tabele.
'(6&PRMHBNRQWDNW\
DESC to skrót od
angielskiego słowa
DESCRIBE — opisy
wa ć.
jesteś tutaj 63
Polecenie DESC
Ech…
szkoda że zapomniałem dodać
do mojej tabeli kolumny
określającej płeć osoby.
Czy już jest za późno, żeby
dodać ją teraz?
WYSIL
SZARE KOMÓRKI
A co Ty sądzisz? Jakich problemów mogłoby przysporzyć
dodanie nowej kolumny do tabeli?
64 Rozdział 1.
Dane i tabele
Magnesiki z SQL-em
.RGVâXİċF\GRXWZRU]HQLDED]\GDQ\FKLQRZHMWDEHOL]NROXPQċRNUHĤODMċFċSâHþRVRE\]RVWDâ
]DSLVDQ\QDPDJQHVLNDFKSU]\F]HSLRQ\FKGRORGyZNL&]\SRWUDILV]XâRİ\þPDJQHVLNLZRGSRZLHGQLHM
NROHMQRĤFLLRGWZRU]\þSUDZLGâRZHSROHFHQLD64/".LONDPDJQHVLNyZ]QDZLDVDPLSU]HFLQNDPL
LĤUHGQLNDPLVSDGâR]ORGyZNLQDSRGâRJĐMHGQDNVċRQH]E\WPDâHE\MHSRGQLHĤþZLĐFQLH]DSU]ċWDM
VRELHQLPLJâRZ\LGRGDMRGSRZLHGQLH]QDNLWDPJG]LHEĐGċSRWU]HEQH
5
HPDLO 9$5&+$
GDWDBXURG]HQ
LD '$7(
86( OLVWDBJU]HVLD
QD]ZLVNR9$5&+$5
LPLH 9$5&+$5
]DLQWHUHVRZDQLD9$5&+$5
V]XND 9$5&+$5
VWDQ9$5&+$5
&5($7('$7$%$6( OL
VWDBJU]HVLD
]DZRG 9$5&+$5
ORNDOL]DFMD 9$5&
+$5
&5($7(7$%/(PRMHBNRQWDNW\
SOHF&+$5
Kiedy skończysz, spróbuj wpisać nowe polecenie CREATE TABLE w konsoli SQL
i stworzyć nową tabelę zawierającą kolumnę z informacją o płci.
jesteś tutaj 65
Tabel nie można tworzyć wielokrotnie
&+$5
Oto odtworzony
Porównaj z nim kod SQL.
odpowiedź, a na swoją HPDLO 9$5
czytaj dalej… stępnie SOHF&+$5
Nie można
ponownie stworzyć GDWDBXU
RG]HQLD
'$7(
już istniejącej bazy
danych lub tabeli! ]DZRG 9$5&+$5
ORNDOL]DFMD 9$5&
+$5
oli i wykonać to
Czy spróbowałeś wpisać w kons Jeśli to zrobiłeś,
nowe polecenie CRE ATE TAB LE?
ćwiczenia nie
to już wiesz, że rozwiązanie tegoej kolumny.
$5&+$5
pozwoli nam dodać do tabeli now
VWDQ 9
]DLQWHUHVRZDQLD9$5&+$5
V]XND 9$5&+$5
Jeśli spróbowałeś wpisać kod
polecenia SQL w konsoli i wykonać go,
to zapewne uzyskałeś wyniki podobne
do tych przedstawionych poniżej:
Nowa kolumna
przeznaczona na
informacje o płci.
O rany! Wykonanie
polecenia powoduje
wyświetlenie
komunikatu o błędzie.
Wygląda na to, że
nowa tabela nie
została utworzona.
66 Rozdział 1.
Dane i tabele
Nie istnieją
głupie pytania
P.: Co się stało w ostatnim ćwiczeniu „Magnesiki z SQL- P.: A zatem, czy istnieje jakiś sposób na dodanie
em” — dlaczego pojawił się błąd? kolumny, czy będę musiał wszystko zaczynać od początku?
O.: Nie można utworzyć tabeli, która już istnieje. Poza tym O.: Niestety musisz zacząć od początku, jednak zanim będziesz
kiedy już raz utworzysz bazę danych, nie ma potrzeby tworzenia mógł utworzyć nową tabelę, musisz pozbyć się tej już istniejącej.
jej kolejny raz. Inny błąd, jaki mogłeś popełnić, to pominięcie Ponieważ w tabeli nie ma jeszcze żadnych danych, możemy po
któregoś z przecinków. Sprawdź także, czy prawidłowo zapisałeś prostu usunąć starą tabelę i utworzyć nową.
wszystkie słowa kluczowe SQL.
P.: A co można by zrobić, gdyby w tabeli, do której
P.: A dlaczego po kolumnie szuka VARCHAR(100) nie chciałbym dodać kolumnę, były już jakieś dane? Czy
ma przecinka, jak po wszystkich pozostałych kolumnach? można by to zrobić bez konieczności usuwania całej tabeli
wraz z jej zawartością?
O.: Kolumna V]XND jest ostatnią kolumną w tabeli, umieszczoną
tuż przed nawiasem zamykającym. Nawias informuje O.: Doskonałe pytanie! Owszem, istnieje sposób na
o zakończeniu polecenia SQL i dlatego przecinek nie jest już modyfikowanie tabeli bez usuwania zapisanych w niej informacji.
potrzebny. Opiszemy go nieco później, a na razie, ponieważ tabela jest pusta,
usuniemy starą tabelę i utworzymy nową.
jesteś tutaj 67
Polecenie SQL DROP
Nie zapomnij
'5237$%/(PRMHBNRQWDNW\ o średniku na końcu.
Tym razem
polecenie
zostało
wykonane
prawidłowo.
68 Rozdział 1.
Dane i tabele
.LPMH
Grupa poprzebieranych w kostiumy słów kluczowych i typów danych
VWHP"
SQL bawi się w grę towarzyską o nazwie „Zgadnij, kim jestem”. Jej
uczestnicy udzielają Ci podpowiedzi, a Ty próbujesz na ich podstawie
odgadnąć, kim oni są. Załóż, że uczestnicy gry zawsze mówią
prawdę. Jeśli zdarzy się, że udzielona podpowiedź odnosi się do kilku
uczestników gry, to zapisz nazwy ich wszystkich. Nazwy uczestników
gry zapisz w pustych miejscach widocznych z prawej strony
podpowiedzi.
Uczestnicy
Najbardziej lubię pytania, na które można odpowiedzieć „Tak” lub „Nie”. .........................................................................
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
jesteś tutaj 69
Polecenie INSERT
Kolejne słowo klucz
9$/8(6
ZDUWRVF
ZDUWRVF
Į
owe
— informuje, że za nim Standardowy
zostanie podana lista Kolejną część Tu zapewne będzie średnik kończący
wartości kolumn. polecenia INSERT Można tu zastosować
apostrofy. Trzeba ich więcej wartości, wszystkie
stanowi lista wartości oddzielonych od polecenia SQL.
kolumn, oddzielonych używać za każdym razem,
gdy chcemy zapisać siebie przecinkami.
od siebie przecinkami. Przy czym po
W przypadku tabeli w tabeli jakiś tekst, nawet
jeśli będzie to pojedynczy ostatniej nie należy
Grześka zostaną wstawiać przecinka.
w niej zapisane dane znak, taki jak „M” lub „K”.
z karteczek.
WAŻNE: wartości muszą być zapisane
dokładnie w takiej samej kolejności jak
nazwy kolumn.
70 Rozdział 1.
Dane i tabele
Ñ Ñ
Ñ
?
KTO CO ROBI?
Ñ
Kolumny Wartości
LPLH
=ZLÈ]NöZSU]\MDFLöï
VWDQ
.RZDOVND
V]XND
SOHF
$XWRUNDWHNVWöZWHFKQLF]Q\FK
GDWDBXURG]HQLD
-XOLDQD
QD]ZLVNR
3DQQD
ORNDOL]DFMD
.
]DLQWHUHVRZDQLD
:DUV]DZD0=
]DZRG
MXND#SL]]DQ]NFRPSO
HPDLO
.DMDNDUVWZRJDG\
jesteś tutaj 71
Kto co robi. Rozwiązanie
Ñ Ñ
Ñ
?
KTO CO ROBI?
Ñ ROZWIĄZANIE
Kolumny Wartości
LPLH
=ZLÈ]NöZSU]\MDFLöï
VWDQ
.RZDOVND
SOHF
$XWRUNDWHNVWöZWHFKQLF]Q\FK
GDWDBXURG]HQLD
-XOLDQD
QD]ZLVNR
3DQQD
]DLQWHUHVRZDQLD
:DUV]DZD0=
]DZRG
MXND#SL]]DQ]NFRPSO
HPDLO
.DMDNDUVWZRJDG\
72 Rozdział 1.
Dane i tabele
,16(57,172PRMHBNRQWDNW\
QD]ZLVNRLPLHHPDLOSOHFGDWDBXURG]HQLD]DZRG
ORNDOL]DFMDVWDQ]DLQWHUHVRZDQLDV]XND
Naciśnij klawisz Enter także po zakończeniu pierwszej pary
9$/8(6 nawiasów oraz po wpisaniu słowa kluczowego VALUES.
To także ułatwi analizę kodu.
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
.
$XWRUNDWHNVWöZWHFKQLF]Q\FK
:DUV]DZD0=
3DQQD
.DMDNDUVWZRJDG\
=ZLÈ]NöZSU]\MDFLöï
isywane w kolumnach
Wartości poszczegó Wszystkie wartości zap , DATE oraz BLOB
zostały zapisane lnych kolumn AR
typów: VARCHAR, CH strofach.
we
pary nawiasów. Ta wnątrz drugiej zostały zapisane w apo
kże i one są
oddzielone od siebie
przecinkami.
Kolejność
ma znaczenie!
8ZDJD Wartości powinny być podane
w dokładnie takiej samej kolejności, w jakiej
wcześnie podano nazwy kolumn.
Wypróbuj to w domu
Powyżej przedstawiliśmy jeden ze sposobów pozwalających na dodanie wiersza do tabeli. Spróbuj wpisać
Ćwiczenie powyższe polecenie INSERT. Najpierw wpisz je w edytorze tekstów. Dzięki temu, jeśli popełnisz jakiś
błąd, nie będziesz musiał wpisywać wszystkiego od początku. Zwróć szczególną uwagę na apostrofy
i przecinki. Poniżej zapisz komunikat, jaki został wyświetlony po wykonaniu polecenia:
jesteś tutaj 73
Formatowanie typów danych w poleceniach SQL
Dokładnie tak.
,16(57,172]DPRZLRQHBSDF]NL
URG]DMBSDF]NDWX]LQ\SROHZDFHQD
9$/8(6
]bQDG]LHQLHP
OXNLHU
sywane
Wartości zapituziny oraz
w ko lu m na ch
zą być
cena nie mus ostrofach.
zapisa ne w ap
74 Rozdział 1.
Dane i tabele
Zaostrz ołówek
Używany system zarządzania relacyjnymi bazami danych zawsze poinformuje Cię, jeśli zapytanie, które
chcesz wykonać, będzie nieprawidłowe; jednak zwracane przez niego informacje czasami mogą być
mało konkretne. Przyjrzyj się przedstawionym poniżej poleceniom ,16(57. W pierwszej kolejności
spróbuj samemu określić, co jest nie tak z każdym z nich, a następnie wpisz je w konsoli i przekonaj się,
co na ich temat powie system zarządzania bazami danych.
,16(57,172PRMHBNRQWDNW\
QD]ZLVNRLPLHHPDLOSOHFGDWDBXURG]HQLD]DZRGORNDOL]DFMDVWDQ]DLQWHUHVRZDQLDV]XND
9$/8(6
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
.
$XWRUNDWHNVWöZ
WHFKQLF]Q\FK
3DQQD
.DMDNDUVWZRJDG\
=ZLÈ]NöZSU]\MDFLöï
,16(57,172PRMHBNRQWDNW\
QD]ZLVNRLPLHSOHFGDWDBXURG]HQLD]DZRGORNDOL]DFMDVWDQ]DLQWHUHVRZDQLDV]XND
9$/8(6
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
.
$XWRUNDWHNVWöZ
WHFKQLF]Q\FK
:DUV]DZD0=
3DQQD
.DMDNDUVWZRJDG\
=ZLÈ]NöZSU]\MDFLöï
,16(57,172PRMHBNRQWDNW\
QD]ZLVNRLPLHHPDLOSOHFGDWDBXURG]HQLD]DZRGORNDOL]DFMDVWDQ]DLQWHUHVRZDQLDV]XND
9$/8(6
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
.
$XWRUNDWHNVWöZ
WHFKQLF]Q\FK
:DUV]DZD0=
3DQQD
.DMDNDUVWZRJDG\
=ZLÈ]NöZSU]\MDFLöï
,16(57,172PRMHBNRQWDNW\
QD]ZLVNRLPLHHPDLOSOHFGDWDBXURG]HQLD]DZRGORNDOL]DFMDVWDQ]DLQWHUHVRZDQLDV]XND
9$/8(6
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
.
$XWRUNDWHNVWöZ
WHFKQLF]Q\FK
:DUV]DZD0=
3DQQD
.DMDNDUVWZRJDG\
=ZLÈ]NöZSU]\MDFLöï
jesteś tutaj 75
Kolejne rozwiązania ćwiczeń
Zaostrz ołówek
Rozwiązanie Używany system zarządzania relacyjnymi bazami danych zawsze poinformuje Cię, jeśli zapytanie,
które chcesz wykonać, będzie nieprawidłowe; jednak zwracane przez niego informacje czasami
mogą być mało konkretne. Przyjrzyj się przedstawionym poniżej poleceniom INSERT. W pierwszej
kolejności spróbuj określić, co jest nie tak z każdym z nich, a następnie wpisz je w konsoli
i przekonaj się, co na ich temat powie system zarządzania bazami danych.
,16(57,172PRMHBNRQWDNW\
QD]ZLVNRLPLHHPDLOSOHFGDWDBXURG]HQLD]DZRGORNDOL]DFMDVWDQ]DLQWHUHVRZDQLDV]XND9$/8(6
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
.
$XWRUNDWHNVWöZWHFKQLF]Q\FK
3DQQD
.DMDNDUVWZRJDG\
=ZLÈ]NöZSU]\MDFLöï
Na liście kolumn umieściliśmy kolumnę
„lokalizacja”, jednak w dalszej części
zapytania — na liście wartości —
Nie określono wartości kolumny "lokalizacja". pominęliśmy wartości tej kolumny.
Co jest nie w porządku? ...........................................................................................................................................................
ERROR 1136 (21S01): Column count doesn't match value count at row 1.
Komunikat wyświetlony przez RDBMS: .................................................................................................................................
Zauważ, że wiele różnych problemów może powodować
zgłoszenie tego samego błędu. Uważaj na błędy typograficzne,
,16(57,172PRMHBNRQWDNW\ czasami odnalezienie ich może przysporzyć sporo problemów.
QD]ZLVNRLPLHSOHFGDWDBXURG]HQLD]DZRGORNDOL]DFMDVWDQ]DLQWHUHVRZDQLDV]XND
9$/8(6
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
.
$XWRUNDWHNVWöZ
WHFKQLF]Q\FK
:DUV]DZD
3DQQD
.DMDNDUVWZRJDG\
=ZLÈ]NöZSU]\MDFLöï
Tym razem mamy już wartości dla
wszystkich kolumn tabeli, jednak na liście
kolumn pominęliśmy nazwę tej kolumny.
Brak kolumny dla adresu poczty elektronicznej na liście kolumn.
Co jest nie w porządku? ...........................................................................................................................................................
ERROR 1136 (21S01): Column count doesn't match value count at row 1.
Komunikat wyświetlony przez RDBMS: .................................................................................................................................
,16(57,172PRMHBNRQWDNW\
QD]ZLVNRLPLHHPDLOSOHFGDWDBXURG]HQLD]DZRGORNDOL]DFMDVWDQ]DLQWHUHVRZDQLDV]XND
9$/8(6
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
.
$XWRUNDWHNVWöZ
WHFKQLF]Q\FK
:DUV]DZD0=
3DQQD
.DMDNDUVWZRJDG\
=ZLÈ]NöZSU]\MDFLöï
Brak przecinka pomiędzy
wartościami 'Autorka tekstów
Brak przecinka między dwiema wartościami. technicznych' oraz 'Warszawa, MZ';
Co jest nie w porządku? ...........................................................................................................................................................
ERROR 1136 (21S01): Column count doesn't match value count at row 1.
Komunikat wyświetlony przez RDBMS: .................................................................................................................................
,16(57,172PRMHBNRQWDNW\
QD]ZLVNRLPLHHPDLOSOHFGDWDBXURG]HQLD]DZRGORNDOL]DFMDVWDQ]DLQWHUHVRZDQLDV]XND
9$/8(6
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
.
$XWRUNDWHNVWöZ
WHFKQLF]Q\FK
:DUV]DZD0=
3DQQD
.DMDNDUVWZRJDG\
=ZLÈ]NöZSU]\MDFLöï
76 Rozdział 1.
Dane i tabele
,16(57,172PRMHBNRQWDNW\ WYSIL
QD]ZLVNRLPLHHPDLO SZARE KOMÓRKI
9$/8(6
Jak myślisz, co się pojawia w tabeli,
.RZDOVND
-XOLDQD
MXND#SL]]DQ]NFRPSO
w kolumnach, których wartości nie
zostały określone?
ż
W tym przypadku w tabeli zapisujemy jedynie część danych. Poniewa
system zarządza nia bazami danych nie wie, o jakie dane nam chodzi,
zapisywane.
musimy jawnie określić nazwy kolumn oraz wartości, jakie będą
jesteś tutaj 77
Wstawianie niekompletnych rekordów
LPLH
3DW
]DLQWHUHVRZDQLD "
V]XND "
78 Rozdział 1.
Dane i tabele
Chcemy pobrać
dka A to nazwa tabeli,
wszystkie dane … a właśnie gwiaz dzi której zawartość
przechowywane (*) informuje, że cho ny. nas interesuje.
um
w naszej tabeli… o WSZYSTKIE kol
6(/(&7 )520PRMHBNRQWDNW\
ie
kojn Na razie nie przejmuj się tym, co robi
Sp o
W każdej kolu daliśmy, została
polecenie SELECT.
ość NULL.
A teraz spróbuj to zrobić sam. Aby wyniki zostały ładnie wyświetlone, będziesz musiał
odpowiednio powiększyć okno konsoli.
WYSIL
SZARE KOMÓRKI
Teraz już wiesz, że we wszystkich kolumnach,
których wartości nie zostały określone, została
umieszczona wartość 18//. Ale co właściwie to
18// oznacza?
jesteś tutaj 79
Wszystko o wartości NULL
=;6LOd^KTOWXSM
W tym tygodniu tematem audycji są:
Wyznania wartości NULL
Rusz głową!: Witam, NULL. Muszę przyznać, że nie Rusz głową!: Hej, uspokój się, proszę, i pozwól mi to
spodziewałem się ciebie zobaczyć. Przypuszczałem, że wszystko wyjaśnić. Nie jesteś równa zeru i nie jesteś pustym
w ogóle nie istniejesz. Krążą pogłoski, że, przepraszam łańcuchem znaków. A nawet nie jesteś równa samej sobie.
za wyrażenie, jesteś zwyczajnym zerem, albo że wcale nie Przecież to nie ma najmniejszego sensu!
istniejesz.
NULL: Wiem, że to trochę skomplikowane. Kiedy myślę
NULL: Nie mogę uwierzyć, że w ogóle słuchałeś takich o tym, wyobrażam sobie, że jestem niezdefiniowana. Jestem
kłamstw. Spójrz, jestem tutaj i to jestem całkowicie niczym zawartość zamkniętego pudełka. Wewnątrz niego
rzeczywista. Czy zatem uważasz, że jestem niczym, jedynie może być cokolwiek. Nie możesz zatem porównać jednego
prochem pod twoimi stopami? zamkniętego pudełka z drugim, ponieważ nie wiesz, co
w nich jest. Może się nawet okazać, że takie pudełko, czyli
Rusz głową!: Już dobrze, uspokój się, proszę. Chodzi ja, jest puste. Ale po prostu tego nie wiesz.
tylko o to, że pojawiasz się zawsze tam, gdzie nie ma żadnej
wartości… Rusz głową!: Słyszałem jednak, że czasami jesteś
niepożądana. W niektórych przypadkach okazuje się,
NULL: Jasne, ale lepiej, żebym to ja się pojawiła, niż na że NULL może przysparzać problemów.
przykład zero lub pusty łańcuch znaków.
NULL: Przyznaję, że czasami pojawiam się w miejscach,
Rusz głową!: A co to takiego, ten pusty łańcuch znaków? w których raczej nie chciano by mnie widzieć. Chodzi o to,
NULL: To coś, co powstanie, kiedy zapiszesz obok siebie że niektóre kolumny zawsze powinny mieć jakąś wartość.
dwa apostrofy, nie umieszczając wewnątrz nich żadnych Weźmy na przykład takie „nazwisko”. Umieszczanie
innych znaków. To cały czas jest łańcuch znaków, lecz ma wartości NULL w kolumnie nazwiska w tabeli nie ma
zerową długość. Powstanie, gdy na przykład kolumnie LPLH najmniejszego sensu.
w tabeli PRMHBNRQWDNW\ przypiszesz
Rusz głową!: Czy to oznacza, że jeśli porównamy cię do Rusz głową!: Tak naprawdę, to wcale nie wyglądasz jak
zera lub pustego łańcucha znaków, to okaże się, że nie zamknięte pudełko.
jesteście równe? NULL: To już przesada. Mam sporo miejsc, które muszę
NULL: Absolutnie nie! Nigdy nie będę równa zeru. Co odwiedzić, i wartości, którymi muszę się zająć.
więcej, nigdy nie będę równa innej wartości NULL. My,
NULL-e, nigdy nie jesteśmy sobie równe. Wartość może
być NULL, jednak nigdy nie będzie równa NULL, gdyż
NULL jest wartością niezdefiniowaną! Rozumiesz?
80 Rozdział 1.
Dane i tabele
&5($7(7$%/(PRMHBNRQWDNW\
Wystarczy dodać słowa NOT
NULL tuż za określeniem typu
kolumny.
W tym przypadku będziesz
musiał określić wartość
QD]ZLVNR9$5&+$512718// kolumny w poleceniu
INSERT. W przeciwnym
razie, jeśli pominiesz
LPLH9$5&+$512718// wartość, zostanie
zgłoszony błąd.
Zaostrz ołówek
Przyjrzyj się wszystkim kolumnom w poleceniu
&5($7(7$%/(, służącym do tworzenia naszej
&5($7(7$%/(PRMHBNRQWDNW\ tabeli PRMHBNRQWDNW\. Do których z nich
powinniśmy także dodać słowa 12718//?
Zastanów się, które kolumny nigdy nie powinny
QD]ZLVNR9$5&+$512718// być puste; zaznacz je.
Aby Ci pomóc, zaznaczyliśmy dwie takie kolumny,
LPLH9$5&+$512718//
pozostałe zaznacz sam. Przede wszystkim
HPDLO9$5&+$5 skoncentruj się na kolumnach, które później mogą
być używane do wyszukiwania informacji, oraz
SOHF&+$5 na takich, których wartości są unikalne.
GDWDBXURG]HQLD'$7(
]DZRG9$5&+$5
ORNDOL]DFMD9$5&+$5
VWDQ9$5&+$5
]DLQWHUHVRZDQLD9$5&+$5
V]XND9$5&+$5
jesteś tutaj 81
Kolejne rozwiązanie ćwiczenia
Zaostrz ołówek
Rozwiązanie
Przyjrzyj się wszystkim kolumnom w poleceniu
&5($7(7$%/(, służącym do tworzenia naszej
tabeli PRMHBNRQWDNW\. Do których z nich
&5($7(7$%/(PRMHBNRQWDNW\ powinniśmy także dodać słowa kluczowe 127
18//? Zastanów się, które kolumny nigdy nie
powinny być puste; zaznacz je.
QD]ZLVNR9$5&+$512718// Aby Ci pomóc, zaznaczyliśmy dwie takie kolumny,
pozostałe zaznacz sam. Przede wszystkim
LPLH9$5&+$512718// skoncentruj się na kolumnach, które później
mogą być używane do wyszukiwania informacji,
HPDLO9$5&+$5
oraz takich, których wartości są unikalne
SOHF&+$5
GDWDBXURG]HQLD'$7(
]DZRG9$5&+$5
ORNDOL]DFMD9$5&+$5
Słowa kluczowe NOT NULL powinny
VWDQ9$5&+$5 zostać dodane do wszystkich kolumn.
]DLQWHUHVRZDQLD9$5&+$5 Wszystkie kolumny tabeli będą
używane podczas wyszukiwania.
V]XND9$5&+$5 Bardzo ważne jest, by mieć
pewność, że informacje są
kompletne, a w tabeli zostały
zapisane prawidłowe dane…
82 Rozdział 1.
Dane i tabele
Tutaj tworzymy
naszą tabelę
z wyrażeniem
NOT NULL
w każdej kolumnie.
A oto
i wyświetlona
struktura tabeli.
Zwróć uwagę
na słowo NO
w kolumnie Null.
jesteś tutaj 83
Słowo kluczowe DEFAULT
&5($7(7$%/(OLVWDBSDF]NRZ
- Chcemy mieć pewność, że w tej
kolumnie zawsze będzie zapisana jakaś
wartość. Nie tylko możemy sprawić,
że
QD]ZDBSDF]ND9$5&+$5
nie będzie się w niej pojawiać wartość
NULL, lecz także możemy jej przypisać
DOMYŚLNĄ wartość, na przykład 1,00
zł.
W\SBSDF]ND9$5&+$5
FHQDBSDF]ND'(&12718//'()$8/7
- To właśnie ta wartość zostanie
zapisana w tabeli w kolumnie
cena_paczka, jeśli żadna inna
wartość nie zostanie jawnie okre
ślona.
OLVWDBSDF]NRZ
Zastosowanie
nazwa_paczka typ_paczka cena_paczka
słowa kluczowego
Jagodowiec z nadzieniem 2.00
Pączek cynamonowy pierścień 1.00
DEFAULT sprawi,
Gwiazda rocka ciastko plecione 1.00 że w pustej
Karmelowiec ciastko plecione 1.00 kolumnie
Jabłkowiec z nadzieniem 1.40 zostanie zapisana
określona wartość
Oto jak wyglądałaby nasza tabela,
gdyby podczas zapisywania w niej domyślna.
danych w rekordach dotyczących
pączków pączek cynamonowy,
gwiazda rocka oraz karmelowiec nie
została określona wartość kolumny
cena_paczka.
84 Rozdział 1.
Dane i tabele
.LPMH
Grupa poprzebieranych w kostiumy słów kluczowych i typów danych
VWHP"
SQL bawi się w grę towarzyską o nazwie „Zgadnij, kim jestem”. Jej
uczestnicy udzielają Ci podpowiedzi, a Ty próbujesz na ich podstawie
odgadnąć, kim oni są. Załóż, że uczestnicy gry zawsze mówią
prawdę. Jeśli zdarzy się, że udzielona podpowiedź odnosi się do kilku
uczestników gry, to zapisz nazwy ich wszystkich. Nazwy uczestników
]HVWUR
gry zapisz w pustych miejscach widocznych z prawej strony Q\
podpowiedzi.
Uczestnicy
Bez nas nie byłbyś w stanie utworzyć tabeli. CREATE DATABASE, USE DATABASE,
.........................................................................
DROP TABLE
jesteś tutaj 85
Przegląd SQL-a
Przybornik SQL
CELNE
A zatem opanowałeś już materiał z pierwszego
52='=,$
86 Rozdział 1.
3ROHFHQLH6(/(&7
Pobieranie podarowanych danych
Czy naprawdę lepiej jest dawać, niż brać? W przypadku korzystania z baz danych
najprawdopodobniej częściej będziesz musiał pobierać z nich dane, niż je zapisywać.
I właśnie w tych wszystkich sytuacjach przydadzą Ci się informacje przedstawione
w niniejszym rozdziale: poznasz w nim bardzo przydatne polecenie 6(/(&7 i dowiesz się,
jak uzyskać dostęp do tych wszystkich ważnych informacji, które wcześniej zapisywałeś
w swoich tabelach. Co więcej, dowiesz się także, w jaki sposób stosować klauzulę :+(5(
i operatory $1' i 25, by nie tylko pobierać dane, lecz wyświetlać tylko te, które są Ci potrzebne.
Ania z Wrocławia
6(/(&7
)520PRMHBNRQWDNW\
Dane o Ani są zapisane
gdzieś w tabeli Grzesia…
Bądź Grześkiem
Twoim zadaniem jest wcielenie się w rolę
Grześka. Musisz przejrzeć fragment
danych z tabeli moje_kontakty
przedstawionych na następnej stronie
i odszukać w nich Anię z Wrocławia.
88 Rozdział 2.
Polecenie SELECT
ty ma całkiem
Tabela moje_kontak ej widocznych
sporo kol um n. Po niż
rwszych.
jest tylko kilka pie
t koniec
To jeszcze nie jes ał
sie k mi
tabeli! Grze
karteczek.
naprawdę sporo
jesteś tutaj 89
Szukanie właściwej Ani
Do:
Od: Grzesiek <grzegorz@listagrzeska.com.pl>
Temat: Czy spotkaliśmy się w kawiarni
WYSIL Gwiezdny Pył?
90 Rozdział 2.
Polecenie SELECT
$QQD
. Jeśli wartość pasuje, to cały wiersz jest zwracany; w przeciwnym razie
nie są zwracane żadne dane.
beli.
To jest nazwa ta
6(/(&7
)520PRMHBNRQWDNW\
Na końcu dodaj średnik i naci
klawisz Enter, by poskładać śnij
:+(5(LPLH
$QQD
polecenie i wydać polecenie:
całe
nazwa kolumny ‘imie’ jest rów„Jeśli
‘Anna’, to wyświetl mi ten rekona
rd”.
WHERE
stem Wystarczy, że W SQL-u znak =
informuje sy umieścisz to słowo oznacza pytanie Wartość kolumny ‘imie’.
zarządzania ch, w klauzuli WHERE, — czy jest równy. Nie zapomnij zapisać jej
bazami dany y a poinformujesz tym w apostrofach — w końcu
em
że poszukuj samym, że należy to zwyczajny łańcuch znaków.
konkretnych zwracać uwagę
informacji. wyłącznie na wartość
zapisaną w kolumnie
‘imie’.
jesteś tutaj 91
Jesteś *
6(/(&7 )520PRMHBNRQWDNW\
:+(5(LPLH
$QQD
Jestem gwiazdą!
Jeśli w poleceniu
kod SELECT *, wy SQL zobaczysz
że prosisz system obraź sobie,
bazami danych o zarządzania
WSZYSTKICH KOZWRÓCENIE
LUMN TABELI. pobrać
y j g w ia zdki, by tabeli.
Uż n y
ie kolum
wszystk
Nie istnieją
głupie pytania
P.: A jeśli nie będę chciał P.:Czy ta gwiazdka to znak P.: Czy są jeszcze inne znaki
pobierać wartości wszystkich mnożenia? mające podobnie jak gwiazdka
kolumn? Czy mogę użyć jakiegoś specjalne znaczenie?
innego znaku zamiast gwiazdki? O.: Tak, to dokładnie ten sam znak
umieszczony na klawiszu z cyfrą 8. Wciśnij O.: Owszem, w języku SQL są stosowane
O.: Innego znaku nie możesz użyć, jednak klawisz Shift i naciśnij ten klawisz. jeszcze inne znaki specjalne — nazywane
zwracanie wszystkich kolumn nie jest także znakami zarezerwowanymi. Poznasz
Jednak choć jest to ten sam znak, to
jedynym rozwiązaniem, jakim dysponujemy. je w dalszej części książki. Jednak jak
w terminologii języka SQL jest on zawsze
Już niedługo dowiesz się, w jaki sposób na razie gwiazdka jest jedynym z takich
określany jako gwiazdka. I całkiem słusznie,
można zwracać wartości jedynie wybranych znaków, który powinieneś znać. Jest
gdyż łatwiej jest powiedzieć 6(/(&7
kolumn, dzięki czemu wyniki zapytania ona także jedynym znakiem specjalnym
JZLD]GND)520Į niż 6(/(&7]QDN
będą łatwiejsze do zinterpretowania. używanym w pierwszej części polecenia
PQRĝHQLD)520Į.
6(/(&7.
92 Rozdział 2.
Polecenie SELECT
Salon Rusz głową! chce wzbogacić swoje menu o wybór drinków. Bazując na wiedzy zdobytej
w rozdziale 1., stwórz poniższą tabelę i zapisz w bazie zamieszczone w niej dane.
Ćwiczenie Poniższa tabela należy do bazy danych o nazwie drinki. Zawiera ona tabelę o nazwie
proste_drinki, w której są gromadzone przepisy na napoje tworzone na bazie jedynie dwóch
składników.
SURVWHBGULQNL
2GSRZLHGě]QDMG]LHV]QDVWURQLH
jesteś tutaj 93
Wyszukiwanie drinków
Zaostrz ołówek
6(/(&7
)520SURVWHBGULQNL:+(5(VNODGQLNBJORZQ\
6SULWH
Wyszukane drinki:
Wyszukane drinki:
Wyszukane drinki:
Wyszukane drinki:
6(/(&7 )520SURVWHBGULQNL:+(5(LORVF
Wyszukane drinki:
6(/(&7
)520SURVWHBGULQNL:+(5(LORVF
Wyszukane drinki:
6(/(&7
)520SURVWHBGULQNL:+(5(VNODGQLNBJORZQ\!
WRQLN
Wyszukane drinki:
6(/(&7
)520SURVWHBGULQNL:+(5(LORVF
Wyszukane drinki:
94 Rozdział 2.
Polecenie SELECT
Aby zdobyć kilka dodatkowych punktów, zapisz poniżej polecenie SQL, które nie będzie działać…
jesteś tutaj 95
Wyszukiwanie drinków. Rozwiązanie
Zaostrz ołówek
Rozwiązanie
Nazwij ten drink
Wykorzystaj utworzoną przed chwilą tabelę SURVWHBGULQNL i spróbuj
wykonać poniższe zapytania na swoim komputerze. Zanotuj sobie,
które drinki są wyświetlane jako wyniki poszczególnych zapytań.
6(/(&7
)520SURVWHBGULQNL:+(5(VNODGQLNBJORZQ\
6SULWH
6(/(&7 )520SURVWHBGULQNL:+(5(LORVF
6(/(&7
)520SURVWHBGULQNL:+(5(LORVF
6(/(&7
)520SURVWHBGULQNL:+(5(VNODGQLNBJORZQ\!
WRQLN
Kolejna prawidłowo .
napisana klauzula WHERE
Wyszukane drinki: Blue Moon, Lone Tree, Grayhound, Soda and It
6(/(&7
)520SURVWHBGULQNL:+(5(LORVF
Wyszukane drinki: Blackthorn, Blue Moon, Lime Fizz, Lone Tree, Grayhoud, Bull Frog
96 Rozdział 2.
Polecenie SELECT
Aby zdobyć dodatkowe punkty, zapisz poniżej polecenie, które nie będzie działać…
To jest klauzula WHER
która nie będzie działaE,
Umieszczony na końcu ć.
znaków musi zostać zapłańcuch
wewnątrz znaków apo isany
strofu.
:+(5(VNODGQLNBJORZQ\ ZRGDVRGRZD
:+(5(VNODGQLNBGRGDWNRZ\ VRNSRPDUDQF]RZ\
To zapytanie działa i
nie powoduje wystąpie
jakichkolwiek błędów,
jednak nie zwraca ono nia
żadnych wyników. SQ
L oczekuje zastosowani
znaków apostrofu, jak a
zapisywania danych w robiliśmy podczas
tabeli.
:+(5(LORVF
To zapytanie działa,
pomimo
iż nie powinno, gdyż
wartości
kolumn typu INT nie
muszą być
zapisywane w apostr
ofach.
:+(5(LORVF
I to podobnie.
Dwa ostatnie z przedstawionych na tej stronie zapytań będą działać, gdyż większość
systemów obsługi relacyjnych baz danych zapewnia pewną dozę swobody. Zignorują
one apostrofy i będą traktowały wartości typów DEC oraz INT jako liczby, choć
apostrofy sugerują, że należałoby je uznać za łańcuchy znaków. Przedstawione
polecenia SQL nie są całkowicie PRAWIDŁOWE, jednak systemy zarządzania bazami
danych zignorują to.
jesteś tutaj 97
Konwencje formatowania danych różnych typów
Ten goś
e przez pyta o ć ciągle
DEC, używanślenie typu pączki…
kolegów ok re
wartości
DECIMAL. Tezapisywane
nigdy nie są h.
w apostrofac
BLOB. Jego wartości
zawsze są zapisywane
w apostrofach.
DATETIME, TIME
TIMESTAMP zaws oraz
ze
używają apostrofów DATE. Te wartości
. zawsze są zapisywane
w apostrofach.
Wartości typów
VARCHAR, CHAR,
wa
VARCHAR zawsze uży
znaków apostrofu. BLOB, DATE
oraz TIME muszą
być zapisywane
w apostrofach.
My apostrofy Apostrofy? — Nie, dziękuję!
Wymóg ten nie
CHAR DEC
dotyczy jednak
VARCHAR INT
DATE wartości liczbowych,
DATETIME, TIME takich jak wartości
oraz TIMESTAMP kolumn typów
BLOB DEC oraz INT.
98 Rozdział 2.
Polecenie SELECT
9$/8(6
)UDV]\QVNL
6WHIDQ
VIUDV]\QVNL#PHJDLPSUH]DFRP
SO
'-DQLPDWRULPSUH]PX]\F]Q\FK
6ZLHWRFKORZLFH6/
.DZDOHU
MHG]HQLH]0F'RQDOGijVPX]\ND]DEDZD
]LRPDOLJLWDU]\VWRZ
Ale po próbie wykonania tego polecenia program konsoli chyba się „zawiesił”
i przestał odpowiadać. Grześ wpisał nawet kilka średników, próbując
zakończyć i wykonać polecenie. Wszystko na nic.
WYSIL
Za każdym ra
Grzesiek naci zem, gdy
Enter, pojawiaska klawisz
znak monitu: się ten sam
!. SZARE KOMÓRKI
Jak myślisz, co jest przyczyną problemów Grześka?
jesteś tutaj 99
Kiedy dobry apostrof schodzi na złą drogę
Niedopasowane apostrofy
Dokładnie! Kiedy Grzesiek próbował wykonać polecenie SQL, program,
który je analizował, oczekiwał parzystej liczby apostrofów — po jednym
przed i za każdą wartością typu &+$5, 9$5&+$5 oraz '$7(. Jednak nazwa
sieci fast foodów 0F'RQDOGijV umieszczona w polu zainteresowań utrudniła
sprawę, gdyż pojawił się w niej dodatkowy apostrof. A zatem system
zarządzania bazami danych wciąż oczekuje na drugi apostrof do pary.
ie
kojn Czy jesteś w stanie odzyskać kontrolę
Sp o nad oknem konsoli?
ego
Wpisanie dodatkow
rof u i śre dni ka kończy
ap ost
nie SQ L IN SE RT .
polece
100 Rozdział 2.
Polecenie SELECT
,16(57,172PRMHBNRQWDNW\
]DLQWHUHVRZDQLD
9$/8(6
MHG]HQLH]0F'RQDOG?
VPX]\ND]DEDZD
Kiedy jestem sam,
musi mnie poprzedzać
Apostrof jest w lewy ukośnik.
SQ
znakiem „zarezerw L-u
Oznacza to, że maowanym”.
w języku SQL ko on
nkretne
przeznaczenie.
naczania
Służy on do oz ńca
początku or az ko
tekstów.
Nie istnieją
głupie pytania
P.: Czy to jest dokładnie ten sam P.: Czy dane umieszczane w kolum- wewnątrz tekstu od apostrofu określającego,
apostrof? nach DEC oraz INT też powinny być gdzie zawartość kolumny się zaczyna i kończy.
P.:
zapisywane w apostrofach?
O.: Tak, to jest dokładnie ten sam apostrof. Czy nie można by ułatwić bazie
Jednak w języku SQL ma on ściśle określone O.: Nie. W przypadku kolumn liczbowych w zapi- danych rozróżnienia początku i końca
przeznaczenie. Informuje on oprogramowanie sywanych w nich danych nie ma żadnych odstępów, wartości kolumny tekstowej poprzez
do zarządzania bazami danych, że dane zatem bez większych problemów można określić, oznaczanie ich przy użyciu znaków
umieszczone pomiędzy dwoma apostrofami gdzie takie dane się zaczynają i gdzie kończą. cudzysłowu, a nie apostrofów?
są danymi tekstowymi.
P.: A zatem apostrofy są używane O.: Nie. Jeśli używasz poleceń SQL w jakimś
P.: Jakie typy danych wymagają wyłącznie do oznaczania wartości języku programowania, takim jak PHP, który
zastosowania apostrofów? zapisywanych w kolumnach stosowaliśmy w przykładach zamieszczonych
tekstowych? w dalszej części książki, to nie należy stosować
O.: Wszystkie dane tekstowe. Dane tekstowe w nich cudzysłowów. W przypadku pisania
to dane zapisywane w kolumnach 9$5&+$5, O.: Owszem. Kłopot w tym, że w takich programów znaki cudzysłowu informują: „tu
&+$5, %/2% oraz 7,0('$7(. Czyli wszystko, wartościach mogą się pojawiać znaki odstępu. zaczyna się polecenie SQL”, a dzięki temu
co nie jest liczbą. Problemy także pojawiają się w przypadkach, apostrofy mogą zostać zinterpretowane jako
gdy dane tekstowe zawierają apostrofy. SQL fragment polecenia, a nie element języka
nie potrafi odróżnić apostrofu umieszczonego programowania.
,16(57,172PRMHBNRQWDNW\
9$/8(6
)UDV]\QVNL
6WHIDQ
VIUDV]\QVNL#PHJDLPSUH]DFRPSO
'-DQLPDWRULPSUH]PX]\F]Q\FK
6ZLHWRFKORZLFH6/
.DZDOHU
MHG]HQLH]0F'RQDOG?
VPX]\ND]DEDZD
]LRPDOLJLWDU]\VWRZ
Oznaczenie, że znak apostrofu nale
do łańcucha znaków, poprzez ży
poprzedzenie
go znakiem lewego ukośnika.
,16(57,172PRMHBNRQWDNW\
9$/8(6
)UDV]\QVNL
6WHIDQ
VIUDV]\QVNL#PHJDLPSUH]DFRPSO
'-DQLPDWRULPSUH]PX]\F]Q\FK
6ZLHWRFKORZLFH6/
.DZDOHU
MHG]HQLH]0F'RQDOG
VPX]\ND]DEDZD
]LRPDOLJLWDU]\VWRZ
Znak apostrofu można
dodatkowym znakiem także poprzedzić
apostrofu.
WYSIL
SZARE KOMÓRKI
Jakie inne znaki mogą powodować te same problemy?
102 Rozdział 2.
Polecenie SELECT
Jeśli w Twojej tabeli pojawiają się dane, które mogą zawierać apostrofy, to może się zdarzyć,
że będziesz musiał je wyszukać. Aby zastosować w poleceniu 6(/(&7 klauzulę :+(5( z danymi
Ćwiczenie zawierającymi apostrof, będziesz musiał poprzedzić go lewym ukośnikiem. Dokładnie tak samo
jak w przypadku zapisywania danych.
Zapisz poniższe polecenie, wykorzystując dwie poznane na poprzedniej stronie metody
poprzedzania apostrofów.
6(/(&7
)520PRMHBNRQWDNW\
:+(5(
]DLQWHUHVRZDQLD
MHG]HQLH]0F'RQDOG
V
PX]\ND]DEDZD
Jeśli w Twojej tabeli pojawiają się dane, które mogą zawierać apostrofy, to może się zdarzyć,
że będziesz musiał je wyszukać. Aby zastosować w poleceniu SELECT klauzulę WHERE z danymi
Rozwiązanie zawierającymi apostrof, będziesz musiał poprzedzić go lewym ukośnikiem. Dokładnie tak samo
ćwiczenia jak w przypadku zapisywania danych.
Zapisz poniższe polecenie, wykorzystując dwie poznane na poprzedniej stronie metody
poprzedzania apostrofów.
6(/(&7
)520PRMHBNRQWDNW\
:+(5(
]DLQWHUHVRZDQLD
MHG]HQLH]0F'RQDOG
V
PX]\ND]DEDZD
104 Rozdział 2.
Polecenie SELECT
Wypróbuj to w domu
Ćwiczenie Zanim spróbujesz wykonać poniższe polecenie SELECT, naszkicuj, jak według Ciebie będzie wyglądać
wynikowa tabela danych. (Jeśli musisz sobie przypomnieć strukturę tabeli proste_drinki, znajdziesz ją
na stronie 93).
Zastąpiliśmy znak *
nazwami trzech kolumn.
6(/(&7QD]ZDVNODGQLNBJORZQ\VNODGQLNBGRGDWNRZ\
)520SURVWHBGULQNL
:+(5(VNODGQLNBJORZQ\
ZRGDVRGRZD
Wypróbuj to w domu
Zanim spróbujesz wykonać poniższe polecenie 6(/(&7, naszkicuj, jak według Ciebie będzie wyglądać
Rozwiązanie wynikowa tabela danych.
ćwiczenia
106 Rozdział 2.
Polecenie SELECT
6(/(&7QD]ZDVNODGQLNBJORZQ\VNODGQLNBGRGDWNRZ\
ie ograniczyć
)520SURVWHBGULQNL eśmy w stan
… jednak jest , wybierając kolumny,
ików .
ilość wyn zwrócone
ści mają być
których warto
Zaostrz ołówek
6(/(&7QD]ZD)520SURVWHBGULQNL
:+(5(
VNODGQLNBJORZQ\ VRNZLVQLRZ\
Na następnej stronie uzupełnij cztery inne polecenia SQL, które także zwrócą
nazwę drinka „Kiss on the Lips”.
SURVWHBGULQNL
Blue Moon woda sodowa 45 sok z jagód 22 wymieszać z lodem, odcedzić do szklanki koktajlowej
z plasterkiem cytryny
Oh My Gosh nektar brzoskwiniowy 30 sok ananasowy 30 wymieszać z lodem, odcedzić do wysokiej szklanki
Lime Fizz Sprite 45 sok z cytryny 22 wymieszać z lodem, odcedzić do szklanki koktajlowej
Kiss on the Lips sok wiśniowy 60 nektar morelowy 210 podawać z lodem i słomką do picia
Hot Gold nektar brzoskwiniowy 90 sok pomarańczowy 180 wlać gorący sok pomarańczowy do kubka,
dolać do niego nektaru brzoskwiniowego
Lone Tree woda sodowa 45 sok wiśniowy 22 wymieszać z lodem, odcedzić do szklanki koktajlowej
Greyhound woda sodowa 45 sok z grapefruita 150 podawać z lodem, dobrze wymieszać
Indian Summer sok jabłkowy 60 gorąca herbata 180 wlać sok do kubka, dodać herbaty
Bull Frog mrożona herbata 45 lomoniada 150 podawać z lodem i plasterkiem cytryny
Soda and It woda sodowa 60 sok z winogron 30 wstrząsnąc w szklance koktajlowej, podawać bez lodu
108 Rozdział 2.
Polecenie SELECT
6(/(&7
:+(5(
6(/(&7
:+(5(
6(/(&7
:+(5(
6(/(&7
:+(5(
A teraz napisz trzy polecenia SQL, które pozwolą zwrócić nazwę „Bull Frog”.
Zaostrz ołówek
Rozwiązanie
Uzupełnij cztery inne polecenia SQL, które także zwrócą nazwę drinka „Kiss on the Lips”.
A teraz napisz trzy polecenia SQL, które pozwolą zwrócić nazwę „Bull Frog”.
110 Rozdział 2.
Polecenie SELECT
CELNE
SPOSTRZEŻENIA
Określając w klauzuli :+(5( warunki dotyczące pól Jeśli wydałeś polecenie SQL, lecz wszystko wskazuje na to,
tekstowych, stosuj apostrofy. że system zarządzania bazami danych nie wykonał go,
to sprawdź, czy w poleceniu nie brakuje jakiegoś apostrofu.
Nie stosuj apostrofów, jeśli warunki używane w klauzuli
:+(5( operują na polach liczbowych. Jeśli tylko możesz, to staraj się pobierać wartości
z konkretnych kolumn, a nie ze wszystkich.
Jeśli chcesz zwrócić wartości wszystkich kolumn,
za słowem kluczowym 6(/(&7 umieść
.
Nie istnieją
głupie pytania
P.: Co zrobić w sytuacji, gdy polecenie O.: Nie. Word nie jest dobrym programem do tego celu, gdyż nie
musi zwrócić wszystkie kolumny tabeli? Czy będzie w żaden widoczny sposób wyświetlał znaków specjalnych,
powinienem podać ich nazwy w poleceniu SELECT, które ewentualnie będziesz musiał usunąć z polecenia. Znacznie
czy użyć znaku *? lepiej do tego celu będzie się nadawać zwyczajny Notatnik.
O.: Jeśli potrzebujesz wszystkich kolumn, to absolutnie P.: A jeśli chodzi o poprzedzanie znaku
powinieneś zastosować znak
. Staraj się go unikać wyłącznie apostrofu… Czy istnieją jakieś powody
w przypadkach, gdy interesuje Cię jedynie kilka konkretnych przemawiające za zastosowaniem jednej
kolumn tabeli. z dwóch dostępnych metod?
P.: Skopiowałem polecenie SQL z internetu O.: Raczej nie. My preferujemy zastosowanie znaku ukośnika,
i spróbowałem je wykonać na swoim komputerze, jednak tylko dlatego, gdyż w tym przypadku w razie jakichkolwiek
jednak cały czas pojawiały się jedynie komunikaty problemów łatwiej jest zauważyć miejsca, gdzie wewnątrz tekstu
o błędach. Czy robię coś źle? są umieszczone dodatkowe apostrofy. Na przykład łatwiej jest
'RQDOGV
Chciałabym odszukać
najlepszy pączek z lukrem
bez konieczności przeglądania
tych wszystkich wyników.
SDF]NLBRFHQ\
miejsce godzina data typ ocena komentarze
Kafeteria Gwiezdny Pył 7:43 23.4 cynamonowy z lukrem 6 zbyt dużo przypraw
Pączki u Donalda 8:56 25.8 zwyczajny z lukrem 5 tłusty
Pączki u Donalda 7:58 26.4 z dżemem 6 nieświeży, ale smaczny
Kafeteria Gwiezdny Pył 10:35 24.4 zwyczajny z lukrem 7 ciepły, ale nie gorący
Chrupki Król 9:38 26.9 z dżemem 6 za mało dżemu
Kafeteria Gwiezdny Pył 7:48 23.4 z dżemem i lukrem 10 doskonały!
Chrupki Król 8:56 25.11 zwyczajny z lukrem 8 lukier z syropu klonowego
Pączki u Donalda 11:02 26.5 z dżemem 9 całkiem smaczny
6(/(&7PLHMVFHRFHQD)520SDF]NLBRFHQ\
:+(5(
W\S
]Z\F]DMQ\]OXNUHP
Wszystkie wyniki będą
dotyczyć pączków
odpowiedniego typu.
miejsce ocena
Pączki u Donalda 5
Wyniki pierwszego Kafeteria Gwiezdny Pył 7
zapytania. Wyobraź
sobie, że są ich setki… Chrupki Król 8
Kafeteria Gwiezdny Pył 10
Pączki u Donalda 8
112 Rozdział 2.
Polecenie SELECT
6(/(&7PLHMVFHW\S)520SDF]NLBRFHQ\
:+(5( zki
Musisz teraz znaleźć pąc wa
RFHQD odpowiedniego typu, a naz
cięzcę.
określi zwy
W wynikach pojawią
się wyłącznie pączki
z najwyższą oceną.
miejsce typ
Kafeteria Gwiezdny Pył z dżemem i lukrem Wyniki drugiego zapytania.
Chrupki Król zwyczajny z lukrem Także w tym przypadku
wyobraź sobie, że rekordów
Kafeteria Gwiezdny Pył zwyczajny z lukrem są setki…
Pączki u Donalda z dżemem i lukrem
WYSIL
SZARE KOMÓRKI
Łączenie zapytań
Nic nie stoi na przeszkodzie, byśmy połączyli oba kryteria wyboru rekordów
— typ oraz ocenę — i umieścili je w jednym zapytaniu. Możemy to zrobić dzięki
zastosowaniu słowa kluczowego $1'. W tym przypadku wyniki zwrócone przez
zapytanie będą spełniały oba podane warunki.
nie
Teraz pozostaje nam jedy
wybranie odpowiedniego
6(/(&7PLHMVFH miejsca.
)520SDF]NLBRFHQ\
:+(5(W\S
]Z\F]DMQ\]OXNUHP
RFHQD
miejsce ocena
To zapytanie zwraca wyniki
Pączki u Donalda 5 spełniające oba kryteria — typ
Kafeteria Gwiezdny Pył 7 'zwyczajny z lukrem' i ocena równa 10.
Chrupki Król 8
Kafeteria Gwiezdny Pył 10
Pączki u Darka 8 Mamo? Czy
miejsce możemy pójść
$1' do kafeterii
miejsce typ
Kafeteria Gwiezdny Pył Gwiezdny Pył?
114 Rozdział 2.
Polecenie SELECT
Napisz zapytanie, które zwróci adresy poczty elektronicznej osób zajmujących się programowaniem.
Napisz zapytanie, które zwróci imię oraz miejsce zamieszkania wszystkich osób urodzonych
tego samego dnia co Ty.
Napisz zapytanie, które zwróci imiona i adresy poczty elektronicznej wszystkich samotnych
osób mieszkających w Twoim mieście. Aby zdobyć dodatkowe punkty, zwróć tylko osoby
tej płci, z którymi chciałbyś chodzić na randki.
Napisz zapytanie, którego Grzesiek mógł użyć do odszukania wszystkich Ań mieszkających we Wrocławiu.
Używając tabeli PRMHBNRQWDNW\, napisz kilka zapytań dla Grześka. Zwracaj wartości tylko tych
kolumn, które są Ci naprawdę potrzebne. I uważaj na apostrofy.
Rozwiązanie
ćwiczenia
Napisz zapytanie, które zwróci adresy poczty elektronicznej osób zajmujących się programowaniem.
Chcemy
wyświetlić
wyłącznie SELECT email FROM moje_kontakty
kolumnę email.
WHERE zawod = 'programista'; s osoby
Interesują na rogramista'.
z zawodem 'p
Napisz zapytanie, które zwróci imię oraz miejsce zamieszkania wszystkich osób urodzonych
tego samego dnia co Ty.
Napisz zapytanie, które zwróci imiona i adresy poczty elektronicznej wszystkich samotnych
osób mieszkających w Twoim mieście. Aby zdobyć dodatkowe punkty, zwróć tylko osoby
tej płci, z którymi chciałbyś chodzić na randki.
Napisz zapytanie, którego Grzesiek mógł użyć do odszukania wszystkich Ań mieszkającej we Wrocławiu.
116 Rozdział 2.
Polecenie SELECT
Interesują nas
wyłącznie nazwy dri
nków. 6(/(&7QD]ZD)520SURVWHBGULQNL
:+(5(
VNODGQLNBJORZQ\
ZRGDVRGRZD
6(/(&7QD]ZD)520SURVWHBGULQNL
:+(5(
Drinki na bazie VNODGQLNBJORZQ\
ZRGDVRGRZD
SURVWHBGULQNL
118 Rozdział 2.
Polecenie SELECT
6(/(&7QD]ZD)520SURVWHBGULQNL
:+(5(
VNODGQLNBJORZQ\
ZRGDVRGRZD
$1' WIĘKSZOŚCI
Zastosowanie OPERATORA ystkie drinki,
pozwoli nam wyszukać wsz 30 mililitrów
które zawierają więcej niż
LORVF! wody sodowej.
WYSIL
SZARE KOMÓRKI
A czy nie można by połączyć dwóch przedstawionych
zapytań, wykorzystując dodatkowe słowo AND?
Znak równości poszukuje wartości, które są identyczne. Ten mylący symbol oznacza „różny”. Zwracane przez niego
Nie przyda się on, jeśli chcemy znaleźć wartości, które są wyniki stanowią dokładne przeciwieństwo wyników, jakie
mniejsze lub większe od pewnej wartości. uzyskamy, stosując znak równości. Dwie wartości mogą być
albo równe, albo różne od siebie.
WYTĘŻ
UMYSŁ
Czy zwróciłeś uwagę, że we wszystkich przedstawionych do tej pory
klauzulach WHERE nazwy kolumn były umieszczane z lewej strony
operatora porównania? Czy warunki działałyby poprawnie, gdyby
kolumny były umieszczane po prawej stronie?
120 Rozdział 2.
Polecenie SELECT
Znak mniejszości sprawdza, czy wartość kolumny podanej Znak większości jest przeciwieństwem znaku mniejszości.
z jego lewej strony jest mniejsza od liczby umieszczonej po Sprawdza on, czy wartość kolumny podanej z jego lewej
jego prawej stronie. Jeśli wartość kolumny jest mniejsza strony jest większa od wartości zapisanej po prawej
od wartości zapisanej po prawej stronie operatora, to stronie znaku. Jeśli wartość kolumny jest większa od
analizowany wiersz zostanie dodany do wyników. podanej, to cały rekord zostanie dodany do wyników.
A to jest oczywiście
znak WIĘKSZOŚCI.
Jedyna różnica pomiędzy znakiem mniejszy lub równy To samo dotyczy znaku większy lub równy. W jego
a znakiem mniejszości polega na tym, iż w przypadku przypadku do wyników będą także dołączane rekordy,
pierwszego zwracane są także rekordy, w których wartość w których wartość kolumny jest zarówno większa,
kolumny jest nie tylko mniejsza, lecz także równa wartości jak i równa wartości podanej z prawej strony operatora.
podanej z prawej strony operatora.
Zwracane są wszystki
w których wartość kol e rekordy, or
Istnieje także operat Y.
um
MNIEJSZA LUB RÓWN ny jest WI ĘKS ZY LU B RÓ WN
podanej w warunku. A wartości
Zawartość węglowodanów
mach.
w drinku, wyrażona w gra Ilość kalorii w drinku.
GULQNLBLQIRUPDFMH
6(/(&7QD]ZD)250GULQNLBLQIRUPDFMH
:+(5( Ten warunek stwierdza: „Na
wszystkie drinki, które kos leży odnaleźć
ztu
lub więcej. W wynikach zos ją 8,50 zł
FHQD! także te drinki, które kosztutaną uwzględnione
ją dokładnie 8,50 zł.
$1'
Z kolei ten warunek stwierdza:
NDORULH „Należy odnaleźć wszystkie
drinki, które mają mniej
niż 50 kalorii”.
122 Rozdział 2.
Polecenie SELECT
Zaostrz ołówek
Najwyższa pora, żebyś sam spróbował pomieszać parę drinków. Napisz zapytania, które
zwrócą informacje opisane poniżej. Nie zapomnij podać wyników, które zwrócą te zapytania.
Ceny wszystkich drinków z lodem, które mają żółty kolor i więcej niż 33 kalorie.
Wyniki:
Wyniki:
Ceny wszystkich drinków, których wartość energetyczna jest większa lub równa 80 kaloriom.
Wyniki:
Drinki o nazwach Greyhound i Kiss on the Lips wraz z informacją o ich kolorze
oraz czy są serwowane z lodem czy nie.
Wyniki:
Zaostrz ołówek
Rozwiązanie Najwyższa pora, żebyś sam spróbował pomieszać parę drinków. Napisz zapytania, które
zwrócą informacje opisane poniżej. Nie zapomnij podać wyników, które zwrócą te zapytania.
Ceny wszystkich drinków z lodem, które mają żółty kolor i więcej niż 33 kalorie.
SELECT cena FROM drinki_informacje
WHERE lod = 'T'
AND
kolor = 'zolty'
AND
kalorie > 33;
Wyniki: 10.00
Ceny wszystkich drinków, których wartość energetyczna jest większa lub równa 80 kaloriom.
SELECT cena FROM drinki_informacje
WHERE
kalorie >= 80; Ale to rozwiązanie bazuje na
zastosowaniu liczb. Czyli jeśli
będę chciała znaleźć wszystkie
drinki, których nazwy zaczynają
się od określonej litery,
Wyniki: 13.75, 8.00, 6.5 to będę mieć pecha?
Drinki o nazwach Greyhound i Kiss on the Lips wraz z informacją
o ich kolorze oraz czy są serwowane z lodem czy nie.
SELECT nazwa, kolor, lod FROM drinki_informacje
WHERE
cena > 9.50; To zapytanie jest podchw
ytliwe.
Musisz przeanalizować
i znaleźć jakąś kolumnę,tabelę
pozwoli Ci wybrać tylk która
o i wyłącznie
dwa interesujące Cię drin
Kiss on the Lips, fioletowy, T ki.
Wyniki: Greyhound, zolty, T
124 Rozdział 2.
Polecenie SELECT
GULQNLBLQIRUPDFMH
nazwa cena węglowodany kolor lód kalorie
6(/(&7QD]ZD
)520GULQNLBLQIRUPDFMH
:+(5(
QD]ZD!
/
To zapytanie zwraca drinki,
których nazwy rozpoczynają
$1' się na literę „L” lub kolejną,
ale znajdującą się w alfabecie
QD]ZD
0
przed literą „M”.
ie
ojn Na razie nie przejmuj się kolejnością,
Każde
zapytanie
sprawdza
odrębną
kolumnę
tabeli.
126 Rozdział 2.
Polecenie SELECT
Zaostrz ołówek
Z dwóch przedstawionych poniżej poleceń SQL wykreśl niepotrzebne fragmenty, a następnie dodaj
operator OR, by zmienić je w jedno polecenie.
6(/(&7QD]ZD)520SURVWHBGULQNL:+(5(
VNODGQLNBJORZQ\
VRNSRPDUDQF]RZ\
6(/(&7QD]ZD)520SURVWHBGULQNL:+(5(
VNODGQLNBJORZQ\
VRNMDEONRZ\
Zastosuj zdobyte właśnie umiejętności, by przekształcić dwa powyższe zapytania w jedno polecenie 6(/(&7:
Zaostrz ołówek
Rozwiązanie Z dwóch przedstawionych poniżej poleceń SQL wykreśl niepotrzebne fragmenty, a następnie
dodaj operator OR, by zmienić je w jedno polecenie.
128 Rozdział 2.
Polecenie SELECT
Nie istnieją
głupie pytania
SDF]NLBRFHQ\
miejsce godzina data typ ocena komentarze
Chrupki Król 8:50 27.9 zwyczajny z lukrem 10 niemal doskonały
Pączki u Donalda 8:59 25.8 NULL 6 tłusty
Kafeteria Gwiezdny Pył 7:35 24.5 cynamonowy z lukrem 5 nieświeży, ale smaczny
Pączki u Donalda 7:03 26.4 z dżemem 7 za mało dżemu
6(/(&7W\S)520SDF]NLBRFHQ\ :<1,.,
Tak
łniony
Tak, ten warunek jest spe
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD ]Z\F]DMQ\]OXNUHP
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD ]Z\F]DMQ\]OXNUHP
Warunek ni
espełniony
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD EUDNZ\QLNöZ
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD ]Z\F]DMQ\]OXNUHP
Warunek niespełniony
:+(5(PLHMVFH
3\V]Q\5RJDO
$1'RFHQD EUDNZ\QLNöZ
:+(5(PLHMVFH
3\V]Q\5RJDO
25RFHQD ]Z\F]DMQ\]OXNUHP
:+(5(PLHMVFH
3\V]Q\5RJDO
$1'RFHQD EUDNZ\QLNöZ
:+(5(PLHMVFH
3\V]Q\5RJDO
25RFHQD EUDNZ\QLNöZ
130 Rozdział 2.
Polecenie SELECT
6(/(&7W\S)520SDF]NLBRFHQ\ &]\VÈMDNLHĂZ\QLNL"
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD!
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD
:+(5(PLHMVFH
3\V]Q\5RJDO
$1'RFHQD!
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD!
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD
:+(5(PLHMVFH
3\V]Q\5RJDO
25RFHQD
6(/(&7W\S)520SDF]NLBRFHQ\ &]\VÈMDNLHĂZ\QLNL"
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD! zwyczajny z lukrem
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD brak wyników
:+(5(PLHMVFH
3\V]Q\5RJDO
$1'RFHQD! brak wyników
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD! zwyczajny z lukrem, NULL, z dżemem
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD zwyczajny z lukrem
:+(5(PLHMVFH
3\V]Q\5RJDO
25RFHQD NULL
132 Rozdział 2.
Polecenie SELECT
GULQNLBLQIRUPDFMH
nazwa cena węglowodany kolor lód kalorie
Holiday NULL 14 NULL T 50
Dragon Breath 7.25 7.2 brązowy N NULL
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5( Nie działa, gdyż nic
NDORULH 18//
nie jest równe NULL. 6(/(&7QD]ZD
NULL to wartość
niezdefiniowana.
)520GULQNLBLQIRUPDFMH
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH :+(5( Jedynym
:+(5( sposobem
To zapytanie nie będzie NDORULH,618// bezpośredniego
NDORULH działać, gdyż NULL pobrania wierszy
to nie to samo co zero. zawierających
Te słowa kluczowe to nie wartości NULL
łańcuchy znaków, zatem jest użycie słów
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH nie można ich zapisywać kluczowych
:+(5( Z kolei to zapytanie nie będzie w apostrofach. IS NULL.
działać, gdyż NULL nie jest
NDORULH
18//
łańcuchem znaków.
Nie istnieją
głupie pytania
P.: Wspominaliście, że „nie można pobrać P.: Jak wyglądałyby wyniki wykonania takiego
wartości NULL w sposób bezpośredni” inaczej niż polecenia SQL?
przy użyciu wyrażenia IS NULL; czy to oznacza,
że można je pobrać niejawnie? O.: Wyglądałyby następująco:
O.: Owszem. Chcąc pobrać wartość takiej kolumny, można
_ NDORULH _
zastosować klauzulę :+(5( odwołującą się do dowolnej innej
kolumny. W naszej przykładowej bazie uzyskamy wartość 18//,
jeśli zastosujemy następujące zapytanie: _ 18// _
6(/(&7NDORULH)520GULQNLBLQIRUPDFMH:+(5(
QD]ZD
'UDJRQ%UHDWK
jesteś tutaj 133
Męczące zapytania
W międzyczasie u Grześka…
Grzesiek próbował od jakiegoś czasu wyszukać w swojej tabeli PRMHBNRQWDNW\
wszystkie osoby mieszkające w miejscowościach w województwie śląskim.
Oto fragment zapytania, nad którym pracował Grzesiek:
25
ORNDOL]DFMD
&KRU]RZ6/
25
ORNDOL]DFMD
%\WRP6/
25
ORNDOL]DFMD
*OLZLFH6/
25
ORNDOL]DFMD
=DEU]H6/
25
ORNDOL]DFMD
5\EQLN6/
25
ORNDOL]DFMD
3V]F]\QD6/
134 Rozdział 2.
Polecenie SELECT
6(/(&7
)520PRMHBNRQWDNW\
:+(5(ORNDOL]DFMD/,.(
6/
Bezpośrednio za
apostrofem należ pierwszym
znak procentu. Wy umieścić
poinformujesz sy ten sposób
bazami danych, stem zarządzania
że interesują Ci
wszystkie warto ę
śc
w kolumnie ORND i zapisane
OL ]D FM D, które
Zew wieloznaczności kończą się literam
i 6/.
Znaki wieloznac
zastępują inne zne
i łańcuchy. znaki
WYTĘŻ
UMYSŁ
Czy w przykładach zamieszczonych w tym rozdziale zauważyłeś
może jakieś inne znaki wieloznaczne?
6(/(&7LPLH)520PRMHBNRQWDNW\
:+(5(LPLH/,.(
QD
ny Pasuje do imion kończących
Znak procentu może być zastąpio ów. się na „na”, takich jak: Anna,
znak
przez dowolną liczbę dowolnych Katarzyna itd.
6(/(&7LPLH)520PRMHBNRQWDNW\
:+(5(LPLH/,.(
BDVLD
Znak pokreślenia może być zastąpiony
tylko jednym, nieznanym znakiem. Pasuje do imion, w których
przed literami „asia” znajduje
się dokładnie jedna, dowolna
litera; takich jak Basia
lub Kasia.
136 Rozdział 2.
Polecenie SELECT
Dopasowywanie magnesików
'RORGyZNLSU]\F]HSLRQRZUyİQ\FKPLHMVFDFKNDZDâHF]NLNLONXNODX]XO:+(5(Z\NRU]\VWXMċF\FK
RSHUDWRU/,.(&]\MHVWHĤZVWDQLHGRSDVRZDþWHNODX]XOHGRZ\QLNyZMDNLHSR]ZDODMċX]\VNDþ"
1LHNWyUH]NODX]XOPRJċ]ZUDFDþZ\QLNL]DZLHUDMċFHZLĐNV]ċLORĤþUHNRUGyZ-HĤOLMDNLHĤZ\QLNLQLH
]RVWDQċ]ZUyFRQHSU]H]İDGQċ]NODX]XOWRVDPRG]LHOQLHQDSLV]NODX]XOĐ:+(5(]RSHUDWRUHP/,.(
NWyUDSR]ZROLMHX]\VNDþ
(
1RZ\
-DQHN :+(5( PLHMVRZRVF /,.
VSLQDF]
:+(5(SU]HGPLRW /,.(
BB]MHU
PD]RZLHFNLH
VSORW
:+(5(W\WXO/,.(
64/
1RZ\.REU]\QLHF
PLNVHU
ZL]MHU
1RZ\7DUJ
-DUHN
SRPRUVNLH
NOLQ
:+(5( LPLH /,.(
-D
SRGODVNLH VSOHQGRU
(
1RZ\
:+(5( PLHMVRZRVF /,.
1RZ\.REU]\Q
1RZ\7DUJ LHF
:+(5(SU]HGPLRW /,.(
BB]MHU
ZL]MHU
:+(5(W\WXO/,.(
64/
64/ 5XV] JïRZÈ
PLNVHU
LIKE 'm%';
KE 'p%' OR wojewodztwo
WHERE wojewodztwo LI PD]RZLHFNLH
SRGODVNLH SRGNDUSDFNLH
H
SRPRUVNL
:+(5( LPLH /,.(
-D
-DQHN -DUHN
138 Rozdział 2.
Polecenie SELECT
GULQNLBLQIRUPDFMH
nazwa cena węglowodany kolor lód kalorie
Blackthorn 7.50 8.4 żółty T 33
Blue Moon 6.25 3.2 niebieski T 12
Oh My Gosh 8.75 8.6 pomarańczowy T 35
Lime Fizz 6.25 5.4 zielony T 24
Kiss on the Lips 13.75 42.5 fioletowy T 171
Hot Gold 8.00 32.1 pomarańczowy N 135
Lone Tree 9.00 4.2 czerwony T 17
Greyhound 10.00 14 żółty T 50
Indian Summer 7.00 7.2 brązowy N 30
Bull Frog 6.50 21.5 jasnobrązowy T 80
Soda and It 9.50 4.7 czerwony N 19
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5(
NDORULH! W wynikach zostaną uwzględnione drinki,
których wartość energetyczna wynosi
dokładnie 30 kalorii, oczywiście jeśli
$1' takie znajdą się w tabeli; drinki, których
wartość energetyczna wynosi 60 kalorii,
NDORULH
oraz wszystkie pozostałe drinki, których
wartość energetyczna mieści się pomiędzy
tymi dwiema granicami.
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5(
To zapytanie zwróci dokładnie
takie same wyniki, jak zapytanie
NDORULH%(7:((1$1' przedstawione na poprzedniej
stronie; zobacz jednak, o ile
łatwiej jest je zapisać.
dą się także
W wynikach znaj rtość
kt ór yc h wa
drinki, nosi dokładnie
energetyczna wy
30 i 60 ka lor ii.
140 Rozdział 2.
Polecenie SELECT
Zaostrz ołówek
Zapytanie przedstawione na poprzedniej stronie zmodyfikuj w taki sposób, by zwróciło
nazwy wszystkich drinków, których wartość energetyczna jest większa od 60 kalorii lub
mniejsza od 30.
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH:+(5(
NDORULH%(7:((1$1'
Zaostrz ołówek
Rozwiązanie Zmodyfikuj zapytanie przedstawione na poprzedniej stronie w taki sposób, by zwróciło nazwy
wszystkich drinków, których wartość energetyczna jest większa od 60 kalorii lub mniejsza od 30.
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH:+(5(
NDORULH%(7:((1$1'
142 Rozdział 2.
Polecenie SELECT
RSLQLD
IDQWDVW\F]QD
jeden warun napisać
ek.
Edward szkoda czasu
Antek rewelacyjna
25 Szymek dobra
Ignacy fatalna
Wiesiek żałosna
Zamiast stosować te wszystkie warunki połączone operatorem 25, można uprościć
sobie życie i zapytanie, stosując operator ,1. Można go używać, gdy poszukiwane
wartości mogą należeć do zbioru kilku wartości tekstowych. Jeśli wartość w kolumnie
będzie odpowiadać jednej z wartości podanego zbioru, to rekord zostanie zwrócony
w wynikach zapytania.
IDQWDVW\F]QD
UHZHODF\MQD
GREUD
RSLQLD127,1
LQVSLUXMDFD
IDQWDVW\F]QD
UHZHODF\MQD
GREUD
WYSIL
SZARE KOMÓRKI
Dlaczego czasami trzeba będzie
używać wyrażenia NOT IN, a nie
wyłącznie operatora IN?
144 Rozdział 2.
Polecenie SELECT
za operatorami AND
$1'127LPLH/,.(
%
Nie istnieją
głupie pytania
P.: Chwileczkę. Przed chwilą napisaliście, że operator P.: A jak operator NOT działa w przypadku
NOT należy zapisywać za słowem kluczowym WHERE. wartości NULL?
A co zrobić, gdy chcę użyć wyrażenia NOT IN?
O.: Dokładnie tak, jak można by tego oczekiwać. Aby pobrać
O.: To jest wyjątek. W tym przypadku nawet przeniesienie operatora z kolumny wszystkie wartości, które są różne od 18//, należy
NOT i umieszczenie go bezpośrednio za słowem kluczowym WHERE wykonać następujące zapytanie:
będzie działać. Co więcej, w obu przypadkach uzyskamy identyczne
6(/(&7
)520SURVWHBGULQNL
wyniki:
:+(5(127VNODGQLNBJORZQ\,618//
6(/(&7
)520SURVWHBGULQNL
:+(5(127VNODGQLNBJORZQ\,1
ZRGDVRGRZD
Jednak także poniższe zapytanie zwróci identyczne wyniki:
PUR]RQDKHUEDWD
6(/(&7
)520SURVWHBGULQNL
6(/(&7
)520SURVWHBGULQNL :+(5(VNODGQLNBJORZQ\,612718//
:+(5(VNODGQLNBJORZQ\127,1
ZRGDVRGRZD
PUR]RQDKHUEDWD
P.: A co z operatorami AND i OR?
P.: A czy w tym przypadku można by zastosować O.: Jeśli chcesz zastosować operator 127 w klauzuli, w której
operator porównania <> — różny? występuje także operator $1' bądź 25, to 127 należy umieścić
bezpośrednio za operatorem $1' bądź 25; jak na poniższym
O.: Można by, jednak uzyskamy w ten sposób podwójne przykładzie:
zaprzeczenie. W tym przypadku znacznie lepszym rozwiązaniem
6(/(&7
)520SURVWHBGULQNL
byłoby zastosowanie znaku równości. Dwa przedstawione poniżej :+(5(127VNODGQLNBJORZQ\
ZRGDVRGRZD
Przepisz każde z poniższych zapytań w taki sposób, by było możliwie jak najprostsze. Możesz przy tym
używać operatorów $1', 25, %(7:((1, /,.(, ,1, ,618// oraz operatorów porównania. W razie
Ćwiczenie potrzeby zajrzyj do tabel zamieszczonych we wcześniejszej części rozdziału.
6(/(&7QD]ZD)520SURVWHBGULQNL
:+(5(127LORVF
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5(127ORG
7
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5(127NDORULH
146 Rozdział 2.
Polecenie SELECT
6(/(&7QD]ZD)520SURVWHBGULQNL
:+(5(VNODGQLNBGRGDWNRZ\
OHPRQLDGD
25VNODGQLNBGRGDWNRZ\
QHNWDUPRUHORZ\
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5(127NDORULH
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5(127ZHJORZRGDQ\%(7:((1$1'
6(/(&7LPLH)520UHMHVWUBUDQGHN
:+(5(127LPLH/,.(
$
$1'127LPLH/,.(
%
Przepisz każde z poniższych zapytań w taki sposób, by było możliwie jak najprostsze. Możesz
Rozwiązanie przy tym używać operatorów AND, OR, BETWEEN, LIKE, IN, IS NULL oraz operatorów porównania.
W razie potrzeby zajrzyj do tabel zamieszczonych we wcześniejszej części rozdziału.
ćwiczenia
6(/(&7QD]ZD)520SURVWHBGULQNL
:+(5(127LORVF
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5(127ORG
7
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5(127NDORULH
148 Rozdział 2.
Polecenie SELECT
6(/(&7QD]ZD)520SURVWHBGULQNL
:+(5(VNODGQLNBGRGDWNRZ\
OHPRQLDGD
25VNODGQLNBGRGDWNRZ\
QHNWDUPRUHORZ\
ie działać
To zapytanie będz że nie
wyłączn ie dla teg o,
SELECT nazwa FROM proste_drinki ymi innymi
dysponujemy żadn wymi, które
składnikam i do da tko
warunek.
spełniałyby podany owała się
WHERE składnik_dodatkowy BETWEEN 'L' AND 'O'; ajd
Gdyby w tabeli zn : nektar
ład
wartość, na przyk tanie
ananasowy, to zapy dłowo.
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
wi
nie działałoby pra
:+(5(127NDORULH
SELECT nazwa FROM drinki_informacje Wartość energety
może być mniejszczna nie
WHERE kalorie > 0; a zatem możemy a od zera,
zastosować znak bezpiecznie
większości.
6(/(&7QD]ZD)520GULQNLBLQIRUPDFMH
:+(5(127ZHJORZRGDQ\%(7:((1$1'
6(/(&7LPLH)520UHMHVWUBUDQGHN
:+(5(127LPLH/,.(
$
$1'127LPLH/,.(
%
Przybornik SQL
A zatem opanowałeś już materiał
52='=,$
6(/(&7 obrać
k la u z u li, by p
Użyj te
j eli.
ie k o lu mny tab
wszystk QLND ?
] Q D N L HP XNRĂ
]DM
3RSU]HG
postrofu ! !
Znaki a ne w tekście !
ie s z c z o w y m M
um a t k o as z do sw ej dyspozycji ki
zaj dod lka
poprzed postrofu bądź operatorów poró
wnania.
k ie m a
zna a.
ukośnik ,618//
znakiem
Zastosuj to wyr
ażenie, by
sprawdzać, czy
w kolumnach
tabeli znajduje
się kłopotliwa
wartość NULL.
%(7:((1
Ten oper
ator pozw
pobieran ala na
5
$1' L 2
ie zakres
i OR ów warto
a t o r om AND ści.
p e r
Dzięki o czyć wyrażenia klauzuli /,.( RUD
] L B
łą w
moż e s z zczane
k o w e umies d a tkową Używaj o
pe
wa r u n
b y u z yskać d o ze znaka ratora LIKE wraz
, mi wielo
WHERE przeszuk zna
c y z ję . iwać pola cznymi, by
pre łańcuchy zawierają
znaków. ce
ać
127 w a la zanegow
o z
r NOT p ć odwrotne
Operato ska
k i uzy
warune
wyniki.
Nowe narzędzie
— operatory!
150 Rozdział 2.
Polecenie SELECT
Grzesiek chce utworzyć tabelę z informacjami o drinkach, do której barmani mogliby zaglądać
w poszukiwaniu przepisów na drinki serwowane podczas randek umawianych przez Grześka.
Rozwiązanie Bazując na informacjach zdobytych w rozdziale 1., utwórz tabelę i zapisz w niej przedstawione
ćwiczenia poniżej dane.
Tabela należy do bazy danych o nazwie drinki. Zawiera ona tabelę o nazwie proste_drinki
z kilkoma przepisami na drinki składające się jedynie z dwóch składników.
&5($7('$7$%$6(GULQNL yć pola
Zawsze warto tworz zapasem
tekstowe z pe wn ym
gdyby trzeba
86(GULQNL długości, na wypadektekst dłuższy,
w nich było zapisać nowało.
pla
&5($7(7$%/(SURVWHBGULQNL niż się początkowo
Klowni są przerażający
Załóżmy, że chcielibyśmy śledzić klownów pracujących w Bazodanowie.
Moglibyśmy w tym celu stworzyć tabelę o nazwie NORZQLBLQIRUPDFMH.
W tej tabeli moglibyśmy utworzyć kolumnę RVWDWQLRBZLG]LDQR,
przeznaczoną do zapisywania informacji o miejscu, w jakim ostatnio
widziano konkretnego klowna.
Czy cię
przerażamy?
Dom opieki
„Spokojna Ostoja”
SZPITAL
MIEJSKI
SKARBIEC
Centrum Handlowe
MEGASTRAGAN
Park
seum
Zielona Kolo
Polana Cyrk
=DEDZH[
AUTA
DOM OPIEKI
EDWARDA „Wesoła Wdówka”
154 Rozdział 3.
Polecenia DELETE i UPDATE
Śledzenie klownów
A oto i nasza tabela. Możemy nie podawać informacji, których jeszcze nie znamy,
i uzupełnić je później. Za każdym razem, gdy zobaczymy nowego klowna, możemy
dodać do tabeli nowy wiersz. Najprawdopodobniej będziemy musieli często
modyfikować tabelę, by zapisane w niej informacje były aktualne.
miejsca
Te pusteimy
łn
uzupe złości.
Dom opieki w przys
„Spokojna Ostoja”
SZPITAL
MIEJSKI
SKARBIEC
Centrum Handlowe
MEGASTRAGAN
Park
seum
Zielona Kolo
Polana Cyrk
=DEDZH[
AUTA
DOM OPIEKI
EDWARDA „Wesoła Wdówka”
Zaostrz ołówek
Klowni są w ciągłym ruchu
Twoim zadaniem jest napisanie poleceń SQL, które pozwolą na zarejestrowanie w tabeli klowni_informacje
najnowszych informacji o klownach. Zwróć uwagę, iż nie wszystkie informacje o poszczególnych klownach
uległy zmianie, zatem by podać w poleceniu wszystkie wymagane informacje, będziesz musiał zajrzeć
do początkowej tabeli przedstawionej na stronie 155.
Gonza ostatni
o
widziano w pa
rku
Zielona Polana
.
156 Rozdział 3.
Polecenia DELETE i UPDATE
Eklerka Dom opieki „Spokojna Ostoja” K, czerwone włosy, zielona sukienka, ogromne stopy balony, mały samochodzik
Pan Pimpuś Urodziny u Jacka Zielińskiego M, pomarańczowe włosy, niebieski garnitur, ogromne stopy mim
Pani Smyk MegaStragan K, żółta koszula, workowate czerwone spodnie trąbka, parasolka
Pan Hobo Cyrk Koloseum M, cygaro, czarne włosy, niewielki kapelusz skrzypce
Klarabela Dom opieki „Wesoła Wdówka” K, różowe włosy, ogromny kwiat, niebieska sukienka krzyk, taniec
Skuter Szpital Miejski M, niebieskie włosy, czerwony garnitur, ogromny nos balony
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec
Balbina Auta Edwarda K, cała na pomarańczowo i w cekinach utrzymywanie równowagi, mały samochodzik
Gonzo M, w przebraniu kobiety, kostium w plamki śpiew, taniec
Pan Smyk Zabawex M, zielono-fioletowy kostium, szpiczasty nos
Zaostrz ołówek
Rozwiązanie Klowni są w ciągłym ruchu
Twoim zadaniem było napisanie poleceń SQL, które pozwolą na zarejestrowanie w tabeli
klowni_informacje najnowszych informacji o klownach, a następnie pokazanie, jak te informacje
wyglądają po ich zapisaniu w tabeli.
Gonza ostatni
INSERT INTO klowni_informacje
o
widziano w pa VALUES
rku
Zielona Polana ('Gonzo', 'Park Zielona Polana', 'M, w przebraniu kobiety,
.
kostium w plamki', 'spiew, taniec');
nio
Nie zapomnij odpowiedstrofu
poprzedzić znaków apo nach
INSERT INTO klowni_informacje umieszczanych w kolum
typu VARCHAR.
VALUES
Pan Smyk został ('Pan Smyk', 'Przyjęcie urodzinowe w Mc\'Stecku', 'M,
ewielkim
zauważony w ni
samochodzie.
zielono-fioletowy kostium, szpiczasty nos',
'wchodzenie do malego samochodu');
158 Rozdział 3.
Polecenia DELETE i UPDATE
Eklerka Dom opieki „Spokojna Ostoja” K, czerwone włosy, zielona sukienka, ogromne stopy balony, mały samochodzik
Pan Pimpuś Urodziny u Jacka Zielińskiego M, pomarańczowe włosy, niebieski garnitur, ogromne stopy mim
Pani Smyk MegaStragan K, żółta koszula, workowate czerwone spodnie trąbka, parasolka
Pan Hobo Cyrk Koloseum M, cygaro, czarne włosy, niewielki kapelusz skrzypce
Klarabela Dom opieki „Wesoła Wdówka” K, różowe włosy, ogromny kwiat, niebieska sukienka krzyk, taniec
Skuter Szpital Miejski M, niebieskie włosy, czerwony garnitur, ogromny nos balony
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec
Balbina Auta Edwarda K, cała na pomarańczowo i w cekinach utrzymywanie równowagi, mały samochodzik
Gonzo M, w przebraniu kobiety, kostium w plamki śpiew, taniec
Pan Smyk Zabawex M, zielono-fioletowy kostium, szpiczasty nos
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec, śpiew
Pani Smyk Zabawex K, żółta koszula, workowate niebieskie spodnie trąbka, parasolka
Gonzo Park Zielona Polana M, w przebraniu kobiety, kostium w plamki śpiew, taniec
Pan Smyk Przyjęcie urodzinowe M, zielono-fioletowy kostium, szpiczasty nos wchodzenie do małego samochodu
w Mc’Stecku
Pan Hobo Przyjęcie u Eryka M, cygaro, czarne włosy, malutki kapelusz skrzypce
Szarzyńskiego
WYSIL
SZARE KOMÓRKI
Jak możesz odszukać bieżące miejsce pobytu konkretnego klowna?
Podobnie te dwa
Te dwa rekordy są są identyczne.
dokładnie takie same.
Te dane powtarzają
się we wszystkich
rekordach.
160 Rozdział 3.
Polecenia DELETE i UPDATE
Ale to jeszcze nie wszystko. Czy zauważyłeś te powtarzające się rekordy? W ostatnich
wynikach mogliśmy zobaczyć dwa rekordy pokazujące, że klown Zippo był w tym
samym miejscu, robiąc dokładnie to samo. Takie identyczne, powtarzające się rekordy
niepotrzebnie zużywają miejsce i wraz ze wzrostem ich ilości mogą się przyczynić do
spowalniania działania systemu zarządzania bazą danych. Rekordy w tabeli nigdy nie
powinny się powtarzać. W dalszej części książki wyjaśnimy, dlaczego takie powielanie
rekordów jest złe i w jaki sposób dobry projekt tabeli pozwoli nam go unikać. Dowiesz
się między innymi, jak tworzyć tabele, w których rekordy nigdy nie będą się powtarzać.
Na razie jednak skoncentrujmy się na tym, jak należy poprawić naszą tabelę, byśmy
mogli pobierać z niej interesujące nas informacje.
Nie istnieją
głupie pytania
P.: Dlaczego nie możemy po prostu założyć, że ostatni rekord O.: Oczywiście. Przyjrzyjmy się naszemu przykładowi. Nasza tabela
jest rekordem najnowszym? klownów w swojej bieżącej postaci nie tylko udostępnia nam informacje
o tym, gdzie każdy klown był ostatnio widziany, lecz także pozwala
O.: Nie ma gwarancji co do kolejności, w jakiej rekordy są zapisywane w tabeli, na sporządzenie rejestru miejsc, w których pojawiał się wcześniej. Są
to potencjalnie użyteczne informacje. Nasz problem polega na tym,
a już niedługo nauczysz się modyfikować kolejność, w jakiej będą zwracane
wyniki poleceń 6(/(&7. Nie możemy mieć pewności, że ostatni wyświetlony że w rekordach nie ma żadnych informacji o tym, kiedy klown był
rekord faktycznie jest ostatnim rekordem dodanym do tabeli. Kolejność rekordów widziany w danym miejscu. Jeśli dodamy kolumnę zawierającą datę
w tabeli może także ulegać modyfikacjom na skutek naszych błędów. Załóżmy, że i czas pojawienia się klowna, okaże się, że nasza tabela śledzi klownów
wpisaliśmy dwa polecenia ,16(57 z informacjami o tym samym klownie. Jeśli sami z bardzo dużą dokładnością.
nie zapamiętamy, w którym miejscu klown był widziany wcześniej, to po zapisaniu Jednak w pierwszej kolejności musimy naprawić wcześniejsze błędy
danych w tabeli nie będziemy mieli pewności co do tego, który z tych dwóch i usunąć z tabeli powtarzające się rekordy.
rekordów powinien być traktowany jako najnowszy.
P.:
P.: Załóżmy, że pamiętamy kolejność. Pozostaje to samo
No dobrze, zatem po zakończeniu lektury
książki będę wiedzieć, jak należy projektować tabele,
pytanie: Dlaczego nie możemy założyć, że ostatni rekord jest w których nie będzie powtarzających się rekordów.
rekordem najnowszym? Ale co zrobić, jeśli gość, który był zatrudniony na moim
stanowisku wcześniej, pozostawił mi bazę danych
O.: Rozszerzmy nieco nasz przykład. Chcemy śledzić publiczne wystąpienia tego z nieprawidłowo zaprojektowanymi tabelami?
samego klowna w ciągu wielu lat. Może mamy pomocników, którzy także śledzą
klowna i sami zapisują w bazie informacje o nim, wykonując polecenia ,16(57. Po
pewnym czasie w bazie mogą się pojawić setki rekordów dotyczących tego samego
O.: W codziennej praktyce nieprawidłowo zaprojektowane tabele
można znaleźć dosyć często i wiele osób uczących się języka SQL
klowna. W razie wykonania zapytania — polecenia 6(/(&7 — dotyczącego wcześniej czy później będzie musiało sprzątać bałagan, który pozostawił
takiego klowna zwrócone zostaną setki rekordów. I co w takiej sytuacji? Będziemy po sobie kto inny.
musieli przeglądać te setki rekordów, mając przy tym nadzieję, że ostatni z nich
będzie zawierał informacje o ostatnim miejscu, w jakim widziano klowna. Istnieje kilka technik usuwania powielających się rekordów. Jedna
z najlepszych wykorzystuje złączenia — zagadnienie to zostanie opisane
P.: A czy czasami nie mogą pojawić się sytuacje, w których
w dalszej części książki. Jak na razie nie posiadasz jeszcze wszystkich
narzędzi koniecznych do poprawienia danych w tabeli, jednak kiedy
będziemy chcieli przechowywać w bazie takie informacje?
skończysz lekturę, będziesz dysponował całą potrzebną do tego wiedzą.
Czy dodawanie do bazy nowych wierszy i zachowywanie już
istniejących zawsze jest jedynym sensownym rozwiązaniem?
162 Rozdział 3.
Polecenia DELETE i UPDATE
:+(5( '(/(7(
WDQLHF
VSLHZ
)520
Apostrofy, przecinki ora
z operatory
porównania i średnik
były zbyt małe =LSSR
i nie chciało się nam
ich podnosić
z podłogi. Dopisz je,
jeśli uznasz,
że są gdzieś potrzebne
.
W tym przypadku — w
przypadku polecenia SE odróżnieniu od
musimy określać, z jak LECT — nie
ich
tabeli chcemy usunąć dan kolumn
DELETE usuwa bowiem e. Polecenie
całe rekordy.
'(/(7(
tabeli
Określa, z jakiej kordy.
należy usunąć re
)520 NORZQLBLQIRU
PDFMH
leżało dodać
Do magnesików na apostrofy — po
śc i,
operator równo
strony magnesika
jednym z każdej c”, oraz średnik
ze sło we m „ta nie
lecenie.
kończący całe po
:+(5( DNW\ZQRĂFL
WDQLHF
VSLHZ
Klauzul WHERE można używać =LSSR
LPLH
w poleceniach DELETE w taki
sam sposób, w jaki są one
używane w poleceniach SELECT.
164 Rozdział 3.
Polecenia DELETE i UPDATE
'(/(7()520NORZQLBLQIRUPDFMH
:+(5( To jest rekord,
DNW\ZQRVFL
WDQLHF
który zostanie
usunięty.
Eklerka Dom opieki „Spokojna Ostoja” K, czerwone włosy, zielona sukienka, ogromne stopy balony, mały samochodzik
Pan Pimpuś Urodziny u Jacka Zielińskiego M, pomarańczowe włosy, niebieski garnitur, ogromne stopy mim
Pani Smyk MegaStragan K, żółta koszula, workowate czerwone spodnie trąbka, parasolka
Pan Hobo Cyrk Koloseum M, cygaro, czarne włosy, niewielki kapelusz skrzypce
Klarabela Dom opieki „Wesoła Wdówka” K, różowe włosy, ogromny kwiat, niebieska sukienka krzyk, taniec
Skuter Szpital Miejski M, niebieskie włosy, czerwony garnitur, ogromny nos balony
Balbina Auta Edwarda K, cała na pomarańczowo i w cekinach utrzymywanie równowagi, mały samochodzik
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec, śpiew
Pani Smyk Zabawex K, żółta koszula, workowate niebieskie spodnie trąbka, parasolka
Gonzo Park Zielona Polana M, w przebraniu kobiety, kostium w plamki śpiew, taniec
Pan Smyk Przyjęcie urodzinowe w Mc’Stecku M, zielono-fioletowy kostium, szpiczasty nos wchodzenie do małego samochodu
Pan Hobo Przyjęcie u Eryka Szarzyńskiego M, cygaro, czarne włosy, malutki kapelusz skrzypce
WYSIL
SZARE KOMÓRKI
Czy myślisz, że polecenie DELETE pozwala na usunięcie jednej,
wybranej kolumny z wiersza?
Nie istnieją
głupie pytania
P.:
Czy są jakieś różnice pomiędzy stosowaniem klauzul
WHERE w poleceniach DELETE i w poleceniach SELECT?
O.: Nie, nie ma. Klauzula :+(5( jest zawsze taka sama, niemniej jednak
działanie poleceń 6(/(&7 i '(/(7( jest diametralnie odmienne. Pierwsze
z nich zwraca kopię zawartości kolumn z wierszy spełniających kryteria
podane w klauzuli :+(5(. Natomiast drugie — polecenie '(/(7( —
usuwa z tabeli wszystkie wiersze spełniające zadane kryteria. Należy
pamiętać, że usuwane są całe wiersze.
166 Rozdział 3.
Polecenia DELETE i UPDATE
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD!
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD
:+(5(PLHMVFH
3\V]Q\5RJDO
$1'RFHQD!
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD!
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD
:+(5(PLHMVFH
3\V]Q\5RJDO
25RFHQD
SDF]NLBRFHQ\
miejsce godzina data typ ocena komentarze
Chrupki Król 8:50 27.9 zwyczajny z lukrem 10 niemal doskonały
Pączki u Donalda 8:59 25.8 NULL 6 tłusty
Kafeteria Gwiezdny Pył 7:35 24.5 cynamonowy z lukrem 5 nieświeży, ale smaczny
Pączki u Donalda 7:03 26.4 z dżemem 7 za mało dżemu
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD!
Brak wierszy
:+(5(PLHMVFH
&KUXSNL.URO
$1'RFHQD spełniających kryteria,
wykonanie polecenia
nie da żadnych efektów.
:+(5(PLHMVFH
3\V]Q\5RJDO
$1'RFHQD! Brak wierszy
spełniających kryteria,
wykonanie polecenia
nie da żadnych efektów.
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD!
:+(5(PLHMVFH
&KUXSNL.URO
25RFHQD
:+(5(PLHMVFH
3\V]Q\5RJDO
25RFHQD Brak wierszy
spełniających kryteria,
wykonanie polecenia
nie da żadnych efektów.
SDF]NLBRFHQ\
miejsce godzina data typ ocena komentarze
Chrupki Król 8:50 27.9 zwyczajny z lukrem 10 niemal doskonały
Pączki u Donalda 8:59 25.8 NULL 6 tłusty
Kafeteria Gwiezdny Pył 7:35 24.5 cynamonowy z lukrem 5 nieświeży, ale smaczny
Pączki u Donalda 7:03 26.4 z dżemem 7 za mało dżemu
168 Rozdział 3.
Polecenia DELETE i UPDATE
,16(57 Klarabela Dom opieki „Wesoła Wdówka” K, różowe włosy, ogromny kwiat, niebieska sukienka krzyk, taniec
Klarabela Dom opieki „Wesoła Wdówka” K, różowe włosy, ogromny kwiat, niebieska sukienka taniec
2 Następnie usuń stary rekord, używając polecenia '(/(7( z odpowiednią klauzulą :+(5(.
$1'LPLH
.ODUDEHOD
Teraz w tabeli znajduje się jedynie nowy rekord.
Zaostrz ołówek
Napisz polecenia ,16(57 i '(/(7(, by wprowadzić w tabeli GULQNLBLQIRUPDFMH zmiany
opisane poniżej. Następnie narysuj nową zawartość tabeli.
GULQNLBLQIRUPDFMH
nazwa cena węglowodany kolor lód kalorie
Blackthorn 7.50 8.4 żółty T 33
Blue Moon 6.25 3.2 niebieski T 12
Oh My Gosh 8.75 8.6 pomarańczowy T 35
Lime Fizz 6.25 5.4 zielony T 24
Kiss on the Lips 13.75 42.5 fioletowy T 171
Hot Gold 8.00 32.1 pomarańczowy N 135
Lone Tree 9.00 4.2 czerwony T 17
Greyhound 10.00 14 żółty T 50
Indian Summer 7.00 7.2 brązowy N 30
Bull Frog 6.50 21.5 jasnobrązowy T 80
Soda and It 9.50 4.7 czerwony N 19
Zmień wartość energetyczną drinka Kiss on the Lips — obecnie ma ona wynosić 170 kalorii.
170 Rozdział 3.
Polecenia DELETE i UPDATE
GULQNLBLQIRUPDFMH
Zaostrz ołówek
Rozwiązanie Napisz polecenia ,16(57 i '(/(7(, by wprowadzić w tabeli GULQNLBLQIRUPDFMH
zmiany opisane poniżej. Następnie narysuj nową zawartość tabeli.
GULQNLBLQIRUPDFMH
nazwa cena węglowodany kolor lód kalorie
Blackthorn 7.50 8.4 żółty T 33
Blue Moon 6.25 3.2 niebieski T 12
Oh My Gosh 8.75 8.6 pomarańczowy T 35
Lime Fizz 6.25 5.4 zielony T 24
Kiss on the Lips 13.75 42.5 fioletowy T 171
Hot Gold 8.00 32.1 pomarańczowy N 135
Lone Tree 9.00 4.2 czerwony T 17
Greyhound 10.00 14 żółty T 50
Indian Summer 7.00 7.2 brązowy N 30
Bull Frog 6.50 21.5 jasnobrązowy T 80
Soda and It 9.50 4.7 czerwony N 19
Zmień wartość energetyczną drinka Kiss on the Lips — obecnie ma ona wynosić 170 kalorii.
172 Rozdział 3.
Polecenia DELETE i UPDATE
GULQNLBLQIRUPDFMH
nazwa cena węglowodany kolor lód kalorie
Blackthorn 7.50 8.4 złoty T 33
Blue Moon 6.25 3.2 niebieski T 12
Oh My Gosh 8.75 8.6 pomarańczowy T 35
Lime Fizz 6.25 5.4 zielony T 24
Kiss on the Lips 13.75 42.5 fioletowy T 170
Hot Gold 8.00 32.1 pomarańczowy N 135
Lone Tree 9.00 4.2 czerwony T 17
Greyhound 10.00 14 złoty T 50
Indian Summer 7.00 7.2 brązowy N 30
Bull Frog 6.50 21.5 jasnobrązowy T 80
Soda and It 9.50 4.7 czerwony N 19
Twojej tabeli
glądać zawartość
Oto jak powinna wy niej zmian. Być może kolejność
w
po wprowadzeniu tabeli będzie nieco inna, jednak ść
j
rekordów w Twoje pamiętaj, że tak naprawdę kolejno To nie jest podchwy
nie prz ejm uj się — powinieneś się nad tliwe pytanie, jednak
nie ma żadnego zn
aczenia. Jeśli najpierw zmiennim trochę zastanowić.
a następnie cenę 8,7isz cenę 6,25 na 8,75,
że podniesiesz cenę 5 na 11,25, to okaże się,
A zatem w pierwsze drinka Blue Moon o 4.
Czy to kolejne z waszych zmienić wyższą cen j kolejności powinieneś
ę
podchwytliwych ćwiczeń? a dopiero potem niż (8,75 na 11,25),
szą (6,25 na 8,75).
INSERT INTO drinki_informacje VALUES ('Oh My Gosh', 11.25, 8.6, 'pomarańczowy', 'T', 35);
INSERT INTO drinki_informacje VALUES ('Blue Moon', 8.75, 3.2, 'niebieski', 'T', 12),
3DQ+RER
5HVWDXUDFMD0F?
6WHFN
0F\JDUR
F]DUQHZïRV\PDOXWNLNDSHOXV]
VNU]\SFH
:+(5(RVWDWQLRBZLG]LDQR
6]SLWDOPLHMVNL
:+(5(DNW\ZQRVFL
VNU]\SFH
:+(5(RVWDWQLRBZLG]LDQR
3DUN=LHORQD3RODQD
$1'LPLH
3DQ+RER
:+(5(RVWDWQLRBZLG]LDQR
6]SLWDOPLHMVNL
$1'RVWDWQLRBZLG]LDQR
3DUN=LHORQD3RODQD
:+(5(RVWDWQLRBZLG]LDQR
6]SLWDOPLHMVNL
25RVWDWQLRBZLG]LDQR
3DUN=LHORQD3RODQD
:+(5(LPLH
3DQ+RER
25RVWDWQLRBZLG]LDQR
6]SLWDOPLHMVNL
:+(5(RVWDWQLRBZLG]LDQR
3DUN=LHORQD3RODQD
Usuwa tylko jeden ze starych
$1'LPLH
3DQ+RER
rekordów Pana Hobo.
AND oznacza, że oba war
muszą być spełnione. unki
:+(5(RVWDWQLRBZLG]LDQR
6]SLWDOPLHMVNL
Wraz ze starymi rekordami Pana Hobo
25RVWDWQLRBZLG]LDQR
3DUN=LHORQD3RODQD
usuwa także rekordy Skutera i Gonza.
:+(5(LPLH
3DQ+RER
25RVWDWQLRBZLG]LDQR Usuwa wszystkie rekordy Pana Hobo
6]SLWDOPLHMVNL
oraz rekordy Skutera.
Wygląda na to,
że usunąłeś kilka rekordów, których
nie zamierzałeś usuwać. Może najpierw
powinieneś spróbować wykonać polecenie
SELECT i sprawdzić, jakie rekordy zostaną
usunięte, jeśli użyjesz tej samej klauzuli
WHERE w poleceniu DELETE.
1 W pierwszej kolejności spróbuj pobrać rekordy, które mają być usunięte, by upewnić się,
że usuniesz wyłącznie te rekordy, które planujesz, i żadne inne.
6(/(&7)520NORZQLBLQIRUPDFMH
:+(5(
SR DNW\ZQRVFL
WDQLHF
6( OHFHQLH
/(&
7
imie ostatnio_widziano wyglad aktywnosci
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec
w nim te
Wstaw nowy rekord. Umieść rekordzie,
same dane, co w oryginalnym których
2 Następnie wstaw nowy rekord. modyfikując tylko te pola, .
wartoś ci maj ą ulec zmi anie
,16(57,172NORZQLBLQIRUPDFMH9$/8(6
=LSSR
&HQWUXP+DQGORZH6NDUELHF
.SRPDUDñF]RZ\
JDUQLWXUZRUNRZDWHVSRGQLH
WDQLHFVSLHZ
SRO
,16HFHQLH
(57
imie ostatnio_widziano wyglad aktywnosci
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec, śpiew
178 Rozdział 3.
Polecenia DELETE i UPDATE
/( QLH
7(
'( ROHFH
'(/(7()520NORZQLBLQIRUPDFMH Aby odszukać
S
i usun
rekordy, zastosuj tę ąć niepotrzebne
:+(5( WHERE, której użyłe samą klauzulę
SELECT w kroku 1. ś w poleceniu
DNW\ZQRVFL
WDQLHF
taniec
imie ostatnio_widziano wyglad aktywnosci
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec, śpiew
workowate spodnie
Teraz w tabeli mamy tylko nowy rekord o klownie Zippo.
K, pomarańczowy garnitur,
imie ostatnio_widziano wyglad aktywnosci
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec, śpiew
c
Centrum Handlowe Skarbie
gdyby można było zmienić rekord,
używając tylko jednego polecenia,
i bez obaw, że nowy rekord zostanie
usunięty wraz ze starymi?
Ale wiem, że to zapewne jedynie
moje fantazje… Zippo
W tej klauzuli
83'$7(SDF]NLBRFHQ\
dardowa
określamy nowe
wartości.
6(7 To jest stan ERE, dokładnie
kl au zu la W H ych
jak te, któr
taka sama w poleceniach
W\S
OXNURZDQ\
używaliśmy ELETE.
SELECT i D
:+(5(W\S
]Z\F]DMQ\]OXNUHP
Słowo kluczowe 6(7 informuje system zarządzania bazami danych, że powinien zmienić kolumnę
o nazwie podanej z lewej strony znaku równości i zapisać w niej wartość podaną z prawej strony znaku.
W powyższym przykładzie zmieniamy wartość w kolumnie
W\S
na
OXNURZDQ\
. Z kolei klauzula
:+(5( określa, że zmienione mają zostać wyłącznie rekordy, w których w kolumnie W\S zapisana jest
wartość
]Z\F]DMQ\]bOXNUHP
.
SDF]NLBRFHQ\
miejsce godzina data typ ocena komentarze
Chrupki Król 8:50 27.9 zwyczajny z lukrem 10 niemal doskonały
Pączki u Donalda 8:59 25.8 NULL 6 tłusty
Kafeteria Gwiezdny Pył 7:35 24.5 cynamonowy z lukrem 5 nieświeży, ale smaczny
Pączki u Donalda 7:03 26.4 z dżemem 7 za mało dżemu
SDF]NLBRFHQ\
miejsce godzina data typ ocena komentarze
Chrupki Król 8:50 27.9 lukrowany 10 niemal doskonały
Pączki u Donalda 8:59 25.8 NULL 6 tłusty
Kafeteria Gwiezdny Pył 7:35 24.5 cynamonowy z lukrem 5 nieświeży, ale smaczny
Pączki u Donalda 7:03 26.4 z dżemem 7 za mało dżemu
180 Rozdział 3.
Polecenia DELETE i UPDATE
83'$7(WDEHOD
6(7SLHUZV]DBNROXPQD
QRZDZDUWRVF
GUXJDBNROXPQD
LQQDBZDUWRVF
x Polecenie 83'$7( może modyfikować jeden wiersz
lub grupę składającą się z większej ilości wierszy;
zależnie od zastosowanej klauzuli :+(5(.
Nie istnieją
głupie pytania
P.: Co się stanie, jeśli pominę klauzulę WHERE? O.: Owszem, mógłbyś. Wykonanie tego polecenia spowodowałoby
wprowadzenie identycznych modyfikacji w tym samym wierszu
O.: W takim przypadku we wszystkich wierszach tabeli, tabeli. W przypadku naszej przykładowej tabeli z czterema
w każdej z kolumn podanych w klauzuli 6(7 zostaną zapisane rekordami takie rozwiązanie dałoby zamierzone efekty. Gdybyś
nowe wartości. jednak wykonał powyższe polecenie w tabeli zawierającej setki lub
P.: W poleceniu UPDATE przedstawionym na tysiące rekordów, to w efekcie zostałby zmodyfikowany typ we
wszystkich rekordach dotyczących kawiarni Chrupki Król.
poprzedniej stronie zostały użyte dwa znaki
równości, przy czym wydaje mi się, że każdy P.: O rany! A jak mogę się upewnić, że
z nich ma inne znaczenie. Czy mam rację? zmodyfikowane zostaną wyłącznie zamierzone
rekordy?
O.: Dokładnie. Znak równości użyty w klauzuli 6(7 określa,
że we wskazanej kolumnie należy zapisać podaną wartość; O.: Dokładnie tak samo, jak robiłeś to w przypadku polecenia
z kolei znak równości zastosowany w klauzuli :+(5( pozwala '(/(7(. Jeśli nie masz absolutnej pewności, że klauzula :+(5(
sprawdzić, czy zawartość kolumny jest równa podanej działa prawidłowo, to powinieneś ją sprawdzić, używając polecenia
wartości. 6(/(&7.
P.: A czy mógłbym wprowadzić te same zmiany, P.: Czy w jednym poleceniu UPDATE można
używając poniższego polecenia: umieścić więcej niż jedną klauzulę SET?
83'$7(SDF]NLBRFHQ\6(7W\S
OXNURZDQH
O.: Nie, jednak trudno wyobrazić sobie sytuację, w której
musiałbyś zastosować takie rozwiązanie. W jednej klauzuli 6(7
:+(5(PLHMVFH
&KUXSNL.URO
można bowiem określić nowe wartości dla wszystkich kolumn
tabeli, co pokazaliśmy u góry strony.
83'$7( QD]ZDBWDEHOL
Klauzula
SET określa
wprowadzaną
6(7QD]ZDBNROXPQ\ QRZDZDUWRVF
zmianę.
:+(5(QD]ZDBNROXPQ\ MDNDVZDUWRVF
zula
Nasza dobrze znana i zaufana klau ślić,
okre
WHERE pomaga nam precyzyjnie
jaki rekord powinien zostać zmod
yfikowany.
Polecenie UPDATE
z powodzeniem
może zastąpić
Zobaczmy teraz, jak polecenie 83'$7( sprawdza
się w praktyce — zastosujemy je do wprowadzenia
kombinację poleceń
zmian w tabeli NORZQLBLQIRUPDFMH. DELETE oraz INSERT.
Chcemy zmodyfikow
w tabeli klowni_inf ać rekord umieszczony
ormacje.
Konkretnie
zapisujemy
wartość 'Zabawex'
w kolumnie 83'$7(NORZQLBLQIRUPDFMH
ostatnio_widziano.
6(7RVWDWQLRBZLG]LDQR
=DEDZH[
:+(5(LPLH
3DQ+RER
$1'RVWDWQLRBZLG]LDQR
3DUN=LHORQD3RODQD
RE,
Tutaj umieściliśmy klauzulę WHE rd
reko
która precyzyjnie określa, jaki
padku
należy zmienić. W naszym przy na
ma to być rekord dotyczący klow
Pan Hobo, w którym w kolumnie
ostatnio_widziano jest zapisana
wartość 'Park Zielona Polana'.
182 Rozdział 3.
Polecenia DELETE i UPDATE
Oto informac
zapisać w taje, jakie chcemy
polecenie U beli, oraz
83'$7(NORZQLBLQIRUPDFMH możemy w PDATE, którego
tym celu uż
yć.
6(7RVWDWQLRBZLG]LDQR
=DEDZH[
:+(5(LPLH
3DQ+RER
$1'RVWDWQLRBZLG]LDQR
3U]\MHFLHX(U\ND6]DU]\QVNLHJR
Stosując polecenie UP
DA
wprowadzasz zmiany bez TE,
w określonym rekordzie pośrednio
,
nie ma ryzyka usunięcia dzięki czemu
danych (choć można nad niewłaściwych
przechowywane w tabeli)pisać dane
.
Zaostrz ołówek
Aktualizacja miejsc wystąpień klownów
Tym razem zróbmy wszystko jak należy. Napisz polecenia 83'$7( zapisujące w tabeli nowe dane
o klownach. Aby Ci ułatwić zadanie, napisaliśmy już pierwsze z nich. Następnie wypełnij tabelę
NORZQLBLQIRUPDFMH, by zobaczyć, jak będzie wyglądać jej zawartość po wykonaniu tych poleceń.
UPDATE klowni_informacje
SET aktywnosci = 'spiew'
Widziano Zippo WHERE imie = 'Zippo';
śpiewającą.
Widziano Go
nza
w parku
Zielona Polana
.
ziano
Pana Smyka wid
iłował wcisnąć
ostatnio, jak us
o samochodu.
się do malutkieg
184 Rozdział 3.
Polecenia DELETE i UPDATE
Eklerka Dom opieki „Spokojna Ostoja” K, czerwone włosy, zielona sukienka, ogromne stopy balony, mały samochodzik
Pan Pimpuś Urodziny u Jacka Zielińskiego M, pomarańczowe włosy, niebieski garnitur, ogromne stopy mim
Pani Smyk MegaStragan K, żółta koszula, workowate czerwone spodnie trąbka, parasolka
Pan Hobo Cyrk Koloseum M, cygaro, czarne włosy, niewielki kapelusz skrzypce
Klarabela Dom opieki K, różowe włosy, ogromny kwiat, niebieska sukienka krzyk, taniec
„Wesoła Wdówka”
Skuter Szpital Miejski M, niebieskie włosy, czerwony garnitur, ogromny nos balony
Balbina Auta Edwarda K, cała na pomarańczowo i w cekinach utrzymywanie równowagi, mały samochodzik
Pan Pimpuś Urodziny u Jacka Zielińskiego M, pomarańczowe włosy, niebieski garnitur, ogromne stopy mim
Pani Smyk
Pan Hobo
Klarabela Dom opieki „Wesoła Wdówka” K, różowe włosy, ogromny kwiat, niebieska sukienka krzyk, taniec
Skuter Szpital Miejski M, niebieskie włosy, czerwony garnitur, ogromny nos balony
Zippo
Balbina Auta Edwarda K, cała na pomarańczowo i w cekinach utrzymywanie równowagi, mały samochodzik
Gonzo
Pan Smyk
Zaostrz ołówek
Rozwiązanie Aktualizacja miejsc wystąpień klownów
Twoim zadaniem było napisanie poleceń UPDATE zapisujących w tabeli nowe dane o klownach
oraz wypełnienie tabeli klowni_informacje, by przekonać się, jak będzie wyglądać jej zawartość
po wykonaniu tych poleceń.
UPDATE klowni_informacje
SET aktywnosci = 'spiew'
Widziano Zippo
śpiewającą. WHERE imie = 'Zippo';
lumny
usuwać z ko
Nie chcemy acji o wyglądzie
innych informUpewnij się,
Pani Smyk. niałeś ich podać.
że nie zapom
UPDATE klowni_informacje
Pani Smyk była widziana
ostatnio w niebieskich
SET wyglad = ' K, żółta koszula, workowate niebieskie spodnie'
workowatych spodniach. WHERE imie = 'Pani Smyk';
UPDATE klowni_informacje
Widziano Go
nza SET ostatnio_widziano = 'Park Zielona Polana'
w parku
Zielona Polana WHERE imie = 'Gonzo';
.
UPDATE klowni_informacje
ziano
Pana Smyka wid SET aktywnosci = 'wchodzenie do malutkiego samochodu'
iłował wcisnąć
ostatnio, jak us WHERE imie = 'Pan Smyk';
o samochodu.
się do malutkieg
UPDATE klowni_informacje
Pana Hobo widziano SET ostatnio_widziano = 'Przyjecie u Eryka Szarzynskiego'
ostatnio na przyjęciu
WHERE imie = 'Pan Hobo';
u Eryka Szarzyńskiego.
186 Rozdział 3.
Polecenia DELETE i UPDATE
Eklerka Dom opieki „Spokojna Ostoja” K, czerwone włosy, zielona sukienka, ogromne stopy balony, mały samochodzik
Pan Pimpuś Urodziny u Jacka Zielińskiego M, pomarańczowe włosy, niebieski garnitur, ogromne stopy mim
Pani Smyk MegaStragan K, żółta koszula, workowate czerwone spodnie trąbka, parasolka
Pan Hobo Cyrk Koloseum M, cygaro, czarne włosy, niewielki kapelusz skrzypce
Klarabela Dom opieki K, różowe włosy, ogromny kwiat, niebieska sukienka krzyk, taniec
„Wesoła Wdówka”
Skuter Szpital Miejski M, niebieskie włosy, czerwony garnitur, ogromny nos balony
Zippo Centrum Handlowe Skarbiec K, pomarańczowy garnitur, workowate spodnie taniec
Balbina Auta Edwarda K, cała na pomarańczowo i w cekinach utrzymywanie równowagi, mały samochodzik
Gonzo M, w przebraniu kobiety, kostium w plamki śpiew, taniec
Pan Smyk Zabawex M, zielono-fioletowy kostium, szpiczasty nos
Pan Pimpuś Urodziny u Jacka Zielińskiego M, pomarańczowe włosy, niebieski garnitur, ogromne stopy mim
Pani Smyk MegaStragan K, żółta koszula, workowate niebieskie spodnie trąbka, parasolka
Pan Hobo Przyjęcie u Eryka Szarzyńskiego M, cygaro, czarne włosy, niewielki kapelusz skrzypce
Klarabela Dom opieki „Wesoła Wdówka” K, różowe włosy, ogromny kwiat, niebieska sukienka krzyk, taniec
Skuter Szpital Miejski M, niebieskie włosy, czerwony garnitur, ogromny nos balony
Balbina Auta Edwarda K, cała na pomarańczowo i w cekinach utrzymywanie równowagi, mały samochodzik
Gonzo Park Zielona Polana M, w przebraniu kobiety, kostium w plamki śpiew, taniec
Pan Smyk Zabawex M, zielono-fioletowy kostium, szpiczasty nos wchodzenie do malutkiego samochodu
GULQNLBLQIRUPDFMH
nazwa cena węglowodany kolor lód kalorie
Blackthorn 7.50 8.4 żółty T 33
Blue Moon 6.25 3.2 niebieski T 12
Oh My Gosh 8.75 8.6 pomarańczowy T 35
Lime Fizz 6.25 5.4 zielony T 24
Kiss on the Lips 13.75 42.5 fioletowy T 171
Hot Gold 8.00 32.1 pomarańczowy N 135
Lone Tree 9.00 4.2 czerwony T 17
Greyhound 10.00 14 żółty T 50
Indian Summer 7.00 7.2 brązowy N 30
Bull Frog 6.50 21.5 jasnobrązowy T 80
Soda and It 9.50 4.7 czerwony N 19
83'$7(GULQNLBLQIRUPDFMH
6(7FHQD Cena po dodaniu 2,50 zł.
:+(5(QD]ZD
%OXH0RRQ
188 Rozdział 3.
Polecenia DELETE i UPDATE
Zaostrz ołówek
Dla każdego wiersza tabeli GULQNLBLQIRUPDFMH napisz polecenie 83'$7(,
które powiększy cenę drinka w danym wierszu o 2,50 zł.
Masz rację.
83'$7(GULQNLBLQIRUPDFMH
Dodajemy 2,50 złotego
6(7FHQD FHQD do wszystkich drinków,
które wymagają zmiany ceny
(czyli tych, które kosztują
:+(5( 6,25 zł oraz 8,75 zł).
QD]ZD
%OXH0RRQ
25
QD]ZD
2K0\*RVK
25
QD]ZD
/LPH)L]]
Nie istnieją
głupie pytania
Przybornik SQL
Rozdział 3. już wkrótce przejdzie
52='=,$
DELETE
To narzędzie,
którego możes
używać do us z
uwania wiers
z tabeli. Stosu zy
j w nim klauzu
WHERE, by pr lę
ecyzyjnie okre
wiersze, któr ślać
ych chcesz si
ę pozbyć.
cą
UPDATE istnieją
a k t u alizuje u ją c
cenie zapis SET
To pole lub kolumny), w t ym
kolumnę
(
t o ś ć . Także
ar li To słowo kl
nową w używać klauzu uczowe two
w niej m o ż n a używaną w rzy klauzulę
iu
polecen — to właśn
poleceniach
UPDATE
R E . ie w tej kl
WHE określane s auzuli
ą nowe wa
kolumn. rtości
192 Rozdział 3.
3URMHNWRZDQLHGREU\FKWDEHO
Po co być normalnym?
… i wtedy mamusia
zadzwoniła do W porządku, to nie
swojego tajemniczego jest normalne.
pomocnika!
SRORZ\BLQIRUPDFMH Ta tabela m
jedynie cztea
kolumny. P ry
nazwa nazwa_gatunkowa miejsce waga ją z tabelą orównaj
bass M. salmoides Wigry, PD 1,23 kg rekordowe_
przedstawiopolowy
sandacz S. vitreus Dziubiele, WM 2,75 kg następnej ną na
stronie.
pstrąg O. Clarki Mrzygłód, PK 1,20 kg
okoń P. Flavescens Pisz, WM 0,85 kg
płotka R. rutilus Charzykowy, PM 0,65 kg
łuskot L. Osseus Czaplinek, ZP 1,10 kg
węgorz A. anguilla Swornegacie, PM 1,45 kg
szczupak E. americanus Karwica, WM 3,34 kg
złota rybka C. auratus Warszawa, MZ 0,35 kg
łosoś O. Tshawytscha Toruń, KP 3,10 kg
Marek
194 Rozdział 4.
Projektowanie dobrych tabel
Tabela Jacka także zawiera polską nazwę złowionej ryby oraz jej
wagę; jednak oprócz tego Jacek umieścił w niej kolumny pozwalające
na zapisanie imienia i nazwiska szczęśliwego wędkarza oraz nazwy
strowania
województwa, w którym dokonano połowu. Także ta tabela służy do reje kich, jednak
reko rdow ych poło wów węd kars
więcej kolumn.
zawiera niemal dwukrotnie
UHNRUGRZHBSRORZ\
imie nazwisko nazwa miejsce wojewodztwo waga data
Jan Kowalski bass Wigry PD 1,23 kg 5.9.1947
Adrian Bródka sandacz Dziubiele WM 2,75 kg 16.8.1960
Zenon Krawczyk pstrąg Mrzygłód PK 1,20 kg 23.6.1978
Maria Popiela okoń Pisz WM 0,85 kg 18.5.1934
Piotr Drymza płotka Charzykowy PM 0,65 kg 1.8.1965
Ignacy Wikorczyk łuskot Czaplinek ZP 1,10 kg 31.9.1988
Krzysztof Dubała węgorz Swornegacie PM 1,45 kg 12.8.1973
Paweł Wronek szczupak Karwica WM 3,34 kg 11.6.1995
Andrzej Książewicz złota rybka Warszawa MZ 0,35 kg 25.9.2003
Roman Wiertek łosoś Toruń KP 3,10 kg 17.8.1991
Jacek
Zaostrz ołówek
Rozwiązanie Dla każdej z tabel napisz zapytanie, które pobierze informacje o rekordowych połowach
dokonanych na terenie województwa podkarpackiego.
196 Rozdział 4.
Projektowanie dobrych tabel
Nie istnieją
głupie pytania
P.: A zatem tabela Jacka jest P.: Dlaczego krótsze zapytania P.: A wyobraźmy sobie adres
lepsza od tabeli Marka? są lepsze do długich? pocztowy. Czy nie moglibyśmy
utworzyć jednej kolumny,
O.: Nie. To dwie różne tabele, stworzone O.: Im prostsze jest zapytanie, tym lepiej. w której byłby zapisany cały
w innych celach. W praktyce Marek Zapytania będą się stawać coraz bardziej adres, oraz kilku innych,
rzadko kiedy będzie musiał poszukiwać skomplikowane wraz z powiększaniem w których umieścilibyśmy jego
w swojej tabeli informacji na podstawie się bazy danych i ilości umieszczonych poszczególne elementy?
województwa, gdyż tak naprawdę w niej tabel. Jeśli na samym początku
interesują go jedynie nazwy gatunkowe zaczniesz od możliwie jak najprostszych O.: Choć takie powielanie danych może
i potoczne złowionych ryb oraz, oczywiście, zapytań, to w przyszłości na pewno tego Ci się obecnie wydawać całkiem dobrym
ich waga. nie pożałujesz. pomysłem, to jednak pomyśl, o ile więcej
miejsca na dysku zajmie taka baza, gdy
z informacji o województwie podczas poszuki-
P.:
Z drugiej strony, Jacek będzie musiał korzystać
Chcesz przez to powiedzieć, rozrośnie się do potężnych rozmiarów.
że zawsze powinienem Poza tym w przypadku powielania danych
wania danych w swojej tabeli. To właśnie
przechowywać w kolumnach w poleceniach ,16(57 i 83'$7( pojawią
z tego powodu w jego tabeli informacje
bardzo małe fragmenty się dodatkowe kolumny, o których
o województwie, w jakim dokonano rekor-
informacji? będziesz musiał pamiętać.
dowych połowów, znalazły się w osobnej
kolumnie. To mu ułatwi poszukiwanie danych
na podstawie województwa.
O.: Niekoniecznie. Analizując tabele
Przyjrzyjmy się dokładniej, jak należy
projektować tabele, by optymalnie
Jacka i Marka, mogłeś już zauważyć,
pasowały do sposobów, w jakie będziemy
P.: Czy podczas przeszukiwania
że wszystko zależy od tego, w jaki
sposób chcesz korzystać z tabel.
z nich korzystać.
tabel powinniśmy unikać
Na przykład wyobraź sobie tabele
stosowania operatora LIKE?
dotyczące samochodów — jedną,
O.: Nic nie przemawia za tym, by nie
z której korzysta warsztat mechaniczny,
i drugą, używaną przez właściciela
Sposób, w jaki masz
stosować operatora /,.(, niemniej jednak
może to przysporzyć pewnych problemów
komisu samochodowego. Mechanicy zamiar korzystać
mogą potrzebować szczegółowych
oraz prowadzić do otrzymywania
informacji o każdym samochodzie; z danych, będzie
niepożądanych wyników. Jeśli w kolumnach
są zapisywane złożone informacje, to
z kolei właścicielowi komisu wystarczy
marka, model, rok produkcji oraz numer
determinował postać
operator /,.( nie będzie dostatecznie
precyzyjny, by je pobierać.
nadwozia. tworzonych tabel.
WYSIL
SZARE KOMÓRKI
SQL jest językiem używanym w relacyjnych bazach danych.
Jak uważasz, czym są te „relacje” w świecie baz danych?
Całe wyzwanie i sztuka polega na tym, by opisać zagadnienie, wykorzystując do tego celu
kolumny, które zagwarantują łatwość pobierania danych z tabeli. A to oczywiście zależy
od tego, jakie informacje chcemy pobierać z tabeli. Można wyróżnić kilka bardzo ogólnych
kroków, jakie należy wykonać, projektując tabele.
198 Rozdział 4.
Projektowanie dobrych tabel
Twoja kolej. Napisz analogiczne zdanie dotyczące Jacka — autora artykułów dla
magazynu „Weekend z wędką”, który korzysta z bazy, by notować w niej szczegółowe
informacje na potrzeby swoich artykułów. Następnie narysuj strzałki prowadzące
od nazw kolumn do miejsca w zdaniu, w którym Jacek nawiązuje do danej kolumny.
nazwisko imie
nazwa
wojewodztwo
waga data
miejsce
Czy na podstawie przedstawionego poniżej zdania określającego, w jaki sposób ichtiolog Marek
chce przeszukiwać i pobierać dane z tabeli, potrafisz określić, jakie powinny być jej kolumny?
Rozwiązanie Wpisz nazwy kolumn w pustych prostokątach na poniższym rysunku.
ćwiczenia
nazwa nazwa_gatunkowa
waga miejsce
Twoja kolej. Napisz analogiczne zdanie dotyczące Jacka — autora artykułów dla
magazynu „Weekend z wędką”, który korzysta z bazy, by notować w niej szczegółowe
informacje na potrzeby swoich artykułów. Następnie narysuj strzałki prowadzące
od nazw kolumn do miejsca w zdaniu, w którym Jacek nawiązuje do danej kolumny.
nazwisko imie
nazwa
wojewodztwo
waga data
miejsce
200 Rozdział 4.
Projektowanie dobrych tabel
WYSIL
SZARE KOMÓRKI
Jak myślisz, co oznacza termin „dane atomowe” w kontekście
informacji zapisywanych w relacyjnych bazach danych?
Dane atomowe
Czym jest atom? To niewielki fragment materii, którego nie można lub nie
należy dalej dzielić. To samo dotyczy danych. Kiedy zostaną one uznane za dane
ATOMOWE, oznacza to, że zostały one już podzielone na najmniejsze elementy,
których nie należy dalej dzielić.
202 Rozdział 4.
Projektowanie dobrych tabel
1. Co jest podstawowym
zagadnieniem Czy tabela opisuje klownów, krow
y,
pączki, czy też polityków?
opisywanym przez tabelę?
Nie istnieją
głupie pytania
P.: Czyż atomy nie są bardzo małe? Czy nie P.: W czym może mi pomóc stosowanie danych
powinienem zatem dzielić swoich informacji na atomowych?
naprawdę bardzo małe elementy?
O.: Może Ci pomóc w zapewnieniu, że informacje
O.: Nie. Tworzenie danych atomowych oznacza podzielenie ich przechowywane w tabeli będą precyzyjne. Jeśli na przykład
na najmniejsze elementy konieczne do stworzenia wydajnych utworzysz osobną kolumnę przeznaczoną do przechowywania
tabel, a nie na podzielenie ich na najmniejsze możliwe elementy. numeru domu, to będziesz mógł upewnić się, że będą w niej
zapisywane wyłącznie liczby.
Nie należy dzielić danych bardziej niż to konieczne. Jeśli nie
potrzebujesz dodatkowych kolumn, to nie twórz ich tylko Stosowanie danych atomowych pozwala także poprawić
i wyłącznie dlatego, że mógłbyś to zrobić. efektywność wykonywanych zapytań, gdyż same zapytania
są łatwiejsze do napisania, a czas ich wykonania jest krótszy.
Korzyści, jakie zapewnia nam stosowanie danych atomowych,
są tym wyraźniejsze, im więcej jest danych przechowywanych
w tabeli.
204 Rozdział 4.
Projektowanie dobrych tabel
Zaostrz ołówek
Poniżej przedstawiliśmy dwie oficjalne reguły dotyczące danych atomowych. Dla każdej z nich
narysuj dwie hipotetyczne tabele, które nie będą spełniać wytycznych reguły.
Zaostrz ołówek
Rozwiązanie Poniżej przedstawiliśmy dwie oficjalne reguły dotyczące danych atomowych. Dla każdej z nich
narysuj dwie hipotetyczne tabele, które nie będą spełniać wytycznych reguły.
206 Rozdział 4.
Projektowanie dobrych tabel
Skoro już znasz oficjalne reguły oraz trzy kroki pozwalające na stosowanie danych
atomowych, przeanalizuj wszystkie tabele przedstawione do tej pory w książce i wyjaśnij,
Ćwiczenie dlaczego zawierają one dane atomowe, albo co sprawia, że zapisywane w nich informacje
nie są danymi atomowymi.
Skoro już znasz oficjalne reguły oraz trzy kroki pozwalające na stosowanie danych atomowych,
przeanalizuj wszystkie tabele przedstawione do tej pory w książce i wyjaśnij, dlaczego
Rozwiązanie zawierają one dane atomowe, albo co sprawia, że zapisywane w nich informacje nie są danymi
ćwiczenia atomowymi.
Tabela Grześka, ze strony 83 Nie jest atomowa. Kolumny „zainteresowania” i „szuka” nie są zgodne z regułą 1.
Tabela drinków, ze strony 93 Tabela nie jest atomowa. Zawiera ona więcej niż jedną
kolumnę „składnik”, co jest sprzeczne z regułą 2.
Tabela połowów wędkarskich, strona 194 Tabela jest atomowa. W każdej kolumnie
są zapisywane informacje innego typu.
Każda kolumna zawiera także tylko jedną informację.
208 Rozdział 4.
Projektowanie dobrych tabel
1. W tabelach znormalizowanych
dane się nie powielają, co pozwala Unikanie powielania
ograniczyć wielkość bazy. danych pozwoli
Ci zaoszczędzić
miejsce na dysku.
Zaostrz ołówek
Spróbujmy tak zmodyfikować tabelę NORZQLBLQIRUPDFMH, by stała się ona tabelą atomową.
Spróbuj zaproponować inną strukturę tabeli, zakładając przy tym, że chcemy wyszukiwać w niej
informacje na podstawie kolumn Z\JODG, DNW\ZQRVFL oraz RVWDWQLRBZLG]LDQR.
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
210 Rozdział 4.
Projektowanie dobrych tabel
k
Każdy wiersz danych musi
Już wiem, jan
zaspokoić te
wymóg. zawierać wartości atomowe
WYSIL
SZARE KOMÓRKI
Jak sądzisz, jakiego typu kolumny będą się nadawały
do tworzenia klucza głównego?
212 Rozdział 4.
Projektowanie dobrych tabel
WYSIL
SZARE KOMÓRKI
Czy na podstawie tych wszystkich informacji możesz podać przykład dobrego klucza
głównego?
Przejrzyj przykładowe tabele, które przedstawiliśmy we wcześniejszej części książki.
Czy w którejś z nich jest kolumna zawierająca naprawdę unikalne wartości?
Dla maniaków
W świecie SQL-a trwa niekończąca się debata na temat
tego, czy należy używać syntetycznych kluczy głównych,
czyli specjalnie utworzonych (takich jak nasza kolumna LG), czy też kluczy
naturalnych — tworzonych na podstawie informacji, które już są zapisane
w tabeli (takich jak numer nadwozia lub PESEL). Nie preferujemy żadnego
z tych rozwiązań, a zagadnieniami związanymi z kluczami głównymi
zajmiemy się bardziej szczegółowo w rozdziale 7.
214 Rozdział 4.
Projektowanie dobrych tabel
Nie istnieją
głupie pytania
P.: Cały czas mówicie o „pierwszej” postaci O.: Nie. Jak na razie żadna ze stworzonych przez nas tabel nie
normalnej. Czy to oznacza, że istnieje też druga zawiera ani klucza głównego, ani wartości unikalnych.
postać normalna? A może i trzecia?
P.: Wydaje mi się, że kolumna „komentarze”
O.: Owszem, faktycznie istnieją także druga i trzecia postać w tabeli o pączkach nie zawiera wartości
normalna, a każda z nich narzuca coraz to bardziej wymagające atomowych. Chodzi mi o to, że nie ma żadnego
warunki na strukturę i zawartość tabel. Zajmiemy się nimi prostego sposobu przeszukiwania jej zawartości.
dokładniej w rozdziale 7.
O.: Masz całkowitą rację. Ta kolumna raczej nie jest szczególnie
P.: No dobrze, zatem zmieniliśmy nasze tabele atomowa. Choć z drugiej strony, projekt naszej tabeli nie narzucał
w taki sposób, by zawierały dane atomowe. Czy takiej konieczności. Gdybyśmy jednak zdecydowali się na
któraś z nich znajduje się już w pierwszej postaci ograniczenie zawartości opinii do ściśle określonej grupy słów,
normalnej? to to pole mogłoby być atomowe. Jednak w takim przypadku
zapisywane w bazie opinie nie byłyby spontaniczne.
WYSIL
SZARE KOMÓRKI
Czy pamiętasz, jak można dodawać kolumny
do istniejących tabel?
216 Rozdział 4.
Projektowanie dobrych tabel
&5($7(7$%/(PRMHBNRQWDNW\
QD]ZLVNR9$5&+$5
LPLH9$5&+$5
HPDLO9$5&+$5
SOHF&+$5
GDWDBXURG]HQLD'$7(
]DZRG9$5&+$5 belę,
Czy tworząc ta ić
możemy popraw kolumn?
W tej tab
ORNDOL]DFMD9$5&+$5 atomowość ty
ch
nie ma eli
kolumny VWDQ9$5&+$5
klucza
głównego
. ]DLQWHUHVRZDQLD9$5&+$5
V]XND9$5&+$5
WYSIL
SZARE KOMÓRKI
A co zrobić, gdybyśmy nie mieli nigdzie zanotowanego oryginalnego
polecenia &5($7(7$%/( użytego do utworzenia tabeli? Czy istnieje jakiś
sposób dotarcia do jego kodu?
tabelę
Pokażcie mi moją kasę
A co by się stało, gdybyś zastosował polecenie '(6&5,%(
PRMHBNRQWDNW\, by podejrzeć kod użyty do utworzenia
tej tabeli? Otóż gdybyś to zrobił, w oknie konsoli ujrzałbyś
następujące wyniki:
6+2:&5($7(7$%/(PRMHBNRQWDNW\
218 Rozdział 4.
Projektowanie dobrych tabel
CSOHFCFKDUGHIDXOW18//
CGDWDBXURG]HQLDCGDWHGHIDXOW18//
C]DZRGCYDUFKDUGHIDXOW18//
CORNDOL]DFMDCYDUFKDUGHIDXOW18//
CVWDQCYDUFKDUGHIDXOW18//
C]DLQWHUHVRZDQLDCYDUFKDUGHIDXOW18//
CV]XNDCYDUFKDUGHIDXOW18//
220 Rozdział 4.
Projektowanie dobrych tabel
Nie istnieją
głupie pytania
O.:
tych indeksów. Jak na razie jedynym typem indeksów, z jakim się
Najprościej rzecz ujmując — jedynie Ty. Zapisując w tabeli każdy zetknęliśmy, był klucz główny, jednak w dalszej części książki to
nowy wiersz, w kolumnie LGBNRQWDNWX będziesz umieszczał nową, polecenie stanie się znacznie bardziej przydatne.
unikalną wartość. Na przykład w pierwszym wydawanym poleceniu
Istnieje jeszcze jedna wersja polecenia 6+2:, i to wersja BARDZO
,16(57 w kolumnie LGBNRQWDNWX zapiszesz wartość , w kolejnym
użyteczna:
wierszu wartość i tak dalej.
6+2::$51,1*6
P.: Wyobrażam sobie, że takie określanie unikalnych Jeśli w oknie konsoli pojawi się informacja, że podczas wykonywania
wartości KLUCZA GŁÓWNEGO w każdym nowym polecenia SQL pojawiły się jakieś ostrzeżenia, to użyj tego polecenia,
rekordzie musi być naprawdę kłopotliwe. by wyświetlić ich treść.
Czy nie ma żadnego prostszego rozwiązania? Dostępne są jeszcze inne wersje polecenia 6+2:, jednak te
przedstawione powyżej dotyczą zagadnień, którymi się już
O.: Owszem, są prostsze rozwiązania; i to nawet dwa. Pierwszym zajmowaliśmy.
z nich jest zastosowanie jako klucza głównego jakiejś istniejącej
kolumny danych, o której wiemy, że ma unikalne wartości. P.: No a co ze znakami lewego apostrofu, które
Wspominaliśmy jednak, że takie rozwiązanie może przysparzać zostały użyte w kodzie zwróconym przez polecenie
pewnych problemów (na przykład w przypadku stosowania SHOW CREATE TABLE? Czy jesteście pewni, że
numerów PESEL użytkownicy mogą się obawiać przejęcia swoich nie są potrzebne?
poufnych informacji przez niepożądane osoby).
Prostym rozwiązaniem jest utworzenie zupełnie nowej kolumny, O.: Są one używane dlatego, że w niektórych przypadkach
przeznaczonej do przechowywania unikalnych wartości klucza system zarządzania bazami danych może nie być w stanie określić,
głównego, takiej jak kolumna LGBNRQWDNWX na poprzedniej stronie. że nazwa ma być nazwą kolumny. Jeśli jednak zapiszesz nazwy
W takim przypadku można nakazać systemowi obsługi baz danych, kolumn pomiędzy znakami lewego apostrofu, to istnieje możliwość
by automatycznie wypełniał wartość takiej kolumny w każdym stosowania słów kluczowych języka SQL jako nazw kolumn; choć
rekordzie dodawanym do tabeli. Do tego celu służy specjalne słowo absolutnie nie polecamy takiego rozwiązania.
kluczowe. Zajrzyj na następną stronę — tam znajdziesz więcej Na przykład wyobraźmy sobie, że z jakichś niewytłumaczalnych
informacji na ten temat. powodów chcielibyśmy nadać kolumnie nazwę VHOHFW. Poniższa
deklaracja kolumny jest jednak nieprawidłowa:
P.: Czy polecenia SHOW mogę używać także VHOHFWYDUFKDU
do wyświetlania innych informacji, czy tylko
do odtworzenia polecenia CREATE TABLE? Zamiast niej musielibyśmy użyć następującej deklaracji:
CVHOHFWCYDUFKDU
O.: Polecenia 6+2: można także używać do wyświetlania
informacji o konkretnych kolumnach: P.: A niby czemu stosowanie słów kluczowych języka
6+2:&2/8016)520QD]ZDBWDEHOL SQL jako nazw kolumn jest złym rozwiązaniem?
O.:
To polecenie wyświetli nazwy wszystkich kolumn podanej tabeli
wraz ze wszystkimi informacjami na ich temat. Oczywiście wolno to robić, jednak nie jest to dobry pomysł.
Pomyśl tylko, jak mylące i trudne do zrozumienia mogą się stać
6+2:&5($7('$7$%$6(QD]ZDBED]\BGDQ\FK
zapytania oraz jak męczące będzie wpisywanie tych wszystkich
Powyższe polecenie, podobnie jak polecenie 6+2:&5($7(7$%/( znaków lewego apostrofu. Poza tym VHOHFW nie jest dobrą nazwą
QD]ZDBWDEHOL, zwraca kod polecenia &5($7(, z tym że w tym dla kolumny, gdyż nie mówi nic o danych, jakie są w niej zapisywane.
przypadku będzie to polecenie służące do utworzenia całej bazy
danych.
1, 2, 3… automatycznie inkrementowane
Dodanie do naszej kolumny LGBNRQWDNWX słowa kluczowego
$872B,1&5(0(17 nakaże, by w pierwszym wierszu tabeli przyjęła
ona wartość , a w każdym kolejnym była powiększana o .
systemów
To jest to! W większości wystarczy
zarządzania bazami danych słowo
ać
do deklaracji kolumny dod
NCR EME NT.
&5($7(7$%/(PRMHBNRQWDNW\ kluc zow e AUT O_I
iętajcie:
(Użytkownicy MS SQL pam to słowo
ypa dku będ zie
w Waszym prz
należy
kluczowe INDEX, po którymoraz liczbę,
podać wartość początkową wartości
LGBNRQWDNWX,1712718//$872B,1&5(0(17 o którą będą powiększane
ch. Bardziej
w poszczególnych kolumna ten temat
QD]ZLVNRYDUFKDUGHIDXOW18// szczeg ółow e info rma cje na
cji
można znaleźć w dokumenta
LPLHYDUFKDUGHIDXOW18// serwera MS SQL).
ORNDOL]DFMDYDUFKDUGHIDXOW18//
VWDQYDUFKDUGHIDXOW18//
]DLQWHUHVRZDQLDYDUFKDUGHIDXOW18//
V]XNDYDUFKDUGHIDXOW18//
35,0$5<.(<LGBNRQWDNWX
222 Rozdział 4.
Projektowanie dobrych tabel
1. Poniżej, w pustych wierszach, zapisz kod polecenia &5($7(7$%/(, które pozwoli utworzyć tabelę
służącą do przechowywania imion i nazwisk osób. Powinna ona zawierać kolumnę klucza głównego,
Ćwiczenie której wartości będą automatycznie inkrementowane, oraz dwie kolumny atomowe.
2. Wykonaj powyższe polecenie w oknie konsoli bazy danych lub innym programie
do zarządzania bazą.
3. Spróbuj wykonać każde z poniższych poleceń ,16(57. Zakreśl te, które działają
prawidłowo.
,16(57,172WZRMDBWDEHODLGLPLHQD]ZLVNR
9$/8(618//
0DU\VLD
.UDZF]\N
,16(57,172WZRMDBWDEHODLGLPLHQD]ZLVNR
9$/8(6
-DQND
.UDZF]\N
,16(57,172WZRMDBWDEHOD
9$/8(6
%DUWHN
.UDZF]\N
,16(57,172WZRMDBWDEHODLPLHQD]ZLVNR
9$/8(6
&HF\OLD
.UDZF]\N
,16(57,172WZRMDBWDEHODLGLPLHQD]ZLVNR
9$/8(6
3LRWU
.UDZF]\N
id imie nazwisko
1. Poniżej, w pustych wierszach, zapisz kod polecenia &5($7(7$%/(, które pozwoli utworzyć tabelę
Rozwiązanie służącą do przechowywania imion i nazwisk osób. Powinna ona zawierać kolumnę klucza głównego,
której wartości będą automatycznie inkrementowane, oraz dwie kolumny atomowe.
ćwiczenia
CREATE TABLE twoja_tabela
(
id INT NOT NULL AUTO_INCREMENT,
imie VARCHAR(20),
nazwisko VARCHAR(30),
PRIMARY KEY (id)
);
2. Wykonaj powyższe polecenie w oknie konsoli bazy danych lub innym programie do
zarządzania bazą.
3. Spróbuj wykonać każde z poniższych poleceń ,16(57. Zakreśl te, które działają
prawidłowo.
,16(57,172WZRMDBWDEHODLGLPLHQD]ZLVNR
9$/8(618//
0DU\VLD
.UDZF]\N
,16(57,172WZRMDBWDEHODLGLPLHQD]ZLVNR
9$/8(6
-DQND
.UDZF]\N
,16(57,172WZRMDBWDEHOD
9$/8(6
%DUWHN
.UDZF]\N
,16(57,172WZRMDBWDEHODLPLHQD]ZLVNR
9$/8(6
&HF\OLD
.UDZF]\N
,16(57,172WZRMDBWDEHODLGLPLHQD]ZLVNR
9$/8(6
3LRWU
.UDZF]\N
224 Rozdział 4.
Projektowanie dobrych tabel
Nie istnieją
głupie pytania
Rozdział 4.
tabeli. Choć nie ma
to
większego znaczenia
,
to jednak umieszczani
klucza głównego jak e
da o
Oto nasze nowe polecenie A to kod, który do nę. pierwszej kolumny tab
SQL — ALTER. do tabeli nową kolum jest dobrym pomysłem eli
.
Czy nie wygląda
znajomo?
Dodawanie klucza głównego
$/7(57$%/(PRMHBNRQWDNW\
$''&2/801LGBNRQWDNWX,1712718//$872B,1&5(0(17),567
$''35,0$5<.(<LGBNRQWDNWX
więc będziesz musiał obrócić książkę, żeby je przeczytać).
Poniżej przedstawiliśmy kod, który pozwoli dodać do tabeli
WYSIL
SZARE KOMÓRKI
Czy sądzisz, że powyższe polecenie doda wartości do kolumny LGBNRQWDNWX w już istniejących rekordach
tabeli czy tylko w rekordach, które dopiero będą w niej zapisywane? Jak możesz to sprawdzić?
Projektowanie dobrych tabel
Ten komunikat
informuje nas, że
polecenie dodało
nową kolumnę
do 37 rekordów,
które już były
zapisane w bazie.
Ty zapewne nie
będziesz ich mieć Zajefajnie…
aż tak wielu. Teraz już mam kolumnę klucza
głównego wraz z odpowiednimi
wartościami. Czy mogę użyć polecenia
ALTER także do dodania kolumny do
zapisywania numeru telefonu?
Kolumna id_konta
ktu
została dodana jak
pierwsza — przed o
wszystkimi pozosta
kolumnami. łymi
Ponieważ użyliśmy
słowa kluczowego
AUTO_INCREMENT,
zawartość tej kolumny
była uzupełniana
podczas modyfikowania
poszczególnych,
istniejących już jest
wierszy tabeli. Kiedy w przyszłośc Pamiętaj, to nie śka;
to w jego kolumnie i będziemy dodawali nowy rekord, konie c ta be li Gr ze
wartość o jeden wi id_kontaktu zostanie zapisana ajduje
tak naprawdę zn wiele
zapisanej w całej ększa od największej wartości się w nie j jes zc ze
A zatem, jeśli w tabeli w kolumnie id_kontaktu. innych kontaktów.
os
w kolumnie kontakt_tatnim dodawanym rekordzie
to w kolejnym rek id znajduje się wartość 23,
ordzie znajdzie się
wartość 24.
Przybornik SQL
A zatem opanowałeś materiał z czwartego
52='=,$
228 Rozdział 4.
Projektowanie dobrych tabel
Zaostrz ołówek
Rozwiązanie Spróbujmy tak zmodyfikować tabelę NORZQLBLQIRUPDFMH, by stała się ona tabelą atomową.
Spróbuj zaproponować inną strukturę tabeli, zakładając przy tym, że chcemy wyszukiwać
w niej informacje na podstawie kolumn Z\JODG, DNW\ZQRVFL oraz RVWDWQLRBZLG]LDQR.
232 Rozdział 5.
Polecenie ALTER
Zaostrz ołówek
Przeanalizuj dokładnie kod polecenia $/7(57$%/(, które zastosowaliśmy w rozdziale 4.,
by dodać do tabeli kolumnę klucza głównego. Sprawdź, czy będziesz wiedział, jak samodzielnie
napisać polecenie $/7(5, które doda do tabeli kolumnę telefon, w której będzie można
zapisać do 10 cyfr. Zwróć uwagę, że w tym poleceniu nie będziesz musiał używać wszystkich
poznanych słów kluczowych.
$/7(57$%/(PRMHBNRQWDNW\
$''&2/801LGBNRQWDNWX,1712718//$872B,1&5(0(17),567
$''35,0$5<.(<LGBNRQWDNWX
Polecenie $/7(5 pozwala nawet określić, w jakim miejscu ma zostać dodana nowa kolumna. Zobaczmy, czy będziesz
w stanie domyślić się, jakiego słowa kluczowego należy użyć i gdzie je umieścić, by nowa kolumna została dodana
bezpośrednio za kolumną LPLH.
Poniżej zapisz swoje nowe polecenie $/7(5:
Zaostrz ołówek
Przeanalizuj dokładnie kod polecenia $/7(57$%/(, które zastosowaliśmy w rozdziale 4.,
by dodać do tabeli kolumnę klucza głównego. Sprawdź, czy będziesz wiedział, jak samodzielnie
napisać polecenie $/7(5 dodające do tabeli kolumnę telefon, w której będzie można
zapisać do 10 cyfr. Zwróć uwagę, że w tym poleceniu nie będziesz musiał używać wszystkich
poznanych słów kluczowych.
$/7(57$%/(PRMHBNRQWDNW\
$''&2/801LGBNRQWDNWX,1712718//$872B,1&5(0(17),567
$''35,0$5<.(<LGBNRQWDNWX
Słowa kluczowe, które poznaliśmy
w poprzednim rozdziale, a których
tu nie użyjemy, to: NOT NULL,
Poniżej zapisz swoje polecenie $/7(5: AUTO_INCREMENT oraz FIRST.
Cały czas zajmuje
my
modyfikowaniem tab się
moje_kontakty. eli
Ten fragment
precyzyjnie okpolecenia na, którą
Nowa kolum ć do tabeli,
w jaki sposób reśla, ch ce m y do da
zmodyfikować należy telefon.
nosi nazwę
tabelę.
Polecenie $/7(5 pozwala nawet określić, w jakim miejscu ma zostać dodana nowa kolumna. Zobaczmy, czy będziesz
w stanie się domyślić, jakiego słowa kluczowego należy użyć i gdzie je umieścić, by nowa kolumna została dodana
bezpośrednio za kolumną LPLH.
Poniżej zapisz swoje nowe polecenie $/7(5:
234 Rozdział 5.
Polecenie ALTER
$/7(57$%/(PRMHBNRQWDNW\
$''&2/801WHOHIRQ9$5&+$5
id_kontaktu nazwisko imie email telefon
$/7(57$%/(PRMHBNRQWDNW\
$''&2/801WHOHIRQ9$5&+$5
id_kontaktu telefon nazwisko imie email
$/7(57$%/(PRMHBNRQWDNW\
$''&2/801WHOHIRQ9$5&+$5
id_kontaktu nazwisko telefon imie email
$/7(57$%/(PRMHBNRQWDNW\
$''&2/801WHOHIRQ9$5&+$5
Przyklej swoje
magnesiki na 6(&21' $)7(5
końcu każdego %()25(
z tych poleceń.
),)7+
Użyj średnika tyle razy,
ile będziesz potrzebował.
$''&2/801WHOHIRQ9$5&+$5
$/7(57$%/(PRMHBNRQWDNW\
$''&2/801WHOHIRQ9$5&+$5 6(&21' Zastosowanie słowa kluczowego
SECOND (ang. drugi) sprawi,
że nowa kolumna zostanie
$/7(57$%/(PRMHBNRQWDNW\ umieszczona jako druga kolumna
tabeli; podobnie zadziała użycie
$''&2/801WHOHIRQ9$5&+$5 słowa kluczowego BEFORE, jeśli
podamy za nim kolumnę nazwisko.
%()25( QD]ZLVNR
236 Rozdział 5.
Polecenie ALTER
Modyfikowanie tabel
Polecenie $/7(5
3U]HUöENL %D]RGDQRZD
pozwala na
wprowadzanie
niemal dowolnych
$%(/
1$6=(868*,1$ 5=(&=,671,(-k&<&+7
modyfikacji
w strukturze tabeli,
bez konieczności
usuwania =0,$1$]DUöZQRQD]Z\MDNLW\SXGDQ\FKLVWQLHMÈFHMNROXPQ\
i ponownego
02'<),.$&-$W\SXGDQ\FKRUD]SRïRĝHQLDLVWQLHMÈFHMNROX
wpisywania do niej PQ\
danych. Ale uważaj
XPQ\
'2'$:$1,(NROXPQGRWDEHOLĽVDPZ\ELHUDV]W\SGDQ\FKNRO
— zmieniając typ
kolumny, możesz
ryzykować utratę
868:$1,(NROXPQ\]WDEHOL
To tylko mała
zapisanych w niej modyfikacja,
informacji. nie będzie boleć.
XG]LHODP\ JZDUDQFML
0RĝHVLÚZLÈ]DÊ]XWUDWÈGDQ\FK QLH
QD GDQH
868*,'2'$7.2:(
OL
=PLHñ NROHMQRĂÊNROXPQZVZRMHMWDEH
PRĝOLZRĂÊGRVWÚSQD Z\ïÈF]QLH
ZUD]LH Xĝ\FLDSROHFHQLD$''
WYSIL
SZARE KOMÓRKI SURMHNW\
Dlaczego przedstawiona obok tabela numer infooproj nazwfirmwyk
może wymagać zmian?
1 malowanie elewacji domu SUP-Rem
2 instalacja nowej kuchni RemBudSzpachelka
3 położenie drewnianej podłogi Kem-Rem
4 przekładka dachu Jackowski i Syn
238 Rozdział 5.
Polecenie ALTER
$/7(57$%/(SURMHNW\
5(1$0(72OLVWDBSURMHNWRZ
„lista_projektow” to
To tak, jakby ktoś nowa nazwa, którą
mówił po angielsku! chcemy nadać tabeli.
Oznacza to, że chcem
ZMIENIĆ NAZWĘ taby
eli.
Poniższy opis pozwoli Ci się zorientować, jakie inne modyfikacje należy wprowadzić w tabeli.
Poniższy akapit zawiera zdania opisujące, w jaki sposób mamy zamiar korzystać z tabeli;
Ćwiczenie na ich podstawie określ nazwy kolumn i zapisz je w pustych prostokątach.
LGBSURM
$E\=1250$/,=2:$ýWDEHOĐGRGDP\GRQLHMNROXPQĐ
NOXF]DJâyZQHJR]DZLHUDMċFċXQLNDOQ\QXPHUSURMHNWX
2SUyF]WHJREĐG]LHP\SRWU]HERZDOLNROXPQ]DZLHUDMċF\FK
RSLVZV]HONLFKSUDFZ\NRQ\ZDQ\FKZUDPDFKGDQHJR
SURMHNWXGDWĐUR]SRF]ĐFLDW\FKSUDFV]DFXQNRZ\NRV]W
RUD]QD]ZĐILUP\EXGRZODQHM]DMPXMċFHMVLĐSUDFDPL
QRLRF]\ZLĤFLHWHOHIRQGRWHMILUP\
Poniższy opis pozwoli Ci się zorientować, jakie inne modyfikacje należy wprowadzić w tabeli.
Poniższy akapit zawiera zdania opisujące, w jaki sposób mamy zamiar korzystać z tabeli;
Ćwiczenie na ich podstawie określ nazwy kolumn i zapisz je w pustych prostokątach.
LGBSURM
RSLVBSURM GDWDBUR]S
$E\=1250$/,=2:$ýWDEHOĐ
GRGDP\GRQLHMNROXPQĐNOXF]DJâyZQHJR
]DZLHUDMċFċXQLNDOQ\QXPHUSURMHNWX
2SUyF]WHJREĐG]LHP\SRWU]HERZDOLNROXPQ
]DZLHUDMċF\FKRSLVZV]HONLFKSUDFZ\NRQ\ZDQ\FK
ZUDPDFKGDQHJRSURMHNWXGDWĐUR]SRF]ĐFLD
W\FKSUDFV]DFXQNRZ\NRV]WRUD]QD]ZĐILUP\
EXGRZODQHM]DMPXMċFHMVLĐSUDFDPLQRLRF]\ZLĤFLH
WHOHIRQGRWHMILUP\
NRV]WBV]DF
ILUPDBWHO
ILUPDBQD]ZD
240 Rozdział 5.
Polecenie ALTER
OLVWDBSURMHNWRZ
Jak widać, dane, które mają się znaleźć w trzech spośród docelowych
kolumn naszej tabeli, już są w niej zapisane. A zatem zamiast tworzyć
nowe kolumny, możemy zmienić nazwy już istniejących. W ten sposób
nie będziemy musieli ponownie zapisywać w tabeli tych samych danych.
WYSIL
SZARE KOMÓRKI
Która z istniejących już kolumn tabeli byłaby dobrym
kandydatem na klucz główny tabeli?
Przezbrajanie kolumn
Dysponujemy już planem i wiemy, od czego zacząć wprowadzanie
modyfikacji w naszej tabeli. Możemy użyć polecenia $/7(5 i za jego
pomocą przypisać nowe nazwy trzem istniejącym już kolumnom tabeli:
OLVWDBSURMHNWöZ
ż jest
Ta kolumna ju li, lecz
w naszej tabe zwę
na
zmienimy jej kolumna Ta kolumna,
na id _p ro j. Ta będzie przechfirma_nazwa,
funkcję nazwę firmy owywać
będzie pełnić tabeli. realizującej
a gł ów ne go projekt.
klucz
OLVWDBSURMHNWöZ
id_proj opis_proj firma_nazwa
242 Rozdział 5.
Polecenie ALTER
Zmiany strukturalne
Zdecydowaliśmy, że wszystkie trzy dotychczasowe kolumny tabeli zostaną
przekształcone w kolumny tabeli docelowej. Oprócz modyfikacji samych
nazw tych kolumn warto też zwrócić uwagę na typ przechowywanych w nich
informacji.
WYTĘŻ
UMYSŁ
Spójrz na typ każdej z dotychczasowych kolumn tabeli i określ,
czy odpowiada on danym, jakie w przyszłości będziemy w nich
zapisywali.
Zaostrz ołówek
Naszkicuj strukturę tabeli po wykonaniu powyższego polecenia SQL.
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
244 Rozdział 5.
Polecenie ALTER
„infooproj” to
st
nazwa kolumny ara
chcemy zmieni , którą
użyciu tego poć przy Zwiększamy ilość
lecenia. znaków w tej kolumnie,
„opis_proj” to dzięki czemu opisy
nowa nazwa projektów będą mogły
kolumny. być dłuższe.
$/7(57$%/(OLVWDBSURMHNWRZ
&+$1*(&2/801LQIRRSURMRSLVBSURM9$5&+$5
&+$1*(&2/801QD]ZILUPZ\NILUPDBQD]ZD9$5&+$5
na,
Zmieni się także kolum wę
ra upr zed nio nos iła naz …teraz nazwiemy ją
któ
„nazwfirmwyk”… „firma_nazwa”; a to
jest nowy typ danych
tej kolumny.
$/7(57$%/(OLVWDBSURMHNWRZ
02',)<&2/801RSLVBSURM9$5&+$5
Nazwa mod Nowy typ kolumny.
kolumny. yfikowanej
No i oczywiście upewniłeś się, że
zmiana typu kolumny nie spowoduje
obcięcia danych, które już są w niej
zapisane!
Nie istnieją
głupie pytania
P.: A co mogę zrobić, aby zmienić kolejność P.:Ale czy nieodpowiednia kolejność kolumn nie
kolumn w tabeli? Czy mogę wykonać polecenie będzie mi w przyszłości przysparzać problemów?
w postaci: ALTER TABLE MODIFY COLUMN opis_
proj AFTER nazwa_kolumny;? O.: Nie. Ponieważ tak się szczęśliwie składa, że kolejność,
w jakiej kolumny będą zwracane w wynikach, można określić
O.: Okazuje się, że po utworzeniu tabeli nie można już w zapytaniu 6(/(&7. Kolejność, w jakiej dane są zapisane na
modyfikować kolejności jej kolumn. Najlepszym rozwiązaniem dysku, nie ma znaczenia, co pokazują poniższe przykłady:
będzie zatem dodanie nowej kolumny w odpowiednim miejscu
6(/(&7NROXPQDNROXPQD)520WZRMDBWDEHOD
i usunięcie starej kolumny; jednak w takim przypadku utracisz
wszystkie dane zapisane w dotychczasowej kolumnie. albo
6(/(&7NROXPQDNROXPQD)520WZRMDBWDEHOD
Jak widać, kolejność kolumn może być dowolna.
246 Rozdział 5.
Polecenie ALTER
Mamy zatem dodać do tabeli projektów trzy nowe kolumny, w których będą
zapisywane: numer telefonu, data rozpoczęcia prac oraz szacunkowy koszt.
W poniższych pustych wierszach napisz jedno polecenie $/7(5, które doda do
tabeli projektów trzy nowe kolumny; zwróć przy tym uwagę na typy danych.
Następnie uzupełnij tabelę umieszczoną u dołu strony.
OLVWDBSURMHNWRZ
Wciąż mamy dodać do tabeli projektów trzy nowe kolumny, w których będą
zapisywane: numer telefonu, data rozpoczęcia prac oraz szacunkowy koszt.
W poniższych pustych wierszach napisz jedno polecenie $/7(5, które doda do tabeli
projektów trzy nowe kolumny; zwróć przy tym uwagę na typy danych. Następnie
uzupełnij tabelę umieszczoną u dołu strony.
Pole VARC
10 znaków HAR o długości
zapisać nu pozwoli nam
z numerem mer telefonu wraz
kierunkow
ym.
OLVWDBSURMHNWRZ
248 Rozdział 5.
Polecenie ALTER
Zaostrz ołówek
A zatem do dzieła; nie ociągaj się i napisz polecenie SQL, które usunie z naszej tabeli
kolumnę GDWDBUR]S. Nie pokazaliśmy jeszcze składni tego polecenia, niemniej jednak
chyba sam możesz spróbować.
Zaostrz ołówek
Rozwiązanie A zatem do dzieła; nie ociągaj się i napisz polecenie SQL, które usunie z naszej tabeli kolumnę
GDWDBUR]S. Nie pokazaliśmy jeszcze składni tego polecenia, niemniej jednak chyba sam
możesz spróbować.
To nazwa tabeli
— lista_projektow
.
$/7(57$%/(OLVWDBSURMHNWRZ
'523&2/801GDWDBUR]S
Jeśli chcesz usunąć
kolumnę, to posłuż się
poleceniem DROP.
To naprawdę łatwizna! A to nazwa kolumny,
którą chcesz usunąć.
8ZDJD
informacje także zostaną usunięte!
Z polecenia DROP COLUMN należy korzystać bardzo ostrożnie.
W pierwszej kolejności warto, żebyś wyświetlił całą jej zawartość i upewnił się, że
naprawdę chcesz ją usunąć! Już lepiej mieć w bazie trochę niepotrzebnych danych,
niż żeby nagle się okazało, że brakuje jakichś ważnych informacji.
250 Rozdział 5.
Polecenie ALTER
Przed VWDURFLH
kolor rok marka mo koszt
srebrny 1998 Porsche Boxter 94500
NULL 2000 Jaguar XJ 102000
czerwony 2002 Cadillac Escalade 62000
Po VDPRFKRG\
Przed VWDURFLH
kolor rok marka mo koszt
srebrny 1998 Porsche Boxter 94500
NULL 2000 Jaguar XJ 102000
czerwony 2002 Cadillac Escalade 62000
Po VDPRFKRG\
252 Rozdział 5.
Polecenie ALTER
Przed przystąpien
iem do
modyfikowania tab
wykonał polecenie eli warto, byś
sprawdził typy ko DESCRIBE,
lum
że zmiany nie spow n i upewnił się,
informacji zapisan odują obcięcia
ych w tabeli.
RENAME TO samochody,
Nie istnieją
głupie pytania
P.: Wcześniej napisaliście, że przy użyciu P.: Co zrobić, jeśli przez przypadek określiłem
polecenia MODIFY nie można zmienić kolejności klucz główny, lecz po jakimś czasie dojdę do
kolumn. Jednak oprogramowanie do obsługi baz wniosku, że kluczem głównym powinna być inna
danych, którego używam, pozwala na zmianę kolumna? Czy istnieje możliwość oznaczenia,
kolejności kolumn. Jak ono to robi? że kolumna nie jest kluczem głównym bez
jednoczesnej utraty danych, które są w niej
O.: Twoje oprogramowanie w niezauważalny sposób wykonuje zapisane?
całą grupę operacji. Kopiuje wartości z kolumny, którą chcesz
przenieść, zapisuje je w tymczasowej tabeli pomocniczej, O.: Owszem, można to zrobić i to bardzo prosto:
usuwa dotychczasową kolumnę, modyfikuje tabelę, dodając we
$/7(57$%/(WDEHOD'52335,0$5<.(<
wskazanym jej miejscu nową kolumnę o identycznej nazwie co
kolumna usunięta, kopiuje dane z tabeli pomocniczej do nowej
kolumny i w końcu usuwa tabelę pomocniczą. P.: A co z AUTO_INCREMENT?
Zazwyczaj, jeśli w kolumnach już są zapisane jakieś dane,
a Ty nie korzystasz z żadnego bardziej zaawansowanego
O.: Można zażądać, by wartości w kolumnie były automatycznie
inkrementowane. Poniżej pokazaliśmy, jak to zrobić:
oprogramowania, lepiej pozostawić kolumny w oryginalnej
kolejności. W końcu kolejność kolumn zawsze można określić $/7(57$%/(WDEHOD&+$1*(NROXPQDBLGNROXPQDBLG
w poleceniu 6(/(&7. ,1712718//$872B,1&5(0(17
P.: Czyli kolejność kolumn można w prosty sposób Można też usunąć automatyczną inkrementację wartości:
CELNE
SPOSTRZEŻENIA
Używaj klauzuli &+$1*(, kiedy chcesz zmienić zarówno Kolejność kolumn można zmieniać, używając
nazwę kolumny, jak i jej typ. następujących słów kluczowych i wyrażeń: ),567, /$67,
%()25(QD]ZDBNROXP\, $)7(5QD]ZDBNROXPQ\,
Używaj klauzuli 02',)<, kiedy chcesz zmienić wyłącznie 6(&21', 7+,5', )2857+ i tak dalej.
typ kolumny.
W niektórych systemach zarządzania bazami danych
Klauzula '523&2/801 usuwa kolumnę z tabeli. kolejność kolumn można zmieniać wyłącznie podczas
Klauzula 5(1$0( pozwala na zmianę nazwy tabeli. ich dodawania do tabeli.
254 Rozdział 5.
Polecenie ALTER
&5($7(7$%/(PRMHBNRQWDNW\
LGBNRQWDNWX,1712718//$872B,1&5(0(17
QD]ZLVNRYDUFKDUGHIDXOW18//
LPLHYDUFKDUGHIDXOW18//
HPDLOYDUFKDUGHIDXOW18//
Te dwa wiersz
e
kodu dodaliśmy
by utworzyć SOHFFKDUGHIDXOW18//
,
i wskazać
kolumnę kluczGDWDBXURG]HQLDGHIDXOW18//
a
głównego.
]DZRGYDUFKDUGHIDXOW18//
ORNDOL]DFMDYDUFKDUGHIDXOW18// Te cztery
VWDQYDUFKDUGHIDXOW18// kolumny raczej
nie są atomowe
i mogą wymagać
]DLQWHUHVRZDQLDYDUFKDUGHIDXOW18// wprowadzenia
pewnych zmian przy
V]XNDYDUFKDUGHIDXOW18// użyciu polecenia
ALTER TABLE.
35,0$5<.(<LGBNRQWDNWX
Niewielki fragment
danych zapisanych
w kolumnie lokalizacja
tabeli moje_kontakty.
*OLZLFH6/ Dwuliterowy
kod określający
.UDNRZ03 województwo.
:URFODZ'6
Nazwa
(OEODJ:0
miasta.
.DWRZLFH6/
Przecinek.
WYTĘŻ
UMYSŁ
Dlaczego chcemy oddzielić nazwę miejscowości od kodu województwa?
Jak myślisz, co teraz zrobimy?
256 Rozdział 5.
Polecenie ALTER
Poszukaj wzorca
Każda wartość umieszczona w tabeli PRMHBNRQWDNW\ w kolumnie
ORNDOL]DFMD jest zapisana w taki sam sposób: na początku znajduje
się nazwa miejscowości, po niej przecinek, za którym umieszczone
jest dwuliterowe oznaczenie województwa. Dzięki temu, że wartości
są konsekwentnie zapisywane w ten sam sposób i pasują do pewnego
wzorca, będziemy mogli je rozdzielić na dwie atomowe informacje.
końcu
umieszczone na
Te dwie litery ają kod określający
zawsze zawier Gdyby w naszej tabeli
QD]ZDPLHMVFRZRĂFL;; województwo. osobna kolumna
ę
znajdowała si o województwie, to
i
z informacjam w niej właśnie te dane.
zn al az ły by si ę
Ten przecinek, który zawsze
umieszczany przed kodem jest
woj
może się nam bardzo przydać ewództwa,
…
Wszystko, co znajduje się przed przecinkiem, możemy Z kolei ostatnie dwa znaki dotychczasowych wartości
przenieść do nowej kolumny, która będzie zawierać kolumny lokalizacja możemy przenieść do nowej kolumny
QD]Z\PLHMVFRZRĂFL. o nazwie ZRMHZRG]WZR.
QD]ZDPLHMVFRZRĂFL ;;
Zaostrz ołówek
Napisz polecenie $/7(57$%/(, które doda do tabeli PRMHBNRQWDNW\ kolumny PLHMVFRZRVF
oraz ZRMHZRG]WZR.
Funkcje łańcuchowe
Aby pobrać fragment łańcucha przed przecinkiem
pozwalają
Do pobrania fragmentu zawartości kolumny tekstowej można
użyć funkcji 68%675,1*B,1'(;. Zwróci ona fragment łańcucha
na pobieranie
umieszczony przed podanym znakiem lub łańcuchem. Oznacza fragmentów
to, że możemy zapisać przecinek między apostrofami, a funkcja
68%675,1*B,1'(; zwróci całą zawartość kolumny umieszczoną kolumn tekstowych.
przed przecinkiem.
6(/(&768%675,1*B,1'(;ORNDOL]DFMD
)520PRMHBNRQWDNW\
258 Rozdział 5.
Polecenie ALTER
Wypróbuj to w domu
SQL udostępnia grupę funkcji pozwalających na manipulowanie łańcuchami znaków zapisanymi w bazie
Ćwiczenie danych. Łańcuchy znaków są zapisywane w kolumnach tekstowych, przy czym zazwyczaj są to kolumny
typów 9$5&+$5 lub &+$5.
Poniżej przedstawiliśmy kilka najbardziej przydatnych i najczęściej używanych funkcji łańcuchowych. Wypróbuj
każdą z nich — wystarczy, że umieścisz wywołanie funkcji, którą chcesz sprawdzić, w poleceniu 6(/(&7.
6(/(&768%675,1*
%LHOVNR%LDOD6/
Funkcje 833(5ïDñFXFKB]QDNöZ oraz /2:(5ïDñFXFKB]QDNöZ zmieniają wszystkie litery przekazanego
łańcucha na wielkie lub małe.
6(/(&7833(5
X6D
6(/(&7/2:(5
VSD*H77,
6(/(&75(9(56(
VSD*H77,
Funkcje /75,0ïDñFXFKB]QDNöZ oraz 575,0ïDñFXFKB]QDNöZ zwracają przekazany łańcuch, z którego
początku (w przypadku funkcji /75,0) lub końca (w przypadku funkcji 575,0) usunięto niepotrzebne
odstępy.
6(/(&7/75,0
SLHVNLORV
6(/(&7575,0
SLHVNLORV
6(/(&7/(1*7+
:URFODZ'6
Ñ Ñ
68%675,1*B,1'(; 6(/(&7
$/7(5 7$%/(
'(/(7( 4. Zapiszemy dane pobrane w poprzednim kroku
do jednej z nowych kolumn.
,16(57
83'$7(
5R]ZLÈ]DQLH]QDMG]LHV]QDVWURQLH
260 Rozdział 5.
Polecenie ALTER
Ñ Ñ
68%675,1*B,1'(; 6(/(&7
5,*+7
3. Pobierzemy fragment danych z kolumny
tekstowej.
$/7(5 7$%/(
'(/(7( 4. Zapiszemy dane pobrane w poprzednim kroku
do jednej z nowych kolumn.
,16(57
83'$7(
262 Rozdział 5.
Polecenie ALTER
83'$7(PRMHBNRQWDNW\
6(7ZRMHZRG]WZR 5,*+7ORNDOL]DFMD
owa, która
To nowa kolumna, ja łańcuch
w której umieścim A to funkcwie ostatnie litery
kody województw.
y pobiera d lokalizacja.
z kolumny
PRMHBNRQWDNW\
id_kontaktu lokalizacja miejscowosc wojewodztwo
1 Gliwice, SL Oto uproszczona
wersja tabeli
2 Kraków, MP a.
kontaktów Grześk
3 Wrocław, DS
A to jest nasze
83'$7(PRMHBNRQWDNW\ polecenie SQL.
Drugi
przebieg. UPDATE moje_kontakty
ugi
SET wojewodztwo = RIGHT('Krakow, MP',2); Teraz kolej na dr
wiersz.
Trzeci i ostatni
przebieg, gdyż UPDATE moje_kontakty ci wiersz.
w tabeli są tylko
SET wojewodztwo = RIGHT('Wroclaw, DS',2); I w końcu trze
trzy wiersze.
264 Rozdział 5.
Polecenie ALTER
Zaostrz ołówek
Rozwiązanie Naszkicuj strukturę tabeli po wykonaniu polecenia SQL ze strony 244.
ze strony 244
OLVWDBSURMHNWRZ
Dotychczasowej kolum wę
nie id_proj infooproj nazwfirmwyk
"numer" zmieniliśmy naz y,
na id_proj i zażądaliśm
by jej wartości były
entowane. 1 malowanie elewacji domu SUP-Rem
automatycznie inkrem
Co wię cej , ws kaz aliś my
nę
tę kolumnę jako kolum 2 instalacja nowej kuchni RemBudSzpachelka
klucza głównego.
Przybornik SQL
Możesz sobie pogratulować. Właśnie
52='=,$
TABLE
ALTER mieniać
o zwala z
ce n ie p trukturę
To pole o r az jej s
a b e li nia jej
nazwę t zności usuwa
ie c
bez kon i. ALTER z
w a r t o śc klauzulą C
za HANGE
Pozwala z
mienić za
jak i typ równo naz
dan wę,
kolumny ta ych istniejącej
lą ADD beli.
E R z klauzu
A LT mny do
d o d a wać kolu łożenie. ALTER z
klauzulą M
z w a la p o ODIFY
Po
o k r e ś la ć ich P o z w
e li i a la z m ie
tab danych is nić jedynie
ROP tniejącej typ
u z u lą D k o lu
z k la beli . m n y.
ALTER o lu m nę z ta
k
usunąć
Pozwala
FUNKCJE ŁAŃ
CUCHOWE
Pozwalają mod
yfikować kopi
zawartości ko e
lumn tekstow
zwracanych ja ych
ko wyniki zapy
Oryginalne w tania.
artości pozost
niezmienione. ają
266 Rozdział 5.
=DDZDQVRZDQH]DVWRVRZDQLHSROHFHQLD6(/(&7
Nowy sposób
spojrzenia na dane
I od tej chwili mogłem
widzieć samoloty wroga
dzięki użyciu polecenia
CASE! I ratata...
id_filmu tytul ocena dramat komedia akcja krwawy sf dla_dzieci rysunkowy zakupiono
1 Potwory i Sp. D F P F F F P P 6.3.2002
2 Ojciec chrzestny R F F P P F F F 5.2.2001
3 Przeminęło z wiatrem D P F F F F F F 20.11.1999
4 American Pie R F P F F F F F 19.4.2003
5 Koszmar z ulicy Wiązów R F F P P F F F 19.4.2003
6 Casablanca SD F F F F F F F 5.2.2001
268 Rozdział 6.
Zaawansowana SELEKCJA
WYSIL
SZARE KOMÓRKI
W jaki sposób przeorganizowałbyś aktualne kolumny tabeli, by utworzyć nowe kategorie?
Czy w tabeli są jakieś filmy, które należałoby przypisać do więcej niż jednej kategorii?
-HĤOLNROXPQD edia
kom ]DZLHUDZDUWRĤþ
3
WRZNROXPQLHNDWHJRULD]DSLV]HP\
NRPHGLD
-HĤOLNROXPQD sf ]DZLHUDZDUWRĤþ
3
WRZNROXPQLHNDWHJRULD]DSLV]HP\
VI
ocena
-HĤOLNROXPQD rysu
nkowy ]DZLHUDZDUWRĤþ
3
LNROXPQD WRZNROXPQLHNDWHJRULD
]DZLHUDZDUWRĤþ
'
]DSLV]HP\
URG]LQQ\
ocen a
-HĤOLNROXPQD rysu
nkowy ]DZLHUDZDUWRĤþ
3
LNROXPQD WRZNROXPQLHNDWHJRULD
1,(]DZLHUDZDUWRĤFL
'
]DSLV]HP\
LQQ\
270 Rozdział 6.
Zaawansowana SELEKCJA
83'$7(WDEHODBILOPRZ6(7NDWHJRULD
GUDPDW
:+(5(GUDPDW
3
83'$7(WDEHODBILOPRZ6(7NDWHJRULD
NRPHGLD
:+(5(NRPHGLD
3
83'$7(WDEHODBILOPRZ6(7NDWHJRULD
DNFML
:+(5(DNFMD
3
83'$7(WDEHODBILOPRZ6(7NDWHJRULD
KRUURU
:+(5(NUZDZ\
3
83'$7(WDEHODBILOPRZ6(7NDWHJRULD
VI
:+(5(VI
3
83'$7(WDEHODBILOPRZ6(7NDWHJRULD
URG]LQQ\
:+(5(GODBG]LHFL
3
83'$7(WDEHODBILOPRZ6(7NDWHJRULD
URG]LQQ\
:+(5(U\VXQNRZ\
3
$1'RFHQD
'
83'$7(WDEHODBILOPRZ6(7NDWHJRULD
LQQ\
:+(5(U\VXQNRZ\
3
$1'RFHQD!
'
Zaostrz ołówek
Przypisz poszczególnym filmom kategorię, do jakiej powinny należeć.
WDEHODBILOPRZ
tytul ocena dramat komedia akcja krwawy sf dla_dzieci rysunkowy kategoria
Wielka przygoda D F F F F F P F
Grześ: Historia nieznana SD F F P F F F F
Szaleni klowni R F F F P F F F
Paraskavedekatriaphobia R P P P F P F F
Szczurek o imieniu Darek D F F F F F P F
Koniec linii R P F F P P F P
Błyskotki SD P F F F F F F
Zwrot R F P F F F F F
Przynęta na rekiny D F F F F F P F
Wkurzony pirat SD F P F F F F P
Planeta do zamieszkania SD F P F F F F F
Zaostrz ołówek
Rozwiązanie Przypisz poszczególnym filmom kategorię, do jakiej powinny należeć.
WDEHODBILOPRZ
tytul ocena dramat komedia akcja krwawy sf dla_dzieci rysunkowy kategoria
Wielka przygoda D F F F F F P F rodzinny
Grześ: Historia nieznana SD F F P F F F F akcji
Szaleni klowni R F F F P F F F horror
Paraskavedekatriaphobia R P P P F P F F ?
Szczurek o imieniu Darek D F F F F F P F rodzinny
Koniec linii R P F F P P F P ?
Błyskotki SD P F F F F F F dramat
Zwrot R F P F F F F F komedia
Przynęta na rekiny D F F F F F P F rodzinny
Wkurzony pirat SD F P F F F F P inny
Planeta do zamieszkania SD F P F F F F F komedia
kolumny została
Znak zapytania oznacza, że wartość enie UPDATE.
zmie niona przez więc ej niż jedno polec
w zależności od
Ta wartość może się zatem zmieniać polecenia UPDATE.
kolejności, w jakie j zosta ną wyko nane
Owszem, ma znaczenie.
Czy kolejność przetwarzania poszczególnych kolumn logicznych ma znaczenie? .....................................
Kolejność
Kolejność ma znaczenie ma znaczenie.
Na przykład gdybyśmy analizowali kolumny w kolejności,
w jakiej są zapisane, to film „Paraskavedekatriaphobia”
zostałby zakwalifikowany jako film fantastycznonaukowy,
Dwa polecenia
choć raczej można by sądzić, że jest to komedia. Nie
wiem jednak na pewno, czy powinien on być uważany za
UPDATE mogą
komedię, film akcji, dramat, film rysunkowy czy też film bowiem zmieniać
fantastycznonaukowy. Ponieważ nie mamy pewności, co
z nim zrobić, najlepszym rozwiązaniem będzie umieszczenie wartość tej
go w kategorii „inny”.
samej kolumny.
272 Rozdział 6.
Zaawansowana SELEKCJA
Jeśli zostanie
:+(1NROXPQD ZDUWRVF określenie sposobu
jego działania.
spełniony inny
warunek… 7+(1QRZDBZDUWRVF
…to w kolumnie
nowa_kolumna
zostanie zapisana
(/6(QRZDBZDUWRVF
inna wartość.
(1' ów nie
wyższych
Jeśli żaden z po stanie
zo
warunk
W ten sposób kończy się kolumnie
spełniony, to w stanie
wyrażenie CASE, a wraz nowa_kolumna zo ść.
z nim całe polecenie UPD
ATE zapisana ta warto
(ponieważ za słowem
kluczowym END został
umieszczony średnik).
83'$7(WDEHODBILOPRZ poleceniu
Ten wiersz odpowiada T kategoria
SE
UPDATE tabel_filmow t = ‘T’. Ale
6(7NDWHJRULD = ‘dramat’ WHERE drama z napisać!
sis
zobacz, o ile mniej mu
&$6(
:+(1GUDPDW
3
7+(1
GUDPDW
:+(1NRPHGLD
3
7+(1
NRPHGLD
:+(1DNFMD
3
7+(1
DNFML
:+(1NUZDZ\
3
7+(1
KRUURU
:+(1VI
3
7+(1
VI
:+(1GODBG]LHFL
3
7+(1
URG]LQQ\
:+(1U\VXQNRZ\
3
7+(1
URG]LQQ\
(/6(
LQQ\
Paraskavedekatriaphobia R P P P F P F F dramat
Błyskotki SD P F F F F F F dramat
Zwrot R F P F F F F F komedia
274 Rozdział 6.
Zaawansowana SELEKCJA
Podczas przetwarzania w wyrażeniu &$6( wartości 'P' i 'F' dla każdego z filmów, system
zarządzania bazą danych poszukuje pierwszej wartości 'P', na podstawie której mógłby
określić wartość kolumny kategorii.
Oto co się będzie działo podczas przetwarzania rekordu filmu „Wielka przygoda”:
83'$7(WDEHODBILOPRZ
6(7NDWHJRULD Niespełnione: nie określ
ono kategorii
&$6(
Niespełnione: nie określono kategorii
:+(1GUDPDW
3
7+(1
GUDPDW
:+(1NRPHGLD
3
7+(1
NRPHGLD
Niespełnione: nie określono kategorii
:+(1DNFMD
3
7+(1
DNFML
Niespełnione: nie określono kategorii
:+(1NUZDZ\
3
7+(1
KRUURU
Niespełnione: nie określono kategorii
:+(1VI
3
7+(1
VI
Niespełnione: nie określono kategorii
:+(1GODBG]LHFL
3
7+(1
URG]LQQ\
:+(1U\VXQNRZ\
3
7+(1
URG]LQQ\
Spełniony: W kolumnie kategorii
jest zapisywana wartość
(/6(
LQQ\
'rodzinny', po czym przechodzimy
do słowa kluczowego END
(1' i kończymy przetwarzanie tego
wiersza tabeli.
A teraz sprawdźmy, co się stanie w wierszu, w którym może być spełnionych więcej
warunków. Także w tym przypadku poszukujemy pierwszej wartości 'P', na podstawie
której możemy określić zawartość kolumny kategorii.
Oto co się stanie w momencie przetwarzania rekordu filmu „Paraskavedekatriaphobia”:
83'$7(WDEHODBILOPRZ
6(7NDWHJRULD
Warunek spełniony: W kolu
&$6( kategorii jest zapisywan mnie
'dramat', po czym przech a wartość
:+(1GUDPDW
3
7+(1
GUDPDW
słowa kluczowego END i
odzimy do
koń
przetwarzanie tego wiersz czymy
:+(1FRPHG\
3
7+(1
NRPHGLD
Wszystkie pozostałe war a tabeli.
tości 'P'
:+(1DNFMD
3
7+(1
DNFML
:+(1VI
3
7+(1
VI
:+(1GODBG]LHFL
3
7+(1
URG]LQQ\
:+(1U\VXQNRZ\
3
7+(1
URG]LQQ\
(/6(
LQQ\
(1'
jesteś tutaj 275
Problemy z wyrażeniem CASE
WIADOMOŚĆ
Data: G]LĤ Godzina:
Do: V]HID
KIEDY SZEFA NIE BYŁO
ND
QDSUDZGĐZĤFLHNâDNOLHQW
Prosił o telefon
Zadzwonił
Zadzwoni później
Zadzwonił, żeby się spotkać
Odpowiedział na telefon szefa
Chciał się z szefem zobaczyć
-D ND Ĥ SDQL]DG]ZRQLâD ]HVNDUJċ
TR EŚ Ć W IA DO M OŚ CI:
REHMU]Dâ
İHMHMPDâ\V\QHN$ODQHN
ZN Đ GO D GR UR Vâ \F K S Hâ Qċ ZXOJDU\]PyZ
NUHVNy
WH UD ] FL ċJ OH J RQ LV ZR Mċ VLRVWU]\F]NĐ
D
A
ZRâDMċFQDQLċ#
A
PRZYJĄŁ:
MD PILNE
276 Rozdział 6.
Zaawansowana SELEKCJA
Zaostrz ołówek
WYSIL
SZARE KOMÓRKI
W jaki sposób moglibyśmy wykorzystać literę
5
w ocenie
filmu, by w przyszłości uchronić się przed takimi przykrymi
niespodziankami?
Zaostrz ołówek
Rozwiązanie Zmodyfikuj wyrażenie &$6( w taki sposób, by filmy rysunkowe trafiały
do kategorii
LQQ\
, a nie
URG]LQQ\
.
UPDATE tabela_filmow
SET kategoria =
CASE
WHEN dramat = 'P' THEN 'dramat'
WHEN komedia = 'P' THEN 'komedia'
WHEN akcja = 'P' THEN 'akcji'
WHEN krwawy = 'P' THEN 'horror'
WHEN sf = 'P' THEN 's-f'
WHEN dla_dzieci = 'P' THEN 'rodzinny'
WHEN rysunkowy = 'P' AND ocena = 'R' THEN 'rodzinny'
ELSE 'inny'
END;
W wyrażeniu CASE można umi
eszczać złożone warunki:
wystarczy dodać operator AND
,
do odpowiedniej kategorii I w by sprawdzać, czy film należy
jego ocenie umieszczono literkę
‘R’. Jeśli oba te warunki zostaną
przypisać do kategorii „rodzinn spełnione, to film możemy
y”.
Nie istnieją
głupie pytania
P.: Czy koniecznie muszę używać klauzuli ELSE? P.: A co zrobić w sytuacji, gdybym chciał użyć
wyrażenia CASE tylko w wybranych, a nie we
O.: Nie, klauzula (/6( jest opcjonalna. Jeśli jej nie potrzebujesz, wszystkich wierszach? Na przykład gdybym chciał
użyć go tylko gdy kategoria = 'inny'. Czy mógłbym
możesz po prostu pominąć ten wiersz kodu. Niemniej jednak
fajnie jest móc określić jakąś wartość kolumny, kiedy żadne inne w tym celu użyć klauzuli WHERE?
nie pasują. W końcu lepiej jest zapisać w kolumnie jakąś wartość,
niż pozwolić, by znalazła się w niej wartość 18//. O.: Owszem, mógłbyś umieścić w poleceniu klauzulę :+(5(,
zapisując ją za słowem kluczowym (1'.
P.: A co się stanie, jeśli nie zastosuję klauzuli
ELSE, a żaden z warunków określonych P.: Czy wyrażenia CASE można używać także
w wyrażeniu CASE nie zostanie spełniony? w innych poleceniach SQL, czy tylko w poleceniu
UPDATE?
O.: W takim przypadku wartość kolumny nie ulegnie zmianie.
O.: Owszem, można. Wyrażenia &$6( można stosować także
w poleceniach 6(/(&7, ,16(57 oraz '(/(7(.
278 Rozdział 6.
Zaawansowana SELEKCJA
.RQVWUXNFMDZ\UDĝHñ&$6( ów wypoży
czalni
Do: Pracownik a
Bazodanow
Twój szef, który zawsze lubi się do wszystkiego wtrącać, Wideoteka
i!
zdecydował, że trzeba jeszcze nieco zmodyfikować kategorie. Od: Szefa kategoriam
e d zi a ły mogą być
Przeczytaj przesłanego przez niego e-maila i napisz pojedyncze Temat: No
w
polecenie SQL, które zaspokoi jego wymagania. iacy
i wideoman
Moi kochan nowych
si ę st worzyć kilka
Zdecydow ał em zeniem „R”
fil my z oznac y
działów. S ąd zę, że jscu niż film
ie sz cz ać w innym mie m y p ię ć
um ó rz
należałoby i „SD”. A zat
em stw
ni am i „D ”
z oznacze
gorii:
nowych kate
horror-r
akcji-r
dramat-r
komedia-r
s-f-r
”
m z oceną „D
śl i zn aj d zi ecie jakiś fil ie g o
Poza tym, je ieśc
y”, to przen
le żą cy d o kategorii „inn
na
Okazuje się, że nowe kategorie utrudniają klientom odnajdywanie „rodzinny”.
do kategorii
filmów. Napisz polecenie, które usunie z tabeli nowe „r-kategorie”. wdzięczny.
Dzięki, będę
Wasz szef.
I w końcu usuń wszystkie kolumny z wartościami P i F — nie będziemy bowiem ich już więcej potrzebowali.
.RQVWUXNFMDZ\UDĝHñ&$6( ów wypoży
czalni
52=:,È=$1,( Do: Pracownik a
Bazodanow
Wideoteka
i!
Twój szef, który zawsze lubi się do wszystkiego wtrącać, Od: Szefa kategoriam
w e d zi a ły mogą być
zdecydował, że trzeba jeszcze nieco zmodyfikować kategorie. Temat: No
Przeczytaj przesłanego przez niego e-maila i napisz pojedyncze iacy
i wideoman
polecenie SQL, które zaspokoi jego wymagania. Moi kochan nowych
si ę st worzyć kilka
Zdecydow ał em zeniem „R”
UPDATE tabela_filmow fil my z oznac y
działów. S ąd zę, że jscu niż film
SET kategoria = ie sz cz ać w innym mie m y p ię ć
um ó rz
należałoby i „SD”. A zat
em stw
ni am i „D ”
CASE z oznacze
gorii:
WHEN dramat = 'P' AND ocena = 'R' THEN 'dramat-r' nowych kate
horror-r
WHEN comedy = 'P' AND ocena = 'R' THEN 'komedia-r'
akcji-r
WHEN akcji = 'P' AND ocena = 'R' THEN 'akcji-r'
dramat-r
WHEN krwawy = 'P' AND ocena = 'R' THEN 'horror-r'
komedia-r
WHEN sf = 'P' AND ocena = 'R' THEN 's-f-r'
s-f-r
”
WHEN kategoria = 'inny' AND ocena = 'D' THEN 'rodzinny' m z oceną „D
śl i zn aj d zi ecie jakiś fil ie g o
END; Poza tym, je ieśc
y”, to przen
le żą cy d o kategorii „inn
na
Okazuje się, że nowe kategorie utrudniają klientom odnajdywanie „rodzinny”.
do kategorii
filmów. Napisz polecenie, które usunie z tabeli nowe „r-kategorie”. wdzięczny.
Dzięki, będę
UPDATE tabela_filmow Wasz szef.
SET kategoria =
CASE
WHEN kategoria = 'dramat-r' THEN kategoria = 'dramat'
WHEN kategoria = 'komedia-r' THEN kategoria = 'komedia'
WHEN kategoria = 'akcji-r' THEN kategoria = 'akcji'
WHEN kategoria = 'horror-r' THEN kategoria = 'horror'
WHEN kategoria = 's-f-r' THEN kategoria = 's-f'
END;
I w końcu usuń wszystkie kolumny z wartościami P i F — nie będziemy bowiem ich już więcej potrzebowali.
280 Rozdział 6.
Zaawansowana SELEKCJA
Wiemy, jak pobrać z tabeli wszystkie filmy należące do każdej z kategorii, jednak teraz
musimy jeszcze posortować je alfabetycznie.
WDEHODBILOPRZ
WYTĘŻ
UMYSŁ
Jak uporządkować te dane alfabetycznie za pomocą
polecenia SQL.
Jednak w takim przypadku, aby stworzyć naszą główną listę filmów, musielibyśmy
napisać około 245 poleceń 6(/(&7. Poniżej przedstawiliśmy jedynie kilka z nich:
6(/(&7W\WXONDWHJRULD)520WDEHODBILOPRZ:+(5(W\WXO/,.(
$
$1'NDWHJRULD
URG]LQQ\
6(/(&7W\WXONDWHJRULD)520WDEHODBILOPRZ:+(5(W\WXO/,.(
%
$1'NDWHJRULD
URG]LQQ\
6(/(&7W\WXONDWHJRULD)520WDEHODBILOPRZ:+(5(W\WXO/,.(
&
$1'NDWHJRULD
URG]LQQ\
6(/(&7W\WXONDWHJRULD)520WDEHODBILOPRZ:+(5(W\WXO/,.(
'
$1'NDWHJRULD
URG]LQQ\
6(/(&7W\WXONDWHJRULD)520WDEHODBILOPRZ:+(5(W\WXO/,.(
(
$1'NDWHJRULD
URG]LQQ\
6(/(&7W\WXONDWHJRULD)520WDEHODBILOPRZ:+(5(W\WXO/,.(
)
$1'NDWHJRULD
URG]LQQ\
6(/(&7W\WXONDWHJRULD)520WDEHODBILOPRZ:+(5(W\WXO/,.(
*
$1'NDWHJRULD
URG]LQQ\
gli
trzebny, byśmy mo
Tytuł jest nam pofilmów i znaleźć To jest litera alfabetu, na jaką A to kategoria,
przejrzeć st os iki kategorii ma się zaczynać tytuł filmu. która nas interesuje.
lei na podstawie
odpowiedni; z ko e odpowiednią nalepkę
nalepimy na filmi właściwej półce.
na
i umieścimy go
Potrzeba nam około 245 zapytań,
alfabecie jest 35 liter. Niemniej ponieważ mamy 7 kategorii filmów, a w polskim
jednak trudno przypuszczać, by
zaczynały się od niektórych znak nazwy filmów
ów diakrytycznych, takich jak „ń”;
strony powyższe wyliczenie nie
uwzględnia faktu, że nazwy filmó choć z drugiej
zaczynać od cyfr, np.: „101 dalm
atyńczyków” lub „2001: Odyseja w mogą się
kosmiczna”.
WYSIL
SZARE KOMÓRKI
Jak sądzisz, gdzie na tej liście pojawią się tytułu filmów, które
zaczynają się od cyfry lub od innego znaku, który nie jest literą?
282 Rozdział 6.
Zaawansowana SELEKCJA
Zaostrz ołówek
Wciąż musimy stosować „pseudosortowanie” — ręcznie pobierać z tabeli filmy, które nie tylko
należą do określonej kategorii, lecz także których tytuły zaczynają się na podaną literę alfabetu.
Przyjrzyj się dokładnie wynikom zwróconym przez jedno z naszych (co najmniej) 245 zapytań.
A teraz spróbuj sam posortować tę listę alfabetycznie.
6(/(&7W\WXONDWHJRULD)520WDEHODBILOPRZ:+(5(W\WXO/,.(
$
$1'NDWHJRULD
URG]LQQ\
Fragment wyników zw
przez powyższe zap róconych
ytanie.
tytul kategoria
Awionetki i helikoptery rodzinny
Aktywność umarlaków rodzinny
A może byś mnie posłuchał? rodzinny
Amerykański ninja rodzinny
Anemiczny sprinter rodzinny
Arka Noego rodzinny
Anubis: bóg zmarłych rodzinny
Anioły rodzinny
Arogancki małolat rodzinny
Atak truposzy rodzinny
Arcyancymon rodzinny
Amerykanin w Paryżu rodzinny
Atak troli rodzinny
Ancymony atakują rodzinny
Amerykański ninja 2 rodzinny
Asterix na Olimpiadzie rodzinny
Anielskie śpiewy rodzinny
Aleks i złowroga wanna rodzinny
Asterix i Kleopatra rodzinny
A niech to… rodzinny
Zaostrz ołówek
Rozwiązanie Wciąż musimy stosować „pseudosortowanie” — ręcznie pobierać z tabeli filmy, które nie tylko
należą do określonej kategorii, lecz także których tytuły zaczynają się na podaną literę alfabetu.
Przyjrzyj się dokładnie wynikom zwróconym przez jedno z naszych (co najmniej) 245 zapytań.
A teraz spróbuj sam posortować tę listę alfabetycznie.
6(/(&7W\WXONDWHJRULD)520WDEHODBILOPRZ:+(5(W\WXO/,.(
$
$1'NDWHJRULD
URG]LQQ\
tytul kategoria
A może byś mnie posłuchał? rodzinny
A niech to… rodzinny
Ile czasu zajęło Ci
Aktywność umarlaków rodzinny posortowanie tych
Aleks i złowroga wanna rodzinny wszystkich tytułów
w kolejności alfabetycznej?
Amerykanin w Paryżu rodzinny
Amerykański ninja rodzinny Czy możesz sobie
Amerykański ninja 2 rodzinny wyobrazić, ile potrwałoby
takie ręczne sortowanie
Ancymony atakują rodzinny ponad 3000 filmów?
Anemiczny sprinter rodzinny
Anielskie śpiewy rodzinny
Anioły rodzinny
Anubis: bóg zmarłych rodzinny
Arcyancymon rodzinny
Arka Noego rodzinny
Arogancki małolat rodzinny
Asterix i Kleopatra rodzinny
Asterix na Olimpiadzie rodzinny Tytuły rozpoczynające się od „At…
się znaleźć w pobliżu końca listy ” muszą
,
Atak troli rodzinny drugą literą po początkowym „A” gdyż
„t”. Jednak zanim określimy praw jest
Atak truposzy rodzinny idłową
kolejność obu tych filmów na półc
będziemy musieli przeanalizować e,
Awionetki i helikoptery rodzinny aż sześć znaków.
284 Rozdział 6.
Zaawansowana SELEKCJA
$1'
NDWHJRULD
URG]LQQ\
Zaostrz ołówek
Otóż taka możliwość istnieje. Co można usunąć
z powyższego polecenia, aby je poprawić i zwiększyć
jego możliwości?
6(/(&7W\WXONDWHJRULD
Amerykański ninja 2 rodzinny
Ancymony atakują rodzinny
)520WDEHODBILOPRZ Anemiczny sprinter rodzinny
NDWHJRULD
URG]LQQ\
Anioły rodzinny
Anubis: bóg zmarłych rodzinny
25'(5%<W\WXO Arcyancymon rodzinny
, że lista
Tym razem pobierzemy Najlepsze jest to erać Arka Noego rodzinny
będzie ta kż e za wi
listę wszystkich filmów tuły Arogancki małolat rodzinny
należących do kategorii filmy, których ty cyfr.
filmów rodzinnych. zaczynają się od zczone Asterix i Kleopatra rodzinny
ies
Zostaną one um ku listy.
na samym począt Asterix na Olimpiadzie rodzinny
Atak troli rodzinny
już
c wyników, choć my
To jeszcze nie konieby pokazać ich więcej. Atak truposzy rodzinny
,
nie mamy miejsca k zawierać wszystkie filmy
Lista będzie jedna i, łącznie z tymi, których Awionetki i helikoptery rodzinny
z wybranej kategori literę „Z”.
na
tytuł zaczyna się
286 Rozdział 6.
Zaawansowana SELEKCJA
$%&'DEFG#A
B
>@^`
?_Ca!"
y kolejności w SQL-u
Reguły kolejności w SQL-u R e guł
eś polecenie SELCT z klauzulą
Skoro już wykonałeś polecenie SELECT z klauzulą uż wykonał
Skoro j , rozmieść poniższe znaki
ORDER BY, uzupełnij poniższe puste miejsca, ORDER BY
jakiej zostały zwrócone
bazując na uzyskanych wynikach. lejności, w
w ko na uzyskanych wynikach.
bazując
Znaki, które nie są cyframi lub literami, są
wyświetlane ................................... liczbami.
y kolejności w SQL-u
Reguły kolejności w SQL-u R e gu ł
Skoro już wykonałeś polecenie SELECT z klauzulą eś polecenie SELCT z klauzulą
uż wykonał
ORDER BY, uzupełnij poniższe puste miejsca, Skoro j , rozmieść poniższe znaki
ORDER BY
bazując na uzyskanych wynikach. lejności, w
jakiej zostały zwrócone
w ko na uzyskanych wynikach.
Znaki, które nie są cyframi lub literami, są bazując
SU]HGRUD]]D liczbami.
wyświetlane ...................................
SU]HG
a
Cyfry są wyświetlane .........................
tekstem.
SU]HG
Wartości NULL pojawiają się ........................
# "
cyframi.
SU]HG
"#a
Wartości NULL pojawiają się ........................
literami.
SU]HG
Wielkie litery są wyświetlane .......................
małymi literami.
SU]HG
Tekst „A 1” zostanie wyświetlony ................
tekstem „A1”
288 Rozdział 6.
Zaawansowana SELEKCJA
Dzieńdoberek e są w naszej
nn iśm y się po zbyć filmów, któr
Uważam, że po wi ten weekend
jdł uż ej. Cz y m ożecie przyjść w
wypożyczalni na tę filmów
zygotować mi lis
pr ac y i dla ka żdej z kategorii pr
do pu?
dług daty ich zaku
posortowanych we
super,
Byłoby naprawdę
Wasz szef.
6(/(&7W\WXONDWHJRULD]DNXSLRQR
)520WDEHODBILOPRZ
25'(5%<NDWHJRULD]DNXSLRQR
y zostaną
Wartości w tej kolumnie zostaną Następnie rekord g tej kolumny
posortowane w pierwszej kolejności. po so rto wa ne we dłu
posortowaniu
W efekcie uzyskamy listę wszystkic
h — ale dopiero po .
filmów w wypożyczalni, posortowanyc kolum ny ka te go rii
w kolejności alfabetycznej według h
kategorii.
WYTĘŻ
UMYSŁ
Czy najstarszy film w każdej z kategorii zostanie wyświetlony jako
pierwszy, czy jako ostatni? I jak sądzisz, co się stanie, jeśli w tej samej
kategorii znajdą się dwa filmy zakupione tego samego dnia? Który
z nich zostanie wyświetlony jako pierwszy?
Tytuły
zaczynając od
19.4.2003 A
Data zakupu
zaczynając od
Z najstarszych Tytuły
20.11.1999 zaczynając od
290 Rozdział 6. A
Zaawansowana SELEKCJA
Nie istnieją
głupie pytania
P.: A czy słowo kluczowe DESC nie było używane P.: Czy żeby uniknąć nieporozumień, mogę
do pobrania opisu (ang. DESCRIPTION) tabeli? stosować pełne słowa kluczowe — DESCRIBE
Czy jesteście pewni, że można go użyć także oraz DESCENDING?
do zmiany kolejności sortowania?
O.: Możesz użyć polecenia '(6&5,%(, jednak '(6&(1',1*
O.: Owszem. Wszystko zależy od kontekstu. Jeśli użyjesz nie zadziała.
słowa kluczowego '(6& przed nazwą tabeli, na przykład: '(6&
WDEHODBILOPRZ, to zwrócony zostanie opis tabeli. W takim
przypadku '(6& jest skrótem od '(6&5,37,21.
Jeśli jednak użyjesz '(6& w klauzuli 25'(5%<, to będzie
Aby odwrócić kolejność
ono oznaczało '(6&(1',1* i spowoduje zmianę kolejności sortowania, umieść słowo
sortowania.
kluczowe DESC w klauzuli
ORDER BY za nazwą kolumny.
292 Rozdział 6.
Zaawansowana SELEKCJA
6(/(&7W\WXO]DNXSLRQR
)520WDEHODBILOPRZ
25'(5%<]DNXSLRQR'(6&W\WXO$6&
Jeśli chcesz, by da
ne
wyświetlone w kolejn zostały Możemy tu umieścić słowo kluczowe
od Z do A lub od 9 ości ASC, jednak nie jest to konieczne.
to musisz zastosow do 1, Wystarczy, byś zapamiętał, że
kluczowe DESC. ać słowo oznacza ono domyślny — rosnący
— porządek sortowania.
ra c o w n ik ó w w ypożyczalni
Do: P
danowa
Filmoteka Bazo
Od: Szefa
m in k i d la w s z ystkich!
Temat: Upo
Czołem
e la c y jn ie ! P o u k ładaliście
ygląda rew
Wypożyczalnia w c iw y ch miejscach…
y n a w ła ś
wszystkie film n ie s a m owitą klauzulę
m z a tę
a, i dziękuję wa L , d z ię k i k tó re j wszyscy
dzie SQ
ORDER BY w ko n ie to , o c o im chodzi.
ok ła d
mogą odnaleźć d
o d z ię k o w a n ia z a ciężką pracę
W ramach p ic h d o s ie b ie na imprezę
wszy s tk
zapraszam was
iz z ą . Z a jr z y jc ie około 18.
z p
p rz y n ie ś ć ty c h wszystkich
I nie zapomnijcie
o rt ó w, o k tó re p rosiłem!
rap
Wasz szef.
z o ro w o … m a m w domu
ie się wiec
P.S. Nie ubierajc y m p rz e o rg a n izować…
chcia łb
bibliotekę, którą
294 Rozdział 6.
Zaawansowana SELEKCJA
Zaostrz ołówek
Młoda gosposia, która zarobiła najwięcej na sprzedaży ciasteczek, wygra darmowe lekcje jazdy
konnej. Każda z dziewcząt chce wygrać tę nagrodę, zatem bardzo duże znaczenie ma, by Edwina
prawidłowo wyznaczyła zwyciężczynię, zanim sytuacja stanie się nieprzyjemna.
Wykorzystaj nowo poznaną klauzulę 25'(5%<, by napisać zapytanie, które pomoże Edwinie
określić zwyciężczynię.
Zaostrz ołówek
Rozwiązanie Młoda gosposia, która zarobiła najwięcej na sprzedaży ciasteczek, wygra darmowe lekcje jazdy
konnej. Każda z dziewcząt chce wygrać tę nagrodę, zatem bardzo duże znaczenie ma, by Edwina
prawidłowo wyznaczyła zwyciężczynię, zanim sytuacja stanie się nieprzyjemna.
Wykorzystaj nowo poznaną klauzulę 25'(5%<, by napisać zapytanie, które pomoże Edwinie
określić zwyciężczynię.
… a to jego rezultaty.
imie sprzedaz
Natalia 19.22
Natalia 0.00
Natalia 8.05
Natalia 26.82
96.03
Natalia 7.77
Natalia 15.21
Natalia 18.96
Beata 3.40
Beata 2.58 Kwoty sprzedaży dla każdej
Beata 4.50 z dziewcząt trzeba niestety
107.91 zsumować ręcznie — na
Beata 11.25 razie nie ma innej metody
Beata 8.78 wyłonienia zwyciężczyni.
Beata 43.21
Beata 34.19
Lidia 17.62
Lidia 9.16
Lidia 0.00 81.08
Lidia 32.02
Lidia 2.34
Lidia 3.71
Lidia 16.23
Patrycja 26.53
Patrycja 0.00
Patrycja 0.56 98.23
Patrycja 1.52
Patrycja 13.44
Patrycja 24.19
Patrycja 31.99
296 Rozdział 6.
Zaawansowana SELEKCJA
6(/(&7680VSU]HGD]
funkcji.
)520VSU]HGD]BFLDVWHF]HN
:+(5(LPLH
1DWDOLD
Ten warunek ogranicza zapytanie i nakazuje mu
zsumowanie wyłącznie sprzedaży Natalii. Gdyby
go nie było, zapytanie zsumowałoby wszystkie
wartości sprzedaży zapisane w tabeli.
Wypróbuj to w domu
Ćwiczenie Spróbuj to zrobić sam. Utwórz tabelę taką jak nasza tabela VSU]HGD]BFLDVWHF]HN i zapisz w niej
jakieś liczby z miejscami dziesiętnymi. A następnie wypróbuj zapytania przedstawione na kilku
następnych stronach.
)520VSU]HGD]BFLDVWHF]HN zGrukolu
pujemy wartości
mny imie.
*5283%<LPLH
25'(5%<680VSU]HGD]'(6& Chcemy wyświe tlić wartości
w kolejności malejącej, tak
Musimy posortować wyniki by na samym początku list
według sum, które wcześniej znalazła się zwyciężczyni. y
wyznaczyliśmy.
Zwyciężyła
Beata!
298 Rozdział 6.
Zaawansowana SELEKCJA
6(/(&7LPLH$9*VSU]HGD]
)520VSU]HGD]BFLDVWHF]HN Funk
cja AVG dodaje wszystkie
*5283%<LPLH wartości należące do grupy,
a następnie wylicza średnią,
dzieląc tę sumę przez liczbę
wartości w grupie.
imie sprzedaz
imie sprzedaz
Beata 3.40
Natalia 19.22 imie sprzedaz
imie sprzedaz Beata 2.58
Natalia 0.00 Lidia 17.62
Patrycja 26.53 Beata 4.50
Natalia 8.05 Lidia 9.16
Patrycja 0.00 Beata 11.25
Natalia 26.82 Lidia 0
Patrycja 0.56 Beata 8.78
Natalia 7.77 Lidia 32.02
Patrycja 1.52 Beata 43.21
Natalia 15.21 Lidia 2.34
Patrycja 13.44 Beata 34.19
Natalia 18.96 Lidia 3.71
Patrycja 24.19 Lidia 16.23
Patrycja 31.99
imie sprzedaz
Natalia 26.82
Niespodzianka! Beata 43.21
Beata odnotowała
Lidia 32.02
także najwyższą
wartość sprzedaży Patrycja 31.99
jednego dnia.
imie sprzedaz
Natalia 0.00
I choć wygląda na to,
że pozostałe dziewczyny Beata 2.58
zawaliły przynajmniej Lidia 0.00
jeden dzień, to Beata Patrycja 0.00
nawet najgorszego dnia
coś zarobiła.
300 Rozdział 6.
Zaawansowana SELEKCJA
Liczymy dni
Aby sprawdzić, czy któraś z dziewcząt sprzedawała ciasteczka przez większą
ilość dni niż pozostałe, Edwina policzy, ile pracowała każda z nich. Zastosuje
do tego celu funkcję &2817. Funkcja ta zwraca liczbę wierszy w kolumnie.
Funkcja COUNT zwraca liczbę
wierszy w kolumnie data. Jeśli
6(/(&7&2817GDWD
w którymś z wierszy w tej
kolumnie wystąpi wartość
)520VSU]HGD]BFLDVWHF]HN NULL, to wiersz nie zostanie
uwzględniony.
Zaostrz ołówek
VSU]HGD]BFLDVWHF]HN
id imie sprzedaz data Oto oryginalna tabela. Jak myślisz, jaki wynik zwróci
1 Lidia 32.02 6.3.2007 powyższe zapytanie?
2 Patrycja 26.53 6.3.2007
3 Beata 11.25 6.3.2007
4 Natalia 18.96 6.3.2007
5 Lidia 9.16 7.3.2007
6 Patrycja 1.52 7.3.2007
7 Beata 43.21 7.3.2007
8 Natalia 8.05 7.3.2007
9 Lidia 17.62 8.3.2007 Czy ta liczba reprezentuje faktyczną ilość dni, w które
10 Patrycja 24.19 8.3.2007 dziewczęta sprzedawały ciasteczka?
11 Beata 3.40 8.3.2007
12 Natalia 15.21 8.3.2007
13 Lidia 0.00 9.3.2007
14 Patrycja 31.99 9.3.2007
15 Beata 2.58 9.3.2007
16 Natalia 0.00 9.3.2007
17 Lidia 2.34 10.3.2007 Napisz zapytanie, które policzy, ile dni każda
18 Patrycja 13.44 10.3.2007 z dziewcząt sprzedawała ciasteczka.
19 Beata 8.78 10.3.2007
20 Natalia 26.82 10.3.2007
21 Lidia 3.71 11.3.2007
22 Patrycja 0.56 11.3.2007
23 Beata 34.19 11.3.2007
24 Natalia 7.77 11.3.2007
25 Lidia 16.23 12.3.2007
26 Patrycja 0.00 12.3.2007
27 Beata 4.50 12.3.2007
28 Natalia 19.22 12.3.2007
Zaostrz ołówek
Rozwiązanie
Oto oryginalna tabela. Jak myślisz, jaki wynik zwróci
powyższe zapytanie?
28 dat sprzedaży
302 Rozdział 6.
Zaawansowana SELEKCJA
6(/(&7',67,1&7GDWD
)520VSU]HGD]BFLDVWHF]HN A oto i klauzula ORDER BY,
dzięki której będziemy mogli łatw
o
25'(5%<GDWD określić pierwszą i ostatnią datę
sprzedaży ciasteczek.
Spójrz,
żadne daty
się nie
powtarzają!
6(/(&7&2817',67,1&7GDWD
)520VSU]HGD]BFLDVWHF]HN
W tym przypadku klauzula ORDER
BY
WYTĘŻ
nie jest nam potrzebna, gdyż zapy
zwróci jedną wartość. Zatem nie
tanie UMYSŁ
ma
czego sortować.
Wypróbuj to zapytanie, a następnie zastosuj je,
by określić, która z dziewcząt sprzedawała przez
najwięcej dni.
Odpowiedź: Beata
.LPMH
Grupa przebranych funkcji i słów kluczowych SQL uczestniczy
VWHP"
w grze towarzyskiej „Zgadnij, kim jestem”. Jej uczestnicy podają Ci
podpowiedzi, a Ty na ich podstawie starasz się odgadnąć, kim oni są.
Możesz przy tym założyć, że uczestnicy gry zawsze mówią o sobie
prawdę. W pustym polu obok każdej z podpowiedzi zapisz nazwę
uczestnika zabawy; dodatkowo w kolejnym pustym polu zapisz,
czy jest to słowo kluczowe, czy funkcja.
Uczestnicy zabawy:
&2817',67,1&7$9*0,1*5283%<6800$;
Funkcja
Nazwa czy słowo kluczowe
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
Musisz mnie użyć, jeśli chcesz wyznaczyć sumę.
304 Rozdział 6.
Zaawansowana SELEKCJA
Nie istnieją
głupie pytania
O.: Mogliśmy i byłby to bardzo dobry pomysł. Zdecydowaliśmy O.: Nie. Jednak mogłoby ono pomóc Edwinie we wskazaniu
jednak, że tego nie zrobimy, aby nie komplikować niepotrzebnie dziewcząt, które uzyskiwały najgorsze wyniki. W następnym roku
zapytań i ułatwić Ci poznanie nowych funkcji. Możesz teraz mogłaby zwrócić na nie więcej uwagi i lepiej zmotywować je
zajrzeć do tych zapytań i wyobrazić sobie umieszczenie w nich do pracy.
klauzuli 25'(5%<. Czy widzisz, jaki miałoby to wpływ na postać
danych wynikowych? P.: Skoro już rozmawiamy o funkcji MIN — co się
stanie, jeśli w kolumnie będzie zapisana wartość
P.: Słowo kluczowe DISTINCT wydaje się być NULL?
WYSIL
SZARE KOMÓRKI
Wyobraź sobie, że mielibyśmy nie cztery, a czterdzieści
młodych gosposi. W jaki sposób moglibyśmy zastosować
funkcję 680 do określenia, która z nich zajęła drugie miejsce?
6(/(&7LPLH680VSU]HGD]
)520VSU]HGD]BFLDVWHF]HN
*5283%<LPLH
25'(5%<680VSU]HGD]'(6&
W tym przypadku uli
zastosowanie klauz imie sprzedaz Tak naprawdę
ORDER BY ma interesują nas ersze.
kluczowe znaczenie
; Beata 107.91 tylko te dwa wi
w prz ec iw ny m raz ie Patrycja 98.23
uzyskane wyniki Natalia 96.03
byłyby dowolne. Zdobywczynią nagrody
Lidia 81.08
pocieszenia jest Patrycja!
Po ogłoszeniu werdyktu
Ponieważ mamy jedynie cztery wyniki, zatem określenie, kto zajął drugie miejsce, Natalia przestała się
do niej odzywać.
nie przysporzy nam zbyt wielu problemów. Niemniej jednak, gdybyśmy chcieli być
bardzo precyzyjni, moglibyśmy ograniczyć dane i wyświetlić tylko dwoje dziewcząt,
które zasłużyły na nagrody. Moglibyśmy to zrobić, korzystając z klauzuli /,0,7, która
pozwala dokładnie określić, ile rekordów z wyznaczonego zbioru danych ma być
wyświetlonych w wynikach.
6(/(&7LPLH680VSU]HGD]
)520VSU]HGD]BFLDVWHF]HN
*5283%<LPLH
25'(5%<680VSU]HGD]'(6&
/,0,7 To naprawdę długie
zapytanie,
a tylko
zważywszy, że zwrac .
Oznacza to, że chcemy dwa wiersze wyników
ograniczyć do dwóch iloś
rekordów wyświetlonych ć
w wynikach.
imie sprzedaz
Beata 107.91
Patrycja 98.23
W naszym przypadku mamy tylko cztery młode gosposie, zatem ograniczanie ilości
wyników do dwóch rekordów nie jest szczególnie pomocne; wyobraźmy sobie
jednak, co by było, gdybyśmy pracowali na znacznie większej tabeli? Wyobraź sobie,
że operujemy na tabeli zawierającej 1000 piosenek odtwarzanych aktualnie przez
rozgłośnie radiowe i chcemy uzyskać listę 100 najpopularniejszych z nich. Dzięki
klauzuli /,0,7 moglibyśmy wyświetlić dokładnie te piosenki, o które nam chodzi,
i pominąć 900 pozostałych.
306 Rozdział 6.
Zaawansowana SELEKCJA
Zaostrz ołówek
Napisz zapytanie, które zwróci nam młodą gosposię, która uzyskała drugi wynik sprzedaży,
ale tylko i wyłącznie ją. Zastosuj w tym celu klauzulę /,0,7 z dwoma parametrami.
Zaostrz ołówek
Rozwiązanie Napisz zapytanie, które zwróci nam młodą gosposię, która uzyskała drugi wynik sprzedaży,
ale tylko i wyłącznie ją. Zastosuj w tym celu klauzulę /,0,7 z dwoma parametrami.
308 Rozdział 6.
Zaawansowana SELEKCJA
.LPMH
Grupa przebranych funkcji i słów kluczowych SQL uczestniczy
VWHP"
w grze towarzyskiej „Zgadnij, kim jestem”. Jej uczestnicy podają Ci
podpowiedzi, a Ty na ich podstawie starasz się odgadnąć, kim oni są.
Możesz przy tym założyć, że uczestnicy gry zawsze mówią o sobie
prawdę. W pustym polu obok każdej z podpowiedzi zapisz nazwę
uczestnika zabawy; dodatkowo w kolejnym pustym polu zapisz, ]HVWUR
czy jest to słowo kluczowe, czy funkcja. Q\
Uczestnicy zabawy:
&2817',67,1&7$9*0,1*5283%<6800$;
Funkcja
Nazwa czy słowo kluczowe
Wyniki, które uzyskujesz, stosując mnie, mogą być niewiele warte. MIN funkcja
Przybornik SQL
A zatem opanowałeś materiał z szóstego
52='=,$
BY COUNT
ORDER yniki na
lf a b e t y cznie w azanej Potrafi zwróci
Sortuje
a ści wsk ć liczbę wiers
t a w ie zawarto spełniających zy
pod s kryteria poda
. w poleceniu ne
kolumny zwracania sa
SELECT bez
mych danych.
BY COUNT zwra
GROUP odstawie ca liczbę całk
w ie r s ze na p mnie owitą.
uje kolu
Konsolid e wskazanej
o ś c i w
wart
tabeli. AVG
DISTINCT Wyznac
za
Powoduje, że każda un
ikalna wartośc średnią arytm
tab eli i zapisa etyczną
wartość za pis an a w liczbow nych w
ko jeden raz ej. kolumnie
zostanie zw róc on a tyl
ści nie
— innymi słowy, warto MAX or
az MIN
będą się po wt arz ać . Pierwsz
a z tyc
najwięk h funkc
szą war ji zwrac
natomia tość w a
st drug ko
SUM najmnie a — wa lumnie,
jszą. rtość
wartości
Oblicza sumę
kolumnie
zapisanych w
liczbowej.
LIMIT
Pozwala dokł
adnie określić
wierszy może , ile
zwrócić zapy
oraz od któreg tanie
o wiersza
rozpocząć zw
racanie wynik
ów.
310 Rozdział 6.
3URMHNWRZDQLHED]GDQ\FKVNïDGDMÈF\FKVLÚ]ZLHOXWDEHO
Wyrastamy z naszych
starych tabel
Mój mały chłopiec dorasta.
Pewnie kiedyś się
wyprowadzi.
Oto Wiesław:
LGBNRQWDNWX
QD]ZLVNR.RZDOVNL
LPLH:LHVLHN
WHOHIRQ
HPDLOZLHVLHNN#NXUQDFKDWNDSO
SOHF0
GDWDBXURG]HQLD
]DZRGUROQLN
ORNDOL]DFMD.ROEXV]RZD
ZRMHZRG]WZR3.
VWDQVDPRWQ\
]DLQWHUHVRZDQLD]ZLHU]ÚWDMD]GDNRQQDILOP\
V]XNDSDUWQHUNL
DO ZROBIENIA:
Napisać zapytanie dla Wi eśka: Chodzi o napisanie
zapytania operującego na kolu
mnie zainteresowań. Nie wygląd
najlepiej, trzeba będzie użyć ope a to
ratora LIKE… całe szczęście, że
muszę się tak męczyć zbyt czę nie
sto…
312 Rozdział 7.
Projektowanie baz z wieloma tabelami
Po co cokolwiek zmieniać?
Grzesiek zdecydował się w żaden sposób nie modyfikować
kolumny ]DLQWHUHVRZDQLD. Nie ma nic przeciwko napisaniu
złożonego zapytania, gdyż przypuszcza, że nie będzie musiał tego
robić zbyt często.
Zaostrz ołówek
Dokończ zapytanie rozpoczęte przez Grześka, które pomoże Wieśkowi odszukać partnerkę
o takich samych zainteresowaniach. Do polecenia SQL dopisz wyjaśnienia opisujące znaczenie
każdego wiersza kodu.
6(/(&7
)520PRMHBNRQWDNW\
:+(5(SOHF
.
$1'VWDQ
VDPRWQD
$1'ZRMHZRG]WZR
3.
$1'V]XND/,.(
VDPRWQHJR
$1'GDWDBXURG]HQLD!
$1'GDWDBXURG]HQLD
$1']DLQWHUHVRZDQLD/,.(
$1'
$1'
Zaostrz ołówek
Rozwiązanie Dokończ zapytanie rozpoczęte przez Grześka, które pomoże Wieśkowi odszukać partnerkę
o takich samych zainteresowaniach.
Do polecenia SQL dopisz wyjaśnienia opisujące znaczenie każdego wiersza kodu.
$1'VWDQ
VDPRWQD
$1'GDWDBXURG]HQLD
LGBNRQWDNWX
QD]ZLVNR=LPRZVND
LPLH.ODUD Klara i Rącz
WHOHIRQ y
HPDLONODUD]LPRZVND#SL]]DQ]NSO
SOHF. sam raz.
Wiek jest w
GDWDBXURG]HQLD
]DZRGZHWHU\QDU] Zawód — doskonały.
ORNDOL]DFMD5]HV]öZ
ZRMHZRG]WZR3. Nawet mieszka całkiem blisko.
VWDQVDPRWQD
]DLQWHUHVRZDQLD]ZLHU]ÚWDILOP\MD]GDNRQQD
NVLÈĝNLVHQVDF\MQHVSDFHU\
V]XNDVDPRWQHJRIDFHWD A i zainteresow
ania
się zgadzają!
314 Rozdział 7.
Projektowanie baz z wieloma tabelami
Poszło aż za dobrze
Randka Klary i Wieśka udała się wyśmienicie.
Jednak teraz Grzesiek stał się ofiarą swojego
własnego sukcesu, ponieważ wszyscy jego samotni
znajomi chcą, by im szukał towarzystwa na randki.
A Grzesiek ma naprawdę dużo znajomych.
DO ZROBIENIA:
Napis
p sać za
z py
pyttan nie dla
dla Wi
Wie eśk
ś a:
aC
ope Cho
hodz
dzi o n
nap
apisana ie zap
zapy yta
tania
eru
rują
jąc
ceg
ego
e o na kolumnie
e za
zain
ainnte
tere
essow
owań
ań.. Nie
Nie w ląd
wyg daa to
o naj
najle
lep
piiej,
ej, trz
będ
dzie
zie u
użyć operatora LIK
LLIKE
I E… całe szczęście, że nie mu
IKE t
trze
zeba
męczyć zbyt często…
sto szę się tak
Napisz zapytanie, które odnajdzie kandydatki na randkę dla Roberta, przy czym nie uwzględniaj w nim
kolumny ]DLQWHUHVRZDQLD.
Ćwiczenie
LGBNRQWDNWX
QD]ZLVNR.UDV]NLHZLF]
LPLH5REHUW
WHOHIRQ
HPDLOUREBROR#VDPRWQ\]HMPDQSO
SOHF0
GDWDBXURG]HQLD
]DZRGNRPLN
ORNDOL]DFMD*GDñVN
ZRMHZRG]WZR30
VWDQVDPRWQ\
]DLQWHUHVRZDQLD]ZLHU]ÚWDSDSLHU\ZDUWRĂFLRZH
JHRJUDILD
V]XNDVDPRWQHMSDUWQHUNL
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
316 Rozdział 7.
Projektowanie baz z wieloma tabelami
DO ZROBIENIA:
Napisać zapytanie dla Wieśka:Chodzionapisaniezapytan
ope
eru
rują
jąc
ceg
ego
onakolumniezainteresowań.Nie ia
wyglądatonajlepiej,trzeba
będ
dzie
zie użyć operatora LIK
LIKE… całe szczęście, że nie mu
męczyć zbyt często… szę się tak
W prz
przy
pr ysz
szzłłoś
ości po
pow
owin
winnien
en
e ne
em ign
em ig
gno
gn
za
ain
intter
ere oro
ro
owa
ow
wać ć kolummnę
n Zainteresowane
ia
essowowańań, żeby sobie ułatwić pisanie zapytań. SĄ ważne. Ni h
Uwzględniaćtylkopierwszezainte powinniśmy ic tej
całą pozostałą zawarto
resowanieiignorować ignorować, w wiem
bo
ść kolumny. kolumnie są
po da ne ce nn e
informacje.
Zaostrz ołówek
Zastosuj funkcję SUBSTRING_INDEX, by pobrać pierwsze zainteresowanie z kolumny zainteresowania.
Zaostrz ołówek
Rozwiązanie Zastosuj funkcję 68%675,1*B,1'(;, by pobrać pierwsze zainteresowanie z kolumny
]DLQWHUHVRZDQLD.
Tu podaliśmy liczbę 1, gdyż chodzi nam
li
o pierwszy przecinek. Gdybyśmy poda
SUBSTRING_INDEX(zainteresowania, ',', 1) tu liczbę 2, to funkcja kontynuowałaby nia
poszukiwania aż do momentu odnalezie
drugiego przecinka i pobrała cały
fragment tekstu znajdujący się przed
To wywołanie pobierze fragment nim — co by odpowiadało dwóm pierw
szym
A oto i przecinek,
tekstu z kolumny zainteresowania, zainteresowaniom.
którego funkcja
od samego początku do miejsca
. poszukuje.
wystąpienia pierwszego przecinka
6(/(&7
)520PRMHBNRQWDNW\
:+(5(SOHF
.
$1'VWDQ
VDPRWQD
$1'ZRMHZRG]WZR
30
W wynikach pojawią się wyłącznie
kobiety, które na pierwszym miej
scu
$1'V]XND/,.(
VDPRWQHJR
„zwi
w kolumnie zainteresowania poda
erzęta”.
ły
$1'GDWDBXURG]HQLD!
$1'GDWDBXURG]HQLD
$1'68%675,1*B,1'(;]DLQWHUHVRZDQLD
]ZLHU]HWD
Odnaleziona kandydatka
Nareszcie! Grzesiek znalazł odpowiednią kandydatkę na randkę z Robertem:
LGBNRQWDNWX
QD]ZLVNR)UDQF]\ñVND
LPLH$OHNVDQGUD
WHOHIRQ
HPDLOIUBROD#SL]]DQ]NSO
SOHF. Wiek pasuje
.
GDWDBXURG]HQLD
]DZRGDUW\VWND
ORNDOL]DFMD6RSRW
ZRMHZRG]WZR30 I mieszka niedaleko od Roberta
.
VWDQVDPRWQD
]DLQWHUHVRZDQLD]ZLHU]ÚWD Zainteresowania
też pasują.
V]XNDVDPRWQHJRPÚĝF]\]Q\
318 Rozdział 7.
Projektowanie baz z wieloma tabelami
Błędne dopasowanie
Robert zaprosił Aleksandrę na randkę, a Grzesiek nerwowo czekał na
informację, jak się wszystko skończyło. Zaczął sobie wyobrażać tabelę
PRMHBNRQWDNW\ jako początek wielkiej witryny społecznościowej.
DO ZROBIENIA:
Napisać zapytanie dla Wieśka: Chodzi o napisanie zapytania
ope
eru
rują
jąc
ceg
ego
onakolumniezainteresowań.Nie
wyglądatonajlepiej,trzeb ba
będ
dzie
zie użyć operatora LIK
LIKE… całe szczęście, że nie mu
męczyć zbyt często… szę się ta
tak
W przprzy
pr yszzło
yszzłoś
ło
ości po
oś poowwin
win
nien
nie
iene
nem
em ign
ig
gno
gn
za
ainin
int
nter
nte
ere oro
o ow waaćć ko
olum
um mnnęę
res
essow
owańań, żeby sobie ułatwić pisanie zap Idealna kandydatka
ytań. dla Roberta znajdowała
Uw
wzg zględ
lę
ęd
dn nia
niać tylk
ty
y ko pie
p erw
wsze
wsszze
e za
ainte
nte
się w tabeli, jednak
całłą
ą pozostałą zawarto
ere
e res
re
eso
owwa
w anieeiignorować Grześkowi nie udało się
ść kolumny.
y jej odszukać, gdyż
jej zainteresowania
Stworzyć kilka kolumn, w óryc
zapisywać po jednym zaintktó h będzie się były zapisane
w innej kolejności.
eresowaniu
trzymanie wszystkich zainteresow , a to dlatego, że
ań w jednej kolumnie utrudnia Grzesiek w końcu
zapytań. pisanie
podjął decyzję
o zmianie
struktury tabeli.
WYSIL
SZARE KOMÓRKI
Jak będą wyglądać przyszłe zapytania Grześka, kiedy doda
do tabeli kilka kolumn z zainteresowaniami?
Zaostrz ołówek
Korzystając z polecenia $/7(5 oraz funkcji 68%675,1*B,1'(;, zmodyfikuj tabelę Grześka w taki
sposób, by miała następujące kolumny:
LGBNRQWDNWX
QD]ZLVNR
LPLH
WHOHIRQ
HPDLO
SOHF
GDWDBXURG]HQLD
]DZRG
PLHMVFRZRVF
ORNDOL]DFMD
VWDQ
]DLQWHUHVRZDQLH
]DLQWHUHVRZDQLH
]DLQWHUHVRZDQLH
]DLQWHUHVRZDQLH
V]XND
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
320 Rozdział 7.
Projektowanie baz z wieloma tabelami
Zaczynamy od początku
Grześkowi jest przykro z powodu nieudanego spotkania Roberta, dlatego ma
zamiar spróbować jeszcze raz. Zaczyna od ponownego przejrzenia danych z rekordu
dotyczącego Roberta:
LGBNRQWDNWX
QD]ZLVNR.UDV]NLHZLF]
LPLH5REHUW
WHOHIRQ
HPDLOUREBROR#VDPRWQ\]HMPDQSO
SOHF0
GDWDBXURG]HQLD
]DZRGNRPLN
ORNDOL]DFMD*GDñVN
ZRMHZRG]WZR30
VWDQVDPRWQ\
]DLQWHUHVRZDQLH]ZLHU]ÚWD Cztery kolumny na
]DLQWHUHVRZDQLHSDSLHU\ZDUWRĂFLRZH zainteresowania, dostępne
]DLQWHUHVRZDQLHJHRJUDILD w zmodyfikowanej tabeli
]DLQWHUHVRZDQLH18// Grześka.
V]XNDVDPRWQHMSDUWQHUNL
Grzesiek znowu pisze zapytanie, które ma pomóc Robertowi w odszukaniu odpowiedniej kandydatki
na randkę. Włożył w nie całą swoją wiedzę, starając się odszukać osobę, która będzie idealnie pasowała
Ćwiczenie do Roberta. Grzesiek zaczyna od prostych kolumn — płci, stanu, województwa, daty urodzenia i informacji
o tym, kogo lub czego poszukuje dana osoba; dopiero potem chce przejść do kolumn zainteresowań.
Poniżej napisz zapytanie, które próbuje utworzyć Grzesiek.
Grzesiek znowu pisze zapytanie, które ma pomóc Robertowi w odszukaniu odpowiedniej kandydatki
na randkę. Włożył w nie całą swoją wiedzę, starając się odszukać osobę, która będzie idealnie
Rozwiązanie pasowała do Roberta. Grzesiek zaczyna od prostych kolumn — płci, stanu, województwa, daty
ćwiczenia urodzenia i informacji o tym, kogo lub czego poszukuje dana osoba; dopiero potem chce przejść
do kolumn zainteresowań.
Poniżej napisz zapytanie, które próbuje utworzyć Grzesiek.
322 Rozdział 7.
Projektowanie baz z wieloma tabelami
Wszystko stracone…
Dodanie nowych kolumn
nie przyczyniło się do
rozwiązania podstawowego
DO ZROBIENIA:
problemu Grześka —
Napisać zapytan ie dla Wieśka: Chodzi o napisanie
okazało się, że struktura
zap
pytyta
ani
nia
a operującego na kolumnie zain
tabeli dalej nie umożliwia teresowań. Nie wygląda to
najjlep
lepiej, trzeba będzie użyć ope
tworzenia prostych zapytań. ratora LIKE… całe szczęście, że
muszę ę się
ę tak męczyć zbyt często… nie
n
Żadna z dotychczasowych
wersji tabeli nie spełniała W przyszłości powinienem ign
zaain
intter
ere orować kolumnę
wymogu zawierania danych res
essow
owańa , żeby sobie ułatwić pisanie zap
atomowych. ytań.
Uwwzzgglęlęd
dn nia
iaćć tylko pierwsze zainteresowan
ign
nor
oroowa
wać całą pozostałą ie i
zawartość kolumny
y.
się, że Stworzyć
A wydawało e dobre ć kilk
k ka kokolum
mn,, w któ
to będzie takiJednak za
ap
ap tóryc
ych bę
będ
dz
dzie
ie
e się
sę
rozwiązanie. zapytania
pis
isy
syw
yw
wać
wa
ać ppoo je
jed
ednym za
zaint
in
ntere
ntere
esow
sso
ow
o
że
e trzymanie wszystkich zaintere
wan
wa
aniu
u , a to dlatego,
sprawiło, że cze bardziej sowań w jednej kolumnie utru
stały się jesz pisa
sannie
ie zapytań. dni
dn a
złożone.
…ale zaraz
WYSIL
SZARE KOMÓRKI
Czy dodanie nowej tabeli mogłoby coś pomóc? W jaki sposób
moglibyśmy połączyć dane w obu tabelach?
324 Rozdział 7.
Projektowanie baz z wieloma tabelami
info_aktywnosci aktywnosci
id id_aktywnosci
niejsza
Nasza wcześ a znacznie id_aktywnosci aktywnosc
la zo st ał
tabe oto co z ni
ej
okrojona —
pozostał o.
Już niebawem
wyjaśnimy, co oznaczają
te linie i strzałki…
klowni_informacje
id
imie
plec info_lokalizacja lokalizacja
opis id id_lokalizacji
id_lokalizacji lokalizacja
kiedy
Na kilku kolejnych stronach wyjaśnimy,
dlaczego tabele zostały podzielone w taki,
a nie inny sposób oraz co oznaczają te
wszystkie strzałki i klucze. Kiedy już
to wszystko zrozumiesz, zajmiemy się
WYSIL
modyfikacją tabeli PRMHBNRQWDNW\ Grześka. SZARE KOMÓRKI
Jak sądzisz, co oznaczają te linie ze strzałkami? A te symbole kluczy?
info_aktywnosci aktywnosci
id id_aktywnosci
jsza
Nasza wcześnie acznie id_aktywnosci aktywnosc
ta be la zo st ała zn
co z niej
okrojona — oto
pozost ało .
imie
plec info_lokalizacja lokalizacja
opis id id_lokalizacji
id_lokalizacji lokalizacja
kiedy
Do tej pory wszystkie tabele zamieszczone w tej książce były przedstawiane w formie
tabelki, w której nazwy kolumn były rozmieszczone w górnym wierszu bądź też w formie
kodu wyświetlanego przez polecenie '(6&5,%( w oknie konsoli. Oba te sposoby
doskonale zdają egzamin w przypadku korzystania z pojedynczej tabeli. Jednak nie są
szczególnie wygodne, gdy chcemy stworzyć diagram kilku powiązanych ze sobą tabel.
Nazwa tabeli.
moje_kontakty Symbol klucza
oznacza, że dana
kolumna jest kluczem
id_kontaktu głównym.
nazwisko
imie
telefon
email
plec ystkie kolu
mny
A to są wsz rzeczywistej
w
zapisane w jakiej są
data_urodzenia kolejności, e w tabeli.
on
rozmieszcz
zawod
lokalizacja
wojewodztwo Stworzenie diagramu
stan tabeli pozwala oddzielić
zainteresowania jej projekt od danych,
szuka które są w niej
przechowywane.
328 Rozdział 7.
Projektowanie baz z wieloma tabelami
moje_kontakty
id_kontaktu
nazwisko
imie zainteresowania
telefon id_zainteresowania
email zainteresowanie
ą
plec imie Te dwie kolumny pozwol
data_urodzenia nazwisko nam określić, które
zainteresowania należą
zawod do poszczególnych osób.
lokalizacja
wojewodztwo
stan
szuka Kiedy zainteresowanie
będ
należeć do danej osoby, zie
będą takie same. Dla każte wartości
kontaktu w tabeli zainte dego
może być zapisany wię resowań
cej
wiersz. Dzięki temu z każ niż jeden
może być powiązana dow dą osobą
zainteresowań. olna ilość
WYSIL
SZARE KOMÓRKI
Pomysł jest bardzo dobry, jednak wybór imienia i nazwiska jako
kolumn służących do połączenia obu tabel nie jest najlepszy.
Czy potrafisz wyjaśnić dlaczego?
Łączenie tabel
Przyjrzyjmy się teraz dokładniej naszemu
pomysłowi modyfikacji tabeli PRMHBNRQWDNW\.
1 2
6(/(&7LPLHQD]ZLVNR 6(/(&7]DLQWHUHVRZDQLH)520]DLQWHUHVRZDQLD
)520PRMHBNRQWDNW\ :+(5(LPLH
MDNLHĂLPLÚ
ać, że takie
li będzie Ci się wydaw
Nie przejmuj się, jeśefektywne. Zastosowaliśmy je tylko
t
rozwiązanie nie jes ormacje zapisane
ić, w jaki sposób inf
po to, by przedstaw zostać użyte do pobrania danych
w jednej tabeli mogątce przedstawimy znacznie lepsze
z innej tabeli. (Wkró blemu).
rozwiązanie tego pro
330 Rozdział 7.
Projektowanie baz z wieloma tabelami
Zaostrz ołówek
Na pustej stronie poniżej naszkicuj kolejne pomysły na dodanie do bazy danych Grześka nowych
tabel, które pomogłyby nam śledzić zainteresowania zarejestrowanych osób.
Nie zawracaj sobie głowy estetyką i nie staraj się rysować schematu — pamiętaj, aktualnie
zajmujemy się jedynie ideą. Jedną z tych idei narysowaliśmy już za Ciebie, ale musisz ją jeszcze
nieco poprawić.
Tabela zainteresowania:
Każdy z jej wierszy zawiera
pola:
nazwisko
imie
Tabela moje_kontakty zainteresowanie
(z której usunięto kolumnę
zainteresowania)
pola imie
W jakiś sposób u tabelach
i nazwisko w ob
ie, co pozwala
pasują do sieb o ma jakie
nam określić, kt
a.
zainteresowani
Zaostrz ołówek
Rozwiązanie Na pustej stronie poniżej naszkicuj kolejne pomysły na dodanie do bazy danych Grześka nowych
tabel, które pomogłyby nam śledzić zainteresowania zarejestrowanych osób.
Nie zawracaj sobie głowy estetyką i nie staraj się rysować schematu — pamiętaj, aktualnie
zajmujemy się jedynie ideą. Jedną z tych idei narysowaliśmy już za Ciebie, ale musisz ją jeszcze
nieco poprawić.
Tabela zainteresowania:
Każdy z jej wierszy zawiera
pola:
id_zainteresowania
zainteresowanie
id_kontaktu
Tabela moje_kontakty
(z której usunięto kolumnę
zainteresowania)
Dzięki zastosowaniu kolumny
id_kontaktu będziemy mogli
naprawdę unikalnych wartoścużywać
Wiemy bowiem, że zaintere i.
sow
którym przypisano konkretną ania,
id_kontaktu, na pewno są wartość
pow
z prawidłowym wierszem tabe iązane
moje_kontakty. li
332 Rozdział 7.
Projektowanie baz z wieloma tabelami
Łączenie tabel
W naszym pierwszym szkicu połączonych tabel pojawił się pewien problem.
Wynikał on z faktu, że chcieliśmy połączyć obie tabele przy wykorzystaniu
pól LPLH i QD]ZLVNR. A co by się stało w przypadku, gdyby dwie różne
osoby zapisane w tabeli PRMHBNRQWDNW\ miały takie samo imię i nazwisko?
Tabela zainteresowania:
Każdy z jej wierszy zawiera
pola:
Jeśli dwie osoby
nazwisko bę
takie samo imię i dą miały
imie to ich zainteresowanazwisko,
Tabela moje_kontakty zainteresowanie mogą się pomiesza nia
(z której usunięto kolumnę ć!
zainteresowania)
334 Rozdział 7.
Projektowanie baz z wieloma tabelami
Nie istnieją
głupie pytania
O.: Tym zajmiemy się w następnym rozdziale. Podczas lektury przekonasz się, że
tworzenie zapytań pobierających informacje z kilku tabel jest w rzeczywistości całkiem
proste. Jednak jak na razie musimy dokończyć modyfikowanie tabeli PRMHBNRQWDNW\,
tak by tworzenie zapytań było proste i efektywne.
336 Rozdział 7.
Projektowanie baz z wieloma tabelami
LGB]DLQWHUHVRZDQLD,1712718//$872B,1&5(0(1735,0$5<.(<
Nazwę OGRANICZENIA określamy
]DLQWHUHVRZDQLH9$5&+$512718// w taki sposób, by zawierała informację
o tabeli, z której pochodzi klucz główny
(moje_kontakty), nazwie klucza
(id_kontaktu) oraz o tym, iż jest to
Klucz obcy
tworzymy LGBNRQWDNWX,1712718// klucz obcy (fk, od ang. foreign key)
dokładnie
w taki sam Jeśli później zmienimy zdan
sposób, w jaki &21675$,17PRMHBNRQWDNW\BLGBNRQWDNWXBIN ie,
to modyfikując tabelę, będziem
y
tworzylibyśmy się musieli posługiwać tą nazw
każdą inną Ten wiersz kodu jest opcjonal ą.
ny,
kolumnę pełniącą
rolę klucza: ma )25(,*1.(<LGBNRQWDNWX niemniej jednak stosowanie
uważane jest za przejaw dobr
go
ej
to być kolumna praktyki programistycznej.
typu INT,
w której nie są 5()(5(1&(6PRMHBNRQWDNW\LGBNRQWDNWX
dopuszczane Nazwa kolumny podana
wartości NULL w nawiasach określa
(NOT NULL).
Ta nazwa określa, z jakiej
tabeli pochodzi klucz obcy…
…oraz jaką ma nazwę kolumnę, która będzie
kluczem obcym. Może
kolumna w tej drugiej
tabeli. to być dowolna nazwa.
Spróbuj wykonać powyższe polecenie. Otwórz okno konsoli i wpisz powyższy kod SQL, by stworzyć
swoją własną wersję tabeli zainteresowań.
Ćwiczenie Kiedy już ją utworzysz, przeanalizuj uważnie jej strukturę. Jakie nowe informacje pozwolą Ci zorientować
się, że faktycznie zostały utworzone ograniczenie i klucz obcy?
Spróbuj wykonać powyższe polecenie. Otwórz okno konsoli i wpisz powyższy kod SQL,
by stworzyć swoją własną wersję tabeli zainteresowań.
Rozwiązanie Kiedy już ją utworzysz, przeanalizuj uważnie jej strukturę. Jakie nowe informacje pozwolą Ci się
ćwiczenia zorientować, że faktycznie zostały utworzone ograniczenie i klucz obcy?
Nie istnieją
głupie pytania
P.: Zadaliście sobie naprawdę dużo głównego). Jeśli spróbujesz usunąć rekord O.: To spowalnia bazę. Takie wiersze są
trudu, by utworzyć ograniczenie w tabeli zawierającej klucz główny lub nazywanie „sierotami”, a wraz z upływem czasu
i klucz obcy. Ale właściwie po co? zmienisz wartość klucza głównego oraz jeśli może się ich nazbierać bardzo dużo. Nie są one
Czy nie można by po prostu używać wartość klucza głównego z tego rekordu jest do niczego przydatne, a jedynie sprawiają, że
klucza z innej tabeli i nazwać go zapisana w tabeli podrzędnej w kolumnie baza musi przeszukiwać więcej informacji, co
kluczem obcym bez definiowania klucza obcego, to zostanie zgłoszony błąd. wydłuża czas wykonywania zapytań.
O.: Można by. Jednak dzięki utworzeniu nie będę mógł usunąć z tabeli mnie. Czy są jeszcze jakieś inne
ograniczenia będziesz mógł zapisywać moje_kontakty wiersza, jeśli ograniczenia, oprócz klucza obcego?
w kolumnie klucza obcego wyłącznie takie wartość jego klucza głównego
wartości, które już istnieją w tabeli nadrzędnej. będzie występowała w tabeli O.: Tak, na przykład klucz główny, który już
A to z kolei wymusi powiązanie pomiędzy zainteresowania jako klucz obcy? znasz. Oprócz tego zastosowanie (podczas
obydwoma tabelami. tworzenia kolumny) słowa kluczowego
O.: Będziesz mógł, z tym że wcześniej 81,48( także jest uznawane za ograniczenie.
P.: A co oznacza wyrażenie będziesz musiał usunąć wiersz klucza Istnieje także pewien typ ograniczeń,
„wymusi powiązanie”? obcego. W końcu, jeśli usuniesz osobę niedostępny w bazie danych MySQL, nazywany
z tabeli PRMHBNRQWDNW\, to nie będą Cię już ograniczeniem &+(&.. Pozwala on na
O.: Ograniczenie klucza głównego wymusza interesowały jej zainteresowania. określenie warunku, który musi być spełniony,
integralność odwołań (innymi słowy, by wartość mogła zostać zapisana w kolumnie.
ograniczenie zapewnia, że jeśli w jednej tabeli P.: Ale kogo to interesuje, że Powinieneś sprawdzić dokumentację
istnieje rekord zawierający klucz obcy, to w moje tabeli zainteresowań będą używanego systemu zarządzania bazami
w drugiej tabeli będzie istniał odpowiadający zapisane dwa nikomu niepotrzebne danych SQL, by sprawdzić, czy udostępnia on
mu rekord z taką samą wartością klucza wiersze? ograniczenia tego typu.
338 Rozdział 7.
Projektowanie baz z wieloma tabelami
SUDFRZQLF\ ]DURENL
id_pracownika imie nazwisko nr_ubezp poziom_zarobkow id_pracownika
1 Beyonce Knowles 234567891 2 6
2 Shaw Carter 345678912 5 35
3 Shakira Ripoll 123456789 7 1
ć typu jeden-do-jednego,
Także te tabele tworzą zależnoś ików, id_pracownika,
z głów ny tabe li prac own
gdyż kluc
tabeli zarobków.
został użyty jako klucz obcy
WYSIL
SZARE KOMÓRKI
W jaki sposób można naprawić te tabele bez umieszczania więcej niż jednej informacji w jednej kolumnie (co niechybnie
spowodowałoby problemy podobne do tych, które miał Grzesiek ze swoją kolumną zainteresowań)?
342 Rozdział 7.
Projektowanie baz z wieloma tabelami
Zaostrz ołówek
Przyjrzyj się dwóm poniższym tabelom. Spróbowaliśmy rozwiązać problem, dodając do tabeli
kobiet kolumnę id_butow, pełniącą funkcję klucza obcego.
Zaostrz ołówek
Rozwiązanie Przyjrzyj się dwóm poniższym tabelom. Spróbowaliśmy rozwiązać problem, dodając do tabeli
kobiet kolumnę id_butow, pełniącą funkcję klucza obcego.
Zwróć uwagę Teraz sam naszkicuj nową parę tabel, jednak tym razem
na powtórzenia ta
umieść kolumnę id_kobiety jako klucz obcy w tabeli butów.
w kolumnach kobielu.
oraz nazwa_mode Kiedy skończysz, narysuj powiązania pomiędzy rekordami
obu tabel.
344 Rozdział 7.
Projektowanie baz z wieloma tabelami
li…
Weźmy klucz główny z tej tabe
…oraz klucz główny z tej tabe
li…
…i umieśćmy je
w tabeli łączącej.
moje_kontakty oraz
Teraz pomiędzy tabelamiuje zależność wiele-do-wielu.
zainteresowania wys tęp
P.: Czy muszę tworzyć tabelę łączącą, P.: Jakie korzyści daje P.: No dobrze, a co jeśli pomimo
kiedy pomiędzy moimi tabelami przekształcenie tabel do to wciąż nie mam nic przeciwko
występują zależności wiele-do-wielu? przedstawionej powyżej postaci? powtarzaniu danych?
Przecież mógłbym umieścić
O.: Owszem, powinieneś to robić. W przeciwnym zainteresowania w jednej tabeli,
zawierającej kolumny id_kontaktu
O.: Łączenie tabel ułatwia zachowanie integralności
razie, jeśli pomiędzy dwiema tabelami występuje danych. Jeśli będziesz musiał usunąć kogoś z tabeli
zależność wiele-do-wielu, skończysz, powielając i zainteresowanie. Owszem, dane by PRMHBNRQWDNW\, to nie będzie to pociągało za sobą
grupy danych, co będzie sprzeczne z założeniami się powtarzały, ale co z tego? konieczności wprowadzania jakichkolwiek zmian w tabeli
]DLQWHUHVRZDQLD — ewentualnie zmieni się jedynie
O.: Korzyści bardzo wyraźnie zauważysz
pierwszej postaci normalnej. (Przypomnienie
informacji dotyczących normalizacji i postaci tabela NRQWDNW\B]DLQWHUHVRZDQLD. Bez tej odrębnej
normalnych znajdziesz kilka stron dalej). w kolejnym rozdziale, kiedy zaczniesz tabeli mogłoby się zdarzyć, że usuniesz nieodpowiedni
Nie ma żadnego uzasadnienia usprawiedliwiającego przeszukiwać te powiązane ze sobą tabele, rekord. A zatem łączenie tabel zwiększa bezpieczeństwo.
łamanie zasad pierwszej postaci normalnej, używając do tego celu złączeń. Oprócz tego Podobnie wygląda sytuacja podczas aktualizacji
istnieje natomiast bardzo wiele argumentów w niektórych sytuacjach taka struktura tabel danych w tabelach. Załóżmy, że błędnie zapisałeś
przemawiających za tym, by stosować się do nich. może pomóc podczas pobierania i operowania nazwę jakiegoś wyszukanego i rzadko spotykanego
Jednym z najważniejszych jest to, że łamanie zasad na danych. Może się także zdarzyć, że bardziej hobby, jak na przykład speleoarcheologia. Gdy
pierwszej postaci normalnej znacznie utrudni nam będzie Cię interesować tabela zawierająca dane zechcesz ją poprawić, wystarczy, że zmodyfikujesz
przeszukiwanie i pobieranie powtarzających się zależności wiele-do-wielu niż informacje zapisane tylko jeden wiersz w tabeli zainteresowań — nigdy nie
danych z powiązanych tabel. w pozostałych dwóch tabelach. będziesz musiał przejmować się dwiema pozostałymi
tabelami: NRQWDNW\B]DLQWHUHVRZDQLD oraz
PRMHBNRQWDNW\.
346 Rozdział 7.
Projektowanie baz z wieloma tabelami
Dla każdej z przedstawionych poniżej fragmentarycznych tabel określ, czy zakreślone kolumny
będzie najlepiej przedstawić w postaci zależności jeden-do-wielu czy też wiele-do-wielu.
(Pamiętaj, że jeśli to ma być zależność jeden-do-wielu lub wiele-do-wielu, to kolumna powinna
zostać usunięta z tabeli i powiązana z kolumną identyfikatora).
paczki_oceny
typ
ocena
klowni_informacje
id_klowna
aktywnosci
data
moje_kontakty
id_kontaktu
stan
zainteresowania
ksiazki
id_ksiazki
autorzy
wydawca
rekordowe_polowy
id_rekordu
gatunek_ryby
wojewodztwo
Dla każdej z przedstawionych poniżej fragmentarycznych tabel określ, czy zakreślone kolumny
będzie najlepiej przedstawić w postaci zależności jeden-do-wielu czy też wiele-do-wielu.
(Pamiętaj, że jeśli to ma być zależność jeden-do-wielu lub wiele-do-wielu, to kolumna powinna
zostać usunięta z tabeli i powiązana z kolumną identyfikatora).
paczki_oceny
typ
jeden-do-wielu
ocena
klowni_informacje
id_klowna
aktywnosci wiele-do-wielu
data
moje_kontakty
id_kontaktu
stan jeden-do-wielu
zainteresowania wiele-do-wielu
mieć
To jest trudne. Jednak książka może ność
więc ej niż jedne go auto ra, zatem zależ
ksiazki
jest typu wiele-do-wielu.
id_ksiazki
autorzy
wiele-do-wielu
wydawca jeden-do-wielu
rekordowe_polowy
id_rekordu
jeden-do-wielu
gatunek_ryby
wojewodztwo jeden-do-wielu
348 Rozdział 7.
Projektowanie baz z wieloma tabelami
moje_kontakty
id_kontaktu
nazwisko
imie
telefon
email
* Być może będziesz chciał cofnąć się o kilka
plec rozdziałów i przypomnieć sobie zasady określające
pierwszą postać normalną. Nie musisz jednak tego
data_urodzenia robić — zajmiemy się tym na następnej stronie.
zawod
lokalizacja
wojewodztwo
stan
zainteresowania
szuka
350 Rozdział 7.
Projektowanie baz z wieloma tabelami
W końcu w 1NF
A teraz zobacz, co zrobiliśmy poniżej.
W 1NF
Klucz obcy.
Klucz
główny.
id_zabawki zabawka id_zabawki kolor
KLUCZ ZŁOŻONY
to KLUCZ GŁÓWNY,
który jest unikalny
i składa się z kilku kolumn.
Przeanalizujmy przedstawioną poniżej tabelę superbohaterów. Nie ma
w niej kolumny będącej kluczem głównym, jednak możemy stworzyć
złożony klucz główny na podstawie kolumn QD]ZD oraz PRF. Choć w tabeli
nazwy superbohaterów oraz ich moce mogą się powtarzać, to jednak pary
powstałe przez połączenie nazwy i mocy zawsze są unikalne.
VXSHUERKDWHURZLH
352 Rozdział 7.
Projektowanie baz z wieloma tabelami
Zaostrz ołówek
Teraz już wiesz, że kolumna LQLFMDO\ jest zależna od kolumny QD]ZD. Czy możesz jeszcze
wskazać inne, podobne zależności w tabeli superbohaterów? Jeśli tak, to wypisz je poniżej.
Zaostrz ołówek
Rozwiązanie Teraz już wiesz, że kolumna LQLFMDO\ jest zależna od kolumny QD]ZD. Czy możesz jeszcze
wskazać inne, podobne zależności w tabeli superbohaterów? Jeśli tak, to wypisz je poniżej.
7[!7\
ę notacja uproszczona.
W slangu technicznym taki zapis nosi nazw
Zapis ten należy odczytywać w następujący sposób: „w tablicy relacyjnej o nazwie T kolumna
y jest funkcjonalnie zależna od kolumny x”. Najprościej rzecz biorąc, w celu określenia, która
kolumna jest zależna od której, należy odczytać ten zapis od strony prawej do lewej.
VXSHUERKDWHURZLHQD]ZD!VXSHUERKDWHURZLHLQLFMDO\
„W relacyjnej tabeli VXSHUERKDWHURZLH kolumna LQLFMDO\ jest funkcjonalnie zależna
od kolumny QD]ZD”.
VXSHUERKDWHURZLHQD]ZD!VXSHUERKDWHURZLHVODERVF
„W relacyjnej tabeli VXSHUERKDWHURZLH kolumna VODERVF jest funkcjonalnie zależna
od kolumny QD]ZD”.
VXSHUERKDWHURZLHQD]ZD!VXSHUERKDWHURZLHZURJ
„W relacyjnej tabeli VXSHUERKDWHURZLH kolumna ZURJ jest funkcjonalnie zależna od kolumny
QD]ZD”.
VXSHUERKDWHURZLHNUDM!VXSHUERKDWHURZLHPLDVWR
„W relacyjnej tabeli VXSHUERKDWHURZLH kolumna PLDVWR jest funkcjonalnie zależna
od kolumny NUDM”.
354 Rozdział 7.
Projektowanie baz z wieloma tabelami
Zależności superbohaterów
A zatem, gdyby nasz superbohater miał zmienić nazwę, zmieniłyby się
zkowyMen
także jego inicjały, co oznacza, że kolumna, która je zawiera, Jeśli Kresecsię zmienić nazwę,
jest zależna od kolumny QD]ZD. zdecyduje ę także zawartość
si
to zmieni icjałów w jego
Jeśli nasz główny wróg zdecyduje się przenieść swoją kryjówkę kolumny in
wierszu.
do innego miasta, zmieni się jego lokalizacja, jednak nie pociągnie to
za sobą żadnych dalszych zmian w bazie. A to oznacza, że kolumna
ZURJBPLDVWR jest niezależna.
Kolumną zależną nazywamy taką kolumnę, której zawartość może
się zmieniać, jeśli ulegną zmianie informacje zapisane w innej
kolumnie. Z kolei na kolumnę niezależną nie mają wpływu zmiany
w zawartości innych kolumn.
VXSHUERKDWHURZLH
Przyjrzyj się poniższej tabeli prezentującej książki. Kolumna LGBZ\G określa wydawcę książki,
a kolumna PLDVWRBZ\G — miasto, w którym książka została wydana.
Ćwiczenie
Poniżej zapisz, co się stanie z wartością kolumny URNBZ\G, jeśli tytuł książki w trzecim wierszu tabeli
zmienimy na „Dzienniki gwiazdowe”. Rok wydania
zależy od tytułu
książki, zatem
Jeśli zmieni się tytuł, trzeba będzie także zmienić rok wydania jego wartość
także się zmieni.
Co się stanie z wartością kolumny URNBZ\G, jeśli autora książki w trzecim wierszu zmienimy
na Rin Tin Tin, lecz jej tytuł pozostanie taki sam?
Co się stanie z książką „Łuk Triumfalny”, jeśli zmienimy identyfikator wydawcy, LGBZ\G, na 2?
Co się stanie z wartością kolumny LGBZ\G książki „Psy szczekają”, jeśli jej wydawca przeniesie
swoją siedzibę do Wrocławia?
Co się stanie z wartością kolumny miasto_wyd książki „Równi bogom”, jeśli zmienimy wartość
kolumny LGBZ\G na 1?
Przyjrzyj się poniższej tabeli prezentującej książki. Kolumna LGBZ\G określa wydawcę książki,
a kolumna PLDVWRBZ\G — miasto, w którym książka została wydana.
Rozwiązanie Poniżej zapisz, co się stanie z wartością kolumny URNBZ\G, jeśli tytuł książki w trzecim wierszu
ćwiczenia tabeli zmienimy na „Dzienniki gwiazdowe”. Rok wydania
zależy od tytułu
Jeśli zmieni się tytuł, trzeba będzie także zmienić rok wydania. książki, zatem
jego wartość
także się zmieni.
Co się stanie z wartością kolumny URNBZ\G, jeśli autora książki w trzecim wierszu
zmienimy na Rin Tin Tin, lecz jej tytuł pozostanie taki sam?
Kolumny autor
Jeśli zmienia się autor książki, a tytuł pozostaje ten sam, to zmienia się
i tytuł wspólni
e także rok wydania.
tworzą złożony Rok wydania zależ
klucz główny ta
beli. tytułu. Zależy ta y od
autora. kże od
Co się stanie z książką „Łuk Triumfalny”, jeśli zmienimy identyfikator wydawcy, LGBZ\G, na 1?
Miasto wydania (miasto_wyd) dla wydawców
o identyfikatorach 1 i 2 jest takie samo — jest
Zawartość kolumny miasto_wyd nim Warszawa. A zatem miasto się nie zmieni
Kolumna id_wyd (pomimo faktu, iż kolumna miasto_wyd jest
nie jest zależna nie zmieni się. przechodnio zależna od kolumny id_wyd).
od kolumny
miasto_wyd, Co się stanie z wartością kolumny LGBZ\G książki „Psy szczekają”, jeśli jej wydawca przeniesie
dlatego też
wartość id_wyd swoją siedzibę do Wrocławia?
pozostanie
niezmieniona. Wartość w kolumnie id_wyd pozostanie taka sama.
Co się stanie z wartością kolumny miasto_wyd książki „Równi bogom”, jeśli zmienimy wartość
kolumny LGBZ\G na 1?
Kolumna miasto_wyd jest
Kolumna miasto_wyd zależna od wartości kolumny
jest przechodnio
Wartość w kolumnie miasto_wyd zmieni się id_wyd. Żadna z tych kolumn
zależna od kolumny na Warszawa. nie jest kluczem, a zatem
id_wyd, dlatego też jest to przykład przechodniej
jej wartość ulegnie zależności funkcjonalnej.
zmianie.
autor tytul rok_wyd id_wyd miasto_wyd
Truman Capowe Psy szczekają 1982 2 Warszawa
E.M. Remarque Łuk Triumfalny 1973 1 Warszawa
Robert Ludlum Manuskrypt Chancellora 1990 6 Poznań
Isaac Asimov Równi bogom 1994 15 Poznań
358 Rozdział 7.
Projektowanie baz z wieloma tabelami
Nie istnieją
głupie pytania
P.: Czy istnieje jakieś rozwiązanie P.: Czy oprócz tworzenia tabeli łączącej istnieje
pozwalające na uniknięcie częściowej jakiś inny powód, dla którego mógłbym chcieć
zależności funkcjonalnej? tworzyć klucz złożony? Czy nie można zawsze
O.:
tworzyć kolumn zawierających identyfikator?
Problem ten można definitywnie rozwiązać,
stosując rozwiązanie, które wykorzystaliśmy w tabeli O.: Bez wątpienia jest to dobre rozwiązanie. Niemniej jednak,
PRMHBNRQWDNW\, czyli tworząc kolumnę identyfikatora. jeśli poszukasz w internecie hasła „synthetic or natural key”
Ponieważ jest to zupełnie nowy klucz, utworzony (klucz sztuczny lub naturalny), przekonasz się, że można podać
specjalnie w celu poindeksowania tabeli, zatem żadne przekonujące argumenty przemawiające na korzyść każdej z tych
inne umieszczone w niej dane nie będą od niego zależne. metod. Znajdziesz także wiele bardzo emocjonalnych dyskusji na
ten temat. My jednak pozwolimy Ci samemu wyrobić sobie zdanie.
W tej książce w przeważającej większości przypadków będziemy
stosowali jednokolumnowy sztuczny klucz główny. Zdecydowaliśmy
się na takie rozwiązanie, by możliwie w jak największym
stopniu uprościć prezentowane polecenia SQL, tak byś bardziej
koncentrował się na zagadnieniach, a nie na ich implementacji.
Słuchajcie, te zależności
naprawdę są fajne, interesujące i w ogóle…
ale co one mają wspólnego z przejściem
od pierwszej do drugiej postaci normalnej?
360 Rozdział 7.
Projektowanie baz z wieloma tabelami
Wszystkie zabawka_sklep
informacje
dotyczące: id_zabawki Wszystkie
Zabawek informacje
id_sklepu
dotyczące: Sklepów
ciasteczka_sprzedaz
ilosc
piosenkarze id_dziewczyny
id_piosenkarza date
nazwisko imie_dziewczyny
imie dowodca_grupy
agencja sprzedaz_sumaryczna
agencja_miasto
filmy
id_filmu
tytul
rodzaj
wynagrodzenie wypożyczony_przez
id_pracownika oczekiwana_data_zwrotu
nazwisko ocena
imie
kwota
kierownik
email_pracownika
rasy_psow
data_zatrudnienia
nazwa_rasy
opis
srednia_waga
srednia_wysokosc
id_klubu
klub_miasto
362 Rozdział 7.
Projektowanie baz z wieloma tabelami
Zaostrz ołówek
Przekształć przedstawione poniżej dwie tabele na trzy tabele w 2NF.
Pierwsza z tabel będzie zawierać informacje o zabawkach, druga informacje o sklepach, a trzecia
będzie łączyć dwie pozostałe tabele i jednocześnie zawierać informacje o stanie magazynowym.
Każdej z tabel nadaj odpowiednią nazwę.
W końcu w odpowiednich tabelach utwórz niezbędne, dodatkowe kolumny.
364 Rozdział 7.
Projektowanie baz z wieloma tabelami
Zaostrz ołówek
Rozwiązanie Przekształć przedstawione poniżej dwie tabele na trzy tabele w 2NF.
Pierwsza z tabel będzie zawierać informacje o zabawkach, druga informacje o sklepach, a trzecia
będzie łączyć dwie pozostałe tabele i jednocześnie zawierać informacje o stanie magazynowym.
Każdej z tabel nadaj odpowiednią nazwę.
W końcu w odpowiednich tabelach utwórz niezbędne, dodatkowe kolumny.
VNOHSBPDJD]\Q
Analizując tabele
pod względem kursy
zgodności z 3NF,
Jeśli zmienimy wartość w kolumnie możemy pominąć id_kursu
kolumnę klucza
QD]ZDBNXUVX, nie spowoduje to głównego.
konieczności zmiany wartości kolumn
nazwa_kursu
LQVWUXNWRU ani LQVWUXNWRUBWHOHIRQ. instruktor
Jeśli zmienimy wartość w kolumnie instruktor_telefon
LQVWUXNWRUBWHOHIRQ, nie spowoduje to
konieczności zmiany wartości kolumn
QD]ZDBNXUVX ani LQVWUXNWRU. ywiste,
Obecnie jest dla nas ocz ela była
że jeśli chc emy , by ta tab
Jeśli zmienimy wartość w kolumnie nej, to
w trzeciej postaci normal jdować
LQVWUXNWRU, to zmieni się wartość nie powinna się w niej zna
on.
w kolumnie LQVWUXNWRUBWHOHIRQ. kolumna instruktor_telef
A zatem znaleźliśmy zależność przechodnią.
366 Rozdział 7.
Projektowanie baz z wieloma tabelami
moje_kontakty
id_kontaktu
nazwisko
imie
telefon
email
plec
data_urodzenia
zawod
lokalizacja
wojewodztwo
stan
zainteresowania
szuka
nowej wersji
Podpowiedź: Wktórą znajdziesz na
bazy danych, nie, utworzyliśmy
następnej stro odaliśmy także
(D
osiem tabel. d pocztowy. Bez
kolumnę na ko siedem tabel).
niej mieliśmy
ielu,
moje_kontakty To jest zależność wiele-do-w ci
utworzo na jako dwi e zale żnoś
id_kontaktu ąca.
jeden-do-wielu oraz tabela łącz
nazwisko
imie
telefon
email
Obie kolumny
plec tworzą klucz złożony.
data_urodzenia jeden-do-wielu
kontakt_zainteresowanie
zawod jeden-do-wielu
lokalizacja id_kontaktu zainteresowania
wojewodztwo
id_zainteresowania
stan id_zainteresowania zainteresowanie
zainteresowania
szuka
Wartości id_zainteresowania
anie
moje_kontakty w tabeli kontakt_zainteresow ast
jeden-do-wielu mogą się powtarzać, natomi
ą z tabelą id_kontaktu w tabeli zainteresowanie,
Te trzy tabele tworz ości każda z tych wartości moż
e
kon tak ty zal eżn nazwisko
moje_
kontakt_szuka wystąpić tylko jeden raz.
jeden-do-wielu. imie
telefon id_kontaktu szuka
zawody email
id_szuka
id_zawodu plec
id_szuka szuka
zawod data_urodzenia
zawod_id jeden-do-wielu
Obie kolum
kod_pocztowy kod_pocztowy tworzą klu ny
kod_pocztowy
id_stanu złożony. cz
lokalizacja
wojewodztwo
lu,
ć wiele-do-wie
To jest zależnoś dwie zależności
utworzona jako oraz tabela łącząca.
stan jeden-do-wielu
id_stanu
stan
368 Rozdział 7.
Projektowanie baz z wieloma tabelami
Koniec
Zaostrz ołówek
Rozwiązanie Korzystając z polecenia $/7(5 oraz funkcji 68%675,1*B,1'(;, zmodyfikuj tabelę Grześka w taki
sposób, by miała następujące kolumny:
LGBNRQWDNWX
Przede wszystkim musisz utworzyć nowe kolumny:
$/7(57$%/(PRMHBNRQWDNW\
QD]ZLVNR
$''&2/801]DLQWHUHVRZDQLH9$5&+$5 LPLH
$''&2/801]DLQWHUHVRZDQLH9$5&+$5 WHOHIRQ
$''&2/801]DLQWHUHVRZDQLH9$5&+$5
$''&2/801]DLQWHUHVRZDQLH9$5&+$5 HPDLO
Następnie musisz przenieść pierwsze zainteresowanie do SOHF
„zainteresowanie1”. Możesz to zrobić w następujący sposóbkolumny GDWDBXURG]HQLD
:
83'$7(PRMHBNRQWDNW\ ]DZRG
6(7]DLQWHUHVRZDQLH 68%675,1*B,1'(;]DLQWHUHVRZDQLD
ORNDOL]DFMD
Następnie musimy usunąć pierwsze zainteresowanie z dotychczasowej kolumny ZRMHZRG]WZR
„zainteresowania”, gdyż jest już zapisane w kolumnie „zainteresowanie1”. Dzięki zastosowaniu
odpowiednich funkcji łańcuchowych możemy usunąć z kolumny wszystko od jej początku do VWDQ
miejsca tuż za wystąpieniem pierwszego przecinka: ]DLQWHUHVRZDQLH
Funkcja RIGHT
Funkcja TRIM usunie wszystkie znaki odstę w,
y łańcu cha
pu
znakó
zw
fragment kolumny raca ]DLQWHUHVRZDQLH
znajdujące się z lewej stron „zainteresowania”
jaki uzyskamy po usunięciu z kolumny
tku zaczynając od jej
, ]DLQWHUHVRZDQLH
„zainteresowania” wszystkiego od począ
do pierwszego przecinka.
prawego końca.
]DLQWHUHVRZDQLH
83'$7(PRMHBNRQWDNW\6(7]DLQWHUHVRZDQLD 75,05,*+7]DLQWHUHVRZDQLD V]XND
/(1*7+]DLQWHUHVRZDQLD/(1*7+]DLQWHUHVRZDQLH
jedną
Aby wypełnić ostatnią nową kolumnę, wystarczy przenieść do niej
wartość pozostałą w kolumnie „zainteresowania”:
83'$7(PRMHBNRQWDNW\6(7]DLQWHUHVRZDQLH ]DLQWHUHVRZDQLD
Teraz pozostaje już jedynie usunąć kolumnę „zainteresowania”. Można było także
zmienić nazwę kolumny „zainteresowania” na „zainteresowanie4” i nie dodawać
tej kolumny na samym początku modyfikacji.
370 Rozdział 7.
Rozwiązanie ćwiczenia
Napisz zapytanie, które odnajdzie kandydatki na randkę dla Roberta, przy czym nie uwzględniaj
w nim kolumny ]DLQWHUHVRZDQLD.
Rozwiązanie
ćwiczenia
SELECT * FROM moje_kontakty
ze str. 316 Ogólnie rzecz biorąc, jest to to
WHERE plec = 'K' samo zapytanie, którego Grzesiek
użył, poszukując partnerki dla
AND stan = 'samotna' Wieśka, z tym że pominął w nim
porównywanie zainteresowań.
AND wojewodztwo = 'PM'
AND szuka LIKE '%samotnego%'
AND data_urodzenia > '1950-03-20'
AND data_urodzenia < '1960-03-20'
372 Rozdział 7.
=ïÈF]HQLDLbRSHUDFMHQDZLHOXWDEHODFK
samotna
samotny
NULL
Paweł Sobel
stan prawnik Dajana Kowalczyk
kobiety
samotny zwierzęta,
nauczyciel samotna książki
żonaty
książki, muzyka
mężatka
mężatka
mężczyzny
samotna
Maria Chrapczyńska Grażyna Krawczyk
prawnik
mężczyzny szuka
muzyka
mężczyzny
prawniczka
kobiety
sporty, muzyka
samotny
żonaty kobiety
Jan Jakubiak
Henryk Maksymiuk
zawod prawnik
NULL
programista zwierzęta
prawnik nauczyciel
prawnik
książki
samotny
samotny kobiety
Andrzej Wejherek Jacek Piszczyk
nauczyciel
kobiety
książki
programista
zainteresowania
sporty
książki
mężatka
muzyka
samotny
zwierzęta NULL
Robert Gorczyński sporty Wanda Chlipek
mężczyzny programista
książki,
prawnik sporty
książki
374 Rozdział 8.
Złączenia i operacje na wielu tabelach
Wypełnianie tabel
Dzięki częstemu powtarzaniu się pewnych wartości łatwo
będzie z góry określić początkową zawartość tabel VWDQ, Czy nie
]DZRG, ]DLQWHUHVRZDQLD oraz V]XND. Grzesiek chciałby byłoby dobrze utworzyć
tabelę zawierającą z góry
od razu, jeszcze przed rozpoczęciem korzystania ze swojej
określoną listę wartości?
nowej bazy, wypełnić te tabele wartościami, które już
wcześniej zostały zapisane w tabeli PRMHBNRQWDNW\.
Zaostrz ołówek
Napisz zapytania, które pozwolą Grześkowi pobrać ze starej tabeli PRMHBNRQWDNW\ wartości
kolumn VWDQ, ]DZRG, ]DLQWHUHVRZDQLD oraz V]XND, przy czym prezentowane wartości nie
powinny się powtarzać. Jeśli będziesz potrzebował pomocy, to możesz zajrzeć do rozdziału 6.
i przykładów ze sprzedażą ciasteczek.
Zaostrz ołówek
Rozwiązanie Napisz zapytania, które pozwolą Grześkowi pobrać ze starej tabeli PRMHBNRQWDNW\ wartości
kolumn VWDQ, ]DZRG, ]DLQWHUHVRZDQLD oraz V]XND, przy czym prezentowane wartości nie
powinny się powtarzać. Jeśli będziesz potrzebował pomocy, to możesz zajrzeć do rozdziału 6.
i przykładów ze sprzedażą ciasteczek.
zuli
Następnie zastosowanie klau SELECT szuka FROM moje_kontakty
ORDER BY zwraca wyniki
posortowane alfabetycznie.
GROUP BY szuka
Gdyby klauzule zostały zapisane
ORDER BY szuka;
w innej kolejności, podczas
wykonywania polecenia zostałyb
zgłoszone błędy — klauzula y
ORDER BY zawsze musi być
podawana jako ostatnia. SELECT zainteresowania
FROM moje_kontakty
Ale to zapytanie GROUP BY zainteresowania
wykonane dla kolumny
zainteresowania nie działa ORDER BY zainteresowania
prawidłowo. Pamiętacie, w każdym
wierszu tej kolumny może być
zapisanych więcej niż jedna
wartość.
zainteresowania
książki, sporty
muzyka, zwierzęta, książki
zwierzęta, książki
sporty, muzyka
376 Rozdział 8.
Złączenia i operacje na wielu tabelach
do tej postaci:
zainteresowania
pierwsza Kolumna z naszej
nowej tabeli
druga zainteresowania.
trzecia
czwarta
Zaostrz ołówek
Już wiesz, jak można modyfikować tabele, używając w tym celu polecenia $/7(5. A zatem
dodaj do tabeli PRMHBNRQWDNW\ cztery nowe kolumny. Nadaj im odpowiednio nazwy:
]DLQWHUHVRZDQLH, ]DLQWHUHVRZDQLH, ]DLQWHUHVRZDQLH oraz ]DLQWHUHVRZDQLH.
2GSRZLHGě]QDMG]LHV]QDVWURQLH
83'$7(PRMHBNRQWDNW\
6(7]DLQWHUHVRZDQLH 68%675,1*B,1'(;]DLQWHUHVRZDQLD
Nazwa naszej
ie …interesuje
kolumny. Znak, który będz
poszukiwany nas pierwszy
Wykonaj to polecenie, a uzyskasz następujące wyniki: przecinek.
— przecinek
378 Rozdział 8.
Złączenia i operacje na wielu tabelach
83'$7(PRMHBNRQWDNW\
6(7]DLQWHUHVRZDQLD 68%675]DLQWHUHVRZDQLD/(1*7+]DLQWHUHVRZDQLH
zwraca
łańcucha Funkcja LENGTHą długość
zwraca fragment re śl aj ąc W naszym
pr
Funkcja SUBSTRlumnie. Odczytuje ona liczbę ok ucha długość słow zypadku
zapisanego w ko , odcina od niej początkowy dowolnego łańc ego wynosi 8 zn a „pierwsze”
ny
zawartość kolum ści podanej w nawiasach znaków określon nazwą aków.
fragment o długo część. w nawiasach za
ałą
i zwraca pozost funkcji.
cią
padku wartoś
Czy pamiętasz, że działanie niektórych funkcji W naszym przyz funkcję LENGTH
może być różne w zależności od używanej wersji zwróconą prze ej to liczby dodajemy 2,
języka SQL? SUBSTR jest przykładem właśnie jest 8, do któr efekcie 10.
takiej funkcji. Zajrzyj do jakiegoś naprawdę by uzyskać w st liczbą znaków, jakie
dobrego leksykonu, takiego jak „SQL. Almanach”, A zatem 10 je te z samego początku
ię
by sprawdzić sposób działania tej funkcji zostaną usun ny
wartości kolum
w konkretnej wersji SQL-a. oryginalnej za a.
zainteresowani
Zaostrz ołówek
Wypełnij puste pola i uzupełnij polecenie 83'$7(, którego Grzesiek chce użyć do zmodyfikowania
tabeli. Zapisaliśmy przy nim kilka notatek, aby Ci ułatwić zadanie.
zainteresowań
Podpowiedź: Kolumna każdym
będzie się zm ien iać za
w niej łańcuch
razem, gdyż zapisany w wyniku
ny
znaków będzie skraca TR.
wo łan ia fun kcj i SU BS
wy
83'$7(PRMHBNRQWDNW\6(7
]DLQWHUHVRZDQLH 68%675,1*B,1'(;]DLQWHUHVRZDQLD
]DLQWHUHVRZDQLD 68%675]DLQWHUHVRZDQLD/(1*7+]DLQWHUHVRZDQLH
]DLQWHUHVRZDQLH 68%675,1*B,1'(;
]DLQWHUHVRZDQLD 68%675
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
]DLQWHUHVRZDQLH 68%675,1*B,1'(;
]DLQWHUHVRZDQLD 68%675
]DLQWHUHVRZDQLH
Kiedy już usuniesz z kolumny trzy pierwsze
zainteresowania, to zostanie w niej jedynie czwarte
zainteresowanie. Jaką operację powinieneś wykonać
w tym miejscu?
aniu
Podaj wartości poszczególnych kolumn po wykon
powyższego , dużeg o polece nia SQL.
380 Rozdział 8.
Złączenia i operacje na wielu tabelach
Nic jednak nie stoi na przeszkodzie, byśmy napisali cztery polecenia 6(/(&7
i za ich pomocą pobrali wszystkie wartości zainteresowań.
6(/(&7]DLQWHUHVRZDQLH)520PRMHBNRQWDNW\ 6(/(&7]DLQWHUHVRZDQLH)520PRMHBNRQWDNW\
6(/(&7]DLQWHUHVRZDQLH)520PRMHBNRQWDNW\ 6(/(&7]DLQWHUHVRZDQLH)520PRMHBNRQWDNW\
Brakuje nam już tylko jednego — sposobu na pobranie tych wszystkich danych
i zapisanie ich w naszych nowych tabelach. Operację tę można wykonać nie na
jeden, lecz co najmniej na trzy sposoby!
Wypróbuj to w domu
Przeanalizujmy przykład polecenia 6(/(&7, które napisałeś na stronie 375.
Ćwiczenie
6(/(&7]DZRG)520PRMHBNRQWDNW\*5283%<]DZRG25'(5%<]DZRG
Na kilku następnych stronach przedstawimy TRZY SPOSOBY pozwalające skorzystać z tych poleceń,
by wypełnić naszą nową bazę danych danymi.
Warto pobawić się nieco poleceniami 6(/(&7, ,16(57 oraz &5($7(, by poznać ich możliwości.
W tym ćwiczeniu nie chodzi o to, by osiągnąć cel w najprostszy sposób, lecz by pomyśleć i zastanowić się
nad możliwościami.
ch stronach
Na kilku kolejny wszystkie trzy
przeds ta wi liś my
sanie w tej zawody
sposoby na zapiunikalnych i
tabeli wa rto śc i id_zawodu
alfabetycznie.
posortowanych zawod
LGB]DZRGX,1712718//$872B,1&5(0(1735,0$5<.(<
]DZRG9$5&+$5
,16(57,172]DZRG\]DZRG
6(/(&7]DZRG)520PRMHBNRQWDNW\
*5283%<]DZRG Teraz wypełniamy kolumnę zawod
25'(5%<]DZRG tabeli zawody wartościami
zwrócony mi przez polecenie
SELECT.
382 Rozdział 8.
Złączenia i operacje na wielu tabelach
2. Wydanie polecenia CREATE TABLE wraz z SELECT, a następnie dodanie klucza głównego
A oto drugi sposób: Tworzymy tabelę ]DZRG\, używając do tego celu polecenia
&5($7(7$%/( połączonego z poleceniem 6(/(&7, które pobierze dane
z kolumny zawodów tabeli PRMHBNRQWDNW\. Następnie modyfikujemy tabelę,
dodając do niej klucz główny — w tym celu używamy polecenia $/7(5.
Tworzymy tabelę zawody zawierającą
jedną kolumnę wypełnioną danymi
&5($7(7$%/(]DZRG\$6 zwróconymi przez zapytanie SELECT…
6(/(&7]DZRG)520PRMHBNRQWDNW\
*5283%<]DZRG …po czym modyfikujemy ją
25'(5%<]DZRG poleceniem ALTER, dodając do niej
pole klucza głównego.
$/7(57$%/(]DZRG\
$''&2/801LGB]DZRGX,1712718//$872B,1&5(0(17),567
$''35,0$5<.(<LGB]DZRGX
384 Rozdział 8.
Złączenia i operacje na wielu tabelach
&5($7(7$%/(]DZRG\
LGB]DZRGX,1712718//$872B,1&5(0(1735,0$5<.(< To polecenie robi
dokładnie to samo
]DZRG9$5&+$5 co poprzednie,
$6 jednak dzięki
zastosowaniu nazw
zastępczej znaczn y
6(/(&7]DZRG$6PNB]ZG)520PRMHBNRQWDNW\ łatwiej jest je ie
zrozumieć.
*5283%<PNB]ZG
25'(5%<PNB]ZG Nazwę zastępczą umieść
miejscem, w którym po bezpośrednio za
raz
oryginalnej nazwy kolumny pierwszy używasz
poinformujesz system zar — w ten sposób
danych, by w dalszej czę ządzania bazami
ści polecenia
odwoływał się do danej
kolu
podanej nazwy zastępcze mny, używając
j.
Wyniki zapytania,
zawod Wyniki oryginalnego mk_zwd
w którym zastosowano
programista zapytania, nazwę zastępczą. programista
nauczyciel zawierające kolumnę Nazwa zwróconej nauczyciel
o nazwie zawod. kolumny odpowiada
prawnik nazwie zastępczej. prawnik
kolumny.
*5283%<PNB]ZG
25'(5%<PNB]ZG
386 Rozdział 8.
Złączenia i operacje na wielu tabelach
]DEDZNL FKORSF\
id_zabawki zabawka id_chlopca chlopiec
1 hula-hoop 1 Darek
2 model szybowca 2 Bartek
3 żołnierzyki 3 Daniel
4 harmonijka 4 Rysiek
5 karty z piłkarzami
Złączenie kartezjańskie
Poniższe zapytanie zwraca wyniki kartezjańskie, gdy zażądamy pobrania
kolumny zabawek z tabeli ]DEDZNL oraz kolumny chłopców z tabeli FKORSF\.
Nie istnieją
głupie pytania
P.:Do czego mogłoby mi być potrzebne takie P.: A co się stanie, jeśli połączę w ten sposób
zapytanie? dwie bardzo duże tabele?
O.: Warto wiedzieć o takiej możliwości, gdyż może się zdarzyć, O.: Cóż… uzyskasz gigantyczną ilość wyników. Najlepiej nie
że stosując złączenia, czasami uzyskamy wyniki kartezjańskie. łączyć w ten sposób dużych tabel, gdyż w przeciwnym razie
W takiej sytuacji będziesz wiedział, jak poprawić swoje złączenie. ryzykujemy „zawieszenie” komputera, który będzie musiał
W niektórych sytuacjach ta wiedza naprawdę może się bardzo zwrócić ogromne ilości danych wynikowych.
przydać. Oprócz tego, złączenia kartezjańskie są czasami używane
do testowania szybkości systemu zarządzania relacyjnymi P.: Czy takie zapytanie można zapisać w inny
bazami danych oraz jego konfiguracji. W przypadku stosowania sposób?
wolnych zapytań czasy ich wykonywania można łatwiej określać
i porównywać. O.: Ależ oczywiście. Zamiast słów &5266-2,1 możesz
zapisać przecinek; oto przykład: 6(/(&7FKORSF\FKORSLHF
P.: Załóżmy, że użyłbym zapytania: SELECT * ]DEDZNL]DEDZND)520]DEDZNLFKORSF\.
FROM zabawki CROSS JOIN chłopcy;. Co by się
stało, gdybym zastosował klauzulę SELECT *? P.: Usłyszałem gdzieś terminy „złączenie
wewnętrzne” oraz „złączenie zewnętrzne”.
O.: Sam powinieneś to sprawdzić. Jednak i tak uzyskasz Czy złączenie kartezjańskie to to samo?
w efekcie 20 wierszy; ale tym razem wyniki będą się składać
nie z 2, lecz z 4 kolumn. O.: Złączenie kartezjańskie jest jednym z typów złączeń
wewnętrznych. Najprościej rzecz ujmując, złączenie wewnętrzne
jest złączeniem kartezjańskim, z którego w wyniku zastosowania
warunku podanego w zapytaniu usunięto niektóre wiersze.
ZŁĄCZENIE WEWNĘTRZNE Złączeniami wewnętrznymi będziemy się zajmować na kilku
kolejnych stronach, a zatem pamiętaj o tym.
jest ZŁĄCZENIEM
KRZYŻOWYM, z którego
w wyniku zastosowania
warunku podanego w zapytaniu
usunięto niektóre wiersze.
WYTĘŻ
UMYSŁ
Jak sądzisz, jakie będą wyniki wykonania następującego zapytania:
6(/(&7EFKORSLHFEFKORSLHF
)520FKORSF\$6E&5266-2,1FKORSF\$6E
Spróbuj wykonać to zapytanie.
Zaostrz ołówek
moje_kontakty Oto dwie tabele z nowej bazy danych OLVWDBJU]HVLD — ]DZRG\
id_kontaktu oraz PRMHBNRQWDNW\. Przeanalizuj zapytanie przedstawione
nazwisko
poniżej i w miejscach oznaczonych kropkami zapisz, do czego
według Ciebie służy każdy z wierszy polecenia.
imie
zawody telefon
email
id_zawodu
plec
zawod
data_urodzenia
id_zawodu
kod_pocztowy
id_stanu
6(/(&7PNQD]ZLVNR
PNLPLH
]]DZRG
)520PRMHBNRQWDNW\$6PN
,11(5-2,1
]DZRG\$6]
21PNLGB]DZRGX ]LGB]DZRGX
390 Rozdział 8.
Złączenia i operacje na wielu tabelach
Janina Wielicka
samotna
4.3.1978
Wrocław, DS
artystka Tamara Barańska
kobieta mężatka
janka@potegawizji.net.pl 9.1.1970
owanie
żeglarstwo, spacery, got Gdańsk, PM
Paweł Sobczyk
żonaty
12.10.1980
Warszawa, MZ
nauczyciel
mężczyzna
ps@niebianskaplaza.org.pl
psy, speleologia
555 555-9876
Zaostrz ołówek
Rozwiązanie moje_kontakty Oto dwie tabele z nowej bazy danych OLVWDBJU]HVLD — ]DZRG\
id_kontaktu oraz PRMHBNRQWDNW\. Przeanalizuj zapytanie przedstawione
nazwisko
poniżej i w miejscach oznaczonych kropkami zapisz, do czego
według Ciebie służy każdy z wierszy polecenia.
imie
zawody telefon
email
id_zawodu
plec
zawod
data_urodzenia
id_zawodu
kod_pocztowy
id_stanu
392 Rozdział 8.
Złączenia i operacje na wielu tabelach
Dowolne kolumny,
jakich potrzebujemy.
6(/(&7MDNLHVBNROXPQ\
)520WDEHOD
Pominęliśmy nazwy
,11(5-2,1 zastępcze, by uprościć
kod polecenia.
Tu można takżo
e
WDEHOD
umieścić słowERE.
kluczowe WH 21MDNLVBZDUXQHN
W tym warunku można
zastosować dowolny
operator porównania.
FKORSF\ ]DEDZNL
id_chlopca chlopiec id_zabawki id_zabawki zabawka
1 Darek 3 1 hula-hoop
2 Bartek 5 2 model szybowca
3 Daniel 2 3 żołnierzyki
4 Rysiek 1 4 harmonijka
5 karty z piłkarzami
FKORSF\ ]DEDZNL
id_chlopca chlopiec id_zabawki id_zabawki zabawka
1 Darek 3 1 hula-hoop
2 Bartek 5 2 model szybowca
3 Daniel 2 3 żołnierzyki
4 Rysiek 1 4 harmonijka
5 karty z piłkarzami
owa.
Oto nasza tabela wynik glibyśmy
mo
Gdybyśmy chcieli, to uzulę chlopiec zabawka
dodać do zapytania kla piec.
Rysiek hula-hoop
ORDER BY chłopcy.chlo
Daniel model szybowca
Darek żołnierzyki
Bartek karty z piłkarzami
394 Rozdział 8.
Złączenia i operacje na wielu tabelach
Zaostrz ołówek
Napisz zapytania wykorzystujące złączenie równościowe do pobierania opisanych poniżej
informacji z bazy danych Grześka.
Zapytanie, które zwraca adres poczty elektronicznej i zawód każdej osoby zapisanej w tabeli PRMHBNRQWDNW\.
Zapytanie, które zwraca imię, nazwisko oraz stan cywilny każdej osoby zapisanej w tabeli PRMHBNRQWDNW\.
Zapytanie, które zwraca imię, nazwisko oraz województwo każdej osoby zapisanej w tabeli PRMHBNRQWDNW\.
moje_kontakty kontakt_zainteresowanie
zawody
id_kontaktu id_kontaktu
id_zawodu
zawod nazwisko
zainteresowania
imie
id_zainteresowania id_zainteresowania
kod_pocztowy telefon
zainteresowanie
kod_pocztowy email
lokalizacja plec
kontakt_szuka
wojewodztwo data_urodzenia
id_kontaktu
id_zawodu
stan szuka
kod_pocztowy
id_stanu id_szuka id_szuka
id_stanu szuka
stan
Zaostrz ołówek
Rozwiązanie Napisz zapytania wykorzystujące złączenie równościowe do pobierania opisanych poniżej
informacji z bazy danych Grześka.
Zapytanie, które zwraca adres poczty elektronicznej i zawód każdej osoby zapisanej w tabeli PRMHBNRQWDNW\.
Zapytanie, które zwraca imię, nazwisko oraz stan cywilny każdej osoby zapisanej w tabeli PRMHBNRQWDNW\.
Zapytanie, które zwraca imię, nazwisko oraz województwo każdej osoby zapisanej w tabeli PRMHBNRQWDNW\.
moje_kontakty kontakt_zainteresowanie
zawody
id_kontaktu id_kontaktu
id_zawodu
zawod nazwisko
zainteresowania
imie
id_zainteresowania id_zainteresowania
kod_pocztowy telefon
zainteresowanie
kod_pocztowy email
lokalizacja plec
kontakt_szuka
wojewodztwo data_urodzenia
id_kontaktu
id_zawodu
stan szuka
kod_pocztowy
id_stanu id_szuka id_szuka
id_stanu szuka
stan
396 Rozdział 8.
Złączenia i operacje na wielu tabelach
6(/(&7FKORSF\FKORSLHF]DEDZNL]DEDZND
)520FKORSF\ Operator „różny”. To właśnie
,11(5-2,1
ta część złączenia jest
odpowiedzialna za jego
„różnościowy” charakter.
Posortowanie
wyników ułatwi ich
]DEDZNL
późniejszą analizę. 21FKORSF\LGB]DEDZNL!]DEDZNLLGB]DEDZNL
25'(5%<FKORSF\FKORSLHF
FKORSF\ ]DEDZNL
id_chlopca chlopiec id_zabawki id_zabawki zabawka
1 Darek 3 1 hula-hoop
2 Bartek 5 2 model szybowca
3 Daniel 2 3 żołnierzyki
4 Rysiek 1 4 harmonijka
5 karty z piłkarzami
chlopiec zabawka
Daniel hula-hoop
Oto cztery zabawki,
Daniel żołnierzyki których Daniel nie ma.
Daniel harmonijka
Daniel karty z piłkarzami
Bartek żołnierzyki
Bartek harmonijka
Bartek hula-hoop
Bartek model szybowca
Darek
Darek
hula-hoop
model szybowca
RÓŻNOŚCIOWE
Darek harmonijka złączenia wewnętrzne
Darek karty z piłkarzami
Rysiek model szybowca wykorzystują
Rysiek żołnierzyki
Rysiek harmonijka warunek różny od.
Rysiek karty z piłkarzami
6(/(&7FKORSF\FKORSLHF]DEDZNL]DEDZND
)520FKORSF\
1$785$/-2,1
]DEDZNL
FKORSF\ ]DEDZNL
id_chlopca chlopiec id_zabawki id_zabawki zabawka
1 Darek 3 1 hula-hoop
2 Bartek 5 2 model szybowca
3 Daniel 2 3 żołnierzyki
4 Rysiek 1 4 harmonijka
5 karty z piłkarzami
Zaostrz ołówek
Napisz zapytania wykorzystujące złączenie naturalne lub różnościowe do pobierania opisanych
poniżej informacji z bazy danych Grześka.
Zapytanie, które zwraca adres poczty elektronicznej i zawód każdej osoby zapisanej w tabeli PRMHBNRQWDNW\.
Zapytanie, które zwraca imię, nazwisko oraz stan cywilny, którego nie mają poszczególne osoby zapisane w tabeli PRMHBNRQWDNW\.
Zapytanie, które zwraca imię, nazwisko oraz województwo każdej osoby zapisanej w tabeli PRMHBNRQWDNW\.
moje_kontakty kontakt_zainteresowanie
zawody
id_kontaktu id_kontaktu
id_zawodu
zawod nazwisko
zainteresowania
imie
id_zainteresowania id_zainteresowania
kod_pocztowy telefon
zainteresowanie
kod_pocztowy email
lokalizacja plec
kontakt_szuka
wojewodztwo data_urodzenia
id_kontaktu
id_zawodu
stan szuka
kod_pocztowy
id_stanu id_szuka id_szuka
id_stanu szuka
stan
Zaostrz ołówek
Rozwiązanie Napisz zapytania wykorzystujące złączenie naturalne lub różnościowe do pobierania opisanych
poniżej informacji z bazy danych Grześka.
Zapytanie, które zwraca adres poczty elektronicznej i zawód każdej osoby zapisanej w tabeli PRMHBNRQWDNW\.
Zapytanie, które zwraca imię, nazwisko oraz stan cywilny, którego nie mają poszczególne osoby zapisane w tabeli PRMHBNRQWDNW\.
moje_kontakty kontakt_zainteresowanie
zawody
id_kontaktu id_kontaktu
id_zawodu
zawod nazwisko
zainteresowania
imie
id_zainteresowania id_zainteresowania
kod_pocztowy telefon
zainteresowanie
kod_pocztowy email
lokalizacja plec
kontakt_szuka
wojewodztwo data_urodzenia
id_kontaktu
id_zawodu
stan szuka
kod_pocztowy
id_stanu id_szuka id_szuka
id_stanu szuka
stan
400 Rozdział 8.
Złączenia i operacje na wielu tabelach
Ñ Ñ
KTO CO ROBI?
Ñ
złączenie równościowe
Zwracam uwagę na kolejność, w jakiej
zostały złączone tabele.
Ñ Ñ
KTO CO ROBI?
Ñ
ROZWIĄZANIE
Dopasuj każde ze złączeń podanych w lewej kolumnie
z opisami ich funkcjonowania zapisanymi w kolumnie
prawej. Z każdym opisem może być połączonych więcej
niż jeden typ złączenia.
złączenie równościowe
Zwracam uwagę na kolejność, w jakiej
zostały złączone tabele.
e opiszemy
To zagadnieni
10.
w rozdziale
złączenie krzyżowe Zwracam wszystkie wiersze, gdy kolumna
z pierwszej tabeli odpowiada kolumnie
z drugiej tabeli; a oprócz tego używam
słowa kluczowego 21.
złączenie zewnętrzne
Łączę dwie tabele, które mają kolumnę
o tej samej nazwie.
złączenie różnościowe
402 Rozdział 8.
Złączenia i operacje na wielu tabelach
Napisz dwa zapytania, każde wykorzystujące inny rodzaj złączenia, które zwrócą pasujące do siebie wiersze tabel
PRMHBNRQWDNW\ oraz NRQWDNWB]DLQWHUHVRZDQLH.
Napisz zapytanie, które zwróci wszystkie możliwe kombinacje wierszy z tabel NRQWDNWBV]XND oraz V]XND.
Utwórz listę zawodów, w jakich pracują osoby zapisane w tabeli PRMHBNRQWDNW\; zawody na liście nie mogą się
powtarzać i mają być posortowane alfabetycznie.
moje_kontakty kontakt_zainteresowanie
zawody
id_kontaktu id_kontaktu
id_zawodu
zawod nazwisko
zainteresowania
imie
id_zainteresowania id_zainteresowania
kod_pocztowy telefon
zainteresowanie
kod_pocztowy email
lokalizacja plec
kontakt_szuka
wojewodztwo data_urodzenia
id_kontaktu
id_zawodu
stan szuka
kod_pocztowy
id_stanu id_szuka id_szuka
id_stanu szuka
stan
Napisz dwa zapytania, każde wykorzystujące inny rodzaj złączenia, które zwrócą pasujące do siebie wiersze tabel
PRMHBNRQWDNW\ oraz NRQWDNWB]DLQWHUHVRZDQLH.
Napisz zapytanie, które zwróci wszystkie możliwe kombinacje wierszy z tabel NRQWDNWBV]XND oraz V]XND.
Utwórz listę zawodów, w jakich pracują osoby zapisane w tabeli PRMHBNRQWDNW\; zawody na liście nie mogą się
powtarzać i mają być posortowane alfabetycznie.
moje_kontakty kontakt_zainteresowanie
zawody
id_kontaktu id_kontaktu
id_zawodu
zawod nazwisko
zainteresowania
imie
id_zainteresowania id_zainteresowania
kod_pocztowy telefon
zainteresowanie
kod_pocztowy email
lokalizacja plec
kontakt_szuka
wojewodztwo data_urodzenia
id_kontaktu
id_zawodu
stan szuka
kod_pocztowy
id_stanu id_szuka id_szuka
id_stanu szuka
stan
404 Rozdział 8.
Złączenia i operacje na wielu tabelach
Nie istnieją
głupie pytania
P.: Czy można łączyć ze sobą więcej niż dwie P.:Czy to oznacza, że zapytania ze złączeniami
tabele? wewnętrznymi można zapisywać w inny sposób?
O.: Można; zajmiemy się tym zagadnieniem w dalszej części O.:Owszem, można. Jeśli jednak zrozumiesz składnię poleceń
książki. Na razie skoncentrujemy się na wyjaśnieniu pojęcia prezentowaną w tej książce, to przestawienie się na inną
złączenia. składnię nie przysporzy Ci najmniejszych problemów. Idea
P.:
złączenia jest bowiem znacznie bardziej złożona i trudna
Czy złączenia nie powinny być nieco bardziej niż stosowanie słów kluczowych :+(5( lub 21.
skomplikowane?
P.:
O.:
Zauważyłem, że zastosowaliście w złączeniu
Kiedy zaczniesz stosować złączenia i nazwy zastępcze, klauzulę ORDER BY. Czy to oznacza,
tworzone polecenia SQL przestaną już w tak dużym stopniu że w zapytaniach ze złączeniami można także
przypominać codzienny, naturalny język. Także stosowanie stosować inne klauzule SQL-a?
uproszczonych form zapisu (takich jak zastępowanie słów
kluczowych INNER JOIN przecinkiem) może dodatkowo utrudnić O.:Tak. Nic nie stoi na przeszkodzie, byś używał klauzul
zrozumienie zapytań. Dlatego też w niniejszej książce będziemy *5283%<, :+(5( oraz takich funkcji jak 680 albo $9*.
raczej stosowali pełne — dłuższe formy zapisu poleceń SQL.
Złączone zapytania?
Grzesiek powoli zaczyna doceniać złączenia. Zaczyna także
rozumieć, że rozdzielenie danych na wiele różnych tabel ma głęboki
sens, a jeśli struktura tych tabel jest prawidłowo zaprojektowana,
to korzystanie z nich nie stanowi problemu. Grzesiek zaczął nawet
myśleć o rozbudowie swojej bazy danych.
8KdacdK]^¢ZMdO^KLOVSUYV_WXLOd^KTOWXSM
Tematem dzisiejszego wywiadu jest:
Dlaczego się ukrywacie?
Rusz głową!: Witamy w programie Nazwę Zastępczą NZK: Dodaj jeszcze NZT, że mnie także pomagasz
Tabeli oraz Nazwę Zastępczą Kolumny. Cieszę się, w tych złączeniach.
że mogłyście przyjść obie. Nam nadzieję, że spotkanie
z wami sporo nam wyjaśni. Rusz głową!: Nie rozumiem. Czy możecie mi to pokazać
na jakimś przykładzie?
Nazwa Zastępcza Tabeli: Właśnie, my również się
cieszymy, że mogłyśmy tu przyjść. A tak w ogóle, dla NZT: Jasne; mogę ci pokazać kod. Mam nadzieję,
ułatwienia, możesz nas nazywać NZT i NZK; oczywiście że na jego przykładzie stanie się jasne, do czego służę:
tylko podczas tego wywiadu [śmiech].
6(/(&7PNQD]ZLVNRPNLPLH]]DZRG
Rusz głową!: Cha, cha! Bez wątpienia to będzie właściwe.
No dobrze, NZK, zacznijmy od ciebie. Wyjaśnij nam, )520PRMHBNRQWDNW\$6PN
po co te wszystkie tajemnice? Czy próbujesz coś ukryć? ,11(5-2,1
Nazwa Zastępcza Kolumny: Ależ oczywiście, że nie ]DZRG\$6]
próbuję! Jeśli miałam jakikolwiek cel, to była nim wyłącznie
chęć uproszczenia poleceń. Sądzę, że mogę to powiedzieć :+(5(PNLGBNRQWDNWX ]LGB]DZRGX
w imieniu nas obu, prawda NZT?
Rusz głową!: Rozumiem! Dzięki tobie wszędzie, gdzie
NZT: Jasne. W przypadku NZK jej zamiary i motywacja musiałbym wpisywać PRMHBNRQWDNW\, mogę teraz wpisać
powinny już być zrozumiałe. Po prostu zmienia długie PN. A zamiast ]DZRG\ — po prostu ]. To znacznie prostsze.
i powtarzające się nazwy kolumn na coś, co łatwo Takie rozwiązanie naprawdę jest bardzo przydatne, gdy
zastosować. Czyli ułatwia życie. Oprócz tego NZK sprawia, w zapytaniu trzeba kilka razy używać nazw dwóch tabel.
że nazwy kolumn w tabelach wynikowych mogą być takie,
jak chcecie. W moim przypadku sprawa wygląda natomiast NZT: Zwłaszcza jeśli tabele mają podobne nazwy.
nieco inaczej. Ułatwienie zrozumienia zapytań nie tylko pomaga w ich
tworzeniu, lecz także pomaga zapamiętać, co one robią,
Rusz głową!: Muszę przyznać, NZT, że twojej problematyki
i poprawiać lub modyfikować je po jakimś czasie.
nie znam aż tak dobrze. Widziałem, że się pojawiasz
w zapytaniach i radzisz sobie doskonale, ale tak do końca Rusz głową!: Dziękuję wam bardzo, NZT i NZK.
to nie wiem, co właściwie robisz. Nawet jeśli pojawisz Było mi… zaraz, a gdzie one zniknęły?
się w poleceniu SQL, to w wynikach nigdy nie można cię
zauważyć.
NZT: No tak, to prawda. Jednak z tego, co widzę,
to jeszcze nie zrozumiałeś mojego prawdziwego
przeznaczenia.
Rusz głową!: Prawdziwego przeznaczenia? Brzmi
intrygująco. Powiedz coś więcej na ten temat, proszę.
NZT: Bo widzisz, ja istnieję po to, by ułatwić tworzenie
złączeń.
406 Rozdział 8.
Rozwiązania ćwiczeń
Zaostrz ołówek
Rozwiązanie Już wiesz, jak można modyfikować tabele, używając w tym celu polecenia $/7(5. A zatem
dodaj do tabeli PRMHBNRQWDNW\ cztery nowe kolumny. Nadaj im odpowiednio nazwy:
ze str. 378 ]DLQWHUHVRZDQLH, ]DLQWHUHVRZDQLH, ]DLQWHUHVRZDQLH oraz ]DLQWHUHVRZDQLH.
Zaostrz ołówek
Rozwiązanie Wypełnij puste pola i uzupełnij polecenie 83'$7(, którego Grzesiek chce użyć do zmodyfikowania
tabeli. Zapisaliśmy przy nim kilka notatek, aby Ci ułatwić zadanie.
ze str. 380
Różnica pomiędzy funkcjami SUBSTRING_INDEX oraz
SUBSTR polega na tym, że pierwsza z nich szuka jednego
łańcucha znaków *wewnątrz* drugiego — w tym przypadku
szuka przecinka w kolumnie zainteresowań — i zwraca
wszystko, co znajdowało się przed nim. Z kolei funkcja
SUBSTR skraca długość łańcucha — w tym przypadku
skraca zawartość kolumny zainteresowań, zostawiając w niej
jedynie to, co jest zapisane za pierwszym zainteresowaniem,
przecinkiem i odstępem (dlatego pojawiło się wyrażenie +2).
83'$7(PRMHBNRQWDNW\6(7
]DLQWHUHVRZDQLH 68%675,1*B,1'(;]DLQWHUHVRZDQLD
]DLQWHUHVRZDQLD 68%675]DLQWHUHVRZDQLD/(1*7+]DLQWHUHVRZDQLH
zainteresowania, ',', 1
]DLQWHUHVRZDQLH 68%675,1*B,1'(;
]DLQWHUHVRZDQLD 68%675zainteresowania,
LENGTH
(zainteresowanie2)+2
]DLQWHUHVRZDQLH 68%675,1*B,1'(;zainteresowania,
',', 1
]DLQWHUHVRZDQLD 68%675zainteresowania,
LENGTH
(zainteresowanie3)+2
]DLQWHUHVRZDQLH zainteresowania;
Kiedy z kolumny usunęliśmy trzy pierw
w niej jedynie ostatnie — czwarte. sze zainteresowania, zostało
Po wykonaniu powyższego Ten wiersz odpowiada zatem
zwyczajnemu przeniesieniu wartości
polecenia oryginalna kolumna dobrze mogliśmy pominąć tworzenie do innej kolumny. Równie
zainteresowania będzie pusta. nowe
zainteresowania i zmienić nazwę orygi j kolumny dla czwartego
nalnej kolumny zainteresowań.
Przybornik SQL
Właśnie skończyłeś przerabiać
52='=,$
2,1
,11(5 - en ie zawiera
jące
złą cz
Dowolne obu tabel
ze z
wiers ce jakiś
i wykor
zystują
. =ïÈF]HQLH.5=<¿2:(
logiczny &5266-2,1
warunek
Zwraca każdy wiersz
z pierwszej tabeli, połączony
1$785$/ -2,1 kolejno z każdym wierszem
że
Złączenie wewnętrzn z drugiej tabeli. Znane tak
e, w którym pod wieloma innym i nazwami,
pominięto klauzulę ON
. Działa takimi jak: ZŁĄCZENIE
jedynie w przypadku,
łączone tabele zawiera
gdy KARTEZJAŃSKIE oraz
.
o takiej samej nazw
ją kolumnę ZŁĄCZENIE BEZ ZŁĄCZENIA
ie.
=ïÈF]HQL
H = 3 5=(&,1.,
To samo (0
2:(
=ïÈF]HQLH 5:12¥&,
co złącze
KRZYŻO nie
L 5¿12¥&,2:(
WE, z ty
słów kluc m że zam
zowych C iast
eń
To dwa rodzaje złącz w zapyta
niu jest
ROSS JO
IN
ych. Pierws ze z nich przecinek zapisywa
wewnętrzn . ny
re są sobie
zwraca wiersze, któ
wiersze,
równe, a drugie —
ne.
które są od siebie róż
408 Rozdział 8.
3RG]DS\WDQLD
Zapytania w zapytaniach
Czy ktokolwiek inny zauważy,
że jestem pełna… (ach…
jakie słowo by to właściwie
oddało? Smaku? Blasku?
Urody?)
410 Rozdział 9.
Podzapytania
na Nowe, poszukiw
Informacje ącego zatrudnienie.
ane Aktualnie dostępne
temat bież a. oferty pracy.
zatrudnieni
dyspozycyjnosc opis
lat_doswiadczenia
kontakt_zainteresowanie zainteresowania
id_kontaktu id_zainteresowania
moje_kontakty
zawody id_kontaktu zainteresowanie
STARE TABELE
3RV]XNLZDQ\
7ZöUFD VWURQ
=DWUXGQLP\ WZ :::
öUFÚ VWURQ ::
]QDMRPRĂFLÈ MÚ : ] GRVNRQDïÈ
]\NöZ +70/ L
]HVSROH LQWHUD &66 GR SUDF\
NFML L SURMHN Z QDV]\P
7R ZVSDQLDïD WRZDQLD ZL]XDO
RND]MD GOD NR QHJR
ZLHONLH ]QDF]H JRĂ NWR SU]\
QLH GR VWDQGD Nï DG D
L FKFH ]DEï\V UGöZ LQWHUQHW
QÈÊ Z GXĝHM L RZ\FK
3UDFXM Z QLH] OLF]ÈFHM VLÚ
Z\NOH ZSï\ZRZH ILUPLH
SU]H] LQWHOLJH M ILUPLH NLHU
QWQ\FK OXG]L RZDQHM
FR URELÈ NWöU]\ XZLHOE
LDMÈ WR
=DURENL
ļ ]ï
'RĂZLDGF]HQLH
FR QDMPQLHM
ODW Z EUDQ
ĝ\
412 Rozdział 9.
Podzapytania
Zaostrz ołówek
Napisz zapytanie, które pobierze z bazy osoby pasujące do oferty przedstawionej na poprzedniej stronie.
A to stawka, jaką
dana osoba ma
nadzieję otrzymać.
6(/(&7VWDQRZLVNR)520SUDFDBDNWXDOQD
stanowisko
To tylko kilka stanowisk
*5283%<VWDQRZLVNR25'(5%<VWDQRZLVNR fryzjer zapisanych w tabeli
kelner praca_aktualna.
kucharz
Stosujemy klauzulę
GROUP BY, by każde projektant stron WWW
stanowisko pojawiło
raz. Oprócz tego sor się w wynikach tylko Wyniki twórca stron WWW
tuj
stanowiska alfabetyc emy wszystkie
znie.
Zaostrz ołówek
Rozwiązanie Napisz zapytanie, które pobierze z bazy osoby pasujące do oferty.
e informacje
Musimy pobrać jedyni , że te
kontaktowe, gdyż wiemy stanowisku
osoby szukają pracy na
twórcy stron WWW.
414 Rozdział 9.
Podzapytania
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
:+(5(
SDVWDQRZLVNR,1
NXFKDU]
IU\]MHU
NHOQHU
SURMHNWDQWVWURQ:::
WZRUFDVWURQ:::
WYSIL
SZARE KOMÓRKI
Spróbuj połączyć te dwa zapytania w jedno. Propozycję tego zapytania zapisz poniżej.
Podzapytania
Aby w jednym zapytaniu wykonać te same operacje, które Grzesiek wykonał, używając
dwóch poleceń SQL, będziemy musieli skorzystać z podzapytania — czyli zapytania
umieszczanego wewnątrz innego zapytania.
zapytanie ZEWNĘTRZNE
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
:+(5(
SDVWDQRZLVNR,1
NXFKDU]
IU\]MHU
NHOQHU
SURMHNWDQWVWURQ:::
WZRUFDVWURQ:::
416 Rozdział 9.
Podzapytania
= zapytanie z podzapytaniem
e Dwa połączone
ętrzn zapytania tworzą
zewn
p y t anie zapytanie
Za z podzapytaniem.
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
:+(5(SDVWDQRZLVNR,16(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
Anatomia zapytania
wewnętrznego
sami
Zapytanie zewnętrzne. Cza
nazywane także zapytaniem
zawierającym.
6(/(&7MDNDVBNROXPQDLQQDBNROXPQD
)520WDEHOD
:+(5(NROXPQD 6(/(&7NROXPQD)520WDEHOD
Zapytanie wewnętr
zne
lub podzapytanie.
Zapytanie zewnętrzne.
6(/(&7MDNDVBNROXPQDLQQDBNROXPQD
)520WDEHOD
:+(5(NROXPQD 6(/(&7NROXPQD)520WDEHOD
Zapytanie wewnętr
zne.
418 Rozdział 9.
Podzapytania
Podzapytanie w działaniu
A teraz przyjrzyjmy się i zobaczmy, jak wygląda podobne zapytanie w akcji.
Nasze zapytanie zewnętrzne będzie operować na tabeli PRMHBNRQWDNW\,
a podzapytanie — na tabeli NRGBSRF]WRZ\. System zarządzania bazą danych
w pierwszej kolejności pobierze wartość skalarną z tabeli NRGBSRF]WRZ\,
a następnie porówna ją z kolumnami podanymi w klauzuli :+(5( zapytania
zewnętrznego.
6(/(&7NRGBSRF]WRZ\)520
NRGBSRF]WRZ\:+(5(ORNDOL]DFMD
:URFODZ
$1'ZRMHZRG]WZR
'6
wartość
6(/(&7QD]ZLVNRLPLH
)520PRMHBNRQWDNW\
:+(5(NRGBSRF]WRZ\ 6(/(&7NRGBSRF]WRZ\)520
NRGBSRF]WRZ\:+(5(ORNDOL]DFMD
:URFODZ
$1'ZRMHZRG]WZR
'6
To zapytanie zwraca listę
nazwisk i imion osób
zamieszkałych we Wrocław
w województwie dolnoślą iu
skim.
Nie istnieją
głupie pytania
P.: A dlaczego nie mogę umieścić tego warunku Powyższe zapytanie możesz także zapisać w następujący sposób:
w złączeniu? 6(/(&7QD]ZLVNRLPLH)520
O.: Możesz. Jednak wiele osób uważa, że łatwiej jest napisać PRMHBNRQWDNW\PN
1$875$/-2,1NRGBSRF]WRZ\NS
podzapytanie niż złączenie dające identyczne rezultaty. A poza
tym fajnie jest mieć możliwość wyboru składni, jakiej możemy :+(5(NSORNDOL]DFMD
:URFODZ
użyć. $1'NSZRMHZRG]WZR
'6
=DS\WDQLH=HZQÚWU]QH =DS\WDQLH:HZQÚWU]QH
420 Rozdział 9.
Podzapytania
Reguły podzapytań
Reguły podzapytań
Podzapytanie zawsze jest Podzapytania mogą się pojawić
pojedynczym poleceniem ................... w czterech różnych miejscach
na
zapytań: w klauzuli ....................,
jako
......................... polecenia SELECT
Podzapytania zawsze są umieszczane ......
jedna z kolumn, w klauzuli ..........
wewnątrz .......................................... ...
oraz klauzuli ...................................
Reguły podzapytań
Reguły podzapytań
Podzapytanie zawsze jest Podzapytania mogą się pojawić
SELECT.
pojedynczym poleceniem ................... w czterech różnych miejscach zapytań:
SELECT
w klauzuli ............................., na
LIŚCIE KOLUMN polecenia
........................................
Podzapytania zawsze są umieszczane SELECT jako jedna z kolumn, w klauzuli
NAWIASÓW.
wewnątrz .......................................... FROM oraz klauzuli ......................
.................. HAVING.
Nie istnieją
głupie pytania
P.: Co zatem może zwracać zapytanie wewnętrzne? P.: Ciągle nie jestem pewny, czy podzapytanie może
No i, co równie ważne, co może zwracać zapytanie zwracać jedną wartość, czy grupę wartości. Co na ten
zewnętrzne? temat mówią oficjalne reguły?
O.: W większości przypadków zapytanie wewnętrzne może zwracać O.: Ogólnie rzecz biorąc, podzapytanie musi zwracać pojedynczą
tylko jedną wartość — czyli jedną kolumnę z jednym wierszem. wartość. Przypadek z zastosowaniem operatora ,1 jest wyjątkiem.
Zapytanie zewnętrzne może następnie użyć tej wartości i porównać ją W większości przypadków podzapytania muszą zwracać pojedynczą
ze wszystkimi innymi wartościami w kolumnie. wartość, w przeciwnym razie nie będą działały prawidłowo.
P.: Dlaczego piszecie o „pojedynczej wartości”, skoro P.: A co się stanie, jeśli podzapytanie zwróci więcej
zapytanie przedstawione na stronie 418 zwraca całą niż jedną wartość, a jednocześnie nie będzie użyte
kolumnę zawierającą wiele wartości? w klauzuli WHERE zawierającej zbiór wartości?
O.: Ponieważ operator ,1 operuje na zbiorze wartości. Gdybyś O.: W takim przypadku nastąpi chaos! Masowa destrukcja
użył operatora równości (=), jak w ćwiczeniu „Anatomia zapytania na wielką skalę. A tak naprawdę to zostanie zgłoszony błąd.
wewnętrznego”, to mógłbyś porównywać tylko pojedynczą wartość.
422 Rozdział 9.
Podzapytania
6(/(&7PNLPLH$6LPLHPNQD]ZLVNR$6QD]ZLVNR
PNWHOHIRQ$6WHOHIRQSDVWDQRZLVNR$6VWDQRZLVNR
Kolumna telefon tabeli )520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
moje_kontakty będzie
identyfikow ana :+(5(VWDQRZLVNR,16(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
w wynikach przy użyciu Pamiętaj,
nazwy zastępczej że słowo kluczowe
„telefon”. I tak dalej… AS jest opcjonalne.
chyba już rozumiesz! Oznacza to,
że tworząc nazwy
Oto wyniki zwrócon zastępcze, możesz
przez zapytanie. e je pominąć.
Co więcej, ponieważ nazwy
Zwróć uwagę, w jakim są tymczasowe, ich zastoso zastępcze
stopniu zastosowanie nie ma żadnego wpływu na wanie
nazw zastępczych ułatwiło nazwy kolumn w obu tabelacfaktyczne
li.
zrozumienie zawartości tabe h.
Kto z zarejestrowanych
osób zarabia najwięcej?
Podział pytania.
424 Rozdział 9.
Podzapytania
6(/(&7PNLPLHPNQD]ZLVNR
)520PRMHBNRQWDNW\$6PN Pobieramy imię i na
zwisko.
6(/(&7PNLPLHPNQD]ZLVNRSDSHQVMD RAL
Zastosuj złączenie NATU
)520PRMHBNRQWDNW\$6PN JOIN, by pob rać zar obk i
poszczególnych osób.
1$785$/-2,1SUDFDBDNWXDOQD$6SD
6(/(&7PNLPLHPNQD]ZLVNRSDSHQVMD
)520PRMHBNRQWDNW\$6PN1$785$/-2,1SUDFDBDNWXDOQD$6SD
:+(5(SHQVMD
6(/(&70$;SDSHQVMD)520SUDFDBDNWXDOQDSD
ść zapytania, która
A to jest pierwsza czę
yła nam jako podzapytanie
właśnie posłuż ksymalną wartość pensji. To Maciek? Powinienem się
pozwalające określ ić ma
ywa na z wynikami domyślić… Nigdy nie płacił za
Ta wartość jest porówn i pozwala określić
zap yta nia zew nęt rzn ego rachunki, które mu wystawiałem.
ostateczne wyniki.
WYSIL
SZARE KOMÓRKI
Napisz inne zapytanie, które także wskaże pośród kontaktów Grześka osobę,
która zarabia najwięcej.
Słusznie.
A może byś tak zajrzał do wywiadu „SQL bez
tajemnic” zamieszczonego na stronie 430?
426 Rozdział 9.
Podzapytania
6(/(&7PNLPLHPNQD]ZLVNR
6(/(&7ZRMHZRG]WZR
)520NRGBSRF]WRZ\
:+(5(PNNRGBSRF]WRZ\ NRGBSRF]WRZ\$6ZRMHZRG]WZR
)520PRMHBNRQWDNW\$6PN
6(/(&7SDSHQVMD
To zapytanie zwróci jed
)520PRMHBNRQWDNW\PN1$785$/-2,1SUDFDBDNWXDOQDSD ną
wartość zawierającą wys
pensji Andrzeja. okość
:+(5(HPDLO
DQGU]HM#SL]]DQ]NFRPSO
6(/(&7PNLPLHPNQD]ZLVNRSDSHQVMD
)520
PRMHBNRQWDNW\$6PN1$785$/-2,1SUDFDBDNWXDOQD$6SD
:+(5(
SDSHQVMD!78:67$:,0<3(16-}$1'5=(-$
428 Rozdział 9.
Podzapytania
Podzapytania nieskorelowane
Obok przedstawiliśmy zapytanie powstałe poprzez połączenie Pobieramy imię,
opisanych wcześniej elementów. System zarządzania bazą danych nazwisko i pensję.
w pierwszej kolejności jeden raz wykonuje zapytanie
wewnętrzne, a następnie posługuje się zwróconą
przez nie wartością do określenia wyników 6(/(&7PNLPLHPNQD]ZLVNRSDSHQVMD
zapytania zewnętrznego.
)520
ą
System zarządzania bazść
danych wykonuje tę czę PRMHBNRQWDNW\$6PN1$785$/-2,1SUDFDBDNWXDOQD$6SD
zapytania jako drugą.
:+(5(
Interesują nas wyłącznie
osoby o zarobkach wyższych SDSHQVMD!6(/(&7SDSHQVMD
niż zarobki Andrzeja.
System zarządzania bazą danych
)520PRMHBNRQWDNW\PN1$785$/-2,1SUDFDBDNWXDOQDSD
przetwarza te dwa zapytania
niezależnie od siebie. :+(5(HPDLO
DQGU]HM#SL]]DQ]NFRPSO
=;6LOd^KTOWXSM
Temat dzisiejszego wywiadu:
Wybór optymalnego sposobu realizacji zapytania,
jeśli dostępna jest większa liczba możliwości.
SQL. Rusz głową!: Witam SQL. Dziękuję za możliwość SQL. Rusz głową!: Chodzi więc o to, jak długo zabierze
osobistego spotkania się z tobą. Wiem, że nie było to łatwe. ci zwrócenie odpowiedzi na pytanie? To właśnie na tej
podstawie należy wybierać sposób zadawania pytań?
SQL: „Niełatwe”. Tak to nazywasz? Według mnie było to
kłopotliwe, niepokojące i naprawdę trudne do oszacowania, SQL: No cóż. Dokładnie. Wszystko sprowadza się do
a przy tym jednocześnie bardzo zagmatwane. tego, o co mnie zapytasz. W końcu po to jestem, żeby
odpowiadać na pytania… o ile są precyzyjne.
SQL. Rusz głową!: No, cóż… faktycznie. I po części
właśnie o to chodzi. Podobno pojawiają się skargi, że jesteś SQL. Rusz głową!: Szybkość… czyli to jest cały sekret?
zbyt elastyczny; że podczas zadawania zapytań kierowanych
SQL: Słuchaj… dam ci radę. Bazy danych mają to do
do ciebie dajesz zbyt wiele możliwości.
siebie, że ROSNĄ. Dlatego będziesz chciał, by znalezienie
SQL: Nie przeczę, jestem elastyczny. Fakt, że można mi odpowiedzi na twoje pytania było możliwie jak najprostsze.
zadać to samo pytanie na kilka różnych sposobów, a na Jeśli bowiem zapytasz mnie „Ktotozdziałał”, to ty będziesz
każde z nich zwrócę taką samą odpowiedź. musiał się postarać, bym myślał o tym pytaniu jak najmniej.
Zadaj mi proste pytanie, a dostaniesz szybką odpowiedź.
SQL. Rusz głową!: Niektórzy mogliby rzec, że jesteś mało
konkretny. SQL. Rusz głową!: Rozumiem, ale skąd mam wiedzieć,
które pytania są proste?
SQL: Nie mam zamiaru tego komentować. To nie moja
wina ani nie mój problem. SQL: Cóż, przede wszystkim musisz wiedzieć, że zapytania
krzyżowe są jedną wielką stratą czasu. Także skorelowane
SQL. Rusz głową!: Owszem, i o jednym, i o drugim
podzapytania nie należą do najszybszych.
wszyscy doskonale wiedzą. Chodzi o to, że jesteś trochę…
nieprecyzyjny. SQL. Rusz głową!: Coś jeszcze?
SQL: Co?! Ja nieprecyzyjny? Mam już tego naprawdę SQL: Cóż…
dosyć! (wstaje).
SQL. Rusz głową!: No, proszę… powiedz.
SQL. Rusz głową!: Nie, nie! Nie odchodź. Bardzo chcemy
SQL: Musisz poeksperymentować. Czasami najlepszym
poznać kilka odpowiedzi. Czasami pozwalasz zapytać o to
rozwiązaniem będzie utworzenie tabel testowych
samo na tak wiele sposobów.
i wypróbowanie różnych zapytań. W ten sposób będziesz
SQL: No i co w tym złego? mógł porównać, ile zajmie wykonanie każdego z nich.
A… i jeszcze jedno: złączenia są bardziej wydajne niż
SQL. Rusz głową!: Tak naprawdę to nic. Chcielibyśmy
podzapytania.
się tylko dowiedzieć, O CO należy cię pytać. I czy to ma
znaczenie, zważywszy, że odpowiedzi są identyczne. SQL. Rusz głową!: Dziękuję, SQL. Aż trudno mi uwierzyć,
że to właśnie szybkość jest tym największym sekretem…
SQL: Oczywiście, że ma znaczenie. Czasami możesz
się o coś zapytać, a zwrócenie odpowiedzi na to pytanie SQL: No właśnie. Dzięki, że zmarnowałeś mój czas.
zajmie mi bardzo dużo czasu. A czasami BANG! i już mam
odpowiedź. A zatem to bardzo ważne, by zadać pytanie
w odpowiedni sposób.
430 Rozdział 9.
Podzapytania
Grzesiek chciałby sprawdzić, jaka jest średnia pensja twórców stron WWW zarejestrowanych w jego
tabeli SUDFDBDNWXDOQD. Następnie chciałby sprawdzić, jak wyglądają faktyczne zarobki poszczególnych
twórców stron w porównaniu z wyznaczoną średnią. Jeśli znajdzie osoby, które zarabiają mniej, to może
się z nimi skontaktować, gdyż zapewne będą bardziej zainteresowane jego usługami niż inni.
Napisz zapytanie, które pobierze średnią wartość pensji twórców strony WWW
zarejestrowanych w tabeli SUDFDBDNWXDOQD.
Grzesiek chce pobrać imiona, nazwiska i pensje wszystkich twórców stron WWW zarejestrowanych
w tabeli SUDFDBDNWXDOQD.
Napisz zapytanie, które pobierze imiona, nazwiska i pensje wszystkich twórców stron WWW
zarejestrowanych w tabeli SUDFDBDNWXDOQD.
Grzesiek wykorzysta średnią wysokość pensji (i trochę operacji matematycznych) jako podzapytanie,
które pozwoli mu wyświetlić wszystkich twórców stron WWW oraz kwotę, o jaką ich zarobki
przewyższają lub o jaką są niższe od średniej pensji dla tego zawodu.
Połącz oba zapytania. Zastosuj podzapytanie jako jedną z kolumn polecenia 6(/(&7.
Grzesiek chciałby sprawdzić, jaka jest średnia pensja twórców stron WWW zarejestrowanych w jego
tabeli SUDFDBDNWXDOQD. Następnie chciałby sprawdzić, jak wyglądają faktyczne zarobki poszczególnych
twórców stron w porównaniu z wyznaczoną średnią. Jeśli znajdzie osoby, które zarabiają mniej, to może
się z nimi skontaktować, gdyż zapewne będą bardziej zainteresowane jego usługami niż inni.
Napisz zapytanie, które pobierze średnią wartość pensji twórców strony WWW
zarejestrowanych w tabeli SUDFDBDNWXDOQD.
Grzesiek chce pobrać imiona, nazwiska i pensje wszystkich twórców stron WWW zarejestrowanych
w tabeli SUDFDBDNWXDOQD.
Napisz zapytanie, które pobierze imiona, nazwiska i pensje wszystkich twórców stron WWW
zarejestrowanych w tabeli SUDFDBDNWXDOQD.
Grzesiek wykorzysta średnią wysokość pensji (i trochę operacji matematycznych) jako podzapytanie,
które pozwoli mu wyświetlić wszystkich twórców stron WWW oraz kwotę, o jaką ich zarobki
przewyższają lub o jaką są niższe od średniej pensji dla tego zawodu.
Połącz oba zapytania. Zastosuj podzapytanie jako jedną z kolumn polecenia 6(/(&7.
A oto i nasze
SELECT mk.imie, mk.nazwisko, pa.pensja, podzapytanie.
pa.pensja – (SELECT AVG(pensja) FROM praca_aktualna WHERE stanowisko = 'tworca stron WWW')
432 Rozdział 9.
Podzapytania
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
:+(5(SDVWDQRZLVNR,16(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
ze
Operator IN przetwarza wszystkie wiers całym
z
kolumny pa.stanowisko, porównując je pytanie.
zbiorem wartości zwróconych przez podza
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
:+(5(SDVWDQRZLVNR127,16(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
Wyświetl stanowiska, dla których pensje są równe najwyższej pensji oferowanej w tabeli oferty_pracy.
2GSRZLHGě]QDMG]LHV]QDVWURQLH
Wyświetl imiona i nazwiska osób, których zarobki przekraczają średnią wysokość pensji wszystkich
zarejestrowanych osób.
2GSRZLHGě]QDMG]LHV]QDVWURQLH
Znajdź wszystkich twórców stron WWW, którzy mają taki sam kod pocztowy, co dowolna zarejestrowana
oferta pracy dla twórcy stron WWW.
2GSRZLHGě]QDMG]LHV]QDVWURQLH
Wyświetl wszystkie osoby, które mieszkają w tej samej miejscowości (o tym samym kodzie pocztowym), co
osoba, która posiada aktualnie najwyższe zarobki.
2GSRZLHGě]QDMG]LHV]QDVWURQLH
434 Rozdział 9.
Podzapytania
kontakt_zainteresowanie
moje_kontakty id_kontaktu
zawody id_kontaktu zainteresowania
id_zawodu nazwisko id_zainteresowania id_zainteresowania
zawod imie zainteresowanie
telefon
kod_pocztowy email kontakt_szuka
kod_pocztowy plec id_kontaktu
data_urodzenia
lokalizacja
szuka
wojewodztwo id_zawodu
id_szuka id_szuka
kod_pocztowy
szuka
stan
id_stanu
id_stanu
stan
Wyświetl stanowiska, dla których pensje są równe najwyższej pensji oferowanej w tabeli RIHUW\BSUDF\.
Wyświetl imiona i nazwiska osób, których zarobki przekraczają średnią wysokość pensji
wszystkich zarejestrowanych osób.
436 Rozdział 9.
Podzapytania
Znajdź wszystkich twórców stron WWW, którzy mają taki sam kod pocztowy jak dowolna zarejestrowana
oferta pracy dla twórcy stron WWW.
Wyświetl wszystkie osoby, które mieszkają w tej samej miejscowości (o tym samym kodzie pocztowym),
co osoba, która posiada aktualnie najwyższe zarobki.
Podzapytania skorelowane
Skoro podzapytanie nieskorelowane
oznacza podzapytanie, które ma być niezależnym
zapytaniem do bazy, to podzapytanie skorelowane
zapewne będzie w jakiś sposób zależne od
zapytania zewnętrznego.
6(/(&7PNLPLHPNQD]ZLVNR
)520PRMHBNRQWDNW\$6PN Nazwa zastępcza tabeli
:+(5( moje_kontakty jest tworzona
w zapytaniu zewnętrznym.
6(/(&7&2817
)520NRQWDNWB]DLQWHUHVRZDQLH
:+(5(LGBNRQWDNWX PNLGBNRQWDNWX
Zanim dowiemy się,
Podzap
jaka ma być wartość zne
ontaktu, koniec
ytanie odwołuje się mk.id_k nia
do nazwy zastępczej mk. jest wykonanie zapyta
zewnętrznego.
438 Rozdział 9.
Podzapytania
6(/(&7PNLPLHPNQD]ZLVNRPNHPDLO
Dzięki zastosowaniu
)520PRMHBNRQWDNW\$6PN mogli pobrać imię, operatora NOT EXISTS będziemy
naz
:+(5(127(;,676 osób z tabeli moje_ wisko i adres e-mail wszystkich
kon
zapisane w tabeli pra takty, które jeszcze nie są
6(/(&7
)520SUDFDBDNWXDOQDSD ca_aktualna.
:+(5(PNLGBNRQWDNWX SDLGBNRQWDNWX
Ñ Ñ
KTO CO ROBI?
Ñ
6(/(&7
)520SUDFDBDNWXDOQDSD Warunek będzie spełniony, jeśli czegoś nie uda się
odnaleźć.
6(/(&7PNLPLHPNQD]ZLVNRPNHPDLO
to zapytanie zwraca imię,
Dzięki zastosowaniu operatora EXISTS
)520PRMHBNRQWDNW\$6PN nazwisko oraz adres poczty elektronicz
nej wszystkich osób zapisanych
or (wartość pola id_kontaktu)
w tabeli moje_kontakty, których identyfikat kt_zainteresowanie.
:+(5((;,676 przynajmni ej raz pojaw ia się w tabel i konta
Ñ Ñ
KTO CO ROBI?
Ñ
ROZWIĄZANIE
Dopasuj podane z lewej strony informacje o przeznaczeniu
z fragmentami zapytania umieszczonymi w lewej kolumnie.
6(/(&7
)520SUDFDBDNWXDOQDSD Warunek będzie spełniony, jeśli czegoś nie uda się
odnaleźć.
440 Rozdział 9.
Podzapytania
Zaostrz ołówek
Napisz zapytanie, które zwróci adres poczty elektronicznej wszystkich osób, które
mają przynajmniej jedno zainteresowanie, lecz nie są jeszcze zarejestrowane w tabeli
SUDFDBDNWXDOQD.
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
Nie istnieją
głupie pytania
P.:A zatem można umieszczać podzapytania P.: Załóżmy, że nie podoba mi się stosowanie
wewnątrz innych podzapytań? podzapytań. Czy istnieje jakiś sposób zastąpienia
ich złączeniami?
O.: Oczywiście. Istnieje pewne ograniczenie co do liczby
możliwych „zagnieżdżeń”, jednak większość systemów O.: W większości przypadków można zastąpić podzapytania
zarządzania relacyjnymi bazami danych obsługuje ich znacznie złączeniami. Jednak abyś mógł to robić, będziesz musiał poznać
więcej, niż kiedykolwiek mógłbyś chcieć użyć. kilka nowych rodzajów złączeń. A to z kolei zmusza nas do…
442 Rozdział 9.
Podzapytania
W drodze na imprezę…
Jadąc na swoją imprezę, Grzesiek zauważył jakąś gazetę z niepokojącym nagłówkiem:
Tygodnik
BAZODETEKTYWISTYCZN
Y
My pierwsi UJAWNIA
SZOKUJĄCĄ PRAWD MY całą
Ę o Podzapytaniach!
ZAKONSPIROWANE
Sąsiedzi szepczą, że po
ZŁĄCZENIA.
dzapytania nie mogą „zr
zwyczajne złączenia, a obić niczego więcej” niż
„prawda musi w końcu
ujrzeć światło dzienne”.
Autor: Radek Wiersz
yński
ETATOWY DETEKT
YW BAZODANOWY
BAZODANOWO: To
, o czym spekulowano
zostało sprawdzone i po od wielu lat, w końcu
twierdzone przez źródła
Bazodetektywistycznego” „Tygodnika
. Okazuje się, że złącze
mogą być używane do nia i podzapytania
tworzenia identycznych
okolicznych mieszkańców zapytań. Ku zaskoczeniu
wszystko, co robili, uży
także wykonać, wykorzy wając podzapytań, mo
stując różnego rodzaju żna
złączenia.
„To okropne — szloch
ała nauczycielka Hank
powiedzieć swoim ucznio a Jasińska. — Jak mam
m, że wszystko, co jak
o podzapytaniach, te ws im się wydawało, wiedzą
zystkie godziny spędzo
ich tworzenia i stosowani na na nauce sposobów
a… że to wszystko było
podzapytania można zas niepotrzebne… że
tąpić zwyczajnymi złącze
koszmar!”. niami. To prawdziwy
Tutejsza mieszkanka, Ha
nka Jasińka,
Skutki tych informacji
mogą być w pełni odczu prz eżyła szok, gdy poznała
rozdziale, w którym nas walne jeszcze w następ całą
i Czytelnicy będą mogli nym prawdę o podzapytania
informacje o złączenia znaleźć unikalne ch.
ch zewnętrznych.
Przybornik SQL
Właśnie zakończyłeś lekturę
52='=,$
=DS\WDQLH Z
HZQÚWU]QH
Zapytanie u
mieszczone
wewnątrz in
nego zapyta
Często okre nia.
śla się je ta
podzapytani kże jako
DQH
3RG]DS\WDQLHQLHVNRUHORZ e.
, które
To niezależne podzapytanie
odw ołu je się
w żaden sposób nie
H
3RG]DS\WDQL
do zapytania zewnęt rznego .
mieszczone
Zapytanie u ia.
nego zapytan
wewnątrz in
je także jako
3RG]DS\W Określa się
DQLH VNR ewnętrzne.
UH ORZDQH zapytanie w
Podzapyta
nie, które
z wartoś korzysta
ci z
zapytanie wracanych przez
zewnętrz
od nich. ne i zale
ży
444 Rozdział 9.
Podzapytania
Zaostrz ołówek
Napisz zapytanie zwracające adres poczty elektronicznej wszystkich
Rozwiązanie osób, które mają przynajmniej jedno zainteresowanie, lecz nie są jeszcze
ze str. 441 zarejestrowane w tabeli SUDFDBDNWXDOQD.
Nowe manewry
Po złączeniu wewnętrznym
figura ósma — lewostronne
złączenie zewnętrzne. Tym razem
na pewno dostanę od sędziów
bardzo wysokie oceny…
6(/(&7GG]LHZF]\QD]]DEDZND
)520G]LHZF]HWDG
,11(5-2,1]DEDZNL]
21GLGB]DEDZNL ]LGB]DEDZNL
Równozłączenie
porównuje wiersz
G]LHZF]HWD z obu tych tabe e ]DEDZNL
l.
W porównaniu
id_dziewczyny dziewczyna id_zabawki używane są warto id_zabawki zabawka
1 Janka 3 identyfikatora za ści 1 hula-hoop
bawki.
2 Sara 4 2 model szybowca
3 Cecylia 1 3 żołnierzyki
4 harmonijka
5 karty z piłkarzami
6 zestaw majsterkowicza
dziewczyna zabawka 7 znikopis
Cecylia hula-hoop 8 puzzle
Nasze wyniki. Janka żołnierzyki
Sara harmonijka
Lewa tabela
Lewostronne złączenie
zewnętrzne
Prawa tabela
6(/(&7GG]LHZF]\QD]]DEDZND
ami
Ta tabela jest umieszczona przed słow
)520G]LHZF]HWDG kluczowymi definiującymi złączenie,
a zatem dziewczeta będą lewą tabelą…
/()7287(5-2,1]DEDZNL] … a zabawki ta
be
ta została umies lą prawą, gdyż tabela
kluczowymi defin zczona za słowami
21GLGB]DEDZNL ]LGB]DEDZNL iującymi złączen
ie.
G]LHZF]HWD ]DEDZNL
id_dziewczyny dziewczyna id_zabawki id_zabawki zabawka
1 Janka 3 1 hula-hoop
2 Sara 4 2 model szybowca
3 Cecylia 1 3 żołnierzyki
4 harmonijka
5 karty z piłkarzami
6 zestaw majsterkowicza
Wyniki naszego lewostronnego 7 znikopis
złączenia zewnętrznego 8 puzzle
6(/(&7GG]LHZF]\QD]]DEDZND
)520]DEDZNL]
/()7287(5-2,1G]LHZF]HWDG
21GLGB]DEDZNL ]LGB]DEDZNL
Zaostrz ołówek
Rozwiązanie Naszkicuj, jak według Ciebie będzie wyglądać wynikowa tabela zwrócona przez poniższe zapytanie.
6(/(&7GG]LHZF]\QD]]DEDZND
)520]DEDZNL] Lewa tabela.
/()7287(5-2,1G]LHZF]HWDG
Prawa tabela.
21GLGB]DEDZNL ]LGB]DEDZNL
Lewa tabela.
Prawa tabela.
]DEDZNL G]LHZF]HWD
id_zabawki zabawka id_dziewczyny dziewczyna id_zabawki
1 hula-hoop 1 Janka 3
2 model szybowca 2 Sara 4
3 żołnierzyki 3 Cecylia 1
4 harmonijka
5 karty z piłkarzami
6 zestaw majsterkowicza
7 znikopis
Oto jakie wyniki uzyskamy,
8 puzzle kolejność tabel w zapytaniu gdy zmienimy
:
dziewczyna zabawka
Cecylia hula-hoop
Jeśli uda się dopasować rekord, NULL model szybowca
to pobrana z niego wartość Janka żołnierzyki
zostanie umieszczona w tabeli
Sara harmonijka eli
wynikowej. Jeśli dopasowanie Kolejność kolumn w tab
się nie powiedzie, to w tabeli NULL karty z piłkarzami wynikowej odpowiada
wynikowej i tak pojawi się NULL zestaw majsterkowicza kolejności, w jakiej niu
wiersz, jednak w takiej sytuacji
NULL znikopis podaliśmy je w polece
zamiast dopasowanej wartości SELECT. Kolejność ta
ku
zobaczymy w nim wartość NULL. NULL puzzle nie ma żadnego związ NYM
z naszym LEWOSTRON .
ym
zapytaniem zewnętrzn
Poniżej przedstawione zostały dwa zbiory wyników. Dla każdego z nich napisz lewostronne
złączenie zewnętrzne, które mogłoby wygenerować takie wyniki, jak również tabele
Ćwiczenie G]LHZF]HWD i ]DEDZNL zawierające dane, na których polecenie SQL operowało.
Tę tabelę
wypełniliśmy
za Ciebie.
Lewa tabela Prawa tabela
G]LHZF]HWD
LGBG]LHZF]\Q\ G]LHZF]\QD LGB]DEDZNL
-ROD
.ODUD
0DUW\QD
To jest trudne
zadanie.
Poniżej przedstawione zostały dwa zbiory wyników. Dla każdego z nich napisz lewostronne
złączenie zewnętrzne, które mogłoby wygenerować takie wyniki, jak również tabele
Rozwiązanie G]LHZF]HWD i ]DEDZNL zawierające dane, na których polecenie SQL operowało.
ćwiczenia
Zapytanie Wyniki lewostronnego złączenia zewnętrznego:
6(/(&7GG]LHZF]\QD]]DEDZND dziewczyna zabawka
)520G]LHZF]HWDG Jola pistolet na kulki
Klara magiczny balon
/()7287(5-2,1]DEDZNL] Martyna NULL
21GLGB]DEDZNL ]LGB]DEDZNL
To zabawki, które pojawiły
się w naszych wynikach.
Wiersz z pistoletem z kulkami z tabeli ]DEDZNL jest porównywany z wierszem Joli z tabeli
G]LHZF]HWD: zabawki.id_zabawki = 1, dziewczeta.id_zabawki = 1.
Znaleźliśmy dopasowanie.
Wiersz z pistoletem z kulkami z tabeli ]DEDZNL jest porównywany z wierszem Klary z tabeli
G]LHZF]HWD: zabawki.id_zabawki = 1, dziewczeta.id_zabawki = 1.
Znaleźliśmy dopasowanie.
Wiersz z pistoletem z kulkami z tabeli ]DEDZNL jest porównywany z wierszem Sary z tabeli
G]LHZF]HWD: zabawki.id_zabawki = 1, dziewczeta.id_zabawki = 3.
Nie ma dopasowania.
Wiersz z pistoletem z kulkami z tabeli ]DEDZNL jest porównywany z wierszem Marty z tabeli
G]LHZF]HWD: zabawki.id_zabawki = 1, dziewczeta.id_zabawki = 3.
Nie ma dopasowania.
Wiersz z magicznym balonem z tabeli ]DEDZNL jest porównywany z wierszem Joli z tabeli
G]LHZF]HWD: zabawki.id_zabawki = 2, dziewczeta.id_zabawki = 1.
Nie ma dopasowania.
Wiersz z magicznym balonem z tabeli ]DEDZNL jest porównywany z wierszem Klary z tabeli
G]LHZF]HWD: zabawki.id_zabawki = 2, dziewczeta.id_zabawki = 1.
Nie ma dopasowania.
Wiersz z magicznym balonem z tabeli ]DEDZNL jest porównywany z wierszem Sary z tabeli
G]LHZF]HWD: zabawki.id_zabawki = 2, dziewczeta.id_zabawki = 3. dziewczyna zabawka
Nie ma dopasowania. Jola pistolet na kulki
Wiersz z magicznym balonem z tabeli ]DEDZNL jest porównywany z wierszem Marty z tabeli Klara pistolet na kulki
G]LHZF]HWD: zabawki.id_zabawki = 2, dziewczeta.id_zabawki = 3.
NULL magiczny balon
Nie ma dopasowania.
Koniec tabeli, tworzony jest nowy wiersz z wartością 18// w kolumnie G]LHZF]\QD. Sara puzzle
Wiersz z puzzlami z tabeli ]DEDZNL jest porównywany z wierszem Joli z tabeli G]LHZF]HWD: Marta puzzle
zabawki.id_zabawki = 3, dziewczeta.id_zabawki = 1.
Nie ma dopasowania.
Wiersz z puzzlami z tabeli ]DEDZNL jest porównywany z wierszem Klary z tabeli G]LHZF]HWD:
zabawki.id_zabawki = 3, dziewczeta.id_zabawki = 1.
Nie ma dopasowania.
Wiersz z puzzlami z tabeli ]DEDZNL jest porównywany z wierszem Sary z tabeli G]LHZF]HWD:
zabawki.id_zabawki = 3, dziewczeta.id_zabawki = 3.
Znaleźliśmy dopasowanie.
Wiersz z puzzlami z tabeli ]DEDZNL jest porównywany z wierszem Marty z tabeli G]LHZF]HWD:
zabawki.id_zabawki = 3, dziewczeta.id_zabawki = 3
Znaleźliśmy dopasowanie.
jesteś tutaj 455
Prawostronne złącznie zewnętrzne
6(/(&7GG]LHZF]\QD]]DEDZND 6(/(&7GG]LHZF]\QD]]DEDZND
)520]DEDZNL] Lewa tabela. Lewa tabela.
Prawa tabela. )520G]LHZF]HWDG
Prawa
5,*+7287(5-2,1G]LHZF]HWDG /()7287(5-2,1]DEDZNL] tabela.
21GLGB]DEDZNL ]LGB]DEDZNL
21GLGB]DEDZNL ]LGB]DEDZNL
To zapytanie zobaczyłeś po
raz pierwszy na stronie 450.
G]LHZF]HWD ]DEDZNL
id_dziewczyny dziewczyna id_zabawki id_zabawki zabawka
1 Janka 3 1 hula-hoop
2 Sara 4 2 model szybowca
3 Cecylia 1 3 żołnierzyki
4 harmonijka
5 karty z piłkarzami
6 zestaw majsterkowicza
7 znikopis
8 puzzle
dziewczyna zabawka
Cecylia hula-hoop
Janka żołnierzyki
Nasze wyniki.
Sara harmonijka
Prawa tabela
Prawostronne
złączenie
zewnętrzne
Lewa
tabela
Nie istnieją
głupie pytania
P.: Czy są jakieś powody, dla których lepiej P.: Skoro dostępne są LEWOSTRONNE
jest stosować lewostronne złączenie i PRAWOSTRONNE złączenia zewnętrzne, to czy
zewnętrzne, a nie złączenie prawostronne? istnieje także jakiś kolejny rodzaj złączenia, który
zwracałby wszystkie wiersze z obu tabel?
O.: Zmiana słowa kluczowego /()7 na 5,*+7 jest znacznie
łatwiejsza niż zamiana kolejności tabel użytych w poleceniu O.: Owszem, niektóre, lecz nie wszystkie systemy zarządzania
SQL. W końcu łatwiej jest zmienić jedno słowo niż dwie nazwy relacyjnymi bazami danych udostępniają złączenie )8//287(5
tabel wraz z ewentualnymi nazwami zastępczymi. -2,1 — pełne złączenie zewnętrzne. Niemniej jednak złączenia
tego typu nie są obsługiwane przez serwery MySQL, SQL Server
Jednak ogólnie rzecz biorąc, zazwyczaj łatwiej jest trzymać się
ani Access.
jednego z tych złączeń, na przykład lewostronnego złączenia
zewnętrznego, i odpowiednio podawać nazwy tabel z lewej
lub prawej strony. Takie rozwiązanie zapewni porządek i ułatwi
zrozumienie poleceń SQL.
Zippo Eklerka
Balbina Pan Pimpuś Skuter Pan Hobo
Gonzo
A teraz przyjrzyjmy się nowemu schematowi
bazy danych klownów i zastanówmy się, jaki jest
najlepszy sposób dopasowania do niej naszych
nowych informacji:
info_lokalizacja lokalizacja
id_lokalizacji
id
id_lokalizacji lokalizacja
WYSIL kiedy
Ale czy jestem
SZARE KOMÓRKI śmieszny? Chodzi mi
W jaki sposób można zmienić strukturę bazy, by móc o to, czy śmieszę cię
zapisywać w niej informacje o hierarchii klownów? jako klown?
10 Pan Smyk
7 Zippo 1 Eklerka
8 Balbina 2 Pan Pimpuś 6 Skuter 4 Pan Hobo
9 Gonzo
info_lokalizacja lokalizacja
id_lokalizacji
klowni_szef id
id id_lokalizacji lokalizacja
id_szefa
kiedy
WYSIL
SZARE KOMÓRKI
Czy istnieje jakieś rozwiązanie, które pozwoliłoby nam zapisać
informacje o hierarchii klownów bez tworzenia w tym celu
zupełnie nowej tabeli?
Zaostrz ołówek
Załóżmy, że mamy dwie identyczne tabele: NORZQLBLQIRUPDFMH oraz NORZQLBLQIRUPDFMH.
Napisz zapytanie z pojedynczym złączeniem, które zwróci tabelę zawierającą imię każdego klowna
oraz imię jego szefa.
NORZQLBLQIRUPDFMH NORZQLBLQIRUPDFMH
id imie id_szefa id imie id_szefa
1 Eklerka 3 1 Eklerka 3
2 Pan Pimpuś 5 2 Pan Pimpuś 5
3 Pani Smyk 10 3 Pani Smyk 10
4 Pan Hobo 3 4 Pan Hobo 3
5 Klarabela 10 5 Klarabela 10
6 Skuter 3 6 Skuter 3
7 Zippo 3 7 Zippo 3
8 Balbina 5 8 Balbina 5
9 Gonzo 5 9 Gonzo 5
10 Pan Smyk 10 10 Pan Smyk 10
Zaostrz ołówek
Rozwiązanie Załóżmy, że mamy dwie identyczne tabele: NORZQLBLQIRUPDFMH oraz NORZQLBLQIRUPDFMH.
Napisz zapytanie z pojedynczym złączeniem, które zwróci tabelę zawierającą imię każdego klowna
oraz imię jego szefa.
NORZQLBLQIRUPDFMH NORZQLBLQIRUPDFMH
id imie id_szefa id imie id_szefa
1 Eklerka 3 1 Eklerka 3
2 Pan Pimpuś 5 2 Pan Pimpuś 5
3 Pani Smyk 10 3 Pani Smyk 10
4 Pan Hobo 3 4 Pan Hobo 3
5 Klarabela 10 5 Klarabela 10
6 Skuter 3 6 Skuter 3
7 Zippo 3 7 Zippo 3
8 Balbina 5 8 Balbina 5
9 Gonzo 5 9 Gonzo 5
10 Pan Smyk 10 10 Pan Smyk 10
nej
mny o identycz
Aby dwie kolu nie wprowadziły nas
nazwie „imie” e zawierającej imię
ni
w błąd, kolum nazwę zastępczą „szef”.
szefa nadamy
6(/(&7NLPLHNLPLH$6V]HI
)520NORZQLBLQIRUPDFMH$6N
,11(5-2,1NORZQLBLQIRUPDFMH$6N
21NLGBV]HID NLG
,11(5-2,1NORZQLBLQIRUPDFMHN
Jak widać, w tym zapytaniu
21NLGBV]HID NLG dwu
używamy tabeli klowni_informa krotnie
Posługujemy się przy tym nazwcje.
zastępczymi k1 (której użyjem ami
wartości z kolumny id_szefa) y do pobrania
(zastosowanej do pobrania imieoraz k2
nia szefa).
, na Stanowisko, na
Stanowiskoalnie jak
chciałaby pracow im
ak tu
jakim oby osoba z bazy Gr ać Lista
pracują os bazie ześka.
dostępnych
zapisane w ofert pracy.
Grześka.
praca_aktualna praca_poszukiwana oferty_pracy
id_kontaktu id_kontaktu id_oferty
6(/(&7VWDQRZLVNR)520SUDFDBDNWXDOQD
6(/(&7VWDQRZLVNR)520SUDFDBSRV]XNLZDQD
6(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
6(/(&7VWDQRZLVNR)520SUDFDBDNWXDOQD
81,21 Polecenie
6(/(&7VWDQRZLVNR)520SUDFDBSRV]XNLZDQD UNION
pozwoli ka z tabe
li
81,21 Grześkowi połączyć Stanowis cy.
wyniki pochodzące oferty_pra
6(/(&7VWDQRZLVNR)520RIHUW\BSUDF\ z trzech niezależnych
je
zapytań i zwrócić eli.
w postaci jednej tab stanowisko
To tylko kilka z setek księgowy
stanowisk, które został prawnik
zwrócone po połączeni y programista
wszystkich trzech tab u
el. twórca stron WWW
Grzesiek zauważył, że nazwy stanowisk w tabeli wynikowej opiekun do kotów
nie powtarzają się, lecz jednocześnie nie są wyświetlone szef kuchni
w kolejności alfabetycznej. Dlatego też próbuje ponownie psycholog
zadać to samo pytanie, dodając do każdego z poleceń fryzjer
6(/(&7 klauzulę 25'(5%<. nauczycielka
kelnerka
6(/(&7VWDQRZLVNR)520SUDFDBDNWXDOQD25'(5%<VWDQRZLVNR
81,21
6(/(&7VWDQRZLVNR)520SUDFDBSRV]XNLZDQD25'(5%<VWDQRZLVNR
81,21 Grzesiek dodał do ORDER
każdego
kla uz ulę
6(/(&7VWDQRZLVNR)520RIHUW\BSUDF\25'(5%<VWDQRZLVNR zap yta nia
na liście
BY, by stanowiska rtowane
wynikow ej by ły po so
alfabetycznie.
WYSIL
SZARE KOMÓRKI
Jak sądzisz, co się stanie, kiedy Grzesiek wykona
swoje nowe zapytanie?
y polecenia UNION
Reguły polecenia UNION Reguł
SELECT
W każdym poleceniu samą
ą
musisz pobrać tak
ilość kolumn.
6(/(&7VWDQRZLVNR)520SUDFDBDNWXDOQD
81,21
6(/(&7VWDQRZLVNR)520SUDFDBSRV]XNLZDQD
81,21
6(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
25'(5%<VWDQRZLVNR
Jeśli chcesz posortować wyniki, to możesz
umieścić klauzulę ORDER BY za ostatnim
z łączonych poleceń SELECT. Klauzula ta
spowoduje posortowanie wyników całego polecenia.
stanowisko
wyniki,
fryzjer Oto przykładowecić
jakie mo że zw ró
nie.
kelnerka powyższe zapyta
księgowy
nauczycielka
W tym przykładzie wszystkie kolumny zwracane
opiekun do kotów
w poszczególnych zapytaniach są typu 9$5&+$5.
prawnik
W efekcie także kolumna w tabeli wynikowej
programista będzie typu 9$5&+$5.
szef kuchni
twórca stron WWW
WYSIL
zdun
SZARE KOMÓRKI
Jak sądzisz, co by się stało, gdyby kolumny zwracane przez
poszczególne polecenia 6(/(&7 zastosowane w poleceniu
81,21 były różnych typów?
UNION ALL
Polecenie 81,21$// działa dokładnie tak samo jak polecenie
81,21, z tym że zwraca wszystkie wartości zapisane w kolumnach,
a nie jedynie po jednej z grupy identycznych wartości.
6(/(&7VWDQRZLVNR)520SUDFDBDNWXDOQD
Tym razem chcemy
81,21$//
wyświetlić listę
wszystkich wartości 6(/(&7VWDQRZLVNR)520SUDFDBSRV]XNLZDQD
zapisanych w kolumnie
stanowisko we 81,21$//
wszystkich trzech
tabelach. 6(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
25'(5%<VWDQRZLVNR
stanowisko
fryzjer Tym razem nazwy
kelnerka stanowisk na liście
powtarzają się.
księgowy
nauczycielka
nauczycielka
opiekun do kotów Jak do tej pory wszystkie tworzone przez nas polecenia 81,21
prawnik operowały na kolumnach tego samego typu. Jednak może
prawnik się zdarzyć, że będziemy chcieli utworzyć polecenie 81,21
zwracające kolumny różnych typów.
prawnik
prawnik Pisząc, że musi istnieć możliwość konwersji typów danych,
programista mamy na myśli, że o ile to będzie możliwe, zwracane dane
programista
zostaną skonwertowane do zgodnych typów; jeśli natomiast
taka konwersja nie będzie możliwa, to próba wykonania
programista
polecenia się nie powiedzie.
szef kuchni
twórca stron WWW Załóżmy, że utworzyliśmy polecenie 81,21 składające się
twórca stron WWW
z dwóch zapytań, z których pierwsze zwraca kolumnę typu
,17(*(5, a drugie typu 9$5&+$5. Ponieważ danych typu
zdun
9$5&+$5 nie można skonwertować do postaci liczb całkowitych,
zatem w wynikowej tabeli polecenia 81,21 wartości typu
,17(*(5 zostaną skonwertowane do typu 9$5&+$5.
To jest to samo
Nazwa nowej tabeli. polecenie UNION,
które utworzyliśmy
już wcześniej. Tabelę
&5($7(7$%/(PRMDBXQLD$6 można utworzyć na
podstawie dowolnego
6(/(&7VWDQRZLVNR)520SUDFDBDNWXDOQD81,21 polecenia SELECT.
6(/(&7VWDQRZLVNR)520SUDFDBSRV]XNLZDQD81,21
6(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
Zaostrz ołówek
Spróbuj odgadnąć, jakie będą typy danych wyników, a następnie zapisz wyniki polecenia
81,21 w nowej tabeli, używając do tego celu polecenia &5($7(7$%/($6.
Wykonaj polecenie '(6& i przekonaj się, czy dobrze określiłeś typ danych
wyników.
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
6(/(&7VWDQRZLVNR)520SUDFDBDNWXDOQD
,17(56(&7
6(/(&7VWDQRZLVNR)520SUDFDBSRV]XNLZDQD
6(/(&7VWDQRZLVNR)520SUDFDBDNWXDOQD
(;&(37
6(/(&7VWDQRZLVNR)520SUDFDBSRV]XNLZDQD
W wynikach
zostaną wyś całego polecenia Stanowiska, które
te wiersze wietlone tylko występują w wynikach
z pierwszeg
zapytania,
kt o zwróconych przez oba
w drugim za óre nie występują zapytania, nie zostaną
pytaniu.
uwzględnione w wynikach
całego polecenia.
0RZEDSTAWIAMYPODZAPYTANIA 0ODZAPYTANIA
:YNdKZc^KXSK ·¦MdcWc
NaK
dKZc^KXSK
a
dKZc^KXSO
d
ZYNdKZc^KXSOW
7¬ªoRJy¬u®-¬ -yl¥ª¬p|y-É R-uR|R-AoRGp }R®RlRpª¬p|y-tG¥¸¬ª-oÔA +- Ru|tÔA®¬ql²u¬Jª-®-¬ -yl-ªoRJy|lRª®R®ylAioR y-®¬ª-yR
Jª}Ai|qRARÍ G7ÖJ®lRu¬u¥lRqlp|®¬ -É®|J®-¬ -yl-WA®¬ql®-¬ -yl- ®-¬ -ylRu®RªyÖ ®y¬u+p|qRlJ¥alR®-¬ -ylRG¥ulR®A®|yRªRªyÔ ®
¥ulR®A®-yRa|ªRªyÔ ®lyyRa|®-¬ -yl- lRª®Ra|Gy-®¬ª-u¬®-¬ -ylRuªRªyÖ ®y¬u
¥alR®-¬ -ylRGp }Ra|¥¸¬oRu¬J||7-yl--¥oÔA¬AiRp|J}ª® -7Rql]DZRG\G
y-®ªlRu¬®-¬ -ylRu=(:1}75=1<0GaJ¬¸7ÖJ®lR|y|®-ªlR-t|ª|7lRJ¥alRW
:(:1}75=1(W®-¬ -ylR+|7-A®u¬Go-p |ª®¬ p|J®l-t-F
dKZc^KXSO
D/A8¯><D8/ dKZc^KXSO
A/A8¯><D8/
dKZc^KXSO
D/A8¯><D8/ ' dKZc^KXSO
d
ZYNdKZc^KXSOW
$WA POCZONE
WNÅTRZNE ZAPYTANIA TWORZ
E ZE ZAPYTANIE
YTANI
:AP Z PODZAPYTANIEM
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
:+(5(
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
SDVWDQRZLVNR,1
NXFKDU]
IU\]MHU
NHOQHU
SURMHNWDQWVWURQ:::
WZRUFDVWURQ:::
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
4A CZÅwÁ TWORZY ZAPYTANIE
:+(5(SDVWDQRZLVNR,16(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
ZEWNÅTRZNE PIÁ
! TÅ CZÅwÁ MONA USUNÁ I ZAST RE
CZÅwCI PIERWSZEGO ZAPYTANIA KTÎ
W TEN SPOSÎB UTWORZY ZAPYTANIE
WEWNÅTRZNE *U NIE MUSIMY
PRZEP
STANOWISK Z PIERWSZE ISYWAÁ NAZW
GDY ZROBI TO ZA NAS GO ZAPYTANIA
'®¬ plRy-®ª¬ -y|ªlpª¬®A®Ra}qyl|yRª|ª¬¸®¬u®-¬ -yl¥ :YNdKZc^KXSO
^Y
WEWNÅTRZNE ZAPYTANIE
Ôª¬ylp-uly-®Ra|lRª®Ra|®-¬ -yl-W®-¬ -yl-Gp }R|7lR-
ª®¬ plR -y|ªlp-® -7RqlRIHUW\BSUDF\®- Rul |oR 7-J®|
dKZc^KXSO
=;6
| |ª¬ylplGo-plR¥®¬p-u¬|ª¬p|y-yl¥y-®Ra|
¬ yR|®ªlÔ®-ylRGªlÖA¥ª-¸-o
u|¸Ru¬®- ÔlÉ\-auRy ®-¬ -yl- U^\O
dY]^K¸Y
y|ªRa|®-¬ -yl- ÔJ|pt-JylR -plR-uRo-pª¬ylpl
®RªyÖ ®yRa|\-auRy Ruy-®Ra|lRª®Ra|®-¬ -yl-"-p¸Rª ¬u
®-¬ -yl-Gªp }¬uªpq-¥®¥ql:+(5(¥ulR²Alql²u¬
®¬-Jp¥ª¬aRyR|ª-y-®| -ylRql -ª®¬ plAi -y|ªlpGoRJy-p ¬u _WSO]dMdYXO
ª®¬ plRy-®ª¬ -y|ªlp|lqRuylRoulRql²u¬l-yl-V 4O TE SAME WYNIKI CO WCZEwN
-®RuoR |y-iRuR ¬®|ª-y-ª| -Al|J®-¬ -yl-F JEDNAK UZYSKALIwMY JE UYW IEJ
aOaX¦^\d
SXXOQY
TYLKO JEDNEGO ZAPYTANIA AJC
dKZc^KXSK
-dK]KWS
WUSWSO
WUXKdaS]UY
WU^OVOPYX
ZK]^KXYaS]UY
dKZc^KXSO
A/A8¯><D8/ YU\OÄVK
]S°
TO
^KUÒO
4KXOU 6KMRYaSMd
##! U_MRK\d
AKXNK 7KVMdOa]UK
#"! P\cdTO\
6(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
TKUY
dKZc^KXSO
=^OPKX 7SVVO\
#" Z\YTOU^KX^
]^\YX
AAA
4K\OU -OVSº]US
# ^a\MK
]^\YX
AAA
*5283%<VWDQRZLVNR25'(5%<
4A CZÅwÁ NASZEGO
PIERWSZEGO ZAPYTANIA
A/A8¯><D8/
4_VOU 1\KMdcº]US
#! ! ^a\MK
]^\YX
AAA
VWDQRZLVNR STANIE SIÅ ZAPYTANIEM
WEWNÅTRZNYM
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
:+(5(SDVWDQRZLVNR,16(/(&7VWDQRZLVNR)520RIHUW\BSUDF\
Zapytanie wewn
A oto wyniki, które uzyskaliśmy, wykonując to zapytanie. ętrzne.
Zaostrz ołówek
A oto zapytanie i klauzula :+(5( z podzapytaniem zapisanym w postaci złączenia ,11(5-2,1:
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
,11(5-2,1RIHUW\BSUDF\RS Możesz zastąpić podzapytanie
występujące w klauzuli WHERE
21SDVWDQRZLVNR RSVWDQRZLVNR złączeniem typu INNER JOIN.
=ïÈF]HQLH 3RG]DS\WDQLH
5R]PRZDMHVWNRQW\QXRZDQDQDQDVWÚSQHMVWURQLH
jesteś tutaj 475
Rozmowa przy kominku
=ïÈF]HQLH 3RG]DS\WDQLH
Zapytanie generuje listę stanowisk pracy, dla których pensja jest równa najwyższej pensji z tabeli RIHUW\BSUDF\.
6(/(&7VWDQRZLVNR)520RIHUW\BSUDF\:+(5(SHQVMD 6(/(&7
0$;SHQVMD)520RIHUW\BSUDF\
Zapytanie generuje listę imion i nazwisk osób, których zarobki przekraczają średnią pensję.
6(/(&7PNLPLHPNQD]ZLVNR)520PRMHBNRQWDNW\PN
1$785$/-2,1SUDFDBDNWXDOQDSD:+(5(SDSHQVMD!6(/(&7
$9*SHQVMD)520SUDFDBDNWXDOQD
Zapytanie generuje listę stanowisk pracy, dla których pensja jest równa najwyższej pensji z tabeli RIHUW\BSUDF\.
6(/(&7VWDQRZLVNR)520RIHUW\BSUDF\:+(5(SHQVMD 6(/(&7
0$;SHQVMD)520RIHUW\BSUDF\
Zapytanie generuje listę imion i nazwisk osób, których zarobki przekraczają średnią pensję.
6(/(&7PNLPLHPNQD]ZLVNR)520PRMHBNRQWDNW\PN
1$785$/-2,1SUDFDBDNWXDOQDSD:+(5(SDSHQVMD!6(/(&7
$9*SHQVMD)520SUDFDBDNWXDOQD
6(/(&7NLPLHNLPLH$6V]HI 9
10
Gonzo
Pan Smyk
5
10
)520NORZQLBLQIRUPDFMHN Pierwsza kopia tabeli
klowni_informacje
,11(5-2,1NORZQLBLQIRUPDFMHN
21NLGBV]HID NLG Druga kopia tabeli
klowni_informacje
PO
Jeśli zmienimy złączenie zwrotne na podzapytanie, to będzie
to podzapytanie SKORELOWANE. W naszym przypadku
podzapytanie zależy od zapytania zewnętrznego, które jest
niezbędne do pobrania odpowiedniego identyfikatora szefa
(LGBV]HID), a oprócz tego wyniki podzapytania są umieszczone
na liście wyników zewnętrznego polecenia 6(/(&7.
ie
ytan
Zap nętrzne. Podzapytanie jest
zew umieszczone na liście
wyników polecenia SELECT.
6(/(&7NLPLH
6(/(&7LPLH)520NORZQLBLQIRUPDFMH
:+(5(NLGBV]HID LG$6V]HI
)520NORZQLBLQIRUPDFMHN
Podzapytanie jest zależne od wyni
zapytania zewnętrznego, które okreków
identyfikator szefa; a zatem jest śla
podzapytanie skorelowane. to
Franek
Zaostrz ołówek
Rozwiązanie Utwórz polecenie 81,21 łączące kolumnę LGBNRQWDNWX z tabeli SUDFDBDNWXDOQD
oraz kolumnę SHQVMD z tabeli RIHUW\BSUDF\.
ze str. 471
SELECT id_kontaktu FROM praca_aktualna
UNION SELECT pensja FROM praca_aktualna;
Spróbuj odgadnąć, jakie będą typy danych wyników, a następnie zapisz wyniki
polecenia 81,21 w nowej tabeli, używając do tego celu polecenia &5($7(7$%/($6.
DEC(12,2)
Zaostrz ołówek
Rozwiązanie A oto zapytanie i klauzula :+(5( z podzapytaniem zapisanym w postaci złączenia ,11(5-2,1:
ze str. 474
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQSDVWDQRZLVNR
)520SUDFDBDNWXDOQD$6SD1$785$/-2,1PRMHBNRQWDNW\$6PN
,11(5-2,1RIHUW\BSUDF\RS Możesz zastąpić podzapytanie
występujące w klauzuli WHERE
21SDVWDQRZLVNR RSVWDQRZLVNR złączeniem typu INNER JOIN.
Wyjaśnij, dlaczego zastosowanie przedstawionego powyżej polecenia ,11(5-2,1 spowoduje wygenerowanie takich samych
danych jak w przypadku zastosowania podzapytania.
Złączenie INNER JOIN wyświetli wyniki wyłącznie w przypadku, gdy będzie spełniony warunek
pa.stanowisko = op.stanowisko, co odpowiada poniższej klauzuli WHERE z podzapytaniem:
WHERE pa.stanowisko IN (SELECT stanowisko FROM oferty_pracy);
Przybornik SQL
Teraz to już naprawdę radzisz
52='=,$
Twoje bazy danych rozrosły się i muszą z nich korzystać także inne
osoby. Problem polega na tym, że niektóre z nich nie będą znały języka SQL równie
dobrze jak Ty. Musisz zatem mieć jakieś sposoby, by uniemożliwić im wprowadzanie
nieprawidłowych danych, techniki pozwalające ukryć przed nimi wybrane dane
oraz mechanizmy, które uchronią je przed wzajemnym przeszkadzaniem sobie,
gdy jednocześnie będą modyfikować zawartość bazy. W tym rozdziale zaczniemy
ochraniać nasze dane przed błędami popełnianymi przez inne osoby. Witamy w Bazie
Obronnej, w części 1.
kontakt_zainteresowanie zainteresowania
id_kontaktu id_zainteresowania
moje_kontakty
zawody id_kontaktu zainteresowanie
id_zawodu nazwisko id_zainteresowania
zawod imie
telefon
kod_pocztowy email kontakt_szuka szuka
kod_pocztowy plec id_kontaktu id_szuka
miejscowosc data_urodzenia szuka
wojewodztwo
id_zawodu
id_szuka
kod_pocztowy
stan
id_stanu id_stanu
stan
Grzesiek
Grzesiek
Jeśli chodzi o zawód, to wpisz „nauczycielka”, a stan — „zamężna” (w tym przypadku będziesz
Grzesiek
musiał sprawdzić odpowiednią wartość, korzystając z polecenia SELECT; jego prawidłową składnię
znajdziesz w moich notatkach, które ci przygotowałem).
Grzesiek
Nie wygląda to na zbyt skomplikowane
zadanie, już się za nie biorę.
Dzięki
Kuba
Grzesiek
Nie ma za co_
WYSIL
SZARE KOMÓRKI
Czy potrafisz napisać polecenie zapisujące nową osobę w bazie?
powiadający
id_stanu Oto identyfikator od
stanowi „za mę żna ”.
4
,16(57,172PRMHBNRQWDNW\9$/8(6
0UXF]\QVND
3DWU\FMD
PUXBSDW#MDNLVHPDLOSO
;
To jest wartość, którą Kuba
zdecydował się zapisać w kolumnie
To identyfikatory, które Kuba plec, gdyż nie chciał ani zgadywać,
odszukał, korzystając z dwóch ani wpisywać wartości NULL.
wcześniejszych zapytań. Równie
dobrze Kuba mógłby uzyskać te
wartości, używając podzapytań.
6(/(&7&2817
$6.RELHW\)520PRMHBNRQWDNW\:+(5(SOHF
.
6(/(&7&2817
$60H]F]\]QL)520PRMHBNRQWDNW\:+(5(SOHF
0
Mezczyzni
Są także 6982 wiersze z literką 'M'.
6982
6(/(&7&2817 $6:V]\VWNLFK)520PRMHBNRQWDNW\
6(/(&7SOHF)520PRMHBNRQWDNW\
:+(5(SOHF!
.
$1'SOHF!
0
plec
Szukając zgubionych rekordów,
X
Grzesiek znalazł rekordy
X z wartością 'X' w kolumnie plec.
X
X
X
X
X WYSIL
X SZARE KOMÓRKI
X
X W jaki sposób Kuba mógł uniknąć wpisywania wartości X?
X
X
X
Sprawdzanie płci
Gdyby Grzesiek potrafił cofać czas, mógłby zdefiniować w tabeli
PRMHBNRQWDNW\ ograniczenie &+(&. dotyczące kolumny SOHF. Dlaczego ciągle
Teraz nie pozostało mu jednak nic innego, jak zmodyfikować tabelę pojawiają mi się
przy użyciu polecenia $/7(57$%/(: błędy?
$/7(57$%/(PRMHBNRQWDNW\
$''&21675$,17&+(&.SOHF,1
.
0
Następnego dnia okazało się, że Kuba nie może wpisywać wartości
'X' w polu płci. Kiedy zapytał o to Grześka, ten wyjaśnił mu nowe
ograniczenia i powiedział, że ponieważ nie jest w stanie cofnąć się
w czasie, zatem czyni Kubę odpowiedzialnym za wszystkie kontakty
z płcią „X” i każe mu określić, jaka ta płeć powinna być w rzeczywistości.
Zaostrz ołówek
Napisz, jakie według Ciebie wartości będzie można zapisywać w każdej z czterech kolumn poniższej tabeli.
&5($7(7$%/(WDMHPQLF]DBWDEHOD
NROXPQD,17&+(&.NROXPQD!
NROXPQD&+$5&+(&.NROXPQD127,1
[
\
]
NROXPQD9$5&+$5&+(&.
$
68%675,1*NROXPQD
NROXPQD9$5&+$5&+(&.
$
68%675,1*NROXPQD
$1'
68%675,1*NROXPQD
Kolumna 1.:
Kolumna 2.:
Kolumna 3.:
Kolumna 4.:
Zaostrz ołówek
Rozwiązanie Napisz, jakie według Ciebie wartości będzie można zapisywać w każdej z czterech kolumn
poniższej tabeli.
&5($7(7$%/(WDMHPQLF]DBWDEHOD
NROXPQD,17&+(&.NROXPQD!
NROXPQD&+$5&+(&.NROXPQD127,1
[
\
]
NROXPQD9$5&+$5&+(&.
$
68%675,1*NROXPQD
NROXPQD9$5&+$5&+(&.
$
68%675,1*NROXPQD
$1'
68%675,1*NROXPQD
Możesz łączyć warunki przy
OR.
użyciu operatorów AND oraz
Kolumna 3.: Pierwszym znakiem zapisywanego łańcucha znaków musi być litera A.
Kolumna 4.: Pierwszym znakiem zapisywanego łańcucha musi być litera A, a drugim cyfra 9.
Nie istnieją
głupie pytania
P.: A zatem w ograniczeniu CHECK mogę używać P.: A co się stanie, kiedy spróbuję zapisać w tabeli
takich samych warunków, jakich używam w klauzuli wartość, która nie spełnia warunku ograniczenia
WHERE? CHECK?
O.: W zasadzie tak. Możesz używać takich operatorów jak: $1', O.: Baza danych zgłosi błąd, a wartość nie zostanie zapisana
25, ,1, 127, %(7:((1 oraz kilku innych. Możesz je nawet łączyć, jak w tabeli.
pokazaliśmy w powyższym przykładzie. Nie możesz jednak używać
podzapytań. P.: A jaki z tego pożytek?
P.: Ale skoro nie mogę używać ograniczeń tego typu O.: W ten sposób możesz zapewnić, że dane zapisywane
w MySQL-u, to co mogę zastosować zamiast nich? w tabeli będą sensowne — że nie pojawią się w niej jakieś
tajemnicze wartości.
O.: Na to pytanie nie ma niestety prostej i łatwej odpowiedzi. Niektórzy
korzystają z wyzwalaczy, czyli zapytań wykonywanych w momencie
spełnienia określonego warunku. Jednak korzystanie z wyzwalaczy nie
jest aż tak proste jak z ograniczeń &+(&., pomijając w ogóle fakt, że
przedstawienie tego zagadnienia nie mieści się w ramach niniejszej książki.
Bądź FRANKIEM
Twoim zadaniem jest wcielić się w rolę Franka
i napisać zapytania, które on codziennie
wykonuje. Napisz zapytanie,
które odnajdzie wszystkich
projektantów stron WWW
zarejestrowanych w tabeli
praca_poszukiwana wraz z ich
informacjami kontaktowymi. Napisz
także drugie zapytanie, które odnajdzie oferty
pracy dla autorów tekstów technicznych.
Tworzenie widoku
Tworzenie widoku jest naprawdę bardzo proste. Wystarczy poprzedzić
zwyczajne zapytanie poleceniem SQL &5($7(9,(:. A zatem utwórzmy
dwa widoki na podstawie zapytań używanych przez Franka:
&($7(9,(:SURMHNWDQFLBVWURQ$6
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQPNHPDLO
)520PRMHBNRQWDNW\PN Można by tu także zas
złączenie INNER JOIN tosować
1$785$/-2,1SUDFDBSRV]XNLZDQDSS ON mk.id_kontaktu = z klauzulą:
pp.id_kontaktu.
:+(5(SSVWDQRZLVNR
SURMHNWDQWVWURQ:::
&5($7(9,(:SUDFDBGODBSLVDU]\BWHFKQLF]Q\FK$6
6(/(&7VWDQRZLVNRSHQVMDRSLVNRGBSRF]WRZ\
)520RIHUW\BSUDF\
:+(5(VWDQRZLVNR
DXWRUWHNVWRZWHFKQLF]Q\FK
WYSIL
SZARE KOMÓRKI
A jak Ty sądzisz, jak wygląda polecenie SQL pozwalające
skorzystać z widoku?
&($7(9,(:SURMHNWDQFLBVWURQ$6
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQPNHPDLO
Pamiętaj, że możemy
)520PRMHBNRQWDNW\PN pominąć słowa kluczowe AS.
1$785$/-2,1SUDFDBSRV]XNLZDQDSS
:+(5(SSVWDQRZLVNR
SURMHNWDQWVWURQ:::
6(/(&7
)520SURMHNWDQFLBVWURQ
To jest nazwa
widoku.
tlenia
I tak dalej, aż do wyświektórych
wszystkich rekordów, w została
w kolumnie stanowisko ktant
zapisana wartość 'proje
stron WWW'.
6(/(&7
)520SURMHNWDQFLBVWURQ
Polecenie to oznacza: „Zwróć wszystkie wyniki zapytania, które
pobiera imię, nazwisko, telefon i e-mail wszystkich osób z tabeli
PRMHBNRQWDNW\ szukających pracy jako projektant stron WWW”.
6(/(&7
)520
6(/(&7PNLPLHPNQD]ZLVNRPNWHOHIRQPNHPDLO
)520PRMHBNRQWDNW\PN
1$785$/-2,1SUDFDBSRV]XNLZDQDSS
:+(5(SSVWDQRZLVNR
SURMHNWDQWVWURQ:::
$6SURMHNWDQFLBVWURQ
To jest zapytanie,
którego użyliśmy Dla naszego podzapytania
podczas tworzenia tworzymy nazwę zastępczą,
widoku. aby zapytanie potraktowało
je jako tabelę.
Czym są widoki
Najprościej rzecz ujmując, widok jest tabelą, która istnieje wyłącznie
w momencie, gdy widok jest używany w zapytaniu. Są one uważane za
tabele wirtualne, gdyż działają jak tabele i można na nich wykonywać
te same operacje, co na „zwyczajnych” tabelach.
kolumna kolumna
kolumna kolumna
dane dane
dane dane
dane dane
dane dane
dane dane
dane kolumna kolumna
dane kolumna
dane dane
dane dane dane
dane dane
dane
dane
korzystają.
Nie pisaliśmy o tym w niniejszej książce, jednak wcześniej czy później dojdzie do tego,
że swoją znajomość SQL-a wykorzystasz wraz z jakąś inną technologią do napisania Te tabele is
tn
aplikacji. Dzięki widokom będziesz w stanie zmieniać strukturę bazy danych i jednocześ- dlatego, że użieją tylko
widoku w po yliśmy
nie tworzyć widoki udające jej wcześniejszą postać, dzięki czemu unikniesz konieczności SELECT. leceniu
modyfikowania aplikacji korzystających z informacji przechowywanych w bazie.
To jest faktycznie spore wyzwanie, jednak trzeba wiedzieć, że każde polecenie SELECT może posłużyć do
utworzenia widoku. Zacznij od określenia odpowiedzi na poniższe pytania, a następnie napisz zapytanie
dla Franka i zapisz go jako widok, nadając mu nazwę wzrost_plac.
Ćwiczenie
Jakich kolumn z tych tabel należy użyć do wyznaczenia oczekiwanego przyrostu płac?
To jest faktycznie spore wyzwanie, jednak trzeba wiedzieć, że każde polecenie SELECT może posłużyć do
utworzenia widoku. Zacznij od określenia odpowiedzi na poniższe pytania, a następnie napisz zapytanie
dla Franka i zapisz go jako widok, nadając mu nazwę wzrost_plac.
Rozwiązanie
ćwiczenie
Odjąć aktualną pensję od minimalnej pensji oczekiwanej i nadać tej wartości jakąś nazwę zastępczą.
A teraz poniżej napisz zapytanie dla Franka:
6(/(&7
)520Z]URVWBSODF
i uzyska potrzebne informacje.
Zaostrz ołówek
Zakładając, że Franek wykona polecenie 6(/(&7 przedstawione na stronie 498, używając przy tym
widoku Z]URVWBSODF, to w jaki sposób może posortować wyniki alfabetycznie według nazwiska?
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
id moneta rok_wybicia
1 J 2003
2 P 2001
3 P 1995
3 D 2000
4 J 1998
5 D 2001
6 P 2007
7 J 2006
8 J 1997
9 P 2000
10 D 1999
A teraz napiszmy widok, który będzie zwracał wyłącznie wiersze z monetami o nominale jednego złotego:
&5($7(9,(:$6]ORWRZNLBZBVNDUERQFH
6(/(&7
)520VNDUERQND
:+(5(PRQHWD
-
WYSIL
SZARE KOMÓRKI
Jaką postać będzie miała tabela wynikowa zwrócona po wykonaniu
następującego polecenia:
6(/(&7 )520]ORWRZNLBZBVNDUERQFH
Spróbuj to zrobić w domu. Utwórz tabelę VNDUERQND oraz dwa widoki VZBMHG\QNL
i VZBGZRMNL, korzystając przy tym z poleceń przedstawionych poniżej.
Ćwiczenie
,16(57,172VNDUERQND9$/8(6
-
3
3
'
-
'
3
-
-
3
'
&5($7(9,(:VZBMHG\QNL$66(/(&7
)520VNDUERQND:+(5(PRQHWD
-
&5($7(9,(:VZBGZRMNL$66(/(&7
)520VNDUERQND:+(5(PRQHWD
'
:,7+&+(&.237,21
Zapisz, co się stanie podczas próby wykonania każdego z przedstawionych poniżej Wykonując dalszą część
ćwiczenia, spróbuj się
poleceń ,16(57, '(/(7( oraz 83'$7(. Na samym końcu ćwiczenia narysuj wynikową domyślić, jakie znaczenie
zawartość tabeli VNDUERQND. mają te słowa.
,16(57,172VZBMHG\QNL9$/8(6
-
,16(57,172VZBMHG\QNL9$/8(6
'
,16(57,172VZBGZRMNL9$/8(6
-
'(/(7()520VZBMHG\QNL:+(5(PRQHWD
3
25PRQHWD
'
83'$7(VZBMHG\QNL6(7PRQHWD
-
:+(5(PRQHWD
3
Spróbuj to zrobić w domu. Utwórz tabelę VNDUERQND oraz dwa widoki VZBMHG\QNL
i VZBGZRMNL, korzystając przy tym z poleceń przedstawionych poniżej.
Rozwiązanie
ćwiczenia
,16(57,172VNDUERQND9$/8(6
-
3
3
'
-
'
3
-
-
3
'
&5($7(9,(:VZBMHG\QNL$66(/(&7
)520VNDUERQND:+(5(PRQHWD
-
&5($7(9,(:VZBGZRMNL$66(/(&7
)520VNDUERQND:+(5(PRQHWD
'
:,7+&+(&.237,21
Zapisz, co się stanie podczas próby wykonania każdego z przedstawionych poniżej Wykonując dalszą część
ćwiczenia, spróbuj się
poleceń ,16(57, '(/(7( oraz 83'$7(. Na samym końcu ćwiczenia narysuj wynikową domyślić, jakie znaczenie
zawartość tabeli VNDUERQND. mają te słowa.
,16(57,172VZBMHG\QNL9$/8(6
-
'
,16(57,172VZBGZRMNL9$/8(6
-
Próba wykonania tego polecenia skończy się zgłoszeniem błędu, a wszystko
ze względu na klauzulę CHECK OPTION zastosowaną podczas tworzenia widoku.
Powoduje ona, że zanim informacje zapisywane w widoku będą mogły trafić
do tabeli, zostaną sprawdzone przy użyciu warunku WHERE.
'(/(7()520VZBMHG\QNL:+(5(PRQHWD
3
25PRQHWD
'
id moneta rok_wybicia
1 J 2003
To polecenie nie ma żadnego wpływu na zawartość tabeli, 2 P 2001
gdyż widok sw_jedynki operuje wyłącznie na monetach 3 P 1995
spełniających warunek moneta = 'J'. 3 D 2000
4 J 1998
83'$7(VZBMHG\QNL6(7PRQHWD
-
:+(5(PRQHWD
3
5 D 2001
6 P 2007
Także to polecenie nie będzie miało wpływu na 7 J 2006
zawartość tabeli, gdyż widok sw_jedynki nie zwraca 8 J 1997
9 P 2000
żadnych monet spełniających warunek moneta = 'P'.
10 D 1999
11 J 1999
Ostatecznie tabela będzie
wyglądać następująco: 12 D 1997
'5239,(:VZBGZRMNL
Nie istnieją
głupie pytania
P.:Czy można w jakiś sposób sprawdzić, jakie P.: Rozumiem, jak bardzo przydatne jest
widoki są dostępne? zastosowanie widoków i klauzuli CHECK
w sytuacjach, gdy bazy danych używa więcej
O.: Widoki są prezentowane tak, jakby były tabelami. Można niż jedna osoba. Co się jednak dzieje, kiedy dwie
zatem wykonać polecenie 6+2:7$%/(6, by wyświetlić listę osoby jednocześnie próbują zmienić wartość tej
wszystkich zdefiniowanych tabel i widoków. I podobnie jak samej kolumny?
w przypadku tabel, istnieje możliwość zastosowania polecenia
'(6& w celu wyświetlenia szczegółowych informacji o strukturze O.: Aby odpowiedzieć na to pytanie, musimy przedstawić
widoku. transakcje. Jednak zanim będziemy mogli to zrobić, pani
Marudzińska musi wyciągnąć z bankomatu nieco gotówki.
P.:Co się stanie, jeśli usunę tabelę, która jest
używana w jakimś widoku?
8"-65&, 8"-65&,
/"3"$)6/,6 /"3"$)6/,6
30;-*$;&/*08:. 04;$;ò%/0Ą$*08:.
13;&-&+8"-65&,
;3"$)6/,630;-*$;&/*08&(0/"
04;$;ò%/0Ą$*08:
3"$)6/&, 3"$)6/&,
30;-*$;&/*08: 04;$;ò%/0Ą$*08:
8"-65&, 8"-65&,
/"3"$)6/,6 /"3"$)6/,6
30;-*$;&/*08:. 04;$;ò%/0Ą$*08:.
Bankomat: (myśli…)<4&-&$5%045&1/&@430%,*'30.
3"$)6/&,@30;-*$;&/*08:8)&3&*%@,0/5"
4&-&$5%045&1/&@430%,*'30.3"$)6/&,@
04;$;&%/04$*08:8)&3&*%@,0/5">
8:(-í%"505",/"3"$)6/,630;-*$;&/*08:.
*/"3"$)6/,604;$;ò%/0Ą$*08:.
Pani Marudzińska: No to przelej 1000 walutek z rachunku rozliczeniowego na
oszczędnościowy.
Bankomat:504103",805""-&/*&$)#ò%;*&;"5&.
5",
<45"/3"$)6/,630;-*$;&/*08&(0 >;"5&.
,-*&/5,"."%04:ä8"-65&,>
<0%&+.*+;3"$)6/&,@30;-*$;&/*08:>
<*/4&351******1>
Bankomat:
W tym miejscu
wysiadło zasilanie. Bankomat:
Bankomat:)333;;;;;;;;;
Bankomat:"""
Bankomat:)&+50Đ501"/*8*&4à"8"."36%;*ú4,"
8*5".1"/*í</6.&33"$)6/,6>
Pani Marudzińska: Powiedz mi, ile mam pieniędzy.
Bankomat: (myśli…)<4&-&$5%045&1/&@430%,*'30.
3"$)6/&,@30;-*$;&/*08:8)&3&*%@,0/5"
4&-&$5%045&1/&@430%,*'30.3"$)6/&,@
04;$;&%/04$*08:8)&3&*%@,0/5">
8:(-í%"505",/"3"$)6/,630;-*$;&/*08:.
*/"3"$)6/,604;$;ò%/0Ą$*08:.
Bankomat:"66650$00,à"%"1"/*1*òĄ$*".*50.®+
.0/*503Đ&(/".1"/*í1"/*8*&4à"80."36%;*ú4,"
WYSIL
SZARE KOMÓRKI
W jaki sposób możemy uchronić się przed tym, że bankomat
zapomni zapisać pieniędzy na rachunek oszczędnościowy
pani Marudzińskiej?
W międzyczasie w innym miejscu miasta…
LEWY Bank
Oto baza danych, która Powszechny Bank
Bazodanowy
przechowuje informacje
o stanie konta Janka i Marysi.
Stan konta:
350 walutek
samej
Janek i Marysia próbują w tej ólnego
chwili wyciągnąć ze swojego wsp
konta 300 walutek.
Jeśli stan rachunku rozliczeniowego >= 300 Jeśli stan rachunku rozliczeniowego >= 300
Odejmij 300 od rachunku rozliczeniowego Odejmij 300 od rachunku rozliczeniowego
Wydaj 300 walutek Wydaj 300 walutek
Transakcja Ja
wykonywana nka Transakcja Marysi
Lewego Ban w bankomacie wykonywana w bankomacie
ku.
Powszechnego Banku
Stan konta: Bazodanowego.
350 walutek
To poleceni
Cię z pow e przenosi … bądź wydać polecenie
52//%$&. początek trrotem na sam
ansakcji.
ROLLBACK, by wycofać
wszystkie operacje i przywrócić
bazę do stanu, w jakim była
przed rozpoczęciem transakcji.
Jeśli coś pójdzie nie tak jak powinno, to Twój kod SQL.
polecenie 52//%$&. wycofuje wszystkie polecenia Zanim zacząłeś Miejsce,
i przywraca bazę do stanu, w jakim była przed transakcję. w którym
zacząłeś.
wydaniem polecenia 67$57 75$16$&7,21.
Bankomat: )&+50Đ501"/*8*&4à"8"."36%;*ú4,"
BAZODANOWA KASA 8*5".1"/*í</6.&33"$)6/,6>
OSZCZĘDNOŚCIOWA
Pani Marudzińska: Powiedz mi, ile mam pieniędzy na rachunkach.
4&-&$5%045&1/&@430%,*'30.3"$)6/&,@
04;$;&%/04$*08:8)&3&*%@,0/5">
8:(-í%"505",/"3"$)6/,630;-*$;&/*08:.
*/"3"$)6/,604;$;ò%/0Ą$*08:.
Bankomat: 504103",805""-&/*&$)#ò%;*&;"5&.
5",
<45"/3"$)6/,630;-*$;&/*08&(0 >;"5&.
,-*&/5,"."%04:ä8"-65&,>
<0%&+.*+;3"$)6/&,@30;-*$;&/*08:>
<*/4&351******1>
#"/,0."5/";"4*-"/*6"8"3:+/:.30--#"$,
W tym miejscu
wysiadło zasilanie. Bankomat:
Bankomat:
Bankomat: )333;;;;;;;;;
Bankomat: """
Bankomat: )&+50Đ501"/*8*&4à"8"."36%;*ú4,"
8*5".1"/*í</6.&33"$)6/,6>
WSZYSTKICH KOLUMN PRZYJM
z typów mechanizmów składowania pozwalają na DOMYwLNIE WARTOwÁ 18//
0ODCZAS TWORZENIA TABELI
stosowanie transakcji, a inne nie. CQD]ZLVNRCYDUFKDUGHIDXOW18// WARTO OKREwLIÁ CZY
W JEJ POSZCZEGÎLNYCH
CLPLHCYDUFKDUGHIDXOW18// KOLUMNACH MOG BYÁ
ZAPISYWANE WARTOwCI
Cofnij się do rozdziału 4., w którym to poznałeś CHPDLOCYDUFKDUGHIDXOW18// 18// CZY TE NIE
CSOHFCFKDUGHIDXOW18//
polecenie:
CGDWDBXURG]HQLDCGDWHGHIDXOW18//
C]DZRGCYDUFKDUGHIDXOW18//
6+2:&5($7(7$%/(PRMHBNRQWDNW\ CORNDOL]DFMDCYDUFKDUGHIDXOW18//
CVWDQCYDUFKDUGHIDXOW18//
C]DLQWHUHVRZDQLDCYDUFKDUGHIDXOW18//
W tym przypadku obc CV]XNDCYDUFKDUGHIDXOW18//
hod
nas używany mechaniz zi (1*,1( ,QQR'%'()$8/7&+$56(7 ODWLQ
składowania. m
-RY¨
WYÒXK
Lc
ZYZ\KaS¨
Z\dOT\dc]^YĨ
UYN_
_]_aKT¦M
TOQY
ANY ZBIÎR ZNAKÎW *AK NA RAZIE W
za nawiasem zamy
ZUPENOwC kając
I WYSTARC ym.
Z NAM U Okreś
STAWIENIA la
DOMYwLNE TONXKU
Lc
_^aY\dc¨
^KLOV°
XSO
^\dOLK
aZ\YaKNdK¨
a
XSW
BÅDZIESZ MUSIA ZMIENIÁ
oraz używanyTABELI NO CH w. Jak na
znakó NAZWÅ
zbiórYBA E WCZE QY
]UYZSYaK¨
S
aUVOS¨
a
wNIEJ
razie w zupeł ności wystaELÅ
USUNIESZ ORYGINALN TAB rczą nam Z\dON]^KaSYXOT
ZY]^KMS
ie
ojn InnoDB oraz BDB to dwa spośród kilku
$/7(57$%/(WDEHOD7<3( ,QQR'%
514 Rozdział 11.
Ograniczenia, widoki i transakcje
67$5775$16$&7,21
6(/(&7
)520VNDUERQND
83'$7(VNDUERQND6(7PRQHWD
'
:+(5(PRQHWD
-
6(/(&7
)520VNDUERQND Teraz zmiany są widoczne.
67$5775$16$&7,21
6(/(&7
)520VNDUERQND
83'$7(VNDUERQND6(7PRQHWD
'
:+(5(PRQHWD
-
6(/(&7
)520VNDUERQND Teraz zmiany są widoczne.
Zaostrz ołówek
VNDUERQND
Określ zawartość tabeli VNDUERQND po wykonaniu każdej
z poniższych transakcji. A oto początkowa postać tabeli. id moneta rok_wybicia
1 D 1995
2 P 2000
3 J 2005
4 D 1999
2
$1'URNBZ\ELFLD 3
4
&200,7
id moneta rok_wybicia
67$5775$16$&7,21
1
83'$7(VNDUERQND6(7PRQHWD
-
:+(5(PRQHWD
'
2
3
52//%$&. 4
67$5775$16$&7,21
id moneta rok_wybicia
83'$7(VNDUERQND6(7PRQHWD
'
:+(5(PRQHWD
3
1
2
$1'URNBZ\ELFLD! 3
4
52//%$&.
id moneta rok_wybicia
67$5775$16$&7,21 1
2
83'$7(VNDUERQND6(7PRQHWD
3
:+(5(PRQHWD
-
3
$1'URNBZ\ELFLD! 4
&200,7
2GSRZLHG]L]QDMG]LHV]QDVWURQLH
Nie istnieją
głupie pytania
P.: Czy można zacząć transakcję bez P.: Dlaczego mam sobie zawracać głowę
stosowania polecenia START TRANSACTION, poleceniami COMMIT i ROLLBACK?
czy też polecenia COMMIT i ROLLBACK nie
mogą bez niego działać? O.:Po rozpoczęciu transakcji system zarządzania bazą
Zaostrz ołówek
Rozwiązanie Zakładając, że Franek wykona polecenie 6(/(&7 przedstawione na stronie 498, używając przy tym
widoku Z]URVWBSODF, to w jaki sposób może posortować wyniki alfabetycznie według nazwiska?
ze str. 499
1DOHİ\GRGDþNODX]XOĐ25'(5%<QD]ZLVNREċGĮWRGRZLGRNXSRGF]DVMHJR
WZRU]HQLDEċGĮSyĮQLHMGRSROHFHQLD6(/(&7ZNWyU\PZLGRN]RVWDQLHXİ\W\
Zaostrz ołówek
Określ zawartość tabeli VNDUERQND po wykonaniu każdej
VNDUERQND
Rozwiązanie z poniższych transakcji. A oto początkowa postać tabeli. id moneta rok_wybicia
ze str. 516 1 D 1995
2 P 2000
3 J 2005
4 D 1999
2 P 2000
$1'URNBZ\ELFLD 3 J 2005
4 D 1999
&200,7 Żadne rekordy nie
spełniają tych kryteriów,
więc nic się nie zmienia.
id moneta rok_wybicia
67$5775$16$&7,21
1 D 1995
83'$7(VNDUERQND6(7PRQHWD
-
:+(5(PRQHWD
'
2 P 2000
3 J 2005
Wycofanie transakcji, brak
52//%$&. zmian. 4 D 1999
67$5775$16$&7,21
id moneta rok_wybicia
83'$7(VNDUERQND6(7PRQHWD
'
:+(5(PRQHWD
3
1 D 1995
2 P 2000
$1'URNBZ\ELFLD! 3 J 2005
,
Wycofanie transakcji 4 D 1999
52//%$&. brak zmian.
id moneta rok_wybicia
67$5775$16$&7,21 1 D 1995
2 P 2000
83'$7(VNDUERQND6(7PRQHWD
3
:+(5(PRQHWD
-
3 P 2005
Ten wiersz
$1'URNBZ\ELFLD! został zmieniony.
4 D 1999
&200,7
Problemy użytkowników
Śledzenie klownów rozwinęło się na taką skalę, iż Rada Miejska
Bazodanowa musiała zatrudnić cały zespół osób, które na
pełny etat zajmują się śledzeniem klownów oraz zapisywaniem „Jurek” —
w przebra klown
informacji o ich poczynaniach w bazie danych NORZQLBPLHMVF\. niu.
info_aktywnosci aktywnosci
id id_aktywnosci
id_aktywnosci aktywnosc
klowni_informacje
id
imie
plec lokalizacja
info_lokalizacja
opis id id_lokalizacji
id_lokalizacji
lokalizacja
kiedy
Zaostrz ołówek
Rozwiązanie Zabezpiecz bazę danych klownów przed potencjalnym sabotażem. Poniżej zapisz w dwóch
kolumnach przykłady zapytań, które nowi pracownicy będą mogli wykonywać lub nie.
Jeśli to możliwe, podaj nazwy tabel, na których zapytania będą operować.
Nowi pracownicy powinni mieć możliwość Nowi pracownicy nie powinni mieć możliwości
wykonywania zapytań: wykonywania zapytań:
przykład: przykład:
SELECT z tabeli aktywnosci DROP TABLE na tabeli klowni_informacje
Zaostrz ołówek
Rozwiązanie Zabezpiecz bazę danych klownów przed potencjalnym sabotażem. Poniżej zapisz w dwóch
kolumnach przykłady zapytań, które nowi pracownicy będą mogli wykonywać lub nie.
Jeśli to możliwe, podaj nazwy tabel, na których zapytania będą operować.
Nowi pracownicy powinni mieć możliwość Nowi pracownicy nie powinni mieć możliwości
wykonywania zapytań: wykonywania zapytań:
przykład: przykład:
SELECT z tabeli aktywnosci DROP TABLE na tabeli klowni_informacje
6(73$66:25')25
URRW
#
ORFDOKRVW
3$66:25'
EGFZQ]
'localhost' określa,
Nazwa użytkownika że
relacyjną bazą danyc system zarządzania A to jest hasło, jakie
administratora to 'root'.
i działa na lokalnym h został zainstalowany wybraliśmy dla naszego
komputerze. administratora.
DOWHUXVHUURRWLGHQWLILHGE\QRZHKDVïR
Jeśli do zarządzania bazą danych używasz programu z graficznym interfejsem
użytkownika, to zapewne będziesz mógł zmienić hasło administratora w znacznie
prostszy sposób, korzystając z jakiegoś okna dialogowego. Najważniejsze w tym
przypadku nie jest to, jak zmienisz to hasło, lecz że koniecznie powinieneś je zmienić.
Zajrzyj też do dokumentacji używanego systemu zarządzania relacyjnymi bazami
danych, by znaleźć dodatkowe informacje dotyczące zabezpieczania konta
administratora.
Nie istnieją
głupie pytania
P.: Wciąż nie do końca rozumiem, co oznacza P.: A jeśli używane przeze mnie oprogramowanie
„localhost”. Czy możesz mi to dokładniej do wykonywania poleceń SQL jest uruchamiane na
wytłumaczyć? innym komputerze niż serwer bazy danych?
O.: ORFDOKRVW oznacza, że komputer używany do O.: W takim przypadku mamy do czynienia z dostępem
wykonywania poleceń SQL jest tym samym komputerem, na zdalnym i będziesz musiał określić, gdzie znajduje się używany
którym zainstalowano system zarządzania relacyjnymi bazami przez Ciebie komputer. Możesz w tym celu podać jego adres
danych. ORFDOKRVW jest domyślną wartością tego parametru, IP lub nazwę. Na przykład: gdyby oprogramowanie używane
zatem określanie go jest opcjonalne. przez Ciebie do wykonywania poleceń SQL znajdowało się na
komputerze o nazwie kaktus w sieci mojasuperfirma.pl, to
mógłbyś określić konta administratora w następujący sposób:
URRW#NDNWXVPRMDVXSHUILUPDSO. Oczywiście takiego
komputera nie ma, zatem użycie tego konta nic by Ci nie dało.
jesteś tutaj 525
Tworzenie nowego użytkownika
PDJLF]QHB]ZLHU]HWD
spiewa tanczy
id_zwierzecia typ
T T
1 błękitny ptak
T T
2 borsuk
N N
3 jeleń
T T root Ważniak Doktorek Głupek
4 wiewiórka
Tabele
RERZLD]NLBGRPRZH
id_obowiazku nazwa czas lokalizacja
1 mycie 21:30 kuchnia
2 cerowanie 10:00 pralnia
3 gotowanie 17:00 kuchnia
4 ścielenie łóżek 7:35 sypialnia
Pyskacz Szczęściarz Śpioch Ziewacz
Użytkownikowi prz
yd
uprawnienie do wy ziela się
poleceń SELECT… konywania
*5$176(/(&721DNW\ZQRVFL72HOL]D
*5$176(/(&721ORNDOL]DFMD72HOL]D
*5$176(/(&721LQIRBDNW\ZQRVFL72HOL]D
*5$176(/(&721LQIRBORNDOL]DFMD72HOL]D
Skoro już zapanowałeś nad uprawnieniami Elizy, postaraj się określić, jakie skutki dla bazy danych
OHVQ\BGRPHN ze strony 527 będą miały następujące polecenia *5$17.
1. *5$17,16(5721PDJLF]QHB]ZLHU]HWD
72GRNWRUHN
2. *5$17'(/(7(21RERZLD]NLBGRPRZH
72V]F]HVFLDU]VSLRFK
3. *5$17'(/(7(21RERZLD]NLBGRPRZH
72V]F]HVFLDU]VSLRFK
:,7+*5$17237,21
Podpowiedź:
To jest nazwa
4. *5$176(/(&7QD]ZD21 kolumny.
RERZLD]NLBGRPRZH72JOXSHN
5. *5$176(/(&7,16(5721
PDJLF]QHB]ZLHU]HWD
72]LHZDF]
6. *5$17$//21PDJLF]QHB]ZLHU]HWD
72ZD]QLDN
Skoro już zapanowałeś nad uprawnieniami Elizy, postaraj się określić, jakie skutki dla bazy danych
OHVQ\BGRPHN ze strony 527 będą miały następujące polecenia *5$17.
Usuwanie uprawnień
Załóżmy, że zdecydujemy się usunąć uprawnienie do wykonywania poleceń 6(/(&7,
które wcześniej nadaliśmy Elizie. Aby to zrobić, będziemy musieli użyć polecenia 5(92.(.
Czy pamiętasz nasze proste polecenie *5$17? Składnia polecenia 5(92.( jest niemal
identyczna; różni się jedynie tym, że zamiast „grant” występuje słowo „revoke” oraz
zamiast „to” słowo „from”.
ienie
Usuwamy uprawn leceń
wy ko ny wa nia po
do
SELECT.
5(92.(6(/(&721
NORZQLBLQIRUPDFMH
)520HOL]D
Zabieramy to uprawnien
ie
wskazanemu użytkownikow
i.
Usuwamy jedynie
uprawnienie GRANT OPTION.
Zezwala na wykonywanie
poleceń DELETE w tabeli
root obowiazki_domowe, Śpioch Przydziela uprawnienie Ziewacz
używając przy tym do usuwania wierszy
klauzuli GRANT OPTION. z tabeli obowiazki_domowe.
WYSIL
SZARE KOMÓRKI
Właśnie masz zamiar poznać słowa kluczowe 5(675,&7 oraz
&$6&$'(. Jak sądzisz, jakie możliwości zapewnia każde z nich?
Precyzyjne usuwanie
Istnieją dwa sposoby usuwania uprawnień, które
pozwalają mieć pewność, że przypadkowo
nie odbierzemy uprawnień innym osobom niż
te, którym planowaliśmy je odebrać. Słowa
kluczowe &$6&$'( oraz 5(675,&7 umieszczone Zezwala na wykonywanie
poleceń DELETE w tabeli
w pleceniu 5(92.( pozwalają znacznie bardziej obowiazki_domowe,
Przydziela
Śpioch do usuw uprawnienie Ziewacz
root ania wier
precyzyjnie określić, komu chcemy pozostawić używając przy tym z tabeli obowiaz szy
klauzuli GRANT OPTION. ki_domowe.
uprawnienia, a komu je odebrać.
Pierwsze z tych słów kluczowych, &$6&$'(, odbiera uprawnienie wskazanemu
użytkownikowi (w naszym przypadku będzie to Śpioch) oraz wszystkim innym,
którym wskazany użytkownik udzielił tego samego uprawnienia.
5(92.('(/(7(21RERZLD]NLBGRPRZH)520VSLRFK&$6&$'(
CASCADE oznacza, że
polecenie REVOKE będzie
się odnosić do wskazanego
Śpioch nic nie użytkownika oraz do
Odbiera Śpiochowi robi, jednak wszystkich pozostałych,
uprawnienie do także Ziewacz którym przekazał on
wykonywania poleceń traci swoje to samo uprawnienie.
DELETE wraz uprawnienie.
root z klauzulą Śpioch Ziewacz
GRANT OPTION.
5(92.('(/(7(21RERZLD]NLBGRPRZH)520VSLRFK5(675,&7
Jeśli w przypadku
zastosowania w poleceniu
REVOKE słowa kluczowego
RESTRICT wykonanie
Próbuje odebrać … co się jednak nie tego polecenia miałoby
Śpiochowi uprawnienie udaje, gdyż wykonanie spowodować odebranie
do wykonywania poleceń polecenia REVOKE uprawnień jakiemukolwiek
DELETE w tabeli miałoby także wpływ innemu użytkownikowi
root obowiazki_domowe… Śpioch na uprawnienia Ziewacz niż wskazany, to próba
Ziewacza. wykonania polecenia
zakończy się zgłoszeniem
W powyższym przypadku obaj użytkownicy zachowali swoje błędu.
uprawnienia, a użytkownik root zobaczył komunikat o błędzie.
Polecenie nie zostało wykonane i pojawił się błąd, gdyż wykonanie
polecenia spowodowałoby odebranie uprawnień także Ziewaczowi.
534 Rozdział 12.
Bezpieczeństwo
Zaostrz ołówek
Ktoś ciągle przydziela Elizie nieodpowiednie uprawnienia. Napisz prawidłowe polecenia 5(92.(,
dzięki którym ponownie będzie ona dysponować wyłącznie uprawnieniem do wykonywania
poleceń 6(/(&7.
*5$176(/(&7,16(57'(/(7(21ORNDOL]DFMD72HOL]D
*5$17$//21NORZQLBLQIRUPDFMH72HOL]D
*5$176(/(&7,16(5721DNW\ZQRVFL72HOL]D
*5$17'(/(7(6(/(&721LQIRBORNDOL]DFMD72HOL]D
:,7+*5$17237,21
Zaostrz ołówek
Rozwiązanie Ktoś ciągle przydziela Elizie nieodpowiednie uprawnienia. Napisz prawidłowe polecenia 5(92.(,
dzięki którym ponownie będzie ona dysponować wyłącznie uprawnieniem do wykonywania
poleceń 6(/(&7.
*5$176(/(&7,16(57'(/(7(21ORNDOL]DFMD72HOL]D
*5$17$//21NORZQLBLQIRUPDFMH72HOL]D
Nie istnieją
głupie pytania
P.: Wciąż myślę o poleceniach GRANT, O.: Podobnie jak wszystkie polecenia P.: A co się stanie, jeśli dwie odrębne
w których są określane nazwy kolumn. przedstawiane w tym rozdziale, także osoby przydzielą Ziewaczowi
Co się dzieje, kiedy przydzielimy i to zależy od używanego systemu z poprzedniego przykładu jakieś
użytkownikowi uprawnienie do zarządzania relacyjnymi bazami danych. uprawnienia, a następnie administrator
wykonywania poleceń INSERT, ale W MySQL-u takie globalne uprawnienia odbierze mu jedno z nich?
tylko na jednej kolumnie tabeli? można nadawać w następujący sposób:
O.: Dopiero wtedy zaczną się prawdziwe
O.: To dobre pytanie. W praktyce takie *5$176(/(&721
problemy. W niektórych bazach danych, jeśli
uprawnienie jest raczej nieprzydatne. Jeśli możesz 72HOL]D została zastosowana opcja &$6&$'(, to nie
określić wartość tylko jednej kolumny, to i tak nie Pierwsza gwiazdka oznacza wszystkie ma znaczenia, od kogo pochodzi odbierane
jesteś w stanie dodać do tabeli nowego wiersza. bazy danych, a druga wszystkie tabele. uprawnienie, w innych natomiast ma. Także
Takie rozwiązanie może zatem działać tylko w tym przypadku będziesz zatem musiał przejrzeć
w jednym przypadku — kiedy tabela będzie się P.: Czy opcja CASCADE dokumentację używanego oprogramowania.
składać wyłącznie z jednej kolumny — tej, do jest domyślnie stosowana
której użytkownik ma uprawnienia. w poleceniach REVOKE? P.: Czy oprócz tabel i kolumn są
jeszcze jakieś inne obiekty bazy
P.:Czy są także inne, równie O.: Zazwyczaj tak. Faktycznie opcja danych, do których można przydzielać
bezużyteczne wersje polecenia ta jest domyślna, ale trzeba powtórzyć uprawnienia poleceniem GRANT
GRANT? jeszcze raz: wszystko zależy od i odbierać poleceniem REVOKE?
O.: Niemal wszystkie uprawnienia odwołujące używanego systemu zarządzania bazami
danych. O.: Dokładnie w taki sam sposób można używać
się do poszczególnych kolumn są raczej tych poleceń w celu przydzielania i odbierania
nieprzydatne, chyba że dotyczą polecenia
6(/(&7.
P.: Co się stanie, jeśli spróbuję praw dostępu do widoków, chyba że widok nie
odebrać użytkownikowi pozwala na aktualizację danych w tabelach. Jeśli
P.: Załóżmy, że chcę dodać nowego uprawnienie, którego w ogóle widok nie pozwala na aktualizację, to nie możesz
używać go do wykonywania poleceń ,16(57.
użytkownika i przydzielić mu nie posiadał?
uprawnienia do wykonywania poleceń Nie jest to możliwe, nawet jeśli miałbyś do tego
SELECT we wszystkich tabelach we O.: Zostanie wyświetlony komunikat uprawnienia. I podobnie jak w przypadku tabel
wszystkich bazach danych. Czy można o błędzie informujący o braku możesz także przydzielać prawa dostępu do
to zrobić w jakiś szybki i prosty sposób? uprawnień. poszczególnych kolumn widoku.
ZVSROQHBNRQWR
JORZQDBED]DBGDQ\FK
*5$176(/(&7,16(5721MDNDVBWDEHOD72ZSURZDG]DQLHBGDQ\FK
nia,
Przypisując uprawnie
zam ias t na zw y
y
użytkownika możem roli.
także podać nazwę
Stosowanie roli
Przed utworzeniem roli mogliśmy przydzielać
użytkownikom zajmującym się wpisywaniem danych Przydziela
niezbędne uprawnienia, korzystając z polecenia *5$17, uprawnienia
na przykład takiego jak poniższe: root do wykonywania
poleceń SELECT Doktorek
i INSERT w tabeli
magiczne_zwierzeta
*5$176(/(&7,16(57 użytkownikowi.
21PDJLF]QHB]ZLHU]HWD
72GRNWRUHN Stary sposób
PDJLF]QHB]ZLHU]HWD
id_zwierzecia typ spiewa tanczy
1 błękitny ptak T T
2 borsuk T T
3 jeleń N N
4 wiewiórka T T
*5$17ZSURZDG]DQLHBGDQ\FK72GRNWRUHN
Doktorek
nazwę
Nazwa roli zastępuje .
tabeli oraz uprawnienia
PRZYDZIELA
ZSURZDG]DQLHBGDQ\FK
root
PDJLF]QHB]ZLHU]HWD
id_zwierzecia typ spiewa tanczy
Usuwanie roli 1 błękitny ptak T T
2 borsuk T T
3 jeleń N N
Kiedy rola nie będzie Ci już potrzebna, nie będzie powodu, by ją dłużej 4 wiewiórka T T
przechowywać. W każdej chwili możesz usunąć rolę, używając do tego celu
polecenia '523 o następującej postaci:
'52352/(ZSURZDG]DQLHBGDQ\FK
Nie istnieją
głupie pytania
P.:A jeśli chciałbym przydzielić uprawnienia do P.: Czy to oznacza, że jeśli użytkownik
wszystkich tabel w bazie? Czy muszę podawać ma jakąś rolę, która następnie zostanie usunięta,
nazwę każdej z nich? to użytkownik straci uprawnienia skojarzone
z tą rolą?
O.: Nie, możesz użyć następującej składni:
*5$176(/(&7,16(57'(/(7(
O.: Dokładnie tak. To odpowiednik sytuacji, w której
przydzieliłbyś użytkownikowi uprawnienia ręcznie, a następnie
21OLVWDBJU]HVLD
odebrał je, używając polecenia 5(92.(. Jednak w tym przypadku
72MR]HN zamiast zmienić uprawnienia pojedynczego użytkownika,
odbierzesz je wszystkim użytkownikom, którym została
A zatem wystarczy, że podasz nazwę bazy danych i gwiazdkę przypisana rola.
— w ten sposób przypiszesz podane uprawnienia do wszystkich
tabel w bazie danych. P.: Czy użytkownik może w danej chwili posiadać
P.:
więcej niż jedną rolę?
A jeśli rola została przypisana jakiemuś
użytkownikowi, to czy można ją usunąć? O.: Owszem. Należy tylko upewnić się, że pomiędzy
poszczególnymi rolami nie występują konflikty uprawnień, gdyż
O.: Można usuwać używane role. Musisz jednak bardzo w przeciwnym razie możesz sobie przysporzyć wielu problemów.
uważać, usuwając role, by nie odciąć użytkowników Pamiętaj, że odebranie konkretnego uprawnienia ma wyższy
od uprawnień, które są im potrzebne. priorytet niż przydzielenie tego uprawnienia.
Zaostrz ołówek
Usuwanie uprawnień przydzielonych przy użyciu roli
Usuwanie uprawnień przydzielonych przy wykorzystaniu roli działa bardzo podobnie, jak usuwanie
uprawnień przypisanych przy użyciu polecenia *5$17. Sprawdź, czy bez zaglądania do
wcześniejszej części rozdziału będziesz potrafił napisać polecenie, które usunie przypisanie roli
ZSURZDG]DQLHBGDQ\FK użytkownikowi Doktorek.
Zaostrz ołówek
Rozwiązanie Usuwanie uprawnień przydzielonych przy wykorzystaniu roli działa bardzo podobnie, jak usuwanie
uprawnień przypisanych przy użyciu polecenia *5$17. Sprawdź, czy bez zaglądania do
wcześniejszej części rozdziału będziesz potrafił napisać polecenie, które usunie przypisanie roli
ZSURZDG]DQLHBGDQ\FK użytkownikowi Doktorek.
*5$17ZSURZDG]DQLHBGDQ\FK72GRNWRUHN:,7+$'0,1237,21
Także w przypadku stosowania ról można stosować w poleceniu 5(92.( znane nam już
słowa kluczowe &$6&$'( oraz 5(675,&7. Zobaczmy, jak one działają:
5(92.(ZSURZDG]DQLHBGDQ\FK)520GRNWRUHN&$6&$'(
W razie zastosowania słowa
kluczowego CASCADE polecenie
REVOKE odbierze uprawnienia
wskazanemu użytkownikowi,
jak również wszystkim innym
użytkownikom, którym wskazany
Szczęściarz traci użytkownik je przydzielił.
uprawnienia
przypisane mu
Usuwa przypisaną przez Doktorka.
użytkownikowi
Doktorek rolę
root wprowadzanie_danych Doktorek Szczęściarz
5(92.(ZSURZDG]DQLHBGDQ\FK)520GRNWRUHN5(675,&7
W przypadku zastosowania
słowa kluczowego RESTRICT
próba wykonania polecenia
REVOKE zwróci błąd, jeśli
na skutek jego wykonania
zmieniłyby się uprawnienia
innych użytkowników.
… co się jednak
Próbuje usunąć nie udaje, gdyż
przypisanie roli spowodowałoby to
wprowadzanie_danych zmianę uprawnień
root użytkownikowi Doktorek…Doktorek użytkownika
Szczęściarz. Szczęściarz
Bądź GRZEŚKIEM
Twoim zadaniem jest po raz ostatni wcielić
się w postać Grześka i poprawić uprawnienia
użytkowników w bazie danych, tak by
pracownicy nie byli w stanie przypadkowo
zniszczyć danych.
Przeczytaj podane poniżej opisy zadań
poszczególnych pracowników i podaj
polecenia GRANT, które zapewnią
im dostęp do niezbędnych informacji,
a jednocześnie nie pozwolą na dostęp do danych,
na których nie powinni operować.
Kuba
Józek Franek: „Jestem odpowiedzialny za dopasowywanie osób
Franek do ofert pracy. Nigdy niczego nie zapisuję w bazie, jednak
usuwam z niej rekordy, kiedy znajdę dopasowanie lub gdy
oferta zostanie zrealizowana. Czasami muszę poszukać
informacji kontaktowych w tabeli PRMHBNRQWDNW\”.
Kuba: „Zajmuję się wpisywaniem wszystkich nowych danych
do całej bazy. Teraz, kiedy już nie mogę przypadkowo
zapisać wartości X w polu płci, naprawdę sprawnie zapisuję
dane. Jestem także odpowiedzialny za aktualizację danych.
Uczę się także, jak usuwać dane z bazy, jednak Grzesiek
kazał mi tego nie robić. Oczywiście nie wie o tym, ale…”
Józek: „Właśnie zostałem zatrudniony przez Grześka do
obsługi procesu dopasowywania osób i ofert pracy. Grzesiek
chciałby zintegrować swoją bazę danych z witryną WWW.
Jestem bardziej programistą niż specem od baz danych
i SQL-a, jednak potrafię pisać proste polecenia 6(/(&7.
Nie wykonuję natomiast poleceń ,16(57. I nie używam
Windows. Ech… nie… to tylko taki kiepski żart”.
kontakt_zainteresowanie zainteresowania
id_kontaktu id_zainteresowania
moje_kontakty
zawody id_kontaktu zainteresowanie
id_zawodu nazwisko id_zainteresowania
zawod imie
telefon
kod_pocztowy email kontakt_szuka szuka
kod_pocztowy plec id_kontaktu id_szuka
lokalizacja data_urodzenia szuka
wojewodztwo
id_zawodu
id_szuka
kod_pocztowy
stan
id_stanu id_stanu
stan
CRFEATE USER franek IDENTIFIED BY ‘jObM4tcH’; Nie przejmuj się, jeśli wymyślone
przez Ciebie hasła będą inne. Jeśli
CRFEATE USER kuba IDENTIFIED BY ‘NOmor3Xs’; tylko poszczególne elementy polecenia
zapisałeś w odpowiedniej kolejności,
to wszystko będzie w porządku!
CRFEATE USER jozek IDENTIFIED BY ‘s3LeCTDOOd’;
&5($7(86(5HOL]D
,'(17,),('%<
FYUSVZUG
*5$176(/(&721
NORZQLBLQIRUPDFMH
TO eliza;
*5$176(/(&721
NORZQLBLQIRUPDFMH
72HOL]D
,'(17,),('%<
FYUSVZUG
Tygodnik
BAZODETEKTYWISTYCZN
Y
Ogromny wzrost popu
larności Listy Grzesia.
FILIE I FORA
Przyjaciele i rodzina twierd
zą, że sława i popularność
wcale nie zmieniły Grześk
a.
Autor: Radek Wiersz
yński
ETATOWY DETEKT
YW BAZODANOWY
BAZODANOWO: Lo
kalny przedsiębiorca Gr
swoich pięciu minut. Jeg zesiek doczekał się
o internetowa baza dany
od miejsca do przechow ch rozrosła się
ywania adresów znajomy
wcześniej na karteczkach ch zapisywanych
, poprzez prostą tabelę
składającą się z wielu tab , bazę danych
el, aż do globalnej usług
dobieraniem osób do do i zajmującej się
stępnych ofert pracy. A
zakres działalności firmy to jeszcze nie cały
Grześka.
Przybornik SQL
Gratulacje, właśnie skończyłeś
52='=,$
*5$17
8 6(5
&5($7( e przez Pozwala w bardzo
ce nie używan precyzyjny
Pole ania sposób określać
zarządz ch, na podstawie
systemy i bazami dany uprawnień przydz
relacyjn
ym zenie ielanych
w a la na utwor poszczególnym uż
ytkownikom,
z
które po a i określenie jakie operacje bę
tk ow nik dą oni mogli
uży wykonywać na po
sła. szczególnych
jego ha tabelach oraz ic
h kolumnach.
:,7+*5$17237,21
Pozwala użytkownikowi
5(92.( n ia SQL m
ożesz
przydzielać innym te same
ole c e ć a.
Tego p by odbiera ienia. uprawnienia, które on posiad
ać , pr wn
a
używ kom u
k ow ni 5ROD
użyt
Rola jest
grupą up
Role pozw rawnień.
alają gru
:,7+$'0,1237,21 wybrane
uprawnie
pować
Ta klauzula pozwala i przypis nia
wszystkim ywać je
liczbie uż dowolnej
użytkownikom, który ytkownikó
m została w.
przypisana rola, pr
zypisywać
tę rolę innym użytko
wnikom.
Nawet po tym wszystkim jest jeszcze coś więcej. Jest jeszcze dosłownie
kilka rzeczy, o których, jak sądzimy, powinieneś wiedzieć. Nie czulibyśmy się w porządku,
gdybyśmy je całkowicie zignorowali i nie poświęcili im choćby krótkiej wzmianki. A zatem,
nim będziesz mógł odłożyć tę książkę na półkę, przeczytaj o tych drobnych, lecz
ważnych sprawach.
Poza tym kiedy skończysz lekturę tego dodatku, pozostaną Ci jeszcze dwa następne…
oraz indeks… no i może jeszcze jakieś reklamy… a potem już naprawdę skończysz.
Obiecujemy!
ytanie.
Tutaj wpisz swoje zap
Tu są
wyświetlane
wyniki
zapytania.
552 Dodatek A
Pozostałości
Używając tych
przycisków, bez
najmniejszych
problemów możesz
wyświetlić strukturę
tabeli, przeszukać
jej zawartość, bądź
zmodyfikować kolumny.
Jeśli potrzebna Ci będzie internetowa aplikacja do zarządzania bazą, powinieneś zainteresować się
programem phpMyAdmin. Doskonale sprawdza się on w sytuacjach, gdy korzystasz z konta na serwerze
dostawcy internetowego i chcesz zarządzać bazą danych MySQL działającą na tym samym serwerze.
Nie jest to jednak najlepsze rozwiązanie w przypadku, gdy serwer MySQL działa na Twoim lokalnym
komputerze. Więcej informacji na temat tego produktu znajdziesz na stronie:
http://www.phpmyadmin.net/
Poniżej przedstawiliśmy jeszcze kilka popularnych programów do obsługi baz danych MySQL
i zarządzania bazami. Niektóre z nich są przeznaczone wyłącznie dla użytkowników komputerów PC;
najlepiej zrobisz, jeśli zajrzysz na ich strony, przeczytasz informacje o najnowszych wersjach i sam
ocenisz, który z nich najlepiej spełni Twoje wymagania i potrzeby:
Navicat udostępnia 30-dniową wersję testową, którą znajdziesz na stronie:
http://www.navicat.com/
Z kolei program SQLyog udostępnia ogólnie dostępną wersję Community Edition; znajdziesz ją
na stronie:
http://www.webyog.com/en/
Znaki specjalne
Poniżej zamieszczona została lista większości znaków specjalnych używanych przez MySQL, wraz z ich
znaczeniami. Podobnie jak w przypadku słów zastrzeżonych, także tych znaków specjalnych raczej nie należy
używać w nazwach tabel i kolumn. Wyjątkiem od tej reguły jest znak podkreślenia, który powinieneś stosować
i do czego zresztą gorąco Cię zachęcamy. Ogólnie rzecz biorąc, najlepiej jest tworzyć nazwy tabel i kolumn
wyłącznie w oparciu o litery i znak podkreślenia. Nawet stosowanie cyfr nie jest najlepszym rozwiązaniem,
no chyba że użyta liczba sama w sobie niesie informację o przeznaczeniu i zawartości tabeli lub kolumny.
$%62/87($&7,21$''$'0,1$)7(5$**5(*$7($/,$6$//$//2&$7($/7(5$1'$1<$5($55$<$6$6&$66(57,21$7
A
$87+25,=$7,21
B %()25(%(*,1%,1$5<%,7%/2%%22/($1%27+%5($'7+%<
&$//&$6&$'(&$6&$'('&$6(&$67&$7$/2*&+$5&+$5$&7(5&+(&.&/$66&/2%&/26(&2//$7(&2//$7,21&2/801&200,7
C &203/(7,21&211(&7&211(&7,21&21675$,17&21675$,176&216758&725&217,18(&255(6321',1*&5($7(&5266&8%(
&855(17&855(17B'$7(&855(17B3$7+&855(17B52/(&855(17B7,0(&855(17B7,0(67$03&855(17B86(5&85625&<&/(
'$7$'$7('$<'($//2&$7('(&'(&,0$/'(&/$5('()$8/7'()(55$%/('()(55(''(/(7('(37+'(5()'(6&'(6&5,%(
D '(6&5,3725'(6752<'(6758&725'(7(50,1,67,&',&7,21$5<',$*1267,&6',6&211(&7',67,1&7'20$,1'28%/('523
'<1$0,&
E ($&+(/6((1'(1'B(;(&(48$/6(6&$3((9(5<(;&(37(;&(37,21(;(&(;(&87((;7(51$/
F )$/6()(7&+),567)/2$7)25)25(,*1)281')520)5(()8//)81&7,21
G *(1(5$/*(7*/2%$/*2*272*5$17*5283*5283,1*
H +$9,1*+267+285
,'(17,7<,*125(,00(',$7(,1,1',&$725,1,7,$/,=(,1,7,$//<,11(5,1287,1387,16(57,17,17(*(5,17(56(&7
I
,17(59$/,172,6,62/$7,21,7(5$7(
J -2,1
K .(<
L /$1*8$*(/$5*(/$67/$7(5$//($',1*/()7/(66/(9(//,.(/,0,7/2&$//2&$/7,0(/2&$/7,0(67$03/2&$725
M 0$30$7&+0,187(02',),(602',)<02'8/(0217+
N 1$0(61$7,21$/1$785$/1&+$51&/2%1(:1(;712121(12718//180(5,&
O 2%-(&72)2))2/'2121/<23(123(5$7,21237,212525'(525',1$/,7<287287(5287387
3$'3$5$0(7(53$5$0(7(563$57,$/3$7+3267),;35(&,6,2135(),;35(25'(535(3$5(35(6(59(35,0$5<35,25
P
35,9,/(*(6352&('85(38%/,&
Q
5($'5($'65($/5(&856,9(5()5()(5(1&(65()(5(1&,1*5(/$7,9(5(675,&75(68/75(78515(785165(92.(5,*+7
R
52/(52//%$&.52//835287,1(52:52:6
6$9(32,176&+(0$6&52//6&23(6($5&+6(&21'6(&7,216(/(&76(48(1&(6(66,216(66,21B86(56(76(766,=(
S 60$//,17620(63$&(63(&,),&63(&,),&7<3(64/64/(;&(37,2164/67$7(64/:$51,1*67$5767$7(67$7(0(1767$7,&
6758&785(6<67(0B86(5
7$%/(7(0325$5<7(50,1$7(7+$17+(17,0(7,0(67$037,0(=21(B+2857,0(=21(B0,187(7275$,/,1*75$16$&7,21
T
75$16/$7,2175($775,**(5758(
U 81'(581,2181,48(81.12:1811(6783'$7(86$*(86(586,1*
V 9$/8(9$/8(69$5&+$59$5,$%/(9$5<,1*9,(:
W :+(1:+(1(9(5:+(5(:,7+:,7+287:25.:5,7(
X
Y <($5
Z =21(
UDQNLQJBUHVWDXUDFML
Nr 3. ALL, ANY oraz SOME
nazwa ocena
W języku SQL istnieją trzy słowa kluczowe, które są niezwykle przydatne Dom Pizzy 3
podczas stosowania podzapytań. Są to: $//, $1< oraz 620(. Można ich Coś na ząb 7
używać wraz z operatorami porównania oraz zbiorami wartości. Zanim U Artura 9
szczegółowo się nimi zajmiemy, cofnijmy się na chwilkę do rozdziału 9. Ryby i nie tylko 5
i przypomnijmy informacje o operatorze ,1:
6(/(&7QD]ZDRFHQD)520UDQNLQJBUHVWDXUDFML
:+(5(RFHQD,1
6(/(&7RFHQD)520UDQNLQJBUHVWDXUDFML To podzapytanie zwraca wszystkie oceny
z zakresu od 3 do 9. W naszym przykładzie
:+(5(RFHQD!$1'RFHQD będą to oceny o wartościach 7 i 5.
Tym razem mamy zamiar pobrać nazwy wszystkich restauracji, których ocena
jest wyższa od wszystkich ocen zwróconych jako wyniki podzapytania. W naszym
przykładzie jedynym wynikiem całego zapytania będzie nazwa U Artura.
Mniejszy niż ALL
Dla odmiany w poniższym zapytaniu zastosowano operator :
6(/(&7QD]ZDRFHQD)520UDQNLQJBUHVWDXUDFML zwraca wszystkie
:+(5(RFHQD$// wartości mniejsze
6(/(&7RFHQD)520UDQNLQJBUHVWDXUDFML
:+(5(RFHQD!$1'RFHQD od najmniejszej
Ze słowem kluczowym $// można także używać operatorów porównania ! wartości w zbiorze.
oraz . Poniższe zapytanie zwróci nazwy Coś na ząb oraz U Artura. Zwraca
ono restauracje, które mają oceny wyższe od tych w zbiorze zwróconym przez
zapytanie lub równe największej wartości z tego zbioru (czyli wartości 7):
6(/(&7QD]ZDRFHQD)520UDQNLQJBUHVWDXUDFML
:+(5(RFHQD! $// Dopasowane zostaną wszystkie wartości
6(/(&7RFHQD)520UDQNLQJBUHVWDXUDFML większe od tych ze zwróconego zbior
u
bądź równe jego największej wartości.
:+(5(RFHQD!$1'RFHQD
556 Dodatek A
Pozostałości
Stosowanie ANY
Warunek wykorzystujący słowo kluczowe $1< zwróci prawdę logiczną, jeśli
spełni go dowolna wartość ze zbioru. Przeanalizuj następujący przykład:
Większy niż ANY
6(/(&7QD]ZDRFHQD)520UDQNLQJBUHVWDXUDFML
znajduje wszystkie
:+(5(RFHQD!$1< wartości większe
6(/(&7RFHQD)520UDQNLQJBUHVWDXUDFML
:+(5(RFHQD!$1'RFHQD
od najmniejszej
wartości ze zbioru.
Należy go interpretować w następujący sposób: należy odczytać i zwrócić
wszystkie wiersze, w których ocena jest większa od którejkolwiek
z wartości ze zbioru (5, 7). Restauracja Coś na ząb ma ocenę 7, która jest
większa od 5; a zatem zostanie zwrócona. Zwracana jest także restauracja
U Artura, której ocena wynosi 9.
Mniejszy niż ANY
znajduje wszystkie
wartości mniejsze
od największej
Stosowanie SOME
wartości zbioru.
W standardowej składni języka SQL 620( oznacza dokładnie to samo co
$1< i tak właśnie jest w MySQL-u. Sprawdź w dokumentacji używanej
bazy danych, jakie jest znaczenie tego słowa kluczowego oraz czy możesz
je stosować.
BOOLEAN
W kolumnach tego typu można przechowywać wartości logiczne „prawda” (WUXH) lub „fałsz” (IDOVH),
ewentualnie kolumna taka może zawierać 18//. Ten typ danych doskonale nadaje się do tworzenia
kolumn, które mogą zawierać wartości logiczne „prawda” lub „fałsz”. W niewidoczny dla nas sposób
system zarządzania relacyjną bazą danych zapisuje w tabeli wartość , odpowiadającą logicznej
„prawdzie”, oraz wartość , odpowiadającą logicznemu „fałszowi”. Równie dobrze zamiast wartości WUXH
i IDOVH w kolumnie tego typu możesz zapisywać wartości i .
INT
Typu ,17 często używaliśmy w tej książce. W kolumnach typu ,17 można przechowywać liczby całkowite
z zakresu od 0 do 4294967295. Ten zakres jest dostępny tylko wtedy, gdy chcesz używać liczb dodatnich,
w takim przypadku mówimy o liczbach całkowitych bez znaku.
Jeśli w kolumnie chcesz przechowywać dodatnie i ujemne liczby całkowite, to musisz zażądać użycia liczb
ze znakiem. W takim przypadku będziesz miał dostępne liczby z zakresu od –2147483648 do 2147483647.
Aby utworzyć kolumnę typu ,17 pozwalającą na zapisywanie liczb ze znakiem, musisz tego jawnie
zażądać od systemu zarządzania relacyjnymi bazami danych, używając zapisu o postaci:
,176,*1('
558 Dodatek A
Pozostałości
'$7( 555500''
'$7(7,0( 555500''**0066
7,0(67$03 555500''**0066
7,0( **0066
UR]QHBGDW\
pewna_data
2007-08-25 22:10:00
1925-01-01 02:05:00
Pobierając poleceniem 6(/(&7 wartości dat lub czasu, można określić, w jakiej postaci
baza danych je zwróci. W różnych systemach zarządzania relacyjnymi bazami danych
dostępne są różne funkcje formatujące. Poniżej przedstawiliśmy przykład funkcji
'$7(B)250$7 stosowanej w bazie MySQL.
Formatujący łąńcuch znaków musi być
zapisany w cudzysłowach bądź apostrofach
.
6(/(&7'$7(B)250$7SHZQDBGDWD
0<
)520UR]QHBGDW\
Wyrażenia 0 oraz < przekazują funkcji informacje o tym, w jaki sposób daty mają
zostać sformatowane. Oto jak powinny wyglądać wyniki powyższego zapytania:
UR]QHBGDW\
pewna_data
August 2007
January 1925
Nr 5. Tabele tymczasowe
W tej książce utworzyliśmy naprawdę dużo tabel. Zawsze gdy tworzymy tabelę, system
zarządzania relacyjną bazą danych zapisuje jej strukturę. Za każdym razem, gdy wstawiamy nowy
wiersz do tabeli, jego dane są zapisywane. Tabela, jak i umieszczone w niej dane są zapisywane
na stałe. Kiedy zakończymy sesję z bazą danych i zamkniemy okno terminalu lub program
graficzny, dane, na których operowaliśmy, wciąż istnieją w bazie. I będą w niej istniały aż do
momentu, gdy je usuniemy; podobnie tabela będzie istnieć tak długo, aż ją usuniemy.
SQL udostępnia jednak także i inny typ tabel, tak zwane tabele tymczasowe. Tabele te istnieją
od momentu utworzenia, aż do chwili usunięcia bądź też do momentu zakończenia sesji z bazą
danych. Poprzez „sesję” rozumiemy czas, w którym jesteś zalogowany na serwerze bazy danych
i używasz okna konsoli lub graficznego programu do obsługi bazy. Oczywiście taką tymczasową
tabelę można także jawnie usunąć poleceniem '523.
Nr 6. Rzutowanie typów
Czasami zdarza się, że dane są zapisane w tabeli w kolumnie jednego typu, a chcesz,
by w wynikach zapytania pojawiły się dane innego typu. SQL udostępnia funkcję
o nazwie &$67, która pozwala skonwertować dane do wskazanego typu.
&+$5
'$7(
'$7(7,0(
'(&,0$/
6,*1('>,17(*(5@
7,0(
816,*1('>,17(*(5@
Funkcji &$67 można także używać na liście wartości w poleceniach ,16(57 oraz na liście
kolumn w poleceniach 6(/(&7.
zKonwersja wartości typów 7,0(, '$7(, '$7(7,0( oraz &+$5 do wartości typu '(&,0$/
lub ,17(*(5.
Jednak funkcji tej można używać na liście wartości w poleceniach ,16(57 oraz na liście
kolumn w poleceniach 6(/(&7.
6(/(&7&855(17B86(5
root@localhost
562 Dodatek A
Pozostałości
)XQNFMD ']LDïDQLH
=ZUDFDZDUWRĂÊEH]Z]JOÚGQÈOLF]E\[
$%6[ ]DS\WDQLH Z\QLNL
6(/(&7$%
=ZUDFDDUFXVFRVLQXVOLF]E\[
$&26[
6(/(&7$&26
=ZUDFDDUFXVVLQXVOLF]E\[
$6,1[
6(/(&7$6,1
=ZUDFDDUFXVWDQJHQVOLF]E[Lb\
$7$1[\
6(/(&7$7$1
=ZUDFDQDMPQLHMV]ÈOLF]EÚFDïNRZLWÈZLÚNV]ÈOXEUöZQÈZDUWRĂFL[
&(,/[ =ZUöFRQDZDUWRĂÊEÚG]LHW\SX%,*,17
6(/(&7&(,/
=ZUDFDFRVLQXVOLF]E\[
&26[
6(/(&7&26
=ZUDFDFRWDQJHQVOLF]E\[
&27[
6(/(&7&27
=ZUDFDZDUWRĂÊOLF]E\HSRGQLHVLRQHMGRSRWÚJL[
(;3[
6(/(&7(;3
=ZUDFDQDMZLÚNV]ÈOLF]EÚFDïNRZLWÈPQLHMV]ÈOXEUöZQÈZDUWRĂFL[
)/225[
6(/(&7)/225
)RUPDWXMHZDUWRĂÊ[GRSRVWDFLïDñFXFKD]QDNöZSU]HGVWDZLDMÈFHJROLF]EÚ
)250$7[\ ]DRNUÈJORQÈGR\PLHMVFSRSU]HFLQNX
6(/(&7)250$7
=ZUDFDORJDU\WPQDWXUDOQ\OLF]E\[
/1[
6(/(&7/1
=ZUDFDORJDU\WPQDWXUDOQ\OLF]E\[EÈGěWHĝZbSU]\SDGNXZHUVML]bGZRPD
/2*[RUD] DUJXPHQWDPL]ZUDFDORJDU\WPRbSRGVWDZLH\]bOLF]E\[
/2*[\ 6(/(&7/2*
6(/(&7/2*
GRNRñF]HQLHQDQDVWÚSQHMVWURQLH
jesteś tutaj 563
Funkcji matematycznych ciąg dalszy
564 Dodatek A
Pozostałości
Kiedy warunki z klauzuli :+(5( operują na kolumnie, dla której nie utworzono
indeksu, system zarządzania relacyjnymi bazami danych zaczyna od samego początku
takiej kolumny, a następnie analizuje jej kolejne wiersze. Jeśli Twoja tabela jest
naprawdę olbrzymia, a mówiąc „olbrzymia” mamy ma myśli co najmniej 4 miliony
rekordów, to wykonanie takiej operacji może potrwać zauważalną chwilę.
$/7(57$%/(PRMHBNRQWDNW\
$'',1'(;QD]ZLVNR
"SKS
FRQQ P\VTOBFRQQHFWORFDOKRVWJU]HVLHNJUJ]S$V
LIFRQQ
^
GLH
1LHXGDïRVLÚQDZLÈ]DÊSRïÈF]HQLD
P\VTOBHUURU
`
P\VTOBVHOHFWBGEOLVWDBJU]HVLDFRQQ
566 Dodatek A
Pozostałości
LIFRQQ
^
GLH
1LHXGDïRVLÚQDZLÈ]DÊSRïÈF]HQLD
P\VTOBHUURU
`
Jeśli nie uda się nawiązać połączenia, kod wyświetli komunikat informujący nas o przyczynach problemów i na tym
działanie skryptu się zakończy.
P\VTOBVHOHFWBGEOLVWDBJU]HVLDFRQQ
No dobrze, zatem udało się nawiązać połączenie z serwerem bazy danych. Teraz musimy poinformować PHP, jaka
baza danych nas interesuje. Oczywiście chcemy skorzystać z naszej ulubionej bazy OLVWDBJU]HVLD.
HFKRURZ>
QD]ZLVNR
@URZ>
LPLH
@
HFKREU!
`
Te dwie instrukcje PHP wyświetlają na stronie WWW imię i nazwisko pobrane z bazy. Pomiędzy poszczególnymi
wierszami tekstu umieszczamy znacznik EU!.
P\VTOBFORVHFRQQ
Kiedy zakończymy wypisywanie imion i nazwisk z bazy, możemy zamknąć połączenie z systemem zarządzania
relacyjnymi bazami danych. Operacja ta jest odpowiednikiem wylogowania się w oknie konsoli.
"!
I kończymy skrypt PHP.
jesteś tutaj 567
568 Dodatek A
'RGDWHN%,QVWDODFMD0\64/D
Pobierz wersję
5.0 lub nowszą
!
KWWSGHYP\VTOFRPGRFUHIPDQHQZLQGRZVLQVWDOODWLRQKWPO
570 Dodatek B
Instalacja MySQL-a
KWWSGHYP\VTOFRPGRZQORDGVP\VTOKWPO
i kliknij przycisk Download poniżej napisu MySQL Community Server.
Być może będziesz
musiał nieco
przewinąć stronę.
Pobierz wersję
serwera 5.0
lub nowszą.
Pamiętaj, by
pobrać plik
instalacyjny
— opcję .EXE.
572 Dodatek B
Instalacja MySQL-a
&?3URJUDP)LOHV?0\64/?0\64/6HUYHU
Następnie kliknij przycisk Next.
4/
H QDU] ÚG]LD 6
7Z RMH QRZ karbie! .ROHMQH QDU]ÚG
ś się mnie, s ]LD 64/
Nauczyłe
Nas też się na
uczyłeś!
DU]ÚG]LD64/
-HV]F]H QDVWÚSQHQ
znałeś nas
Niesamowite – po
wszystkie!
$1'RUD]25
Symbole Dzięki operatorom AND i OR możesz
łączyć warunki logiczne umieszczane
!! ! w klauzuli WHERE i precyzyjniej wybierać
Mamy do dyspozycji całą grupę operatorów dane z tabeli.
porównania. Rozdział 2.
Rozdział 2.
$872B,1&5(0(17
Jeśli to słowo kluczowe zostanie użyte
A w deklaracji kolumny, to podczas
wykonywania każdego polecenia INSERT
$/7(5]NODX]XOÈ&+$1*( w kolumnie tej zostanie zapisana
Pozwala zmienić zarówno nazwę, jak unikalna liczba całkowita.
i typ danych istniejącej kolumny tabeli. Rozdział 4.
Rozdział 5.
$9*
$/7(5]NODX]XOÈ02',)< Zwraca średnią wyliczoną na podstawie
wartości kolumny liczbowej.
Pozwala zmienić jedynie typ danych
istniejącej kolumny tabeli. Rozdział 6.
Rozdział 5.
$/7(5]NODX]XOÈ$'' B
Pozwala dodać do tabeli kolumnę
w wybranym miejscu. %(7:((1
Rozdział 5. Pozwala wybrać zakres wartości.
Rozdział 2.
$/7(5]NODX]XOÈ'523
Pozwala usunąć kolumnę tabeli.
Rozdział 5. C
$/7(57$%/( &+(&.2*5$1,&=(1,(635$:'=$-k&(
Pozwala zmienić nazwę tabeli oraz całą Używaj tego ograniczenia, by zezwolić na
jej strukturę, pozostawiając jednocześnie zapisywanie w kolumnie wyłącznie ściśle
zapisane w niej dane. określonych wartości.
Rozdział 5. Rozdział 11.
576 Dodatek C
Informacje o narzędziach SQL-a
F
by bardzo precyzyjnie wybrać usuwane Funkcje łańcuchowe pozwalają modyfikować
rekordy. kopie zawartości kolumn łańcuchowych
Rozdział 3. w ramach wykonywanego zapytania.
Oryginalne wartości nie zostają w żaden
',67,1&7 sposób zmodyfikowane.
Zwraca każdą unikalną wartość tabeli Rozdział 5.
tylko jeden raz — bez powtórzeń.
Rozdział 6.
G
'5237$%/(
*5$17
Polecenie pozwala usuwać tabele, jeśli
To polecenie pozwala przypisywać
pojawiłby się w nich jakiś błąd. Należy
pamiętać, że polecenie to można użytkownikom uprawnienia określające,
bezpiecznie wykonywać wyłącznie jakie operacje będą mogli wykonywać na
w sytuacjach, kiedy jeszcze nie poszczególnych tabelach i kolumnach.
zapisaliśmy niczego w bazie, posługując Rozdział 12.
się przy tym poleceniem INSERT.
*5283%<
Rozdział 1.
Scala dane na podstawie wskazanej
'UXJDSRVWDÊQRUPDOQD1) kolumny.
Aby tabela była w drugiej postaci Rozdział 6.
normalnej, musi być w pierwszej postaci
normalnej i nie może zawierać żadnych
częściowych zależności funkcjonalnych. I
Rozdział 7. ,11(5-2,1
Dowolne złączenie, które łączy rekordy
z dwóch tabel, używając przy tym
E pewnego warunku.
Rozdział 8.
(;&(37
Stosuj to słowo kluczowe, by zwracać ,17(56(&7
wartości, które są w pierwszym Zwraca tylko te wartości, które są
podzapytaniu, LECZ NIE MA ich zarówno w wynikach jednego zapytania,
w drugim. JAK I drugiego.
Rozdział 10. Rozdział 10.
578 Dodatek C
Informacje o narzędziach SQL-a
,618// ./8&=2%&<2':28-k&<6,}
Używaj tego operatora, by tworzyć '27(-6$0(-7$%(/,
warunki, które sprawdzają występowanie To klucz obcy umieszczony w tej samej
tej nieznośnej wartości NULL. tabeli co klucz główny, lecz używany do
Rozdział 2. innych celów.
Rozdział 10.
J .OXF]]ïRĝRQ\
-HGHQGRMHGQHJR To klucz główny składający się z wielu
Jednemu wierszowi z tabeli nadrzędnej kolumn, które łącznie tworzą złożoną
odpowiada dokładnie jeden wiersz z tabeli i jednocześnie unikalną wartość klucza.
podrzędnej. Rozdział 7.
Rozdział 7.
-HGHQGRZLHOX
Jednemu wierszowi w pierwszej tabeli
L
może odpowiadać wiele wierszy w drugiej /(:2675211(=k&=(1,(=(:1}75=1(
tabeli, jednak każdemu wierszowi
LEWOSTRONNE ZŁĄCZENIE
z drugiej tabeli może odpowiadać tylko
jeden wiersz z pierwszej. ZEWNĘTRZNE pobiera wszystkie wiersze
z lewej tabeli i jedynie pasujące do nich
Rozdział 7.
wiersze z prawej tabeli.
Rozdział 10.
K /,.(L]QDNLRUD]B
./8&=*:1< Stosuj operator LIKE ze znakami
Kolumna lub grupa kolumn, które wieloznacznymi, by poszukiwać podanych
w unikalny sposób identyfikują wiersze fragmentów łańcuchów znaków.
tabeli. Rozdział 2.
Rozdział 4.
/,0,7
./8&=2%&< Pozwala określać, jak wiele wierszy ma
Kolumna tabeli, która odwołuje się do zwrócić zapytanie, oraz od którego wiersza
klucza głównego innej tabeli. należy rozpocząć zwracanie wyników.
Rozdział 7. Rozdział 6.
M
0$;L0,1 atomowe, a oprócz tego musi zawierać
Pierwsza z tych funkcji zwraca największą unikalny identyfikator.
wartość w kolumnie, a druga — wartość Rozdział 4.
najmniejszą.
Rozdział 6. 3RG]DS\WDQLDQLHVNRUHORZDQH
Podzapytanie, które jest niezależne
i nie odwołuje się w żaden sposób
N do zapytania zewnętrznego.
127 Rozdział 9.
35$:2675211(=k&=(1,(=(:1}75=1(
O PRAWOSTRONNE ZŁĄCZENIE
25'(5%< ZEWNĘTRZNE pobiera wszystkie wiersze
z prawej tabeli i dopasowuje je do
Sortuje wyniki alfabetycznie na
wierszy z lewej tabeli.
podstawie wskazanej kolumny.
Rozdział 10.
Rozdział 6.
3U]HFKRGQLD]DOHĝQRĂÊIXQNFMRQDOQD
P Występuje, gdy jakakolwiek kolumna nie-
będąca kluczem jest powiązana z innymi
3,(5:6=$3267$m1250$/1$1) kolumnami, które także nie są kluczem.
Każdy wiersz tabeli musi zawierać dane Rozdział 7.
580 Dodatek C
Informacje o narzędziach SQL-a
S U
6FKHPDW 81,21RUD]81,21$//
Opis danych przechowywanych w bazie danych, Polecenie UNION łączy wyniki dwóch lub
wszelkich innych obiektów powiązanych większej liczby zapytań w jednej tabeli
z nimi oraz ich wzajemnych zależności. wynikowej, używając przy tym kolumn
Rozdział 7. podanych na liście kolumn polecenia
SELECT. Polecenie UNION ukrywa powie-
6(/(&7
lające się wartości, natomiast polecenie
Używaj polecenia o takiej postaci, UNION ALL wyświetla wszystkie wiersze,
by pobrać wszystkie kolumny tabeli. nawet powtarzające się.
Rozdział 2. Rozdział 10.
6(7 83'$7(
To słowo kluczowe jest stosowane To polecenie pozwala aktualizować
w poleceniach UPDATE i służy do zmiany wartość istniejącej kolumny lub kolumn.
wartości konkretnej, istniejącej kolumny. Można w nim zastosować klauzulę WHERE.
Rozdział 3. Rozdział 3.
6+2:&5($7(7$%/( 86('$7$%$6(
Skorzystaj z tego polecenia, by poznać Pozwala wybrać bazę danych, na jakiej
prawidłową składnię służącą chcemy działać.
do utworzenia istniejącej tabeli. Rozdział 1.
Rozdział 4.
680 W
Sumuje wszystkie wartości w kolumnie
:,'2.,
liczbowej.
Widoków można używać, by móc potrak-
Rozdział 6. tować wyniki wykonania zapytania jako
tabelę. Doskonale nadają się do zmiany
T bardzo złożonych zapytań w bardzo proste.
Rozdział 11.
7U]HFLDSRVWDÊQRUPDOQD1)
Tabela musi być w drugiej postaci :,'2.,1,(32=:$/$-k&(1$$.78$/,=$&-}
normalnej i nie mieć żadnych Widoki, których nie można używać
przechodnich zależności funkcjonalnych. w poleceniach INSERT oraz UPDATE.
Rozdział 7. Rozdział 11.
jesteś tutaj 581
Symbole W – Z
:,'2.,32=:$/$-k&(1$$.78$/,=$&-} =k&=(1,(1$785$/1(
To widoki, które pozwalają na zmianę Złączenie wewnętrzne, w którym
danych w tabelach, na których operują. została pominięta klauzula ON. Działa
Muszą one zawierać wszystkie kolumny ono wyłącznie w przypadkach, gdy
zdefiniowane jako NOT NULL z tabeli obie łączone tabele posiadają kolumnę
lub tabel, na których operują. o identycznej nazwie.
Rozdział 11. Rozdział 8.
:LHOHGRZLHOX =k&=(1,(35=(&,1.2:(
Dwie tabele są połączone przez Złączenia przecinkowe są tym samym
dodatkową tabelę łączącą, dzięki czemu co ZŁĄCZENIA KRZYŻOWE, z tą jedną
wiele wierszy z jednej tabeli może różnicą, że do utworzenia złączenia
odpowiadać wielu wierszom z drugiej stosowany jest przecinek, a nie słowa
tabeli i na odwrót. kluczowe CROSS JOIN.
Rozdział 7. Rozdział 8.
:,7+*5$17237,21 =k&=(1,(5:12¥&,2:(,1,(5:12¥&,2:(
Pozwala użytkownikowi przekazywać Oba są rodzajami złączeń wewnętrznych.
innym te same uprawnienia, którymi Pierwsze z nich zwraca wiersze, które są
on dysponuje. równe, a drugie — wiersze, które są
Rozdział 12. różne.
Rozdział 8.
Z =k&=(1,(=:5271(
=DS\WDQLHZHZQÚWU]QH Pozwala ono na pobieranie danych
Zapytanie umieszczone wewnątrz innego z jednej tabeli w taki sposób, jak
zapytania. Określane także jako podzapytanie. gdyby w bazie istniały dwie tabele
Rozdział 9. o identycznej zawartości.
Rozdział 10.
=DS\WDQLH]HZQÚWU]QH
Zapytanie zawierające zapytanie
wewnętrzne nazywane także
podzapytaniem.
Rozdział 9.
582 Dodatek C
Skorowidz
%, 136 MODIFY COLUMN, 246 CAST(), 561
*, 92 RENAME, 239 CEATE VIEW, 493
_, 136 TYPE, 514 CEIL(), 563
<, 121, 150 ALTER USER, 525 CHANGE, 244, 266
<?php ?>, 567 AND, 114, 122, 129, 130, 139, 145, 150 CHANGE COLUMN, 245
<=, 121, 150 ANY, 556, 557 CHAR, 60, 98, 125
<>, 120, 145, 150 apostrofy, 54, 97, 100, 101 CHARACTER, 60
=, 120, 150 AS, 383, 384 CHECK, 338, 488, 490, 504, 505
=>, 121, 150 ASC, 292, 293 CHECK CONSTRAINT, 503
>, 120, 121, 150 ASIN(), 563 CHECK OPTION, 503
1NF, 210, 211, 228, 350, 372 ATAN(), 563 chronologiczne pobieranie danych, 160
2NF, 359, 361, 364, 372 atomicity, 511 close(), 566
3NF, 366, 372 atomowe dane, 201, 202 COMMIT, 512, 517
AUTO_INCREMENT, 222, 224, 227, consistency, 511
584 Skorowidz
Skorowidz
NOT NULL, 81, 82, 83, 86, 220, 225, warunkowe, 131 IN, 433
NATURAL JOIN, 428
504 większość, 119, 121
nazwy zastępcze, 438
NULL, 79, 80, 86 większy lub równy, 121
nieskorelowane, 429, 433
numery PESEL, 212, 221 opis tabeli, 63
NOT EXISTS, 439, 440
optymalny sposób realizacji
NOT IN, 433
O zapytania, 430
OR, 127, 128, 129, 130, 145, 150
reguły, 421, 422
obsługa łańcuchów znaków, 258 SELECT, 427
ORDER BY, 285, 286, 289, 290, 296,
odnajdywanie skorelowane, 438, 479
302, 310, 405, 478
dane tekstowe, 125 SOME, 556, 557
ASC, 293
wartości liczbowe, 117, 122 tworzenie, 424
DESC, 293
odporność, 511 zagnieżdżanie podzapytań, 442
wiele kolumn, 289, 290
odwracanie kolejności sortowania, 292 zamiana na złączenie, 474
ostatni rekord, 162
oglądanie widoków, 494 zapytania wewnętrzne, 416, 417, 418
ostatnie znaki łańcucha, 258
ograniczanie wyników zapytania, 107 zapytania zewnętrzne, 416, 417, 422
ostrzeżenia, 221
liczba wyników, 306 złączenia naturalne, 428
oznaczanie apostrofów, 102, 104
ograniczenia, 334, 335, 337, 486 złączenia zwrotne, 479
CHECK, 338, 488, 504 zwracanie wielu wartości, 433
CHECK CONSTRAINT, 503 P pola, 49
sprawdzające, 488 PASSWORD(), 525, 546 polecenia, 53
UNIQUE, 338 pełne złączenia zewnętrzne, 457 ALTER, 225, 227, 231, 244, 270
określanie zwracanych kolumn, 107 PESEL, 212, 221 ALTER TABLE, 232
ON, 396, 405 PHP, 101, 566 CHANGE, 244
operacje na łańcuchach, 378 phpMyAdmin, 553 COMMIT, 512
operacje na wielu tabelach, 373 PI(), 564 CREATE, 54
586 Skorowidz
Skorowidz
pomijanie niektórych kolumn, 77 schemat bazy danych, 326 rozdzielanie wartości, 378
tabele, 325 rozwiązanie problemu apostrofów, 102
REVOKE, 532, 537
zależności pomiędzy tabelami, 339 równościowe złączenia wewnętrzne, 394
ROLLBACK, 512
projektowanie tabel, 193 równość, 120
SELECT, 79, 87, 383
przechodnia zależność funkcjonalna, 356 różnościowe złączenia wewnętrzne, 397
SHOW, 221
przejrzystość kodu, 219 RTRIM(), 259
SHOW CREATE TABLE, 218,
przekształcanie tabeli w dwie tabele, 328 rzutowanie typów, 561
221
przydzielanie uprawnień, 527, 528
SHOW WARNINGS, 221
START TRANSACTION, 512 S
UNION, 466 R samoprzylepne karteczki, 38
UNION ALL, 470 RADIANS(), 564 schemat bazy danych, 326, 372
UPDATE, 153, 180, 263 RAND(), 564 schemat przepływu sterowania, 44
USE, 54 RDBMS, 53, 198 SECOND, 236
zmiana kolejności kolumn, 77 reguły klucza głównego, 212 SELECT, 79, 87, 261, 376, 381, 382,
połączenie z bazą danych, 567 reguły kolejności, 287, 288 383, 479
porównania, 118, 120 rejestrowanie poleceń SQL, 512 *, 88, 92, 150
588 Skorowidz
Skorowidz
590 Skorowidz
Notatki