Upload
buithuan
View
219
Download
3
Embed Size (px)
Citation preview
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
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
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
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;
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
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
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
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
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
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
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
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'\';
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
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
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
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
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
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
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
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
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)
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)
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
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
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
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
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.
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.
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.
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
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.
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);
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
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
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);
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);
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
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
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;
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
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>
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;
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;
2σ
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
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
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
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)
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!!
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
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
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
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
....
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.
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;
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
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
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;
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;
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)
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;
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ń
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)
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
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
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)
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.
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
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
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;
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;
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.
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
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
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;
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)
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
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
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
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
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
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.
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;
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.
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
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);
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ń
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
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
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;