Bazy Danych I PostgreSQL. Od Podstaw

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 39

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Bazy danych i PostgreSQL.


Od podstaw
Autorzy: Richard Stones, Neil Matthew
Tumaczenie: Radosaw Meryk
ISBN: 83-7197-650-X
Tytu oryginau: Beginning Databases with PostgreSQL
Format: B5, stron: 610

PostgreSQL wci zyskuje na popularnoci i jest uwaany za najlepszy darmowy system


zarzdzania relacyjnymi bazami danych. Pocztkowo by tworzony w rodowisku
uniwersyteckim, potem jako otwarty projekt internetowy przez utalentowanych
programistw z caego wiata. Coraz czciej due firmy decyduj si na wybr
PostgreSQL jako systemu zarzdzania bazami danych.
Niniejsza ksika jest kompletnym podrcznikiem opisujcym cechy systemu
PostgreSQL. Zawiera opis najprostszych metod instalacji i zarzdzania systemem,
tworzenia wasnych baz danych, jak rwnie omwienie integracji baz danych
z aplikacjami napisanymi w najpopularniejszych jzykach programowania
wykorzystywanych w Internecie. Czytelnik znajdzie w niej wskazwki dotyczce
tworzenia coraz bardziej wyrafinowanych zapyta jzyka SQL, czenia tabel,
wykorzystywania transakcji, monitorowania pracy serwera, tworzenia wasnych
aplikacji w jzykach wysokiego poziomu i wiele innych.
Dla kogo jest ta ksika?
Ksika jest adresowana do Czytelnikw rozpoczynajcych swoj przygod
z relacyjnymi bazami danych (nie jest wymagana wiedza z zakresu jzykw SQL, PHP,
Java czy Perl). Opisano w niej zarwno najprostsze zapytania, jak i coraz bardziej
skomplikowane metody zarzdzania bazami danych, ktre umoliwi im rozwizywanie
codziennych problemw administratorw baz danych. Dziki lekturze mona nauczy si
zarzdzania baz danych PostgreSQL w rodowiskach Windows i Unix.
Co zawiera ksika?
Wprowadzenie do systemu PostreSQL
Opis instalacji z pakietw binarnych i kodw rdowych w rodowiskach
Windows i Unix
Opis narzdzi graficznych
Przykady zapyta obejmujcych zapytania zoone, funkcje agregujce i inne
Przedstawienie transakcji, poziomw izolacji, procedur skadowanych
i wyzwalaczy
Monitorowanie wydajnoci i kontrolowanie pracy serwera
czenie z baz danych i wykonywanie instrukcji SQL z poziomu jzyka C (libpq)
Tworzenie aplikacji przy uyciu jzykw PHP, Perl i Java

"
"
"
"
"
"
"
"

Podzikowania ......................................................................................................................................15
Wstp.....................................................................................................................................................17
Jak wymawia PostgreSQL..................................................................................... 17
Co jest treci tej ksiki?........................................................................................ 17
Stosowane konwencje.............................................................................................. 19
Pobranie kodu rdowego ........................................................................................ 20

Rozdzia 1. Wstp do PostgreSQL.........................................................................................................21


Programowanie z wykorzystaniem danych................................................................... 21
Kartotekowe bazy danych ......................................................................................... 23
Co to jest baza danych? ........................................................................................... 24
Rodzaje baz danych ................................................................................................. 25
Sieciowy model bazy danych................................................................................ 25
Hierarchiczny model baz danych........................................................................... 26
Relacyjny model bazy danych............................................................................... 27
Jzyki zapyta.......................................................................................................... 28
SQL................................................................................................................... 29
Systemy zarzdzania baz danych ............................................................................. 31
Co to jest PostgreSQL? ............................................................................................ 32
Krtka historia PostgreSQL ................................................................................. 33
Architektura PostgreSQL ..................................................................................... 34
Licencje Open Source ......................................................................................... 35
Zasoby .............................................................................................................. 36

Rozdzia 2. Podstawy relacyjnych baz danych ................................................................................. 37


Arkusze kalkulacyjne ................................................................................................ 37
Troch terminologii ............................................................................................. 38
Ograniczenia arkuszy kalkulacyjnych..................................................................... 39
Czym wyrnia si baza danych?.......................................................................... 40
Wybr kolumn ............................................................................................... 41
Wybr typu danych dla kadej z kolumn ........................................................... 41
Unikalne identyfikowanie wierszy .................................................................... 42
Porzdek wierszy ........................................................................................... 43
Wprowadzanie danych do bazy danych ....................................................................... 43
Dostp do danych przez sie ............................................................................... 44
Tworzenie podzbiorw informacji .......................................................................... 45
Dodatkowe informacje.............................................................................................. 48
Wiele tabel......................................................................................................... 48
Relacje pomidzy tabelami .................................................................................. 49

Bazy danych i PostgreSQL. Od podstaw


Projektowanie tabel.................................................................................................. 51
Podstawowe zasady rzemiosa............................................................................. 52
Zasada pierwsza podzia danych na kolumny ............................................... 52
Zasada druga okrelenie unikalnego sposobu identyfikacji kadego wiersza .. 52
Zasada trzecia usunicie powtarzajcych si informacji................................ 53
Zasada czwarta stosowanie waciwych nazw.............................................. 53
Przykad bazy danych klient-zamwienie................................................................ 54
Wyjcie poza granice dwch tabel ........................................................................ 54
Finalizowanie projektu wstpnego ........................................................................ 57
Podstawowe typy danych .......................................................................................... 59
Wartoci specjalna NULL..................................................................................... 60
Sprawdzanie wartoci NULL ........................................................................... 61
Przykadowa baza danych ......................................................................................... 62

Rozdzia 3. Instalacja........................................................................................................................... 63
Instalowa czy uaktualnia?...................................................................................... 64
Instalacja PostgreSQL z pakietw binarnych systemu Linux ......................................... 64
Anatomia instalacji PostgreSQL ...................................................................... 66
Instalacja PostgreSQL z kodu rdowego .................................................................. 69
Uruchamianie PostgreSQL.............................................................................. 72
Tworzenie bazy danych................................................................................... 76
Tworzenie tabel ............................................................................................. 78
Usuwanie tabel ............................................................................................. 79
Wypenianie tabel danymi............................................................................... 80
Zatrzymywanie PostgreSQL............................................................................. 82
Instalacja PostgreSQL w Windows ............................................................................. 83
Cygwin rodowisko UNIX w systemie Windows............................................. 83
Usugi IPC dla Windows ................................................................................. 87
PostgreSQL dla Cygwin .................................................................................. 88
Kompilacja PostgreSQL w Windows................................................................. 88
Konfiguracja PostgreSQL dla Windows ............................................................ 89
Automatyczne uruchamianie PostgreSQL ......................................................... 90

Rozdzia 4. Dostp do danych.............................................................................................................. 95


Wykorzystanie psql .................................................................................................. 96
Proste instrukcje SELECT ......................................................................................... 98
Podstawianie nazw kolumn................................................................................ 100
Porzdek wierszy .............................................................................................. 100
Ukrywanie duplikatw........................................................................................ 103
Wykonywanie oblicze ............................................................................................ 105
Wybr wierszy........................................................................................................ 107
Bardziej zoone warunki ................................................................................... 109
Porwnywanie wzorcw ..................................................................................... 111
Ograniczanie liczby wierszy w wyniku .................................................................. 112
Porwnania danych o rnych typach ....................................................................... 113
Sprawdzanie wartoci NULL............................................................................... 113
Sprawdzanie danych typu data i czas ................................................................. 114
Ustawianie formatu daty i czasu ................................................................... 115
Funkcje daty i czasu .................................................................................... 119

Spis tre+ci

Wiele tabel............................................................................................................ 121


Tworzenie zwizku pomidzy dwoma tabelami ..................................................... 121
Aliasy nazw tabel .............................................................................................. 126
Tworzenie zwizku trzech tabel................................................................................ 127

Rozdzia 5. Graficzne narzdzia PostgreSQL ...................................................................................133


psql ...................................................................................................................... 134
Uruchamianie psql............................................................................................ 134
Polecenia w psql .............................................................................................. 134
Historia polece ............................................................................................... 135
Skrypty w psql .................................................................................................. 136
Badanie bazy danych ........................................................................................ 137
Przegld opcji wiersza polecenia ........................................................................ 138
Przegld polece wewntrznych ......................................................................... 139
ODBC ................................................................................................................... 139
pgAdmin................................................................................................................ 144
Kpsql.................................................................................................................... 149
PgAccess .............................................................................................................. 150
Formularze i narzdzia do projektowania zapyta................................................. 152
Microsoft Access ................................................................................................... 153
Tabele czy ..................................................................................................... 154
Wprowadzanie danych....................................................................................... 158
Raporty............................................................................................................ 158
Microsoft Excel ...................................................................................................... 159
Zasoby.................................................................................................................. 163

Rozdzia 6. Interfejs danych ..............................................................................................................165


Wprowadzanie danych do bazy danych ..................................................................... 165
Proste operacje INSERT .................................................................................... 166
Bezpieczniejsza posta instrukcji INSERT ...................................................... 169
Wprowadzanie danych do kolumn typu SERIAL .................................................... 170
Dostp do numerw sekwencji ..................................................................... 171
Wprowadzanie wartoci NULL ............................................................................ 173
Polecenie \copy ............................................................................................... 175
Pobieranie danych bezporednio z innej aplikacji................................................. 178
Aktualizacja danych w bazie danych......................................................................... 182
Ostrzeenie................................................................................................. 183
Usuwanie wierszy z bazy danych.............................................................................. 185

Rozdzia 7. Zaawansowane wyszukiwanie danych .........................................................................189


Funkcje agregacji ................................................................................................... 190
COUNT ............................................................................................................ 190
GROUP BY a COUNT(*) ................................................................................ 192
HAVING a COUNT(*) .................................................................................... 194
COUNT(nazwa_kolumny)............................................................................... 196
Funkcja MIN() ................................................................................................... 197
Funkcja MAX() .................................................................................................. 198
Funkcja SUM().................................................................................................. 199
Funkcja AVG()................................................................................................... 199
Powizania typu UNION .......................................................................................... 200

Bazy danych i PostgreSQL. Od podstaw


Zapytania podrzdne .............................................................................................. 202
Rodzaje zapyta podrzdnych ............................................................................ 205
Zapytania podrzdne skorelowane ..................................................................... 206
Powizania same z sob ........................................................................................ 210
Powizania zewntrzne........................................................................................... 211

Rozdzia 8. Definicje danych i operacje manipulowania danymi .....................................................217


