You are on page 1of 49

Oracle Database 11g i SQL.

Programowanie
Autor: Jason Price
Tumaczenie: Marcin Rog
ISBN: 978-83-246-1879-8
Tytu oryginau: Oracle Database 11g SQL
(Osborne Oracle Press)
Format: B5, stron: 672

Opanuj SQL i PL/SQL w Oracle Database i pisz wietne programy!


Jak tworzy obiekty baz danych i kolekcje?
Jak zoptymalizowa instrukcje SQL, aby byy wykonywane szybciej?
Jak pisa programy w PL/SQL?

Doskonaa baza danych to jeden z podstawowych elementw sprawnego


funkcjonowania wspczesnych przedsibiorstw, instytucji i organizacji. Jednak,
aby efektywnie korzysta z jej dobrodziejstw, potrzebujesz specjalnego
oprogramowania. Znakomitym systemem zarzdzania baz danych jest Oracle.
Natomiast SQL strukturalny jzyk zapyta zapewnia dostp do systemu
zarzdzania baz danych, a wic pobieranie, wstawianie i usuwanie z niej wszelkich
informacji. PL/SQL (wywodzcy si z SQL) umoliwia pisanie programw zawierajcych
instrukcje SQL.
Ksika Oracle Database 11g. Programowanie w jzyku SQL zawiera wyczerpujce
informacje, dotyczce pracy z baz danych Oracle za porednictwem instrukcji SQL,
a take opis najnowszych waciwoci i narzdzi tego jzyka, technik
optymalizacyjnych oraz obsugi Javy i XML. Z tego podrcznika dowiesz si midzy
innymi, w jaki sposb Oracle przetwarza oraz przechowuje daty i czas. Nauczysz si
wykorzystywa due obiekty do obsugi plikw multimedialnych zawierajcych obrazy,
muzyk i filmy, a take pisa (w jzyku Java) programy uzyskujce dostp do bazy
danych Oracle za porednictwem JDBC.
Pobieranie informacji z tabel bazy danych
SQL*Plus
Funkcje
Skadowanie oraz przetwarzanie dat i czasu
Zapytania zaawansowane
Uytkownicy, uprawnienia i role
Obiekty baz danych
Kolekcje
Praca z SQL w Javie
Zamknicie obiektu ResultSet
Optymalizacja SQL
XML i bazy danych Oracle

Baza Oracle nie bdzie miaa przed Tob tajemnic!

Spis treci

Spis treci
O autorze ................................................................................................. 17
O redaktorze merytorycznym ..................................................................... 19
Wprowadzenie .......................................................................................... 21
Rozdzia 1. Wprowadzenie .......................................................................................... 27
Czym jest relacyjna baza danych? ...............................................................................................27
Wstp do SQL .............................................................................................................................28
Uywanie SQL*Plus ...................................................................................................................30
Uruchamianie SQL*Plus .......................................................................................................30
Uruchamianie SQL*Plus z wiersza polece ..........................................................................31
Wykonywanie instrukcji SELECT za pomoc SQL*Plus .....................................................32
SQL Developer ............................................................................................................................33
Tworzenie schematu bazy danych sklepu ....................................................................................34
Uruchamianie skryptu programu SQL*Plus
w celu utworzenia schematu bazy danych sklepu ...............................................................35
Instrukcje DDL uywane do tworzenia schematu bazy danych sklepu .................................36
Dodawanie, modyfikowanie i usuwanie wierszy .........................................................................44
Dodawanie wiersza do tabeli .................................................................................................44
Modyfikowanie istniejcego wiersza w tabeli .......................................................................46
Usuwanie wiersza z tabeli .....................................................................................................47
Typy BINARY_FLOAT i BINARY_DOUBLE .........................................................................47
Zalety typw BINARY_FLOAT i BINARY_DOUBLE .......................................................47
Uycie typw BINARY_FLOAT i BINARY_DOUBLE w tabeli ........................................48
Wartoci specjalne .................................................................................................................49
Koczenie pracy SQL*Plus .........................................................................................................49
Wprowadzenie do Oracle PL/SQL ..............................................................................................50
Podsumowanie .............................................................................................................................51

Rozdzia 2. Pobieranie informacji z tabel bazy danych ................................................. 53


Wykonywanie instrukcji SELECT dla jednej tabeli ....................................................................53
Pobieranie wszystkich kolumn z tabeli ........................................................................................54
Wykorzystanie klauzuli WHERE do wskazywania wierszy do pobrania ....................................55
Identyfikatory wierszy .................................................................................................................55
Numery wierszy ...........................................................................................................................56
Wykonywanie dziaa arytmetycznych .......................................................................................56
Wykonywanie oblicze na datach .........................................................................................57
Korzystanie z kolumn w obliczeniach ...................................................................................58

Oracle Database 11g i SQL. Programowanie


Uywanie aliasw kolumn ...........................................................................................................59
czenie wartoci z kolumn za pomoc konkatenacji .................................................................60
Wartoci null ...............................................................................................................................61
Wywietlanie odrbnych wierszy ................................................................................................62
Porwnywanie wartoci ...............................................................................................................63
Korzystanie z operatorw SQL ...................................................................................................65
Operator LIKE ......................................................................................................................65
Operator IN ...........................................................................................................................67
Operator BETWEEN .............................................................................................................67
Operatory logiczne ......................................................................................................................68
Nastpstwo operatorw ...............................................................................................................69
Sortowanie wierszy za pomoc klauzuli ORDER BY .................................................................70
Instrukcje SELECT wykorzystujce dwie tabele .........................................................................71
Uywanie aliasw tabel ...............................................................................................................73
Iloczyny kartezjaskie .................................................................................................................74
Instrukcje SELECT wykorzystujce wicej ni dwie tabele ........................................................74
Warunki zczenia i typy zcze ................................................................................................76
Nierwnozczenia ................................................................................................................76
Zczenia rozszerzone ...........................................................................................................77
Zczenia wasne ...................................................................................................................81
Wykonywanie zcze za pomoc skadni SQL/92 .....................................................................82
Wykonywanie zcze wewntrznych dwch tabel z wykorzystaniem skadni SQL/92 .......82
Upraszczanie zcze za pomoc sowa kluczowego USING ...............................................83
Wykonywanie zcze wewntrznych obejmujcych wicej ni dwie tabele (SQL/92) .......84
Wykonywanie zcze wewntrznych z uyciem wielu kolumn (SQL/92) ...........................84
Wykonywanie zcze rozszerzonych z uyciem skadni SQL/92 ........................................85
Wykonywanie zcze wasnych z uyciem skadni SQL/92 ................................................86
Wykonywanie zcze krzyowych z uyciem skadni SQL/92 ...........................................87
Podsumowanie .............................................................................................................................87

Rozdzia 3. SQL*Plus ................................................................................................. 89


Przegldanie struktury tabeli .......................................................................................................89
Edycja instrukcji SQL .................................................................................................................90
Zapisywanie, odczytywanie i uruchamianie plikw ....................................................................92
Formatowanie kolumn .................................................................................................................95
Ustawianie rozmiaru strony .........................................................................................................97
Ustawianie rozmiaru wiersza .......................................................................................................97
Czyszczenie formatowania kolumny ...........................................................................................98
Uywanie zmiennych ..................................................................................................................98
Zmienne tymczasowe ............................................................................................................99
Zmienne zdefiniowane ........................................................................................................101
Tworzenie prostych raportw ....................................................................................................104
Uywanie zmiennych tymczasowych w skrypcie ................................................................104
Uywanie zmiennych zdefiniowanych w skrypcie ..............................................................105
Przesyanie wartoci do zmiennej w skrypcie .....................................................................105
Dodawanie nagwka i stopki .............................................................................................106
Obliczanie sum porednich ..................................................................................................108
Uzyskiwanie pomocy od SQL*Plus ..........................................................................................109
Automatyczne generowanie instrukcji SQL ..............................................................................110
Koczenie poczenia z baz danych i pracy SQL*Plus ............................................................111
Podsumowanie ...........................................................................................................................111

Spis treci

Rozdzia 4. Proste funkcje ....................................................................................... 113


Funkcje jednowierszowe ...........................................................................................................113
Funkcje znakowe .................................................................................................................114
Funkcje numeryczne ...........................................................................................................121
Funkcje konwertujce ..........................................................................................................125
Funkcje wyrae regularnych ..............................................................................................131
Funkcje agregujce ....................................................................................................................138
AVG() .................................................................................................................................138
COUNT() ............................................................................................................................139
MAX() i MIN() ...................................................................................................................140
STDDEV() ..........................................................................................................................140
SUM() .................................................................................................................................141
VARIANCE() .....................................................................................................................141
Grupowanie wierszy ..................................................................................................................141
Grupowanie wierszy za pomoc klauzuli GROUP BY .......................................................142
Nieprawidowe uycie funkcji agregujcych .......................................................................145
Filtrowanie grup wierszy za pomoc klauzuli HAVING .....................................................146
Jednoczesne uywanie klauzul WHERE i GROUP BY ......................................................147
Jednoczesne uywanie klauzul WHERE, GROUP BY i HAVING .....................................147
Podsumowanie ...........................................................................................................................148

Rozdzia 5. Skadowanie oraz przetwarzanie dat i czasu ............................................ 149


Proste przykady skadowania i pobierania dat ..........................................................................149
Konwertowanie typw DataGodzina za pomoc funkcji TO_CHAR() i TO_DATE() .............151
Konwersja daty i czasu na napis za pomoc funkcji TO_CHAR() ......................................151
Konwersja napisu na wyraenie DataGodzina za pomoc funkcji TO_DATE() .................155
Ustawianie domylnego formatu daty .......................................................................................158
Jak Oracle interpretuje lata dwucyfrowe? ..................................................................................159
Uycie formatu YY .............................................................................................................159
Uycie formatu RR ..............................................................................................................160
Funkcje operujce na datach i godzinach ..................................................................................161
ADD_MONTHS() ...............................................................................................................161
LAST_DAY() .....................................................................................................................163
MONTHS_BETWEEN() ....................................................................................................163
NEXT_DAY() .....................................................................................................................163
ROUND() ............................................................................................................................164
SYSDATE ...........................................................................................................................164
TRUNC() ............................................................................................................................165
Strefy czasowe ...........................................................................................................................165
Funkcje operujce na strefach czasowych ...........................................................................166
Strefa czasowa bazy danych i strefa czasowa sesji ..............................................................167
Uzyskiwanie przesuni strefy czasowej .............................................................................168
Uzyskiwanie nazw stref czasowych ....................................................................................168
Konwertowanie wyraenia DataGodzina z jednej strefy czasowej na inn .........................169
Datowniki (znaczniki czasu) ......................................................................................................169
Typy datownikw ................................................................................................................169
Funkcje operujce na znacznikach czasu ............................................................................173
Interway czasowe .....................................................................................................................178
Typ INTERVAL YEAR TO MONTH ................................................................................179
Typ INTERVAL DAY TO SECOND .................................................................................181
Funkcje operujce na interwaach .......................................................................................183
Podsumowanie ...........................................................................................................................184

Oracle Database 11g i SQL. Programowanie

Rozdzia 6. Podzapytania ......................................................................................... 187


Rodzaje podzapyta ...................................................................................................................187
Pisanie podzapyta jednowierszowych ......................................................................................188
Podzapytania w klauzuli WHERE .......................................................................................188
Uycie innych operatorw jednowierszowych ....................................................................189
Podzapytania w klauzuli HAVING .....................................................................................189
Podzapytania w klauzuli FROM (widoki wbudowane) .......................................................191
Bdy, ktre mona napotka ..............................................................................................191
Pisanie podzapyta wielowierszowych ......................................................................................192
Uycie operatora IN z podzapytaniem wielowierszowym ..................................................193
Uycie operatora ANY z podzapytaniem wielowierszowym ..............................................194
Uycie operatora ALL z podzapytaniem wielowierszowym ...............................................194
Pisanie podzapyta wielokolumnowych ....................................................................................195
Pisanie podzapyta skorelowanych ...........................................................................................195
Przykad podzapytania skorelowanego ................................................................................195
Uycie operatorw EXISTS i NOT EXISTS z podzapytaniem skorelowanym ..................196
Pisanie zagniedonych podzapyta ..........................................................................................199
Pisanie instrukcji UPDATE i DELETE zawierajcych podzapytania .......................................200
Pisanie instrukcji UPDATE zawierajcej podzapytanie ......................................................200
Pisanie instrukcji DELETE zawierajcej podzapytanie .......................................................201
Podsumowanie ...........................................................................................................................201

Rozdzia 7. Zapytania zaawansowane ....................................................................... 203


Operatory zestawu .....................................................................................................................203
Przykadowe tabele .............................................................................................................204
Operator UNION ALL ........................................................................................................205
Operator UNION .................................................................................................................206
Operator INTERSECT ........................................................................................................207
Operator MINUS .................................................................................................................207
czenie operatorw zestawu ..............................................................................................207
Uycie funkcji TRANSLATE() .................................................................................................209
Uycie funkcji DECODE() ........................................................................................................210
Uycie wyraenia CASE ...........................................................................................................212
Proste wyraenia CASE ......................................................................................................212
Przeszukiwane wyraenia CASE .........................................................................................213
Zapytania hierarchiczne .............................................................................................................215
Przykadowe dane ...............................................................................................................215
Zastosowanie klauzul CONNECT BY i START WITH .....................................................216
Uycie pseudokolumny LEVEL ..........................................................................................217
Formatowanie wynikw zapytania hierarchicznego ............................................................218
Rozpoczynanie od wza innego ni gwny .......................................................................219
Uycie podzapytania w klauzuli START WITH .................................................................219
Poruszanie si po drzewie w gr ........................................................................................220
Eliminowanie wzw i gazi z zapytania hierarchicznego ................................................220
Umieszczanie innych warunkw w zapytaniu hierarchicznym ...........................................221
Rozszerzone klauzule GROUP BY ...........................................................................................222
Przykadowe tabele .............................................................................................................222
Uycie klauzuli ROLLUP ..........................................................................................................224
Klauzula CUBE ...................................................................................................................226
Funkcja GROUPING() ........................................................................................................227
Klauzula GROUPING SETS ...............................................................................................230
Uycie funkcji GROUPING_ID() .......................................................................................231
Kilkukrotne uycie kolumny w klauzuli GROUP BY .........................................................233
Uycie funkcji GROUP_ID() ..............................................................................................233

Spis treci

9
Funkcje analityczne ...................................................................................................................235
Przykadowa tabela .............................................................................................................235
Uycie funkcji klasyfikujcych ...........................................................................................236
Uycie odwrotnych funkcji rankingowych ..........................................................................243
Uycie funkcji okna ............................................................................................................243
Funkcje raportujce .............................................................................................................249
Uycie funkcji LAG() i LEAD() .........................................................................................251
Uycie funkcji FIRST i LAST ............................................................................................252
Uycie funkcji regresji liniowej ..........................................................................................252
Uycie funkcji hipotetycznego rankingu i rozkadu ............................................................253
Uycie klauzuli MODEL ...........................................................................................................254
Przykad zastosowania klauzuli MODEL ............................................................................255
Dostp do komrek za pomoc zapisu pozycyjnego i symbolicznego ................................256
Uzyskiwanie dostpu do zakresu komrek za pomoc BETWEEN i AND ........................257
Siganie do wszystkich komrek za pomoc ANY i IS ANY .............................................257
Pobieranie biecej wartoci wymiaru za pomoc funkcji CURRENTV() .........................258
Uzyskiwanie dostpu do komrek za pomoc ptli FOR ....................................................259
Obsuga wartoci NULL i brakujcych ...............................................................................260
Modyfikowanie istniejcych komrek ................................................................................262
Uycie klauzul PIVOT i UNPIVOT ..........................................................................................263
Prosty przykad klauzuli PIVOT .........................................................................................263
Przestawianie w oparciu o wiele kolumn ............................................................................265
Uycie kilku funkcji agregujcych w przestawieniu ...........................................................266
Uycie klauzuli UNPIVOT .................................................................................................267
Podsumowanie ...........................................................................................................................268

