Professional Documents
Culture Documents
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
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
Spis treci
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
10
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
12
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
14
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
16
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
114
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
--------------------
115
Opis
ASCII(x)
CHR(x)
CONCAT(x, y)
INITCAP(x)
INSTR(x, szukany_napis
[, start] [, wystpienie])
LENGTH(x)
LOWER(x)
LPAD(x, szeroko,
[napis_dopenienia])
LTRIM (x
[, napis_przycinany])
NANVL(x, warto)
Zwraca warto, jeeli x jest wartoci specjaln NAN (nieliczb). (Ta funkcja
zostaa wprowadzona w Oracle Database 10g)
NVL(x, warto)
REPLACE(x, szukany_napis,
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)
TRIM([usuwany_znak FROM] x)
UPPER(x)
116
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
117
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
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().
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
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
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
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():
121
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)
ABS(10) = 10
ABS(-10) = 10
ACOS(x)
ACOS(1) = 0
ACOS(-1) = 3,14159265
ASIN(x)
ASIN(1) = 1,57079633
ASIN(-1) = -1,57079633
ATAN(x)
ATAN(1) = 0,785398163
ATAN(-1) = -0,78539816
ATAN2(x, y)
BITAND(x, y)
BITAND(0, 0)
BITAND(0, 1)
BITAND(1, 0)
BITAND(1, 1)
NITAND(1010,
COS(x)
COS(90 * 3.1415926) = 1
COS(45 * 3.1415926) = -1
= 0
= 0
= 0
= 1
1100) = 64
COSH(x)
COSH(3.1415926) = 11,5919527
CEIL(x)
CEIL(5.8) = 6
CEIL(-5.2) = -5
EXP(x)
EXP(1) = 2,71828183
FLOOR(5.8) = 5
FLOOR(-5.2) = 6
FLOOR(x)
EXP(2) = 7,3890561
122
Opis
Przykady
LOG(x, y)
LOG(2, 4) = 2
LOG(2, 5) = 2,32192809
LN(x)
LN(2.71828183) = 1
MOD(x, y)
MOD(8, 3) = 2
MOD(8, 4) = 0
POWER(x, y)
POWER(2, 1) = 2
POWER(2, 3) = 8
ROUND(x [, y])
ROUND(5.75) = 6
ROUND(5.75, 1) = 5,8
ROUND(5.75, -1) = 10
SIGN(x)
SIGN(-5) = -1
SIGN(5) = 1
SIGN(0) = 0
SIN(x)
SIN(0) = 0
SINH(x)
SINH(1) = 1,17520119
SQRT(x)
SQRT(25) = 5
SQRT(5) = 2,23606798
TAN(x)
TAN(0) = 0
TANH(x)
TANH(1) = 0,761594156
TRUNC(x [, y])
TRUNC(5.75) = 5
TRUNC(5.75, 1) = 5,7
TRUNC(5.75, -1) = 0
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.
123
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
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
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;
125
SIGN(5)
SIGN(-5)
SIGN(0)
---------- ---------- ---------1
-1
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
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
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
Opis
ASCIISTR(x)
BIN_TO_NUM(x)
CAST(x AS typ)
CHARTORWIND(x)
Konwertuje x na ROWID
COMPOSE(x)
CONVERT(x,
rdowy_zestaw_znakw,
docelowy_zestaw_znakw)
DECODE(x, wyszukiwane,
wynik, domylna)
DECOMPOSE(x)
HEXTORAW(x)
NUMTODSINTERVAL(x)
NUMTOYMINTERVAL(x)
RAWTOHEX(x)
RAWTONHEX(x)
ROWIDTOCHAR(x)
ROWIDTONCHAR(x)
TO_BINARY_DOUBLE(x)
TO_BINARY_FLOAT(x)
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])
TO_CLOB(x)
TO_DATE(x [, format])
TO_DSINTERVAL(x)
TO_MULTI_BYTE(x)
127
Opis
TO_NCHAR(x)
TO_NCLOB(x)
TO_NUMBER(x [, format])
TO_SINGLE_BYTE(x)
TO_TIMESTAMP(x)
TO_TIMESTAMP_TZ(x)
TO_YMINTERVAL(x)
TRANSLATE(x,
napis_rdowy,
napis_docelowy)
UNISTR(x)
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
Przykad formatu
Opis
999
0999
9990
999.99
999,99
$999
B9.99
999C
9D99
EEEE
9.99EEEE
FM
FM90.9
9G999
999L
MI
999MI
PR
999PR
Zwraca liczb ujemn w nawiasach ostroktnych (< >) oraz liczb dodatni
poprzedzon i zakoczon znakiem spacji
RN
RN
Rn
rn
S999
999S
TM
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
129
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
'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;
131
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
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().
132
i chcemy z niej pobra te z przedziau od 1965 do 1968. Moemy to zrobi za pomoc wyraenia regularnego:
^196[5-8]$
Zamy, e chcemy wyszuka podnapis blask. Posuy do tego ponisze wyraenie regularne:
b[[:alpha:]]{4}
Znaczenie
Przykady
ba+rk jest speniane przez bark, baark itd., ale nie przez brk
znakiem napisu
znakiem napisu
133
Znaczenie
Przykady
{n}
{n,m}
Oznacza przynajmniej n
i maksymalnie m wystpie znaku,
gdzie n i m s liczbami cakowitymi
(wzorzec)
x|y
[abc]
[a-z]
[: :]
[..]
Brak przykadu
[==]
Brak przykadu
\n
134
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
\w
sowo
\W
niesowo
\s
\S
\A
speniane tylko przez pocztek napisu lub jego koniec, jeeli znajduje si przed znakiem
nowego wiersza
\Z
*?
+?
??
{n}
{n,}
{n,m}
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
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]$');
135
Opis
REGEXP_LIKE(x, wzorzec
[, opcja_dopasowania])
REGEXP_INSTR(x, wzorzec
[, start
[, wystpienie
[, opcja_zwracania
[, opcja_dopasowania
[, opcja_podwyraenia]]]])
REGEXP_REPLACE(x, wzorzec
[, napis_zastpujcy
[, start
[, wystpienie
[, opcja_dopasowania]]]])
REGEXP_SUBSTR(x, wzorzec
[, start
[, wystpienie
[, opcja_dopasowania
[, opcja_podwyraenia]]]])
REGEXP_COUNT(x, wzorzec
[, start
[, opcja_dopasowania]])
136
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
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!
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
138
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
Opis
AVG(x)
COUNT(x)
MAX(x)
MEDIAN(x)
Zwraca median x
MIN(x)
STDDEV(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;
139
AVG(PRICE)
---------19,7308333
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
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;
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
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.
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.
143
144
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.
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;
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
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
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
Jak widzimy, zostay wywietlone jedynie wiersze, w ktrych rednia cena jest wiksza ni 20 z.
147
148
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