Typy danych........................................................................................................... 218
Typ Boolean ..................................................................................................... 218
Typy znakowe ................................................................................................... 220
Typy numeryczne .............................................................................................. 222
Typy daty i czasu .............................................................................................. 225
Specjalne typy PostgreSQL ..................................................................................... 225
Tworzenie wasnych typw ................................................................................. 226
Typy tablicowe............................................................................................. 226
Konwersja pomidzy typami............................................................................... 227
Inne operacje manipulowania danymi ................................................................. 229
Magiczne zmienne ............................................................................................ 230
Kolumna OID.................................................................................................... 230
Manipulowanie tabelami......................................................................................... 231
Tworzenie tabel ................................................................................................ 232
Ograniczenia dla kolumny............................................................................. 232
Ograniczenia dla tabel ................................................................................. 236
Uaktualnianie struktury tabeli ............................................................................ 237
Usuwanie tabel ................................................................................................ 240
Tabele tymczasowe........................................................................................... 240
Perspektywy .......................................................................................................... 240
Ograniczenia kluczy obcych..................................................................................... 244
Klucze obce jako ograniczenia dla kolumn .......................................................... 246
Klucze obce jako ograniczenia dla tabel.............................................................. 247
Opcje ogranicze dla kluczy obcych .................................................................... 250
DEFERRABLE .............................................................................................. 251
ON UPDATE oraz ON DELETE ........................................................................ 251

Rozdzia 9. Transakcje i blokady......................................................................................................253


Co to s transakcje? .............................................................................................. 254
Reguy ACID ..................................................................................................... 257
Transakcje dla pojedynczych uytkownikw .............................................................. 258
Ograniczenia transakcji ..................................................................................... 260
Transakcje z wieloma uytkownikami ....................................................................... 261
Poziomy izolacji ANSI ........................................................................................ 261
Niepodane zjawiska.................................................................................. 262
Poziomy izolacji ANSI/ISO ................................................................................. 266
Tryb chained (autozatwierdzanie) oraz tryb unchained .......................................... 267
Blokady................................................................................................................. 268
Zakleszczenia................................................................................................... 269
Jawne blokady.................................................................................................. 271
Blokowanie wierszy...................................................................................... 271
Blokady tabel .............................................................................................. 272

Spis tre+ci

Rozdzia 10. Procedury przechowywane w bazie danych oraz procedury wyzwalane.............275


Operatory .............................................................................................................. 276
Priorytet operatorw oraz kierunek nadawania wartoci........................................ 277
Operatory arytmetyczne..................................................................................... 278
Operatory porwna i operatory znakowe ............................................................ 279
Inne operatory .................................................................................................. 281
Funkcje ................................................................................................................. 282
Jzyki proceduralne................................................................................................ 284
Czynnoci wstpne dla jzyka PL/pgSQL.................................................................. 285
Przecianie funkcji .......................................................................................... 287
Wywietlanie listingu funkcji .............................................................................. 288
Usuwanie funkcji .............................................................................................. 289
Uycie apostrofw............................................................................................. 289
Anatomia procedur zapisywanych w bazie danych ..................................................... 289
Argumenty funkcji ............................................................................................. 290
Komentarze ..................................................................................................... 290
Deklaracje ....................................................................................................... 291
ALIAS ......................................................................................................... 292
RENAME ..................................................................................................... 293
Prosta deklaracja zmiennej .......................................................................... 293
Zoona deklaracja zmiennej......................................................................... 294
ROWTYPE ................................................................................................... 294
RECORD ..................................................................................................... 294
Instrukcje przypisania ....................................................................................... 295
Instrukcja SELECT INTO ............................................................................... 295
PERFORM ................................................................................................... 296
Instrukcje sterujce .......................................................................................... 296
Zwracanie wartoci przez funkcje ....................................................................... 296
Wyjtki i komunikaty .................................................................................... 297
Instrukcje warunkowe .................................................................................. 298
Ptle .......................................................................................................... 299
Zapytania dynamiczne....................................................................................... 304
Funkcje SQL .......................................................................................................... 305
Procedury wyzwalane.............................................................................................. 306
Tworzenie wyzwalaczy ....................................................................................... 307
Procedury wyzwalane ................................................................................... 308
Dlaczego procedury przechowywane w bazie danych i procedury wyzwalane? .............. 313

Rozdzia 11. Administracja baz5 danych PostgreSQL.......................................................................315


Instalacja domylna ............................................................................................... 316
bin .................................................................................................................. 316
include i lib ...................................................................................................... 316
doc.................................................................................................................. 317
man ................................................................................................................ 318
share............................................................................................................... 318
data ................................................................................................................ 318
Pocztkowa baza danych................................................................................... 319
Sterowanie serwerem............................................................................................. 320
Uruchamianie i zatrzymywanie serwera ............................................................... 320

Bazy danych i PostgreSQL. Od podstaw


Uytkownicy........................................................................................................... 322
CREATE USER ............................................................................................. 323
DROP USER ................................................................................................ 324
ALTER USER ............................................................................................... 325
Grupy ......................................................................................................... 325
UPRAWNIENIA ............................................................................................. 326
Perspektywy ..................................................................................................... 328
Zarzdzanie danymi ............................................................................................... 329
Tworzenie i usuwanie baz danych....................................................................... 329
Tworzenie kopii zapasowych i odtwarzanie danych ............................................... 330
Uaktualnienia bazy danych ................................................................................ 335
Bezpieczestwo bazy danych .................................................................................. 335
Opcje konfiguracji .................................................................................................. 338
Konfiguracja serwera na etapie kompilacji .......................................................... 338
Konfiguracja dziaania serwera........................................................................... 339
Wydajno............................................................................................................. 341
VACUUM .......................................................................................................... 341
Indeksy............................................................................................................ 344

Rozdzia 12. Projekt bazy danych .....................................................................................................347


Zrozumienie problemu............................................................................................ 348
Na czym polega dobry projekt bazy danych? ............................................................. 349
Zdolno przechowywania potrzebnych danych............................................... 349
Zdolno obsugi wymaganych zwizkw........................................................ 349
Zdolno rozwizywania problemu................................................................. 349
Zdolno do narzucania integralnoci danych ................................................ 350
Zdolno narzucania wydajnoci w przetwarzaniu danych ................................ 350
Zdolno uwzgldniania przyszych zmian ...................................................... 351
Etapy projektowania bazy danych ............................................................................ 351
Zbieranie informacji .......................................................................................... 351
Projekt logiczny ................................................................................................ 352
Okrelenie obiektw .................................................................................... 352
Przeksztacenie obiektw w tabele ................................................................ 354
Okrelenie relacji oraz krotnoci ........................................................................ 358
Naszkicowanie diagramu zwizkw encji........................................................ 358
Przykadowa baza danych ............................................................................. 359
Przeksztacenie w model fizyczny............................................................................. 363
Ustalenie kluczy gwnych ............................................................................ 363
Zdefiniowanie kluczy zewntrznych................................................................ 365
Zdefiniowanie typw danych .............................................................................. 367
Pene definicje tabel ......................................................................................... 370
Implementacja regu biznesu ............................................................................. 370
Sprawdzenie projektu........................................................................................ 370
Postacie normalne ................................................................................................. 371
Pierwsza posta normalna................................................................................. 371
Druga posta normalna..................................................................................... 372
Trzecia posta normalna ................................................................................... 373
Znane wzorce ........................................................................................................ 373
Wiele-do-wielu .................................................................................................. 374
Hierarchia ........................................................................................................ 374
Relacje rekurencyjne......................................................................................... 375
Zasoby.................................................................................................................. 377

Spis tre+ci

Rozdzia 13. Dostp do PostgreSQL z jzyka C z wykorzystaniem biblioteki libpq.......................379


Korzystanie z biblioteki libpq................................................................................... 380
Poczenia z baz danych ....................................................................................... 381
Plik Makefile .................................................................................................... 384
Dodatkowe informacje ...................................................................................... 384
Uruchamianie SQL za pomoc libpq ........................................................................ 385
Transakcje ............................................................................................................ 390
Uzyskiwanie danych z zapyta............................................................................ 390
Wywietlanie wynikw zapyta ................................................................................ 394
Kursory ................................................................................................................. 397
Wartoci binarne.................................................................................................... 403
Mechanizm pracy asynchronicznej ........................................................................... 403

Rozdzia 14. Dostp do PostgreSQL z jzyka C z wykorzystaniem wbudowanego SQL ...............409


Pierwszy program z wbudowanym SQL ..................................................................... 410
Argumenty programu ecpg ................................................................................. 414
Rejestrowanie wykonywania instrukcji SQL.......................................................... 415
Poczenia z baz danych .................................................................................. 416
Obsuga bdw................................................................................................ 418
Obsuga bdw................................................................................................ 421
Zmienne hosta ................................................................................................. 422
Pobieranie danych za pomoc ecpg.................................................................... 425
Transakcje ....................................................................................................... 429
Obsuga danych................................................................................................ 429
Kursory............................................................................................................ 432
Diagnozowanie kodu ecpg ................................................................................. 435

Rozdzia 15. Dostp do PostgreSQL z jzyka PHP ............................................................................437


Dodanie obsugi PostgreSQL w PHP......................................................................... 438
Korzystanie z interfejsu API jzyka PHP dla PostgreSQL............................................. 439
Poczenia z baz danych .................................................................................. 439
Poczenia trwae ........................................................................................ 440
Zamykanie pocze .................................................................................... 441
Informacje o poczeniu ............................................................................... 441
Tworzenie zapyta ............................................................................................ 442
Zoone zapytania........................................................................................ 443
Wykonywanie zapyta .................................................................................. 444
Przetwarzanie zestaww wynikw ....................................................................... 445
Pobieranie wartoci z zestaww wynikw ....................................................... 447
Informacje dotyczce pl.............................................................................. 450
Zwalnianie pamici przydzielonej na zestawy wynikw..................................... 451
Konwersja typw wartoci wynikw ............................................................... 452
Obsuga bdw................................................................................................ 452
Kodowanie znakw ........................................................................................... 453
PEAR ............................................................................................................... 454
Interfejs abstrakcji bazy danych PEAR ........................................................... 454
Obsuga bdw PEAR.................................................................................. 456
Przygotowanie i wykonanie zapytania............................................................. 457

10

Bazy danych i PostgreSQL. Od podstaw


Rozdzia 16. Dostp do PostgreSQL z jzyka Perl ...........................................................................459
Pgsql_perl5 lub modu Pg ....................................................................................... 460
Instalacja pgsql_perl5....................................................................................... 460
CPAN.......................................................................................................... 461
Korzystanie z interfejsu pgsql_perl5 ........................................................................ 462
DBI jzyka Perl....................................................................................................... 468
Instalacja DBI i PostgreSQL DBD ....................................................................... 468
Wykorzystywanie DBI......................................................................................... 469
Co jeszcze moemy zrobi przy uyciu DBI?......................................................... 475
Wykorzystanie DBIx::Easy .................................................................................. 477
DBI i XML......................................................................................................... 479

Rozdzia 17. Dostp do PostgreSQL z jzyka Java ..........................................................................483


