Bazy danych 2 - staff.uz.zgora.plstaff.uz.zgora.pl/afiedoro/pliki/2016/wyklad1.pdf3.A. Klusiewicz,...

40
Bazy danych 2 Anna Fiedorowicz Wydzial Matematyki, Informatyki i Ekonometrii 24.02.2016

Transcript of Bazy danych 2 - staff.uz.zgora.plstaff.uz.zgora.pl/afiedoro/pliki/2016/wyklad1.pdf3.A. Klusiewicz,...

Bazy danych 2

Anna Fiedorowicz

Wydział Matematyki, Informatyki i Ekonometrii

24.02.2016

Literatura

1. S. Urman, R. Hardman, M. McLaughlin, Oracle Database 10g.Programowanie w jezyku PL/SQL, Helion, 2007.

2. R. Coburn: SQL dla kazdego, Helion, 2001.

3. A. Klusiewicz, SQL i PL/SQL – podstawy, 2013(http://jsystems.pl/storage/sqlplsql1.pdf).

4. M. McLaughlin, Oracle Database 11g PL/SQL Programming,McGraw-Hill, 2008.

5. Dokumentacja dostepna na stronie Oracle.

6. W.J. Gilmore, B. Bryla, Beginning PHP and Oracle: From Novice toProfessional, APress 2007.

7. Y. Vasiliev, PHP i Oracle. Tworzenie aplikacji webowych: odprzetwarzania danych po Ajaksa, Helion 2009.

8. T. Converse, J. Park, C. Morgan, PHP5 i MySQL. Biblia, Helion, 2005.

Baza danych: zbiór danych zapisanych w scisle okreslony sposób, wstrukturach odpowiadajacych przyjetemu modelowi danych.W relacyjnej bazie danych, podstawowa struktura jest tabelarekordów.W uproszczeniu, baza danych obejmuje dane oraz wyspecjalizowanyprogram komputerowy słuzacy do gromadzenia i przetwarzaniadanych.W modelu relacyjnym, zestaw programów słuzacych do korzystania zbazy jest nazywany RDBMS (Relational Database ManagementSystem - system zarzadzania relacyjna baza danych).SQL - strukturalny jezyk zapytan, jest uniwersalnym interfejsemumozliwiajacym tworzenie i utrzymanie struktury bazy danych,dostep do danych oraz zapewnienie bezpieczenstwa danym, poprzezsystem uprawnien uzytkowników. SQL jest tzw jezykiemdeklaratywnym, decyzje o sposobie pobrania i przechowywaniadanych pozostawia sie systemowi zarzadzania baza danych.Systemy RDBMS, w których podstawowym jezykiem jest SQL, todla przykładu Oracle, MS SQL Server, IBM DB2, Firebird, MySQL,PostgreSQL, ...

Podział jezyka SQL:DML (Data Manipulation Language) - umozliwia wybieranie,dodawanie, modyfikacje, usuwanie danych w bazie (SELECT,INSERT, UPDATE, DELETE).DDL (Data Definition Language) - stworzenie i utrzymanie strukturybazy (CREATE, ALTER, DROP).DCL (Data Control Language) - zarzadzanie uprawnieniami w bazie(GRANT, REVOKE).

(Niektóre) standardy jezyka SQL:Rok Nazwa Uwagi1986 SQL-86 pierwszy standard ANSI1992 SQL-92 SQL2, uscislenie standardu2003 SQL-2003 wprowadzenie m.in. obsługi XML-a (SQL/XML)2011 SQL:2011 aktualny standard ANSI.

Serwer bazy danych Oracle

Serwer bazy danych Oracle obejmuje szereg plików, procesów istruktur pamieci, umozliwiajacych przede wszystkim trwałeprzechowywanie danych i wykonywanie instrukcji SQL.

Oprócz tego niektóre ze składowych słuza do poprawieniaefektywnosci korzystania z bazy danych, do zapewnieniaodtwarzalnosci bazy danych w przypadku awarii oprogramowania lubsprzetu, do wykonywania innych zadan potrzebnych przy eksploatacjibazy danych.

Baza danych Oracle oprócz tego, ze wykorzystuje jezyk SQL, posiadatez rozszerzenie proceduralne jezyka SQL — wbudowanywewnetrzny jezyk tworzenia procedur składowanych PL/SQL.

Serwer bazy danych Oracle

Ogólnie rzecz biorac, serwer bazy danych Oracle składa sie z dwóchczesci:

I bazy danych: zbioru plików znajdujacych sie na dysku,zawierajacych dane;

I instancji: procesy serwera, wraz z przydzielonymi strukturamipamieci i procesami tła, umozliwiajace dostep do danych.

Baza danych Oracle: składasie z plików systemuoperacyjnego, nazywanychplikami bazodanowymi, któresa miejscem przechowywaniadanych. Zwykle mamy doczynienia z sytuacja, w którejtylko jedna instancja Oracle madostep do bazy danych.

Instancja: kazda baza danychOracle database jest powiazanaz odpowiednia instancja. Wmomencie uruchomieniaserwera bazy danych, nastepujealokacja w pamieci operacyjnejobszaru pamieci, który jestwspółdzielony (dostepny dlawszystkich uzytkowników bazydanych), nazywanego SystemGlobal Area (SGA) (tzwGlobalny Obszar Wpółdzielony)oraz uruchomienie przez Oracleprocesów serwera i procesówtła. Instancja Oracle to własniepołaczenie obszaru pamieciSGA oraz procesów tła.

Uzytkownik nie pobiera danych bezposrednio z pliku bazy danych.

Polecenie SQL zadane przez uzytkownika trafia najpierw doodpowiedniego bufora w strukturze SGA (za posrednictwemodpowiedniego procesu serwera), nastepnie jest przetwarzane ianalizowane, potem pobierane sa dane z plików danych do obszaruSGA. Dopiero stad informacja jest przekazywana do uzytkownika.

Program Global Area (PGA): obszar pamieci przydzielony (nawyłacznosc) dla kazdego procesu serwera i procesu tła. Kazdy procesma przydzielony własny obszar PGA.

Baza danych Oracle funkcjonuje w architekturze klient-serwer,zapewniajac jednoczesny dostep do danych dla wielu uzytkowników,realizowany za pomoca mechanizmu transakcji.

Moment podłaczenia sie uzytkownika do bazy jest równoznaczny zotwarciem nowej sesji dla danego uzytkownika. W obrebie sesji,uzytkownik moze realizowac jedna lub wiecej transakcji, jedna podrugiej (transakcja jest jednostka interakcji uzytkownika z bazadanych i składa sie z pojedynczych operacji realizowanych w baziedanych (np. przez polecenia SQL). Równolegle, jeden uzytkownikmoze miec w danym momencie otwartych wiecej niz jedna sesje.

Uzytkownicy i schematy

Uzytkownik tworzac obiekt, np. tabele, staje sie jego włascicielem.Obiekty te sa tworzone w schemacie uzytkownika (logicznejprzestrzeni bazy danych). Schemat uzytkownika jest tworzonyautomatycznie podczas definiowania uzytkownika i posiada unikalnanazwe (identyczna z nazwa uzytkownika).

Nazwa schematu jest wykorzystywana, aby wskazac obiekty bazydanych stanowiace własnosc danego uzytkownika (w róznychschematach moga istniec obiekty, np. tabele, o tych samych nazwach).

Odwołanie do obiektu znajdujacego sie w schemacie innegouzytkownika realizowane jest nastepujaco:nazwa_uzytkownika.nazwa_obiektu

Uzytkownik HR i jego schematOracle posiada przedefiniowanego uzytkownika HR, który słuzy docelów testowych. W schemacie HR mamy kilka tabel zprzykładowymi danymi:

Domyslnie, konto HR jest zablokowane. Aby je odblokowac, nalezywydac instrukcje (z poziomu administratora czyli SYSTEM):ALTER USER HR IDENTIFIED BY password ACCOUNTUNLOCK;

Obiekty bazy danych

W Oracle istnieja obiekty słuzace do przechowywania danych, jak iwspomagajace zarzadzanie tymi danymi:tabele: przechowywanie danych;indeksy: struktury danych zwiekszajace predkosc wykonywaniaoperacji na tabelach;tabele tymczasowe: przechowuja dane potrzebne w czasie jednejsesji (transakcji), wspomagaja zarzadzanie nimi;widoki: logiczna struktura, definiowana przez zapytanie SQL;sekwencje: generuja kolejne liczby (wykorzystywane do tworzeniawartosci kluczy);wyzwalacze: procedury wykonywane automatycznie, reagujace napewne zdarzenia w bazie danych;procedury, pakiety, funkcje, ...

Instrukcja SELECT

I Instrukcja select w najprostszej postaci pobiera wszystkie dane zwybranej tabeli.select * from department;

I SELECT wybranych kolumn Po wyrazeniu SELECT okreslamynazwy kolumn, które maja zostac wybrane do wyswietlenia.Mozna wybierac stałe lub wyrazenia.

I Aliasy kolumn Czasem zdarza sie ze nazwy kolumn sa małozrozumiałe lub „przyjazne” dla uzytkownika. W takim wypadkuw wyniku zapytania mozemy zamienic je na własne aliasy.select full_name as “nazwisko i imie” fromemployees;

I Klauzula DISTINCT Słowo kluczowe distinct słuzy dowyswietlenia wartosci lub szeregu wartosci bez powtórzen.Stosuje sie je w przypadku gdy chcemy wiedziec jakie w ogólewartosci wystepuja w danej kolumnie a nie interesuje nas ichczestotliwosc wystepowania.

Sortowanie

I sortowanie klauzula ORDER BY Mozemy wyswietlic daneposortowane wg wybranej kolumny. W tym celu dodajemy dozapytania klauzule order by okreslajaca kolumne wg której danemaja byc sortowane. ASC - sortowanie rosnace, DESC -malejace. Jesli nie istnieje potrzeba stosowania sortowania, niepowinnismy z niej korzystac poniewaz powoduje dodatkoweniepotrzebne obciazenie serwera bazy danych.

I Klauzule NULLS FIRST I NULLS LAST Aby zmienic sposóbtraktowania wartosci pustych przy sortowaniu, musimy ponazwie sortowanej kolumny dodac klauzule NULLS FIRST lubNULLS LAST.

Filtrowanie wierszyI Operatory

Budujac zapytania do bazy danych Oracle mozemy korzystac zoperatorów które pozwalaja porównywac, wykonywac operacje,łaczenia i porównania wartosci.

I Operatory arytmetyczne Pozwalaja wykonywac operacjematematyczne na wartosciach. Naleza do nich: +,−, ∗, /

I Operator konkatenacji || Operator ten słuzy do łaczenia dwuwartosci tekstowych.

I Operatory porównan>,>=,=, <,<=, <>, ! =

I Operator zakresux [NOT] BETWEEN y AND zOperator ten sprawdza, czy wartosc x miesci [nie miesci] sie wprzedziale domknietym <y,z>

I Operator przynaleznosci do listyx [NOT] IN (x1, x2, ..., xn)Operator ten sprawdza, czy wartosc x znajduje [nie znajduje ] siena liscie wartosci x1, x2, ..., xn.

I Operator wzorcax [NOT] LIKE yOperator ten sprawdza, czy wartosc napisu x przystaje [nieprzystaje] do maski y. Podczas definiowania maski mozemykorzystac ze znaków specjalnych: „%” zastepuje dowolna iloscdowolnych znaków, natomiast „_” zastepuje dokładnie jedendowolny znak.

I Operator testowania wartosci pustychx IS [NOT] NULLOperator ten sprawdza, czy x zawiera [nie zawiera] wartosciNULL.

I Operatory logiczne NOT, AND, OR Operatory te słuza donadawania wiecej niz jednego warunku w zapytaniu.

Uwaga: "Arytmetyka wartosci pustych"

Kazde wyrazenie arytmetyczne zawierajace choc jeden składnik lubczynnik z wartoscia pusta daje pusty wynik.

TRUE AND NULL => NULLFALSE AND NULL => FALSETRUE OR NULL => TRUEFALSE OR NULL => NULL

Funkcje jednowierszowe. Funkcje znakowe

Upper: Zamienia wszystkie litery na wielkie.

Lower: Zamienia wszystkie litery na małe.

Initcap: Zwieksza pierwsze litery wszystkich wyrazów.

np. select initcap(’ola, ala’) from dual;

Uwaga: dual: specjalna tablica w Oracle, z jednym wierszem i jednakolumna, uzywamy jej w przypadku pisania zapytan, które nieodwołuja sie do danych z zadnej tablicy (widoku).Lpad(text,n,znak) Funkcja uzupełniajaca z lewej strony znakamipodanymi jako trzeci argument w taki sposób by wynik osiagnałdługosc podana jako drugi parametr. Jesli wynik jest dłuzszy nizzadeklarowana długosc, zostaje uciety z prawej strony.

np. select Lpad(job_code,5, ’x’) from employees;Rpad(text,n,znak) Funkcja uzupełniajaca z prawej strony wynikznakami podanymi jako trzeci argument w taki sposób, by wynikosiagnał długosc podana jako drugi parametr. Jesli wynik jest dłuzszyniz zadeklarowana długosc, zostaje uciety z prawej strony.

Funkcje znakowe

RTrim(text,text2), LTrim(text,text2)Funkcje te usuwaja z prawej lub lewej strony napisu text znakizawarte w text2. Jesli nie podamy wartosci text2, usuniete zostanaspacje (i w praktyce do tego tych funkcji uzywa sie najczesciej).

Replace (text, text1 [,text2]) Funkcja zamienia wszystkiewystapienia ciagu text1 w ciagu text na text2. W przypadku brakuciagu text2 z ciagu text usuwane sa wszystkie wystapienia ciagu text1.

translate (text, text1 ,text2) Funkcja działa podobnie jak funkcjareplace, tylko ze zamienia w ciagu text wszystkie wystapieniapojedynczych liter z ciagu text1 na odpowiednie litery z ciagu text2.np. selecttranslate(last_name,’acełnószz’,’acelnoszz’)from employees;length (text)Zwraca długosc ciagu text, jesli text ma wartosc NULL funkcjazwraca NULL.np. select length(last_name) from employees;

Funkcje znakowe

Substr(text, m [,n]): Funkcja wycina z ciagu text n znakówpoczawszy od pozycji m. Jezeli n nie jest podane, to wycinawszystkie znaki od pozycji m do konca ciagu text. Jezeli m jestujemne, to znaki sa odliczane od konca ciagu text. Przykłady:

(1) Wyswietlenie pierwszych czterech znaków nazwiska.select substr(last_name,1,4) from employees;

(2) Funkcja substr z uzyciem dwóch parametrów—zwróci ciagznaków zaczynajac od drugiego znaku, do konca (czyli usuniepierwszy znak).select substr(last_name,2) from employees;

(3) Substr z m ujemnym. Parametr n najbezpieczniej w takiej sytuacjijest podac wiekszy niz długosc najdłuzszego wyrazu (jezeli |m| jestwieksza niz długosc, zwraca null).select substr(last_name, -2, 20) fromemployees; //ostatnie dwa znaki z nazwiska

Funkcje znakowe

to_char Funkcja ta ma kilka zastosowan. Jedno z nich odnosi sie dozamiany liczb na postac znakowa. Inne formy to_char zostanaomówione pózniej.

to_char (liczba [,wzorzec])—zamienia liczbe na postac znakowawedług podanego wzorca.np. Chcemy wyswietlic roczne wynagrodzenie pracownikówpodzielone przez 12, otrzymalismy mało czytelny wynik:select last_name, salary/12 as "miesiecznezarobki"from employees;

Stosujac funkcje to_char mozemy zamienic go na odpowiadajacy namformat:select last_name,to_char((salary/12),’9999.99’)as "miesieczne zarobki"from employees;

Wzorzec w funkcji to_char jest napisem, który moze zawieracnastepujace elementy:

Element Opis Przykład Wynik

9 Cyfra (liczba dziewiątek określa szerokość pola)

999999 1234

0 Wyświetl wiodące zera 099999 001234 $ Ruchomy znak dolara $999999 $1234

L Ruchomy znak lokalnej waluty

L999999 zł1234

. Kropka dziesiętna na wskazanej pozycji

9999.99 1234.00

, Przecinek na wskazanej pozycji

999,999 1,234

MI Znak minus z prawej strony (przy wartościach ujemnych)

9999MI 1234-

PR Liczby ujemne w nawiasach 9999PR <1234>

EEEE Notacja inżynierska (w formacie muszą być cztery E)

9.9EEEE 1.2E+03

V Pomnóż przez 10 n razy (n to liczba dziewiątek po V)

9999V99 123400

Funkcje znakowe

to_number (text [,wzorzec])Funkcja zamienia ciag znaków na liczbe według wzorcazbudowanego podobnie dla funkcji to_char (jak powyzej). Funkcja tajest przydatna, gdy w naszej bazie liczby przechowywane sa wpostaci tekstowej.

SELECT To_Number(postal_code, 99999)FROM locationsWHERE country_id=’US’;

decodeSelect decode (nazwa_kolumny,wartosc,zamiennik, wartosc2, zamiennik2,wartoscdomyslna) [alias] from nazwa_tabeli;Funkcja testuje wartosc w podanej kolumnie i w zaleznosci odwartosci mieszczacej sie w pierwszym argumencie zwraca wartoscpodana w drugim argumencie. Jesli nie znajdzie odpowiedniejwartosci w podanych warunkach, wyswietli wartosc domyslna podanajaka ostatni warunek.

Funkcje numeryczneROUND (x,[,y])Zaokragla x z dokładnoscia do y miejsc po przecinku. Jesli y niezostało podane, jest domyslnie ustawiane jako 0. ( select

round(15.75 , 1) from dual; -> 15.8

TRUNC (x,[,y]) Ucina x z dokładnoscia do y miejsc po przecinku.Jesli y nie zostało podane, jest domyslnie ustawiane jako 0.Uwaga! round, trunc z ujemnym parametrem y zaokragla (obcina)liczbe z lewej strony przecinka, czyli do dzisiatek, setek, tysiecy, itp.)

POWER (x,y) –> xy.

SQRT(x) –>√

x.

SIGN(x)Zwraca wartosc 0, 1 lub -1 w zaleznosci od znaku liczby x.

ABS(x) Wartosc bezwzgledna liczby x.

MOD(x,y) Reszta z dzielenia x przez y. Jesli y = 0 zwraca x.

SIN(x), COS(x), TAN(x)Funkcje trygonometryczne, x jest podawane w radianach.

Daty

Aktualna data jest przechowywana w zmiennej systemowejSYSDATE.select sysdate from dual;

Daty mozna równiez od siebie odjac. Wynikiem bedzie liczba dnipomiedzy datami.Do daty mozemy równiez dodac liczbe całkowita i jako wynikuzyskamy date za podana ilosc dni.

MONTHS_BETWEEN(date1,date2)Zwraca ilosc miesiecy pomiedzy datami.

ADD_MONTHS(date,n)Dodaje do podanej daty n miesiecy, np.SELECT Add_Months(SYSDATE,3) FROM dual;

LAST_DAY(date)Zwraca date ostatniego dnia miesiaca zawierajacego podana date.

Daty

ROUND(date[,p])Funkcja zaokragla date do północy, jesli jest przed południem lub dopółnocy dnia nastepnego, jesli jest po południu. W przypadku podaniadodatkowego parametru p zaokragla date do pełnego miesiaca(p=’month’) lub roku (p=’year’),np. zaokraglenie do pełnego miesiaca:SELECT Round(SYSDATE,’month’) FROM dual;

TRUNC(date[,p])Ucina daty. Parametr p działa analogicznie, jak dla round.

Daty

to_date (text [,text1])Funkcja zamienia ciag znaków text na date według wzorca zawartegow text1. Wzorzec pozwala poprawnie zinterpretowac znaki zawarte wciagu text. Uzywamy najczesciej przy wstawianiu dat do bazy.SELECT To_date(’20010509’,’yyyymmdd’) FROMdual;SELECT To_date(’2001-05-09’,’yyyy-mm-dd’) FROMdual;SELECT To_date(’2001 V 09 18:34’,’yyyy rm ddhh24:mi’) FROM dual;SELECT To_date(’January 15, 1989’, ’Month dd,YYYY’,’NLS_DATE_LANGUAGE = English’) FROMdual;

Formaty dla funkcji to_date:

Parametr Opis Komentarz

YYYY Czterocyfrowy rok

YYY YY Y Ostatnie 3, 2 lub 1 cyfra roku.

RRRR Przyjmuje dwucyfrowy rok, a zwraca w czterocyfrowej notacji.

Warto ci z zakresu 0-49 zwróci jako lata 20 wieku. Warto ci z zakresu 50-99 zwróci jako lata 19 wieku.

MM Miesi c (01-12).

MON Trzyliterowa nazwa miesi ca. sty, lut, mar,...

MONTH Nazwa miesi ca. stycze , luty, itp.

RM Rok w notacji rzymskiej. I-XII

DD Dzie w miesi cu (1-31).

DDD Dzie w roku (1-366).

HH Godzina w dobie (1-12).

HH24 Godzina w dobie (0-23).

MI Minuta (0-59).

SS Sekunda (0-59).

Miesiąc w notacji rzymskiej.

21

20

Funkcja to_char dla datto_char (date [,text1])Zamienia date na postac znakowa według wzorca zawartego w ciagutext1. Funkcje to_char mozna wykorzystac do przetwarzania dat wgwzorca. Od omawianej wczesniej odmiany to_char rózni sie rodzajemparametrów. Tutaj przyjmuje daty, wczesniej były to liczby.Dla funkcji to_char stosuje sie te same wzorce dat jak dla funkcjito_date. Mozna tez uzyc ponizszych.

Parametr Opis YEAR Rok, słownie Q Kwartał roku (1, 2, 3, 4). WW Tydzień w roku. W Tydzień w miesiącu. D Dzień w tygodniu (1-7). DAY Nazwa dnia tygodnia.

Funkcja EXTRACT

EXTRACT(part from datetime) zwraca wartoscodpowiedniego pola z daty lub godziny. Funkcji mozemy uzyc, abywybrac rok (YEAR), miesiac (MONTH) lub dzien (DAY) z daty, albogodzine (HOUR), minute (MINUTE) lub sekunde (SECOND) z polatypu timestamp.Wybierzmy wszystkich pracowników zatrudnionych od 2005 roku:SELECT * FROM employeesWHERE EXTRACT(YEAR FROM hire_date)>=2005;Ponizsza instrukcja wybiera godzine, minute i sekunde z daty igodziny systemowej:SELECT EXTRACT(HOUR FROM SYSTIMESTAMP),EXTRACT(MINUTE FROM SYSTIMESTAMP),EXTRACT(SECOND FROM SYSTIMESTAMP)FROM DUAL;

Funkcje NVL, NULLIF, COALESCE

Funkcja NVL(wyrazenie, wartosc zastepcza) - jezeliwartoscia wyrazenia jest NULL, zwraca wartosc zastepcza.SELECT city, nvl(state_province,’brak’)from locations;

COALESCE(wartosc1, wartosc2, wartosc3, ...) -słuzy do wyswietlania z ciagu wartosci pierwszej, która nie jestNULL. Nalezy zachowac zgodnosc typów wartosci na liscie.SELECT city, COALESCE(state,shortcut,’brak’)FROM locations;

Funkcja NULLIF(wartosc1, wartosc2) - słuzy dosprawdzenia czy dwie wartosci sa równe. Jesli wartosc1=wartosc2, tozwraca NULL, przeciwnie - zwraca pierwsza z podanych wartosci.SELECT e.last_name, e.job_id,NULLIF(j.job_id, e.job_id) AS "old job id"FROM employees e, job_history jWHERE e.employee_id = j.employee_id;

Funkcje NVL, NULLIF, COALESCE

Funkcja NVL(wyrazenie, wartosc zastepcza) - jezeliwartoscia wyrazenia jest NULL, zwraca wartosc zastepcza.SELECT city, nvl(state_province,’brak’)from locations;

COALESCE(wartosc1, wartosc2, wartosc3, ...) -słuzy do wyswietlania z ciagu wartosci pierwszej, która nie jestNULL. Nalezy zachowac zgodnosc typów wartosci na liscie.SELECT city, COALESCE(state,shortcut,’brak’)FROM locations;

Funkcja NULLIF(wartosc1, wartosc2) - słuzy dosprawdzenia czy dwie wartosci sa równe. Jesli wartosc1=wartosc2, tozwraca NULL, przeciwnie - zwraca pierwsza z podanych wartosci.SELECT e.last_name, e.job_id,NULLIF(j.job_id, e.job_id) AS "old job id"FROM employees e, job_history jWHERE e.employee_id = j.employee_id;

Funkcje NVL, NULLIF, COALESCE

Funkcja NVL(wyrazenie, wartosc zastepcza) - jezeliwartoscia wyrazenia jest NULL, zwraca wartosc zastepcza.SELECT city, nvl(state_province,’brak’)from locations;

COALESCE(wartosc1, wartosc2, wartosc3, ...) -słuzy do wyswietlania z ciagu wartosci pierwszej, która nie jestNULL. Nalezy zachowac zgodnosc typów wartosci na liscie.SELECT city, COALESCE(state,shortcut,’brak’)FROM locations;

Funkcja NULLIF(wartosc1, wartosc2) - słuzy dosprawdzenia czy dwie wartosci sa równe. Jesli wartosc1=wartosc2, tozwraca NULL, przeciwnie - zwraca pierwsza z podanych wartosci.SELECT e.last_name, e.job_id,NULLIF(j.job_id, e.job_id) AS "old job id"FROM employees e, job_history jWHERE e.employee_id = j.employee_id;

Wyrazenie CASE

Wyrazenie CASE mozna stosowac w dwojaki sposób:

CASE wartoscWHEN wartosc1 THEN wyrazenie1WHEN wartosc2 THEN wyrazenie2...WHEN wartosc_n THEN wyrazenie_nELSE wartosc domyslnaENDPowyzsza forma odpowiada zaprezentowanej wczesniej funkcjiDECODE (klauzula ELSE ... nie jest wymagana).

Wyrazenie CASE

Wyrazenie CASE mozna stosowac w dwojaki sposób:

CASE wartoscWHEN wartosc1 THEN wyrazenie1WHEN wartosc2 THEN wyrazenie2...WHEN wartosc_n THEN wyrazenie_nELSE wartosc domyslnaENDPrzykład:

SELECT last_name, salary,CASE job_idWHEN ’AD_PRESS’ THEN salary*0.2WHEN ’AD_VP’ THEN salary*0.15WHEN ’FI_MGR’ THEN salary *0.1ELSE 0END AS premiafrom employees;

Wyrazenie CASE

W drugiej formie mozna stosowac CASE jako instrukcje warunkowa:

CASEWHEN warunek1 THEN wyrazenie1WHEN warunek2 THEN wyrazenie2...ELSE wyrazenie_elseENDPowyzsza konstrukcja zwróci wartosc wyrazenia1, jezeli warunek1bedzie prawdziwy, wyrazenia2, jezeli warunek2 bedzie spełniony,itd., jezeli zaden warunek nie bedzie spełniony, zwróci wartoscwyrazenia_else.Klauzula ELSE nie jest wymagana.Warunki sa sprawdzane zgodnie z ich kolejnoscia, tzn. wartosczostanie zwrócona dla pierwszego prawdziwego warunku, a dalszewarunki nie sa wtedy sprawdzane.

Wyrazenie CASE

SELECT last_name, department_id,CASEWHEN department_id IN (60, 210, 230) THEN ’IT’WHEN department_id =20 THEN ’Marketing’WHEN department_id =30 THEN ’Sprzedaz’ELSE ’inni’END AS "dział"FROM employeesORDER BY 2;

Wyrazenie CASE

Przykład niewłasciwej kolejnosci warunków w CASE:

SELECT last_name, salary,CASEWHEN salary >5000 THEN ’ok’WHEN salary > 10000 THEN ’super’ELSE ’kiepsko’ENDFROM employees;

Drugi warunek salary > 10000 nigdy nie bedzie sprawdzany!

Wyrazenie CASE

Przykład niewłasciwej kolejnosci warunków w CASE:

SELECT last_name, salary,CASEWHEN salary >5000 THEN ’ok’WHEN salary > 10000 THEN ’super’ELSE ’kiepsko’ENDFROM employees;

Drugi warunek salary > 10000 nigdy nie bedzie sprawdzany!Poprawnie powinno byc:SELECT last_name, salary,CASEWHEN salary >10000 THEN ’super’WHEN salary > 5000 THEN ’ok’ELSE ’kiepsko’ENDFROM employees;