postgresql 8.3. Ćwiczenia

34
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

Upload: wydawnictwo-helion

Post on 28-Nov-2014

858 views

Category:

Technology


0 download

DESCRIPTION

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 transakcjiPrzekonaj się, dlaczego PostgreSQL zyskał tak ogromne uznanie.

TRANSCRIPT

Page 1: PostgreSQL 8.3. Ćwiczenia

Wydawnictwo Helionul. Ko�ciuszki 1c44-100 Gliwicetel. 032 230 98 63e-mail: [email protected]

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

Page 2: PostgreSQL 8.3. Ćwiczenia

Spis tre!ciWst"p 5

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

Page 3: PostgreSQL 8.3. Ćwiczenia

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

Page 4: PostgreSQL 8.3. Ćwiczenia

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%:

INSERT [INTO] nazwa_tabeli [(kolumna1, kolumna2, ..., kolumnaN)]VALUES (warto+,1, warto+,2, ..., warto+,N)

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

Page 5: PostgreSQL 8.3. Ćwiczenia

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.

Page 6: PostgreSQL 8.3. Ćwiczenia

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');

Page 7: PostgreSQL 8.3. Ćwiczenia

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

Page 8: PostgreSQL 8.3. Ćwiczenia

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.

Rysunek 5.3. Próba wprowadzenia duplikatu klucza podstawowego

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');

Page 9: PostgreSQL 8.3. Ćwiczenia

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%:

INSERT [INTO] tabela [(kolumna1, kolumna2, ..., kolumnaN)]VALUES (warto+,1A, warto+,2A, ..., warto+,NA), (warto+,1B, warto+,2B, ..., warto+,NB), ... (warto+,1Z, warto+,2Z, ..., warto+,NZ)

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#%.

Page 10: PostgreSQL 8.3. Ćwiczenia

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');

Page 11: PostgreSQL 8.3. Ćwiczenia

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:

SELECT kolumna1, kolumna2, ..., kolumnaNFROM tabela[WHERE warunek][ORDER BY kolumna1, kolumna2, ..., kolumnaN [ASC | DEC]]

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:

INSERT INTO osoba VALUES (1, 'Adam', 'Kowalski', 1964, 'Bydgoszcz'), (2, 'Adam', 'Nowak', 1972, 'Szczecin'), (3, 'Andrzej', 'Kowalski', 1986, 'Nidzica'), (4, 'Arkadiusz', 'Malinowski', 1986, 'Kielce'),

Page 12: PostgreSQL 8.3. Ćwiczenia

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 113

(5, 'Andrzej', 'Malinowski', 1989, 'Kielce'), (6, 'Krzysztof', 'Nowicki', 1986, 'Bydgoszcz'), (7, 'Kacper', 'Adamczyk', 1971, 'Kielce'), (8, 'Kamil', 'Andrzejczak', 1971, 'Radom'), (9, 'Krzysztof', 'Arkuszewski', 1989, 'Szczecin'), (10, 'Kamil', 'Borowski', 1976, 'Skierniewice');

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

Page 13: PostgreSQL 8.3. Ćwiczenia

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;

Page 14: PostgreSQL 8.3. Ćwiczenia

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.

Page 15: PostgreSQL 8.3. Ćwiczenia

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.

Page 16: PostgreSQL 8.3. Ćwiczenia

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.

Page 17: PostgreSQL 8.3. Ćwiczenia

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

Page 18: PostgreSQL 8.3. Ćwiczenia

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

Page 19: PostgreSQL 8.3. Ćwiczenia

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

Page 20: PostgreSQL 8.3. Ćwiczenia

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%:

Page 21: PostgreSQL 8.3. Ćwiczenia

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

Page 22: PostgreSQL 8.3. Ćwiczenia

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%:

Page 23: PostgreSQL 8.3. Ćwiczenia

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.

Page 24: PostgreSQL 8.3. Ćwiczenia

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)

Page 25: PostgreSQL 8.3. Ćwiczenia

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.

Page 26: PostgreSQL 8.3. Ćwiczenia

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.

Page 27: PostgreSQL 8.3. Ćwiczenia

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.

Rysunek 5.17.W wynikachzapytania pojawi8ysi/ duplikatydanych

W I C Z E N I E

5.28 ULycie klauzuli 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.

Page 28: PostgreSQL 8.3. Ćwiczenia

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%:

SELECT kolumna1, kolumna2, ..., kolumnaNFROM tabela[WHERE warunek][ORDER BY kolumna1, kolumna2, ..., kolumnaN [ASC | DEC]]LIMIT [ile1 | ALL][OFFSET ile2]

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.

Page 29: PostgreSQL 8.3. Ćwiczenia

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%:

Page 30: PostgreSQL 8.3. Ćwiczenia

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

UPDATE tabelaSET kolumna1=warto+,1, kolumna2=warto+,2, ..., kolumnaN=warto+,N[WHERE warunek]

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.

Page 31: PostgreSQL 8.3. Ćwiczenia

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.

Page 32: PostgreSQL 8.3. Ćwiczenia

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(:

Page 33: PostgreSQL 8.3. Ćwiczenia

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;

Page 34: PostgreSQL 8.3. Ćwiczenia

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.

Wykonanie %wiczenia zapewni nam instrukcja:

DELETE FROM osoba WHERE nazwisko='Kowalski';