Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
01298 012825 11049049 na godz. na dobę w sumie
PostgreSQL 8.3. Ćwiczenia - książka
PostgreSQL 8.3. Ćwiczenia - książka
Autor: Liczba stron: 192
Wydawca: Helion Język publikacji: polski
ISBN: 83-246-0859-1 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> bazy danych >> postgresql - programowanie
Porównaj ceny (książka, ebook, audiobook).

Poznaj podstawy obsługi wydajnej, stabilnej i bezpiecznej bazy danych

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.

Przekonaj się, dlaczego PostgreSQL zyskał tak ogromne uznanie.
Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

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 (cid:149) Jak zainstalowa(cid:230) i skonfigurowa(cid:230) PostgreSQL? (cid:149) W jaki spos(cid:243)b tworzy(cid:230) i modyfikowa(cid:230) tabele? (cid:149) Jak manipulowa(cid:230) 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(cid:156)r(cid:243)d najwiŒkszych i najbardziej rozbudowanych system(cid:243)w znajdziemy produkty bezp‡atne. Jednym z nich jest system zarz„dzania bazami danych PostgreSQL (cid:151) powszechnie uwa¿any za najbardziej uniwersalny i stabilny spo(cid:156)r(cid:243)d baz danych rozprowadzanych na zasadach wolnego dostŒpu. PostgreSQL ma dwie wersje (cid:151) dla system(cid:243)w Windows i Linux (cid:151) a jego mo¿liwo(cid:156)ci wykorzystywane s„ zar(cid:243)wno przez tw(cid:243)rc(cid:243)w portali sieciowych, jak i potŒ¿nych system(cid:243)w korporacyjnych przetwarzaj„cych ogromne ilo(cid:156)ci danych. Ksi„¿ka (cid:132)PostgreSQL 8.3. ˘wiczenia(cid:148) to kr(cid:243)tkie i skuteczne wprowadzenie w zasady u¿ywania tego systemu baz danych. Czytaj„c j„ i wykonuj„c zawarte w niej (cid:230)wiczenia, dowiesz siŒ, jak zainstalowa(cid:230) PostgreSQL w Windows i Linuksie, oraz szybko poznasz podstawy administrowania serwerem bazy danych i kontami jej u¿ytkownik(cid:243)w. Nauczysz siŒ tworzy(cid:230) tabele, dobiera(cid:230) odpowiednie typy danych i budowa(cid:230) indeksy. Opanujesz jŒzyk SQL s‡u¿„cy do manipulowania danymi w tabelach. Przeczytasz tak¿e o transakcjach i wiŒzach integralno(cid:156)ci. (cid:149) Instalacja serwera PostgreSQL w systemach Windows i Linux (cid:149) Uruchamianie i zatrzymywanie serwera (cid:149) Obs‡uga kont u¿ytkownik(cid:243)w (cid:149) Zarz„dzanie bazami danych (cid:149) Podstawowe koncepcje relacyjnych baz danych (cid:149) Typy danych w PostgreSQL (cid:149) Tworzenie, modyfikowanie i usuwanie tabel (cid:149) Pobieranie danych i przetwarzanie wynik(cid:243)w zapytania (cid:149) Z‡o¿one zapytania SQL (cid:149) Obs‡uga transakcji Przekonaj siŒ, dlaczego PostgreSQL zyska‡ tak ogromne uznanie Wydawnictwo Helion ul. Ko(cid:156)ciuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl Spis treĂci Rozdziaï 1. WstÚp Instalacja i konfiguracja Instalacja w systemie Linux Instalacja w systemie Windows Uruchamianie i zatrzymywanie serwera Rozdziaï 2 . ZarzÈdzanie serwerem NawiÈzywanie poïÈczenia z serwerem Obsïuga kont uĝytkowników ZarzÈdzanie bazami danych Rozdziaï 3. Koncepcja relacyjnych baz danych Tabele Klucze Relacje Podstawowe zasady projektowania tabel Rozdziaï 4. Praca z tabelami Typy danych Tworzenie tabel Indeksy Modyfikacja tabel Usuwanie tabel Kilka tabel w praktyce 5 9 9 16 19 29 29 32 45 49 49 50 52 56 65 65 75 86 89 95 96 4 PostgreSQL 8.3 • mwiczenia Rozdziaï 5. Podstawowe instrukcje SQL Wprowadzanie danych Pobieranie danych Modyfikacja danych Usuwanie danych Rozdziaï 6. Zïoĝone instrukcje SQL ZïÈczenia i unie Grupowanie i agregacja danych Rozdziaï 7. Podzapytania, transakcje i wiÚzy integralnoĂci Podzapytania Transakcje WiÚzy integralnoĂci 105 105 112 130 133 137 137 153 165 165 176 182 5 Podstawowe instrukcje SQL Wprowadzanie danych Instrukcja INSERT INTO Tabele, 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 do tego instrukcja INSERT INTO, którÈ poznamy na kolejnych stronach tego rozdziaï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órym w polu kolumna1 zostaïa zapisana wartoĂÊ wartoħè1, w polu kolumna2 — wartoĂÊ wartoħè2 itd. Elementy instrukcji ujÚte w nawias kwadratowy sÈ opcjonalne. Przygotujmy wiÚc przykïadowÈ tabelÚ, która posïuĝy do wykonywania kolejnych Ê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 m W I C Z E N I E PostgreSQL 8.3 • mwiczenia 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. Wykonanie zapytania wprowadzajÈcego dane do tabeli osoby ZwróÊmy przy tym uwagÚ, ĝe wszystkie wprowadzone ciÈgi znaków zostaï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 kolumn w 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. m 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 nazw kolumn. Rozdziaï 5. • Podstawowe instrukcje SQL 107 Wykonanie Êwiczenia zapewni nam instrukcja: INSERT INTO osoby VALUES (2, Adam , Nowak , 12345678901 ); Nie ma jednak koniecznoĂci kaĝdorazowego wprowadzania danych do wszystkich kolumn. CzÚĂÊ z nich moĝe zostaÊ pominiÚta, pod warun- kiem oczywiĂcie ĝe nie majÈ one przypisanego atrybutu NOT NULL. m 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 kolumny pesel 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. m 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Ècego danych 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 PostgreSQL 8.3 • mwiczenia której wykonanie zakoñczy siÚ zgïoszeniem komunikatu o bïÚdzie widocznym na rysunku 5.2. Skoro bowiem kolumna imie ma nadany atrybut NOT NULL oraz nie zostaïa jej nadana wartoĂÊ domyĂlna, to nie moĝna wprowadziÊ do tabeli wiersza niezawierajÈcego danych dla tej kolumny. Rysunek 5.2. Próba pominiÚcia wartoĂci wymaganej ze wzglÚdu na atrybut NOT NULL Warto równieĝ wiedzieÊ, ĝe kolejnoĂÊ wprowadzania danych w instruk- cji INSERT nie musi byÊ taka sama jak struktura kolumn w tabeli. m W I C Z E N I E 5.5 Zmiana kolejnoĂci kolumn w zapytaniu wprowadzajÈcym dane Dodaj do tabeli osoby wiersz danych tak, aby kolejnoĂÊ kolumn byïa inna 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óbujemy dwukrotnie wykonaÊ instrukcjÚ wprowadzajÈcÈ dane z Êwiczenia 5.2. Czy taka operacja bÚdzie moĝliwa? m 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 Rozdziaï 5. • Podstawowe instrukcje SQL 109 rysunku 5.3. Przyczyna wydaje siÚ jasna. Otóĝ wartoĂci dla kolumn imie, nazwisko oraz pesel mogÈ siÚ powtarzaÊ, ale wartoĂÊ dla kolumny id — 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ñmy wiÚ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ĝy jÈ wstawiÊ do przedstawionej na poczÈtku tego rozdziaïu instrukcji CRE- ATE TABLE): id SERIAL PRIMARY KEY NOT NULL m W I C Z E N I E 5.7 Automatyczne generowanie wartoĂci 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 PostgreSQL 8.3 • mwiczenia Wprowadzony w ten sposób wiersz bÚdzie miaï identyfikator o jeden wiÚkszy niĝ maksymalna wartoĂÊ zapisana w kolumnie id. JeĂli zatem przed 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 wierszy Omówiona w poprzednim punkcie instrukcji INSERT INTO wystÚpuje równieĝ w wersji pozwalajÈcej na jednoczesne wstawienie do tabeli wielu wierszy. Dane kaĝdego z nich muszÈ byÊ jednak wtedy ujÚte w 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 celu zwiÚ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Ú. m W I C Z E N I E 5.8 Umieszczenie w tabeli wielu wierszy Za pomocÈ pojedynczej instrukcji INSERT INTO wprowadě do tabeli osoby dane 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ĂÊ. Rozdziaï 5. • Podstawowe instrukcje SQL 111 m W I C Z E N I E 5.9 Wprowadzenie wielu wierszy z pominiÚciem wybranych danych Za pomocÈ pojedynczej instrukcji INSERT wprowadě do tabeli osoby trzy wiersze 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 ) m W I C Z E N I E 5.10 Wprowadzenie wielu wierszy z automatycznym generowaniem identyfikatorów Za pomocÈ pojedynczej instrukcji INSERT wprowadě do tabeli osoby trzy wiersze 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 PostgreSQL 8.3 • mwiczenia Pobieranie danych Instrukcja SELECT Dane zapisane w tabelach bazy moĝna pobieraÊ za pomocÈ instrukcji SELECT. Instrukcja ta posiada wiele opcji i klauzul dodatkowych, na poczÈtku poznajmy jednak jej podstawowÈ postaÊ, której schematyczna struktura wyglÈda nastÚpujÈco: SELECT kolumna1, kolumna2, ..., kolumnaN FROM 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 kolumn wymienionych 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 oraz rok i miejsce urodzenia. Wykorzystamy do tego celu instrukcjÚ CREATE TABLE 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 INSERT wprowadzimy 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 ), Rozdziaï 5. • Podstawowe instrukcje SQL 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ñ. m W I C Z E N I E 5.11 WyĂwietlenie caïej zawartoĂci tabeli WyĂwietl wszystkie dane z tabeli osoba. Instrukcja SELECT, która pozwoli nam na pobranie wszystkich wierszy zawartych 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 dziaïania instrukcji wyĂwietlajÈcej wszystkie wiersze tabeli osoba Sortowanie wyników GdybyĂmy chcieli, aby wyniki zostaïy posortowane, musielibyĂmy uĝyÊ dodatkowej klauzuli ORDER BY. W najprostszym przypadku sor- towanie moĝe siÚ odbywaÊ wzglÚdem jednej kolumny. DomyĂlnie jest 114 PostgreSQL 8.3 • mwiczenia to sortowanie w porzÈdku rosnÈcym (czyli domyĂlnie stosowana jest opcja ASC). PorzÈdek sortowania moĝna zmieniÊ na malejÈcy, stosujÈc opcjÚ DESC. m W I C Z E N I E 5.12 Sortowanie w porzÈdku rosnÈcym WyĂwietl wszystkie dane z tabeli osoba posortowane wedïug kolumny nazwisko 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Èdku rosnÈcym m W I C Z E N I E 5.13 Sortowanie w porzÈdku malejÈcym WyĂwietl wszystkie dane z tabeli osoba posortowane wedïug kolumny nazwisko 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; Rozdziaï 5. • Podstawowe instrukcje SQL 115 Wynik dziaïania tego zapytania jest widoczny na rysunku 5.6. Rysunek 5.6. Wynik sortowania wzglÚdem kolumny nazwisko w porzÈdku malejÈcym Sortowanie moĝe siÚ równieĝ odbywaÊ wzglÚdem wiÚkszej liczby kolumn. Moĝemy sobie na przykïad zaĝyczyÊ, ĝeby tablica zostaïa posortowana najpierw wzglÚdem nazwiska, a nastÚpnie wzglÚdem roku urodzenia. m 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 kolumn nazwisko 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 kolumn Jeĝeli chcemy wyĂwietliÊ zawartoĂÊ jedynie niektórych kolumn z wy- branej tabeli, ich nazwy naleĝy umieĂciÊ za sïowem SELECT, oddzielajÈc je od siebie znakami przecinka. 116 PostgreSQL 8.3 • mwiczenia Rysunek 5.7. Wynik sortowania wzglÚdem dwóch kolumn m 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 pobrania danych z dwóch wybranych kolumn OczywiĂcie pobierana w przedstawiony wyĝej sposób zawartoĂÊ ko- lumn moĝe byÊ równieĝ sortowana na takich samych zasadach jak przedstawione w poprzednim podrozdziale. Rozdziaï 5. • Podstawowe instrukcje SQL 117 m W I C Z E N I E 5.16 Pobranie danych z kilku kolumn z uwzglÚdnieniem sortowania WyĂwietl zawartoĂÊ kolumn nazwisko i miejsce_urodzenia z tabeli osoba posortowanÈ wzglÚdem nazwiska. Wykonanie zadania zapewni nam instrukcja: SELECT nazwisko, miejsce_urodzenia FROM osoba ORDER BY nazwisko; Zmiana nazw kolumn w wynikach zapytania W pewnych sytuacjach, przy pobieraniu danych, oryginalne nazwy kolumn tabeli mogÈ byÊ dla nas niewygodne i chcielibyĂmy je zmie- niÊ. Taka zamiana moĝe zostaÊ wykonana w bardzo prosty sposób, jeĂli wystÚpujÈce w zapytaniu SELECT nazwy kolumn zastÈpimy sekwencjami o schematycznej postaci: nazwa_kolumny AS alias gdzie nazwa_kolumny to nazwa oryginalnej kolumny, a alias to nazwa, jaka ma siÚ pojawiÊ w wynikach zapytania. m W I C Z E N I E 5.17 Wykorzystanie aliasów Zmieñ nazwy kolumn w wynikach zapytania pobierajÈcego dane z tabeli osoba. JeĂli zechcemy zmieniÊ nazwÚ kolumny imie na Imiú, rok_urodzenia na Rok urodzenia, miejsce_urodzenia na Miasto, a nazwisko pozostawiÊ bez zmian, 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 PostgreSQL 8.3 • mwiczenia Rysunek 5.9. Nazwy kolumn w wynikach zapytania zostaïy zmienione Kryteria pobierania danych Gdyby moĝliwoĂci pobierania danych z tabeli ograniczaïy siÚ do wszyst- kich zapisanych w niej wierszy, uĝytecznoĂÊ baz danych byïaby bardzo ograniczona. W rzeczywistoĂci najczÚĂciej interesuje nas przecieĝ wy- brany podzbiór danych speïniajÈcych pewne kryteria. Otrzymanie okreĂlonego zestawu wierszy zapewni nam klauzula WHERE instrukcji SELECT. Za klauzulÈ WHERE naleĝy umieĂciÊ warunek, jaki muszÈ speïniaÊ wiersze, aby znalazïy siÚ w wynikach zapytania. Warunek w klauzuli WHERE moĝe zawieraÊ operatory relacyjne przedstawione w tabeli 5.1 oraz operatory logiczne przedstawione w tabeli 5.22. Tabela 5.1. Operatory relacyjne w PostgreSQL Operator Opis = Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony jest równy argumentowi znajdujÈcemu siÚ z prawej strony, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony jest róĝny od argumentu znajdujÈcego siÚ z prawej strony, a false — w przeciwnym razie. Przykïad id=10, nazwisko=’Kowalski’ id 2, nazwisko ’Kowalski’ 2 W PostgreSQL wystÚpujÈ równieĝ inne typy operatorów. Ich listÚ wraz z wyjaĂnieniami moĝna znaleěÊ m.in. w publikacji PostgreSQL. Leksykon kieszonkowy (http://helion.pl/ksiazki/psqllk.htm). Rozdziaï 5. • Podstawowe instrukcje SQL 119 Tabela 5.1. Operatory relacyjne w PostgreSQL — ciÈg dalszy Operator Opis Takie samo znaczenie jak . Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony jest mniejszy od argumentu znajdujÈcego siÚ z prawej strony, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony jest wiÚkszy od argumentu znajdujÈcego siÚ z prawej strony, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony jest mniejszy lub równy argumentowi znajdujÈcemu siÚ z prawej strony, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony jest wiÚkszy lub równy argumentowi znajdujÈcemu siÚ z prawej strony, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony jest równy NULL, lub false — w przeciwnym przypadku. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony jest róĝny od NULL, a false — w przeciwnym razie. Przykïad id!=2, nazwisko!=’Kowalski’ id 10 id 10 id =10 id =10 adres IS NULL, id IS NULL adres IS NOT NULL, id IS NOT NULL != = = IS NULL IS NOT NULL ISNULL NOTNULL Takie samo znaczenie jak IS NULL. adres ISNULL, id ISNULL Takie samo znaczenie jak IS NOT NULL. adres NOTNULL, id NOTNULL 120 PostgreSQL 8.3 • mwiczenia Tabela 5.1. Operatory relacyjne w PostgreSQL — ciÈg dalszy Operator Opis IS TRUE IS NOT TRUE IS FALSE IS NOT FALSE IS UNKNOWN IS NOT UNKNOWN BETWEEN N AND M NOT BETWEEN N AND M Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony ma wartoĂÊ true, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony ma wartoĂÊ róĝnÈ od true, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony ma wartoĂÊ false, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony ma wartoĂÊ róĝnÈ od false, a false w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony ma wartoĂÊ nieokreĂlonÈ, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony nie ma wartoĂci nieokreĂlonej, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony ma wartoĂÊ z przedziaïu od N do M, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony nie ma wartoĂci z przedziaïu od N do M, a false — w przeciwnym razie. Przykïad pole IS TRUE pole IS NOT TRUE pole IS FALSE pole IS NOT FALSE pole IS UNKNOWN pole IS NOT UNKNOWN id BETWEEN 10 AND 20 id NOT BETWEEN 10 AND 20 Rozdziaï 5. • Podstawowe instrukcje SQL 121 Tabela 5.1. Operatory relacyjne w PostgreSQL — ciÈg dalszy Operator Opis Przykïad IN NOT IN Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony jest równy jednej z wartoĂci wymienionych w nawiasie okrÈgïym za operatorem, a false — w przeciwnym razie. Zwraca wartoĂÊ true, jeĂli argument znajdujÈcy siÚ z lewej strony nie jest równy jednej z wartoĂci wymienionych w nawiasie okrÈgïym za operatorem, a false — w przeciwnym razie. id IN(1, 3, 5), nazwisko IN(’Kowalski ’, ’Nowak’) id NOT IN(1, 3, 5), nazwisko NOT IN(’Kowalski ’, ’Nowak’) Tabela 5.2. Operatory logiczne w PostgreSQL Operator Opis AND OR NOT Logiczny iloczyn. Zwraca wartoĂÊ TRUE wtedy i tylko wtedy, gdy oba argumenty majÈ wartoĂÊ TRUE. W kaĝdym innym przypadku zwraca wartoĂÊ FALSE. Logiczna suma. Zwraca wartoĂÊ TRUE, kiedy przynajmniej jeden z argumentów ma wartoĂÊ TRUE. W kaĝdym innym przypadku zwraca wartoĂÊ FALSE. Logiczna negacja. Zmienia wartoĂÊ argumentu na przeciwnÈ. JeĂli wartoĂciÈ argumentu byïo TRUE, wynikiem bÚdzie FALSE, a jeĂli wartoĂciÈ argumentu byïo FALSE, wynikiem bÚdzie TRUE. Przykïad imie= Jan AND Nazwisko= Kowalski imie= Jan OR imie= Andrzej NOT Aktywny Porównywanie danych ze zdefiniowanym wzorcem moĝe byÊ równieĝ wykonywane za pomocÈ operatorów: LIKE, NOT LIKE, SIMILAR TO i NOT SIMILAR TO, a takĝe wyraĝeñ regularnych wg standardu POSIX. Wyraĝe- nie z operatorem LIKE bÚdzie miaïo ogólnÈ postaÊ: 122 PostgreSQL 8.3 • mwiczenia ciæg LIKE wzorzec Jego wynikiem bÚdzie wartoĂÊ true, jeĂli ciæg 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Ê: ciæg NOT LIKE wzorzec i dziaïa odwrotnie do LIKE, czyli zwraca wartoĂÊ true, jeĂli ciÈg nie jest zgodny ze wzorcem, a wartoĂÊ false, jeĝeli jest zgodny. Operatory SIMILAR TO i NOT SIMILAR TO dziaïajÈ analogicznie do LIKE i NOT LIKE, z tÈ róĝnicÈ, ĝe wzorzec jest interpretowany jako wyraĝenie regu- larne zgodne ze skïadniÈ tego typu wyraĝeñ stosowanych w SQL. m 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 Rozdziaï 5. • Podstawowe instrukcje SQL 123 m W I C Z E N I E 5.19 Uĝycie operatora wiÚkszoĂci Wykorzystaj operator wiÚkszoĂci do pobrania listy osób urodzonych po roku 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ÚkszoĂci m W I C Z E N I E 5.20 Uĝycie operatora logicznego AND Uĝyj operatora logicznego AND do uzyskania listy osób o identyfikatorach z 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ïÈczonych operatorem 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órych wartoĂÊ w kolumnie id jest wiÚksza od 3 lub równa oraz mniejsza od 6 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 PostgreSQL 8.3 • mwiczenia Rysunek 5.12. Dziaïanie operatora AND kolumna = poczætek_zakresu AND kolumna = koniec_zakresu tak jak to miaïo miejsce w poprzednim Êwiczeniu, moĝemy zastosowaÊ konstrukcjÚ: kolumna BETWEEN poczætek_zakresu AND koniec_zakresu m W I C Z E N I E 5.21 Uĝycie operatora BETWEEN Uĝyj operatora BETWEEN do uzyskania listy osób o identyfikatorach z 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Ăci z pewnego zbioru, a nie przedziaïu, musielibyĂmy uĝyÊ zarówno serii instrukcji 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 ma ogólnÈ postaÊ: wartoħè IN (wartoħè1, wartoħè2, ..., wartoħèN) m W I C Z E N I E 5.22 Wybranie wierszy o identyfikatorach z okreĂlonego zbioru WyĂwietl dane osób o identyfikatorach 3, 5 i 7, wykorzystujÈc instruk- cje warunkowe poïÈczone wybranym operatorem logicznym. Rozdziaï 5. • Podstawowe instrukcje SQL 125 JeĂli chcemy uzyskaÊ dane osób o identyfikatorach 3, 5 i 7, powinniĂmy zastosowaÊ trzy instrukcje warunkowe: id = 3, id = 5, id = 7 poïÈczone za pomocÈ operatora OR (czyli sumy logicznej). Instrukcja taka bÚdzie miaï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 okreĂlonego zbioru m W I C Z E N I E 5.23 Uĝycie 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ĝliwe jest 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 m W I C Z E N I E PostgreSQL 8.3 • mwiczenia 5.24 Uĝycie operatora róĝnoĂci i operatorów logicznych WyĂwietl dane osób o identyfikatorach róĝnych od 1, 3, 5, 7 i 9. Uĝyj operatoró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 instrukcja bÚdzie wiÚc miaïa postaÊ: SELECT * FROM osoba WHERE 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 dziaïania zapytania z Êwiczenia 5.24 m W I C Z E N I E 5.25 Uĝycie operatora NOT IN WyĂwietl dane osób o identyfikatorach róĝnych od 1, 3, 5, 7 i 9. Uĝyj operatora 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 wybrane pola pasujÈ do zdefiniowanego przez nas wzorca. Rozdziaï 5. • Podstawowe instrukcje SQL 127 m W I C Z E N I E 5.26 Dane pasujÈce do okreĂlonego wzorca WyĂwietl dane wszystkich osób, których imiona zaczynajÈ siÚ od ciÈ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. WyĂwietlenie danych pasujÈcych do zdefiniowanego wzorca OczywiĂcie warunek w klauzuli WHERE nie musi ograniczaÊ siÚ do danych pobieranych z jednej kolumny, moĝna stosowaÊ warunki zïoĝone poïÈ- czone operatorami logicznymi. m 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 imiona zaczynajÈ siÚ na literÚ A, urodzonych po roku 1970 w Kielcach lub w 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 PostgreSQL 8.3 • mwiczenia Rysunek 5.16. Wyniki zapytania z warunkami dotyczÈcymi wielu kolumn NiepowtarzalnoĂÊ wierszy Instrukcja 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 uzyskania prawidïowych wyników niezbÚdne bÚdzie wiÚc uĝycie sïowa DISTINCT. Rysunek 5.17. W wynikach zapytania pojawiïy siÚ duplikaty danych m W I C Z E N I E 5.28 Uĝycie 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. Rozdziaï 5. • Podstawowe instrukcje SQL 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 samym koñcu zapytania. Instrukcja SELECT przyjmie wtedy ogólnÈ postaÊ: SELECT kolumna1, kolumna2, ..., kolumnaN FROM 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Údnione w wynikach, natomiast ile2 — liczbÚ wierszy, które majÈ byÊ pominiÚte, zanim zacznÈ byÊ prezentowane wyniki zapytania. WystÈpienie zamiast ile1 sïowa ALL bÚdzie oznaczaïo, ĝe majÈ byÊ uwzglÚdniane wszystkie wiersze (zatem zapytanie zachowa siÚ tak, jakby klauzula LIMIT zostaïa pominiÚ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. m 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Ăwietlanych wierszy do 5. 130 PostgreSQL 8.3 • mwiczenia Ograniczenie do piÚciu liczby wierszy pobieranych z tabeli osoba zapewni 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 m W I C Z E N I E 5.30 Pobieranie wierszy, poczÈwszy 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ïy w 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 dziaïania instrukcji z Êwiczenia 5.30 Modyfikacja danych Dane zapisane w tabelach mogÈ byÊ zmieniane i modyfikowane. Sïuĝy do tego instrukcja UPDATE, która ma ogólnÈ postaÊ: Rozdziaï 5. • Podstawowe instrukcje SQL 131 UPDATE tabela SET 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ħè2 itd. Klauzula WHERE jest opcjonalna i moĝe zostaÊ pominiÚta; w takiej sytuacji zmianie ulegnÈ wszystkie wskazane wiersze w tabeli. m W I C Z E N I E 5.31 Zmiana wszystkich wartoĂci we wskazanej kolumnie Zmieñ zawartoĂÊ kolumny miejsce_urodzenia w tabeli osoba tak, aby wszystkie wiersze zawieraïy ciÈg Krosno. Wykonanie Êwiczenia zmodyfikuje zawartoĂÊ WSZYSTKICH wierszy w tabeli osoba. Nie pojawi siÚ przy tym ĝadne ostrzeĝenie czy teĝ pytanie o potwierdzenie chÚci wykonania instrukcji. Przywrócenie oryginalnej zawartoĂci tabeli bÚdzie wymagaïo ponownego wprowadzenia danych. ZmianÚ wszystkich wartoĂci w kolumnie miejsce_urodzenia zapewni instrukcja: UPDATE osoba SET miejsce_urodzenia= Krosno ; Kiedy jÈ wykonamy, zobaczymy komunikat, ĝe miaïa ona wpïyw na 10 wierszy tabeli (rysunek 5.21). JeĂli teraz wykonamy instrukcjÚ SELECT pobierajÈcÈ wszystkie dane z tabeli osoba, zobaczymy, ĝe faktycznie wszystkie wiersze kolumny miejsce_urodzenia zostaïy zmienione. Jest to widoczne na rysunku 5.22. Rysunek 5.21. Wykonanie instrukcji aktualizujÈcej dane w tabeli Zazwyczaj jednak aktualizuje siÚ tylko jeden lub kilka wierszy, nie- zbÚdne jest wiÚc zastosowanie klauzuli WHERE. Przykïadowo mogïoby siÚ okazaÊ, ĝe w tablicy zapisaliĂmy bïÚdny rok urodzenia Andrzeja Malinowskiego, któremu w tabeli zostaï przypisany identyfikator 5, i naleĝy zamieniÊ wartoĂÊ 1989 na 1988. 132 PostgreSQL 8.3 • mwiczenia Rysunek 5.22. Wszystkie wiersze w kolumnie miejsce_urodzenia zostaïy zmodyfikowane m 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 razu imiÚ, rok i miejsce urodzenia danej osoby. m 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 Radomiu stanie siÚ Kamilem Adrzejewskim urodzonym w 1990 roku w Kielcach. Rozdziaï 5. • Podstawowe instrukcje SQL 133 Warunek w klauzuli WHERE moĝe wykorzystywaÊ operatory opisane w podrozdziale „Kryteria pobierania danych”, moĝe wiÚc jednoczeĂnie wskazywaÊ 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 szybko naprawiÊ. m 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 danych Wiemy juĝ, jak dodawaÊ dane do tabeli, jak je pobieraÊ i modyfikowaÊ. Do omówienia zostaïa jeszcze równie waĝna kwestia usuwania wierszy z tabel. Do usuwania danych sïuĝy instrukcja DELETE o schematycznej postaci: 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Úcie warunku powodowaïo modyfikacjÚ wszystkich wierszy tabeli). m 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 PostgreSQL 8.3 • mwiczenia 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ĝszej konstrukcji i zatwierdzenie jej klawiszem Enter spowoduje natych- miastowe skasowanie danych! NajczÚĂciej wiÚc stosuje siÚ instrukcjÚ DELETE zawierajÈcÈ warunek w klauzuli WHERE, który ma takÈ samÈ postaÊ jak opisywana podczas omawiania instrukcji SELECT. Wykonajmy kilka Êwiczeñ obrazujÈcych to zagadnienie. m 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. m 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; Rozdziaï 5. • Podstawowe instrukcje SQL 135 m W I C Z E N I E 5.38 Usuwanie rekordów z okreĂlonego przedziaïu Usuñ dane osób o identyfikatorach z przedziaïu 3 – 5. W celu usuniÚcia danych osób o identyfikatorach z przedziaïu 3 – 5 uĝ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. m W I C Z E N I E 5.39 Usuwanie rekordów ze wzglÚdu na ciÈg znaków Usuñ z tabeli osoba dane osób o nazwisku Kowalski. Wykonanie Êwiczenia zapewni nam instrukcja: DELETE FROM osoba WHERE nazwisko= Kowalski ;
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

PostgreSQL 8.3. Ćwiczenia
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: