88
1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza Danych Przestrzeń Tabel Segment Ekstent Blok Danych Plik Danych Blok Danych Systemu Operacyjnego LOGICZNA FIZYCZNA Wiele elementów

ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

Embed Size (px)

Citation preview

Page 1: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

1

ORACLESQL

"Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej"

Albert Einstein

Adam Pelikant

Organizacja bazy danych

Baza Danych

Przestrzeń Tabel

Segment

Ekstent

Blok Danych

Plik Danych

Blok Danych Systemu Operacyjnego

LOGICZNA FIZYCZNA

Wiele elementów

Page 2: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

2

Podstawowy schemat bazy danych

Ciąg o stałej długości. Maksymalny rozmiar określony ilością bajtów na znak -2000 bajtów. Standardowy - 1 bajt.

NCHAR(rozmiar)

Ciąg o stałej długości. Maksymalny rozmiar - 2000 bajtów. Standardowy - 1 bajt.

CHAR(rozmiar)

Szestnastkowy ciag reprezentujący logiczny adres krotki zorganizowanej w indeks. Maksymalny (i defaultowy) rozmiar - 4000 bajtów.

UROWID

Szestnastkowy ciag reprezentujący logiczny adres krotki zorganizowanej w indeks. Minimalny rozmiar - 1 bajt.

ROWID

Czyste dane o dlugości równej ilości bajtów. Maksymalna długośc: 2 GBLONG RAW

Czyste dane o dlugości równej ilości bajtów. Maksymalna długośc: 4000 bajtów

RAW(rozmiar)

Data od 1 stycznia 4712 p.n.e do 31 grudnia 9999 n.eDATE

Ciąg znaków o zmiennej długości. Maksymalna długośc 2 GBLONG

Liczba mająca p miejsc calkowitych i s miejsc po przecinkuNUMBER(p,s)

Ciąg znaków o zmiennej długości. Maksymalna długośc jest reprezentowana przez ilośc bajtów niezbędną do reprezentacji pojedynczego znaku.Maksymalna długośc : 4000 znaków. Specyfikacja maksymalnej długości jest niezbędna.

NVARCHAR2(rozmiar)

Ciąg znaków o zmiennej długości. Maksymalna długośc : 4000 znaków , minimalna - 1 znak. Specyfikacja maksymalnej długości jest niezbędna.

VARCHAR2(rozmiar)

OpisTyp

Typy danych

Page 3: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

3

Typy danych cd

Zawiera lokację binarnego pliku przechowywanego na zewnątrz bazy danych.Maksymalny rozmiar 4 GB

BFILE

DuŜy binarny plik o maksymalnym rozmiarze 4 GB.BLOB

Obiekt zawierający duŜe ilości tekstu (do 4 GB) gdzie jeden znak jest reprezentowany przez kilka bajtów.

NCLOB

Obiekt zawierający duŜe ilości tekstu (do 4 GB) gdzie jeden znak jest reprezentowany przez jeden bajt.

CLOB

Zapytania wybierające

Składnia podstawowa

SELECT pola FROM relacja

WHERE warunek

GROUP BY pola

HAVING warunek

ORDER BY pola

Page 4: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

4

Zapytania wybierające

Przykłady podstawowe

SELECT Nazwisko, Imie, RokUrodzFROM Osoby;

SELECT * FROM Osoby;

Wyświetlenie trzech wybranych pól z tabeli

Wyświetlenie wszystkich pól z tabeli

Zapytania wybierająceWyraŜenia i Aliasy

SELECT RokUrodz*wzrost AS Iloczyn

FROM Osoby;

SELECT Nazwisko || ' ' || Imie AS Osoba

FROM Osoby;

Wyświetlenie iloczynu dwóch pól

Wyświetlenie łączne Imienia i Nazwiska

SELECT Nazwisko || CHR(9) || Imie AS Osoba

FROM Osoby;

Page 5: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

5

Zapytania wybierające

WyraŜenia i Aliasy w sortowaniu

SELECT RokUrodz*wzrost AS Iloczyn FROM Osoby

ORDER BY RokUrodz*wzrost;

SELECT RokUrodz*wzrost AS Iloczyn FROM OsobyORDER BY Iloczyn;

Sortowanie wg wyraŜenia

Sortowanie wg aliasu

Zapytania wybierające

Operatory

+ dodawanie - odejmowanie * mnożenie / dzielenie% modulo

Algebraiczne Logiczne

& iloczyn bitowy (AND) | suma bitowa (OR)^ (XOR)~ przeczenie bitowe (NOT)

|| Konaktacja łańcucha

Page 6: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

6

Zapytania wybierające

Sortowanie

SELECT Nazwisko, Imie FROM Osoby

ORDER BY RokUrodz;

SELECT Nazwisko, Imie FROM Osoby

ORDER BY RokUrodz ASC;

Sortowanie według pojedynczego pola - rosnąco

Sortowanie według pojedynczego pola - rosnąco

Zapytania wybierające

Sortowanie

SELECT Nazwisko, Imie FROM Osoby

ORDER BY RokUrodz DESC;

SELECT Nazwisko, Imie FROM Osoby

ORDER BY RokUrodz ASC, Wzrost DESC;

Sortowanie według pojedynczego pola - malejąco

Sortowanie według dwóch pól

Page 7: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

7

Zapytania wybierające

Filtrowanie

SELECT Nazwisko, Imie FROM Osoby

WHERE RokUrodz >1960;

SELECT Nazwisko, Imie FROM Osoby

WHERE RokUrodz >1960 AND RokUrodz <1988;

Filtrowanie wg wyraŜenia algebraicznego

Filtrowanie wg wyraŜenia logicznego

Zapytania wybierające

Operatory algebraiczne

= równe < mniejsze niż<= mniejsze niż lub równe > większe niż>= większe niż lub równe<> różne!= nie równe

Page 8: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

8

Zapytania wybierające

Operatory logiczne

NOT negacjaOR suma logicznaAND iloczyn logiczny

FALSEFALSEFALSEFALSE

NULLFALSENULLNULL

NULLFALSETRUETRUE

NULLFALSETRUEAND

NULLFALSETRUEFALSE

NULLNULLTRUENULL

TRUETRUETRUETRUE

NULLFALSETRUEOR

NULLNULL

TRUEFALSE

FALSETRUE

NOT AA

Zapytania wybierająceFiltrowanie – IS NULL

SELECT Nazwisko, Imie FROM Osoby

WHERE RokUrodz = NULL;

SELECT Nazwisko, Imie FROM OsobyWHERE RokUrodz IS NULL;

W celu wykrycia wartośćNULL konieczne jest zastosowananie operatora IS NULL

PoniewaŜ A=NULL=> NULL zapytanie powyŜej zawsze wyświetli 0 rekordów

Page 9: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

9

Zapytania wybierające

Operatory specjalne

BETWEEN przedział dwustronnie domknięty IN lista LIKE podobny do wzorca

ANY prawda jeśli jedna pozycja na liście prawdziwaSOME prawda jeśli kilka pozycji na liście prawdziwychALL prawda jeśli wszystkie pozycje na liście prawdziweEXISTS prawda jeśli zapytanie zwraca rekordy

Zapytania wybierające

Filtrowanie - BETWEEN

SELECT Nazwisko, Imie FROM Osoby

WHERE RokUrodz BETWEEN1960 AND 1980;

SELECT Nazwisko, Imie FROM OsobyWHERE RokUrodz >=1960 AND RokUrodz <=1980;

RównowaŜne zapytanie

Page 10: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

10

Zapytania wybierające

Filtrowanie – IN

SELECT Nazwisko, Imie FROM Osoby

WHERE RokUrodz IN (1960, 1970, 1980);

SELECT Nazwisko, Imie FROM OsobyWHERE RokUrodz = 1960 OR RokUrodz = 1970

OR RokUrodz = 1980);

RównowaŜne zapytanie

Zapytania wybierająceFiltrowanie – IN

SELECT Nazwisko, Imie FROM OsobyWHERE Nazwisko IN ('Kowalski', 'Nowak');

SELECT Nazwisko, Imie FROM OsobyWHERE Nazwisko = 'Kowalski'

OR Nazwisko= 'Nowak'

RównowaŜne zapytanie

SELECT Nazwisko, Imie FROM OsobyWHERE UPPER(Nazwisko) IN ('KOWALSKI', 'NOWAK');

PoniewaŜ ORACLE rozróŜnia wielkośćliter najczęściej sprowadzamy warunek do pisanego tylko duŜymi literami

Page 11: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

11

Zapytania wybierające

Filtrowanie – LIKE

SELECT Nazwisko, Imie FROM OsobyWHERE Nazwisko LIKE 'KOW';

SELECT Nazwisko, Imie FROM OsobyWHERE Nazwisko = 'KOW';

RównowaŜne zapytanie

PoniewaŜ ORACLE rozróŜnia wielkośćliter najczęściej sprowadzamy warunek do pisanego tylko duŜymi literami

SELECT Nazwisko, Imie FROM OsobyWHERE UPPER(Nazwisko) LIKE 'KOW';

Zapytania wybierające

Operator LIKE - znaki specjalne

% dowolny ciąg znaków (w tym ciąg pusty)_ dokładnie jeden znak

ESCAPE definiuje znak po którym znaki specjalne są traktowane dosłownie

Page 12: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

12

Zapytania wybierająceOperator LIKE - znaki specjalne przykłady

SELECT Nazwisko, Imie FROM Osoby

WHERE Nazwisko LIKE 'KOW%';

Nazwiska rozpoczynające się od frazy KOW

Nazwiska kończące się frazą KOW

SELECT Nazwisko, Imie FROM Osoby

WHERE Nazwisko LIKE '%KOW';

Nazwiska posiadające w środku frazę KOW

SELECT Nazwisko, Imie FROM Osoby

WHERE Nazwisko LIKE '%KOW%';

Zapytania wybierająceOperator LIKE - znaki specjalne przykłady cd

SELECT Nazwisko, Imie FROM Osoby

WHERE Nazwisko LIKE 'K%I';

Nazwiska rozpoczynające się od litery K a kończące literą I

Nazwiska w których na trzeciej pozycji występuje litera W

SELECT Nazwisko, Imie FROM Osoby

WHERE Nazwisko LIKE '__W%;

Nazwiska w których występuje znak %

SELECT Nazwisko, Imie FROM Osoby

WHERE Nazwisko LIKE '%\%%' ESCAPE'\';

Page 13: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

13

Zapytania wybierająceGrupowanie

SELECT IdOsoby, SUM(Brutto) AS Razem FROM ZarobkiGROUP BY IdOsoby;

SELECT SUM(Brutto) AS Razem FROM Zarobki;

Wyznaczenie funkcji agregującej dla całej tabeli (wszystkie osoby)

Wyznaczenie funkcji agregującej dla grupy (dla kaŜdej osoby)

Zapytania wybierające

Funkcje agregujące

AVG wartość średniaSUM sumaMAX maksimumMIN minimum

STDDEV odchylenie standardoweVARIANCE wariacja

COUNT zlicz