Rozdzia 8. Zmienianie zawartoci tabeli .................................................................. 269


Wstawianie wierszy za pomoc instrukcji INSERT ..................................................................269
Pomijanie listy kolumn ........................................................................................................270
Okrelanie wartoci NULL dla kolumny .............................................................................271
Umieszczanie pojedynczych i podwjnych cudzysoww w wartociach kolumn .............271
Kopiowanie wierszy z jednej tabeli do innej .......................................................................271
Modyfikowanie wierszy za pomoc instrukcji UPDATE ..........................................................272
Klauzula RETURNING .............................................................................................................273
Usuwanie wierszy za pomoc instrukcji DELETE ....................................................................274
Integralno bazy danych ..........................................................................................................274
Wymuszanie wizw klucza gwnego ...............................................................................274
Wymuszanie wizw kluczy obcych ...................................................................................275
Uycie wartoci domylnych .....................................................................................................276
Scalanie wierszy za pomoc instrukcji MERGE .......................................................................277
Transakcje bazodanowe .............................................................................................................279
Zatwierdzanie i wycofywanie transakcji .............................................................................280
Rozpoczynanie i koczenie transakcji .................................................................................281
Punkty zachowania ..............................................................................................................281
ACID waciwoci transakcji .........................................................................................283
Transakcje wspbiene ......................................................................................................283
Blokowanie transakcji .........................................................................................................284
Poziomy izolacji transakcji ..................................................................................................285
Przykad transakcji SERIALIZABLE .................................................................................286
Zapytania retrospektywne ..........................................................................................................287
Przyznawanie uprawnie do uywania zapyta retrospektywnych .....................................288
Zapytania retrospektywne w oparciu o czas ........................................................................288
Zapytania retrospektywne z uyciem SCN ..........................................................................290
Podsumowanie ...........................................................................................................................291

10

Oracle Database 11g i SQL. Programowanie

Rozdzia 9. Uytkownicy, uprawnienia i role .............................................................. 293


Uytkownicy .............................................................................................................................293
Tworzenie konta uytkownika ............................................................................................294
Zmienianie hasa uytkownika ............................................................................................295
Usuwanie konta uytkownika ..............................................................................................295
Uprawnienia systemowe ............................................................................................................296
Przyznawanie uprawnie systemowych uytkownikowi .....................................................296
Sprawdzanie uprawnie systemowych przyznanych uytkownikowi .................................297
Zastosowanie uprawnie systemowych ...............................................................................298
Odbieranie uprawnie systemowych ...................................................................................298
Uprawnienia obiektowe .............................................................................................................299
Przyznawanie uytkownikowi uprawnie obiektowych ......................................................299
Sprawdzanie przekazanych uprawnie ................................................................................300
Sprawdzanie otrzymanych uprawnie obiektowych ...........................................................301
Zastosowanie uprawnie obiektowych ................................................................................303
Synonimy ............................................................................................................................303
Synonimy publiczne ............................................................................................................304
Odbieranie uprawnie obiektowych ....................................................................................305
Role ...........................................................................................................................................305
Tworzenie rl ......................................................................................................................306
Przyznawanie uprawnie roli ..............................................................................................306
Przyznawanie roli uytkownikowi ......................................................................................307
Sprawdzanie rl przyznanych uytkownikowi ....................................................................307
Sprawdzanie uprawnie systemowych przyznanych roli ....................................................308
Sprawdzanie uprawnie obiektowych przyznanych roli .....................................................308
Zastosowanie uprawnie przyznanych roli ..........................................................................310
Role domylne .....................................................................................................................310
Odbieranie roli ....................................................................................................................311
Odbieranie uprawnie roli ...................................................................................................311
Usuwanie roli ......................................................................................................................311
Obserwacja ................................................................................................................................311
Uprawnienia wymagane do przeprowadzania obserwacji ...................................................312
Przykady obserwacji ..........................................................................................................312
Perspektywy zapisu obserwacji ...........................................................................................314
Podsumowanie ...........................................................................................................................314

Rozdzia 10. Tworzenie tabel, sekwencji, indeksw i perspektyw ................................ 315


Tabele ........................................................................................................................................315
Tworzenie tabeli ..................................................................................................................315
Pobieranie informacji o tabelach .........................................................................................317
Uzyskiwanie informacji o kolumnach w tabeli ...................................................................318
Zmienianie tabeli .................................................................................................................319
Zmienianie nazwy tabeli .....................................................................................................328
Dodawanie komentarza do tabeli ........................................................................................328
Obcinanie tabeli ..................................................................................................................329
Usuwanie tabeli ...................................................................................................................329
Sekwencje ..................................................................................................................................329
Tworzenie sekwencji ...........................................................................................................329
Pobieranie informacji o sekwencjach ..................................................................................331
Uywanie sekwencji ............................................................................................................332
Wypenianie klucza gwnego z uyciem sekwencji ...........................................................334
Modyfikowanie sekwencji ..................................................................................................334
Usuwanie sekwencji ............................................................................................................335

Spis treci

11
Indeksy ......................................................................................................................................335
Tworzenie indeksu typu B-drzewo ......................................................................................336
Tworzenie indeksw opartych na funkcjach .......................................................................337
Pobieranie informacji o indeksach ......................................................................................338
Pobieranie informacji o indeksach kolumny .......................................................................338
Modyfikowanie indeksu ......................................................................................................339
Usuwanie indeksu ...............................................................................................................339
Tworzenie indeksu bitmapowego ........................................................................................339
Perspektywy ..............................................................................................................................340
Tworzenie i uywanie perspektyw ......................................................................................341
Modyfikowanie perspektywy ..............................................................................................348
Usuwanie perspektywy ........................................................................................................349
Archiwa migawek ......................................................................................................................349
Podsumowanie ...........................................................................................................................352

Rozdzia 11. Wprowadzenie do programowania w PL/SQL ........................................... 353


Bloki ..........................................................................................................................................354
Zmienne i typy ...........................................................................................................................355
Logika warunkowa ....................................................................................................................356
Ptle ...........................................................................................................................................356
Proste ptle ..........................................................................................................................357
Ptle WHILE .......................................................................................................................358
Ptle FOR ............................................................................................................................358
Kursory ......................................................................................................................................359
Krok 1. deklarowanie zmiennych przechowujcych wartoci kolumn ...........................359
Krok 2. deklaracja kursora .............................................................................................360
Krok 3. otwarcie kursora ................................................................................................360
Krok 4. pobieranie wierszy z kursora .............................................................................360
Krok 5. zamknicie kursora ............................................................................................361
Peny przykad product_cursor.sql .................................................................................361
Kursory i ptle FOR ............................................................................................................363
Instrukcja OPEN-FOR ........................................................................................................363
Kursory bez ograniczenia ....................................................................................................365
Wyjtki ......................................................................................................................................367
Wyjtek ZERO_DIVIDE ....................................................................................................368
Wyjtek DUP_VAL_ON_INDEX ......................................................................................369
Wyjtek INVALID_NUMBER ...........................................................................................370
Wyjtek OTHERS ...............................................................................................................370
Procedury ..................................................................................................................................371
Tworzenie procedury ...........................................................................................................371
Wywoywanie procedury ....................................................................................................373
Uzyskiwanie informacji o procedurach ...............................................................................374
Usuwanie procedury ............................................................................................................375
Przegldanie bdw w procedurze .....................................................................................375
Funkcje ......................................................................................................................................376
Tworzenie funkcji ...............................................................................................................376
Wywoywanie funkcji .........................................................................................................377
Uzyskiwanie informacji o funkcjach ...................................................................................378
Usuwanie funkcji .................................................................................................................378
Pakiety .......................................................................................................................................378
Tworzenie specyfikacji pakietu ...........................................................................................379
Tworzenie treci pakietu .....................................................................................................379
Wywoywanie funkcji i procedur z pakietu .........................................................................381
Uzyskiwanie informacji o funkcjach i procedurach w pakiecie ..........................................381
Usuwanie pakietu ................................................................................................................382

12

Oracle Database 11g i SQL. Programowanie


Wyzwalacze ...............................................................................................................................382
Kiedy uruchamiany jest wyzwalacz ....................................................................................382
Przygotowania do przykadu wyzwalacza ...........................................................................382
Tworzenie wyzwalacza .......................................................................................................383
Uruchamianie wyzwalacza ..................................................................................................385
Uzyskiwanie informacji o wyzwalaczach ...........................................................................386
Wczanie i wyczanie wyzwalacza ...................................................................................387
Usuwanie wyzwalacza ........................................................................................................387
Rozszerzenia PL/SQL wprowadzone w Oracle Database 11g ...................................................388
Typ SIMPLE_INTEGER ....................................................................................................388
Sekwencje w PL/SQL .........................................................................................................389
Generowanie natywnego kodu maszynowego z PL/SQL ....................................................390
Podsumowanie ...........................................................................................................................390

Rozdzia 12. Obiekty bazy danych .............................................................................. 393


Wprowadzenie do obiektw ......................................................................................................393
Tworzenie typw obiektowych ..................................................................................................394
Uzyskiwanie informacji o typach obiektowych za pomoc DESCRIBE ...................................395
Uycie typw obiektowych w tabelach bazy danych .................................................................397
Obiekty kolumnowe ............................................................................................................397
Tabele obiektowe ................................................................................................................399
Identyfikatory obiektw i odwoania obiektowe .................................................................403
Porwnywanie wartoci obiektw .......................................................................................405
Uycie obiektw w PL/SQL ......................................................................................................407
Funkcja get_products() ........................................................................................................408
Procedura display_product() ...............................................................................................409
Procedura insert_product() ..................................................................................................410
Procedura update_product_price() ......................................................................................410
Funkcja get_product() .........................................................................................................411
Procedura update_product() ................................................................................................412
Funkcja get_product_ref() ...................................................................................................412
Procedura delete_product() .................................................................................................413
Procedura product_lifecycle() .............................................................................................413
Procedura product_lifecycle2() ...........................................................................................414
Dziedziczenie typw ..................................................................................................................416
Uycie podtypu zamiast typu nadrzdnego ...............................................................................418
Przykady SQL ....................................................................................................................418
Przykady PL/SQL ..............................................................................................................419
Obiekty NOT SUBSTITUTABLE ......................................................................................420
Inne przydatne funkcje obiektw ...............................................................................................421
Funkcja IS OF() ...................................................................................................................421
Funkcja TREAT() ...............................................................................................................424
Funkcja SYS_TYPEID() .....................................................................................................427
Typy obiektowe NOT INSTANTIABLE ..................................................................................428
Konstruktory definiowane przez uytkownika ..........................................................................430
Przesanianie metod ...................................................................................................................433
Uoglnione wywoywanie .........................................................................................................435
Podsumowanie ...........................................................................................................................437

Rozdzia 13. Kolekcje ................................................................................................ 439


Podstawowe informacje o kolekcjach ........................................................................................439
Tworzenie kolekcji ....................................................................................................................440
Tworzenie typu VARRAY ..................................................................................................440
Tworzenie tabeli zagniedonej ..........................................................................................441

Spis treci

13
Uycie kolekcji do definiowania kolumny w tabeli ...................................................................441
Uycie typu VARRAY do zdefiniowania kolumny w tabeli ...............................................441
Uycie typu tabeli zagniedonej do zdefiniowania kolumny w tabeli ...............................442
Uzyskiwanie informacji o kolekcjach ........................................................................................442
Uzyskiwanie informacji o tablicy VARRAY ......................................................................442
Uzyskiwanie informacji o tabeli zagniedonej ..................................................................443
Umieszczanie elementw w kolekcji .........................................................................................445
Umieszczanie elementw w tablicy VARRAY ...................................................................445
Umieszczanie elementw w tabeli zagniedonej ...............................................................446
Pobieranie elementw z kolekcji ...............................................................................................446
Pobieranie elementw z tablicy VARRAY .........................................................................446
Pobieranie elementw z tabeli zagniedonej .....................................................................447
Uycie funkcji TABLE() do interpretacji kolekcji jako serii wierszy ........................................448
Uycie funkcji TABLE() z typem VARRAY ......................................................................448
Uycie funkcji TABLE() z tabel zagniedon .................................................................449
Modyfikowanie elementw kolekcji .........................................................................................450
Modyfikowanie elementw tablicy VARRAY ....................................................................450
Modyfikowanie elementw tabeli zagniedonej ................................................................450
Uycie metody mapujcej do porwnywania zawartoci tabel zagniedonych .......................451
Uycie funkcji CAST do konwersji kolekcji z jednego typu na inny ........................................454
Uycie funkcji CAST() do konwersji tablicy VARRAY na tabel zagniedon ...............454
Uycie funkcji CAST() do konwersji tabeli zagniedonej na tablic VARRAY ...............455
Uycie kolekcji w PL/SQL ........................................................................................................455
Manipulowanie tablic VARRAY .......................................................................................456
Manipulowanie tabel zagniedon ...................................................................................457
Metody operujce na kolekcjach w PL/SQL .......................................................................459
Kolekcje wielopoziomowe ........................................................................................................469
Rozszerzenia kolekcji wprowadzone w Oracle Database 10g ...................................................472
Tablice asocjacyjne .............................................................................................................472
Zmienianie rozmiaru typu elementu ....................................................................................473
Zwikszanie liczby elementw w tablicy VARRAY ..........................................................474
Uycie tablic VARRAY w tabelach tymczasowych ...........................................................474
Uycie innej przestrzeni tabel dla tabeli skadujcej tabel zagniedon ..........................474
Obsuga tabel zagniedonych w ANSI ..............................................................................475
Podsumowanie ...........................................................................................................................483

Rozdzia 14. Due obiekty .......................................................................................... 485


Podstawowe informacje o duych obiektach (LOB) .................................................................485
Przykadowe pliki ......................................................................................................................486
Rodzaje duych obiektw ..........................................................................................................486
Tworzenie tabel zawierajcych due obiekty ............................................................................487
Uycie duych obiektw w SQL ...............................................................................................488
Uycie obiektw CLOB i BLOB .........................................................................................488
Uycie obiektw BFILE ......................................................................................................490
Uycie duych obiektw w PL/SQL .........................................................................................492
APPEND() ...........................................................................................................................494
CLOSE() .............................................................................................................................495
COMPARE() .......................................................................................................................495
COPY() ...............................................................................................................................496
CREATETEMPORARY() ..................................................................................................497
ERASE() .............................................................................................................................498
FILECLOSE() .....................................................................................................................499
FILECLOSEALL() .............................................................................................................499
FILEEXISTS() ....................................................................................................................499

14

Oracle Database 11g i SQL. Programowanie


