Wydawnictwo Helion ul. Kociuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: [email protected]PostgreSQL 8.3. ˘wiczenia Autor: Marcin Lis ISBN: 978-83-246-0859-1 Format: B5, stron: 182 Poznaj podstawy obs‡ugi wydajnej, stabilnej i bezpiecznej bazy danych Jak zainstalowa i skonfigurowa PostgreSQL? W jaki sposb tworzy i modyfikowa tabele? Jak manipulowa danymi za pomoc„ jŒzyka SQL? Oprogramowanie dostŒpne na licencji open source staje siŒ coraz popularniejsze. Nikogo ju¿ chyba nie dziwi fakt, ¿e nawet wrd najwiŒkszych i najbardziej rozbudowanych systemw znajdziemy produkty bezp‡atne. Jednym z nich jest system zarz„dzania bazami danych PostgreSQL powszechnie uwa¿any za najbardziej uniwersalny i stabilny spord baz danych rozprowadzanych na zasadach wolnego dostŒpu. PostgreSQL ma dwie wersje dla systemw Windows i Linux a jego mo¿liwoci wykorzystywane s„ zarwno przez twrcw portali sieciowych, jak i potŒ¿nych systemw korporacyjnych przetwarzaj„cych ogromne iloci danych. Ksi„¿ka PostgreSQL 8.3. ˘wiczenia to krtkie i skuteczne wprowadzenie w zasady u¿ywania tego systemu baz danych. Czytaj„c j„ i wykonuj„c zawarte w niej wiczenia, dowiesz siŒ, jak zainstalowa PostgreSQL w Windows i Linuksie, oraz szybko poznasz podstawy administrowania serwerem bazy danych i kontami jej u¿ytkownikw. Nauczysz siŒ tworzy tabele, dobiera odpowiednie typy danych i budowa indeksy. Opanujesz jŒzyk SQL s‡u¿„cy do manipulowania danymi w tabelach. Przeczytasz tak¿e o transakcjach i wiŒzach integralnoci. Instalacja serwera PostgreSQL w systemach Windows i Linux Uruchamianie i zatrzymywanie serwera Obs‡uga kont u¿ytkownikw Zarz„dzanie bazami danych Podstawowe koncepcje relacyjnych baz danych Typy danych w PostgreSQL Tworzenie, modyfikowanie i usuwanie tabel Pobieranie danych i przetwarzanie wynikw zapytania Z‡o¿one zapytania SQL Obs‡uga transakcji Przekonaj siŒ, dlaczego PostgreSQL zyska‡ tak ogromne uznanie
Poznaj podstawy obsługi wydajnej, stabilnej i bezpiecznej bazy danych
* Jak zainstalować i skonfigurować PostgreSQL? * W jaki sposób tworzyć i modyfikować tabele? * Jak manipulować danymi za pomocą języka SQL?
Oprogramowanie dostępne na licencji open source staje się coraz popularniejsze. Nikogo już chyba nie dziwi fakt, że nawet wśród największych i najbardziej rozbudowanych systemów znajdziemy produkty bezpłatne. Jednym z nich jest system zarządzania bazami danych PostgreSQL - powszechnie uważany za najbardziej uniwersalny i stabilny spośród baz danych rozprowadzanych na zasadach wolnego dostępu. PostgreSQL ma dwie wersje - dla systemów Windows i Linux - a jego możliwości wykorzystywane są zarówno przez twórców portali sieciowych, jak i potężnych systemów korporacyjnych przetwarzających ogromne ilości danych.
Książka „PostgreSQL 8.3. Ćwiczenia” to krótkie i skuteczne wprowadzenie w zasady używania tego systemu baz danych. Czytając ją i wykonując zawarte w niej ćwiczenia, dowiesz się, jak zainstalować PostgreSQL w Windows i Linuksie, oraz szybko poznasz podstawy administrowania serwerem bazy danych i kontami jej użytkowników. Nauczysz się tworzyć tabele, dobierać odpowiednie typy danych i budować indeksy. Opanujesz język SQL służący do manipulowania danymi w tabelach. Przeczytasz także o transakcjach i więzach integralności.
* Instalacja serwera PostgreSQL w systemach Windows i Linux * Uruchamianie i zatrzymywanie serwera * Obsługa kont użytkowników * Zarządzanie bazami danych * Podstawowe koncepcje relacyjnych baz danych * Typy danych w PostgreSQL * Tworzenie, modyfikowanie i usuwanie tabel * Pobieranie danych i przetwarzanie wyników zapytania * Złożone zapytania SQL * Obsługa transakcji
Przekonaj się, dlaczego PostgreSQL zyskał tak ogromne uznanie.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
PostgreSQL 8.3. Æwiczenia Autor: Marcin LisISBN: 978-83-246-0859-1Format: B5, stron: 182
Poznaj podstawy obs³ugi wydajnej, stabilnej i bezpiecznej bazy danych
� Jak zainstalowaæ i skonfigurowaæ PostgreSQL?� W jaki sposób tworzyæ i modyfikowaæ tabele?� Jak manipulowaæ danymi za pomoc¹ jêzyka SQL?
Oprogramowanie dostêpne na licencji open source staje siê coraz popularniejsze. Nikogo ju¿ chyba nie dziwi fakt, ¿e nawet w�ród najwiêkszych i najbardziej rozbudowanych systemów znajdziemy produkty bezp³atne. Jednym z nich jest system zarz¹dzania bazami danych PostgreSQL � powszechnie uwa¿any za najbardziej uniwersalny i stabilny spo�ród baz danych rozprowadzanych na zasadach wolnego dostêpu. PostgreSQL ma dwie wersje � dla systemów Windows i Linux � a jego mo¿liwo�ci wykorzystywane s¹ zarówno przez twórców portali sieciowych, jak i potê¿nych systemów korporacyjnych przetwarzaj¹cych ogromne ilo�ci danych.
Ksi¹¿ka �PostgreSQL 8.3. Æwiczenia� to krótkie i skuteczne wprowadzenie w zasady u¿ywania tego systemu baz danych. Czytaj¹c j¹ i wykonuj¹c zawarte w niej æwiczenia, dowiesz siê, jak zainstalowaæ PostgreSQL w Windows i Linuksie, oraz szybko poznasz podstawy administrowania serwerem bazy danych i kontami jej u¿ytkowników. Nauczysz siê tworzyæ tabele, dobieraæ odpowiednie typy danych i budowaæ indeksy. Opanujesz jêzyk SQL s³u¿¹cy do manipulowania danymi w tabelach. Przeczytasz tak¿e o transakcjach i wiêzach integralno�ci.
� Instalacja serwera PostgreSQL w systemach Windows i Linux� Uruchamianie i zatrzymywanie serwera� Obs³uga kont u¿ytkowników� Zarz¹dzanie bazami danych� Podstawowe koncepcje relacyjnych baz danych� Typy danych w PostgreSQL� Tworzenie, modyfikowanie i usuwanie tabel� Pobieranie danych i przetwarzanie wyników zapytania� Z³o¿one zapytania SQL� Obs³uga transakcji
Przekonaj siê, dlaczego PostgreSQL zyska³ tak ogromne uznanie
Rozdzia# 1. Instalacja i konfiguracja 9Instalacja w systemie Linux 9
Instalacja w systemie Windows 16
Uruchamianie i zatrzymywanie serwera 19
Rozdzia# 2 . Zarz$dzanie serwerem 29Nawi#zywanie po$#czenia z serwerem 29
Obs$uga kont u%ytkowników 32
Zarz#dzanie bazami danych 45
Rozdzia# 3. Koncepcja relacyjnych baz danych 49Tabele 49
Klucze 50
Relacje 52
Podstawowe zasady projektowania tabel 56
Rozdzia# 4. Praca z tabelami 65Typy danych 65
Tworzenie tabel 75
Indeksy 86
Modyfikacja tabel 89
Usuwanie tabel 95
Kilka tabel w praktyce 96
4 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Rozdzia# 5. Podstawowe instrukcje SQL 105Wprowadzanie danych 105
Pobieranie danych 112
Modyfikacja danych 130
Usuwanie danych 133
Rozdzia# 6. Z#o'one instrukcje SQL 137Z$#czenia i unie 137
Grupowanie i agregacja danych 153
Rozdzia# 7. Podzapytania, transakcje i wi"zy integralno!ci 165Podzapytania 165
Transakcje 176
Wi(zy integralno)ci 182
5
Podstawowe instrukcje SQL
Wprowadzanie danych
Instrukcja INSERT INTOTabele, których najró"niejsze sposoby tworzenia i modyfikacji pozna-li#my w rozdziale 4., trzeba w jaki# sposób wype$ni% danymi. S$u"y dotego instrukcja INSERT INTO, któr& poznamy na kolejnych stronach tegorozdzia$u. Jej podstawowa forma ma ogóln& posta%:
Powoduje ona wprowadzenie do tabeli nowego wiersza, w którymw polu kolumna1 zosta$a zapisana warto#% warto+,1, w polu kolumna2 —warto#% warto+,2 itd. Elementy instrukcji uj(te w nawias kwadratowys& opcjonalne.
Przygotujmy wi(c przyk$adow& tabel(, która pos$u"y do wykonywaniakolejnych %wicze). Niech b(dzie to tabela osoby utworzona za pomoc&instrukcji:
CREATE TABLE osoby( id INTEGER PRIMARY KEY NOT NULL, imie VARCHAR(20) NOT NULL, nazwisko VARCHAR(30) NOT NULL, pesel CHAR(11));
106 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
W I C Z E N I E
5.1 Wprowadzenie wiersza do tabeli
Wprowad* do tabeli osoby przyk$adowy wiersz danych.
Zak$adaj&c, "e nowy wiersz ma zawiera% dane Jana Kowalskiego posia-daj&cego PESEL 01234567890, któremu zosta$ nadany identyfikator 1,nale"y u"y% instrukcji INSERT INTO w postaci:
INSERT INTO osoby (id, imie, nazwisko, pesel) VALUES (1, 'Jan', 'Kowalski', '01234567890');
W celu zwi(kszenia czytelno#ci mo"na j& rozbi% na kilka wierszy (rysu-nek 5.1), np.:
INSERT INTO osoby (id, imie, nazwisko, pesel)VALUES (1, 'Jan', 'Kowalski', '01234567890');
Efekt wykonania zapytania jest widoczny na rysunku 5.1.
Rysunek 5.1.Wykonaniezapytaniawprowadzaj(cegodane do tabeliosoby
Zwró%my przy tym uwag(, "e wszystkie wprowadzone ci&gi znakówzosta$y uj(te w apostrofy. Jest to niezb(dne, aby zapytanie zosta$o wyko-nane prawid$owo. Nie ma natomiast potrzeby ujmowania w znaki apo-strofu warto#ci liczbowych.
Je#li jednak wprowadzamy warto#ci wszystkich pól, to nazwy kolumnw instrukcji INSERT s& tak naprawd( opcjonalne i mo"na je pomin&%.Kolejno#% danych powinna by% wtedy taka jak kolejno#% kolumn w de-finicji tabeli. Sprawd*my to w praktyce.
W I C Z E N I E
5.2 Wprowadzenie danych z pomini:ciem nazw kolumn
Wprowad* do tabeli osoby przyk$adowy wiersz bez u"ywania nazwkolumn.
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 107
Wykonanie %wiczenia zapewni nam instrukcja:
INSERT INTO osoby VALUES (2, 'Adam', 'Nowak', '12345678901');
Nie ma jednak konieczno#ci ka"dorazowego wprowadzania danych dowszystkich kolumn. Cz(#% z nich mo"e zosta% pomini(ta, pod warun-kiem oczywi#cie "e nie maj& one przypisanego atrybutu NOT NULL.
W I C Z E N I E
5.3 Pomini:cie danych dla wybranych kolumn
Wprowad* do tabeli osoby wiersz zawieraj&cy jedynie dane o identyfi-katorze, imieniu oraz nazwisku.
Operacj( wprowadzenia do tabeli osoby wiersza bez danych dla kolumnypesel mo"na przeprowadzi% na dwa sposoby. Pierwszy z nich to in-strukcja:
INSERT INTO osoby VALUES (3, 'Janusz', 'Nowak', NULL);
W takim przypadku w kolumnie pesel jawnie wstawiamy warto#% pust&NULL. Drug& mo"liwo#% stanowi instrukcja:
INSERT INTO osoby (id, imie, nazwisko) VALUES (3, 'Janusz', 'Nowak');
W tym przypadku niezb(dne jest u"ycie nazw kolumn.
Taka operacja jak w %wiczeniu 5.3 nie by$aby jednak mo"liwa w przy-padku kolumny imie b&d* nazwisko, gdy" maj& one atrybut NOT NULL,czyli nie mog& by% puste. Sprawd*my, czy tak jest faktycznie.
W I C Z E N I E
5.4 Pomini:cie danych dla kolumny z atrybutem NOT NULL
Wykonaj prób( wprowadzenia do tabeli osoby wiersza niezawieraj&cegodanych o imieniu.
Pomini(cie danych o imieniu zapewni przyk$adowa instrukcja w po-staci:
INSERT INTO osoby (id, nazwisko, pesel)VALUES (4, 'Nowak', '89012345678');
108 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
której wykonanie zako)czy si( zg$oszeniem komunikatu o b$(dziewidocznym na rysunku 5.2. Skoro bowiem kolumna imie ma nadanyatrybut NOT NULL oraz nie zosta$a jej nadana warto#% domy#lna, to niemo"na wprowadzi% do tabeli wiersza niezawieraj&cego danych dla tejkolumny.
Rysunek 5.2. Próba pomini/cia warto0ci wymaganej ze wzgl/du na atrybutNOT NULL
Warto równie" wiedzie%, "e kolejno#% wprowadzania danych w instruk-cji INSERT nie musi by% taka sama jak struktura kolumn w tabeli.
W I C Z E N I E
5.5 Zmiana kolejnoCci kolumn w zapytaniuwprowadzajDcym dane
Dodaj do tabeli osoby wiersz danych tak, aby kolejno#% kolumn by$ainna ni" zdefiniowana w tabeli.
Wykonanie %wiczenia zapewni nam instrukcja:
INSERT INTO osoby (pesel, id, nazwisko, imie)VALUES ('23456789012', 5, 'Arkuszewski', 'Janusz');
Zobaczmy teraz, co si( stanie, je#li, np. przez przeoczenie, spróbujemydwukrotnie wykona% instrukcj( wprowadzaj&c& dane z %wiczenia 5.2.Czy taka operacja b(dzie mo"liwa?
W I C Z E N I E
5.6 Próba wprowadzenia duplikatu danych
Wykonaj ponownie instrukcj( z %wiczenia 5.2. Zaobserwuj zachowa-nie serwera.
Po ponownym wykonaniu instrukcji INSERT INTO z %wiczenia 5.2 ser-wer zg$osi nam b$&d. Komunikat b(dzie mia$ posta% widoczn& na
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 109
rysunku 5.3. Przyczyna wydaje si( jasna. Otó" warto#ci dla kolumnimie, nazwisko oraz pesel mog& si( powtarza%, ale warto#% dla kolumnyid — ju" nie, jest ona bowiem kluczem podstawowym.
Jak jednak unikn&% przypadkowych duplikatów klucza g$ównego? Naj-lepiej pozostawi% jego wygenerowanie serwerowi baz danych. Usu)mywi(c tabel( osoby, wykonuj&c instrukcj(:
DROP TABLE osoby;
i utwórzmy ponownie, tym razem w taki sposób, aby kolumna id umo"-liwia$a automatyczne generowanie kolejnego identyfikatora. Z roz-dzia$u 4. wiemy, "e definicja takiej kolumny b(dzie mia$a posta% (nale"yj& wstawi% do przedstawionej na pocz&tku tego rozdzia$u instrukcji CRE-ATE TABLE):
id SERIAL PRIMARY KEY NOT NULL
W I C Z E N I E
5.7 Automatyczne generowanie wartoCci dla kolumny
Wprowad* do tabeli osoby wiersz danych w taki sposób, aby warto#%dla kolumny id zosta$a wygenerowana automatycznie.
Warto#% kolumny id mo"e zosta% wygenerowana automatycznie, gdy"w trakcie tworzenia tabeli zosta$a ona odpowiednio zadeklarowana.Je#li chcemy skorzysta% z takiego udogodnienia, w instrukcji wprowa-dzaj&cej wiersz nale"y pomin&% kolumn( id, np.:
INSERT INTO osoby (imie, nazwisko, pesel) VALUES ('Marceli', 'Przybysz', '56789012345');
lub te" zastosowa% w niej warto#% DEFAULT:
INSERT INTO osoby (id, imie, nazwisko, pesel) VALUES (DEFAULT, 'Marceli', 'Przybysz', '56789012345');
110 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Wprowadzony w ten sposób wiersz b(dzie mia$ identyfikator o jedenwi(kszy ni" maksymalna warto#% zapisana w kolumnie id. Je#li zatemprzed wykonaniem jednej z wymienionych instrukcji najwi(ksz& war-to#ci&1 w kolumnie id by$o np. 14, to wprowadzony wiersz b(dzie mia$w tej kolumnie warto#% 15.
Wprowadzanie wielu wierszyOmówiona w poprzednim punkcie instrukcji INSERT INTO wyst(pujerównie" w wersji pozwalaj&cej na jednoczesne wstawienie do tabeliwielu wierszy. Dane ka"dego z nich musz& by% jednak wtedy uj(tew nawias okr&g$y i oddzielone od siebie znakami przecinka. Taka kon-strukcja b(dzie mia$a ogóln& posta%:
Zaprezentowana instrukcja zosta$a rozbita na kilka wierszy w celuzwi(kszenia czytelno#ci danych, cho% mo"na j& równie" zapisa%w ca$o#ci tylko w jednym wierszu (nie by$oby to jednak zbyt wygodne).
Wykonajmy trzy %wiczenia wykorzystuj&ce t( wersj(.
W I C Z E N I E
5.8 Umieszczenie w tabeli wielu wierszy
Za pomoc& pojedynczej instrukcji INSERT INTO wprowad* do tabeli osobydane trzech osób.
Aby wykona% zadanie, mo"emy zastosowa% instrukcj( SQL o postaci:
INSERT INTO osoby (id, imie, nazwisko, pesel)VALUES (15, 'Anna', 'Kowalska', '07902657182'), (16, 'Janina', 'Nowak', '17912652182'), (17, 'Dariusz', 'Malinowski', '02699657182');
1 Chodzi o najwi(ksz& kiedykolwiek wprowadzon& do kolumny warto#%,a nie o aktualnie znajduj&c& si( w kolumnie najwi(ksz& warto#%.
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 111
W I C Z E N I E
5.9 Wprowadzenie wielu wierszy z pomini:ciemwybranych danych
Za pomoc& pojedynczej instrukcji INSERT wprowad* do tabeli osoby trzywiersze tak, aby dane z kolumny pesel zosta$y pomini(te.
Równie" w przypadku umieszczania w tabeli wielu wierszy cz(#% ko-lumn mo"e by% pomijana. Mo"emy np. doda% dane trzech u"ytkow-ników, rezygnuj&c z wprowadzania ich PESEL-i:
INSERT INTO osoby (id, imie, nazwisko)VALUES (15, 'Anna', 'Kowalska'), (16, 'Janina', 'Nowak'), (17, 'Dariusz', 'Malinowski')
W I C Z E N I E
5.10 Wprowadzenie wielu wierszy z automatycznymgenerowaniem identyfikatorów
Za pomoc& pojedynczej instrukcji INSERT wprowad* do tabeli osoby trzywiersze tak, aby warto#ci kolumny id zosta$y wygenerowane automa-tycznie.
Je#li identyfikatory wprowadzanych osób maj& by% generowane auto-matycznie, zastosujemy instrukcj( (pod warunkiem oczywi#cie "e ko-lumna id zosta$a odpowiednio zdefiniowana):
INSERT INTO osoby (id, imie, nazwisko, pesel)VALUES (DEFAULT, 'Anna', 'Kowalska', '07902657182'), (DEFAULT, 'Janina', 'Nowak', '17912652182'), (DEFAULT, 'Dariusz', 'Malinowski', '02699657182');
lub:
INSERT INTO osoby (imie, nazwisko, pesel)VALUES ('Anna', 'Kowalska', '07902657182'), ('Janina', 'Nowak', '17912652182'), ('Dariusz', 'Malinowski', '02699657182');
112 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Pobieranie danych
Instrukcja SELECTDane zapisane w tabelach bazy mo"na pobiera% za pomoc& instrukcjiSELECT. Instrukcja ta posiada wiele opcji i klauzul dodatkowych, napocz&tku poznajmy jednak jej podstawow& posta%, której schematycznastruktura wygl&da nast(puj&co:
Oznacza ona: pobierz warto#ci wymienionych kolumn z tabeli tabela,które spe$niaj& warunek warunek, a wyniki posortuj wzgl(dem kolumnwymienionych w klauzuli ORDER BY rosn&co (ASC) lub malej&co (DESC).Aby zobaczy%, jak w praktyce dzia$aj& proste zapytania typu SELECT,utworzymy tabel( przechowuj&c& dane o osobach: imi(, nazwisko orazrok i miejsce urodzenia. Wykorzystamy do tego celu instrukcj( CREATETABLE w postaci:
CREATE TABLE osoba( id INTEGER PRIMARY KEY, imie VARCHAR(20), nazwisko VARCHAR (35), rok_urodzenia INT2, miejsce_urodzenia VARCHAR(35));
Poniewa" u"yteczny b(dzie jedynie rok urodzenia, a nie pe$na data,dla kolumny rok_urodzenia zosta$ zastosowany typ INT2 zamiast DATE.Upro#ci to wykonywane operacje.
Za pomoc& poznanej na wcze#niejszych stronach instrukcji INSERTwprowadzimy teraz do tak utworzonej tabeli przyk$adowe dane, w su-mie 10 wierszy:
Przygotowana w ten sposób tabela pos$u"y do wykonywania dalszych%wicze).
W I C Z E N I E
5.11 WyCwietlenie caIej zawartoCci tabeli
Wy#wietl wszystkie dane z tabeli osoba.
Instrukcja SELECT, która pozwoli nam na pobranie wszystkich wierszyzawartych w tabeli osoba, ma posta%:
SELECT * FROM osoba;
Symbol * oznacza tu, "e interesuj& nas wszystkie kolumny. Efekt dzia-$ania tego polecenia jest widoczny na rysunku 5.4. Widzimy, "e fak-tycznie wy#wietlone zosta$y wszystkie dane wprowadzone uprzed-nio do tabeli osoba. Widzimy równie", "e kolejno#% wierszy jest taka,w jakiej zosta$y one wprowadzone do bazy.
Rysunek 5.4. Efekt dzia8ania instrukcji wy0wietlaj(cej wszystkie wierszetabeli osoba
Sortowanie wynikówGdyby#my chcieli, aby wyniki zosta$y posortowane, musieliby#myu"y% dodatkowej klauzuli ORDER BY. W najprostszym przypadku sor-towanie mo"e si( odbywa% wzgl(dem jednej kolumny. Domy#lnie jest
114 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
to sortowanie w porz&dku rosn&cym (czyli domy#lnie stosowana jestopcja ASC). Porz&dek sortowania mo"na zmieni% na malej&cy, stosuj&copcj( DESC.
W I C Z E N I E
5.12 Sortowanie w porzDdku rosnDcym
Wy#wietl wszystkie dane z tabeli osoba posortowane wed$ug kolumnynazwisko w porz&dku rosn&cym.
Je#li chcemy wy#wietli% wszystkie wiersze tabeli posortowane wzgl(-dem nazwiska w porz&dku alfabetycznym rosn&cym, powinni#my zasto-sowa% konstrukcj(:
SELECT * FROM osoba ORDER BY Nazwisko;
lub, co ma analogiczne znaczenie:
SELECT * FROM osoba ORDER BY Nazwisko ASC;
Wynik dzia$ania takiego zapytania zosta$ przedstawiony na rysunku 5.5.
Rysunek 5.5. Wynik sortowania wzgl/dem kolumny nazwisko w porz(dkurosn(cym
W I C Z E N I E
5.13 Sortowanie w porzDdku malejDcym
Wy#wietl wszystkie dane z tabeli osoba posortowane wed$ug kolumnynazwisko w porz&dku malej&cym.
W sytuacji, kiedy chcemy wy#wietli% wszystkie wiersze tabeli posor-towane wzgl(dem kolumny nazwisko w porz&dku alfabetycznym male-j&cym, powinni#my zastosowa% konstrukcj(:
SELECT * FROM osoba ORDER BY nazwisko DESC;
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 115
Wynik dzia$ania tego zapytania jest widoczny na rysunku 5.6.
Rysunek 5.6. Wynik sortowania wzgl/dem kolumny nazwiskow porz(dku malej(cym
Sortowanie mo"e si( równie" odbywa% wzgl(dem wi(kszej liczbykolumn. Mo"emy sobie na przyk$ad za"yczy%, "eby tablica zosta$aposortowana najpierw wzgl(dem nazwiska, a nast(pnie wzgl(demroku urodzenia.
W I C Z E N I E
5.14 Sortowanie wzgl:dem kilku kolumn
Wy#wietl wszystkie dane z tabeli osoba posortowane wed$ug kolumnnazwisko i miejsce_urodzenia w porz&dku malej&cym.
Zadanie takie zostanie zrealizowane przez instrukcj( SELECT w postaci:
SELECT * FROM osoba ORDER BY nazwisko, rok_urodzenia DESC;
Efekt jego dzia$ania zosta$ przedstawiony na rysunku 5.7.
Pobieranie danych z wybranych kolumnJe"eli chcemy wy#wietli% zawarto#% jedynie niektórych kolumn z wy-branej tabeli, ich nazwy nale"y umie#ci% za s$owem SELECT, oddzielaj&cje od siebie znakami przecinka.
116 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Rysunek 5.7. Wynik sortowania wzgl/dem dwóch kolumn
W I C Z E N I E
5.15 Pobranie danych z dwu wybranych kolumn
Wy#wietl zawarto#% kolumn imie i nazwisko z tabeli osoba.
Je#li interesuj& nas jedynie imiona i nazwiska osób, nale"y wykona%polecenie:
SELECT imie, nazwisko FROM osoba;
Uzyskamy wtedy efekt widoczny na rysunku 5.8.
Rysunek 5.8.Wynik pobraniadanych z dwóchwybranych kolumn
Oczywi#cie pobierana w przedstawiony wy"ej sposób zawarto#% ko-lumn mo"e by% równie" sortowana na takich samych zasadach jakprzedstawione w poprzednim podrozdziale.
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 117
W I C Z E N I E
5.16 Pobranie danych z kilku kolumnz uwzgl:dnieniem sortowania
Wy#wietl zawarto#% kolumn nazwisko i miejsce_urodzenia z tabeli osobaposortowan& wzgl(dem nazwiska.
Wykonanie zadania zapewni nam instrukcja:
SELECT nazwisko, miejsce_urodzenia FROM osoba ORDER BY nazwisko;
Zmiana nazw kolumn w wynikach zapytaniaW pewnych sytuacjach, przy pobieraniu danych, oryginalne nazwykolumn tabeli mog& by% dla nas niewygodne i chcieliby#my je zmie-ni%. Taka zamiana mo"e zosta% wykonana w bardzo prosty sposób, je#liwyst(puj&ce w zapytaniu SELECT nazwy kolumn zast&pimy sekwencjamio schematycznej postaci:
nazwa_kolumny AS alias
gdzie nazwa_kolumny to nazwa oryginalnej kolumny, a alias to nazwa,jaka ma si( pojawi% w wynikach zapytania.
W I C Z E N I E
5.17 Wykorzystanie aliasów
Zmie) nazwy kolumn w wynikach zapytania pobieraj&cego danez tabeli osoba.
Je#li zechcemy zmieni% nazw( kolumny imie na Imi[, rok_urodzenia naRok urodzenia, miejsce_urodzenia na Miasto, a nazwisko pozostawi% bezzmian, powinni#my wykona% instrukcj(:
SELECT imie AS "Imi[", nazwisko, rok_urodzenia AS "Rok urodzenia", miejsce_urodzenia AS "Miasto" FROM osoba;
Efekt jej dzia$ania zosta$ zaprezentowany na rysunku 5.9.
118 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Rysunek 5.9. Nazwy kolumn w wynikach zapytania zosta8y zmienione
Kryteria pobierania danychGdyby mo"liwo#ci pobierania danych z tabeli ogranicza$y si( do wszyst-kich zapisanych w niej wierszy, u"yteczno#% baz danych by$aby bardzoograniczona. W rzeczywisto#ci najcz(#ciej interesuje nas przecie" wy-brany podzbiór danych spe$niaj&cych pewne kryteria. Otrzymanieokre#lonego zestawu wierszy zapewni nam klauzula WHERE instrukcjiSELECT. Za klauzul& WHERE nale"y umie#ci% warunek, jaki musz& spe$nia%wiersze, aby znalaz$y si( w wynikach zapytania. Warunek w klauzuliWHERE mo"e zawiera% operatory relacyjne przedstawione w tabeli 5.1oraz operatory logiczne przedstawione w tabeli 5.22.
Tabela 5.1. Operatory relacyjne w PostgreSQL
Operator Opis Przyk%ad
= Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony jestrówny argumentowi znajduj#cemusi$ z prawej strony, a false— w przeciwnym razie.
id=10,nazwisko=’Kowalski’
<> Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony jest ró'nyod argumentu znajduj#cego si$z prawej strony, a false— w przeciwnym razie.
id<>2,nazwisko<>’Kowalski’
2 W PostgreSQL wyst(puj& równie" inne typy operatorów. Ich list( wrazz wyja#nieniami mo"na znale*% m.in. w publikacji PostgreSQL. Leksykonkieszonkowy (http://helion.pl/ksiazki/psqllk.htm).
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 119
Tabela 5.1. Operatory relacyjne w PostgreSQL — ci(g dalszy
Operator Opis Przyk%ad
!= Takie samo znaczenie jak <>. id!=2,nazwisko!=’Kowalski’
< Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony jestmniejszy od argumentu znajduj#cegosi$ z prawej strony, a false— w przeciwnym razie.
id<10
> Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony jestwi$kszy od argumentu znajduj#cegosi$ z prawej strony, a false— w przeciwnym razie.
id>10
<= Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony jestmniejszy lub równy argumentowiznajduj#cemu si$ z prawej strony,a false — w przeciwnym razie.
id<=10
>= Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony jestwi$kszy lub równy argumentowiznajduj#cemu si$ z prawej strony,a false — w przeciwnym razie.
id>=10
IS NULL Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej stronyjest równy NULL, lub false— w przeciwnym przypadku.
adres IS NULL, id ISNULL
IS NOT NULL Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony jest ró'nyod NULL, a false — w przeciwnymrazie.
adres IS NOT NULL, id ISNOT NULL
ISNULL Takie samo znaczenie jak IS NULL. adres ISNULL, id ISNULL
NOTNULL Takie samo znaczenie jak IS NOT NULL. adres NOTNULL, idNOTNULL
120 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Tabela 5.1. Operatory relacyjne w PostgreSQL — ci(g dalszy
Operator Opis Przyk%ad
IS TRUE Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej stronyma warto!" true, a false— w przeciwnym razie.
pole IS TRUE
IS NOT TRUE Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony mawarto!" ró'n# od true, a false— w przeciwnym razie.
pole IS NOT TRUE
IS FALSE Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej stronyma warto!" false, a false— w przeciwnym razie.
pole IS FALSE
IS NOTFALSE
Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej stronyma warto!" ró'n# od false, a falsew przeciwnym razie.
pole IS NOT FALSE
IS UNKNOWN Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej stronyma warto!" nieokre!lon#, a false— w przeciwnym razie.
pole IS UNKNOWN
IS NOTUNKNOWN
Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony nie mawarto!ci nieokre!lonej, a false— w przeciwnym razie.
pole IS NOT UNKNOWN
BETWEEN NAND M
Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony mawarto!" z przedzia(u od N do M,a false — w przeciwnym razie.
id BETWEEN 10 AND 20
NOT BETWEEN
N AND MZwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony nie mawarto!ci z przedzia(u od N do M,a false — w przeciwnym razie.
id NOT BETWEEN 10 AND 20
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 121
Tabela 5.1. Operatory relacyjne w PostgreSQL — ci(g dalszy
Operator Opis Przyk%ad
IN Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej stronyjest równy jednej z warto!ciwymienionych w nawiasie okr#g(ymza operatorem, a false— w przeciwnym razie.
id IN(1, 3, 5), nazwiskoIN(’Kowalski ’, ’Nowak’)
NOT IN Zwraca warto!" true, je!li argumentznajduj#cy si$ z lewej strony nie jestrówny jednej z warto!ciwymienionych w nawiasie okr#g(ymza operatorem, a false— w przeciwnym razie.
id NOT IN(1, 3, 5),nazwisko NOTIN(’Kowalski ’, ’Nowak’)
Tabela 5.2. Operatory logiczne w PostgreSQL
Operator Opis Przyk%ad
AND Logiczny iloczyn. Zwraca warto!"TRUE wtedy i tylko wtedy, gdy obaargumenty maj# warto!" TRUE.W ka'dym innym przypadku zwracawarto!" FALSE.
imie='Jan' ANDNazwisko='Kowalski'
OR Logiczna suma. Zwraca warto!"TRUE, kiedy przynajmniej jedenz argumentów ma warto!" TRUE.W ka'dym innym przypadku zwracawarto!" FALSE.
imie='Jan' ORimie='Andrzej'
NOT Logiczna negacja. Zmienia warto!"argumentu na przeciwn#. Je!liwarto!ci# argumentu by(o TRUE,wynikiem b$dzie FALSE, a je!liwarto!ci# argumentu by(o FALSE,wynikiem b$dzie TRUE.
NOT Aktywny
Porównywanie danych ze zdefiniowanym wzorcem mo"e by% równie"wykonywane za pomoc& operatorów: LIKE, NOT LIKE, SIMILAR TO i NOTSIMILAR TO, a tak"e wyra"e) regularnych wg standardu POSIX. Wyra"e-nie z operatorem LIKE b(dzie mia$o ogóln& posta%:
122 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
ci3g LIKE wzorzec
Jego wynikiem b(dzie warto#% true, je#li cicg pasuje do wzorca, a false —w przeciwnym razie. Argument wzorzec mo"e zawiera% dwa znaki spe-cjalne. Pierwszy z nich to %, który zast(puje dowoln& liczb( znaków,drugi to _ (podkre#lenie), zast(puj&cy dok$adnie jeden znak. Oznacza to,"e do przyk$adowego wzorca Jan% b(d& pasowa$y ci&gi Jan, Janusz,Janek, Janowski itp., a do wzorca Warszaw_ b(d& pasowa$y ci&gi Warszawa,Warszawy, Warszawo itp.
Wyra"enie zawieraj&ce operator NOT LIKE ma posta%:
ci3g NOT LIKE wzorzec
i dzia$a odwrotnie do LIKE, czyli zwraca warto#% true, je#li ci&g nie jestzgodny ze wzorcem, a warto#% false, je"eli jest zgodny.
Operatory SIMILAR TO i NOT SIMILAR TO dzia$aj& analogicznie do LIKE i NOTLIKE, z t& ró"nic&, "e wzorzec jest interpretowany jako wyra"enie regu-larne zgodne ze sk$adni& tego typu wyra"e) stosowanych w SQL.
W I C Z E N I E
5.18 Kryteria dla pojedynczej kolumny
Pobierz wszystkie wiersze tabeli osoba, które w polu nazwisko maj& zapi-san& warto#% Kowalski.
Skoro interesuj& nas wiersze tabeli, które w kolumnie nazwisko zawie-raj& warto#% Kowalski, powinni#my zastosowa% warunek nazwisko='Ko-walski', a wi(c pe$ne zapytanie b(dzie mia$o posta%:
SELECT * FROM osoba WHERE nazwisko='Kowalski';
Wynik jego dzia$ania zosta$ przedstawiony na rysunku 5.10.
Rysunek 5.10. Wyszukiwanie ze wzgl/du na nazwisko
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 123
W I C Z E N I E
5.19 ULycie operatora wi:kszoCci
Wykorzystaj operator wi(kszo#ci do pobrania listy osób urodzonych poroku 1985.
Zapytanie SQL b(dzie mia$o posta%:
SELECT * FROM osoba WHERE rok_urodzenia > 1985;
Efekt jego dzia$ania zosta$ przedstawiony na rysunku 5.11. Analo-giczny efekt mogliby#my równie" osi&gn&%, wykorzystuj&c operator >=w postaci:
SELECT * FROM osoba WHERE rok_urodzenia >= 1986;
Rysunek 5.11. Wynik zapytania korzystaj(cego z operatora wi/kszo0ci
W I C Z E N I E
5.20 ULycie operatora logicznego AND
U"yj operatora logicznego AND do uzyskania listy osób o identyfikatorachz przedzia$u 3 – 6.
Aby uzyska% w wyniku zapytania warto#ci pól z podanego zakresu,nale"y u"y% dwóch warunków — id >= 3 i id <= 6 — po$&czonychoperatorem AND, a wi(c konstrukcji w postaci:
SELECT * FROM osoba WHERE id >= 3 AND id <= 6;
Nale"y j& rozumie% jako: wy#wietl takie wiersze z tabeli osoba, którychwarto#% w kolumnie id jest wi(ksza od 3 lub równa oraz mniejsza od6 lub równa. Efekt jej dzia$ania zosta$ przedstawiony na rysunku 5.12.
Je#li chcemy w prosty sposób wybra% dane z pewnego przedzia$u, mo-"emy skorzysta% z operatora BETWEEN, a nie z dwóch warunków po$&-czonych operatorem AND. Zamiast wtedy pisa%:
124 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Rysunek 5.12. Dzia8anie operatora AND
kolumna >= pocz3tek_zakresu AND kolumna <= koniec_zakresu
tak jak to mia$o miejsce w poprzednim %wiczeniu, mo"emy zastosowa%konstrukcj(:
kolumna BETWEEN pocz3tek_zakresu AND koniec_zakresu
W I C Z E N I E
5.21 ULycie operatora BETWEEN
U"yj operatora BETWEEN do uzyskania listy osób o identyfikatorachz przedzia$u 3 – 6.
Je#li do pobrania wierszy o identyfikatorach z zakresu 3 – 6 ma zosta%wykorzystany operator BETWEEN, nale"y u"y% instrukcji:
SELECT * FROM osoba WHERE id BETWEEN 3 AND 6;
Efekt dzia$ania b(dzie taki sam jak na rysunku 5.12.
Je#li chcieliby#my, aby w wynikach zosta$y uwzgl(dnione warto#ciz pewnego zbioru, a nie przedzia$u, musieliby#my u"y% zarówno seriiinstrukcji warunkowych po$&czonych operatorami logicznymi, jak i ope-ratora IN. Dzia$anie b(dzie takie samo, jednak ta druga mo"liwo#% po-zwala na prostszy i du"o czytelniejszy zapis instrukcji. Operator IN maogóln& posta%:
warto+, IN (warto+,1, warto+,2, ..., warto+,N)
W I C Z E N I E
5.22 Wybranie wierszy o identyfikatorach z okreClonego zbioru
Wy#wietl dane osób o identyfikatorach 3, 5 i 7, wykorzystuj&c instruk-cje warunkowe po$&czone wybranym operatorem logicznym.
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 125
Je#li chcemy uzyska% dane osób o identyfikatorach 3, 5 i 7, powinni#myzastosowa% trzy instrukcje warunkowe: id = 3, id = 5, id = 7 po$&czoneza pomoc& operatora OR (czyli sumy logicznej). Instrukcja taka b(dziemia$a posta%:
SELECT * FROM osoba WHERE id=3 OR id=5 OR id=7;
Oznacza ona: wy#wietl wiersze z tabeli osoba, których warto#% w kolum-nie id jest równa 3 lub równa 5, lub równa 7. Po jej wykonaniu na ekra-nie ujrzymy widok taki, jak zaprezentowany na rysunku 5.13.
Rysunek 5.13. Wiersze o identyfikatorach z okre0lonego zbioru
W I C Z E N I E
5.23 ULycie operatora IN
Wy#wietl dane osób o identyfikatorach 3, 5 i 7, wykorzystuj&c ope-rator IN.
Je#li do wy#wietlenia rekordów o identyfikatorach 3, 5 i 7 ma zosta% u"y-ty operator IN, nale"y zastosowa% instrukcj(:
SELECT * FROM osoba WHERE id IN(3, 5, 7);
Efekt jej wykonania b(dzie taki sam jak zaprezentowany na rysun-ku 5.13.
Odwrotno#ci& IN jest NOT IN, które pozwala na pobranie danych niena-le"&cych do wymienionego zbioru. Równie" i w tym wypadku mo"liwejest u"ycie ekwiwalentu w postaci serii instrukcji warunkowych po$&-czonych operatorami logicznymi. Sam operator NOT IN ma ogóln& posta%:
warto+, NOT IN (warto+,1, warto+,2, ..., warto+,N)
126 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
W I C Z E N I E
5.24 ULycie operatora róLnoCci i operatorów logicznych
Wy#wietl dane osób o identyfikatorach ró"nych od 1, 3, 5, 7 i 9. U"yjoperatorów warunkowych i logicznych.
Niezb(dne b(dzie tu u"ycie 5 warunków w ogólnej postaci id <> war-to+, po$&czonych ze sob& operatorem logicznym AND. Ca$a instrukcjab(dzie wi(c mia$a posta%:
SELECT * FROM osobaWHERE id <> 1 AND id <> 3 AND id <> 5 AND id <> 7 AND id <> 9;
a efekt jej wykonania zosta$ przedstawiony na rysunku 5.14.
Rysunek 5.14. Wynik dzia8ania zapytania z Dwiczenia 5.24
W I C Z E N I E
5.25 ULycie operatora NOT IN
Wy#wietl dane osób o identyfikatorach ró"nych od 1, 3, 5, 7 i 9. U"yjoperatora NOT IN.
U"ycie operatora NOT IN upro#ci instrukcj( przedstawion& w %wicze-niu 5.24. W tym przypadku b(dzie ona bowiem mia$a posta%:
SELECT * FROM osoba WHERE id NOT IN(1, 3, 5, 7, 9);
Wynik jej dzia$ania b(dzie taki sam jak widoczny na rysunku 5.14.
Operator LIKE pozwala na pobranie z tabeli wierszy, których wybranepola pasuj& do zdefiniowanego przez nas wzorca.
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 127
W I C Z E N I E
5.26 Dane pasujDce do okreClonego wzorca
Wy#wietl dane wszystkich osób, których imiona zaczynaj& si( odci&gu Ka.
Je#li chcemy pozna% dane wszystkich osób, których imiona zaczynaj&si( od ci&gu Ka, powinni#my zastosowa% instrukcj(:
SELECT * FROM osoba WHERE imie LIKE 'Ka%';
Efekt dzia$ania tego polecenia jest widoczny na rysunku 5.15.
Rysunek 5.15. Wy0wietlenie danych pasuj(cych do zdefiniowanego wzorca
Oczywi#cie warunek w klauzuli WHERE nie musi ogranicza% si( do danychpobieranych z jednej kolumny, mo"na stosowa% warunki z$o"one po$&-czone operatorami logicznymi.
W I C Z E N I E
5.27 Wiele kolumn w klauzuli WHERE
Wy#wietl znajduj&ce si( w tabeli osoba dane osób, których imionazaczynaj& si( na liter( A, urodzonych po roku 1970 w Kielcach lubw Szczecinie.
W celu wykonania %wiczenia nale"y zastosowa% instrukcj(:
SELECT * FROM osoba WHERE imie LIKE 'A%' AND rok_urodzenia > 1970 AND miejsce_urodzenia IN ('Kielce', 'Szczecin');
Efekt dzia$ania tego zapytania zosta$ zaprezentowany na rysunku 5.16.
128 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Rysunek 5.16. Wyniki zapytania z warunkami dotycz(cymi wielu kolumn
Niepowtarzalno*+ wierszyInstrukcja SELECT mo"e by% równie" uzupe$niona o klauzul( DISTINCT,która gwarantuje niepowtarzalno#% wierszy wynikowych, innymi s$owy,eliminuje duplikaty z wyników zapytania. Za$ó"my, "e chcemy si(dowiedzie%, jakie ró"ne nazwiska nosz& osoby, których dane s& zapi-sane w tabeli pracownicy. Je#li zastosujemy typow& instrukcj(:
SELECT nazwisko FROM pracownicy ORDER BY nazwisko;
w wynikach znajd& si( podwójne dane dla nazwisk Kowalski i Ma-linowski (rysunek 5.17). Nie o to nam jednak chodzi$o. Do uzyskaniaprawid$owych wyników niezb(dne b(dzie wi(c u"ycie s$owa DISTINCT.
Napisz zapytanie, które pobierze z tabeli osoba list( nazwisk. W wyni-kach nie mog& si( pojawi% duplikaty danych.
Duplikaty danych wyeliminujemy, umieszczaj&c za s$owem SELECT s$o-wo DISTINCT. Instrukcja b(dzie wi(c mia$a posta%:
SELECT DISTINCT nazwisko FROM osoba ORDER BY nazwisko;
Wynik jej dzia$ania zosta$ zaprezentowany na rysunku 5.18.
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 129
Rysunek 5.18. Brak duplikatów w wynikach zapytania
Ograniczanie wyników zapyta,W wyniku wykonania zapytania pobieraj&cego dane mo"emy otrzyma%bardzo wiele wierszy wynikowych. Jednak liczba ta mo"e zosta% ogra-niczona za pomoc& klauzul LIMIT i OFFSET umieszczonych na samymko)cu zapytania. Instrukcja SELECT przyjmie wtedy ogóln& posta%:
gdzie ile1 oznacza liczb( wierszy, które maj& zosta% uwzgl(dnionew wynikach, natomiast ile2 — liczb( wierszy, które maj& by% pomini(te,zanim zaczn& by% prezentowane wyniki zapytania. Wyst&pienie zamiastile1 s$owa ALL b(dzie oznacza$o, "e maj& by% uwzgl(dniane wszystkiewiersze (zatem zapytanie zachowa si( tak, jakby klauzula LIMIT zosta$apomini(ta). Je#li natomiast ile2 b(dzie mia$o warto#% 0, b(dzie to ozna-cza$o, "e "adne wiersze nie maj& by% pomijane (wi(c zapytanie zacho-wa si( tak, jakby klauzula OFFSET zosta$a pomini(ta). Podczas stoso-wania klauzul LIMIT i OFFSET zwykle powinno si( równie" stosowa%klauzul( sortuj&c& ORDER BY.
W I C Z E N I E
5.29 Ograniczenie liczby wierszy wynikowych
Wykonaj instrukcj( pobieraj&c& wszystkie dane z tabeli osoba posor-towane wzgl(dem kolumny nazwisko. Ogranicz liczb( wy#wietlanychwierszy do 5.
130 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Ograniczenie do pi(ciu liczby wierszy pobieranych z tabeli osobazapewni nam instrukcja:
SELECT * FROM osoba ORDER BY nazwisko LIMIT 5;
Efekt jej dzia$ania zosta$ zaprezentowany na rysunku 5.19.
Rysunek 5.19. Ograniczenie liczby wierszy pobieranych z tabeli osoba
W I C Z E N I E
5.30 Pobieranie wierszy, poczDwszy od konkretnej pozycji
Wykonaj instrukcj( pobieraj&c& wszystkie dane z tabeli osoba posorto-wane wzgl(dem kolumny nazwisko tak, aby wy#wietlone zosta$y 3 wier-sze, poczynaj&c od 4.
Je#li chcemy, aby wy#wietlanie rozpocz($o si( od 4 wiersza i zosta$yw sumie wy#wietlone 3 wiersze, powinni#my zastosowa% instrukcj(:
SELECT * FROM osoba ORDER BY nazwisko LIMIT 3 OFFSET 3;
Wynik jej dzia$ania jest widoczny na rysunku 5.20.
Rysunek 5.20. Wynik dzia8ania instrukcji z Dwiczenia 5.30
Modyfikacja danychDane zapisane w tabelach mog& by% zmieniane i modyfikowane. S$u"ydo tego instrukcja UPDATE, która ma ogóln& posta%:
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 131
Oznacza ona: zmie) w tabeli tabela — w wierszach spe$niaj&cych wa-runek warunek — pole kolumna1 na warto+,1, pole kolumna2 na warto+,2itd. Klauzula WHERE jest opcjonalna i mo"e zosta% pomini(ta; w takiejsytuacji zmianie ulegn& wszystkie wskazane wiersze w tabeli.
W I C Z E N I E
5.31 Zmiana wszystkich wartoCci we wskazanej kolumnie
Zmie) zawarto#% kolumny miejsce_urodzenia w tabeli osoba tak, abywszystkie wiersze zawiera$y ci&g Krosno.
Wykonanie "wiczenia zmodyfikuje zawarto!" WSZYSTKICH wierszyw tabeli osoba. Nie pojawi si$ przy tym 'adne ostrze'enie czy te' pytanieo potwierdzenie ch$ci wykonania instrukcji. Przywrócenie oryginalnejzawarto!ci tabeli b$dzie wymaga(o ponownego wprowadzenia danych.
Zmian( wszystkich warto#ci w kolumnie miejsce_urodzenia zapewniinstrukcja:
UPDATE osoba SET miejsce_urodzenia='Krosno';
Kiedy j& wykonamy, zobaczymy komunikat, "e mia$a ona wp$yw na 10wierszy tabeli (rysunek 5.21). Je#li teraz wykonamy instrukcj( SELECTpobieraj&c& wszystkie dane z tabeli osoba, zobaczymy, "e faktyczniewszystkie wiersze kolumny miejsce_urodzenia zosta$y zmienione. Jest towidoczne na rysunku 5.22.
Rysunek 5.21.Wykonanieinstrukcjiaktualizuj(cejdane w tabeli
Zazwyczaj jednak aktualizuje si( tylko jeden lub kilka wierszy, nie-zb(dne jest wi(c zastosowanie klauzuli WHERE. Przyk$adowo mog$obysi( okaza%, "e w tablicy zapisali#my b$(dny rok urodzenia AndrzejaMalinowskiego, któremu w tabeli zosta$ przypisany identyfikator 5,i nale"y zamieni% warto#% 1989 na 1988.
132 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
Rysunek 5.22. Wszystkie wiersze w kolumnie miejsce_urodzeniazosta8y zmodyfikowane
W I C Z E N I E
5.32 Uaktualnienie wybranego wiersza w tabeli
Zmie) rok urodzenia osoby o identyfikatorze 5 na 1998.
W celu wykonania %wiczenia nale"y zastosowa% instrukcj(:
UPDATE osoba SET rok_urodzenia=1988 WHERE id=5;
Warunek id=5 zosta$ zastosowany, bowiem pole id jest kluczem pod-stawowym jednoznacznie identyfikuj&cym ka"dy rekord. Po wykona-niu tego zapytania, podobnie jak w przypadku %wiczenia 5.31, otrzy-mamy informacj(, ile rekordów zosta$o zmodyfikowanych (UPDATE).
Nic nie stoi równie" na przeszkodzie, aby jednocze#nie zmodyfikowa%kilka pól w danym wierszu. Mogliby#my na przyk$ad zmieni% od razuimi(, rok i miejsce urodzenia danej osoby.
W I C Z E N I E
5.33 Jednoczesna modyfikacja kilku pól
Zmodyfikuj dane postaci o identyfikatorze 8 tak, aby opisywa$y inn&osob(.
Aby wykona% to zadanie, mo"emy wykona% instrukcj(:
UPDATE osoba SET nazwisko='Andrzejewski', rok_urodzenia=1990, miejsce_urodzenia='Kielce' WHERE id=8;
Tym samym Kamil Andrzejczak urodzony w 1971 roku w Radomiustanie si( Kamilem Adrzejewskim urodzonym w 1990 roku w Kielcach.
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 133
Warunek w klauzuli WHERE mo"e wykorzystywa% operatory opisanew podrozdziale „Kryteria pobierania danych”, mo"e wi(c jednocze#niewskazywa% wi(cej ni" jeden rekord do modyfikacji. Je#li zatem wykry-jemy, "e osoby o identyfikatorach 4 i 5 maj& b$(dnie przypisane miej-sce urodzenia, którym nie jest Kielce, ale Radom, mo"emy to szybkonaprawi%.
W I C Z E N I E
5.34 Modyfikacja kilku wybranych rekordów
Zmie) miejsce urodzenia osób o identyfikatorach 4 i 5 na Radom.
Zmiana ta b(dzie wymaga$a instrukcji:
UPDATE osoba SET miejsce_urodzenia='Radom' WHERE id=4 OR id=5;
lub
UPDATE osoba SET miejsce_urodzenia='Radom' WHERE id IN(4,5);
Usuwanie danychWiemy ju", jak dodawa% dane do tabeli, jak je pobiera% i modyfikowa%.Do omówienia zosta$a jeszcze równie wa"na kwestia usuwania wierszyz tabel. Do usuwania danych s$u"y instrukcja DELETE o schematycznejpostaci:
DELETE FROM tabela[WHERE warunek]
Oznacza ona: usu) z tabeli tabela wszystkie wiersze spe$niaj&ce waru-nek warunek. Je#li warunek zostanie pomini(ty, zostan& usuni(te wszyst-kie dane (podobnie jak w przypadku instrukcji UPDATE, gdzie pomini(ciewarunku powodowa$o modyfikacj( wszystkich wierszy tabeli).
W I C Z E N I E
5.35 Usuni:cie wszystkich danych z tabeli
Usu) wszystkie dane z tabeli osoba.
Aby usun&% wszystkie dane z tabeli osoba, trzeba wykona% instrukcj(:
134 P o s t g r e S Q L 8 . 3 • & w i c z e n i a
DELETE FROM osoba;
Po jej wykonaniu tabela osoba nie b(dzie zawiera$a "adnych danych.Tak& konstrukcj( nale"y stosowa% z uwag&, gdy" serwer nie wygeneruje"adnego ostrze"enia czy dodatkowego pytania. Wpisanie powy"szejkonstrukcji i zatwierdzenie jej klawiszem Enter spowoduje natych-miastowe skasowanie danych!
Najcz(#ciej wi(c stosuje si( instrukcj( DELETE zawieraj&c& warunekw klauzuli WHERE, który ma tak& sam& posta% jak opisywana podczasomawiania instrukcji SELECT. Wykonajmy kilka %wicze) obrazuj&cychto zagadnienie.
W I C Z E N I E
5.36 Usuwanie konkretnego wiersza tabeli
Usu) z tabeli osoba dane osoby o identyfikatorze 5.
Je#li chcemy usun&% z tabeli osoba dane osoby o identyfikatorze 5, zasto-sujemy instrukcj(:
DELETE FROM osoba WHERE id=5;
Serwer odpowie komunikatem:
DELETE 1
Komunikat ten wskazuje, "e wykonanie zapytania zako)czy$o si( suk-cesem oraz "e zosta$ usuni(ty 1 wiersz.
W I C Z E N I E
5.37 Usuwanie kilku wybranych rekordów
Usu) dane osób o identyfikatorach równych 3, 5 i 7.
Aby najpro#ciej usun&% dane osób o identyfikatorach 3, 5 i 7, nale"y wy-kona% instrukcj(:
DELETE FROM osoba WHERE id IN (3, 5, 7);
Mo"na równie" zastosowa% seri( warunków po$&czonych operatorem OR:
DELETE FROM osoba WHERE id=3 OR id=5 OR id=7;
R o z d z i a ' 5 . • P o ds t a w o we i n s t r uk c j e S Q L 135
W I C Z E N I E
5.38 Usuwanie rekordów z okreClonego przedziaIu
Usu) dane osób o identyfikatorach z przedzia$u 3 – 5.
W celu usuni(cia danych osób o identyfikatorach z przedzia$u 3 – 5u"yjemy instrukcji:
DELETE FROM osoba WHERE id BETWEEN 3 AND 5;
lub:
DELETE FROM osoba WHERE id >= 4 AND id <= 5;
Oczywi#cie kryteria usuwania nie musz& dotyczy% tylko kolumn licz-bowych. Warunek klauzuli WHERE mo"e dotyczy% dowolnych kolumn,dowolnych typów.
W I C Z E N I E
5.39 Usuwanie rekordów ze wzgl:du na ciDg znaków
Usu) z tabeli osoba dane osób o nazwisku Kowalski.