( ))1(

22

−− ∑∑

nn

xxn

( ))1(

22

−− ∑∑

nn

xxn

Page 14: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

14

Zapytania wybierająceGrupowanie - filtrowanie

SELECT IdOsoby, SUM(Brutto) AS Razem, AVG(Brutto) AS Srednio, COUNT(IdZarobku) AS ileFROM ZarobkiWHERE Brutto > 100GROUP BY IdOsoby;

Wyznaczenie funkcji agregującej dla grupy (dla kaŜdej osoby)

Zapytania wybierająceGrupowanie - filtrowanie

SELECT IdOsoby, SUM(Brutto) AS Razem, AVG(Brutto) AS Srednio, COUNT(IdZarobku) AS ileFROM ZarobkiWHERE Brutto > 100GROUP BY IdOsobyHAVING SUM(Brutto) >500;

Wyznaczenie funkcji agregującej dla grupy (dla kaŜdej osoby)

Niedozwolone jest uŜywanie aliasów

Page 15: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

15

Zapytania wybierająceGrupowanie - filtrowanie

SELECT IdOsoby, SUM(Brutto) AS Razem, AVG(Brutto) AS Srednio, COUNT(IdZarobku) AS ileFROM ZarobkiWHERE Brutto > 100GROUP BY IdOsobyHAVING SUM(Brutto) >500ORDER BY SUM(Brutto) DESC;

Wyznaczenie funkcji agregującej dla grupy (dla kaŜdej osoby)

Dozwolone jest uŜywanie aliasów

Zapytanie z CASE oraz filtrem na liczbę kolumn

SELECT Nazwisko, RokUrodz, CASE

WHEN RokUrodz >=1980 THEN 'Młody'WHEN RokUrodz >=1970 AND RokUrodz <1980 THEN 'Dość młody'WHEN RokUrodz >=1960 AND RokUrodz <1970 THEN 'Średni'WHEN RokUrodz <1960 THEN 'Stary'

ELSE'Nie wiem !!!'

END

FROM OsobyWHERE ROWNUM <20

Page 16: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

16

Zapytanie z CASE oraz filtrem na liczbę kolumn

SELECT Nazwisko, RokUrodz, CASE WHEN RokUrodz >=1980 THEN 'Młody'WHEN RokUrodz >=1970 THEN 'Dość młody'WHEN RokUrodz >=1960 THEN 'Średni'WHEN RokUrodz <1960 THEN 'Stary'

ELSE'Nie wiem !!!'

ENDFROM OsobyWHERE ROWNUM <20;

PoniewaŜ po pierwszym poprawnym warunku kończone jest sprawdzanie poniŜsze jest równowaŜne poprzedniemu

Dopuszczalne są wszystkie operatory i funkcje np. BETWEEN, LIKE, IN...

Zastosowanie ROWNUM do wyboru n-tego wiersza

SELECT Nazwisko FROM

(

SELECT Nazwisko From Nazwiska

WHERE ROWNUM <=6

ORDER BY ROWNUM DESC

) WHERE ROWNUM =1;

Warunek = moŜe być uŜyty tylko dla wartości 1

Page 17: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

17

Zapytania wybierająceZłączenia w oparciu o klauzulęWHERE

SELECT Nazwisko, Brutto FROM Osoby, Zarobki

SELECT Nazwisko, Brutto FROM Osoby, ZarobkiWHERE Osoby.IdOsoby=Zarobki.IdOsoby

SELECT Opis, Nazwisko, Brutto FROM Osoby, Zarobki, DzialyWHERE Osoby.IdOsoby = Zarobki.IdOsobyAND Dzialy.IdDzialu = Osoby.IdDzialu

Zapytania wybierająceZłączenia w oparciu o operator JOIN

SELECT Nazwisko, Brutto FROM Zarobki JOIN Osoby

ON Osoby.IdOsoby=Zarobki.IdOsoby

SELECT Opis, Nazwisko, Brutto FROM Zarobki JOIN OsobyON Osoby.IdOsoby = Zarobki.IdOsobyJOIN Dzialy ON Dzialy.IdDzialu = Osoby.IdDzialu

INNER

Page 18: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

18

Zapytania wybierająceZłączenia w oparciu o operator JOIN cd

SELECT Nazwisko, Brutto FROM Zarobki RIGHT JOIN OsobyON Osoby.IdOsoby=Zarobki.IdOsoby

SELECT Nazwisko, Brutto FROM Zarobki LEFT JOIN OsobyON Osoby.IdOsoby=Zarobki.IdOsoby

SELECT Nazwisko, Brutto FROM Zarobki FULL JOIN OsobyON Osoby.IdOsoby=Zarobki.IdOsoby

Zapytania wybierająceZłączenie prawostronne w oparciu o klauzulęWHERE

SELECT Nazwisko, Brutto FROM Osoby , ZarobkiWHERE Osoby.IdOsoby (+)= Zarobki.IdOsoby

Złączenie lewostronne w oparciu o klauzulęWHERE

SELECT Nazwisko, Brutto FROM Osoby , ZarobkiWHERE Osoby.IdOsoby = Zarobki.IdOsoby (+)

Zamieniając stronami pola równieŜzmieniamy kierunek złączenia

Page 19: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

19

Zapytania wybierające

Złączenie typu naturalnego

SELECT Nazwisko, Brutto FROM OSOBY JOIN ZAROBKI USING (IDOSOBY);

SELECT Nazwisko, BruttoFROM OSOBY NATURAL JOIN ZAROBKI;

SELECT Nazwisko, Brutto FROM OSOBY CROSS JOIN ZAROBKI;

Zapytania wybierającePodzapytania

SELECT Nazwisko, Imie FROM OsobyWHERE Nazwisko IN (SELECT Nazwisko FROM ttt);

Podzapytanie jako lista dla operatora IN

Page 20: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

20

Zapytania wybierającePodzapytania

SELECT Nazwisko, Imie FROM OsobyWHERE Nazwisko IN (SELECT Nazwisko FROM ttt)AND imie IN (SELECT ImieFROM ttt);

Podzapytanie jako lista dla operatora IN (BŁĄD)

JanKowalskiJanNowak

KarolKowalski

TTTOsoby

Zapytania wybierającePodzapytania

SELECT Nazwisko, Imie FROM OsobyWHERE Nazwisko || Imie IN (SELECT Nazwisko|| Imie FROM ttt)

Podzapytanie jako lista dla operatora IN (POPRAWNIE)

JanKowalskiJanNowak

KarolKowalski

TTTOsoby

Page 21: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

21

Zapytania wybierającePodzapytania

SELECT Nazwisko, Imie FROM OsobyWHERE (Nazwisko, Imie) IN (SELECT Nazwisko, Imie FROM ttt)

Podzapytanie jako lista dla operatora IN (POPRAWNIE -Lista z wieloma polami)

JanKowalskiJanNowak

KarolKowalski

TTTOsoby

Zapytania wybierająceDziwne Złączenia w oparciu o operator JOIN

SELECT Osoby.Nazwisko, Osoby.Imie, Osoby.RokUrodz,ttt.Nazwisko, ttt.Imie, ttt.RokUrodz FROM Osoby JOIN tttON Osoby.Nazwisko= ttt.NazwiskoAND Osoby.Imie= ttt.ImieAND Osoby.RokUrodz= ttt.RokUrodz;

Wielokrotne złączenie na polach

niekluczowych

(Osoby ∩ttt)

Page 22: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

22

Zapytania wybierająceDziwne Złączenia w oparciu o operator JOIN

SELECT Osoby.Nazwisko, Osoby.Imie, Osoby.RokUrodz,ttt.Nazwisko, ttt.Imie, ttt.RokUrodz FROM Osoby LEFT JOIN tttON Osoby.Nazwisko= ttt.NazwiskoAND Osoby.Imie= ttt.ImieAND Osoby.RokUrodz= ttt.RokUrodzWHERE ttt.Nazwisko IS NULL AND ttt.Imie IS NULL AND ttt.RokUrodz IS NULL ;

NaleŜące do Osoby i nie naleŜące do ttt

(OSOBY-ttt)

Zapytania wybierającePodzapytania

SELECT Idosoby, Brutto FROM ZarobkiWHERE Brutto > (SELECT AVG(Brutto) FROM Zarobki)

Podzapytanie skalarne

SELECT Idosoby, Brutto FROM ZarobkiWHERE Brutto > ANY(SELECT AVG(Brutto) FROM Zarobki JOIN Osoby ON Osoby.IdOsoby=Zarobki.IdOsoby GROUP BY IdDzialu)

Podzapytania z operatorem ANY(SOME) oraz ALL

SELECT Idosoby, Brutto FROM ZarobkiWHERE Brutto > ALL(SELECT AVG(Brutto) FROM Zarobki JOIN Osoby ON Osoby.IdOsoby=Zarobki.IdOsoby GROUP BY IdDzialu)

Page 23: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

23

Dział, w którym pracuje największa liczba pracowników

SELECT Nazwa, COUNT(IdOsoby) AS ile FROM

Dzialy JOIN Osoby USING (IdDzialu)

GROUP BY Nazwa

HAVING COUNT(IdOsoby)=

(SELECT Max(ilosc) FROM

(SELECT COUNT(IdOsoby) AS ilosc FROM

Osoby GROUP BY IdDzialu) xxx);

Podczas budowy złoŜonych zapytań SQL najlepiej rozpoczynać od najbardziej zagnieŜdŜonego podzapytania – patrz kolejne slajdy

Page 24: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

24

Analiza zapytaniaSELECT Nazwa, COUNT(IdOsoby) AS ile FROM

Dzialy JOIN Osoby USING (IdDzialu)

GROUP BY Nazwa

HAVING COUNT(IdOsoby)=

(

SELECT Max(ilosc) FROM

(

SELECT COUNT(IdOsoby) AS ilosc FROMOsoby GROUP BY IdDzialu) xxx

);

W pierwszym kroku budujemy zapytanie, które wyświetla liczbępracowników w kaŜdym dziale. Skutkiem jego wykonania jest wektor (jedno pole w N wierszach). N – liczba działów, w których pracuje chociaŜ jeden pracownik

Analiza zapytania

SELECT Nazwa, COUNT(IdOsoby) AS ile FROM

Dzialy JOIN Osoby USING (IdDzialu)

GROUP BY Nazwa

HAVING COUNT(IdOsoby)=

(

SELECT Max(ilosc) FROM

(SELECT COUNT(IdOsoby) AS ilosc FROMOsoby GROUP BY IdDzialu

) xxx);

Wektor moŜe być traktowany jako dynamiczna tabela – w przykładzie nadano jej alias xxx. Dlatego moŜemy skorzystać z niej jako ze źródła danych dla zapytania, które policzy maksymalnąliczebnośćpracowników w dziale. To zapytanie zwraca skalar –jedno pole w jednym wierszu

Page 25: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

25

Analiza zapytaniaSELECT Nazwa, COUNT(IdOsoby) AS ile FROM

Dzialy JOIN Osoby USING (IdDzialu)

GROUP BY Nazwa

HAVING COUNT(IdOsoby)=

(SELECT Max(ilosc) FROM

(

SELECT COUNT(IdOsoby) AS ilosc FROMOsoby GROUP BY IdDzialu

) xxx

);

Zapytanie skalarne moŜe być bezpośrednio wykorzystane do budowania wyraŜeń – w przykładzie w klauzuli HAVING. Pozostaje jeszcze budowa nagłówka, który wyświetli interesujące nas pola.

Dział, w którym jest największa suma wypłat

SELECT Nazwa, SUM(Brutto) AS Razem FROM

Dzialy JOIN Osoby USING (IdDzialu)

JOIN Zarobki USING(IdOsoby)

GROUP BY Nazwa

HAVING SUM(Brutto)=

(SELECT Max(ilosc) FROM

(SELECT SUM(Brutto) AS ilosc FROM

Osoby JOIN Zarobki USING(IdOsoby)

GROUP BY IdDzialu) xxx);

To zapytanie budowane jest według takiego samego schematu jak zapytanie poprzednie. Analiza patrz kolejne slajdy

Page 26: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

26

Analiza zapytaniaSELECT Nazwa, SUM(Brutto) AS Razem FROMDzialy JOIN Osoby USING (IdDzialu)JOIN Zarobki USING(IdOsoby)GROUP BY NazwaHAVING SUM(Brutto)=(SELECT Max(ilosc) FROM(

SELECT SUM(Brutto) AS ilosc FROMOsoby JOIN Zarobki USING(IdOsoby) GROUP BY IdDzialu) xxx);

Zapytanie wyznaczające sumy wszystkich wypłat dla kaŜdego z działów - wektor

Analiza zapytaniaSELECT Nazwa, SUM(Brutto) AS Razem FROMDzialy JOIN Osoby USING (IdDzialu)JOIN Zarobki USING(IdOsoby)GROUP BY NazwaHAVING SUM(Brutto)=(

SELECT Max(ilosc) FROM(SELECT SUM(Brutto) AS ilosc FROMOsoby JOIN Zarobki USING(IdOsoby) GROUP BY IdDzialu

) xxx);

Zapytanie wyznaczające największa sumę dla wszystkich działów -skalar

Page 27: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

27

Analiza zapytaniaSELECT Nazwa, SUM(Brutto) AS Razem FROMDzialy JOIN Osoby USING (IdDzialu)JOIN Zarobki USING(IdOsoby)GROUP BY Nazwa

HAVING SUM(Brutto)=(SELECT Max(ilosc) FROM(SELECT SUM(Brutto) AS ilosc FROMOsoby JOIN Zarobki USING(IdOsoby) GROUP BY IdDzialu) xxx

);

Zastosowanie zapytania skalarnego w klauzuli HAVING oraz nagłówek

NajwyŜsze osoby w kaŜdym dziale

SELECT Nazwa, Nazwisko, Wzrost , Mk FROM

Dzialy JOIN Osoby USING (IdDzialu)

JOIN

(SELECT IdDzialu, MAX(Wzrost) AS Mk FROM

Osoby GROUP BY IdDzialu) xxx

USING (IdDzialu)

WHERE Wzrost=Mk;

To zapytanie jest wykonywane według innego schematu często występującego w praktyce. Analiza zapytania jak zwykle przebiega od najbardziej zagnieŜdŜonego podzapytania. Analiza na kolejnych slajdach.

Page 28: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

28

Analiza zapytania

SELECT Nazwa, Nazwisko, Wzrost , Mk FROM

Dzialy JOIN Osoby USING (IdDzialu)

JOIN

(

SELECT IdDzialu, MAX(Wzrost) AS Mk FROM

Osoby GROUP BY IdDzialu) xxx

USING (IdDzialu)

WHERE Wzrost=Mk;

Tworzymy zapytanie wyświetlające identyfikator działu oraz maksymalny wzrost w tym dziale. Osiągamy to stosując opcjęgrupowania po IdDzialu. To zapytanie zwraca macierz 2 kolumny w N wierszach, które moŜe być traktowane jako dynamiczna tabela

Analiza zapytania

SELECT Nazwa, Nazwisko, Wzrost , Mk FROM

Dzialy JOIN Osoby USING (IdDzialu)

JOIN

(SELECT IdDzialu, MAX(Wzrost) AS Mk FROM

Osoby GROUP BY IdDzialu

) xxx

USING (IdDzialu)WHERE Wzrost=Mk;

Podzapytanie opatrzone aliasem xxx moŜe zostać połączone z nagłówkiem, w którym wyświetlamy dane z tabel Dzialy, Osoby oraz pole Mk wyznaczone w podzapytaniu. Jeśli pominiemy klauzulęWHERE to przy wzroście kaŜdego pracownika pojawi sięmaksymalna wartośćwzrostu w dziale, w którym pracuje.

Page 29: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

29

Analiza zapytania

SELECT Nazwa, Nazwisko, Wzrost , Mk FROM

Dzialy JOIN Osoby USING (IdDzialu)

JOIN

(

SELECT IdDzialu, MAX(Wzrost) AS Mk FROM

Osoby GROUP BY IdDzialu

) xxx

USING (IdDzialu)

WHERE Wzrost=Mk;

Wprowadzając klauzulęWHERE ograniczamy listę tylko do najwyŜszych osób w dziale. W tym momencie moŜemy zrezygnować z wyświetlania jednego z pól Mk lub wzrost, bo zawsze są sobie równe

Osoby o najwyŜszych sumach wypłat w kaŜdym dziale

SELECT Nazwa, Nazwisko, SUM(Brutto) AS Razem , MkFROM Dzialy JOIN Osoby USING (IdDzialu)JOIN Zarobki USING(IdOsoby)JOIN(SELECT IdDzialu, MAX(suma) AS Mk FROM(SELECT IdDzialu, SUM(Brutto) AS suma FROMOsoby JOIN Zarobki USING(IdOsoby)GROUP BY IdDzialu, IdOsoby) xxxGROUP BY IdDzialu) yyyUSING (IdDzialu)GROUP BY Nazwa, Nazwisko, IdOsoby, MkHAVING SUM(Brutto)=Mk;

Ten sam schemat co poprzednio. Trochębardziej rozbudowany.

Page 30: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

30

Analiza zapytania

SELECT Nazwa, Nazwisko, SUM(Brutto) AS Razem , MkFROM Dzialy JOIN Osoby USING (IdDzialu)JOIN Zarobki USING(IdOsoby)JOIN(SELECT IdDzialu, MAX(suma) AS Mk FROM(

SELECT IdDzialu, SUM(Brutto) AS suma FROMOsoby JOIN Zarobki USING(IdOsoby)GROUP BY IdDzialu, IdOsoby) xxxGROUP BY IdDzialu) yyyUSING (IdDzialu)GROUP BY Nazwa, Nazwisko, IdOsoby, MkHAVING SUM(Brutto)=Mk;

Zapytanie wyświetla identyfikator działu oraz sumę brutto dla kaŜdego pracownika – patrz klauzula GROUP BY - macierz

Analiza zapytania

SELECT Nazwa, Nazwisko, SUM(Brutto) AS Razem , MkFROM Dzialy JOIN Osoby USING (IdDzialu)JOIN Zarobki USING(IdOsoby)JOIN(

SELECT IdDzialu, MAX(suma) AS Mk FROM(SELECT IdDzialu, SUM(Brutto) AS suma FROMOsoby JOIN Zarobki USING(IdOsoby)GROUP BY IdDzialu, IdOsoby

) xxxGROUP BY IdDzialu

) yyyUSING (IdDzialu)GROUP BY Nazwa, Nazwisko, IdOsoby, MkHAVING SUM(Brutto)=Mk;

Zapytanie wyświetla identyfikator działu oraz maksimum z sum brutto dla kaŜdego pracownika w obrębie działu– patrz klauzula GROUP BY-macierz

Page 31: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

31

Analiza zapytania

SELECT Nazwa, Nazwisko, SUM(Brutto) AS Razem , Mk

FROM Dzialy JOIN Osoby USING (IdDzialu) JOIN Zarobki USING(IdOsoby)

JOIN

(SELECT IdDzialu, MAX(suma) AS Mk FROM

(

SELECT IdDzialu, SUM(Brutto) AS suma FROM

Osoby JOIN Zarobki USING(IdOsoby) GROUP BY IdDzialu, IdOsoby

) xxx

GROUP BY IdDzialu

) yyy USING (IdDzialu)

GROUP BY Nazwa, Nazwisko, IdOsoby, MkHAVING SUM(Brutto)=Mk;

PoniewaŜ poprzednie podzapytanie wyświetla macierz moŜe byćpołączone z nagłówkiem. NaleŜy zwrócić uwagę, Ŝe pole Mk musi byćwstawione jako element GROUP BY, bo w nagłówku nie ma przy nim funkcji agregującej

Analiza zapytania

SELECT Nazwa, Nazwisko, SUM(Brutto) AS Razem , Mk

FROM Dzialy JOIN Osoby USING (IdDzialu) JOIN Zarobki USING(IdOsoby)

JOIN

(

SELECT IdDzialu, MAX(suma) AS Mk FROM

(

SELECT IdDzialu, SUM(Brutto) AS suma FROM

Osoby JOIN Zarobki USING(IdOsoby) GROUP BY IdDzialu, IdOsoby

) xxx

GROUP BY IdDzialu

) yyy USING (IdDzialu)

GROUP BY Nazwa, Nazwisko, IdOsoby, Mk

HAVING SUM(Brutto)=Mk;

Teraz wystarczy dodać klauzulę filtruj ącą HAVING, która pozostawi tylko te osoby, których suma zarobków w dziale jest największa. Pominięcie pola Mk w nagłówku nie spowoduje usunięcia go z klauzuli GROUP BY poniewaŜ jest uŜyty w wyraŜeniu filtrującym.

Page 32: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

32

Zapytania wybierające – moda (wartość modalna, oczekiwana, najczęściej występująca)

SELECT RokUrodz AS rok FROM Osoby

GROUP BY RokUrodz

HAVING COUNT(RokUrodz)=

(SELECT MAX(rok) FROM

(SELECT COUNT(RokUrodz) as rok FROM Osoby

GROUP BY RokUrodz) xxx )

Średnia pomijająca p=50% procent rekordów z góry i z dołu (MEDIANA, wartość środkowa)

SELECT 0.5 AS Wspoczynnik, AVG(rokurodz) AS SredniaZprocentObciętych

FROM Osoby aWHERE

(SELECT COUNT(*) FROM osoby aaWHERE aa.RokUrodz <= a.RokUrodz) >=

(SELECT 0.5*COUNT(*) FROM Osoby)AND(SELECT COUNT(*) FROM Osoby bb

WHERE bb.RokUrodz >= a.RokUrodz) >= (SELECT 0.5*COUNT(*) FROM Osoby);

Page 33: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

33

MEDIANA (wartość środkowa) wariant wydajniejszy

SELECT 0.5 AS Wspolczynnik, SUM(RokUrodz*wsp)/sum(wsp) AS Mediana FROM (

SELECT a.RokUrodz, COUNT(*) AS wspFROM Osoby aCROSS JOIN Osoby bGROUP BY a.RokUrodzHAVING

SUM(CASE WHEN b.RokUrodz <= a.RokUrodzTHEN 1 ELSE 0 END) >= 0.5*COUNT(*)

AND SUM(CASE WHEN b.RokUrodz >= a. RokUrodz

THEN 1 ELSE 0 END) >= 0.5*COUNT(*)) x1;

Grupowanie i numerowanie rekordów w grupieSELECT DECODE(ROWNUM-min_sno,0,a.iddzialu,NULL) iddzialu,

DECODE(ROWNUM-min_sno,0,1,rownum+1-min_sno) sno,a.idosoby, nazwisko FROM(SELECT * FROM osoby ORDER BY iddzialu, idosoby ) a,(SELECT iddzialu, MIN(ROWNUM) min_sno FROM(SELECT * FROM osoby ORDER BY iddzialu, idosoby)GROUP BY iddzialu) bWHERE a.iddzialu = b.iddzialu;

IDDZIALU SNO IDOSOBY NAZWISKO---------- ---------- ---------- ---------------

1 1 1 KOWALSKI2 2 NOWAK3 10 NOWIK

2 1 4 NOWACKI2 6 KOW3 7 JAKOW

3 1 3 KOWALIK2 8 ADAMIAK3 9 KOWALSKI4 11 XXX

4 1 5 WILK2 12 YY

Page 34: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

34

GROUP BY ROLLUP/CUBE

SELECT IdDzialu, Osoby.IdOsoby, SUM(Brutto) AS Razem

FROM Osoby JOIN Zarobki

ON Osoby.IdOsoby=Zarobki.IdOsoby

GROUP BY ROLLUP (IdDzialu, Osoby.IdOsoby);

Dodatkowe podsumowania dla działów

Dodatkowe podsumowania dla działów po sumach pracowników

SELECT IdDzialu, Osoby.IdOsoby, SUM(Brutto) AS Razem

FROM Osoby JOIN Zarobki

ON Osoby.IdOsoby=Zarobki.IdOsoby

GROUP BY CUBE (IdDzialu, Osoby.IdOsoby);

SUM(BRUTTO)... GROUP BY ROLLUP

7104

1887Administracja

1332NowakAdministracja

555JanikAdministracja

999Techniczny

777KowalczykTechniczny

222KowTechniczny

2109Handlowy

2109NowickiHandlowy

2109Dyrekcja

2109KowalskiDyrekcja

RAZEMNAZWISKONAZWA

Page 35: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

35

SUM(BRUTTO)... GROUP BY CUBE

555JanikAdministracja

1887Administracja

222KowTechniczny

777KowalczykTechniczny

1332NowakAdministracja

999Techniczny

2109NowickiHandlowy

2109Handlowy

2109KowalskiDyrekcja

2109Dyrekcja

777Kowalczyk

2109Kowalski

2109Nowicki

1332Nowak

555Janik

222Kow

7104

RAZEMNAZWISKONAZWA

GROUP BY GROUPING SETS

Dodatkowe podsumowania dla działów po sumach pracowników (nie są powtarzane podsumowania dla wewnętrznej grupy)

SELECT IdDzialu, Osoby.IdOsoby, SUM(Brutto) AS Razem

FROM Osoby JOIN Zarobki

ON Osoby.IdOsoby=Zarobki.IdOsoby

GROUP BY GROUPING SETS (IdDzialu, Osoby.IdOsoby);

Page 36: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

36

SUM(BRUTTO)... GROUP BY GROUPING SETS

2109Nowicki

1332Nowak

2109Kowalski

777Kowalczyk

222Kow

555Janik

999Techniczny

2109Handlowy

2109Dyrekcja

1887Administracja

RAZEMNAZWISKO NAZWA

GROUP BY GROUPING SETS

Dodatkowe podsumowania dla działów po sumach pracowników (nie są powtarzane podsumowania dla wewnętrznej grupy)

SELECT Nazwa, Nazwisko, SUM(Brutto) FROM Dzialy JOIN Osoby USING(IdDzialu) JOIN Zarobki USING(IdOsoby)GROUP BY GROUPING SETS

(Nazwa, Nazwisko, IdOsoby);

Page 37: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

37

UŜycie klauzuli WITH

WITHMojaSuma AS (SELECT Opis, Sum(Brutto) AS RazemFROM Dzialy, Osoby, ZarobkiWHERE Dzialy.IdDzialu = Osoby.IdDzialuAND Osoby.IdOsoby = Zarobki.IdOsobyGROUP BY Opis)

SELECT Opis, RazemFROM MojaSumaWHERE Razem > (

SELECT SUM (Razem) * 1/12FROM MojaSuma)

ORDER BY Razem;

Aby nie powielać zapytań z agregacjąmoŜna uŜyć klauzuli WITH

Funkcje AGREGUJĄCE

REGR_SYY.

REGR_SXY

REGR_SXX

REGR_COUNT

REGR_AVGY

REGR_AVGX

REGR_R2

REGR_INTERCEPT

REGR_SLOPE

VAR_SAMP

VAR_POP

STDDEV_SAMP

STDDEV_POP

COVAR_SAMP

COVAR_POP

LAST_VALUE

FIRST_VALUE

Page 38: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

38

RANK ()

SELECT IdDzialu, Nazwisko, Brutto,

RANK() OVER (PARTITION BY IdDzialu

ORDER BY Brutto DESC ) "Rank"

FROM Osoby JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby;

SELECT RANK(250) WITHIN GROUP (ORDER BY Brutto DESC) "PowyŜej 250" FROM Zarobki;

SELECT RANK(250) WITHIN GROUP (ORDER BY Brutto ASC) "PoniŜej 250" FROM Zarobki;

oblicza ranking kaŜdego wiersza zwracanego przez zapytanie zgodnie z klauzulą ORDER BY(jeśli dwie pozycje mają taką samą wartość następny rankjest o zwiększany o liczbę powtórzeń – pozycje równe traktowane są tak samo)

NULLS LASTNULLS FIRST

Sposób umieszczenia wartości NULL na li ście

Liczba wypłat powyŜej/poniŜej progu

DENSE_RANK ()

SELECT IdDzialu, Nazwisko, Brutto,

DENSE_RANK() OVER (PARTITION BY IdDzialu

ORDER BY Brutto DESC ) "Rank"

FROM Osoby JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby;

SELECT DENSE_RANK(250) WITHIN GROUP (ORDER BY Brutto DESC) "PowyŜej 250" FROM Zarobki;

oblicza ranking kaŜdego wiersza zwracanego przez zapytanie zgodnie z klauzulą ORDER BY (jeśli dwie pozycje mają taką samą wartość następny rank

jest o 1 większy – pozycje równe traktowane są tak samo)

NULLS LASTNULLS FIRST

Sposób umieszczenia wartości NULL na li ście

Page 39: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

39

PERCENT_RANK ()

SELECT IdDzialu, Nazwisko, Brutto,

PERCENT_RANK () OVER (PARTITION BY IdDzialu

ORDER BY Brutto DESC ) "Rank"

FROM Osoby JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby;

oblicza ranking kaŜdego wiersza zwracanego przez zapytanie zgodnie z klauzulą ORDER BY (w zakresie od (0,1>)

NULLS LASTNULLS FIRST

Sposób umieszczenia wartości NULL na li ście

Przy tym kierunku sortowania: Max -> 0Min->1

Okienkowanie funkcji agregujących

SELECT IdOsoby, Brutto FROM Zarobki

ORDER BY IdOsoby;

7775

5554

2223

8882

4442

9991

6661

3331

1111

BRUTTOIDOSOBY

49955

42184

36633

34412

25532

21091

11101

4441

1111

AGREGATEIDOSOBY

SELECT IdOsoby, SUM(Brutto) OVER (ORDER BY IdOsoby ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) Agregate FROM Zarobki;

Page 40: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

40

Okienkowanie funkcji agregujących

SELECT IdOsoby, Brutto FROM Zarobki

ORDER BY IdOsoby;

7775

5554

2223

8882

4442

9991

6661

3331

1111

BRUTTOIDOSOBY

SELECT IdOsoby, SUM(Brutto) OVER (PARTITION BY IdOsobyORDER BY IdOsoby ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) Agregate FROM Zarobki;

7775

5554

2223

13322

4442

21091

11101

4441

1111

AGREGATEIDOSOBY

Okienkowanie funkcji agregującychSELECT IdDzialu, Nazwisko, SUM(Brutto),

AVG(SUM(Brutto)) OVER () "Srednia wszystkich",

AVG(SUM(Brutto))

OVER (PARTITION BY IdDzialu) "Srednia sumy dla Dzialu",

RATIO_TO_REPORT(SUM(Brutto)) OVER () "Procent z całosci",

RATIO_TO_REPORT(SUM(Brutto))

OVER (PARTITION BY IdDzialu) "Procent w Dziale"

FROM Osoby JOIN Zarobki USING (IdOsoby)

GROUP BY idDzialu, Nazwisko, IdOsoby;IdDzialu Nazwisko SUM

(Brutto)Sredniawszystkich

Srednia sumy dla Dzialu

Procent z całosci

Procent w dziale

1 Kowalski 2664 1603,33 2664 0,184 12 Janik 1776 1603,33 1591 0,123 0,3722 Nowak 1998 1603,33 1591 0,138 0,4182 Zieliński 999 1603,33 1591 0,069 0,2093 Kow 1443 1603,33 1258 0,1 0,3823 Kowalczyk 2220 1603,33 1258 0,153 0,5883 Pawlak 111 1603,33 1258 0,007 0,0294 Nowicki 1998 1603,33 1998 0,138 15 Kowal 1221 1603,33 1221 0,084 1

Page 41: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

41

LAG(), LEAD()

SELECT SUM(Brutto),

LAG(SUM(Brutto))

OVER (ORDER BY DataWyp ) "Poprzedni rekord wg DataWyp",

LEAD(SUM(Brutto))

OVER (ORDER BY DataWyp ) "Następny rekord wg DataWyp"

FROM Zarobki

GROUP BY DataWyp

ORDER BY DataWyp;

CUME_DIST ()

SELECT IdDzialu, Nazwisko, Brutto,CUME_DIST() OVER (PARTITION BY IdDzialu

ORDER BY Brutto DESC) "Ułamkowy rozkład "FROM Osoby JOIN Zarobki ON

Osoby.IdOsoby=Zarobki.IdOsoby;

SELECT CUME_DIST(250) WITHIN GROUP (ORDER BY Brutto DESC) "Jaki ułamek powyŜej 250" FROM Zarobki;

oblicza relatywną (względną) pozycję wartości w obrębie grupy rekordów zwraca wartość (0,1>

Page 42: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

42

ROW_NUMBER() , NTILE()SELECT IdDzialu, Nazwisko, Brutto,ROW_NUMBER() OVER (PARTITION BY IdDzialu

ORDER BY Brutto DESC) "NUMER",NTILE(4) OVER (PARTITION BY IdDzialu

ORDER BY Brutto DESC) "Zakresowy rozkład "FROM Osoby JOIN Zarobki ON

Osoby.IdOsoby=Zarobki.IdOsoby; IDDZIALU NAZWISKO BRUTTO NUMER Zakresowy

rozkład1 Kowalski 999 1 1

1 Kowalski 666 2 1

1 Kowalski 555 3 2

1 Kowalski 333 4 3

1 Kowalski 111 5 4

2 Zieliński 999 1 1

2 Janik 999 2 1

2 Nowak 888 3 2

2 Nowak 666 4 2

2 Janik 555 5 3

2 Nowak 444 6 3

2 Janik 222 7 4

3 Kow 888 1 1

3 Kowalczyk 777 2 1

3 Kowalczyk 777 3 2

FIRST_VALUE(), LAST_VALUE()

SELECT IdDzialu, Nazwisko, RokUrodz, FIRST_VALUE(Nazwisko) OVER

(PARTITION BY IdDzialu ORDER BY RokUrodz ASC) AS NajstarszyFROM Osoby ORDER BY IdDzialu, RokUrodz;

SELECT IdDzialu,Nazwisko, RokUrodz, LAST_VALUE(Nazwisko) OVER

(PARTITION BY IdDzialu ) AS NajmłodszyFROM Osoby ORDER BY IdDzialu, RokUrodz;

SELECT IdDzialu, Nazwisko, RokUrodz, FIRST_VALUE(Nazwisko) OVER

(PARTITION BY IdDzialu ORDER BY RokUrodz DESC) AS NajmłodszyFROM Osoby ORDER BY IdDzialu, RokUrodz;

Page 43: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

43

VAR_SAMP(), VAR_POP (), STDDEV_POP (), STDDEV_SAMP ()

SELECT IdDzialu,Nazwisko, RokUrodz, VAR_SAMP(RokUrodz) OVER

(PARTITION BY IdDzialu ) AS WarjancjaFROM Osoby ORDER BY IdDzialu, RokUrodz;

n

xn

xn

i

n

iii∑ ∑

= =

−= 1

2

1

1

σ

SELECT IdDzialu,Nazwisko, RokUrodz, STDDEV_POP(RokUrodz) OVER

(PARTITION BY IdDzialu ) AS OdchylenieStandPopulacjiFROM Osoby ORDER BY IdDzialu, RokUrodz; )1(

1

1

2

1

−=∑ ∑

= =

n

xn

xn

i

n

iii

popσ

SELECT IdDzialu,Nazwisko, RokUrodz, STDDEV_SAMP(RokUrodz) OVER

(PARTITION BY IdDzialu ) AS OdchylenieStandFROM Osoby ORDER BY IdDzialu, RokUrodz;

2popσ

SELECT IdDzialu,Nazwisko, RokUrodz, VAR_POP(RokUrodz) OVER

(PARTITION BY IdDzialu ) AS WarjancjaPopulacjiFROM Osoby ORDER BY IdDzialu, RokUrodz;

COVAR_SAMP(), COVAR_POPdziałają jak zwykłe funkcje agregujące

SELECT IdDzialu,COVAR_SAMP(RokUrodz,wzrost) AS Kowariancja

FROM OsobyGROUP BY IdDzialu;

∑∑ ∑∑= = ==

−=l

j

k

i

l

jjj

k

iiixy y

lyx

kx

klc

1 1 11

111

SELECT IdDzialu,COVAR_POP(RokUrodz,wzrost) AS KowariancjaPopulacji

FROM OsobyGROUP BY IdDzialu;

( ) ∑∑∑∑=== =

−=l

jj

k

ii

l

j

k

ijixy yx

klyx

klc

111 1

11

Page 44: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

44

REGR_SLOPE (), REGR_INTERCEPT(), REGR_R2(), REGR_AVGX(), REGR_AVGY(), REGR_COUNT()

działają jak zwykłe funkcje agregujące

SELECT IdDzialu,REGR_SLOPE(RokUrodz,Wzrost) AS RegresjaLiniowa_A,REGR_INTERCEPT (RokUrodz,wzrost) AS

RegresjaLiniowa_BFROM OsobyGROUP BY IdDzialu;

∑ ∑

∑ ∑∑

= =

= ==

−=

n

i

n

iii

n

i

n

ii

n

iiii

xxn

yxyxna

1

2

1

2

1 11

baxy +=

∑ ∑

∑ ∑∑

= =

= ==

−=

n

i

n

iii

n

i

n

iii

n

iii

xn

x

yn

yxn

x

a

1

2

1

1 11

1

11

−= ∑ ∑= =

n

i

n

iii xay

nb

1 1

1

REGR_SXX (),REGR_SYY (), REGR_SXY ()działają jak zwykłe funkcje agregujące

REGR_COUNT(e1,e2) * COVAR_POP(e1, e2)REGR_SXY:REGR_COUNT(e1,e2) * VAR_POP(e1) REGR_SYY:REGR_COUNT(e1,e2) * VAR_POP(e2)REGR_SXX:

REGR_INTERCEPT / ((Błąd standardowy) *SQRT((1/REGR_COUNT) +(POWER(REGR_AVGX,2)/REGR_SXX))

t statistic for y-intercept

REGR_SLOPE * SQRT(REGR_SXX) / (Błąd standardowy)t statistic for slope

REGR_SYY - (POWER(REGR_SXY,2)/REGR_SXX)Residuum sumy kwadratóws

POWER(REGR_SXY,2) / REGR_SXXRegresja sumy kwadratów

REGR_SYYSuma kwadratów

SQRT((REGR_SYY-(POWER(REGR_SXY,2)/REGR_SXX))/(REGR_COUNT-2))

Błąd standardowy

1-((1 - REGR_R2)*((REGR_COUNT-1)/(REGR_COUNT-2)))Adjusted R2

WyraŜenieRodzaj Statystyki

Page 45: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

45

Mediana i wartość modalna (od wersji 10)

SELECT IdOsoby, STATS_MODE(Brutto)

FROM Zarobki

GROUP BY IdOsoby;

SELECT IdOsoby, MEDIAN(Brutto)

FROM Zarobki

GROUP BY IdOsoby;

RaportowanieSET PAGES 33TTITLE 'Tytuł|Druga Linia'BTITLE 'STOPKA|DRUGA LINIA'BREAK ON Osoba SKIP 1 ON REPORT PAGE COMPUTE SUM AVG OF Brutto ON Osoba COMPUTE SUM OF Brutto ON REPORT

COLUMN Osoba format A25 heading 'Nazwisko|Imię' justify leftCOLUMN Wzrost format 90.99 heading 'Wysokość' justify rightCOLUMN BRUTTO format 999999.00 heading 'Zarobki' justify

centerSELECT Nazwisko || ' ' || Imie AS Osoba, Wzrost, Brutto FROM Osoby JOIN Zarobki ON

Osoby.Idosoby=Zarobki.IdOsoby;

CLEAR BREAKSCLEAR COMPUTESCLEAR COLUMNS

Page 46: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

46

Zapytania wybierająceUNIA

SELECT Nazwisko, Imie FROM OsobyUNIONSELECT Nazwisko, Imie FROM ttt;

Suma dwóch zapytań z eliminacją powtarzających się rekordów

SELECT Nazwisko, Imie FROM OsobyUNION ALLSELECT Nazwisko, Imie FROM ttt;

Suma dwóch zapytań

Zapytania wybierająceRóŜnica

SELECT Nazwisko, Imie FROM OsobyMINUSSELECT Nazwisko, Imie FROM ttt;

RóŜnica dwóch zapytań (Osoby-ttt)

SELECT Nazwisko, Imie FROM tttMINUSSELECT Nazwisko, Imie FROM Osoby;

RóŜnica dwóch zapytań (ttt-Osoby)

Page 47: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

47

Zapytania wybierająceCzęść wspólna

SELECT Nazwisko, Imie FROM OsobyINTERSECTSELECT Nazwisko, Imie FROM ttt;

Iloczyn dwóch zapytań

Hierarchia (nie obsługuje grafów cyklicznych)

BREAK ON LEVEL SKIP 1

SELECT LEVEL, Idosoby, Stanowisko, IdSzefa

FROM Osoby CONNECT BY PRIOR IdOsoby=IdSzefa

START WITH IdSzefa IS NULL ORDER BY LEVEL;

Przy odwrotnym połączeniu zwrócony zostanie tylko jeden rekord

SELECT LEVEL, Idosoby, Stanowisko, IdSzefa FROM Osoby CONNECT BY PRIOR IdSzefa=IdOsobySTART WITH IdSzefa IS NULL ORDER BY LEVEL;

IdSzefa= PRIOR IdOsoby

równowaŜne!!

Page 48: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

48

Hierarchia z formatowaniem

SELECT LEVEL,'|' || SUBSTR('----------------',1,2* LEVEL) || Nazwisko AS Kto FROM OsobySTART WITH IdSzefa IS NULLCONNECT BY PRIOR IdOsoby = IdSzefa;

Hierarchia z formatowaniem

SELECT LEVEL,RPAD('|', 2*LEVEL, '-') || Nazwisko AS Kto ,IdSzefaFROM OsobySTART WITH IdSzefa IS NULLCONNECT BY PRIOR IdOsoby = IdSzefa;

Uzupełnij do długości znakami

Page 49: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

49

Hierarchia z sumowaniem

SELECT LEVEL , SUM (Brutto) FROM Osoby JOIN Zarobki ONZarobki.IdOsoby=Osoby.IdOsobySTART WITH IdSzefa IS NULLCONNECT BY PRIOR Osoby.IdOsoby = IdSzefaGROUP BY LEVEL;

LEVEL SUM(BRUTTO)

1 2664

2 17205

4 129870

3 91575

Hierarchia z poziomem wyŜszym

SELECT Poziom, Prac, Osoby.IdSzefa, Osoby.Nazwisko AS Szef FROMOsoby RIGHT JOIN(SELECT LEVEL AS Poziom, Nazwisko AS Prac, IdSzefaFROM Osoby START WITH IdSzefa IS NULLCONNECT BY PRIOR IdOsoby = IdSzefa) xxxON Osoby.IdOsoby=xxx.IdSzefa;

LEVEL NAZWISKO IDSZEFA SZEF1 Kowalski2 Nowak 1 Kowalski3 Janik 2 Nowak4 Kowalski 4 Janik4 Kowal 4 Janik4 Jasiński 4 Janik4 Bury 4 Janik4 Wilk 4 Janik4 Raczyński 4 Janik4 Lew 4 Janik3 Pawlak 2 Nowak

Page 50: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

50

Hierarchia z poziomem wyŜszym

SELECT LEVEL , Nazwisko, IdSzefa, PRIOR Nazwisko AS SzefFROM Osoby START WITH IdSzefa IS NULLCONNECT BY PRIOR IdOsoby = IdSzefa;

LEVEL NAZWISKO IDSZEFA SZEF1 Kowalski2 Nowak 1 Kowalski3 Janik 2 Nowak4 Kowalski 4 Janik4 Kowal 4 Janik4 Jasiński 4 Janik4 Bury 4 Janik4 Wilk 4 Janik4 Raczyński 4 Janik4 Lew 4 Janik3 Pawlak 2 Nowak3 Gawlik 2 Nowak2 Kow 1 Kowalski

Hierarchia liczba podwładnychSELECT RPAD('|',2*LEVEL,'*') || Nazwisko || ' ' || Imie as Szef,

( SELECT COUNT(o2.idosoby)

FROM Osoby o2START WITH o2.IdSzefa = o1.IdOsoby

CONNECT BY PRIOR o2.IdOsoby = o2.IdSzefa

) ilu

FROM Osoby o1

START WITH o1.IdSzefa IS NULL

CONNECT BY PRIOR o1.IdOsoby = o1.IdSzefa;

Szef ILU

|*Kowalski Jan 35

|***Nowak Karol 19

|*****Janik Paweł 13

|*******Kowalski Piotr 0

... 0

|*****Gawlik Paweł 0

|***Kow Piotr 12

|*****Kowalczyk Jarosław 4

|*******Adamczyk Konrad 0

.... 0

To musi byćzapytanie

jednowierszowe

Page 51: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

51

Hierarchia liczba podwładnych – razem z szefem

SELECT RPAD('|',2*LEVEL,'*') || Nazwisko || ' ' || Imie as Szef,

( SELECT COUNT(o2.idosoby)

FROM Osoby o2

START WITH o2. IdOsoby = o1.IdOsoby

CONNECT BY PRIOR o2.IdOsoby = o2.IdSzefa

) ilu

FROM Osoby o1

START WITH o1.IdSzefa IS NULL

CONNECT BY PRIOR o1.IdOsoby = o1.IdSzefa;

SZEF ILU

|*Kowalski Jan 36

|***Nowak Karol 20

|*****Janik Paweł 14

|*******Kowalski Piotr 1

... 1

|*****Gawlik Paweł 1

|***Kow Piotr 13

|*****Kowalczyk Jarosław 5

|*******Adamczyk Konrad 1

.... 1

Hierarchia suma zarobków podwładnych – razem z szefem

SELECT RPAD('|',2*LEVEL,'*') || Nazwisko || ' ' || Imie as Szef,( SELECT SUM(Brutto)

FROM Osoby o2 JOIN Zarobki ON o2.IdOsoby = zarobki.IdOsoby

START WITH o2.IdSzefa = o1.IdOsobyCONNECT BY PRIOR o2.IdOsoby = o2.IdSzefa) Razem

FROM Osoby o1START WITH o1.IdSzefa IS NULLCONNECT BY PRIOR o1.IdOsoby = o1.IdSzefa;

SZEF ILU

|*Kowalski Jan 281163

|***Nowak Karol 23310

|*****Janik Paweł 23310

|*******Kowalski Piotr 4773

...

|*****Gawlik Paweł (null)

|***Kow Piotr 22089

|*****Kowalczyk Jarosław 3108

|*******Adamczyk Konrad 777

....

Page 52: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

52

Zapytanie z parametrem (tylko SQL PLUS)

SELECT Nazwisko, Wzrost FROM Osoby

WHERE Wzrost > &minimum;

SELECT Nazwisko, Wzrost FROM Osoby WHERE Wzrost > &&minimum;

śąda podania wartości przy kaŜdym wywołaniu

śąda podania wartości przy pierwszym wywołaniu

Przejście do poprzedniej postaci &minimum nie zmienia działania

Zrzut zawartości tabeli do ograniczonego pliku ASCII

SET HEADING OFF

SET PAGESIZE 0

SET FEEDBACK OFF

SET TRIMSPOOL ON

SPOOL file_name.txt

<SQL statement>

SPOOL OFF

Dla tabel gdzie długość kaŜdego rekordu jest większa niŜ 80, nie zapomnij ustawić

odpowiednio duŜej wartości LINESIZE. W innym wypadku Oracle b ędzie przerywać

linie co 80 znaków, czyniąc plik trudnym do odczytu przez inne aplikacje.

Page 53: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

53

Zapytania modyfikująceWstawianie danych

INSERT INTO NowaVALUES ('KOWAL', 'JAN', 1966);

INSERT INTO Nowa(Nazwisko, Imie)VALUES ('NOWAK','KAROL');

Zapytania modyfikująceWstawianie danych z istniejącej tabeli

INSERT INTO NowaSELECT Nazwisko, Imie, RokUrodz FROM OsobyWHERE RokUrodz >1960ORDER BY Nazwisko;

INSERT INTO Nowa(Imie, Nazwisko)SELECT Imie, Nazwisko FROM OsobyWHERE RokUrodz <1960ORDER BY Nazwisko DESC;

Page 54: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

54

Zapytania modyfikująceModyfikacja danych

UPDATE NowaSET RokUrodz = 0WHERE RokUrodz IS NULL;

UPDATE NowaSET Nazwisko = UPPER(Nazwisko),

Imie = UPPER(Imie);

Zapytania modyfikujące usuwanie danych

DELETE FROM Nowa

WHERE RokUrodz IS NULL;

DELETE FROM Nowa;

TRUNCATE TABLE Nowa;

TRUNCATE TABLE nazwa_tabeli[DROP STORAGE|REUSE STORAGE] ;

usuwa dane, natomiast przestrzeń zarezerwowana dla tej tabeli pozostaje, równieŜ znacznik wysokiej wody nie zmienia swojego połoŜenia.

REUSE STORAGE

zwalnia wszystkie przydzielone tabeli extenty powyŜej wartości MINEXTENTS. Przy tym kasowany jest znacznik wysokiej wody i ustawiany na pierwszy blok tabeli; jest to klauzula domyślna

DROP STORAGE

Page 55: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

55

Zapytania tworzące tabelęProste

CREATE TABLE Nowa(Nazwisko varchar2(15),Imie varchar2(15),RokUrodz number(3));

Ograniczenia przy tworzeniu tabeli:• Nazwa pola tabeli nie moŜe przekraczać 30 znaków.• Ilość kolumn w ramach jednej tabeli nie moŜe

przekroczyć 1000.

Rodzaje więzów (ograniczeń)

• NOT NULL

• UNIQUE

• PRIMARY KEY

• FOREIGN KEY

• CHECK

Integralnośćdanych moŜe być wymuszona przy pomocy: •więzów integralności (więzy statyczne jawne)•wyzwalaczy (więzy dynamiczny niejawne)

uniezaleŜniają utrzymanie integralności od narzędzi wykorzystywanych do edycji danych

Page 56: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

56

Zapytania tworzące tabelę

CREATE TABLE Dzialy

(

IdDzialu NUMBER(10) NOT NULL PRIMARY KEY,

Opis VARCHAR2(20) NULL ,

kod CHAR(1) NULL

);

Zapytania tworzące tabelęKlucz główny złoŜony

DROP TABLE Nowa;CREATE TABLE Nowa(Nazwisko varchar2(15),Imie varchar2(15),CONSTRAINT klucz PRIMARY KEY (Nazwisko,Imie));

INSERT INTO Nowa VALUES('KOWAL','JAN');INSERT INTO Nowa VALUES('KOWAL','KAROL');INSERT INTO Nowa VALUES('KOWAL','JAN');SELECT * FROM Nowa;

Page 57: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

57

Zapytania tworzące tabelęUNIQUE

DROP TABLE Nowa;CREATE TABLE Nowa(Nazwisko varchar2(15),Imie varchar2(15),CONSTRAINT spr UNIQUE (Nazwisko,Imie));

INSERT INTO Nowa VALUES('KOWAL','JAN');INSERT INTO Nowa VALUES('KOWAL','KAROL');INSERT INTO Nowa VALUES('KOWAL','JAN');SELECT * FROM Nowa;

Zapytania tworzące tabelęOgraniczenia

DROP TABLE Nowa;CREATE TABLE Nowa(nr number(3) PRIMARY KEY,Nazwisko varchar2(15) NOT NULL,Imie varchar2(15) DEFAULT 'Brak',m_v number(3) CHECK (m_v>10));

INSERT INTO Nowa(nr, Nazwisko, Imie, m_v) VALUES(1,'KOWAL','JAN',20);INSERT INTO Nowa(nr, Nazwisko, m_v) VALUES(2,'KOWAL',30);INSERT INTO Nowa(nr, Nazwisko, Imie, m_v) VALUES(3,'KOWAL','JAN',4);SELECT * FROM Nowa;

Page 58: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

58

Zapytania tworzące tabelęOgraniczenia cd

DROP TABLE Nowa;CREATE TABLE Nowa(nr number(3) PRIMARY KEY,Nazwisko varchar2(15) NOT NULL,Imie varchar2(15) DEFAULT 'Brak',m_v number(3) CHECK (m_v>10) ,mm_v number(3) CHECK (mm_v<300));

INSERT INTO Nowa(nr, Nazwisko, Imie, m_v, mm_v) VALUES(1,'KOWAL','JAN',20,50);INSERT INTO Nowa(nr, Nazwisko, m_v,mm_v) VALUES(2,'KOWAL',30,100);INSERT INTO Nowa(nr, Nazwisko, Imie, m_v,mm_v) VALUES(3,'KOWAL','JAN',4,100);

Zapytania tworzące tabelęOgraniczenia cd

DROP TABLE Nowa;CREATE TABLE Nowa(nr number(3) PRIMARY KEY,Nazwisko varchar2(15) NOT NULL,Imie varchar2(15) DEFAULT 'Brak',m_v number(3) CHECK (m_v>10) ,mm_v number(3) CHECK (mm_v<300) ,CONSTRAINT spr CHECK(m_v <mm_v));

INSERT INTO Nowa(nr, Nazwisko, Imie, m_v, mm_v) VALUES(1,'KOWAL','JAN',20,50);INSERT INTO Nowa(nr, Nazwisko, m_v,mm_v) VALUES(2,'KOWAL',30,100);INSERT INTO Nowa(nr, Nazwisko, Imie, m_v,mm_v)

Page 59: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

59

Zapytania tworzące tabelęOgraniczenia cd

DROP TABLE Nowa;CREATE TABLE Nowa(nr number(3) PRIMARY KEY,IdDzialu number(3),CONSTRAINT fk FOREIGN KEY(IdDzialu) REFERENCES Dzialy(IdDzialu),Nazwisko varchar2(15) NOT NULL,Imie varchar2(15) DEFAULT 'Brak');

INSERT INTO Nowa(nr, IdDzialu, Nazwisko, Imie) VALUES(1,1,'KOWAL','JAN');INSERT INTO Nowa(nr, IdDzialu, Nazwisko) VALUES(2,33,'KOWAL');INSERT INTO Nowa(nr, Nazwisko) VALUES(3,'KOWAL');

SELECT * FROM Nowa;

Zapytania tworzące tabelęOgraniczenia cd

DROP TABLE Nowa;CREATE TABLE Nowa(nr number(3) PRIMARY KEY,IdDzialu number(3) NOT NULL,CONSTRAINT fk FOREIGN KEY(IdDzialu) REFERENCES Dzialy(IdDzialu) ON DELETE CASCADE,Nazwisko varchar2(15) NOT NULL,Imie varchar2(15) DEFAULT 'Brak');

INSERT INTO Nowa(nr, IdDzialu, Nazwisko, Imie) VALUES(1,1,'KOWAL','JAN');INSERT INTO Nowa(nr, IdDzialu, Nazwisko) VALUES(2,33,'KOWAL');INSERT INTO Nowa(nr, Nazwisko) VALUES(3,'KOWAL');

SELECT * FROM Nowa;

Page 60: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

60

Zapytania tworzące tabelęKolejnośćograniczeń –

zawsze pierwsze DEFAULT (jeśli jest)

pozostałe dowolnie

DROP TABLE Nowa;CREATE TABLE Nowa(nr number(3) PRIMARY KEY,IdDzialu number(3) NOT NULL,CONSTRAINT fk FOREIGN KEY(IdDzialu) REFERENCES Dzialy(IdDzialu) ON DELETE CASCADE,Nazwisko varchar2(15) NOT NULL,Imie varchar2(15) DEFAULT 'Brak' NOT NULL UNIQUE CHECK(Imie LIKE '%') );

Zapytania tworzące tabelę

w DEFAULT moŜna odwołać się do funkcji daty (nieudokumentowane)

DROP TABLE Nowa;CREATE TABLE Nowa(nr number(3) PRIMARY KEY,Data date DEFAULT Sysdate);

DROP TABLE Nowa;CREATE TABLE Nowa(nr number(3) PRIMARY KEY,Data date DEFAULT SysdateCONSTRAINT spr CHECK(date = sysdate));

w CHECK nie moŜna odwołać się do funkcji daty (funkcji niedeterministycznych) oraz funkcji uŜytkownika oraz podzapytań

Page 61: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

61

Tworzenie tabeli na bazie innej tabeli

CREATE TABLE nazwa_tabeli

AS SELECT [pole1, pole2, ...|*]

FROM nazwa_tabeli_źródłowej ;

Usuwanie tabeli

DROP TABLE nazwa_tabeli

[CASCADE CONSTRAINTS];

Opcja CASCADE CONSTRAINTS umoŜliwia usunięcie tabeli, do której odnoszą się ograniczenia integralnościowe.

(FOREIGN KEY)

Page 62: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

62

Struktura bazy (SQL)CREATE TABLE Dzialy (

IdDzialu int NOT NULL PRIMARY KEY,Opis varchar2(20) NULL ,kod char(1) NULL

);

CREATE TABLE Osoby (IdOsoby int NOT NULL PRIMARY KEY,IdDzialu int NULL ,Nazwisko varchar2(30) NULL ,Imie varchar2(20) NULL ,RokUrodz int NULL ,Wzrost float NULL ,Data date NULL IdSzefa int

);

CREATE TABLE Zarobki (IdZarobku int NOT NULL PRIMARY KEY,IdOsoby int NULL ,Brutto number(15,4) NULL

);

Zapytania modyfikujące tabelęALTER

ALTER TABLE wys_tabADD nr number(3);

SELECT * FROM wys_tab;

ALTER TABLE wys_tabMODIFY nr number(5);

INSERT INTO wys_tab(nr) VALUES('aaa');

SELECT * FROM wys_tab;

Aby zmienić typ np. z number(3) na char(3) kolumna musi być pusta.

To samo dotyczy próby „skrócenia” pola jeśli dane sądłuŜsze niŜ ograniczenie docelowe

Page 63: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

63

Zapytania modyfikujące tabelęALTER

ALTER TABLE DzialyMODIFY kod NOT NULL;

ALTER TABLE Dzialy SET UNUSED (kod);

ALTER TABLE DZIALY DROP UNUSED COLUMNS;

ALTER TABLE Dzialy DROP COLUMN kod CASCADE CONSTRAINTS;

Usuwanie kolumny przez jej wstępne blokowanie

Usuwanie kolumny razem z więzami integralności

Zapytania modyfikujące tabelęALTER cd

DROP TABLE Nowa;CREATE table Nowa(nr number(3),Nazwisko varchar2(15) NULL,CONSTRAINT kl PRIMARY KEY(nr));

INSERT INTO Nowa(nr,nazwisko) VALUES(1,'KOWAL');INSERT INTO Nowa(nr) values(2);

ALTER TABLE NowaDROP COLUMN nr;

SELECT * FROM Nowa;

Kolumna jest usuwana nawet gdy ma zdefiniowane ograniczenia

Page 64: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

64

Zapytania modyfikujące tabelęALTER cd 1

ALTER TABLE wys_tabDROP COLUMN nr;

SELECT * FROM wys_tab;

ALTER TABLE NowaDROP CONSTRAINT spr;

INSERT INTO Nowa(nr, Nazwisko, m_v, mm_v) VALUES(2,'KOWAL',30,20);

SELECT * FROM Nowa;

Usuwanie kolumnALTER TABLE test

DROP COLUMN idTest

CASCADE CONSTRAINTS

CHECKPOINT 1000;

Konieczne jeśli istnieją powiązane kolumny w tabelach podrzędnych

Wymuszenie punktu kontrolnego co 1000 przetworzonych wierszy

ALTER TABLE testDROP COLUMNS CONTINUE;

Konieczne gdy usuwanie nie zostało zakończone - awaria

ALTER TABLE testSET UNUSED COLUMN opis;

Blokowanie kolumn (przydatne gdy usuwamy wiele kolumn) – poprawa wydajności

ALTER TABLE testDROP UNUSED COLUMNS;

Usuwanie nieuŜywanych kolumn

SELECT * FROM USER_PARTIAL_DROP_TABS;SELECT * FROM USER_UNUSED_COL_TABS;

Wyświetlenie częściowo usuniętych i zablokowanych kolumn (USER, ALL, DBA)

Page 65: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

65

Usuwanie kolumnyALTER TABLE nazwa_tabeliDROP COLUMN nazwa_kolumny[CASCADE CONSTRAINTS][CHECKPOINT ilość];

określenie częstotliwości wykonywania punktów kontrolnych

CHECKPOINT

usuwa jednocześnie więzy integralnościowe, które zostały określone na usuwanych kolumnach

CASCADE CONSTRAINTS

W momencie usuwania kolumn status tabeli jest ustawiony na INVALID. Podczas awarii instancji status ten zostaje zachowany. Po usunięciu

awarii operacja moŜe znowu zostać dokończona poleceniem:

ALTER TABLE nazwa_tabeliDROP COLUMNS CONTINUE ;

Usuwanie kolumnZaznaczenie kolumny jako nieuŜywanej

ALTER TABLE nazwa_tabeliSET UNUSED COLUMN nazwa_kolumnyCASCADE CONSTRAINTS;

Usunięcie kolumn zaznaczonych jako nieuŜywane

ALTER TABLE nazwa_tabeliDROP UNUSED COLUMNS [CHECKPOINT ilość];

Znalezienie tabel posiadających kolumny nieuŜywaneSELECT * FROM DBA_UNUSED_COL_TABS.

Nie moŜna usunąćkolumny z tabeli zagnieŜdŜonej, kolumny, która wchodzi w skład klucza obcego czy klucza partycjonowania, usunąć wszystkich kolumn z tabeli.Nie moŜna równieŜ usunąćkolumny z tabeli słownika danych.

Page 66: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

66

Znacznik wysokiej wody (high water mark)

Wskaźnik ostatniego bloku jaki był kiedykolwiek wykorzystywany do przechowywania danych tabeli. Wartośćwskaźnika nie ulega zmianie przy usuwaniu rekordów z tabeli.

Zwolnienie nieuŜywanej w segmencie przestrzeni powyŜej znacznika wysokiej wody

ALTER TABLE nazwa_tabeliDEALLOCATE UNUSED [KEEP rozm K/M] ;

Klauzula KEEP określa liczbębajtów, jaka ma być zostawiona powyŜej znacznika wysokiej wody.

Zapytania modyfikujące tabelęALTER cd 1

ALTER Table Nowa ADD CONSTRAINT kl PRIMARY KEY (nr);

INSERT INTO Nowa(nr, Nazwisko) VALUES(2,'KOWAL');

SELECT * FROM Nowa;

RENAME Nowa TO Inna

Page 67: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

67

Zapytania modyfikujące tabelę -CONSTRAINTS

ALTER TABLE Zarobki ADD CONSTRAINT Fk1 FOREIGN KEY(IdOsoby) REFERENCES Osoby(IdOsoby) ON DELETE CASCADE;

ALTER TABLE Zarobki ADD CONSTRAINT Fk1 FOREIGN KEY(IdOsoby) REFERENCES Osoby(IdOsoby) ON DELETE SET NULL;

Identyfikator wiersza

SELECT ROWID FROM Dzialy;

ROWID------------------AAAMVhAAKAAAAAyAAAAAAMVhAAKAAAAAyAABAAAMVhAAKAAAAAyAACAAAMVhAAKAAAAAyAADAAAMVhAAKAAAAAyAAEAAAMVhAAKAAAAAyAAFAAAMVhAAKAAAAAyAAGAAAMVhAAKAAAAAyAAH

AAAMVh AAK AAAAAy AAA

Identyfikator obiektu (tabeli)

Względny numer pliku

Numer bloku w ramach pliku

Numer wiersza w tabeli

Page 68: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

68

Parametry składowania

ALTER TABLE ttt

PCTFREE 10

PCTUSED 40

STORAGE (

NEXT 100K

MINEXTENTS 1

MAXEXTENTS 5

PCTINCREASE 0)

Procent utrzymywanej wolnej powierzchni bloku

Procent zajętości powierzchni bloku poniŜej której jest traktowany jako wolny – ponowne zapisy

Rozmiar następnego przydzielanego ekstentu

Minimalna liczba ekstentów

Maksymalna liczba ekstentów

Procent o który jest powiększany kaŜdy nowy (począwszy od trzeciego) ekstent

Alokacja ekstentu tabeli

ALTER TABLE testALLOCATE EXTENT (SIZE 500KDATAFILE 'E:\ORA\ORADATA\ORCL\AP.ORA')

ALTER TABLE testMOVE TABLESPACE inna;

Page 69: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

69

Tworzenie tabeli tymczasowejDROP TABLE temp;/CREATE GLOBAL TEMPORARY TABLE temp(nr NUMBER,opis VARCHAR2(11))ON COMMIT PRESERVE ROWS;

ON COMMIT DELETE ROWS(domyślnie)

Tabela jest „trwała” – natomiast „czas Ŝycia” jej zawartości jest zaleŜny od dyrektywy ON COMMIT.Zawartość jest zawsze usuwana z zamknięciem sesji.KaŜda z sesji widzi tylko swoje dane.

Tworzenie tabelCREATE TABLE Osoby_Kopia AS SELECT * FROM Osoby WHERE 1 = 0;

ENABLE [[NO]VALIDATE] PRIMARY KEY opcje ENABLE [[NO]VALIDATE] [UNIQUE] (kolumna) opcjeENABLE [[NO]VALIDATE] CONSTRAINT constraint_name opcjeENABLE ALL TRIGGERS

DISABLE [[NO]VALIDATE] PRIMARY KEY opcje [CASCADE]DISABLE [[NO]VALIDATE] [UNIQUE] (kolumna) opcje [CASCADE]

DISABLE [[NO]VALIDATE] CONSTRAINT constraint_name opcje [CASCADE]DISABLE ALL TRIGGERS

ALTER TABLE Osoby ENABLE PRIMARY KEY;

ALTER TABLE Dzialy ADD CONSTRAINT Uni UNIQUE(Opis) DISABLE VALIDATE;

ALTER TABLE Dzialy ENABLE VALIDATE UNIQUE(opis) ;

ALTER TABLE Osoby DISABLE PRIMARY KEY CASCADE;

Page 70: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

70

Tworzenie tabel walidacja natychmiastowa i odłoŜona

Domyślnie constraint jest typu (non deferrable) czyli oracle sprawdza zgodnośćnatychmiast kiedy naruszone zostaną ograniczenia (constraint violation)Ustawiając ograniczenie na deferrable , oracle sprawdza zgodność w punkcie zatwierdzenia transakcji (commit) tzn. na zakończenie transakcjiCREATE TABLE Osoba(Id number, imie varchar2(10), CONSTRAINT pk primary key (Id));INSERT INTO Osoba VALUES(1,'Jan');INSERT INTO Osoba VALUES(1,'Karol');(Błąd zwracany przez oracle) ORA-00001: naruszono więzy unikatowe (AP.PK)Nie moŜna wpisać takich samych wartości do kolumny ze względu na klucz podstawowy

Spróbujmy zmienić walidacje na odroczoną (DEFERRED)SET CONSTRAINT pk DEFERRED;(Błąd zwracany przez oracle) ORA-02447: nie moŜna odroczyć więzów, które nie dają moŜliwości odraczaniaPoniewaŜ w definicji tabeli klucz nie jest typu deferrable, nie moŜemy więc odroczyćjego walidacji

Tworzenie tabel walidacja natychmiastowa i odroczonaCREATE TABLE Osoba

(Id number, imie varchar2(10), CONSTRAINT pk primary key (Id) DEFERRABLE);INSERT INTO Osoba VALUES(1,'Jan');INSERT INTO Osoba VALUES(1,'Karol');(W dalszym ciągu oracle zwraca błąd) ORA-00001: naruszono więzy unikatowe (AP.PK)Ale teraz moŜemy zmienić walidację na odroczoną (deferrable )SET CONSTRAINT pk DEFERRED;Więzy zostały określone.INSERT INTO Osoba VALUES(1,'Jan');INSERT INTO Osoba VALUES(1,'Karol');1 wiersz został utworzony.1 wiersz został utworzony.COMMIT;(Dopiero teraz oracle zwraca) ORA-02091: transakcja została wycofana

ORA-00001: naruszono więzy unikatowe (AP.PK1)Teraz ORACLE zwraca błąd naruszenia więzów dopiero przy próbie zatwierdzenia transakcji (COMMIT) jednocześnie ją wycofując.

Page 71: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

71

Tworzenie tabel walidacja natychmiastowa i odroczona

MoŜliwe jest sprawdzanie więzów constraints przed zatwierdzeniem transakcji

SET CONSTRAINT ALL IMMEDIATE;Zmienione zostaną tylko te więzy, dla których ustawiono (DEFERRABLE ), nie są generowane komunikaty o błędach jeśli istnieje ograniczenie z nieustawionym (DEFERRABLE )

SET CONSTRAINT pk IMMEDIATE;Aby w ten sposób zmienić miejsce sprawdzania wierszy ograniczenie musi równieŜ być typu (DEFERRABLE )

teraz kaŜdy ze wstawianych wierszy, który nie spełnia ograniczeń generuje błąd i tylko ten wiersz jest wycofywany Deferrable jest uŜyteczny wtedy gdy chcemy mieć pewność, Ŝe na skutek błędu walidacji więzów ograniczeń ma być wycofana cała transakcja, a nie tylko wiersze, które nie spełniają ograniczenia (domyślny stan ograniczeń jest no deferrable).

Wpływ więzów na dane

musząspełniać

muszą spełniaćnie jest dozwolona operacja INSERT

mogą nie spełniaćograniczenia

Wprowa-dzane

musząspełniać

mogą nie spełniaćograniczenia

nie sądozwolone operacje UPDATE, DELETE

mogą nie spełniaćograniczenia

Istniejące

ENABLE VALIDATE

ENABLE NOVALIDATE

DISABLE VALIDATE

DISABLE NOVALIDATE

Rodzajdanych

Stan w jakim znajdują się więzy

Page 72: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

72

Przełączanie trybu pracy więzów (ograniczeń)

ALTER SESSION

SET CONSTRAINTS = {IMMEDIATE |DEFERRED|DEFAULT};

SET CONSTRAINTS

{nazwa_więzu_1, nazwa_więzu_2, ...|ALL} {IMMEDIATE|DEFERRED};

weryfikacja wykonywana jest końcu kaŜdego polecenia DML. Oznacza to, Ŝe najpierw musi zaistnieć w bazie rekord nadrzędny a dopiero potem podrzędny.

Natychmiastowe (NONDEFERRABLE)

weryfikacja wykonywana jest na końcu transakcji. W przypadku wykrycia niezgodności cała transakcja jest wycofywana. Dotyczy to głównie sytuacji, w której jednocześnie wstawiany jest rekord nadrzędny i podrzędny,

Opóźnione (DEFERRABLE)

Więzy zdefiniowane jako natychmiastowe nie mogą byćprzestawione w stan opóźnienia.

SekwencjaAAA

CREATE SEQUENCE LicznikINCREMENT BY 1 START WITH 1MAXVALUE 1.0E28 MINVALUE 1 CYCLE CACHE 20 NOORDER

DROP TABLE Nowa;

CREATE TABLE Nowa(nr number(3) DEFAULT 3,Nazwisko varchar2(15));

INSERT INTO Nowa VALUES(Licznik.NEXTVAL,'NOWAK');INSERT INTO Nowa Values(Licznik.Nextval,'KOWAL');SELECT * FROM Nowa WHERE ROWNUM<2;

SELECT Licznik.CURRVAL FROM SYS.DUAL

Page 73: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

73

Perspektywa

CREATE OR REPLACE VIEW mlodzi

AS

SELECT Idosoby, RokUrodz FROM Osoby

WHERE RokUrodz>1970

INSERT INTO mlodzi VALUES(11,1980);INSERT INTO mlodzi VALUES(12,1960);

SELECT * FROM mlodzi;SELECT * FROM Osoby;

Perspektywa

CREATE OR REPLACE VIEW mlodzi

AS

SELECT Idosoby, RokUrodz FROM Osoby

WHERE RokUrodz>1970

WITH READ ONLY

INSERT INTO mlodzi VALUES(11,1980);INSERT INTO mlodzi VALUES(12,1960);

SELECT * FROM mlodzi;SELECT * FROM Osoby;

Page 74: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

74

Perspektywa

CREATE OR REPLACE VIEW mlodzi

AS

SELECT Idosoby, RokUrodz FROM Osoby

WHERE RokUrodz>1970

WITH CHECK OPTION

INSERT INTO mlodzi VALUES(11,1980);INSERT INTO mlodzi VALUES(12,1960);

SELECT * FROM mlodzi;SELECT * FROM Osoby;

Tabele systemoweCOLUMN object_name FORMAT A25;

SELECT object_name, object_type FROM user_objects;

COLUMN object_name FORMAT A25;SELECT owner, object_name, object_type FROM all_objects;

COLUMN object_name FORMAT A25;SELECT owner, object_name, object_type FROM dba_objects;

DBA_objects (wszystkie obiekty)

ALL_objects (obiekty dostępne dla uŜytkownika)

USER_objects (obiekty będące własnością uŜytkownika)

Page 75: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

75

Perspektywy systemowe

SELECT * FROM DICTIONARY;

TABLE_NAME------------------------------COMMENTS

ALL_ALL_TABLESDescription of all object and relational tables accessible to the user

USER_AUDIT_SESSIONAll audit trail records concerning CONNECT and DISCONNECT

USER_AUDIT_STATEMENTAudit trail records concerning grant, revoke, audit, noaudit and alter system

•••••••••

Informacja o słowniku danych i perspektywach wydajności

Perspektywy systemowe

SELECT * FROM DICT_COLUMNS;

TABLE_NAME COLUMN_NAME------------------------- ------------------------------COMMENTS

ALL_ALL_TABLES TABLESPACE_NAMEName of the tablespace containing the table

ALL_ALL_TABLES CLUSTER_NAMEName of the cluster, if any, to which the table belongs

ALL_ALL_TABLES IOT_NAMEName of the index-only table, if any, to which the overflow or mapping table entrybelongs

•••••••••

Informacja o kolumnach w słowniku danych i perspektywach wydajności

Page 76: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

76

Pespektywy słownika danych

SELECT * FROM USER_TABLES;

SELECT * FROM USER_INDEXES;

SELECT * FROM USER_TAB_COLUMNS;

SELECT * FROM USER_CONSTRAINTS;

SELECT * FROM USER_VIEWS;

SELECT * FROM USER_PROCEDURES;

SELECT * FROM USER_TRIGGERS;

DBA_xxx (wszystkie obiekty)

ALL_xxx (obiekty dostępne dla uŜytkownika)

USER_xxx (obiekty będące własnością uŜytkownika)

Informacje o obiektach

Pespektywy słownika danych

SELECT * FROM USER_SEGMENTS;

SELECT * FROM USER_EXTENTS;

DBA_xxx (wszystkie obiekty)

ALL_xxx (obiekty dostępne dla uŜytkownika)

USER_xxx (obiekty będące własnością uŜytkownika)

Informacje o wykorzystaniu miejsca – alokacji danych

Informacje o strukturze bazy danych

SELECT * FROM USER_TABLESPACES;

SELECT * FROM DBA_DATA_FILES;

Istnieje tylko dla DBA

Page 77: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

77

Perspektywy systemowe – wykaz uŜytkownikaUSER_ALL_TABLESDescription of all object and relational tables owned by the user's

USER_AUDIT_SESSIONAll audit trail records concerning CONNECT and DISCONNECT

USER_AUDIT_STATEMENTAudit trail records concerning grant, revoke, audit, noaudit and alter system

USER_AUDIT_TRAILAudit trail entries relevant to the user

USER_CATALOGTables, Views, Synonyms and Sequences owned by the user

USER_CLUSTERSDescriptions of user's own clusters

USER_CLUSTER_HASH_EXPRESSIONSHash functions for the user's hash clusters

USER_CLU_COLUMNSMapping of table columns to cluster columns

USER_COLL_TYPESDescription of the user's own named collection types

USER_COL_COMMENTSComments on columns of user's tables and views

USER_COL_PRIVSGrants on columns for which the user is the owner, grantor or grantee

USER_COL_PRIVS_MADEAll grants on columns of objects owned by the user

USER_COL_PRIVS_RECDGrants on columns for which the user is the grantee

USER_CONSTRAINTSConstraint definitions on user's own tables

USER_CONS_COLUMNSInformation about accessible columns in constraint definitions

USER_CONS_OBJ_COLUMNSList of types an object column or attribute is constrained to inthe tables owned by the user

Perspektywy systemowe – wykaz uŜytkownikaUSER_DB_LINKSDatabase links owned by the user

USER_DEPENDENCIESDependencies to and from a users objects

USER_ERRORSCurrent errors on stored objects owned by the user

USER_FREE_SPACEFree extents in tablespaces accessible to the user

USER_INDEXESDescription of the user's own indexes

USER_INDEXTYPESAll user indextypes

USER_INDEXTYPE_COMMENTSComments for user-defined indextypes

USER_INDEXTYPE_OPERATORSAll user indextype operators

USER_IND_COLUMNSCOLUMNs comprising user's INDEXes and INDEXes on user's TABLES

USER_IND_EXPRESSIONSFunctional index expressions in user's indexes and indexes on user's tables

USER_IND_PARTITIONSUSER_IND_SUBPARTITIONS

USER_INTERNAL_TRIGGERSDescription of the internal triggers on the user's own tables

USER_JOIN_IND_COLUMNSJoin Index columns comprising the join conditions

USER_LIBRARIESDescription of the user's own libraries

USER_LOBSDescription of the user's own LOBs contained in the user's own tables

USER_LOB_PARTITIONSUSER_LOB_SUBPARTITIONS

USER_LOG_GROUPSLog group definitions on user's own tables

USER_LOG_GROUP_COLUMNSInformation about columns in log group definitions

USER_NESTED_TABLESDescription of nested tables contained in the user's own tables

Page 78: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

78

Perspektywy systemowe – wykaz uŜytkownikaUSER_OBJECTSObjects owned by the user

USER_OBJECT_SIZESizes, in bytes, of various pl/sql objects

USER_OBJECT_TABLESDescription of the user's own object tables

USER_OBJ_COLATTRSDescription of object columns and attributes contained in tablesowned by the user

USER_OPANCILLARYAll ancillary opertors defined by user

USER_OPARGUMENTSAll operator arguments of operators defined by user

USER_PASSWORD_LIMITSDisplay password limits of the user

USER_PENDING_CONV_TABLESAll user's tables which are not upgraded to the latest type version

USER_PROCEDURESDescription of the users own procedures

USER_ROLE_PRIVSRoles granted to current user

USER_RULESRules owned by the user

USER_RULESETSRulesets owned by the user: maintained for backward compatibility

USER_RULE_SETSRule sets owned by the user

USER_RULE_SET_RULESRules in user rule sets

USER_SEGMENTSStorage allocated for all database segments

USER_SEQUENCESDescription of the user's own SEQUENCEs

USER_SOURCESource of stored objects accessible to the user

USER_SOURCE_TABLESUSER_SOURCE_TAB_COLUMNS

USER_STORED_SETTINGSParameter settings for objects owned by the user

Perspektywy systemowe – wykaz uŜytkownikaUSER_SUMMARIESDescription of the summaries created by the user

USER_SYNONYMSThe user's private synonyms

USER_SYS_PRIVSSystem privileges granted to current user

USER_TABLESDescription of the user's own relational tables

USER_TABLESPACESDescription of accessible tablespaces

USER_TAB_COLSColumns of user's tables, views and clusters

USER_TAB_COLUMNSColumns of user's tables, views and clusters

USER_TAB_COL_STATISTICSColumns of user's tables, views and clusters

USER_TAB_COMMENTSComments on the tables and views owned by the user

USER_TAB_HISTOGRAMSHistograms on columns of user's tables

USER_TAB_MODIFICATIONSInformation regarding modifications to tables

USER_TAB_PARTITIONS

USER_TAB_PRIVSGrants on objects for which the user is the owner, grantor or grantee

USER_TAB_PRIVS_MADEAll grants on objects owned by the user

USER_TAB_PRIVS_RECDGrants on objects for which the user is the grantee

USER_TAB_SUBPARTITIONS

USER_TRIGGERSTriggers owned by the user

USER_TRIGGER_COLSColumn usage in user's triggers

USER_TS_QUOTASTablespace quotas for the user

USER_TYPESDescription of the user's own types

Page 79: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

79

Perspektywy systemowe – wykaz uŜytkownika

USER_TYPE_ATTRSDescription of attributes of the user's own types

USER_TYPE_METHODSDescription of methods of the user's own types

USER_TYPE_VERSIONSDescription of each version of the user's types

USER_UNUSED_COL_TABSUser tables with unused columns

USER_UPDATABLE_COLUMNSDescription of updatable columns

USER_USERSInformation about the current user

USER_USTATSAll statistics on tables or indexes owned by the user

USER_VARRAYSDescription of varrays contained in the user's own

tables

USER_VIEWSDescription of the user's own views

USER_WORKSPACES

Perspektywy systemowe V$....

DESC V$INSTANCE;

SELECT * FROM V$VERSION;

DESC V$SESSION_CONNECT_INFO;

SELECT * FROM V$CONTROLFILE;

SELECT * FROM V$LOGFILE;

INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STARTUP_TIME STATUS ....

BANNER----------------------------------------------------------------Oracle9i Enterprise Edition Release 9.2.0.1.0 - ProductionPL/SQL Release 9.2.0.1.0 - ProductionCORE 9.2.0.1.0 ProductionTNS for 32-bit Windows: Version 9.2.0.1.0 - ProductionNLSRTL Version 9.2.0.1.0 - Production

SID AUTHENTICATION_TYPE OSUSER NETWORK_SERVICE_BANNER

NAME------------------------------------------------------------------C:\ORACLE\ORADATA\ORACLE\CONTROL01.CTLC:\ORACLE\ORADATA\ORACLE\CONTROL02.CTLC:\ORACLE\ORADATA\ORACLE\CONTROL03.CTL

Page 80: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

80

Perspektywy systemowe DBA_xxxDESC DBA_FREE_SPACE;

SELECT * FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='AP';

SELECT username, password,account_status, default_tablespace,created FROM DBA_USERS;

TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO

USERNAME PASSWORD ACCOUNT_STATUS DEFAULT_TABLESPACE CREATED------------------- --------------------------- ------------------------------ --------------------------------- ----------------SYS 5638228DAF52805F OPEN SYSTEM 02/05/12SYSTEM 970BAA5B81930A40 OPEN SYSTEM 02/05/12

OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME----------- --------------------------- ---------------------------- ------------------------- -------------------------------AP NOWA TABLE APAP KLUCZ1 INDEX APAP KLUCZ7 INDEX AP

Dynamiczne perspektywy wydajności(dynamic performance views).

Większośćtych perspektyw posiada nazwy zaczynające się od V$.

Domyślnie dynamiczne perspektywy wydajności dostępne są dla uŜytkownika SYS oraz dla uŜytkowników o uprawnieniu SYSDBA lub uŜytkowników mających uprawnienie SELECT ANY TABLE.

Perspektywa V$FIXED_TABLE wyświetla nazwy wszystkich dynamicznych perspektyw wydajności.

Page 81: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

81

Transakcje

BEGIN

UPDATE osoby SET Nazwisko=UPPER(nazwisko);

COMMIT;

END;

ROLLBACK;

Transakcje

BEGIN

UPDATE osoby SET Nazwisko=INITCAP(nazwisko);

SAVEPOINT punkt;

UPDATE osoby SET Nazwisko=LOWER(nazwisko);

ROLLBACK to punkt;

COMMIT;

END;

Page 82: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

82

SynonimCREATE SYNONYM Osoby_s FOR OSOBY

SELECT * FROM Osoby_s

CREATE PUBLIC SYNONYM Osoby_s FOR OSOBY

Wszyscy, którzy mają prawo do obiektu widzą synonim publiczny

Indeksy typu B*Drzewo

• mogą być tworzone zarówno na jednej kolumnie tabeli, jak i na kilku jej kolumnach.

• Pola typu long i long rawnie mogą być indeksowane.

• Jedna tabela moŜe posiadać dowolną liczbę indeksów.

• tworzone są równieŜ niejawnie przez system Oracle kaŜdorazowo podczas włączania ograniczeńintegralnościowych typu uniqueoraz primary key.

Page 83: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

83

Indeksy typu B*Drzewo

Na szczycie indeksu znajduje się korzeń, który zawiera wskaźniki do drugiego poziomu indeksu.

Drugi poziom zawiera bloki ze wskaźnikami do poziomu następnego.

Na najniŜszym poziomie znajdują się liście zawierające wskaźniki na rekordy tabeli.

Liście drzewa połączone są w listę dwukierunkową, co ułatwia odczyt indeksu w kierunku wartości rosnących i malejących

IndeksyCREATE INDEX dzial ON Dzialy(IdDzialu);

ORA-01408: taka lista kolumn jest juŜ zaindeksowana

Bo klucz podstawowy

CREATE INDEX dzial ON Dzialy (IdDzialu, Nazwa);

DROP INDEX dzial;

CREATE UNIQUE INDEX dzial ON Dzialy (kod);

ORA-01452: nie moŜna CREATE UNIQUE INDEX; znaleziono duplikaty klucza

DROP INDEX SYS_C003341;

ORA-02429: nie moŜna usunąć indeksu odpowiedzialnego za klucz unikatowy/główny

Page 84: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

84

Indeksy B*DrzewoTworzenie indeksu unikatowego:

CREATE UNIQUE INDEX nazwa_indeksuON nazwa_tabeli(pole1, pole2, .....)[PCTFREE liczba] [PCTUSED liczba][INITRANS liczba] [MAXTRANS liczba][TABLESPACE nazwa_ przestrzeni][NOSORT]STORAGE (parametry składowania);

Tworzenie indeksu z odwróconym kluczem:

CREATE INDEX nazwa_indeksuON nazwa_tabeli(pole1, pole2, .....)REVERSE[PCTFREE liczba] [PCTUSED liczba][INITRANS liczba] [MAXTRANS liczba][TABLESPACE nazwa_ przestrzeni]STORAGE (parametry składowania);

W przypadku, gdy modyfikacje indeksu skoncentrowane są na małym zbiorze liści, odwrotne wartości klucza lepiej rozłoŜąwiersze indeksu na wszystkie jego bloki, redukując w ten sposób rywalizację o bloki indeksowe.

Indeksy Oparte Na WyraŜeniach

CREATE INDEX nazwa_indeksu

ON nazwa_tabeli (wyraŜenie)[PCTFREE liczba] [PCTUSED liczba]

[INITRANS liczba] [MAXTRANS liczba]

[TABLESPACE nazwa_ przestrzeni]

[NOSORT]

STORAGE (parametry składowania);

Page 85: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

85

Indeks bitmapowy

CREATE BITMAP INDEX ix_dzial ON Osoby(IdDzialu DESC)

STORAGE (...)

TABLESPACE nazwa

Indeks bitmapowy w przeciwieństwie do opartego o B-drzewa nie moŜe być zadeklarowany jako unikalny !!

Indeks bitmapowy jest uŜyteczny dla kolumn o małej liczbie róŜnych wartości oraz w przypadku stosowania w filtrach opartych o tę kolumnęduŜej liczby operatorów logicznych (zwłaszcza OR)

Operacje na indeksach

ALTER INDEX ix_dzial ALLOCATE EXTENT (SIZE 500K DATAFILE 'E:\ORA\ORADATA\ORCL\AP.ORA');

Ręczna alokacja indeksu

ALTER INDEX ix_dzial DEALLOCATE UNUSED[KEEP rozmiar K/M] ;

Zwolnienie niewykorzystanej przestrzeni, pozostawienie (rozmiar) ponad zajętą przestrzeń

Page 86: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

86

Zarządzanie indeksami przebudowa indeksu

Cele przebudowy indeksu: – odzyskanie miejsca zabieranego przez usunięte

rekordy;– przeniesienie indeksu do nowej przestrzeni tabel;– zmiana atrybutów fizycznego miejsca przechowywania;– ustawienie na nowo parametrów wykorzystania

miejsca.

Metody przebudowy indeksu:– usunięcie indeksu i zbudowanie go od nowa, – zalterowanie go z opcją REBUILD

Operacje na indeksachALTER INDEX ix_dzialREBUILD TABLESPACE Adam;

Przebudowa indeksu (reindeksacja)

ALTER INDEX ix_dzial rebuild ONLINE;

Przebudowa Online (minimalne blokady). Nie moŜe być uŜyte do indeksu Bitmapowego

ALTER INDEX ix_dzial COALESCE;

Połączenie niewykorzystanych fragmentów ekstentów

COALESCE

Page 87: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

87

Róznice przy przebudowie indeksu

MoŜna uŜyć tej metody dla indeksu uŜywanego do zachowania ograniczenia

Nie moŜna uŜyć tej metody jeśli indeks jest uŜywany do zachowania ograniczenia

Indeks pozostaje dostępny dla zapytań

Indeks jest tymczasowo niedostępny dla zapytań

Nigdy nie jest konieczne sortowanieKonieczne jest sortowanie, jeśli dane istnieją

Potrzebne jest miejsce na dwie kopie indeksu

Potrzebne jest miejsce na tylko jedną kopię indeksu

Nie moŜna przełączyć pomiędzy B*Drzewem i bitmapą

MoŜna przełączyć pomiędzy B*Drzewem i bitmapą

Nie moŜna zmienić UNIQUE na non-UNIQUE i odwrotnie

MoŜna zmienić UNIQUE na non-UNIQUE i odwrotnie

Nie moŜna zmienić nazwy indeksuMoŜna zmienić nazwę indeksu

UŜycie opcji REBUILDUsunięcie i stworzenie

Słownik danych – informacje o indeksach

informacja o kolumnach, na których oparte są indeksy

DBA_IND_COLUMNS, USER_IND_COLUMNS, ALL_IND_COLUMNS

informacja o indeksachDBA_INDEXES, USER_INDEXES, ALL_INDEXES

Page 88: ORACLE - ploug.org.pl · 1 ORACLE SQL "Rób wszystko tak prosto jak to tylko moŜliwe, ale nie prościej" Albert Einstein Adam Pelikant Organizacja bazy danych Baza …

88

Analiza indeksów

ANALYZE INDEX ix_dzial

VALIDATE STRUCTURE;

SELECT * FROM INDEX_STATS;

ALTER INDEX ix_dzialMONITORING USAGE;

SELECT * FROM V$OBJECT_USAGE;

ALTER INDEX ix_dzialNOMONITORING USAGE;

Informacja o monitoringu dla indeksów (nazwa, początek, koniec)

Dodawanie komentarza do obiektuCOMMENT ON TABLE Osoby IS 'Pracownicy firmy';

COMMENT ON TABLE [schema.] table IS 'tekst'COMMENT ON TABLE [schema.] view IS 'tekst 'COMMENT ON TABLE [schema.] snapshot IS 'tekst '

COMMENT ON COLUMN [schema.] table.column IS 'tekst 'COMMENT ON COLUMN [schema.]view.column IS 'tekst 'COMMENT ON COLUMN [schema.]snapshot.column IS 'tekst '

Aby usunąć komentarz naleŜy wpisać pusty łańcuch ' '.

SELECT * FROM USER_TAB_COMMENTS;

SELECT * FROM USER_COL_COMMENTS;