FILEGETNAME() ..............................................................................................................500
FILEISOPEN() ....................................................................................................................500
FILEOPEN() .......................................................................................................................501
FREETEMPORARY() ........................................................................................................501
GETCHUNKSIZE() ............................................................................................................502
GET_STORAGE_LIMIT() .................................................................................................502
GETLENGTH() ..................................................................................................................502
INSTR() ..............................................................................................................................503
ISOPEN() ............................................................................................................................504
ISTEMPORARY() ..............................................................................................................505
LOADFROMFILE() ...........................................................................................................505
LOADBLOBFROMFILE() .................................................................................................506
LOADCLOBFROMFILE() .................................................................................................507
OPEN() ................................................................................................................................508
READ() ...............................................................................................................................509
SUBSTR() ...........................................................................................................................510
TRIM() ................................................................................................................................511
WRITE() .............................................................................................................................512
WRITEAPPEND() ..............................................................................................................512
Przykadowe procedury PL/SQL .........................................................................................513
Typy LONG i LONG RAW ......................................................................................................529
Przykadowe tabele .............................................................................................................530
Wstawianie danych do kolumn typu LONG i LONG RAW ...............................................530
Przeksztacanie kolumn LONG i LONG RAW w due obiekty ..........................................531
Nowe waciwoci duych obiektw w Oracle Database 10g ...................................................531
Niejawna konwersja midzy obiektami CLOB i NCLOB ...................................................532
Uycie atrybutu :new, gdy obiekt LOB jest uywany w wyzwalaczu .................................533
Nowe waciwoci duych obiektw w Oracle Database 11g ...................................................533
Szyfrowanie danych LOB ...................................................................................................534
Kompresja danych LOB ......................................................................................................537
Usuwanie powtarzajcych si danych LOB ........................................................................538
Podsumowanie ...........................................................................................................................538

Rozdzia 15. Praca z SQL w Javie ............................................................................... 541


Zaczynamy ................................................................................................................................541
Konfigurowanie komputera .......................................................................................................542
Ustawianie zmiennej rodowiska ORACLE_HOME ..........................................................542
Ustawianie zmiennej rodowiska JAVA_HOME ................................................................543
Ustawianie zmiennej rodowiska PATH .............................................................................543
Ustawianie zmiennej rodowiska CLASSPATH .................................................................544
Ustawianie zmiennej rodowiska LD_LIBRARY_PATH ..................................................544
Sterowniki Oracle JDBC ...........................................................................................................545
Sterownik Thin ....................................................................................................................545
Sterownik OCI ....................................................................................................................545
Sterownik wewntrzny po stronie serwera ..........................................................................546
Sterownik Thin po stronie serwera ......................................................................................546
Importowanie pakietw JDBC ..................................................................................................546
Rejestrowanie sterownikw Oracle JDBC .................................................................................547
Otwieranie poczenia z baz danych ........................................................................................547
Poczenie z baz danych za pomoc getConnection() .......................................................547
URL bazy danych ................................................................................................................548
Poczenie z baz danych za pomoc rda danych Oracle ...............................................549
Tworzenie obiektu JDBC Statement ..........................................................................................552

Spis treci

15
Pobieranie wierszy z bazy danych .............................................................................................553
Krok 1: Tworzenie obiektu ResultSet i umieszczanie w nim danych ..................................553
Krok 2: Odczyt wartoci kolumn z obiektu ResultSet .........................................................554
Krok 3: Zamknicie obiektu ResultSet ................................................................................556
Wstawianie wierszy do bazy danych .........................................................................................557
Modyfikowanie wierszy w bazie danych ...................................................................................558
Usuwanie wierszy z bazy danych ..............................................................................................558
Obsuga liczb .............................................................................................................................559
Obsuga wartoci NULL z bazy danych ....................................................................................560
Sterowanie transakcjami bazy danych .......................................................................................562
Wykonywanie instrukcji Data Definition Language ..................................................................563
Obsuga wyjtkw .....................................................................................................................563
Zamykanie obiektw JDBC .......................................................................................................565
Przykadowy program: BasicExample1.java .............................................................................566
Kompilacja BasicExample1 ................................................................................................570
Uruchamianie programu BasicExample1 ............................................................................570
Przygotowane instrukcje SQL ...................................................................................................572
Przykadowy program: BasicExample2.java .............................................................................574
Rozszerzenia Oracle JDBC ........................................................................................................576
Pakiet oracle.sql ..................................................................................................................577
Pakiet oracle.jdbc ................................................................................................................580
Przykadowy program: BasicExample3.java .......................................................................584
Podsumowanie ...........................................................................................................................586

Rozdzia 16. Optymalizacja SQL ................................................................................. 587


Podstawowe informacje o optymalizacji SQL ...........................................................................587
Naley filtrowa wiersze za pomoc klauzuli WHERE .............................................................587
Naley uywa zcze tabel zamiast wielu zapyta .................................................................588
Wykonujc zczenia, naley uywa w peni kwalifikowanych odwoa do kolumn ..............589
Naley uywa wyrae CASE zamiast wielu zapyta .............................................................590
Naley doda indeksy do tabel ..................................................................................................591
Naley stosowa klauzul WHERE zamiast HAVING .............................................................592
Naley uywa UNION ALL zamiast UNION .........................................................................593
Naley uywa EXISTS zamiast IN ..........................................................................................594
Naley uywa EXISTS zamiast DISTINCT ............................................................................595
Naley uywa GROUPING SETS zamiast CUBE ..................................................................596
Naley stosowa zmienne dowizane ........................................................................................596
Nieidentyczne instrukcje SQL .............................................................................................596
Identyczne instrukcje SQL korzystajce ze zmiennych dowizanych .................................597
Wypisywanie listy i wartoci zmiennych dowizanych ......................................................598
Uycie zmiennej dowizanej
do skadowania wartoci zwrconej przez funkcj PL/SQL .............................................598
Uycie zmiennej dowizanej do skadowania wierszy z REFCURSOR .............................598
Porwnywanie kosztu wykonania zapyta ................................................................................599
Przegldanie planw wykonania .........................................................................................600
Porwnywanie planw wykonania ......................................................................................605
Przesyanie wskazwek do optymalizatora ................................................................................606
Dodatkowe narzdzia optymalizujce .......................................................................................608
Oracle Enterprise Manager Diagnostics Pack .....................................................................608
Automatic Database Diagnostic Monitor ............................................................................608
Podsumowanie ...........................................................................................................................609

16

Oracle Database 11g i SQL. Programowanie

Rozdzia 17. XML i baza danych Oracle ...................................................................... 611


Wprowadzenie do XML ............................................................................................................611
Generowanie XML z danych relacyjnych .................................................................................612
XMLELEMENT() ...............................................................................................................612
XMLATTRIBUTES() .........................................................................................................615
XMLFOREST() ..................................................................................................................615
XMLAGG() .........................................................................................................................617
XMLCOLATVAL() ............................................................................................................619
XMLCONCAT() .................................................................................................................620
XMLPARSE() .....................................................................................................................620
XMLPI() ..............................................................................................................................621
XMLCOMMENT() .............................................................................................................621
XMLSEQUENCE() ............................................................................................................622
XMLSERIALIZE() .............................................................................................................623
Przykad zapisywania danych XML do pliku w PL/SQL ....................................................623
XMLQUERY() ....................................................................................................................625
Zapisywanie XML w bazie danych ...........................................................................................629
Przykadowy plik XML .......................................................................................................629
Tworzenie przykadowego schematu XML .........................................................................630
Pobieranie informacji z przykadowego schematu XML ....................................................632
Aktualizowanie informacji w przykadowym schemacie XML ..........................................636
Podsumowanie ...........................................................................................................................639

Dodatek A Typy danych Oracle ................................................................................ 641


Typy w Oracle SQL ...................................................................................................................641
Typy w Oracle PL/SQL .............................................................................................................643

Skorowidz .............................................................................................. 645

Rozdzia 4.

Proste funkcje
W tym rozdziale poznasz kilka wbudowanych funkcji bazy danych Oracle. Funkcja przyjmuje
zero lub wicej parametrw i zwraca parametr. W bazie danych Oracle wystpuj dwa gwne
typy funkcji:
Funkcje jednowierszowe operuj na jednym wierszu i zwracaj jeden wiersz wynikw
dla kadego wiersza na wejciu. Przykadem funkcji jednowierszowej jest CONCAT(x, y),
ktra docza y do x i zwraca powstay napis.
Funkcje agregujce operuj na kilku wierszach jednoczenie i zwracaj jeden wiersz
wynikw. Przykadem funkcji agregujcej jest AVG(x), ktra zwraca redni x,
gdzie x moe by kolumn lub dowolnym wyraeniem.

Zaczn od omwienia funkcji jednowierszowych, a nastpnie przejdziemy do funkcji agregujcych. W dalszej czci ksiki zostan przedstawione bardziej zoone funkcje.

Funkcje jednowierszowe
Funkcja jednowierszowa operuje na jednym wierszu i zwraca jeden wiersz wynikw dla kadego wiersza na wejciu. Wystpuje pi gwnych typw funkcji jednowierszowych:
funkcje znakowe manipuluj napisami,
funkcje numeryczne wykonuj obliczenia,
funkcje konwertujce konwertuj warto z jednego typu na inny,
funkcje dat przetwarzaj daty i czas,
funkcje wyrae regularnych wykorzystuj wyraenia regularne do wyszukiwania

danych; zostay wprowadzone w Oracle Database 10g i rozwinite w 11g.


Rozpoczniemy od omwienia funkcji znakowych, a nastpnie przejdziemy do numerycznych,
konwertujcych oraz wyrae regularnych. Funkcje dat zostan opisane w nastpnym rozdziale.

114

Oracle Database 11g i SQL. Programowanie

Funkcje znakowe
Funkcje znakowe przyjmuj wejcie znakowe, ktre moe pochodzi z kolumny tabeli lub
z dowolnego wyraenia. Dane wejciowe s przetwarzane i jest zwracany wynik. Przykadem
funkcji znakowej jest UPPER(), ktra zwraca napis wejciowy po przeksztaceniu na wielkie
litery. Innym przykadem jest NVL(), ktra konwertuje warto NULL na inn. W tabeli 4.1,
w ktrej zostay opisane niektre funkcje znakowe, oraz we wszystkich kolejnych definicjach
skadni x i y mog reprezentowa kolumny tabeli lub dowolne poprawne wyraenie.
W kolejnych podrozdziaach zostan dokadniej opisane funkcje wymienione w tabeli 4.1.

ASCII() i CHAR()
Funkcja ASCII(x) zwraca kod ASCII znaku x. Funkcja CHR(x) zwraca znak o kodzie ASCII x.
Ponisze zapytanie pobiera za pomoc funkcji ASCII() kody ASCII znakw a, A, z, Z, 0 i 9:
SELECT ASCII('a'), ASCII('A'), ASCII('z'), ASCII('Z'), ASCII(0), ASCII(9)
FROM dual;
ASCII('A') ASCII('A') ASCII('Z') ASCII('Z')
ASCII(0)
ASCII(9)
---------- ---------- ---------- ---------- ---------- ---------97
65
122
90
48
57

W tym zapytaniu wykorzystano tabel dual. Zawiera ona jeden wiersz, za pomoc ktrego
moemy wykonywa zapytania niewykorzystujce adnej konkretnej tabeli.

Ponisze zapytanie pobiera za pomoc funkcji CHR() znaki o kodach ASCII 97, 65, 122, 90,
48 i 57:
SELECT CHR(97), CHR(65), CHR(122), CHR(90), CHR(48), CHR(57)
FROM dual;
C C C C C C
- - - - - a A z Z 0 9

Znaki zwrcone przez funkcj CHR() s tymi samymi, ktre byy przesyane do funkcji ASCII()
w poprzednim zapytaniu. Funkcje CHR() i ASCII() maj zatem przeciwne dziaanie.