Opis oglny JDBC................................................................................................... 484
Sterowniki JDBC .................................................................................................... 484
Typ 1 ............................................................................................................... 485
Typ 2 ............................................................................................................... 485
Typ 3 ............................................................................................................... 485
Typ 4 ............................................................................................................... 486
Konfigurowanie sterownika JDBC PostgreSQL........................................................... 486
DriverManager i Driver............................................................................................ 487
Java.sql.DriverManager ..................................................................................... 487
Zarzdzanie sterownikami ............................................................................ 487
Zarzdzanie poczeniami ............................................................................ 488
Zarzdzanie rejestracj zdarze dotyczcych JDBC ......................................... 489
Zarzdzanie limitami czasu logowania si...................................................... 489
java.sql.Driver .................................................................................................. 489
Poczenia............................................................................................................. 492
Tworzenie instrukcji .......................................................................................... 492
Obsuga transakcji ............................................................................................ 493
Metadane bazy danych...................................................................................... 494
Pobieranie metadanych PostgreSQL.............................................................. 494
Zestawy wynikw JDBC........................................................................................... 496
Tryb wielodostpu i typ zestawu wynikw ............................................................ 496
Typ............................................................................................................. 496
Tryb wielodostpu ....................................................................................... 497
Przegldanie zestaww wynikw ........................................................................ 497
Przewijanie zestaww wynikw...................................................................... 497
Sprawdzanie pooenia kursora .................................................................... 498
Kierunek pobierania i rozmiar ....................................................................... 499
Korzystanie z danych zestawu wynikw............................................................... 500
Odwzorowanie typw danych PostgreSQL............................................................ 500
Zestawy wynikw, ktre mona aktualizowa....................................................... 500
Usuwanie danych ........................................................................................ 501
Aktualizacja danych ..................................................................................... 501
Wstawianie danych...................................................................................... 502
Inne metody ..................................................................................................... 503

Spis tre+ci

11

Instrukcje JDBC ..................................................................................................... 503


Instrukcje......................................................................................................... 504
Sprawdzanie wynikw i zestaww wynikw..................................................... 505
Obsuga wsadowego przetwarzania instrukcji SQL .......................................... 506
Metody rne .............................................................................................. 506
Przykad klienta JDBC .................................................................................. 506
Instrukcje przygotowane .................................................................................... 508
Wykonywanie instrukcji SQL ......................................................................... 509
Aktualizacja danych ..................................................................................... 510
Przykadowe wykorzystanie przygotowanych instrukcji ..................................... 510
Wyjtki i ostrzeenia SQL........................................................................................ 512
Aplikacja JDBC z Graficznym Interfejsem Uytkownika (GUI) ....................................... 512
Diagram klasy .................................................................................................. 513
Customer ................................................................................................... 513
CustomerTableModel................................................................................... 513
CustomerApp .............................................................................................. 514
CustomerPanel ........................................................................................... 514
Komunikacja z systemem.................................................................................. 514
Szczegowe informacje dotyczce klientw................................................... 515
Dodawanie nowego klienta........................................................................... 516
Usuwanie klienta......................................................................................... 517
Pliki rdowe ................................................................................................... 517
Klasa Customer .......................................................................................... 517
Klasa CustomerTableModel ......................................................................... 519
Klasa CustomerPanel .................................................................................. 521
Klasa CustomerApp..................................................................................... 523
Kompilacja i uruchomienie aplikacji.................................................................... 528

Rozdzia 18. Dalsze informacje i zasoby ..........................................................................................529


Nie-relacyjne modele baz danych............................................................................. 529
OLTP, OLAP i pozostaa terminologia bazy danych..................................................... 530
Zasoby.................................................................................................................. 532
Zasoby Sieciowe............................................................................................... 533
PostgreSQL................................................................................................. 533
PHP............................................................................................................ 533
Perl ............................................................................................................ 533
Java i JDBC................................................................................................. 533
Oglne narzdzia .............................................................................................. 533
Ksiki ............................................................................................................ 534
SQL............................................................................................................ 534
PHP............................................................................................................ 534
Perl ............................................................................................................ 535
Java ........................................................................................................... 535

Dodatek A Ograniczenia bazy danych PostgreSQL .........................................................................537


Wielko bazy danych: bez ograniczenia ............................................................. 538
Wielko tabeli: 16 TB 64 TB.......................................................................... 538
Liczba wierszy w tabeli: bez ograniczenia ............................................................ 538
Indeksy: bez ograniczenia.................................................................................. 539
Wielko kolumny: 1 GB.................................................................................... 539
Kolumny w tabeli: 250+ .................................................................................... 539
Wielko wiersza: bez ograniczenia .................................................................... 539

12

Bazy danych i PostgreSQL. Od podstaw


Dodatek B Typy danych PostgreSQL..................................................................................................541
Typy logiczne ......................................................................................................... 541
Dokadne typy numeryczne ..................................................................................... 542
Przyblione typy numeryczne ................................................................................... 542
Typy daty i czasu.................................................................................................... 543
Typy znakowe ........................................................................................................ 544
Typy geometryczne................................................................................................. 544
Typy rne ............................................................................................................. 545

Dodatek C Skadnia SQL w PostgreSQL ............................................................................................547


Polecenia SQL w PostgreSQL .................................................................................. 547
Skadnia dostpnych w PostgreSQL instrukcji SQL.................................................... 547

Dodatek D Opis opcji i polece; psql....................................................................................................561


Opcje wiersza polecenia psql ....................................................................... 561
Wewntrzne polecenia psql .......................................................................... 563

Dodatek E Schemat baz danych i tabel .............................................................................................565


Dodatek F Obsuga du>ych obiektw w PostgreSQL .......................................................................569
Dodawanie grafiki do bazy danych ........................................................................... 569
Obiekty BLOB ................................................................................................... 571
Import i eksport .......................................................................................... 571
Zdalny import i eksport ................................................................................ 574
Programowanie obiektw BLOB.......................................................................... 575

Dodatek G Uwagi do wydania 7.2 PostgreSQL.................................................................................577


Przegld................................................................................................................ 577
VACUUM .......................................................................................................... 577
Transakcje ....................................................................................................... 577
Numery OID ..................................................................................................... 577
Optymalizator ................................................................................................... 578
Bezpieczestwo................................................................................................ 578
Statystyki......................................................................................................... 578
Ustawienia midzynarodowe.............................................................................. 578
Migracja do wersji 7.2 ............................................................................................ 578
Zmiany.................................................................................................................. 579
Dziaanie serwera ............................................................................................. 579
Wydajno ....................................................................................................... 580
Uprawnienia ..................................................................................................... 580
Uwierzytalnianie klientw................................................................................... 581
Konfiguracja serwera ........................................................................................ 581
Zapytania......................................................................................................... 581
Operacje dotyczce schematu ........................................................................... 582
Instrukcje pomocnicze ...................................................................................... 583
Typy danych i funkcje ........................................................................................ 583
Ustawienia midzynarodowe.............................................................................. 585
PL/pgSQL ........................................................................................................ 585
PL/Perl ............................................................................................................ 586
PL/Tcl ............................................................................................................. 586

Spis tre+ci

13

PL/Python........................................................................................................ 586
Psql................................................................................................................. 586
Libpq ............................................................................................................... 586
JDBC ............................................................................................................... 587
ODBC .............................................................................................................. 588
ECPG............................................................................................................... 588
Rne interfejsy................................................................................................ 589
Kompilacja i instalacja ...................................................................................... 589
Kod rdowy.................................................................................................... 590
Contrib ............................................................................................................ 590

Skorowidz ..........................................................................................................................................593

W rozdziale 4. omwilimy szczegowo instrukcj  oraz sposb jej uycia do


wyszukiwania danych. Omawiane tam zagadnienia obejmoway wybieranie kolumn
i wierszy oraz czenie tabel. W poprzednim rozdziale zaprezentowalimy sposoby dodawania, aktualizacji i usuwania danych. W obecnym powrcimy do instrukcji 
i omwimy jej bardziej zaawansowane cechy. Z niektrych spord tych moliwoci
bdziemy korzysta bardzo rzadko, ale warto je zna, aby zdawa sobie spraw z moliwoci jzyka SQL.
Czytelnicy, ktrzy czytajc t ksik wyprbowuj przykady, zauwa, e zarwno
w tym rozdziale, jak i w innych, zawsze rozpoczynamy od czystych danych wyjciowych w przykadowej bazie danych. Dziki temu czytelnicy mog zgbia te rozdziay,
na ktre maj ochot. Oznacza to, e w przypadku, gdy bdziemy korzysta z przykadowych danych z poprzednich rozdziaw, niektre wyniki mog by nieco rne od
pokazanych. Skrypty, ktre mona pobra ze strony WWW ksiki pozwalaj na atwe
usunicie tabel, ponowne ich utworzenie oraz ponowne wypenienie ich danymi.
W tym rozdziale omwimy najpierw pewne specjalne funkcje, nazywane funkcjami
agregacji. Pozwalaj one na uzyskiwanie wynikw na podstawie grupy wierszy. Nastpnie omwimy nieco bardziej zaawansowane operacje powiza, pozwalajce na
kontrolowanie wynikw. W tych przypadkach powizania midzy tabelami nie bd tak
proste jak te, ktrych uywalimy poprzednio. Poznamy take ca now grup zapyta
nazywanych zapytaniami podrzdnymi (ang. subquery), w ktrych w pojedynczym zapytaniu uywamy kilku instrukcji . Wreszcie poznamy bardzo wan operacj

 , ktra pozwala na czenie tabel w sposb bardziej elastyczny ni ten, z ktrym spotkalimy si do tej pory.
W rozdziale omwimy nastpujce funkcje:
n

funkcje agregacji;

powizania typu UNION;

190

Bazy danych i PostgreSQL. Od podstaw


n

zapytania podrzdne;

powizania same z sob;

powizania zewntrzne.

W poprzednich rozdziaach korzystalimy z kilku specjalnych funkcji:  


 w celu uzyskania najwikszej wartoci w kolumnie i   aby uzyska
liczb wierszy w tabeli. Funkcje te nale do niewielkiej grupy funkcji SQL, nazywanej
funkcjami agregacji.
Do grupy tej nale:
n  ,
n  ,
n ,
n ,
n  ,
n  !

Zazwyczaj s to funkcje bardzo przydatne i atwe do stosowania.


Polecenie " wy wietla list wszystkich funkcji agregacji w PostgreSQL.

Polecenie "#$ %& wywietla list wszystkich funkcji agregacji w PostgreSQL.

COUNT
Rozpoczniemy od funkcji  , ktra jak wida z przedstawionej powyej listy
ma dwie postacie. Funkcja   oblicza liczb wierszy w tabeli. Peni ona rol specjalnej nazwy kolumny w instrukcji . W tych instrukcjach , ktre wykorzystuj dowolne z funkcji agregacji, mona stosowa dwie opcjonalne klauzule: ' ()
oraz * . Skadnia jest wwczas nastpujca:

    !"#  $!
%& '()*%#+,-&$.$!./011

Nowa, opcjonalna klauzula ' () jest dodatkowym warunkiem, z ktrego mona korzysta w instrukcjach . Zazwyczaj korzysta si z niej w przypadku stosowania
funkcji agregacji. Mona j take wykorzysta jako funkcj podobn do + (), ale
dziaajc z kolumn, na podstawie ktrej zostaa wyliczona warto funkcji agregacji.
Opcjonalna klauzula * pozwala na wybr okrelonych wierszy dla pewnych warunkw funkcji  , jeeli wykorzystalimy ju klauzul ' ().

Rozdzia 7. n Zaawansowane wyszukiwanie danych

191

Brzmi to bardzo tajemniczo, ale w praktyce jest dosy proste. Sprbujmy skorzysta
z bardzo prostej instrukcji  , aby mie obraz jej dziaania. Wkrtce poznamy
take dziaanie klauzuli ' ().