CONCAT()
Funkcja CONCAT(x, y) docza y do x i zwraca nowy napis.
Ponisze zapytanie docza za pomoc funkcji CONCAT() warto z kolumny last_name do
wartoci z kolumny first_name:
SELECT CONCAT(first_name, last_name)
FROM customers;
CONCAT(FIRST_NAME,LA
--------------------

Rozdzia 4. Proste funkcje

115

Tabela 4.1. Funkcje znakowe


Funkcja

Opis

ASCII(x)

Zwraca kod ASCII znaku x

CHR(x)

Zwraca znak kodzie ASCII x

CONCAT(x, y)

Docza y do x i zwraca powstay napis

INITCAP(x)

Przeksztaca pierwsz liter kadego sowa w x na wielk i zwraca nowy napis

INSTR(x, szukany_napis
[, start] [, wystpienie])

Wyszukuje w x napis szukany_napis i zwraca pozycj, w ktrej on wystpuje.


Mona przesa opcjonalny parametr start, okrelajcy pozycj, od ktrej
rozpocznie si wyszukiwanie. Ponadto mona przesa opcjonalny parametr
wystpienie, okrelajcy, ktre wystpienie szukany_napis zostanie zwrcone

LENGTH(x)

Zwraca liczb znakw w x

LOWER(x)

Przeksztaca litery w x na mae i zwraca nowy napis

LPAD(x, szeroko,
[napis_dopenienia])

Dopenia x znakami spacji po lewej stronie, aby uzyska cakowit dugo


napisu rwn szeroko. Mona przesa opcjonalny parametr napis_dopenienia,
okrelajcy napis, ktry bdzie powtarzany po lewej stronie x w celu wypenienia
dopenianego obszaru. Zwracany jest dopeniony napis

LTRIM (x
[, napis_przycinany])

Usuwa znaki znajdujce si po lewej stronie x. Mona przesa opcjonalny


parametr napis_przycinany, okrelajcy znaki, ktre zostan usunite. Jeeli
ten parametr nie zostanie przesany, domylnie usuwane bd znaki spacji

NANVL(x, warto)

Zwraca warto, jeeli x jest wartoci specjaln NAN (nieliczb). (Ta funkcja
zostaa wprowadzona w Oracle Database 10g)

NVL(x, warto)

Zwraca warto, jeeli x to NULL. W przeciwnym razie zwraca x

NVL2(x, warto1, warto2)

Zwraca warto1, jeeli x to nie NULL. W przeciwnym razie zwraca warto2

REPLACE(x, szukany_napis,
napis_zastpujcy)

Wyszukuje w x napis szukany_napis i zastpuje go napisem napis_zastpujcy

RPAD(x, szeroko
[, napis_dopenienia])

Dziaa tak samo jak LPAD(), ale x jest dopeniane po prawej stronie

RTRIM(x,
[, napis_przycinany]

Dziaa tak samo jak LTRIM(), ale x jest przycinane z prawej strony

SOUNDEX(x)

Zwraca napis zawierajcy fonetyczn reprezentacj x. To umoliwia


porwnywanie sw, ktre podobnie brzmi w jzyku angielskim, ale ich
pisownia jest inna

SUBSTR(x, start [, dugo]

Zwraca podnapis napisu x, rozpoczynajcy si w pozycji okrelonej przez


start. Mona przesa opcjonalny parametr dugo, okrelajcy dugo
podnapisu

TRIM([usuwany_znak FROM] x)

Usuwa znaki po obu stronach x. Mona przesa opcjonalny parametr


usuwany_znak, okrelajcy znak do usunicia. Jeeli parametr ten nie zostanie
przesany, domylnie zostan usunite znaki spacji

UPPER(x)

Zmienia litery w x na wielkie i zwraca nowy napis


JanNikiel
LidiaStal
StefanBrz
GraynaCynk
JadwigaMosidz

116

Oracle Database 11g i SQL. Programowanie

Dziaanie funkcji CONCAT() jest takie samo jak operatora ||, ktry zosta opisany w rozdziale 2.

INITCAP()
Funkcja INITCAP(x) zmienia pierwsz liter kadego sowa w x na wielk.
Ponisze zapytanie pobiera kolumny product_id i description z tabeli products, a nastpnie za
pomoc funkcji INITCAP() zmienia pierwsz liter kadego sowa w description na wielk:
SELECT product_id, INITCAP(description)
FROM products
WHERE product_id < 4;
PRODUCT_ID
---------1
2
3

INITCAP(DESCRIPTION)
-------------------------------------------------Opis Wspczesnej Nauki
Wprowadzenie Do Chemii
Eksplozja Gwiazdy

INSTR()
Funkcja INSTR(x, szukany_napis [, start] [, wystpienie]) wyszukuje w x napis szukany_
napis i zwraca pozycj, na ktrej si on znajduje. Mona przesa opcjonalny argument start,
okrelajcy pozycj rozpoczcia wyszukiwania. Mona rwnie przesa opcjonalny parametr
wystpienie, okrelajcy, ktre wystpienie napisu szukany_napis zostanie zwrcone.
Ponisze zapytanie pobiera pozycj, na ktrej znajduje si napis wspczesna w kolumnie name
pierwszego produktu:
SELECT name, INSTR(name, 'wspczesna')
FROM products
WHERE product_id = 1;
NAME
INSTR(NAME,'WSPCZESNA')
------------------------------ ------------------------Nauka wspczesna
7

Kolejne zapytanie wywietla pozycj, na ktrej znajduje si drugie wystpienie znaku a, rozpoczynajc od pocztku nazwy produktu:
SELECT name, INSTR(name, 'a', 1, 2)
FROM products
WHERE product_id = 1;
NAME
INSTR(NAME,'A',1,2)
------------------------------ ------------------Nauka wspczesna
5

Drugie e w tytule Nauka wspczesna znajduje si na pitej pozycji.


Funkcje znakowe mog rwnie operowa na datach. Ponisze zapytanie pobiera pozycj, na
ktrej znajduje si napis STY w kolumnie dob klienta nr 1:

Rozdzia 4. Proste funkcje

117

SELECT customer_id, dob, INSTR(dob, 'STY')


FROM customers
WHERE customer_id = 1;
CUSTOMER_ID DOB
INSTR(DOB,'STY')
----------- --------- ---------------1 01-STY-65
4

LENGTH()
Funkcja LENGTH(x) zwraca liczb znakw w x. Ponisze zapytanie za pomoc tej funkcji pobiera
dugo napisw w kolumnie name tabeli products:
SELECT name, LENGTH(name)
FROM products;
NAME
LENGTH(NAME)
------------------------------ -----------Nauka wspczesna
17
Chemia
6
Supernowa
9
Wojny czogw
13
Z Files
7
2412: Powrt
12
Space Force 9
13
Z innej planety
15
Muzyka klasyczna
16
Pop 3
5
Twrczy wrzask
14
Pierwsza linia
14

Kolejne zapytanie pobiera cakowit liczb znakw skadajcych si na cen produktu (kolumna
price). Naley zwrci uwag, e separator dziesitny (,) jest liczony jako znak w kolumnie
price:
SELECT price, LENGTH(price)
FROM products
WHERE product_id < 3;
PRICE LENGTH(PRICE)
---------- ------------19,95
5
30
2

LOWER() i UPPER()
Funkcja LOWER(x) zmienia litery w x na mae. Funkcja UPPER(x) zmienia natomiast litery w x na
wielkie.
Ponisze zapytanie zmienia litery w napisach z kolumny first_name na wielkie, a litery z napisw z kolumny last_name na mae:
SELECT UPPER(first_name), LOWER(last_name)
FROM customers;

118

Oracle Database 11g i SQL. Programowanie


UPPER(FIRS
---------JAN
LIDIA
STEFAN
GRAYNA
JADWIGA

LOWER(LAST
---------nikiel
stal
brz
cynk
mosidz

LPAD() i RPAD()
Funkcja LPAD(x, szeroko, [napis_dopenienia]) dopenia lew stron x znakami spacji, aby
uzupeni dugo napisu x do szeroko znakw. Mona przesa opcjonalny parametr napis_
dopenienia, ktry okrela napis powtarzany po lewej stronie napisu x w celu dopenienia go.
Zwracany jest dopeniony acuch. Funkcja RPAD(x, szeroko, [napis_dopenienia]) dopenia
praw stron napisu x.
Ponisze zapytanie pobiera kolumny name i price z tabeli products. Kolumna name jest dopeniana po prawej stronie za pomoc funkcji RPAD() do dugoci 30 znakw. Dopenienie jest
wypeniane kropkami. Kolumna price jest dopeniana po lewej stronie za pomoc funkcji LPAD
do dugoci 8 znakw. Dopenienie jest wypeniane napisem *+:
SELECT RPAD(name, 30, '.'), LPAD(price, 8, '*+')
FROM products
WHERE product_id < 4;
RPAD(NAME,30,'.')
-----------------------------------------------Nauka wspczesna.............
Chemia........................
Supernowa.....................

LPAD(PRICE,8,'*+')
---------*+*19,95
*+*+*+30
*+*25,99

Z tego przykadu wynika, e funkcje znakowe mog operowa na liczbach. Kolumna price
zawiera liczb, ktra zostaa dopeniona po lewej stronie przez funkcj LPAD().

LTRIM(), RTRIM() i TRIM()


Funkcja LTRIM (x [, napis_przycinany]) suy do usuwania znakw z lewej strony x. Mona
przesa opcjonalny parametr okrelajcy, ktre znaki maj zosta usunite. Jeeli parametr ten
nie zostanie przesany, bd domylnie usuwane znaki spacji. Funkcja RTRIM() suy natomiast
do usuwania znakw po prawej stronie x, TRIM() do usuwania znakw z lewej i prawej
strony x. Wszystkie trzy funkcje zostay wykorzystane w poniszym zapytaniu:
SELECT
LTRIM('
Cze Edwardzie Nencki!'),
RTRIM('Cze Ryszardzie Spacki!abcabc', 'abc'),
TRIM('0' FROM '000Cze Mario Tupska!0000')
FROM dual;
LTRIM('CZEEDWARDZIENENC RTRIM('CZERYSZARDZIESPAC TRIM('0'FROM'000CZE
------------------------- -------------------------- --------------------Cze Edwardzie Nencki!
Cze Ryszardzie Spacki!
Cze Mario Tupska!

Rozdzia 4. Proste funkcje

119

NVL()
Funkcja NVL() konwertuje warto NULL na inn. NVL(x, warto) zwraca warto, jeeli
x wynosi NULL. W przeciwnym razie zwraca x.
Ponisze zapytanie pobiera kolumny customer_id i phone z tabeli customers. Wartoci NULL
w kolumnie phone s przeksztacane za pomoc funkcji NVL() na Nieznany numer telefonu:
SELECT customer_id, NVL(phone, 'Nieznany numer telefonu')
FROM customers;
CUSTOMER_ID
----------1
2
3
4
5

NVL(PHONE,'NIEZNANYNUME
----------------------800-555-1211
800-555-1212
800-555-1213
800-555-1214
Nieznany numer telefonu

Warto z kolumny phone dla klienta nr 5 zostaa przeksztacona na Nieznany numer telefonu,
poniewa w tym wierszu kolumna phone ma warto NULL.

NVL2()
Funkcja NVL2(x, warto1, warto2) zwraca warto1, jeeli x to nie NULL. W przeciwnym
razie zwracana jest warto2.
Ponisze zapytanie pobiera kolumny customer_id i phone z tabeli customers. Wartoci inne ni
NULL w kolumnie phone s konwertowane na napis Znany, a wartoci NULL na napis Nieznany:
SELECT customer_id, NVL2(phone, 'Znany', 'Nieznany')
FROM customers;
CUSTOMER_ID
----------1
2
3
4
5

NVL2(PHON
--------Znany
Znany
Znany
Znany
Nieznany

Wartoci kolumny phone zostay przeksztacone na Znane w przypadku klientw od 1. do 4.,


poniewa w tych wierszach wartoci kolumny s rne od NULL. W przypadku klienta nr
5 warto jest konwertowana na Nieznany, poniewa w tym wierszu w kolumnie phone wystpuje warto NULL.

REPLACE()
Funkcja REPLACE(x, szukany_napis, napis_zastpujcy) wyszukuje w x napis szukany_napis
i zastpuje go napisem napis_zastpujcy.
Poniszy przykad pobiera z tabeli products kolumn name dla produktu nr 1 (ktrego nazwa to
Nauka wspczesna) i zastpuje za pomoc funkcji REPLACE() napis Nauka acuchem Fizyka:

120

Oracle Database 11g i SQL. Programowanie


SELECT REPLACE(name, 'Nauka', 'Fizyka')
FROM products
WHERE product_id = 1;
REPLACE(NAME,'NAUKA','FIZYKA')
-----------------------------------------------Fizyka wspczesna

Funkcja REPLACE() nie modyfikuje zawartoci wiersza w bazie danych, a jedynie wiersz zwracany przez funkcj.

SOUNDEX()
Funkcja SOUNDEX(x) zwraca napis zawierajcy fonetyczn reprezentacj x. To umoliwia porwnywanie sw, ktre brzmi podobnie w jzyku angielskim, lecz maj inn pisowni.

SUBSTR()
Funkcja SUBSTR(x, start [, dugo] zwraca podnapis napisu x, rozpoczynajcy si w pozycji
okrelonej przez start. Mona przesa opcjonalny parametr dugo, okrelajcy dugo
podnapisu.
Ponisze zapytanie wykorzystuje funkcj SUBSTR() do pobrania 7-znakowego podacucha
rozpoczynajcego si od pozycji 2. w kolumnie name tabeli products:
SELECT SUBSTR(name, 2, 7)
FROM products
WHERE product_id < 4;
SUBSTR(NAME,2,7)
---------------------------auka ws
hemia
upernow

Uywanie wyrae z funkcjami


W funkcjach moemy wykorzystywa nie tylko kolumny. Mona przesa dowolne poprawne
wyraenie, ktre zwraca napis. Ponisze zapytanie wykorzystuje funkcj SUBSTR() do pobrania
podnapisu ma z napisu Marysia miaa ma owieczk:
SELECT SUBSTR('Marysia miaa ma owieczk', 15, 4)
FROM dual;
SUBSTR
-----ma

czenie funkcji
W instrukcji SQL mona zastosowa dowoln prawidow kombinacj funkcji. Ponisze zapytanie
czy funkcje UPPER() i SUBSTR(). Wyjcie funkcji SUBSTR() jest przesyane do funkcji UPPER():

Rozdzia 4. Proste funkcje

121

SELECT name, UPPER(SUBSTR(name, 2, 8))


FROM products
WHERE product_id < 4;
NAME
-----------------------------Nauka wspczesna
Chemia
Supernowa

UPPER(SUBSTR(NAME,2,8))
-------------------------------AUKA WSP
HEMIA
UPERNOWA

Moliwo czenia funkcji nie jest ograniczona do funkcji znakowych mona czy
z sob funkcje rnego typu.

Funkcje numeryczne
Funkcje numeryczne su do wykonywania oblicze. Przyjmuj one liczb pochodzc
z kolumny lub dowolnego wyraenia, ktrego wynikiem jest liczba. Nastpnie s wykonywane
obliczenia i jest zwracana liczba. Przykadem funkcji numerycznej jest SQRT(x), ktra zwraca
pierwiastek kwadratowy x.
W tabeli 4.2 opisano niektre funkcje numeryczne.
Tabela 4.2. Funkcje numeryczne
Funkcja

Opis

Przykady

ABS(x)

Zwraca warto absolutn x

ABS(10) = 10
ABS(-10) = 10

ACOS(x)

Zwraca arcus cosinus x

ACOS(1) = 0
ACOS(-1) = 3,14159265

ASIN(x)

Zwraca arcus sinus x

ASIN(1) = 1,57079633
ASIN(-1) = -1,57079633

ATAN(x)

Zwraca arcus tangens x

ATAN(1) = 0,785398163
ATAN(-1) = -0,78539816

ATAN2(x, y)

Zwraca arcus tangens x i y

ATAN2(1, -1) = 2,35619449

BITAND(x, y)

Zwraca wynik bitowego AND dla x i y

BITAND(0, 0)
BITAND(0, 1)
BITAND(1, 0)
BITAND(1, 1)
NITAND(1010,

COS(x)

Zwraca cosinus x, gdzie x jest ktem wyraonym


w radianach

COS(90 * 3.1415926) = 1
COS(45 * 3.1415926) = -1

= 0
= 0
= 0
= 1
1100) = 64

COSH(x)

Zwraca cosinus hiperboliczny x

COSH(3.1415926) = 11,5919527

CEIL(x)

Zwraca najmniejsz liczb cakowit wiksz lub rwn x

CEIL(5.8) = 6
CEIL(-5.2) = -5

EXP(x)

Zwraca wynik podniesienia liczby e do potgi x,


gdzie e w przyblieniu wynosi 2,71828183

EXP(1) = 2,71828183

Zwraca najwiksz liczb cakowit mniejsz lub rwn x

FLOOR(5.8) = 5
FLOOR(-5.2) = 6

FLOOR(x)

EXP(2) = 7,3890561

122

Oracle Database 11g i SQL. Programowanie

Tabela 4.2. Funkcje numeryczne cig dalszy


Funkcja

Opis

Przykady

LOG(x, y)

Zwraca logarytm o podstawie x liczby y

LOG(2, 4) = 2
LOG(2, 5) = 2,32192809

LN(x)

Zwraca logarytm naturalny liczby x

LN(2.71828183) = 1

MOD(x, y)

Zwraca reszt z dzielenia x przez y

MOD(8, 3) = 2
MOD(8, 4) = 0

POWER(x, y)

Zwraca wynik podniesienia liczby x do potgi y

POWER(2, 1) = 2
POWER(2, 3) = 8

ROUND(x [, y])

Zwraca wynik zaokrglenia liczby x do opcjonalnej


liczby y miejsc po przecinku. Jeeli y zostanie pominita,
x jest zaokrglana do 0 miejsc po przecinku. Jeeli y jest
liczb ujemn, x jest zaokrglana po lewej stronie
separatora dziesitnego

ROUND(5.75) = 6
ROUND(5.75, 1) = 5,8
ROUND(5.75, -1) = 10

SIGN(x)

Zwraca 1, jeeli x jest liczb ujemn, 1, jeeli jest liczb


dodatni, lub 0, jeli x to zero

SIGN(-5) = -1
SIGN(5) = 1
SIGN(0) = 0

SIN(x)

Zwraca sinus liczby x

SIN(0) = 0

SINH(x)

Zwraca sinus hiperboliczny liczby x

SINH(1) = 1,17520119

SQRT(x)

Zwraca pierwiastek kwadratowy liczby x

SQRT(25) = 5
SQRT(5) = 2,23606798

TAN(x)

Zwraca tangens liczby x

TAN(0) = 0

TANH(x)

Zwraca tangens hiperboliczny liczby x

TANH(1) = 0,761594156

TRUNC(x [, y])

Zwraca wynik obcicia liczby x do opcjonalnych y miejsc


dziesitnych. Jeeli y nie zostanie okrelona, x zostanie
przycita do zera miejsc dziesitnych. Jeeli y jest liczb
ujemn, x bdzie przycinana po lewej stronie separatora
dziesitnego

TRUNC(5.75) = 5
TRUNC(5.75, 1) = 5,7
TRUNC(5.75, -1) = 0

Cz z funkcji wymienionych w tabeli 4.2 zostanie opisana dokadniej w kolejnych podrozdziaach.

ABS()
Funkcja ABS(x) oblicza warto absolutn liczby x. Warto absolutna liczby jest t sam
liczb, ale bez adnego znaku (dodatniego lub ujemnego). Ponisze zapytanie pobiera wartoci
absolutne liczb 10 i 10:
SELECT ABS(10), ABS(-10)
FROM dual;
ABS(10)
ABS(-10)
---------- ---------10
10

Warto absolutna liczby 10 wynosi 10, a warto absolutna liczby 10 rwnie wynosi 10.

Rozdzia 4. Proste funkcje

123

Parametry przesyane do funkcji numerycznych nie musz by literaami liczbowymi. Dane


wejciowe mog rwnie pochodzi z kolumny liczbowej w tabeli lub kadego poprawnego
wyraenia. Ponisze zapytanie pobiera wartoci absolutne liczb obliczonych przez odjcie 30 od
wartoci kolumny price tabeli products dla pierwszych trzech produktw:
SELECT product_id, price, price - 30, ABS(price - 30)
FROM products
WHERE product_id < 4;
PRODUCT_ID
PRICE
PRICE-30 ABS(PRICE-30)
---------- ---------- ---------- ------------1
19,95
-10,05
10,05
2
30
0
0
3
25,99
-4,01
4,01

CEIL()
Funkcja CEIL(x) zwraca najmniejsz liczb cakowit rwn x lub wiksz. Ponisze zapytanie
oblicza za pomoc funkcji CEIL() sufit (powa) liczb 5,8 i 5,2:
SELECT CEIL(5.8), CEIL(-5.2)
FROM dual;
CEIL(5.8) CEIL(-5.2)
---------- ---------6
-5

Sufit liczby 5,8 wynosi 6, poniewa 6 jest najmniejsz liczb cakowit wiksz od 5,8. Sufit
liczby 5,2 wynosi 5, poniewa 5,2 jest liczb ujemn, a najmniejsza wiksza liczba cakowita od tej liczby to wanie 5.

FLOOR()
Funkcja FLOOR(x) zwraca najwiksz liczb cakowit rwn x lub mniejsz. Ponisze zapytanie
oblicza za pomoc funkcji FLOOR() podog (cz cakowit) liczb 5,8 i 5,2:
SELECT FLOOR(5.8), FLOOR(-5.2)
FROM dual;
FLOOR(5.8) FLOOR(-5.2)
---------- ----------5
-6

Cz cakowita liczby 5,8 wynosi 5, poniewa jest to najwiksza liczba cakowita mniejsza od
5,8. Podoga liczby 5,2 wynosi 6, poniewa 5,2 jest liczb ujemn i najwiksza liczba cakowita mniejsza od tej wartoci to wanie 6.

MOD()
Funkcja MOD(x, y) zwraca reszt z dzielenia liczby x przez y. Ponisze zapytanie oblicza za
pomoc funkcji MOD() reszty z dzielenia liczby 8 przez 3 i 4:
SELECT MOD(8, 3), MOD(8, 4)
FROM dual;

124

Oracle Database 11g i SQL. Programowanie


MOD(8,3)
MOD(8,4)
---------- ---------2
0

Reszta z dzielenia 8 przez 3 wynosi 2. Liczba 3 mieci si dwa razy w liczbie 8, pozostawiajc 2 reszt z dzielenia. Reszta z dzielenia 8 przez 4 wynosi 0. Liczba 4 mieci si dwa razy
w liczbie 8 bez adnej reszty.

POWER()
Funkcja POWER(x, y) zwraca wynik podniesienia liczby x do potgi y. Ponisze zapytanie oblicza
za pomoc funkcji POWER() wynik podniesienia liczby 2 do potgi 1 i 3:
SELECT POWER(2, 1), POWER(2, 3)
FROM dual;
POWER(2,1) POWER(2,3)
---------- ---------2
8

Podniesienie 2 do potgi 1 jest rwnowane dziaaniu 2 1, wic w wyniku otrzymujemy 2.


Podniesienie liczby 2 do potgi 3 jest rwnowane dziaaniu 2 2 2, wic w wyniku otrzymujemy 8.

ROUND()
Funkcja ROUND(x, [y]) zwraca wynik zaokrglenia liczby x do opcjonalnych y miejsc po przecinku. Jeeli y nie zostanie okrelone, x zostanie zaokrglone do zera miejsc po przecinku. Jeeli
y jest liczb ujemn, x bdzie zaokrglane po lewej stronie separatora dziesitnego.
Ponisze zapytanie wykorzystuje funkcj ROUND() do zaokrglenia liczby 5,75 do 0, 1 i 1
miejsc po przecinku:
SELECT ROUND(5.75), ROUND(5.75, 1), ROUND(5.75, -1)
FROM dual;
ROUND(5.75) ROUND(5.75,1) ROUND(5.75,-1)
----------- ------------- -------------6
5,8
10

Liczba 5,75 zaokrglona do zera miejsc po przecinku wynosi 6; 5,75 po zaokrgleniu do jednego
miejsca po przecinku wynosi 5,8; 5,75 zaokrglona do jednego miejsca dziesitnego po lewej
stronie separatora dziesitnego (na co wskazuje znak ujemny) wynosi 10.

SIGN()
Funkcja SIGN(x) zwraca znak liczby x. Jeeli x jest liczb ujemn, funkcja zwraca 1, jeeli
x jest dodatnia, funkcja zwraca 1. Jeeli x wynosi 0, funkcja zwraca 0. Ponisze zapytanie
pobiera znaki liczb 5, 5 i 0:
SELECT SIGN(5), SIGN(-5), SIGN(0)
FROM dual;

Rozdzia 4. Proste funkcje

125

SIGN(5)
SIGN(-5)
SIGN(0)
---------- ---------- ---------1
-1
0

Znak 5 to 1, znak 5 to 1, znak 0 to 0.

SQRT()
Funkcja SQRT(x) zwraca pierwiastek kwadratowy liczby x. Ponisze zapytanie oblicza pierwiastki kwadratowe liczby 25 i 5:
SELECT SQRT(25), SQRT(5)
FROM dual;
SQRT(25)
SQRT(5)
---------- ---------5 2,23606798

Pierwiastek kwadratowy z 25 wynosi 5, a pierwiastek kwadratowy z 5 wynosi okoo 2,236.

TRUNC()
Funkcja TRUNC(x [, y]) zwraca wynik obcicia liczby x do opcjonalnych y miejsc dziesitnych.
Jeeli y nie zostanie okrelony, x zostanie przycita do zera miejsc dziesitnych. Jeeli y jest
liczb ujemn, x bdzie przycinana po lewej stronie separatora dziesitnego. Ponisze zapytanie
przycina liczb 5,75 do 0, 1 i 1 miejsca dziesitnego:
SELECT TRUNC(5.75), TRUNC(5.75, 1), TRUNC(5.75, -1)
FROM dual;
TRUNC(5.75) TRUNC(5.75,1) TRUNC(5.75,-1)
----------- ------------- -------------5
5,7
0

W powyszym przykadzie 5,75 po przyciciu do zera miejsc dziesitnych wynosi 5; 5,75 po


przyciciu do jednego miejsca dziesitnego po prawej stronie separatora dziesitnego wynosi
5,7; 5,75 po przyciciu do jednego miejsca dziesitnego po lewej stronie separatora dziesitnego
(na co wskazuje znak minus) wynosi 0.

Funkcje konwertujce
Czasami chcemy przekonwertowa warto z jednego typu danych na inny. Moemy chcie
zmieni format ceny produktu, ktra jest przechowywana jako liczba (na przykad 10346,95),
na napis zawierajcy symbol waluty i separator tysicy (na przykad 10 346 z). Do tego wykorzystujemy funkcje konwertujce, ktre konwertuj warto z jednego typu danych na inny.
W tabeli 4.3 opisano niektre funkcje konwertujce.
Funkcje TO_CHAR() i TO_NUMBER() zostan szczegowo opisane w kolejnych podrozdziaach.
Pozostae funkcje z tabeli 4.3 zostan omwione w dalszej czci ksiki. Wicej informacji
o zestawach znakw narodowych i systemie Unicode mona znale w Oracle Database Globalization Support Guide opublikowanym przez Oracle Corporation.

126

Oracle Database 11g i SQL. Programowanie

Tabela 4.3. Funkcje konwertujce


Funkcja

Opis

ASCIISTR(x)

Konwertuje x na napis ASCII, gdzie x moe by napisem w dowolnym zestawie


znakw

BIN_TO_NUM(x)

Konwertuje liczb binarn x na typ NUMBER

CAST(x AS typ)

Konwertuje x na kompatybilny typ z bazy danych, okrelony przez typ

CHARTORWIND(x)

Konwertuje x na ROWID

COMPOSE(x)

Konwertuje x na napis Unicode w jego w peni znormalizowanej formie, w tym


samym zestawie znakw co x. Unicode wykorzystuje 2-bajtowy zestaw znakw
i moe reprezentowa ponad 65 000 znakw, nie tylko angielskich

CONVERT(x,
rdowy_zestaw_znakw,
docelowy_zestaw_znakw)

Konwertuje x z zestawu znakw rdowy_zestaw_znakw na docelowy_zestaw_znakw

DECODE(x, wyszukiwane,
wynik, domylna)

Porwnuje x z wartoci search. Jeeli s rwne, funkcja zwraca wynik;


w przeciwnym razie zwraca warto domylna

DECOMPOSE(x)

Konwertuje x na napis Unicode po dekompozycji napisu do tego samego zestawu


znakw co x

HEXTORAW(x)

Konwertuje znak x zawierajcy szesnastkowe cyfry (o podstawie 16) na liczb


binarn (RAW). Funkcja zwraca liczb RAW

NUMTODSINTERVAL(x)

Konwertuje liczb x na INTERVAL DAY TO SECOND (funkcje zwizane z interwaami


daty i czasu zostan opisane w kolejnym rozdziale)

NUMTOYMINTERVAL(x)

Konwertuje liczb x na INTERVAL YEAR TO MONTH

RAWTOHEX(x)

Konwertuje liczb binarn (RAW) x na napis VARCHAR2, zawierajcy rwnowan


liczb szesnastkow

RAWTONHEX(x)

Konwertuje liczb binarn (RAW) x na napis NVARCHAR2, zawierajcy rwnowan


liczb szesnastkow (NVARCHAR2 skaduje napis, uywajc zestawu znakw
narodowych)

ROWIDTOCHAR(x)

Konwertuje ROWID x na napis VARCHAR2

ROWIDTONCHAR(x)

Konwertuje ROWID x na napis NVARCHAR2

TO_BINARY_DOUBLE(x)

Konwertuje x na BINARY_DOUBLE (ta funkcja zostaa wprowadzona w Oracle


Database 10g)

TO_BINARY_FLOAT(x)

Konwertuje x na BINARY_FLOAT (ta funkcja zostaa wprowadzona w Oracle


Database 10g)

TO_BLOB

Konwertuje x na duy obiekt binarny (BLOB). Typ BLOB jest uywany do skadowania
duych iloci danych binarnych. Wicej informacji na temat duych obiektw
znajduje si w rozdziale 14.

TO_CHAR(x [, format])

Konwertuje x na napis VARCHAR2. Mona przesa opcjonalny parametr format,


okrelajcy sposb formatowania x

TO_CLOB(x)

Konwertuje x na duy obiekt znakowy (CLOB). Typ CLOB jest uywany


do przechowywania duych iloci danych znakowych

TO_DATE(x [, format])

Konwertuje x na typ DATE

TO_DSINTERVAL(x)

Konwertuje napis x na INTERVAL DAY TO SECOND

TO_MULTI_BYTE(x)

Konwertuje jednobajtowe znaki w x na odpowiadajce im znaki wielobajtowe.


Typ zwracany jest taki sam jak typ x

Rozdzia 4. Proste funkcje

127

Tabela 4.3. Funkcje konwertujce cig dalszy


Funkcja

Opis

TO_NCHAR(x)

Konwertuje x z zestawu znakw bazy danych na napis NVARCHAR2

TO_NCLOB(x)

Konwertuje x na duy obiekt NCLOB, uywany do przechowywania sporych iloci


danych znakowych ze znakami narodowymi

TO_NUMBER(x [, format])

Konwertuje x na typ NUMBER

TO_SINGLE_BYTE(x)

Konwertuje wielobajtowe znaki w x na odpowiadajce im znaki jednobajtowe.


Typ zwracany jest taki sam jak typ x

TO_TIMESTAMP(x)

Konwertuje napis x na typ TIMESTAMP

TO_TIMESTAMP_TZ(x)

Konwertuje napis x na typ TIMESTAMP WITH TIME ZONE

TO_YMINTERVAL(x)

Konwertuje napis x na typ INTERVAL YEAR TO MONTH

TRANSLATE(x,
napis_rdowy,
napis_docelowy)

Konwertuje w x wszystkie wystpienia napis_rdowy na napis_docelowy

UNISTR(x)

Konwertuje znaki w x na znak NCHAR. NCHAR skaduje znak, uywajc zestawu


znakw narodowych

TO_CHAR()
Funkcja TO_CHAR(x [, format]) konwertuje x na napis. Mona przesa opcjonalny parametr
format, okrelajcy sposb formatowania x. Struktura parametru format zaley od tego, czy x jest
liczb, czy dat. Z tego podrozdziau dowiesz si, jak za pomoc funkcji TO_CHAR() konwertowa
liczby na napisy, a w kolejnym rozdziale opisano, jak konwertowa daty na napisy.
Przyjrzyjmy si kilku prostym zapytaniom, konwertujcym liczb na napis za pomoc funkcji
TO_CHAR(). Ponisze zapytanie konwertuje na napis liczb 12345,67:
SELECT TO_CHAR(12345.67)
FROM dual;
TO_CHAR(
-------12345,67

Kolejne zapytanie konwertuje liczb 12345,67 na napis zgodnie z formatem okrelonym przez
99G999D99. Przy polskich ustawieniach narodowych zwracany jest acuch zawierajcy znak
spacji jako separator tysicy i przecinek jako separator dziesitny:
SELECT TO_CHAR(12345.67, '99G999D99')
FROM dual;
TO_CHAR(12
---------12 345,67

Opcjonalny napis format, ktry mona przesa do funkcji TO_CHAR(), posiada wiele parametrw majcych wpyw na napis zwracany przez funkcj. Niektre z tych parametrw zostay
opisane w tabeli 4.4.

128

Oracle Database 11g i SQL. Programowanie

Tabela 4.4. Parametry formatujce liczby


Parametr

Przykad formatu

Opis

999

Zwraca cyfry na okrelonych pozycjach wraz z pocztkowym znakiem minus,


jeeli liczba jest ujemna

0999

0999 zwraca liczb poprzedzan zerami

9990

9990 zwraca liczb koczon zerami

999.99

Zwraca kropk jako separator dziesitny na okrelonej pozycji

999,99

Zwraca przecinek na okrelonej pozycji (w przypadku polskich ustawie


narodowych w takim przypadku separatorem dziesitnym musi by kropka)

$999

Poprzedza liczb znakiem dolara

B9.99

Jeeli cakowita cz liczby staoprzecinkowej jest zerem, zwraca znak spacji


zamiast zera

999C

Zwraca symbol ISO waluty na okrelonej pozycji. Symbol pochodzi


z parametru NLS_ISO_CURRENCY bazy danych i jest definiowany przez
administratora bazy danych

9D99

Zwraca symbol separatora dziesitnego na okrelonej pozycji. Symbol pochodzi


z parametru NLS_NUMERIC_CHARACTER bazy danych (przy polskich ustawieniach
narodowych jest to domylnie przecinek)

EEEE

9.99EEEE

Zwraca liczb, uywajc notacji naukowej

FM

FM90.9

Usuwa pocztkowe i kocowe spacje z liczby

9G999

Zwraca symbol separatora grupy na okrelonej pozycji. Symbol pochodzi


z parametru NLS_NUMERIC_CHARACTER bazy danych

999L

Zwraca lokalny symbol waluty na okrelonej pozycji. Symbol pochodzi


z parametru NLS_CURRENCY bazy danych

MI

999MI

Zwraca liczb ujemn ze znakiem minus umieszczonym na kocu. Na kocu


liczby dodatniej jest umieszczana spacja

PR

999PR

Zwraca liczb ujemn w nawiasach ostroktnych (< >) oraz liczb dodatni
poprzedzon i zakoczon znakiem spacji

RN

RN

Rn

rn

Zwraca liczb w zapisie rzymskim. RN zwraca numeray zapisywane wielkimi


literami, a rn zwraca numeray zapisywane maymi literami. Liczba musi by
liczb cakowit z przedziau od 1 do 3999

S999

S999 zwraca liczb ujemn poprzedzon znakiem minus, a liczb dodatni

999S

poprzedzon znakiem plus


999S zwraca liczb ujemn zakoczon znakiem minus, a liczb dodatni

zakoczon znakiem plus


TM

TM

Zwraca liczb z uyciem jak najmniejszej liczby znakw. Domylnie


obowizuje format TM9, ktry zwraca liczby, uywajc zapisu
staoprzecinkowego, chyba e liczba znakw jest wiksza od 64. W takim
przypadku liczba jest zwracana w notacji naukowej

U999

Zwraca drugi symbol waluty (na przykad euro) na okrelonej pozycji. Symbol
pochodzi z parametru NLS_DUAL_CURRENCY bazy danych

99V99

Zwraca liczb pomnoon razy 10x, gdzie x jest liczb znakw 9 za znakiem V.
Jeeli jest to konieczne, liczba jest zaokrglana

XXXX

Zwraca liczb w formacie szesnastkowym. Jeeli nie jest ona cakowita,


jest zaokrglana do liczby cakowitej

Rozdzia 4. Proste funkcje

129

Przyjrzyjmy si kolejnym przykadom konwertowania liczb na napisy za pomoc funkcji


TO_CHAR(). Tabela 4.5 przedstawia przykady wywoa funkcji TO_CHAR() oraz zwrcone wyniki.
Tabela 4.5. Przykady zastosowania funkcji TO_CHAR
Wywoanie funkcji TO_CHAR()

Wynik

TO_CHAR(12345.67, '99999.99')

12345.67

TO_CHAR(12345.67, '99,999.99')

12,345.67

TO_CHAR(-12345.67, '99,999.99')

-12,345.67

TO_CHAR(12345.67, '099,999.99')

012,345.67

TO_CHAR(12345.67, '99,999.9900')

12,345.6700

TO_CHAR(12345.67, '$99,999.99')

$12,345.67

TO_CHAR(0.67, 'B9.99')

.67

TO_CHAR(12345.67, 'C99,999.99')

PLN12345,67

TO_CHAR(12345.67, '99999D99')

12345,67

TO_CHAR(12345.67, '99999.99EEEE')

1.23E+04

TO_CHAR(0012345.6700, 'FM99999.99')

12345.67

TO_CHAR(12345.67, '99999G99')

123 46

TO_CHAR(12345.67, 'L99,999.99')

z12345.67

TO_CHAR(-12345.67, '99,999.99MI')

12345.67-

TO_CHAR(-12345.67, '99,999.99PR')

<12345.67>

TO_CHAR(2007, 'RN')

MMVII

TO_CHAR(12345.67, 'TM')

12345,67

TO_CHAR(12345.67, 'U99,999.99')

z12,345.67

TO_CHAR(12345.67, '99999V99')

1234567

Jeeli sprbujemy sformatowa liczb, ktra zawiera zbyt wiele cyfr dla przesanego formatu,
funkcja TO_CHAR() zwrci cig znakw #, na przykad:
SELECT TO_CHAR(12345678.90, '99,999.99')
FROM dual;
TO_CHAR(12
---------##########

Funkcja TO_CHAR() zwrcia znaki #, poniewa liczba 12345678,90 zawiera wicej cyfr ni limit
dopuszczony przez format 99,999.99.
Za pomoc funkcji TO_CHAR() mona rwnie konwertowa na napisy kolumny zawierajce liczby.
Na przykad ponisze zapytanie wykorzystuje funkcj TO_CHAR() do przeprowadzenia konwersji
wartoci z kolumny price tabeli products na napisy:
SELECT product_id, 'Cena produktu wynosi' || TO_CHAR(price, '99D99L')
FROM products
WHERE product_id < 5;

130

Oracle Database 11g i SQL. Programowanie


PRODUCT_ID
---------1
2
3
4

'CENAPRODUKTUWYNOSI'||TO_CHAR(PRICE,
-----------------------------------Cena produktu wynosi
19,95z
Cena produktu wynosi
30,00z
Cena produktu wynosi
25,99z
Cena produktu wynosi
13,95z

TO_NUMBER()
Funkcja TO_NUMBER(x [, format]) konwertuje x na liczb. Mona przesa opcjonalny napis
format, okrelajcy format x. W napisie format mog znajdowa si takie same parametry jak
te wymienione w tabeli 4.4.
Ponisze zapytanie konwertuje na liczb napis 970,13, korzystajc z funkcji TO_NUMBER():
SELECT TO_NUMBER('970,13')
FROM dual;
TO_NUMBER('970,13')
------------------970,13

Kolejne zapytanie konwertuje napis 970,13 na liczb za pomoc funkcji TO_NUMBER(), a nastpnie
dodaje do tej liczby 25,5:
SELECT TO_NUMBER('970,13') + 25.5
FROM dual;
TO_NUMBER('970,13')+25.5
-----------------------995,63

Kolejne zapytanie konwertuje napis -1 234,67z na liczb za pomoc funkcji TO_NUMBER, przesyajc do niej napis formatujcy 9G999D99L:
SELECT TO_NUMBER('-1 200,00z', '9G999D99L')
FROM dual;
TO_NUMBER('-1234,56Z','9G999D99L')
-----------------------------------1234,56

CAST()
Funkcja CAST(x AS typ) konwertuje x na kompatybilny typ z bazy danych, okrelany przez
parametr typ. W tabeli 4.6 przedstawiono dopuszczalne konwersje typw (s oznaczone X).
Ponisze zapytanie przedstawia wykorzystanie funkcji CAST() do konwersji literaw na okrelone typy:
SELECT
CAST(12345.67 AS VARCHAR2(10)),
CAST('9A4F' AS RAW(2)),
CAST('05-LIP-07' AS DATE),
CAST(12345.678 AS NUMBER(10,2))
FROM dual;

Rozdzia 4. Proste funkcje

131

Tabela 4.6. Dopuszczalne konwersje typw danych


Z typu
BINARY_FLOAT
BINARY_DOUBLE

CHAR
VARCHAR2

NUMBER

BINARY_FLOAT
BINARY_DOUBLE

CHAR
VARCHAR2

NUMBER

Na typ

DATE
TIMESTAMP
INTERVAL

RAW

ROWID
UROWID

NCHAR
NVARCHAR2

DATE
TIMESTAMP
INTERVAL

RAW

ROWID
UROWID

NCHAR
NVARCHAR2

X
X

X
X

X
X
X
X

CAST(12345 CAST CAST('05- CAST(12345.678ASNUMBER(10,2))


---------- ---- --------- ----------------------------12345,67
9A4F 05-LIP-07
12345,68

Mona rwnie konwertowa wartoci z kolumn tabeli na inny typ, co obrazuje ponisze
zapytanie:
SELECT
CAST(price AS VARCHAR2(10)),
CAST(price + 2 AS NUMBER(7,2)),
CAST(price AS BINARY_DOUBLE)
FROM products
WHERE product_id = 1;
CAST(PRICE CAST(PRICE+2ASNUMBER(7,2)) CAST(PRICEASBINARY_DOUBLE)
---------- -------------------------- -------------------------19,95
21,95
1,995E+001

W rozdziale 5. poznasz kolejne przykady prezentujce wykorzystanie funkcji CAST() do konwertowania dat, czasu i interwaw. Z rozdziau 13. dowiesz si, jak konwertowa kolekcje
za pomoc funkcji CAST().

Funkcje wyrae regularnych


W tym podrozdziale zostay opisane wyraenia regularne i zwizane z nimi funkcje bazy danych
Oracle, ktre umoliwiaj wyszukiwanie wzorcw znakw w napisie. Zamy, e dysponujemy ponisz list lat:
1965
1968

132

Oracle Database 11g i SQL. Programowanie


1971
1970

i chcemy z niej pobra te z przedziau od 1965 do 1968. Moemy to zrobi za pomoc wyraenia regularnego:
^196[5-8]$

Wyraenie regularne zawiera zbir metaznakw. W tym przykadzie s nimi ^, [5-8] i $.


^ oznacza pocztek napisu, [5-8] przedzia znakw od 5 do 8, $ pozycj w napisie. ^196
oznacza wic napis rozpoczynajcy si od 196, a [5-8]$ napis koczcy si cyfr 5, 6, 7 lub
8, dlatego warunek ^196[5-8]$ jest speniany przez 1965, 1966, 1967 i 1968, czyli dokadnie
przez te lata, ktre chcielimy pobra z listy.
W nastpnym przykadzie zosta wykorzystany ten napis bdcy cytatem z Romea i Julii:
Lecz cicho! Co za blask strzeli tam z okna!

Zamy, e chcemy wyszuka podnapis blask. Posuy do tego ponisze wyraenie regularne:
b[[:alpha:]]{4}

W tym wyraeniu regularnym metaznakami s [[:alpha:]] i {4}. [[:alpha:]] oznacza znak


alfanumeryczny od A do Z i od a do z; {4} powtarza czterokrotnie wczeniejsze dopasowanie.
Po poczeniu b, [[:alpha:]] i {4} uzyskujemy wyraenie speniane przez sekwencj piciu liter,
rozpoczynajc si liter b, dlatego te wyraenie regularne b[[:alpha:]]{4} jest speniane
przez blask z napisu.
W tabeli 4.7 opisano niektre metaznaki moliwe do wykorzystania w wyraeniach regularnych,
a take ich znaczenie i przykady zastosowania.
Tabela 4.7. Metaznaki w wyraeniach regularnych
Metaznaki

Znaczenie

Przykady

Speniany przez znak specjalny


lub litera albo wykonuje
odwoanie wsteczne

\n oznacza znak nowego wiersza


\\ oznacza \
\( oznacza (
\) oznacza )

Oznacza pocztek napisu

^A jest speniane przez A, jeeli ta litera jest pierwszym

Oznacza koniec napisu

$B jest speniane przez B, jeeli ta litera jest ostatnim

Oznacza zero lub wicej


wystpie poprzedzajcego znaku

ba*rk jest speniane przez brk, bark, baark itd.

Oznacza co najmniej jedno


wystpienie poprzedzajcego
znaku

ba+rk jest speniane przez bark, baark itd., ale nie przez brk

Oznacza zero lub jedno


wystpienie poprzedzajcego
znaku

ba?rk jest speniane tylko przez brk i bark

znakiem napisu
znakiem napisu

Rozdzia 4. Proste funkcje

133

Tabela 4.7. Metaznaki w wyraeniach regularnych cig dalszy


Metaznaki

Znaczenie

Przykady

{n}

Oznacza dokadnie n wystpie


znaku. n musi by liczb cakowit

hob{2}it jest speniane przez hobbit

{n,m}

Oznacza przynajmniej n
i maksymalnie m wystpie znaku,
gdzie n i m s liczbami cakowitymi

hob{2,3}it jest speniane tylko przez hobbit i hobbbit

Oznacza dowolny jeden znak


oprcz NULL

hob.it jest speniane przez hobait, hobbit itd.

(wzorzec)

Podwyraenie speniane przez


okrelony wzorzec. Za pomoc
podwyrae mona tworzy
zoone wyraenia regularne.
Mona uzyska dostp
do poszczeglnych
wystpie, zwanych
napisami przechwyconymi

telefo(n|nia) jest spenianie przez telefon i telefonia

x|y

Jest speniane przez x lub y, gdzie


x i y stanowi co najmniej znak

wojna|pokj jest speniane przez sowo wojna lub pokj

[abc]

Jest speniane przez kady


wymieniony znak

[ab]|bc jest speniane zarwno przez abc, jak i bbc

[a-z]

Jest speniane przez kady znak


z okrelonego zakresu

[a-c]bc jest speniane przez abc, bbc i cbc

[: :]

Okrela klas znaku i jest


speniane przez dowolny znak
z tej klasy

[:alphanum:] jest speniane przez znaki alfanumeryczne 0 9,


AZiaz
[:alpha:] jest speniane przez litery A Z i a z
[:blank:] jest speniane przez znak spacji lub tabulacji
[:digit:] jest speniane przez cyfry 0 9
[:graph:] jest speniane przez znak drukowalny
[:lower:] jest speniane przez mae litery alfabetu a z
[:print:] jest podobne do [:graph:], ale uwzgldnia spacj
[:punct:] jest speniane przez znaki interpunkcyjne .,"' itd.
[:space:] jest speniane przez znaki odstpu
[:upper:] jest speniane przez wielkie litery alfabetu A Z
[:xdigid:] jest speniane przez wszystkie znaki dopuszczalne
w liczbie szesnastkowej: 0 9, A F, a f

[..]

Jest speniane przez jeden symbol


czony, na przykad w symbolu
wieloznakowym

Brak przykadu

[==]

Okrela klasy rwnowanoci

Brak przykadu

\n

Jest to odwoanie wsteczne


do wczeniej przechwyconego
elementu; n musi by dodatni
liczb cakowit

(.)\1 jest speniane przez dwa identyczne znaki nastpujce


po sobie. (.) przechwytuje kady znak oprcz NULL, a \1

powtarza przechwycenie, tym samym przechwytujc jeszcze


raz ten sam znak. Dlatego te wyraenie jest speniane przez
dwa identyczne znaki nastpujce po sobie

134

Oracle Database 11g i SQL. Programowanie

W Oracle Database 10g Release 2 wprowadzono kilka metaznakw uywanych w Perlu. Zostay
one opisane w tabeli 4.8.
Tabela 4.8. Metaznaki dodane z jzyka Perl
Metaznaki

Opis

\d

cyfra

\D

znak niebdcy cyfr

\w

sowo

\W

niesowo

\s

znak biaej spacji

\S

znak inny ni biaa spacja

\A

speniane tylko przez pocztek napisu lub jego koniec, jeeli znajduje si przed znakiem
nowego wiersza

\Z

speniane tylko przez koniec napisu

*?

speniane przez 0 lub wicej wystpie wczeniejszego elementu wzorca

+?

speniane przez co najmniej jedno wystpienie wczeniejszego elementu wzorca

??

speniane przez 0 lub jedno wystpienie wczeniejszego elementu wzorca

{n}

speniane przez dokadnie n wystpie wczeniejszego elementu wzorca

{n,}

speniane przez przynajmniej n wystpie wczeniejszego elementu wzorca

{n,m}

speniane przez przynajmniej n, ale mniej ni m wystpie wczeniejszego elementu wzorca

W tabeli 4.9 opisano funkcje operujce na wyraeniach regularnych. Zostay one wprowadzone
w Oracle Database 10g i rozszerzone w wersji 11g, co zostao zaznaczone w tabeli.
W kolejnych podrozdziaach zostan dokadniej opisane funkcje operujce na wyraeniach
regularnych.

REGEXP_LIKE()
Funkcja REGEXP_LIKE(x, wzorzec [, opcja_dopasowania]) przeszukuje x zgodnie z wyraeniem
regularnym zdefiniowanym przez parametr wzorzec. Mona rwnie przesa opcjonalny parametr opcja_dopasowania, ktry moe by jednym z poniszych znakw:
'c' okrelajcym, e podczas wyszukiwania wielko liter bdzie miaa znaczenie

(jest to ustawienie domylne),


'I' okrelajcym, e podczas wyszukiwania wielko liter nie bdzie miaa znaczenia,
'n' umoliwiajcym uycie operatora spenianego przez dowolny znak,
'm' traktujcym x jak wiele wierszy.

Ponisze zapytanie pobiera za pomoc funkcji REGEXP_LIKE informacje o klientach, ktrych data
urodzenia zawiera si w przedziale od 1965 do 1968:
SELECT customer_id, first_name, last_name, dob
FROM customers
WHERE REGEXP_LIKE(TO_CHAR(dob, 'YYYY'), '^196[5-8]$');

Rozdzia 4. Proste funkcje

135

Tabela 4.9. Funkcje operujce na wyraeniach regularnych


Funkcja

Opis

REGEXP_LIKE(x, wzorzec
[, opcja_dopasowania])

Przeszukuje x zgodnie z wyraeniem regularnym zdefiniowanym przez parametr


wzorzec. Mona rwnie przesa opcjonalny parametr opcja_dopasowania,
ktry moe mie jedn z poniszych wartoci:
'c' okrela, e podczas wyszukiwania wielko liter bdzie miaa znaczenie
(jest to opcja domylna)
'I' okrela, e podczas wyszukiwania wielko liter nie bdzie miaa
znaczenia
'n' umoliwia uycie operatora spenianego przez dowolny znak
'm' powoduje traktowanie x jako wielu linii

REGEXP_INSTR(x, wzorzec
[, start
[, wystpienie
[, opcja_zwracania
[, opcja_dopasowania
[, opcja_podwyraenia]]]])

Przeszukuje x zgodnie z wyraeniem regularnym wzorzec i zwraca pozycj,


na ktrej wystpuje wzorzec. Mona przesa opcjonalne parametry:
start okrela pozycj, od ktrej zostanie rozpoczte przeszukiwanie.
Domyln wartoci jest 1, czyli pierwszy znak w x
wystpienie okrela, ktre wystpienie wzorzec powinno zosta zwrcone.
Domyln wartoci jest 1, co oznacza, e funkcja zwrci pozycj
pierwszego wystpienia wzorzec
opcja_zwracania okrela, jaka liczba cakowita zostanie zwrcona. 0 okrela,
e zwrcona liczba cakowita bdzie oznaczaa pozycj pierwszego znaku
w x. 1 oznacza, e zwrcona liczba cakowita bdzie oznaczaa pozycj
znaku w x po wystpieniu wzorzec
opcja_dopasowania zmienia domylny sposb dopasowywania do wzorca.
Opcje s takie same jak w przypadku funkcji REGEXP_LIKE()
opcja_podwyraenia (nowo w Oracle Database 11g) ma nastpujce
dziaanie: w przypadku wzorca z podwyraeniami opcja_podwyraenia jest
nieujemn liczb cakowit od 0 do 9, okrelajc, ktre podwyraenie
we wzorzec jest celem funkcji. Na przykad wyraenie
0123(((abc)(de)f)ghi)45(678) zawiera pi podwyrae: abcdefghi,
abcdef, abc, de oraz 678
Jeeli opcja_podwyraenia bdzie rwna 0, zostanie zwrcona pozycja
caego wyraenia wzorzec. Jeeli wzorzec nie zawiera prawidowej liczby
podwyrae, funkcja zwrci 0. Jeeli opcja_podwyraenia ma warto NULL,
funkcja zwrci NULL. Domyln wartoci opcja_podwyraenia jest 0

REGEXP_REPLACE(x, wzorzec
[, napis_zastpujcy
[, start
[, wystpienie
[, opcja_dopasowania]]]])

Wyszukuje wzorzec w x i zastpuje go napisem napis_zastpujcy. Znaczenie


pozostaych opcji zostao opisane powyej

REGEXP_SUBSTR(x, wzorzec
[, start
[, wystpienie
[, opcja_dopasowania
[, opcja_podwyraenia]]]])

Zwraca podnapis x zgodny z wzorzec. Wyszukiwanie rozpoczyna si od pozycji


okrelonej przez start. Znaczenie pozostaych opcji zostao opisane powyej.
Znaczenie opcja_podwyraenia (nowej w Oracle Database 11g) jest takie samo
jak w przypadku funkcji REGEXT_INSTR()

REGEXP_COUNT(x, wzorzec
[, start
[, opcja_dopasowania]])

Nowo w Oracle Database 11g. Wyszukuje wzorzec w x i zwraca liczb


wystpie wzorzec. Mona przesa ponisze opcjonalne parametry:
start okrela pozycj, od ktrej rozpocznie si wyszukiwanie. Domyln
wartoci jest 1, co oznacza pierwszy znak w napisie x
opcja_dopasowania zmienia domylny sposb dopasowywania. Ma takie samo
znaczenie jak w przypadku funkcji REGEXP_LIKE()

136

Oracle Database 11g i SQL. Programowanie


CUSTOMER_ID
----------1
2

FIRST_NAME
---------Jan
Lidia

LAST_NAME
---------Nikiel
Stal

DOB
-------65/01/01
68/02/05

Kolejne zapytanie pobiera informacje o klientach, ktrych imi rozpoczyna si liter j lub J.
Naley zwrci uwag, e do funkcji REGEXP_LIKE() jest przesyane wyraenie regularne ^j,
a opcja dopasowywania jest ustawiona na i (i oznacza, e w wyszukiwaniu nie bdzie brana
pod uwag wielko liter, wic w tym przykadzie ^j jest speniane przez j i J):
SELECT customer_id, first_name, last_name, dob
FROM customers
WHERE REGEXP_LIKE(first_name, '^j', 'i');
CUSTOMER_ID
----------1
5

FIRST_NAME
---------Jan
Jadwiga

LAST_NAME
---------Nikiel
Mosidz

DOB
-------65/01/01
70/05/20

REGEXP_INSTR()
Funkcja REGEXP_INSTR(x, wzorzec [, start [, wystpienie [, opcja_zwracania [, opcja_
dopasowania [, opcja_podwyraenia]]]]) wyszukuje wzorzec w x. Funkcja zwraca pozycj,
na ktrej wzorzec wystpuje w x (pozycje rozpoczynaj si od 1).
Ponisze zapytanie zwraca pozycj speniajc wyraenie regularne b[[:alpha:]]{4}, korzystajc z funkcji REGEXP_INSTR():
SELECT REGEXP_INSTR('Lecz cicho! Co za blask strzeli tam z okna!', 'b[[:alpha:]]{4}')
AS wynik
FROM dual;
WYNIK
---------19

Zostaa zwrcona liczba 19, ktra okrela pozycj litery b ze sowa blask w caym napisie.
Nastpne zapytanie zwraca pozycj drugiego wystpienia speniajcego wzorzec r[[:alpha]](2),
rozpoczynajc od pozycji 1:
SELECT REGEXP_INSTR('Idzie rak, nieborak.', 'r[[:alpha:]]{2}', 1,2) AS wynik
FROM dual;
WYNIK
---------17

Kolejne zapytanie zwraca pozycj drugiego wystpienia litery o, rozpoczynajc wyszukiwanie


od pozycji 10:
SELECT REGEXP_INSTR('Lecz cicho! Co za blask strzeli tam z okna!', 'o', 10, 2) AS wynik
FROM dual;
WYNIK
---------14

Rozdzia 4. Proste funkcje

137

REGEXP_REPLACE()
Funkcja REGEXP_REPLACE(x, wzorzec [, napis_zastpujcy [, start [, wystpienie [,
opcja_dopasowania]]]]) wyszukuje wzorzec w x i zastpuje go napisem napis_zastpujcy.
Ponisze zapytanie za pomoc funkcji REGEXP_REPLACE() zastpuje podnapis zgodny z wyraeniem regularnym o[[:alpha:]]{3} napisem szafy:
SELECT REGEXP_REPLACE('Lecz cicho! Co za blask strzeli tam z okna!', 'o[[:alpha:]]{3}',
'szafy') AS wynik
FROM dual;
WYNIK
---------------------------------------------Lecz cicho! Co za blask strzeli tam z szafy!

Sowo okna zostao zastpione sowem szafy.

REGEXP_SUBSTR()
Funkcja REGEXP_SUBSTR(x, wzorzec [, start [, wystpienie [, opcja_dopasowania [,
opcja_podwyraenia]]]]) wyszukuje w x podnapis zgodny z wzorzec. Przeszukiwanie jest
rozpoczynane od pozycji okrelanej przez start.
Ponisze zapytanie zwraca podnapis zgodny z wyraeniem regularnym b[[:alpha:]{3}, korzystajc z funkcji REGEXP_SUBSTR():
SELECT REGEXP_SUBSTR('Lecz cicho! Co za blask strzeli tam z okna!', 'b[[:alpha:]]{4}')
AS wynik
FROM dual;
WYNIK
----blask

REGEXP_COUNT()
Funkcja REGEXP_COUNT() zostaa wprowadzona w Oracle Database 11g. Funkcja REGEXP_COUNT(x,
wzorzec [, start [, opcja_dopasowania]]) wyszukuje wzorzec w x i zwraca liczb jego wystpie. Mona przesa opcjonalny parametr start, okrelajcy znak w x, od ktrego rozpocznie si
wyszukiwanie, oraz opcjonalny parametr opcja_dopasowania, definiujcy opcje dopasowania.
Ponisze zapytanie za pomoc funkcji REGEXP_COUNT() zwraca liczb wystpie wyraenia
regularnego r[[:alpha:]]{2} w napisie:
SELECT REGEXP_COUNT('Idzie rak, nieborak', 'r[[:alpha:]]{2}') AS wynik
FROM dual;
WYNIK
---------2

Zostaa zwrcona liczba 2, co oznacza, e w napisie wystpiy dwa dopasowania do wyraenia


regularnego.

138

Oracle Database 11g i SQL. Programowanie

Funkcje agregujce
Funkcje prezentowane dotychczas operuj na pojedynczych wierszach i zwracaj jeden wiersz
wynikw dla kadego wiersza wejciowego. W tym podrozdziale poznamy funkcje agregujce,
ktre operuj na grupie wierszy i zwracaj jeden wiersz wynikw.
Funkcje agregujce s czasem nazywane grupujcymi, poniewa operuj na grupach wierszy.

W tabeli 4.10 opisano niektre funkcje agregujce, z ktrych wszystkie zwracaj typ NUMBER.
Oto kilka waciwoci funkcji agregujcych, o ktrych warto pamita podczas uywania ich:
Funkcje agregujce mog by uywane z dowolnymi, prawidowymi wyraeniami.
Na przykad funkcje COUNT(), MAX() i MIN() mog by uywane z liczbami, napisami

i datami.
Warto NULL jest ignorowana przez funkcje agregujce, poniewa wskazuje, e warto

jest nieznana i z tego powodu nie moe zosta uyta w funkcji.


Wraz z funkcj agregujc mona uy sowa kluczowego DISTINCT, aby wykluczy

z oblicze powtarzajce si wpisy.


Tabela 4.10. Funkcje agregujce
Funkcja

Opis

AVG(x)

Zwraca redni warto x

COUNT(x)

Zwraca liczb wierszy zawierajcych x, zwrconych przez zapytanie

MAX(x)

Zwraca maksymaln warto x

MEDIAN(x)

Zwraca median x

MIN(x)

Zwraca minimaln warto x

STDDEV(x)

Zwraca odchylenie standardowe x

SUM(x)

Zwraca sum x

VARIANCE(x)

Zwraca wariancj x

Funkcje agregujce przedstawione w tabeli 4.10 zostan szerzej opisane w kolejnych podrozdziaach. Z rozdziaw 7. i 8. dowiesz si, jak uywa ich w poczeniu z klauzulami ROLLUP
i RETURNING instrukcji SELECT. Klauzula ROLLUP umoliwia obliczenie czciowych podsumowa dla grup wierszy, klauzula RETURNING zapisanie w zmiennej wartoci zwrconej przez
funkcj agregujc.

AVG()
Funkcja AVG(x) oblicza redni warto x. Ponisze zapytanie zwraca redni cen produktw.
Naley zwrci uwag, e do funkcji AVG() jest przesyana kolumna price z tabeli products:
SELECT AVG(price)
FROM products;

Rozdzia 4. Proste funkcje

139

AVG(PRICE)
---------19,7308333

Funkcje agregujce mog by uywane z dowolnymi prawidowymi wyraeniami. Na przykad


ponisze zapytanie przesya do funkcji AVG() wyraenie price + 2. Na skutek tego do wartoci
price w kadym wierszu jest dodawane 2, a nastpnie jest obliczana rednia wynikw:
SELECT AVG(price + 2)
FROM products;
AVG(PRICE+2)
-----------21,7308333

W celu wyczenia z oblicze identycznych wartoci mona uy sowa kluczowego DISTINCT.


Na przykad w poniszym zapytaniu uyto go do wyczenia identycznych wartoci z kolumny
price podczas obliczania redniej za pomoc funkcji AVG():
SELECT AVG(DISTINCT price)
FROM products;
AVG(DISTINCTPRICE)
-----------------20,2981818

Naley zauway, e w tym przypadku rednia jest nieco wysza ni warto zwrcona przez
pierwsze zapytanie prezentowane w tym podrozdziale. Jest tak dlatego, poniewa warto
kolumny price dla produktu nr 2 (13,49) jest taka sama jak dla produktu nr 7. Jest uznawana za
duplikat i wyczana z oblicze wykonywanych przez funkcj AVG(), dlatego rednia w tym przykadzie jest nieco wysza.

COUNT()
Funkcja COUNT(x) oblicza liczb wierszy zwrconych przez zapytanie. Ponisze zapytanie zwraca
liczb wierszy w tabeli products, korzystajc z funkcji COUNT():
SELECT COUNT(product_id)
FROM products;
COUNT(PRODUCT_ID)
----------------12

Naley unika stosowania gwiazdki (*) jako argumentu funkcji COUNT(), poniewa obliczenie
wyniku moe zaj wicej czasu. Zamiast tego naley przesa nazw kolumny z tabeli lub
uy pseudokolumny ROWID. (Jak wiesz z rozdziau 2., kolumna ROWID zawiera wewntrzn
lokalizacj wiersza w bazie danych Oracle).

Ponisze zapytanie przesya ROWID do funkcji COUNT() i zwraca liczb wierszy w tabeli products:
SELECT COUNT(ROWID)
FROM products;

140

Oracle Database 11g i SQL. Programowanie


COUNT(ROWID)
-----------12

MAX() i MIN()
Funkcje MAX(x) i MIN(x) zwracaj maksymaln i minimaln warto x. Ponisze zapytanie zwraca
maksymaln i minimaln warto z kolumny price tabeli products, korzystajc z funkcji MAX()
i MIN():
SELECT MAX(price), MIN(price)
FROM products;
MAX(PRICE) MIN(PRICE)
---------- ---------49,99
10,99

Funkcje MAX() i MIN() mog by uywane ze wszystkimi typami danych, wcznie z napisami
i datami. Gdy uywamy MAX() z napisami, s one porzdkowane alfabetycznie, z maksymalnym napisem umieszczanym na dole listy i minimalnym napisem umieszczanym na grze
listy. Na przykad na takiej licie napis Albert znajdzie si przed napisem Zenon. Poniszy przykad pobiera maksymalny i minimalny napis z kolumny name tabeli products, korzystajc
z funkcji MAX() i MIN():
SELECT MAX(name), MIN(name)
FROM products;
MAX(NAME)
MIN(NAME)
------------------------------ -----------------------------Z innej planety
2412: Powrt

W przypadku dat, maksymaln dat jest najpniejszy moment, minimaln najwczeniejszy. Ponisze zapytanie pobiera maksymaln i minimaln warto z kolumny dob tabeli
customers, korzystajc z funkcji MAX() i MIN():
SELECT MAX(dob), MIN(dob)
FROM customers;
MAX(DOB) MIN(DOB)
--------- --------16-MAR-71 01-STY-65

STDDEV()
Funkcja STDDEV(x) oblicza odchylenie standardowe x. Jest ono funkcj statystyczn i jest definiowane jako pierwiastek kwadratowy wariancji (pojcie wariancji zostanie opisane za chwil).
Ponisze zapytanie oblicza odchylenie standardowe wartoci w kolumnie price tabeli products,
korzystajc z funkcji STDDEV():
SELECT STDDEV(price)
FROM products;

Rozdzia 4. Proste funkcje

141

STDDEV(PRICE)
------------11,0896303

SUM()
Funkcja SUM() dodaje wszystkie wartoci w x i zwraca wynik. Ponisze zapytanie zwraca sum
wartoci z kolumny price tabeli products, korzystajc z funkcji SUM():
SELECT SUM(price)
FROM products;
SUM(PRICE)
---------236,77

VARIANCE()
Funkcja VARIANCE() oblicza wariancj x. Wariancja jest funkcj statystyczn i jest definiowana
jako rozpito czy zrnicowanie grupy liczb w prbce. Jest rwna kwadratowi odchylenia
standardowego.
Ponisze zapytanie oblicza wariancj wartoci w kolumnie price tabeli products, korzystajc
z funkcji VARIANCE():
SELECT VARIANCE(price)
FROM products;
VARIANCE(PRICE)
--------------122,979899

Grupowanie wierszy
Czasami chcemy pogrupowa wiersze tabeli i uzyska jakie informacje na temat tych grup
wierszy. Na przykad moemy chcie uzyska rednie ceny rnych typw produktw z tabeli
products. Zaczniemy od trudniejszego sposobu, by potem przej do atwiejszego, ktry wykorzystuje klauzul GROUP BY w celu grupowania podobnych wierszy.
Trudniejszy sposb polega na ograniczeniu wierszy przesyanych do funkcji AVG() za pomoc
klauzuli WHERE. Na przykad ponisze zapytanie pobiera rednie ceny ksiek z tabeli products
(ksiki maj product_type_id rwny 1):
SELECT AVG(price)
FROM products
WHERE product_id = 1;
AVG(PRICE)
---------19,95

142

Oracle Database 11g i SQL. Programowanie

Aby uzyska redni cen innych typw produktw, musielibymy wykonywa dodatkowe
zapytania z uyciem rnych wartoci product_type_id w klauzuli WHERE. Jak mona sobie
wyobrazi, jest to dosy mudna praca. Pocieszajca jest wiadomo, e istnieje atwiejszy
sposb, wykorzystujcy do grupowania klauzul GROUP BY.

Grupowanie wierszy za pomoc klauzuli GROUP BY


Klauzula GROUP BY grupuje wiersze w bloki ze wspln wartoci jakiej kolumny. Na przykad
ponisze zapytanie grupuje wiersze z tabeli products w bloki z t sam wartoci product_
type_id:
SELECT product_type_id
FROM products
GROUP BY product_type_id;
PRODUCT_TYPE_ID
--------------1
2
4
3

Naley zauway, e w zestawie wynikw znajduje si tylko jeden wiersz dla kadego bloku
wierszy z t sam wartoci product_type_id, a take, e midzy 1. i 2. wystpuje luka (wkrtce
dowiemy si, dlaczego si tam znajduje). W zestawie wynikw jest jeden wiersz dla produktw,
dla ktrych product_type_id jest rwne 1, kolejny dla produktw, dla ktrych product_type_id
jest rwne 2 itd. W tabeli products znajduj si dwa wiersze, dla ktrych product_type_id jest
rwne 1, cztery wiersze, dla ktrych product_type_id jest rwne 2 itd. Te wiersze s grupowane
w osobne bloki za pomoc klauzuli GROUP BY kady blok zawiera wszystkie wiersze z t sam
wartoci product_type_id. Pierwszy zawiera dwa wiersze, drugi zawiera cztery wiersze itd.
Luka midzy wierszami 1. i 2. jest spowodowana tym, e w tabeli products wystpuje wiersz,
w ktrym product_type_id ma warto NULL. Ten wiersz jest przedstawiony w poniszym
przykadzie:
SELECT product_id, name, price
FROM products
WHERE product_type_id IS NULL;
PRODUCT_ID NAME
PRICE
---------- ------------------------------ ---------12 Pierwsza linia
13,49

Poniewa warto product_type_id w tym wierszu wynosi NULL, klauzula GROUP BY w poprzednim zapytaniu grupuje te wiersze w osobnym bloku. Wiersz w zestawie wynikw jest pusty,
poniewa warto product_type_id dla tego bloku wynosi NULL std luka midzy wierszami 1. i 2.

Rozdzia 4. Proste funkcje

143

Uywanie wielu kolumn w grupie


W klauzuli GROUP BY mona okreli kilka kolumn. Na przykad ponisze zapytanie zawiera
w klauzuli GROUP BY kolumny product_id i customer_id z tabeli purchases:
SELECT product_id, customer_id
FROM purchases
GROUP BY product_id, customer_id;
PRODUCT_ID CUSTOMER_ID
---------- ----------1
1
1
2
1
3
1
4
2
1
2
2
2
3
2
4
3
3

Uywanie funkcji agregujcych z grupami wierszy


Do funkcji agregujcej mona przesya bloki wierszy. Wykona ona obliczenia na grupie wierszy
z kadego bloku i zwrci jedn warto dla kadego bloku. Na przykad aby uzyska liczb
wierszy z t sam wartoci product_type_id w tabeliproducts, musimy:
pogrupowa wiersze w bloki z t sam wartoci product_type_id za pomoc klauzuli
GROUP BY,
zliczy wiersze w kadym bloku za pomoc funkcji COUNT(ROWID).

Demonstruje to ponisze zapytanie:


SELECT product_type_id, COUNT(ROWID)
FROM products
GROUP BY product_type_id
ORDER BY product_type_id;
PRODUCT_TYPE_ID COUNT(ROWID)
--------------- -----------1
2
2
4
3
2
4
3
1

Naley zauway, e w zestawie wynikw znajduje si pi wierszy, z ktrych kady odpowiada


jednemu lub kilku wierszom z tabeli products, ktre zostay pogrupowane wedug wartoci
product_type_id. W zestawie wynikw widzimy, e w dwch wierszach product_type_id ma
warto 1, cztery wiersze maj warto product_type_id rwn 2 itd. Ostatni wiersz zestawu
wynikw wskazuje, e wystpuje jeden wiersz, w ktrym product_type_id ma warto NULL (jest
to wspomniany wczeniej wiersz Pierwsza linia).

144

Oracle Database 11g i SQL. Programowanie

Przejdmy do innego przykadu. Aby uzyska redni cen rnych typw produktw z tabeli
products, musimy:
za pomoc klauzuli GROUP BY pogrupowa wiersze w bloki z t sam wartoci
product_type_id,
za pomoc funkcji AVG(price) obliczy redni cen w kadym bloku wierszy.

Demonstruje to ponisze zapytanie:


SELECT product_type_id, AVG(price)
FROM products
GROUP BY product_type_id
ORDER BY product_type_id;
PRODUCT_TYPE_ID AVG(PRICE)
--------------- ---------1
24,975
2
26,22
3
13,24
4
13,99
13,49

Kada grupa wierszy z t sam wartoci product_type_id jest przesyana do funkcji AVG().
Nastpnie funkcja ta oblicza redni cen w kadej grupie. Jak widzimy w zestawie wynikw,
rednia cena w grupie produktw z product_type_id rwnym 1 wynosi 24,975, a rednia cena
w grupie produktw z product_type_id rwnym 2 wynosi 26,22. Naley zauway, e w ostatnim wierszu zestawu wynikw jest wywietlana rednia cena rwna 13,49. Jest to po prostu cena
produktu Pierwsza linia, czyli jedynego wiersza, w ktrym product_type_id ma warto NULL.
Z klauzul GROUP BY moemy uywa dowolnych funkcji agregujcych. Na przykad kolejne
zapytanie pobiera wariancj cen produktw dla kadego product_type_id:
SELECT product_type_id, VARIANCE(price)
FROM products
GROUP BY product_type_id
ORDER BY product_type_id;
PRODUCT_TYPE_ID VARIANCE(PRICE)
--------------- --------------1
50,50125
2
280,8772
3
,125
4
7
0

Warto pamita, e nie musimy umieszcza kolumn wykorzystywanych w klauzuli GRUP BY bezporednio za instrukcj SELECT. Na przykad ponisze zapytanie ma takie samo znaczenie jak
poprzednie, ale product_type_id zostao pominite w klauzuli SELECT:
SELECT VARIANCE(price)
FROM products
GROUP BY product_type_id
ORDER BY product_type_id;

Rozdzia 4. Proste funkcje

145

VARIANCE(PRICE)
--------------50,50125
280,8772
,125
7
0

Wywoanie funkcji agregujcej mona rwnie umieci w klauzuli ORDER BY, co pokazuje
ponisze zapytanie:
SELECT VARIANCE(price)
FROM products
GROUP BY product_type_id
ORDER BY VARIANCE(price);
VARIANCE(PRICE)
--------------0
,125
7
50,50125
280,8772

Nieprawidowe uycie funkcji agregujcych


Jeeli zapytanie zawiera funkcj agregujc i pobiera kolumny nieujte w niej, naley je umieci w klauzuli GROUP BY. Jeli o tym zapomnimy, zostanie wywietlony komunikat o bdzie:
ORA-00937: to nie jest jednogrupowa funkcja grupowa. Na przykad ponisze zapytanie prbuje pobra dane z kolumny product_type_id oraz obliczy AVG(price), pominito w nim jednak
klauzul GROUP BY dla product_type_id:
SQL> SELECT product_type_id, AVG(price)
2 FROM products;
SELECT product_type_id, AVG(price)
*
BD w linii 1:
ORA-00937: to nie jest jednogrupowa funkcja grupowa

Bd wystpuje, poniewa baza danych nie wie, co zrobi z kolumn product_type_id. Zastanwmy si nad tym: zapytanie prbuje uy funkcji agregujcej AVG(), ktra operuje na wielu
wierszach, ale prbuje rwnie pobra wartoci product_type_id dla pojedynczych wierszy.
Nie mona zrobi tego jednoczenie. Naley zastosowa klauzul GROUP BY, aby wiersze z t
sam wartoci product_type_id zostay zgrupowane. Wwczas baza danych przele te grupy
wierszy do funkcji AVG().
Jeeli zapytanie zawiera funkcj agregujc i pobiera kolumny, ktre nie zostay w niej ujte,
naley je umieci w klauzuli GROUP BY.

Poza tym nie mona uywa funkcji agregujcych do ograniczania wierszy za pomoc klauzuli
WHERE. W przeciwnym razie zostanie wywietlony komunikat o bdzie: ORA-00934: funkcja
grupowa nie jest tutaj dozwolona:

146

Oracle Database 11g i SQL. Programowanie


SQL> SELECT product_type_id, AVG(price)
2 FROM products
3 WHERE AVG(price) > 20
4 GROUP BY product_type_id;
WHERE AVG(price) > 20
*
BD w linii 3:
ORA-00934: funkcja grupowa nie jest tutaj dozwolona

Bd wystpuje, poniewa klauzula WHERE suy jedynie do filtrowania pojedynczych wierszy,


a nie grup, do czego suy klauzula HAVING, opisana poniej.

Filtrowanie grup wierszy za pomoc klauzuli HAVING


Klauzula HAVING suy do filtrowania grup wierszy. Umieszcza si j za klauzul GROUP BY:
SELECT ...
FROM ...
WHERE
GROUP BY ...
HAVING ...
ORDER BY ...;

Klauzula GROUP BY moe by uywana bez klauzuli HAVING, ale klauzula HAVING musi by uywana z klauzul GROUP BY.

Zamy, e chcemy przejrze typy produktw, ktrych rednia cena jest wiksza ni 20 z.
W tym celu musimy:
za pomoc klauzuli GROUP BY pogrupowa wiersze w bloki o tej samej wartoci
product_type_id,
za pomoc klauzuli HAVING ograniczy zwrcone wyniki jedynie do tych, w ktrych

rednia cena jest wiksza od 20 z.


Demonstruje to ponisze zapytanie:
SELECT product_type_id, AVG(price)
FROM products
GROUP BY product_type_id
HAVING AVG(price) > 20;
PRODUCT_TYPE_ID AVG(PRICE)
--------------- ---------1
24,975
2
26,22

Jak widzimy, zostay wywietlone jedynie wiersze, w ktrych rednia cena jest wiksza ni 20 z.

Rozdzia 4. Proste funkcje

147

Jednoczesne uywanie klauzul WHERE i GROUP BY


Klauzule WHERE i GROUP BY mog by uyte w tym samym zapytaniu. Wwczas klauzula WHERE
najpierw filtruje zwracane wiersze, a nastpnie klauzula GROUP BY grupuje pozostae w bloki. Na
przykad w poniszym zapytaniu:
Klauzula WHERE filtruje wiersze tabeli products, wybierajc jedynie te, w ktrych
warto price jest mniejsza od 15.
Klauzula GROUP BY grupuje pozostae wiersze wedug wartoci kolumny product_type_id.
SELECT product_type_id, AVG(price)
FROM products
WHERE price < 15
GROUP BY product_type_id
ORDER BY product_type_id;
PRODUCT_TYPE_ID AVG(PRICE)
--------------- ---------2
14,45
3
13,24
4
12,99
13,49

Jednoczesne uywanie klauzul WHERE,


GROUP BY i HAVING
Klauzule WHERE, GROUP BY i HAVING mog zosta uyte w tym samym zapytaniu. Wwczas klauzula
WHERE najpierw filtruje zwracane wiersze, a nastpnie klauzula GROUP BY grupuje pozostae wiersze
w bloki, po czym klauzula HAVING filtruje grupy wierszy. Na przykad w poniszym zapytaniu:
Klauzula WHERE filtruje wiersze tabeli products, wybierajc jedynie te, w ktrych warto
price jest mniejsza od 15.
Klauzula GROUP BY grupuje pozostae wiersze wedug wartoci kolumny product_type_id.
Klauzula HAVING filtruje grupy wierszy, wybierajc jedynie te, w ktrych rednia cena

jest wysza ni 13.


SELECT product_type_id, AVG(price)
FROM products
WHERE price < 15
GROUP BY product_type_id
HAVING AVG(price) > 13
ORDER BY product_type_id;
PRODUCT_TYPE_ID AVG(PRICE)
--------------- ---------2
14,45
3
13,24
13,49

148

Oracle Database 11g i SQL. Programowanie

Porwnajmy te wyniki z poprzednim przykadem: po filtracji zostaa usunita grupa wierszy,


w ktrych product_type_id ma warto 4, a to dlatego, e w tej grupie wierszy rednia cena jest
mniejsza od 13.
Ostatnie zapytanie wykorzystuje klauzul ORDER BY AVG(price) w celu uporzdkowania wynikw wedug redniej ceny:
SELECT product_type_id, AVG(price)
FROM products WHERE price < 15
GROUP BY product_type_id
HAVING AVG(price) > 13
ORDER BY AVG(price);
PRODUCT_TYPE_ID AVG(PRICE)
--------------- ---------3
13,24
13,49
2
14,45

Podsumowanie
Z tego rozdziau dowiedziae si, e:
W bazie danych Oracle wystpuj dwie gwne grupy funkcji: jednowierszowe

i agregujce.
Funkcje jednowierszowe operuj na pojedynczych wierszach i zwracaj jeden wiersz

wynikw dla kadego wiersza wejciowego. Wystpuje pi gwnych typw funkcji


jednowierszowych: znakowe, numeryczne, konwertujce, dat i wyrae regularnych.
Funkcje agregujce operuj na wielu wierszach i zwracaj jeden wiersz wynikw.
Bloki wierszy mog by grupowane za pomoc klauzuli GROUP BY.
Grupy wierszy mog by filtrowane za pomoc klauzuli HAVING.

W nastpnym rozdziale zawarto szczegowe informacje o datach i czasie.

You might also like