Wyprbuj to proste zastosowanie funkcji COUNT(*)


Przypumy, e chcemy wiedzie, ilu klientw z tabeli ,#-./ mieszka w miecie
Bingham. Moglibymy oczywicie zapisa proste zapytanie SQL w postaci:

 /!$"#  23(.435

lub, w bardziej wydajny sposb, zapisa instrukcj SQL, ktra daje w wyniku mniejsz
ilo danych:

/!$ /!$"#  23(.435

Uzyskamy wprawdzie oczekiwany efekt, ale do okrn drog. Operacje te wymagaj


wyszukiwania duej iloci danych, ktre w zasadzie nie s nam potrzebne. Przypumy,
e w tabeli ,#-./ znajduj si dane wielu tysicy klientw, z ktrych ponad tysic
mieszka w Bingham. W takim przypadku wybralibymy mnstwo danych, ktre nie s
nam potrzebne. Funkcja   rozwizuje ten problem, pozwalajc na wybranie zaledwie jednego wiersza, ktry zawiera liczb wierszy speniajcych warunek. Zapiszemy nasz instrukcj  w zwyky sposb, ale zamiast wpisywa rzeczywiste kolumny, wykorzystamy funkcj  :
66!27 
  !"#
/
88888888
9
:$
66!27

Gdybymy chcieli policzy wszystkich klientw, moglibymy po prostu pomin klauzul 0*:
66!27 
 #
/
88888888
:;
66!27

Zauwamy, e otrzymalimy pojedynczy wiersz zawierajcy liczb wierszy. Aby


sprawdzi wynik, mona po prostu zamieni   na ,#-./1&, co spowoduje
wywietlenie rzeczywistych danych.

Jak to dziaa?
Funkcja   umoliwia uzyskanie liczby obiektw, a nie obiektw samych w sobie. W wikszoci wypadkw jest to znacznie bardziej wydajne ni wybieranie danych,
z dwch powodw:

192

Bazy danych i PostgreSQL. Od podstaw


n

nie trzeba pobiera z bazy danych informacji, ktre nie s nam potrzebne;

funkcja   umoliwia bazie danych korzystanie z jej wewntrznych


informacji bez koniecznoci przeszukiwania danych.

Nigdy nie naley wybiera danych, jeeli potrzebujemy tylko liczby wierszy.

GROUP BY a COUNT(*)
Odpowied na zapytanie pokazane w poprzednim podrozdziale nie zawsze speni nasze
oczekiwania. Przypumy, e chcielibymy wiedzie, ilu klientw mieszka w kadym
miecie. Moglibymy dowiedzie si tego wybierajc list rnych miast, a nastpnie
wyliczajc, ilu klientw mieszka w kadym z nich. Jest to jednak proceduralny i raczej
mudny sposb rozwizania problemu. Czy nie byoby lepiej zastosowa sposb deklaracyjny, formuujc zapytanie bezporednio w SQL? Moglibymy pokusi si o wyprbowanie nastpujcej instrukcji:

  < /!$5

Jest to rozsdna prba, zwaywszy na to, co wiemy do tej pory, ale PostgreSQL wywietli komunikat o bdzie, poniewa nie jest to poprawna skadnia SQL. Aby rozwiza ten problem, potrzebujemy dodatkowej klauzuli ' ().
Klauzula ' () informuje PostgreSQL, e funkcja agregacji powinna obliczy wynik
i wyzerowa si za kadym razem, kiedy okrelona kolumna lub kolumny zmieni warto. Jest ona bardzo prosta w uyciu. Wystarczy doda zapis ' () 
do instrukcji  z funkcj   , a PostgreSQL poinformuje nas, ile wierszy
o okrelonej wartoci kolumny znajduje si w tabeli.

Wyprbuj to GROUP BY
Sprbujmy odpowiedzie na pytanie, ilu klientw mieszka w kadym miecie?
Etap pierwszy polega na napisaniu instrukcji , ktra zawiera funkcj  
oraz nazw kolumny, dokadnie tak, jak prbowalimy odgadn:

  < /!$5

Nastpnie naley doda klauzul ' (), aby poinformowa PostgreSQL, e powinien
obliczy wynik i wyzerowa licznik za kadym razem, kiedy zmieni si miasto. Mona
to zrobi za pomoc nastpujcego zapytania:

  < /!$& '()5

A oto nasza instrukcja w dziaaniu:


66!27 
$ %&'#
/=
8888888>88888888888
9=(.4

Rozdzia 7. n Zaawansowane wyszukiwanie danych

193

:=#.4
:=#
:=

:=
?=/!
:= 4!4
:= @ $.!
:=  A!
:="!
:="!$ *
:=)!A!
:?$
66!27

Jak widzimy, uzyskalimy przejrzyst list miast wraz z liczb klientw w kadym
z nich.

Jak to dziaa?
PostgreSQL porzdkuje wynik wedug kolumn wymienionych w klauzuli ' (), nastpnie oblicza liczb wierszy i za kadym razem, kiedy zmienia si miasto, zapisuje
wiersz wyniku, po czym zeruje licznik. Zgodzimy si, e jest to o wiele atwiejsze ni
pisanie kodu procedury z ptl dla kadego miasta.
Jeeli zachodzi taka potrzeba, sposb ten mona zastosowa do wicej ni jednej kolumny, pod warunkiem, e wszystkie kolumny, ktre wybrano, s take wymienione
w klauzuli ' (). Przypumy, e interesoway nas dwie informacje. Po pierwsze, ilu
klientw mieszka w kadym miecie, po drugie, ile rnych nazwisk maj ci klienci.
Moemy po prostu doda kolumn . zarwno do czci , jak ' ():
66!27 
$("$ %&'$("#
/=!=
8888888>888888888>88888888888
:=B!=(.4
?=!=(.4
:=!=#.4
:=#/=#
:=!=

:=#=
?=4!=/!
:= != 4!4
:=#!*= @ $.!
:=#$=  A!
:= 3!="!
:=!="!$ *
:=4!=)!A!
:9$
66!27

Zwrmy uwag, e wynik jest posortowany najpierw wedug miasta, a nastpnie wedug nazwiska, poniewa w tej kolejnoci (-2 .) wymieniono kolumny w klauzuli ' () oraz na to, e obecnie Bingham znajduje si na licie dwa razy, poniewa
mieszkaj w nim klienci o dwch rnych nazwiskach,
.# oraz -.#.

194

Bazy danych i PostgreSQL. Od podstaw

HAVING a COUNT(*)
Ostatni opcjonaln czci instrukcji jest klauzula * . Czsto jest ona mylca dla
pocztkujcych programistw piszcych w jzyku SQL, ale w rzeczywistoci nie jest
trudna w uyciu. Naley po prostu pamita, e * jest rodzajem klauzuli 0* dla
funkcji agregacji. Klauzul * wykorzystujemy w celu ograniczenia liczby zwracanych wierszy, gdzie
Uycie funkcji agregacji w klauzuli "#  nie jest poprawne. S% one poprawne tylko
wewn%trz klauzuli #+,-&.

okrelona funkcja agregacji, na przykad  , ma warto . Uywamy jej
w dokadnie taki sam sposb, jak klauzuli 0*, w celu ograniczenia liczby wierszy na
podstawie wartoci kolumny.
Spjrzmy na przykad, ktry powinien sprawi, e zagadnienie to stanie si atwe
i przyjemne. Przypumy, e chcemy zna wszystkie miasta, w ktrych mamy wicej
ni jednego klienta. Moglibymy wwczas uy funkcji  , a nastpnie odszuka
na licie interesujce nas miasta. Nie jest to jednak rozwizanie sensowne w sytuacji,
gdy mamy tysice miast. Zamiast tego skorzystamy z klauzuli * w celu ograniczenia wyniku do tych wierszy, gdzie warto funkcji   jest wiksza ni jeden. Zrobimy to w nastpujcy sposb:
66!27 
$ 
66!87%&')*+ % 
,-#
/=
8888888>8888888888
9=(.4
?=/!
?$
66!27

Zauwamy, e w dalszym cigu musimy zapisa klauzul ' () i musi ona wystpowa przed klauzul * . Teraz, kiedy znamy podstawy funkcji  , klauzuli
' () oraz * , sprbujmy wykorzysta je wszystkie w wikszym przykadzie.

Wyprbuj to HAVING
Przypumy, e mylimy o opracowaniu harmonogramu dostaw i chcemy zna nazwiska wszystkich klientw i miasta, skd pochodz, oprcz klientw z Lincoln (by moe
jest to nasze miasto). Interesuj nas tylko te miasta, w ktrych mamy wicej ni jednego
klienta.
Nie jest to takie trudne, jak mogoby si wydawa; musimy po prostu stopniowo stworzy nasze rozwizanie. Jest to zazwyczaj dobre podejcie dla instrukcji SQL. Jeeli co
wyglda na zbyt trudne, naley rozpocz od rozwizania czego prostszego, ale podobnego, a nastpnie rozszerzy rozwizanie do momentu, a uda si rozwiza problem
bardziej skomplikowany. Tak wic naley rozpozna problem, podzieli go na mniejsze
czci, a nastpnie rozwiza kad z nich.

Rozdzia 7. n Zaawansowane wyszukiwanie danych

195

Zacznijmy od wybrania danych, a nie ich liczenia. Dane uporzdkujemy wedug miasta,
aby mona byo atwiej zorientowa si, o co chodzi:
66!27("$ .,(#
!=
888888888>88888888888
!=#.4
!=

4!=/!
4!=)!A!
 != 4!4
4!=/!
!=(.4
!=(.4
#/=#
#$=  A!
B!=(.4
!="!$ *
#!*= @ $.!
 3!="!
#=
:;$
66!27

Do tej pory wyglda niele, nieprawda?


Teraz, aby skorzysta z funkcji   w celu wykonania oblicze, musimy take
umieci klauzul ' () i pogrupowa kolumny wedug nazwiska i miasta (.2
-):
66!27 
$(" .,
66!87(%&'("$#
/=!=
8888888>888888888>88888888888
:= != 4!4
:=#!*= @ $.!
:=#/=#
:=#$=  A!
:=#=
:=B!=(.4
?=4!=/!
:=4!=)!A!
:=!="!$ *
:= 3!="!
?=!=(.4
:=!=#.4
:=!=

:9$
66!27

Moemy teraz odnale odpowied samodzielnie przegldajc dane, ale jestemy zaledwie o krok od waciwego wyniku. Wystarczy doda klauzul * , a zostan wybrane wiersze, gdzie warto funkcji   jest wiksza ni 1:

196

Bazy danych i PostgreSQL. Od podstaw


66!27 
$(" .,
66!87(%&'("$)*+ % 
,-#
/=!=
8888888>888888888>8888888888
?=4!=/!
?=!=(.4
?$
66!27

Dosy proste, jeeli podzielimy problem na mniejsze czci.

Jak to dziaa?
Rozwizalimy nasz problem w trzech etapach:
n

w celu wyszukania wszystkich interesujcych nas wierszy zapisalimy prost


instrukcj ;

nastpnie dodalimy sowa kluczowe   oraz ' () w celu obliczenia
liczby unikalnych kombinacji nazwiska i miasta (. oraz -);

wreszcie dodalimy klauzul * , aby wyszuka tylko te wiersze, w ktrych


warto   bya wiksza ni 1.

Przy takim podejciu istnieje jednak pewien problem. Gdybymy mieli do czynienia
z baz danych klientw, ktra zawieraaby tysice wierszy, lista klientw przewijaaby
si nam bardzo dugo w czasie opracowywania naszego zapytania. Dla naszej prostej
bazy danych nie stanowio to problemu, ale dla duej bazy danych takie interaktywne
podejcie w opracowywaniu zapytania ma pewne wady. Na szczcie zazwyczaj atwo
opracowa zapytania na prbce danych, z wykorzystaniem klucza podstawowego. Gdybymy do wszystkich zapyta dodali warunek 0* ,#-./1&345, pracowalibymy
z prbk pierwszych 50 klientw w bazie.
Kiedy ju bdziemy pewni, e zapytanie jest poprawne, moemy po prostu usun klauzul 0* i wykona nasze rozwizanie dla caej tabeli. Oczywicie musimy by pewni,
e zastosowana prbka danych, wykorzystana w celu przetestowania naszej instrukcji
SQL, jest reprezentantem caoci zbioru danych oraz musimy mie na uwadze, e
mniejsze prbki mog nie w peni testowa nasz instrukcj SQL.

COUNT(nazwa_kolumny)
Pewn odmian funkcji   jest uycie nazwy kolumny zamiast znaku 66. Rnica polega na tym, e funkcja   oblicza ilo wierszy w tabeli,
w ktrych okrelona kolumna ma warto rn od .
Przypumy, e do naszej kolumny ,#-./ dodalimy pewne dane o nowych klientach, za numery telefonw zawarte w tych danych maj warto :
-  - /!$!<C!<!<$!!<<6/!
,+
 3$3<3&A3<3*43<3?9#$!!3<33<3 DD#-35

Rozdzia 7. n Zaawansowane wyszukiwanie danych

197

-  - /!$!<C!<!<$!!<<6/!<64!


,+
 3$3<3$43<3#$A!*3<3EF""*3<3
/3<3
9DG3<3;?D9D9H35
-  - /!$!<C!<!<$!!<<6/!
,+
 3$3<3!A!3<3#$A!*3<3EF""*3<3
/3<3
9DG35
-  - /!$!<C!<!<$!!<<6/!
,+
 3$3<3'3<3&$$!3<3?D 4!+A!!3<3
3<3
;E I35

Sprawdmy, ilu jest klientw, dla ktrych nie znamy numerw telefonw:
66!27/0 1!+ #
/!$
88888888888888
:J
:E
:H
9$
66!27

Widzimy, e mamy trzech takich klientw. Sprawdmy teraz, ilu wszystkich klientw
jest w bazie danych:
66!27 
 #
/
8888888
:H
:$
66!27

Mamy w sumie 19 klientw. Tak wic, jeeli obliczymy liczb klientw, ktrych warto numeru telefonu jest rna od , prawdopodobnie otrzymamy 16:
66!27 
1!  #
/
8888888
:J
:$
66!27

Jest to jedyna rnica pomidzy   a  . Odmiana funkcji
z nazw kolumny oblicza wiersze, w ktrych kolumna o okrelonej nazwie ma warto
rn ni , posta funkcji ze znakiem 66 oblicza za liczb wszystkich wierszy.
Pod kadym innym wzgldem, jak choby w przypadku uycia ' () oraz * ,
  dziaa dokadnie tak samo jak  .

Funkcja MIN()
Teraz, kiedy znamy funkcj   i poznalimy zasady obowizujce dla funkcji agregacji, moemy zastosowa t sam logik do wszystkich pozostaych funkcji agregacji.

198

Bazy danych i PostgreSQL. Od podstaw


Jak mona si spodziewa, funkcja  ma parametr w postaci nazwy kolumny
i zwraca najmniejsz warto znalezion w tej kolumnie. Dla kolumn o typach numerycznych osigniemy spodziewane wyniki. Dla typw opisujcych czas, na przykad
daty, uzyskamy najwiksz dat, ktra moe dotyczy przeszoci bd przyszoci. Dla
cigw znakw o zmiennej dugoci wyniki s nieco zaskakujce, poniewa cigi s porwnywane po uprzednim uzupenieniu ich spacjami z prawej strony. Funkcje 
oraz   w odniesieniu do kolumn typu * naley stosowa ostronie, gdy
w ich przypadku wyniki mog by rne od oczekiwanych.
Oto kilka przykadw.
Poszukajmy najmniejszej opaty transportowej, jak naoylimy na zamwienie:
66!27+
!11  02#

88888888
KLKK
:$
66!27

W rzeczywistoci warto ta wynosia zero. Zwrmy uwag, co si stanie, jeeli zastosujemy t sam funkcj z kolumn "7., o ktrej wiemy, e istniej w niej wartoci :
66!27+
1!  #

8888888
K:KF;JD
:$
66!27

Moglibymy si spodziewa, e wynik bdzie teraz mia warto  lub bdzie pustym cigiem znakw. Biorc jednak pod uwag, e  z reguy oznacza nieznany,
funkcja  ignoruje t warto. Ignorowanie wartoci  jest cech wszystkich
funkcji agregacji oprcz  . To, czy posiadanie informacji o najmniejszym numerze telefonu ma jakiekolwiek znaczenie, jest oczywicie odrbn kwesti.

Funkcja MAX()
Nie jest zaskoczeniem, e funkcja  jest podobna do , ale dziaa w odwrotnym
kierunku.
Jak mona si spodziewa,  jako parametr przyjmuje nazw kolumny i zwraca
maksymaln warto znalezion w tej kolumnie.
Oto kilka przykadw.
Poszukajmy najwikszej opaty transportowej, jak naoylimy na zamwienie:
66!27
+M466. $!$C5
@
88888888

Rozdzia 7. n Zaawansowane wyszukiwanie danych

199

9LHH
:$
66!27

Tak jak w przypadku funkcji , wartoci  s ignorowane:


66!27)3
1!  #
@
8888888
HJ:F;?J
:$
66!27

To w zasadzie wszystko, co naley wiedzie o funkcji , z wyjtkiem tego, e mona z ni uywa klauzul ' () oraz * , dokadnie tak, jak w przypadku funkcji
 .

Funkcja SUM()
Funkcja   przyjmuje jako parametr nazw kolumny o typie numerycznym i zwraca
sum wartoci dla tej kolumny. Tak jak funkcje  oraz , funkcja   ignoruje wartoci typu :
66!27
!11  02#

8888888
HLHD
:$
66!27

Funkcja   posiada interesujc odmian. Moemy mianowicie zada, aby dodano


tylko wartoci unikalne, tak, aby kilka wierszy o tych samych wartociach zostao
uwzgldnione w sumie tylko raz:
66!27
4++ !11  02#

8888888
JLHE
:$
66!27

Zwrmy uwag, e rzeczywiste zastosowanie tej odmiany jest do mgliste.

Funkcja AVG()
Ostatni opisan funkcj agregacji jest  , jako parametr przyjmujca rwnie nazw
kolumny i zwracajca warto redni. Podobnie jak funkcja  , take   ignoruje

200

Bazy danych i PostgreSQL. Od podstaw


wartoci  i moe by uyta ze sowem kluczowym +  , aby dziaaa tylko
z rnymi wartociami:
66!27)*%
!11  02#
A.
8888888
:LHHFKKKKKKK
:$
66!27

Odmiana ze sowem kluczowym +   wyglda nastpujco:


66!27)*%
4++ !11  02#
A.
8888888
?L9?JJJJJJJD
:$
66!27

Zwrmy uwag, e w implementacjach standardowego SQL oraz PostgreSQL nie ma


funkcji + oraz +  . Niektrzy komercyjni producenci doczaj jednak obsug
tych funkcji jako rozszerzenia.

Omwimy teraz sposb poczenia kilku instrukcji  dla zapewnienia wikszych
moliwoci wyszukiwania.
Pamitamy z poprzedniego rozdziau tabel -,#-, ktr wykorzystalimy jako tabel
tymczasow w celu adowania danych do tabeli ,#-./. Przypumy, e w okresie
czasu pomidzy adowaniem informacji o nowych klientach do tabeli -,#- a wyczyszczeniem tabeli i zaadowaniem danych do rzeczywistej tabeli ,#-./, pojawio si
pytanie o list wszystkich miast, w ktrych mamy klientw, z uwzgldnieniem nowych
informacji. Moemy susznie zauway, e poniewa jeszcze nie zaadowalimy danych o klientach do gwnej tabeli i nie wyczycilimy danych nie moemy by
pewni dokadnoci nowych danych. Tak wic adna lista miast czca obie listy rwnie nie bdzie dokadna. Czasami jednak nie jest to wane. By moe potrzebna bya
tylko oglna informacja o geograficznym rozproszeniu klientw, a nie dokadne dane.
Moemy rozwiza ten problem poprzez wybranie miasta (-) z tabeli ,#-./ i zapisanie wyniku, a nastpnie wybranie miasta (-) z tabeli -,#-, ponowne zapisanie
oraz poczenie obu list. Wyglda to raczej nieelegancko, poniewa mamy dwie tabele,
obie zawierajce list miast.
Czy nie ma sposobu, aby inaczej poczy listy? Jak mona wywnioskowa z tytuu tego
podrozdziau, istnieje taki sposb i nazywa si powizaniem typu   . Powizania te
nie s zbyt popularne, ale w pewnych okolicznociach s waciwym rodkiem do rozwizania problemu i s ponadto bardzo atwe w uyciu.

Rozdzia 7. n Zaawansowane wyszukiwanie danych

201

Sprbujmy ponownie umieci pewne dane w tabeli -,#-, aby miaa nastpujc zawarto:
66!27  #
!=C!=!=$!!==6/!=64!
8888888>888888888>888888888>8888888888888888>8888888888>888888888888>8888888888
$='!!$=($!*=D?!=N!*!=NF:?#I=
$=N!A= $!*=F9&!"*=
/=
-?DG=DEJ9F;F
$=($="!$=?: $!=
/=
-DJ& =DEJD?F;
$=/="4!*=9 $/"*="!=" 9F&I=F9;J;F9
F$
66!27

Porwnajmy list miast z tej tabeli z list z tabeli ,#-./.


Wiemy ju, w jaki sposb wybra miasto (-) z kadej z tabel. Musimy uy bardzo
prostej pary instrukcji  nastpujcej postaci:

 /5

 /!$5

Kada z tych instrukcji daje w wyniku list miast. Aby je poczy, zastosujemy operator   :

 /- 
 /!$5

Wprowadzilimy nasz instrukcj SQL dla uatwienia czytania w kilku wierszach.


Zwrmy uwag, e znak zachty "#$ zmienia si z 89 na 92 dla zaznaczenia, e jest
to kontynuacja instrukcji. Poniewa jest to pojedyncza instrukcja SQL, wystpuje tylko
jeden rednik na kocu:
66!27 
66!87 +
66!87 #

88888888888
(.4
#.4
#
N!*!

/



/!
 4!4
 @ $.!
  A!
"!
"!$ *
)!A!
:F$
66!27

202

Bazy danych i PostgreSQL. Od podstaw

Jak to dziaa?
PostgreSQL stworzy list miast z obu tabel i poczy je w pojedyncz list. Zauwamy,
e wszystkie duplikaty zostay usunite. Gdybymy chcieli uzyska list wszystkich
miast wcznie z duplikatami, zapisalibymy    zamiast   .
Waciwo czenia instrukcji  nie ogranicza si do pojedynczej kolumny, moglibymy poczy take list miast i kodw pocztowych:

<6/! /- 
<6/! /!$5

Spowodowaoby to utworzenie listy zoonej z obu kolumn. Byaby to dusza lista, poniewa ze wzgldu na kod pocztowy, istnieje wicej unikalnych wierszy.
Powizanie typu   nie potrafi jednak czyni cudw; obie listy kolumn musz zawiera jednakow ich liczb, a ponadto wybrane odpowiadajce sobie kolumny musz mie
zgodne typy. Popatrzmy:
66!27( 
66!87- 
66!87 #
!
8888888888
N!*!

/

$
$
"!
J$
66!27

Zapytanie, jakkolwiek raczej pozbawione sensu, jest poprawne, poniewa PostgreSQL


moe poczy kolumny, mimo e kolumna -1-. ma sta dugo, natomiast kolumna
- zmienn, poniewa obie kolumny s cigami znakw. Gdybymy dla przykadu
sprbowali powiza pole ,#-./1& oraz -, PostgreSQL poinformowaby nas, e
jest to niemoliwe, poniewa typy kolumn s rne.
W zasadzie to wszystko, co naley wiedzie o powizaniach typu   , ktre czasem
okazuj si bardzo przydatne do czenia danych z dwch (lub wicej) tabel.

Teraz, kiedy poznalimy instrukcje SQL zawierajce wicej ni jedn instrukcj ,
moemy zapozna si z ca klas instrukcji wyszukiwania danych, ktre cz instrukcje  w o wiele bardziej wyszukany sposb. S one trudniejsze do zrozumienia ni
zapytania zoone z pojedynczej instrukcji  lub powizania typu   , ale s bardzo przydatne i otwieraj nowe moliwoci tworzenia kryteriw wyboru.

Rozdzia 7. n Zaawansowane wyszukiwanie danych

203

Zapytanie podrzdne ma miejsce wtedy, gdy tworzymy jeden (lub wicej) warunkw
0* instrukcji  jako odrbn instrukcj .
Przypumy, e chcemy odnale wszystkie towary z tabeli 1-., z cen zakupu
(,#-"/1,.) wiksz ni 10. Instrukcja  jest w tym przypadku raczej zoona ze
wzgldu na konieczno konwersji typu liczby na typ   :2; po to, aby typ liczby
by zgodny z typem kolumny ,#-"/1,. w tabeli 1-., ale w zasadzie jest do oczywista:
66!27
 !"#  /6$/!O + :KLK+ - D<?5
!=!/$6=/6$/!=!6$/!
888888888>8888888888888>888888888888>888888888888
:="'!=:;L?9=?:LH;
D=
$.!=:9L9J=:HLH;
::=6!!$=:HLD9=?;L9?
9$
66!27

Przypumy, e chcemy znale towary, ktrych cena zakupu jest wiksza od redniej
ceny zakupu. Z atwoci mona to zrobi w dwch zapytaniach:
66!27)*%
/1  #
A.
88888888888888
DL?FHKHKHKH:
:$
66!27  /1,)
56789)
66!87 +
5$7 #
!=!/$6=/6$/!=!6$/!
888888888>888888888888888>888888888888>888888888888
:="'!=:;L?9=?:LH;
?= /  !=DLF;=::LFH
;='/$!$!=DL;F=HLH;
J==HL?9=:;LD;
D=
$.!=:9L9J=:HLH;
::=6!!$=:HLD9=?;L9?
J$
66!27

Jest to jednak rozwizanie mao eleganckie. Tak naprawd chcemy przekaza wynik
pierwszego zapytania bezporednio do drugiego, bez koniecznoci pamitania go i wpisywania do drugiego zapytania.
Jest to wanie jedna z moliwoci, ktre daje zastosowanie zapyta podrzdnych. Moemy umieci pierwsze zapytanie w nawiasach i wykorzysta jako cz klauzuli 0*
w drugim zapytaniu:
66!27  +/1,
)*%
/1
66!87  #
!=!/$6=/6$/!=!6$/!
888888888>888888888888888>888888888888>888888888888
:="'!=:;L?9=?:LH;
?= /  !=DLF;=::LFH

204

Bazy danych i PostgreSQL. Od podstaw


;='/$!$!=DL;F=HLH;
J==HL?9=:;LD;
D=
$.!=:9L9J=:HLH;
::=6!!$=:HLD9=?;L9?
J$
66!27

Jak widzimy, uzyskalimy ten sam wynik, ale bez koniecznoci wykonywania kroku poredniego oraz konwersji typw, poniewa wynik jest ju waciwego typu.
PostgreSQL najpierw wykonuje zapytanie w nawiasach. Po uzyskaniu odpowiedzi uruchamia zapytanie zewntrzne, zastpujc wynik zapytania wewntrznego. Jeeli zachodzi taka potrzeba, moemy korzysta z wielu zapyta podrzdnych dla rnych klauzul
0*. Nie ma ogranicze co do liczby, ale konieczno korzystania z wielu zagniedonych instrukcji  wystpuje niezbyt czsto.

Wyprbuj to zapytania podrz+dne


Wyprbujmy bardziej zoony przykad. Przypumy, e chcemy zna wszystkie towary, ktrych cena zakupu jest wiksza od redniej ceny zakupu, ale cena sprzeday jest
mniejsza od redniej ceny sprzeday. Sugeruje nam to, e nasza mara nie jest zbyt wysoka, zatem prawdopodobnie niezbyt wiele towarw speni takie kryteria.
Wiemy ju, jak znale redni cen zakupu:   ,#-"/1,. < 1-.. Odnalezienie redniej ceny sprzeday realizuje si analogicznie:   #."/1,.
< 1-..
Nasze zapytanie gwne przyjmie nastpujc posta:

 !"#  /6$/!OP$!/!6+G!6$/!
QP$!/!6$!R*

Jeeli poczymy te trzy zapytania otrzymamy:


66!27  /1,
)*%
/1
66!87  ) 4((/1.
)*%
((/1   #
!=!/$6=/6$/!=!6$/!
888888888>888888888888888>888888888888>888888888888
;='/$!$!=DL;F=HLH;
:$
66!27

By moe kto powinien przyjrze si cenie ramek do obrazkw i sprawdzi, czy jest
waciwa!

Jak to dziaa
PostgreSQL skanuje zapytanie i stwierdza, e istniej dwa zapytania w nawiasach
zapytania podrzdne. Nastpnie rozwizuje te zapytania niezalenie, po czym przesya
odpowiedzi do waciwej czci klauzuli 0* zapytania gwnego i wykonuje to zapytanie.

Rozdzia 7. n Zaawansowane wyszukiwanie danych

205

Moglibymy zastosowa inne klauzule 0* lub + (). Poczenie warunkw 0*
pochodzcych z zapyta podrzdnych z warunkami konwencjonalnymi jest cakowicie
poprawne.

Rodzaje zapyta podrz!dnych


Do tej pory wykorzystywalimy tylko takie zapytania podrzdne, ktre zwracay pojedyncze wyniki, poniewa korzystalimy w nich z funkcji agregacji. W zasadzie zapytania podrzdne mog mie wyniki trzech typw:
n

pojedyncza warto (jak te, ktre ju widzielimy);

brak wierszy lub kilka wierszy;

test istnienia czego.

Spjrzmy na drugi rodzaj zapyta podrzdnych, gdzie w wyniku moe wystpi kilka
wierszy. Przypumy, e chcemy wiedzie, jakie towary, ktrych cena zakupu jest wiksza ni 10, znajduj si w magazynie. Moemy dowiedzie si tego za pomoc pojedynczej instrukcji  nastpujcej postaci:
66!276/0$6:"; <$
66!876/1,)
-=6=) +
5$7 ) 46/0
66!876/0#
!=*
888888888>8888888888
:=:?
D=E
?$
66!27

Zauwamy, e dla skrcenia zapytania zastosowalimy aliasy nazw tabel (#-, bdzie
obecnie tabel #, 1-. tabel 1). Poczymy teraz dwie tabele (#!1-.1& 8
1!1-.1&) oraz dodamy w tabeli 1-. warunek dotyczcy ceny zakupu (1!,#-"/1,. =
>5!5    :2;).
Moemy take zapisa to zapytanie podrzdne stosujc sowo kluczowe , w celu zbadania listy wartoci. Naley zapisa zapytanie, ktre daje w wyniku list identyfikatorw towarw, dla ktrych cena zakupu towaru jest mniejsza ni 10.0:

 !"#  /6$/!O + :KLK+ - D<?5

Potrzebujemy take zapytania wybierajcego towary z tabeli #-,:



 /"#  !-


Moemy nastpnie poczy oba zapytania w nastpujcy sposb:


66!27  </0+ 
/0 
66!87/1,)
-=6=) +
5$7 #
!=*
888888888>8888888888
:=:?

206

Bazy danych i PostgreSQL. Od podstaw


D=E
?$
66!27

Procedury te daj nam te same wyniki. Zapytania podrzdne chocia nie wszystkie
mona zazwyczaj zapisa jako powizania. Z tego wzgldu wane jest, aby je zrozumie. Tak jak w przypadku bardziej konwencjonalnych zapyta, mona zanegowa
warunek, zapisujc  . Mona te wpisa dodatkowe klauzule 0* oraz warunki
+ ().
Czego powinnimy uy w przypadku, gdy mamy zapytanie podrzdne, ktre mona
zapisa jako powizanie? Naley rozway dwie sprawy czytelno i wydajno. Dla
okazyjnie wykorzystywanych zapyta dziaajcych z niewielkimi tabelami i wykonujcymi si szybko wykorzystujemy dowoln posta, ktra jest najbardziej czytelna. Jeeli
jest to zapytanie wykorzystywane czsto, dla duych tabel, opaca si zapisa je na rne sposoby i dowiadczalnie sprawdzi wydajno. By moe optymalizator zapyta
bdzie w stanie zoptymalizowa oba rodzaje i wydajno obu zapyta bdzie identyczna. Zwyciy wwczas zapytanie, ktre bdzie bardziej czytelne.
Naley ostronie bada wydajno instrukcji SQL. Istnieje wiele czynnikw znajduj%cych
si poza nasz% kontrol%, jak np. buforowanie danych przez system operacyjny.

Mona si take przekona, e wydajno zaley w bardzo duym stopniu od konkretnych danych w naszej bazie lub zmienia si diametralnie wraz ze zmian liczby wierszy
w poszczeglnych tabelach.
Nie poznalimy jeszcze ostatniego typu zapytania podrzdnego takiego, ktre bada
istnienie czego poniewa jest ono dosy zoone. Przed kocem rozdziau wrcimy
do tego typu zapyta.

Zapytania podrz!dne skorelowane


Do tej pory poznalimy takie typy zapyta podrzdnych, gdzie dla uzyskania wyniku
wykonywalimy zapytanie, a nastpnie wczalimy je do drugiego zapytania. Te dwa
zapytania nie s jednak zwizane w innym przypadku i dlatego nazywa si je zapytaniami podrzdnymi nieskorelowanymi. Wynika to z faktu, e pomidzy wewntrznym,
a zewntrznym zapytaniem nie ma powizanych tabel. W obu czciach instrukcji 
 mona uywa tej samej kolumny z tej samej tabeli, ale s one zwizane tylko poprzez wynik zapytania podrzdnego, ktre zasila klauzul 0* gwnego zapytania.
Istnieje inna grupa zapyta podrzdnych, ktre nazywa si zapytaniami podrzdnymi
skorelowanymi, gdzie zwizek pomidzy dwiema czciami zapytania jest bardziej zoony. W zapytaniu podrzdnym skorelowanym tabela w wewntrznej instrukcji 
jest powizana z tabel w zewntrznej czci instrukcji. Z tego wanie wzgldu te dwa
zapytania s skorelowane. Ta grupa zapyta podrzdnych daje due moliwoci. Bardzo
czsto mona je zapisa jako zwyke instrukcje  z powizaniami.

Rozdzia 7. n Zaawansowane wyszukiwanie danych

207

Zapytanie skorelowane ma nastpujc posta ogln:



+  !: :"#   :L(2
 ?L( 
 !? ?
"#   ?L 2 :L 

Zapisalimy t instrukcj w kodzie pseudo-SQL, aby mona j byo atwiej wyjani.


Wan rzecz, ktr naley zauway, jest fakt, e tabela > z zewntrznej instrukcji 
 wystpuje take w wewntrznej instrukcji . Zatem tabele zewntrzn i wewntrzn uwaa si za powizane. Zauwamy, e zastosowalimy aliasy nazw tabel. Jest
to bardzo wane, poniewa reguy nazw tabel w skorelowanych zapytaniach s do
zoone i niewielka pomyka moe skutkowa niezrozumiaymi wynikami.
Zalecamy, aby w zapytaniach podrzdnych skorelowanych zawsze stosowa aliasy
tabel, poniewa jest to opcja najbezpieczniejsza.

Po wykonaniu tej instrukcji dziej si dosy skomplikowane rzeczy. Po pierwsze, dla


wewntrznej instrukcji  z tabeli > pobierany jest wiersz, a nastpnie kolumna
>!( jest przekazywana do wewntrznego zapytania, ktre wykonuje si wybierajc wiersze z tabeli ;, korzystajc jednak z przekazanych informacji. Wynik jest ponownie przekazywany do zapytania wewntrznego, ktre przed przejciem do nastpnego wiersza koczy obliczanie klauzuli 0*.
Pokazano to na poniszym diagramie:
Rysunek 7.1.

Jeeli wydaje si to nam troch skomplikowane, to trzeba przyzna, e tak wanie jest.
Skorelowane zapytania podrzdne wykonywane s do nieefektywnie. Czasami jednak
udaje si dziki nim rozwiza bardzo zoone problemy. Tak wic dobrze wiedzie, e
istniej, nawet jeeli nieczsto bdziemy z nich korzysta.

208

Bazy danych i PostgreSQL. Od podstaw

Wyprbuj to zapytanie podrz+dne skorelowane


W prostej bazie danych, jak ta, ktr wykorzystujemy, potrzeba uycia zapyta podrzdnych skorelowanych wystpuje niezbyt czsto. Zazwyczaj mona je zapisa w inny
sposb. Moemy jednak wykorzysta nawet nasz prost baz danych w celu zademonstrowania ich zastosowania.
Przypumy, e chcemy zna dat zoenia zamwie dla klientw w Bingham. Chocia
moglibymy zapisa to w sposb bardziej konwencjonalny, skorzystamy z zapytania
podrzdnego skorelowanego w nastpujcej postaci:
66!27
L!6/! $!$C"#  L/!$2
66!87
/L/!$C$/!$/"#  /L/!$2
66!876/0"0 !" #
!6/!
8888888888888
?KKK8KJ8?9
?KKK8KD8?:
?$
66!27

Jak to dziaa?
Zapytanie rozpoczyna dziaanie od pobrania wiersza z tabeli /&./1?. Nastpnie wykonuje ono zapytanie podrzdne dla tabeli ,#-./, korzystajc z odnalezionej wartoci
,#-./1&. Wykonuje si zapytanie podrzdne poszukujc wierszy, gdzie pole ,#-
./1& z zewntrznego zapytania daje wiersz w tabeli ,#-./, ktry zawiera take
miasto Bingham. W przypadku znalezienia takiego wiersza, pole ,#-./1& jest przekazywane z powrotem do zapytania gwnego, ktre koczy klauzul 0* i jeeli jest
ona prawdziwa, wywietla kolumn &-.",.&. Zapytanie zewntrzne przechodzi nastpnie do kolejnego wiersza i sekwencja powtarza si.
Spjrzmy na inny przykad. Tym razem wykorzystamy trzeci typ zapytania, ktrego do
tej pory jeszcze nie poznalimy, gdzie zapytanie podrzdne bada istnienie czego.
Przypumy, e chcemy wyszczeglni wszystkich klientw, ktrzy skadali zamwienia. W naszej przykadowej bazie danych nie ma ich wielu. Pierwsza cz zapytania
jest prosta; zapiszmy:

C!<! /!$/5

Zwrmy uwag, e zastosowalimy alias tabeli ,#-./ ,, ktry zosta przygotowany dla zapytania podrzdnego. Kolejna cz zapytania powinna sprawdzi, czy
warto pola ,#-./1& wystpuje take w tabeli /&./1?:

: $!$C"#  L/!$2/L/!$5

Naley tu zwrci uwag na dwa bardzo wane aspekty. Po pierwsze, zastosowalimy


znan sztuczk. Jeeli zaley nam na wykonaniu zapytania, ale nie interesuj nas wyniki, po prostu umieszczamy 6>6 tam, gdzie zwykle umieszcza si nazwy kolumn. Ozna-

Rozdzia 7. n Zaawansowane wyszukiwanie danych

209

cza to, e jeeli zostan odnalezione jakiekolwiek dane, wynikiem zapytania bdzie 1,
co jest atwym i wydajnym sposobem powiedzenia 6-/.6. Moe to wydawa si dosy
dziwne, zatem zobaczmy:
66!27-  !"#
S/S
8888888888
:
:
:
9$
66!27

To dziaa, nawet jeli wyglda nieco dziwacznie. Wane jest, aby nie korzysta tu
z funkcji  , poniewa potrzebujemy wyniku z kadego wiersza, gdzie kolumna
- ma warto (1@7, a nie informacji, ilu mamy klientw pochodzcych z Bingham.
Drug wan rzecz, na ktr naley zwrci uwag jest fakt, e skorzystalimy z tabeli
,#-./ w tym zapytaniu podrzdnym, ktre w zasadzie byo uyte w zapytaniu gw-

nym. Wanie to decyduje o tym, e s to zapytania skorelowane. Tak jak poprzednio,


dla wszystkich tabel zastosowalimy aliasy. Musimy teraz poczy obie poowy.
Czas na zapoznanie si z ostatnim rodzajem zapyta podrzdnych, ktre wczeniej pominlimy. Bada ono za pomoc sowa kluczowego   w klauzuli 0* istnienie
wartoci, bez koniecznoci znajomoci danych.
Dla naszego zapytania skorzystanie z   jest dobrym sposobem poczenia dwch
instrukcji , poniewa chcemy wiedzie tylko, czy zapytanie podrzdne zwraca
wiersz. Klauzula   zazwyczaj dziaa wydajniej ni inne typy powiza w warunkach . Z tego wzgldu, w przypadku, gdy istnieje wybr sposobu zapisu zapytania,
czsto warto korzysta wanie z niej zamiast innych typw powiza.
66!272"$(" 3+
- 
66!87026/06/0 #
C!=!
8888888>888888888
+!@=4!
+=!

$=#!*
GA=#
F$
66!27

Mona tu zobaczy, jak s zapisywane skorelowane zapytania podrzdne. Czasami, kiedy napotkamy problem, ktry wydaje si niemoliwy do rozwizania za pomoc zwykych zapyta SQL, moe si okaza, e rozwizaniem tych trudnoci jest skorelowane
zapytanie podrzdne.

210

Bazy danych i PostgreSQL. Od podstaw

Specjalnym typem powiza s powizania same z sob. Wykorzystuje si je w celu


powizania kolumn znajdujcych si w tej samej tabeli. Potrzeba korzystania z tych powiza jest niezwykle rzadka, ale czasami bardzo si one przydaj, dlatego pokrtce
omwimy je w tym podrozdziale.
Przypumy, e sprzedajemy towary, ktre mona sprzedawa w kompletach lub pojedynczo. Dla potrzeb przykadu zamy, e sprzedajemy komplet krzese i st, a take
st i krzesa oddzielnie. Chcielibymy zapisa nie tylko poszczeglne, pojedyncze towary, ale take relacje midzy nimi, podczas gdy s sprzedawane jako cao. Czsto
nazywa si to eksplozj czci. Z pojciem tym spotkamy si ponownie w rozdziale 12.
Rozpocznijmy od utworzenia tabeli, ktra zawiera nie tylko identyfikatory towarw
i ich opis, ale take dodatkowy identyfikator towaru:
 +  +(
6$6$- <!/$6,+ #+9?<6$!6$- 5

Wykorzystamy pole "/.-"/-1& do przechowywania informacji o identyfikatorze


komponentu, ktrego czci jest nasz towar. Na przykad, przypumy, e mamy zestaw krzese i stou, ktremu nadamy warto 1-.1& = 1, skadajcy si z krzesa, dla
ktrego przypisujemy 1-.1& = 2 oraz stou, okrelonego jako 1-.1& = 3. Instrukcje
 wygldayby wwczas nastpujco:
66!27+ + 1"
1"/0$01$1"/1"/0 *)
-$
66!27">("0!"$  #
-  ?:;DH:
66!27+ + 1"
1"/0$01$1"/1"/0 *)
7$
66!87!"$- #
-  ?:;EK:
66!27+ + 1"
1"/0$01$1"/1"/0 *)
?$
66!87">($- #
-  ?:;E::
66!27

Zapisalimy dane, ale w jaki sposb uzyskamy informacje o tym, ktre pojedyncze czci skadaj si na poszczeglny komponent? Musimy powiza tabel z ni sam.
Okazuje si to dosy proste. Musimy zastosowa aliasy nazw tabel, a nastpnie zapisa
klauzul 0* odnoszc si do tej samej tabeli, stosujc jednak rne nazwy:
66!271-601$17601 1"1-$1"17
66!871-61"/01761"/1"/0#
!/$6=!/$6
888888888888888888>8888888888888
 !/4$=/4$
 !/4$= !
?$
66!27

Rozdzia 7. n Zaawansowane wyszukiwanie danych

211

To dziaa, ale jest troch mylce, poniewa mamy dwie kolumny wyniku z t sam nazw.
Moemy w atwy sposb poprawi t niedogodno za pomoc sowa kluczowego :
66!271-601)@>0@$17601)@&"@
66!87 1"1-$1"171-61"/01761"/1"/0#
  !='$
888888888888888888>8888888
 !/4$=/4$
 !/4$= !
?$
66!27

Z powizaniami typu same z sob spotkamy si ponownie w rozdziale 12., w ktrym


omwimy sposb zapisu zwizku przeoony podwadny w pojedynczej tabeli.

Ostatnim gwnym zagadnieniem, jakie poruszymy w tym rozdziale, jest klasa powiza znana jako powizania zewntrzne. S one podobne do powiza konwencjonalnych, ale wykorzystuj nieco inn skadni. Z tego wzgldu odoylimy spotkanie
z nimi na koniec tego rozdziau.
Spjrzmy na nasze tabele 1-. i #-,:
Rysunek 7.2.

Jak pamitamy, wszystkie towary przeznaczone do sprzeday znajduj si w tabeli 1-.,


natomiast w tabeli #-, znajduj si tylko te, ktre aktualnie znajduj si w magazynie.
Przypumy, e chcemy uzyska list wszystkich towarw, ktre sprzedajemy, ze
wskazaniem iloci, jak mamy w magazynie. To z pozoru proste danie okazuje si zaskakujco trudne do zapisania w jzyku SQL, ktry znamy do tej pory chocia jest
moliwe. Bardzo dobrze jest woy nieco pracy w rozwizanie; sprbujmy zatem skorzysta tylko z tych instrukcji SQL, ktre znamy do tej pory.
Zastosujmy prost instrukcj  czc dwie tabele:
66!276/0$6:"; $<6/0
66!876/0
!=*
888888888>8888888888
:=:?

212

Bazy danych i PostgreSQL. Od podstaw


?=?
F=E
;=9
D=E
E=:E
:K=:
D$
66!27

atwo zauway (poniewa wiemy, e nasze identyfikatory 1-.1& wystpuj w tabeli


kolejno, bez luk), e brakuje niektrych identyfikatorw 1-.1&. Brakujce wiersze
dotycz towarw, ktrych nie mamy w magazynie, poniewa nie istnieje dla nich powizanie pomidzy tabelami 1-. oraz #-, w tabeli #-, brakuje zapisu dla tego
1-.1&.
Brakujce wiersze moemy znale za pomoc zapytania podrzdnego oraz klauzuli :
66!276/0 6/0 + 

66!876/0 $<6/06/0 #
!
888888888
9
J
H
::
F$
66!27

Mwic prociej, moemy zada: znajd wszystkie identyfikatory 1-.1& w tabeli


1-., poza tymi, ktre znajduj si w tabeli #-,.
Wewntrzna instrukcja  jest t sam, ktr zastosowalimy wczeniej, ale tym razem skorzystalimy z listy identyfikatorw 1-.1&, ktre instrukcja ta zwraca jako
cz innej instrukcji . Gwna instrukcja  wyszczeglnia wszystkie znane
identyfikatory 1-.1& poza znalezionymi w zapytaniu podrzdnym, usunitymi przez
klauzul 0*  .
Tak wic mamy teraz listy identyfikatorw 1-.1& zarwno dla towarw, ktrych nie
ma w magazynie, jak i dla tych, ktre si w nim znajduj. Listy te uzyskalimy jednak
w oddzielnych zapytaniach. Musimy teraz powiza obie listy; moemy to zrobi za
pomoc instrukcji   . Istnieje jednak pewien problem. Nasza pierwsza instrukcja
zwraca dwie kolumny: 1-.1& oraz $-1-, natomiast druga tylko identyfikatory
1-.1&, poniewa w magazynie nie ma odpowiednich towarw. Naley zatem doda
sztuczn kolumn do drugiej instrukcji , aby miaa t sam co pierwsza liczb
kolumn oraz kolumny tego samego typu. Mamy zamiar wykorzysta warto , chocia rwnie dobrze moglibymy uy 0 (zero). Pniej zobaczymy, dlaczego wybralimy .

Rozdzia 7. n Zaawansowane wyszukiwanie danych

213

Oto nasze kompletne zapytanie:



L!<L* !</"#  L!2L!
- 

L!<

 !"#  L! -



L! !</"#  L!2L!5

Wyglda to na nieco skomplikowane, ale sprbujmy zobaczy, jak dziaa:


66!276/0$6:"; $<6/0
66!876/0
66!87 +
66!876/0$  6/0 + 
(
66!876/0 $<6/06/0 #
!=*
888888888>8888888888
:=:?
?=?
9=
F=E
;=9
J=
D=E
E=:E
H=
:K=:
::=
::$
66!27

W pocztkowym okresie istnienia jzyka SQL by to jedyny sposb rozwizania tego


typu problemw, poza tym, e SQL89 nie umoliwia stosowania wartoci , z ktrej
skorzystalimy w drugiej instrukcji , jako kolumny. Na szczcie wikszo producentw SQL dawaa tak moliwo. W przeciwnym przypadku byoby jeszcze trudniej. Gdybymy nie mogli wykorzysta wartoci , musielibymy zastosowa 0 jako
nieco gorsz alternatyw. Warto  jest lepszym rozwizaniem, poniewa 0 moe
by mylce, natomiast  zawsze bdzie wywietlane jako puste miejsce.
Aby obej to raczej skomplikowane rozwizanie dla do popularnych problemw,
producenci wymylili mechanizm znany jako powizania zewntrzne. Niestety, poniewa nie byo tego w standardzie, kady z producentw opracowa swoje wasne rozwizanie, o podobnym do innych dziaaniu, ale rnej skadni.
W systemach Oracle oraz DB2 zastosowano skadni, w ktrej w klauzuli 0* wykorzystywano znak A dla zaznaczenia, e w wyniku maj si znale wszystkie wartoci
z tabeli (tabeli chronionej), nawet jeeli powizanie nie powiedzie si. W systemie Sybase zastosowano w klauzuli 0* symbol 8, aby oznaczy tabel chronion. Obie te
skadnie s dosy oczywiste, ale niestety rne, co nie jest dobre dla przenonoci kodu SQL.
Kiedy pojawi si standard SQL92, zdefiniowano w nim oglny sposb implementowania powiza zewntrznych, ktry stosowa jeszcze inn skadni. Producenci dosy
wolno implementowali nowy standard. W systemie Sybase 11 nie obsugiwano jeszcze
tego mechanizmu, podobnie jak w Oracle8. Obydwa produkty wydano ju po ukazaniu

214

Bazy danych i PostgreSQL. Od podstaw


si standardu. W systemie PostgreSQL zaimplementowano standardow metod poczwszy od wersji 7.1. Tak wic, jeeli korzystamy ze starszej wersji, aby mc wyprbowa przykady z ostatniej czci tego rozdziau, musimy uaktualni posiadan wersj
PostgreSQL. Jeeli korzystamy z wersji PostgreSQL starszej ni 7.1, uaktualnienie
opaca si take z innych powodw, poniewa wersja 7.1 jest znaczco lepsza od wersji
starszych.
Skadnia standardu SQL92 zamienia klauzul 0*, ktr znamy. Wprowadza dla czenia tabel klauzul  oraz sowo kluczowe < 
 .
Skadnia jest w tym przypadku nastpujca:

*  !:
   B - !?  !:L
2 !?L

Tabela z lewej strony < 


 jest zawsze tabel chronion t, dla ktrej s
wywietlane wszystkie wiersze.
Moemy zatem zapisa nasze zapytanie ponownie, za pomoc nastpujcej skadni:

L!<L* !
   B -/ L!2
L!5

Wyglda to niemal na zbyt proste, aby mogo by prawdziwe. Sprbujmy zatem zobaczy dziaanie podanej wyej skadni:
66!276/0$6:";  A+ <
66!87 6/06/0#
!=*
888888888>8888888888
:=:?
?=?
9=
F=E
;=9
J=
D=E
E=:E
H=
:K=:
::=
::$
66!27

wietnie, odpowied jest identyczna z t, jak otrzymalimy w wyniku zastosowania


poprzedniego sposobu. Widzimy teraz, dlaczego producenci czuli potrzeb implementacji powiza zewntrznych, nawet jeeli nie byo ich w oryginalnym standardzie
SQL89.
Istnieje take odpowiednik poznanego wyej sowa kluczowego,  * 
 , ale
prawie zawsze korzysta si z powizania lewostronnego, ze wzgldu na to, e przynajmniej dla mieszkacw Zachodu bardziej sensowne jest wywietlanie listy wszystkich obiektw po lewej stronie wyniku, a nie po prawej.

Rozdzia 7. n Zaawansowane wyszukiwanie danych

215

Wyprbuj to bardziej zo-ony warunek


Proste lewostronne powizanie zewntrzne, ktre wykorzystalimy, jest doskonae tak
dugo, jak dziaa, ale w jaki sposb doda bardziej zoone warunki?
Przypumy, e interesuj nas tylko te wiersze z tabeli #-,, dla ktrych w magazynie
znajduj si wicej ni dwie sztuki towaru, a ponadto te, w ktrych cena zakupu jest
wiksza ni 5,0. Jest to dosy zoony problem, poniewa chcemy zastosowa jedn regu do tabeli 1-. (,#-"/1,. =4!5), a inn regu do tabeli #-, ($-1-=;).
W dalszym cigu chcemy jednak wywietli wszystkie wiersze z tabeli 1-., dla ktrych
prawdziwy jest warunek dla tabeli 1-., nawet jeeli tych towarw wcale nie ma w magazynie.
W tym celu poczymy warunki  , ktre dziaay tylko z tabelami zwizanymi lewostronnym powizaniem zewntrznym, z warunkami 0*, ograniczajcymi zwracane
wiersze po powizaniu tabel.
Warunek dla tabeli #-, jest czci powizania zewntrznego, w ktrym nie chcemy
ogranicza wierszy dla towarw, ktrych nie ma w magazynie, zatem zapiszemy go jako
cz warunku  :
!2L!+GL*O?

Dla warunku 1-., ktry dotyczy wszystkich wierszy, zastosujemy klauzul 0*:
"#  L/6$/!O + ;LK+ - D<?5

czc obie czci otrzymamy:


66!276/0$6/1$6:";  
66!87A+ < 6/06/0) 46:";,7
66!876/1,)
B6=) +
5$7 #
!=/6$/!=*
888888888>888888888888>8888888888
:=:;L?9=:?
?=DLF;=
;=DL;F=9
J=HL?9=
D=:9L9J=E
::=:HLD9=
J$
66!27

Jak to dziaa?
Aby uzyska wszystkie wartoci z tabeli 1-., opcjonalnie w poczeniu z tabel #-,,
gdzie istniej oba wiersze, a warto pola $-1- jest wiksza ni 2, stosujemy mechanizm < 
 . Daje to nam zbir, w ktrym znajd si wszystkie wiersze
z tabeli 1-., ale kolumna $-1- z tabeli #-, bdzie zawieraa warto , chyba
e obydwie tabele zawieraj zapis dla danego towaru oraz warto pola $-1- jest
wiksza ni 2. Nastpnie stosujemy klauzul 0*, ktra pozwala na wywietlanie tylko
tych wierszy, w ktrych cena zakupu (,#-"/1,. z tabeli 1-.) jest wiksza ni 5.0.

You might also like