Wyk艂ad 1
Baza danych
algebra, gdzie mamy do czynienia z danymi, j臋zykiem
odwzorowanie jakiego艣 fragmentu rzeczywisto艣ci
miejsce przechowywania danych
Dane
fakty, s膮 ro偶nego typu
Z jakimi rodzajami danych si臋 spotykamy:
liczby
(艂a艅cuchy) tekst
daty (datowy)
czasowy
multimedialny (obraz, d藕wi臋k)
abstrakcyjne ( ? )
Struktury
Dane
Reprezentacja o okre艣lonej tre艣ci i strukturze, nadaj膮ca si臋 do przechowywania, przesy艂ania oraz wykonania dzia艂a艅 logicznych i matematycznych
Dane
To proste typy (bazowe; liczby, teksty, daty) i z艂o偶one (masowe; kolekcje, relacje, wielozbiory) oraz abstrakcyjne typy danych
Baza danych
jest logicznym zestawem danych i metadanych zbudowanych w oparciu o pewien model danych, na kt贸rych mo偶na wykonywa膰 okre艣lone operacje (aspekt sk艂adniowy i operacyjny)
metadane - dane o danych (dane na temat danych)
reprezentuje pewien fragment 艣wiata rzeczywistego (aspekt semantyczny)
jest projektowana, tworzona i utrzymywana z punktu widzenia przydatno艣ci dla okre艣lonych zastosowa艅 (aspekt paradygmatyczny)
Model danych
Poj臋cie niezbyt jednoznaczne, kt贸rego znaczenie jest wypadkow膮 takich cech:
metaj臋zyk (poj臋cia, terminologia) do m贸wienia o danych, systemach baz danych i przetwarzaniu
spos贸b rozumienia organizacji danych
j臋zyki opisu i przetwarzania danych; diagramy struktur danych, j臋zyki zapyta艅
og贸lne za艂o偶enia dotycz膮ce architektury systemu baz danych
ograniczenia, ideologie lub teorie matematyczne dotycz膮ce struktur danych i dost臋pu do danych
Model danych z punktu widzenia architektury systemu baz danych obejmuje :
definicj臋 danych
operowanie danymi
integralno艣膰 danych
Mo偶na wyr贸偶ni膰 trzy g艂贸wne typy:
proste modele danych (system plik贸w)
klasyczne (hierarchiczne, sieciowe, relacyjne)
semantyczne (cz臋艣ciowo obiektowe)
BAZA DANYCH
w zale偶no艣ci od przyj臋tego punktu widzenia mo偶e by膰 traktowana, co najmniej jako:
model 艣wiata rzeczywistego
zas贸b systemu informatycznego
element sk艂adowy systemu
uniwersum interpretacji j臋zyka danych
zbi贸r struktur danych
W艁ASNO艢CI BAZY DANYCH:
abstrakcja danych
niezale偶no艣膰 danych
integralno艣膰 danych (wiarygodno艣膰)
wsp贸艂dzielenie danych
integracja danych
trwa艂o艣膰 danych
bezpiecze艅stwo danych
SYSTEM ZARZ膭DZANIA BAZ膭 DANYCH
(database management system DBMS)
system oprogramowania zawieraj膮cy w szczeg贸lno艣ci nast臋puj膮ce mechanizmy:
艣rodki do gromadzenia, utrzymywania i administrowania trwa艂ymi i masowymi zbiorami danych
艣rodki zapewniaj膮ce sp贸jno艣膰 i bezpiecze艅stwo danych
sprawny dost臋p do danych ( poprzez j臋zyk zapyta艅)
艣rodki programistyczne ( API dla popularnych j臋zyk贸w programowania )
jednoczesny dost臋p do danych dla wielu u偶ytkownik贸w
艣rodki pozwalaj膮ce na odtworzenie zawarto艣ci bazy po awarii
艣rodki optymalizuj膮ce pami臋膰 i czas dost臋pu
wsp贸艂dzia艂anie w 艣rodowiskach rozproszonych
ZESTAW NARZ臉DZI
INTERFEJ U呕YTKOWNIKA
J膭DRO SYSTEMU
BAZA DANYCH
PROCES TWORZENIA BAZY DANYCH:
analiza wymaga艅 dziedziny modelowej
modelowanie koncepcyjne
modelowanie logiczne
modelowanie fizyczne
implementacja modelu w ramach systemu baz danych
MODEL ENCJA-ZWI膭ZEK
Zaliczany do modeli poj臋ciowych; j臋zyk wizualnych diagram贸w
encja - grupa obiekt贸w o podobnych w艂a艣ciwo艣ciach kt贸r膮 mo偶na i warto wyr贸偶ni膰 w modelowej rzeczywisto艣ci
zwi膮zek - grupa powi膮za艅 pomi臋dzy encjami
atrybut - cecha charakteryzuj膮ca encj臋 lub zwi膮zek
generalizacja\specjalizacja - zawieranie si臋 grup obiekt贸w
liczno艣膰 - dla danej encj A ; okre艣lenie min i max liczby obiekt贸w w innej encji
J臉ZYK ZAPYTA艃
wysoki poziom konceptualizacji i abstrakcji
deklaracyjny (nieproceduralny)
makroskopowy
naturalny
efektywny (optymalizowany)
uniwersalny
niezale偶ny od dziedziny zastosowa艅
pozwalaj膮cy na prac臋 w trybie interakcyjnym
SELECT [DISTINCT] przecinkowa lista wyra偶e艅
FROM przecinkowa lista tabel relacji
[WHERE warunek logiczny ]
[GROUP BY kryterium grupowania
[HAVING warunek logiczne]]
[ORDER BY kryterium porz膮dkowania];
OPERATORY
- por贸wna艅 =, <, >, <=, >=, <> (!=)
logiczne NOT, AND, OR
zawierania [NOT] BETWEEN
wzorca [NOT] LIKE
testuj膮cy Null IS [NOT] NULL
Relacyjne bazy danych
J臋zyk zapyta艅 SQL pochodzi od teorii relacji.
RELACJA to specyficzny rodzaj tablicy, kt贸ra:
okre艣la pojedyncz膮 jednostk臋 (entify) 艣wiata rzeczywistego
nie zawiera zduplikowanych wierszy, tzn. zawsze istnieje klucz g艂贸wny (np. powtarzaj膮ce si臋 nazwiska)
kolumny i wiersze s膮 nieuporz膮dkowane
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ka偶da kolumna jest atrybutem.
Wiersze to krotki;
krotka - wiersz to rekord.
Sk艂adnia j臋zyka SQL
Po SELECT jest przecinkowa lista tabel, kt贸re nie mog膮 zaczyna膰 si臋 od cyfry.
Baza danych ma si臋 sk艂ada膰 z wzajemnie powi膮zanych tabel.
ZAPYTANIA
Centraln膮 instrukcj膮 j臋zyka SQL jest instrukcja s艂u偶膮ca do wydobywania informacji z bazy danych. Jest ni膮 instrukcja SELECT, okre艣laj膮ca z jakich relacji (tabel) w bazie danych maj膮 by膰 sprowadzone dane i w jakiej dok艂adnie postaci maj膮 si臋 pojawi膰 przed u偶ytkownikiem. Instrukcja SELECT sk艂ada si臋 z kilku cz臋艣ci nazwanych klauzulami (frazami).
Og贸lna posta膰 jest nast臋puj膮ca:
SELECT [DISTINCT] <nazwa atrybutu>, /<wyra偶enie> [[AS><alias>], ...
FROM <nazwa relacji1>, <nazwa relacji2>, ...
[WHERE <warunek logiczny>]
[GROUP BY <wyra偶enie> /<nazwa atrybutu> [ASC/desc], ...] ;
UWAGI:
Powtarzaj膮ce si臋 krotki (wiersze) relacji nie s膮 automatycznie eliminowane z wynik贸w zapytania. S艂owo DISTINCT oznacza eliminacj臋 powtarzaj膮cych si臋 wierszy.
Przyk艂ad:
Wypisz identyfikatory os贸b, kt贸re maj膮 podw艂adnych (tzn. kt贸re s膮 kierownikami pewnych pracownik贸w).
SELECT DISTINCT szef FROM pracownik;
W miejscu nazwy atrybutu mo偶e wyst膮pi膰 wyra偶enie. Wyra偶eniom na li艣cie SELECT mog膮 zosta膰 nadane nazwy zast臋pcze,
czyli aliasy. Alias mo偶e mie膰 posta膰 prostego identyfikatora, czyli napisu z艂o偶onego z liter, cyfr i znak贸w podkre艣lenia albo ograniczonego identyfikatora, czyli dowolnego napisu ograniczonego podw贸jnymi cudzys艂owami, np. „Zarobki pracownik贸w”.
W szczeg贸lno艣ci w ograniczonym identyfikatorze mog膮 wyst臋powa膰 spacje, kt贸re s膮 niedozwolone w prostym identyfikatorze.
Przyk艂ad:
Podaj uporz膮dkowan膮 list臋 nazwisk pracownik贸w wraz z identyfikatorem i okresem zatrudnienia w pe艂nych latach.
SELECT numer, nazwisko, TRUNC(MONTHS_BETWEEN(SYSDATE, data zatrudnienia) / 12) AS Zatrudnienie
FROM pracownik ORDER BY Zatrudnienie DESC;
Przy wypisywaniu rezultat贸w (wyniku) jako tytu艂y kolumn s膮 u偶ywane aliasy. Mog膮 one wyst臋powa膰 w klauzuli ORDER BY jak w powy偶szym przyk艂adzie, gdzie porz膮dkujemy dane o pracownikach wed艂ug sta偶u pracy.
Natomiast w klauzuli WHERE, GROUP BY i HAVING nie mo偶na ich u偶ywa膰.
Obie klauzule SELECT i FROM s膮 wymagane w ka偶dym zapytaniu.
Zasady wykonania prostego zapytania:
We藕 relacj臋 podan膮 w klauzuli FROM.
Je艣li wyst臋puje klauzula WHERE, do ka偶dej krotki danej relacji zastosuj warunek logiczny. Pozostaw krotki daj膮ce warto艣ci true (usuwaj膮c krotki daj膮ce false lub NULL).
Do ka偶dej pozostaj膮cej krotki oblicz warto艣ci wyra偶e艅 na li艣cie SELECT.
Je艣li po s艂owie SELECT wyst臋puje LISTINCT, usu艅 duplikaty w艣r贸d wynikowych krotek.
Je艣li wyst臋puje klauzula ORDER BY , wykonaj porz膮dkowanie zgodne ze specyfikacj膮.
UWAGI:
Specjalna warto艣膰 NULL - aby wskaza膰 niepe艂n膮 lub nieznan膮 informacj臋.
Ta wart. r贸偶na od 0 i od spacji jest szczeg贸lnie u偶yteczna przy powi膮zaniu kluczy g艂贸wnego i obcego. Poj臋cie wart. NULL
nie jest jednak do ko艅ca akceptowane. Codd utrzymuje, 偶e wprowadzenie wart. NULL do systemu relacyjnego zmienia konwencjonaln膮 logik臋 dwuwarto艣ciow膮 (prawda, fa艂sz) na logik臋 tr贸jwarto艣ciow膮 (prawda, fa艂sz, nieznane).
Tabelki definiuj膮ce operatory logiczne w sytuacji wyst臋powania trzech warto艣ciach logicznych:
OR |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
TRUE |
FALSE |
NULL |
NULL |
TRUE |
NULL |
NULL |
AND |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
FALSE |
NULL |
FALSE |
FALSE |
FALSE |
NULL |
NULL |
TRUE |
FALSE |
NULL |
NOT |
TRUE |
FALSE |
NULL |
|
FALSE |
TRUE |
NULL |
Przy prezentacji danych u偶yteczn膮 operacj膮 jest reprezentowanie wart. NULL jako konkretnej wart. W Oracle u偶ywamy specjalnej funkcji NVL(r1,r2), kt贸rej warto艣ci膮 jest r2 je艣li r1 jest NULL, w przeciwnym razie r1, np. NVL(zarobki, 0)
NVL(stopie艅, `brak').
Klauzula ORDER BY - mo偶e wyst膮pi膰 wy艂膮cznie jako ostatnia klauzula polecenia SELECT. Domy艣lnie przyjmuje si臋 narastaj膮cy porz膮dek sortowania, co w przypadku liczb oznacza, 偶e mniejsze poprzedzaj膮 wi臋ksze, w przypadku dat, 偶e wcze艣niejsze poprzedzaj膮 p贸藕niejsze, natomiast w przypadku 艂a艅cuch贸w znak贸w, 偶e s膮 one wy艣wietlane zgodnie z porz膮dkiem alfabetycznym. Liczba atrybut贸w porz膮dkowania jest jednak ograniczona liczb膮 atrybut贸w relacji. Atrybuty wymieniamy kolejno w klauzuli ORDER BY oddzielaj膮c je przecinkami.
Ich kolejno艣膰 jest istotna: porz膮dkowanie odbywa si臋 bowiem najpierw wed艂ug wart. pierwszego atrybutu, nast臋pnie je艣li wart. te s膮 r贸wne dla dw贸ch lub wi臋cej krotek, wg drugiego atrybutu itd. Ponadto po ka偶dym z atrybut贸w porz膮dkowania mo偶na u偶y膰 s艂owa kluczowego DESC, kt贸re powoduje odwr贸cenie domy艣lnego, narastaj膮cego porz膮dku na malej膮cy.
U偶ycie atrybutu w klauzuli ORDER BY nie poci膮ga za sob膮 konieczno艣ci jego u偶ycia w klauzuli SELECT. W klauzuli ORDER BY do wynikowych kolumn mo偶emy odwo艂ywa膰 si臋 u偶ywaj膮c ich kolejnych numer贸w 1,2, ... .
Funkcje agreguj膮ce zwi膮zane z grupowaniem.
AVG ([distinct] wyra偶enie liczbowe) 艣rednia arytmetyczna
COUNT ([distinct] wyra偶enie (*) zliczaj膮ce)
MAX ([distinct] wyra偶enie)
MIN ([distinct] wyra偶enie)
SUM ([distinct] wyra偶enie-liczbowe)
Je艣li chodzi o 艣redni膮 arytmetyczn膮, to warto艣ci puste nie s膮 uwzgl臋dniane
Je艣li chodzi o zliczane(*) to wszystkie warto艣ci s膮 brane pod uwag臋 (r贸wnie偶 puste).
W sumie i w 艣redniej arytmetycznej warto艣ci puste nie s膮 uwzgl臋dniane.
KLAUZULA GROUP BY
Klauzula GROUP BY umo偶liwia podzia艂 krotek relacji na grupy. Krotki tej samej grupy maj膮 identyczn膮 warto艣膰 atrybutu, grupowania, kt贸re wskazano w klauzuli. Po podziale do ka偶dej z grup mo偶na zastosowa膰 funkcje statystyczne(agreguj膮ce) MIN(),MAX(),SUM(),AVG(),COUNT(*).
Klauzula GROUP BY mo偶e by膰 stosowana rekurencyjnie, co oznacza, 偶e mo偶e w niej wskaza膰 wiele atrybut贸w grupowania.
W takim przypadku jest mo偶liwe wydzielenie podgrup w ramach wcze艣niej wydzielonych grup. Kolejno艣膰 dzielenia relacji na grupy i podgrupy odpowiada kolejno艣ci atrybut贸w grupowania.
Przed grupowaniem krotek relacji jest mo偶liwe wykonanie na niej projekcji i (lub) selekcji. Projekcj臋 realizujemy klasycznie przez wskazanie atrybut贸w po s艂owie kluczowym SELECT. Podobnie jest z selekcj膮, kt贸ra realizuje przez wskazanie warunku (warunkowo) w klauzuli WHERE stosowanie funkcji selekcji.
Po s艂owie SELECT wykluczone mo偶liwo艣ci wyprowadzenia warto艣ci atrybut贸w pojedynczych krotek chyba, 偶e nazwa atrybutu jest wymieniona w klauzuli GROUP BY.
W konsekwencji ka偶da nazwa atrybutu wyst臋puj膮ca na li艣cie SELECT musi tak偶e pojawia si臋 w klauzuli GROUP BY, je艣li nie argumentem funkcji statycznych.
W szczeg贸lno艣ci ca艂a relacja(tabela) jest grup膮 podstawow膮.
Poprawne s膮
SELECT COUNT(*) AS „liczba_pracownik贸w ” FROM pracownik;
SELECT SUM (plac) AS “kwota_og贸艂em” FROM pracownik;
SELECT id_zesp, COUNT(*) FROM pracownik GROUP BY id_zesp;
SELECT etat, COUNT(*), AVFGH(placa) FROM pracownik
WHERE etat!='dyrektor' GROUP BY etat;
SELECT rok, max(data_urodzenia) FROM student GROUP BY rok;
SELECT to_char(data_urodzenia, 'DAY'), COUNT(*) FROM student
GROUP BY to_char(data_uroxzenia,'XAY');
SELECT imiona, COUNT(*) FROM student
GROUP BY imiona ORDER BY Z;
SELECT gr_dziekan, COUNT(*) FROM student
WHERE rok='3' AND kierunek='informatyka'
GROUP BY gr_dziekan;
KLAUZULA HAVING
Klauzula ta podobnie jak WHERE umo偶liwia selekcj臋 informacji. S艂u偶y do usuwania z wyniku zapytania nieistotnych grup i ma zazwyczaj zwi膮zek z zastosowaniem warto艣ci funkcji statystycznych.
SELECT id_zesp, COUNT(*) FROM pracownik
GROUP BY id_zesp HAVING AVG (placa)>1200;
Mo偶na pracowa膰 z wieloma tabelami, wymieniaj膮c je po przecinku po s艂owie FROM.
SELECT p.id_zesp, nazwisko, nazwa FROM pracwnik p, zesp贸艂 z
WHERE p.id_zesp=z.id_zesp ORDER BY nazwa, nazwisko ;
Mo偶na dokona膰 z艂膮czenia relacji z ni膮 sam膮.
SELECT p.nazwisko, k.nazwisko AS kierownik FROM pracownik p, kierownik k
WHERE p.szef=k.numer;
SELECT p.nazwisko, p.data_zatrudnienia, k.nazwisko, k.data_zatrudnienia
FROM pracownik p, pracownik k
WHERE p.szef=k.numer AND p.data_zatrudnienia<k.data_zatrudnienia;
UWAGI
Pojedyncze polecenie SELECT mo偶e s艂u偶y膰 do po艂膮czenia wi臋cej ni偶 dw贸ch relacji, kt贸re zgodnie og贸lnym formatem realizacji po艂膮czenia wskazujemy w klauzuli FROM
Pami臋ta膰 nale偶y, 偶e w celu po艂膮czenia n-relacji, jest konieczne okre艣lenie, co najmniej n-1 warunk贸w po艂膮czenia. Najbardziej naturalnym rodzajem z艂膮czenia jest zwi膮zek klucz g艂贸wny-> klucz obcy. Jednak w og贸lno艣ci warunek z艂膮czenia dw贸ch lub wi臋cej relacji mo偶e by膰 zupe艂nie dowolny.
SELECT nazwisko, adres nazwa FROM pracownik p, zesp贸艂 z
WHERE p.id_zesp=z.id_zesp AND placa>1500;
SELECT nazwisko, adres FROM pracownik p, zesp贸艂 z
WHERE adres like `armii krajowej%' AND ORDER BY nazwisko;
ALGEBRA RELACYJNA
Algebra relacyjna jest zbiorem kilku operator贸w. Ka偶dy operator bierze jedn膮 lub wi臋cej relacji jako argument i produkuje jedn膮 relacj臋 jako wynik. Trzema g艂贸wnymi operatorami algebry relacyjnej s膮: selekcja (ograniczenie), rzut (projekcja) i z艂膮czenie. Nie ma standardowej sk艂adni operator贸w algebry relacyjnej. Dlatego te偶 u偶ywamy tutaj notacji stworzonej do cel贸w wyja艣nie艅.
SELEKCJA
Selekcja jest operatorem, kt贸ry bierze jedn膮 relacj臋 jako sw贸j argument i produkuje w wyniku jedn膮 relacj臋. Sk艂adnia operatora selekcji jest nast臋puj膮ca:
RESTRICT <nazwa relacji (tabeli)>[WHERE <warunek>]<relacja wynikowa>
RZUT
Operacja rzutu bierze jedn膮 relacj臋 jako sw贸j argument i produkuje jedn膮 relacj臋 wynikow膮. Rzut jest pionowym ograniczeniem. Sk艂adnia operatora jest nast臋puj膮ca:
PROJECT <nazwa relacji (tabeli)>[<lista kolumn>]<relacja wynikowa>
Z艁膭CZENIE - ILOCZYN KARTEZJA艃SKI
Z艂膮czenia s膮 oparte na relacyjnym operatorze iloczynu kartezja艅skiego, kt贸remu bezpo艣rednio odpowiada w艂a艣ciwy operator teorii zbior贸w. Brane s膮 dwie relacje jako argumenty i produkowana jedna relacja wynikowa z艂o偶ona ze wszystkich mo偶liwych kombinacji wierszy (krotek) z wej艣ciowych tabel. Iloczyn kartezja艅ski jest w praktyce rzadko u偶ywanym operatorem, w zwi膮zku z jego mo偶liwo艣ci膮 generowania „eksplozji informacji”. Sk艂adnia operatora jest nast臋puj膮ca:
PRODUCT <relacja1>WITH<relacja2><relacja wynikowa>
R脫WNOZ艁膭CZENIE
Operator r贸wnoz艂膮czenia jest iloczynem kartezja艅skim, po kt贸rym jest wykonywana selekcja. M贸wi膮c dok艂adnie, 艂膮czymy dwie tabele, ale tylko dla wierszy, w kt贸rych warto艣膰 w kolumnach z艂膮czenia s膮 takie same. Zak艂adamy, 偶e klucz g艂贸wny jednej relacji i klucz obcy drugiej relacji tworz膮 domy艣lne kolumny z艂膮czenia. Sk艂adnia jest nast臋puj膮ca:
EQUIJOIN <relacja1>WITH<relacja2><relacja wynikowa>
Z艁膭CZENIE NATURALNE
Mo偶na zauwa偶y膰, 偶e r贸wno z艂膮czenie nie usuwa powt贸rze艅 kolumny z艂膮czenia. Operator z艂膮czenia naturalnego jest iloczynem kartezja艅skim, po kt贸rym nast臋puje selekcja (jak w r贸wno z艂膮czeniach) oraz rzutu, w kt贸rym nie bierze si臋 pod uwag臋 powt贸rze艅 kolumn z艂膮czenia. Sk艂adnia jest nast臋puj膮ca:
JOIN<relacja1>WITH<relacja2>ON<klucz><relacja wynikowa>
Z艂膮czenie naturalne jest na pewno nad odpowiedniej u偶ywanym w praktyce typem z艂膮czenia.
Z艁膭CZENIE ZEWN臉TRZNE
Stosujemy je gdy chcemy zachowa膰 w wyniku wszystkie wiersze z obydwu relacji, bez wzgl臋du na to, czy nie (warto艣膰 NULL). Istniej膮 trzy typy z艂膮czenia: lewostronne, prawostronne i obustronne.
Lewostronne z艂膮czenie zewn臋trzne zachowuje nie pasuj膮ce wiersze z tabeli b臋d膮cej pierwszym argumentem operatora z艂膮czenia.
SUMA
Suma jest operatorem, kt贸ry bierze dwie zgodne relacje jako swoje argumenty i produkcj臋 jedn膮 relacj臋 wynikow膮. Przez zgodne relacje rozumiemy, 偶e tabele maj膮 tak膮 sam膮 struktur臋-te same kolumny okre艣lone na tych samych dziedziczeniach.
<relacja1>UNION<relacja2><relacja wynikowa>
PRZECI臉CIE
Przeci臋cie ma dzia艂anie przeciwne dzia艂aniu sumy. Suma uwzgl臋dnia wszystkie wiersze z obu zbior贸w lub relacji, przeci臋cie natomiast uwzgl臋dnia w relacji wynikowej tylko wiersze wsp贸lne dla obu tabel.
<relacja1>INTERSECTION<relacja2><relacja wynikowa>
R脫呕NICA
<relacja1>DIFFERENCE<relacja2><relacja wynikowa>
W wi臋kszo艣ci operator贸w algebry relacyjnej porz膮dek okre艣lenia argument贸w jest nieistotny.
艁膭CZENIE RELACJI
W przypadku gdy realizacja zapytania wymaga dost臋pu do wi臋cej ni偶 jednej relacji, istnieje mo偶liwo艣膰 po艂膮czenia tych relacji z opcjonalnym wykonaniem na nich - innych operacji algebry relacji (np. projekcji). Relacje mog膮 by膰 艂膮czone poziomo lub pionowo.
POZIOME 艁膭CZENIE
Pionowe 艂膮czenie relacji polega na utworzeniu relacji wynikowej, kt贸rej krotki s膮 wynikiem konkatenacji wybranych krotek relacji 藕r贸d艂owych. Najprostszym sposobem poziomego po艂膮czenia relacji jest zastosowanie operatora produktu kartezja艅skiego.
SELECT * FROM pracownik, zesp贸艂;
W praktyce takie po艂膮czenie relacji jest wykonywane rzadko ze wzgl臋du na du偶y rozmiar wynikowej tabeli (eksplozja informacji). Znacznie cz臋艣ciej jest stosowane tzw. po艂膮czenie (ang. JOIN). W tym przypadku, krotki jednej relacji s膮 艂膮czone z krotkami innej relacji tylko wtedy, gdy warto艣ci koresponduj膮ce atrybut贸w tych krotek spe艂niaj膮 okre艣lony warunek, cz臋sto nazywamy warunkiem po艂膮czenia.
W przypadku gdy 艂膮czone relacje maj膮 atrybuty o tych samych nazwach powstaje niejednoznaczno艣膰. W celu jej usuni臋cia nazwy atrybut贸w s膮 poprzedzone nazwami relacji.
Z艁膭CZENIE ZEWN臉TRZNE
Rozszerza rezultat prostego z艂膮czenia (nazywanego wewn臋trznym) o te krotki z jednej relacji, dla kt贸rych w trakcie z艂膮czenia nie znaleziono odpowiadaj膮cym im krotek w drugiej relacji. Warunek z艂膮czenia podaje si臋 w postaci:
atrybut1 = atrybut2 (+)
lub
atrybut1 (+) = atrybut2
PRZYK艁ADY:
1.Wypisz wszystkich pracownik贸w podaj膮c dla ka偶dego z nich nazw臋 zespo艂u, w kt贸rym pracuje.
SELECT numer, nazwisko, nazwa FROM pracownik p, zesp贸艂 z
WHERE p.id_zesp = z.id_zesp (+);
Otrzymujemy informacj臋 o pracownikach i ich dzia艂aniach, r贸wnie偶 gdy pracownik nie ma porz膮dkowanego zespo艂u, podawana jest warto艣膰 NULL reprezentowana na wydruku przez pusty ci膮g znak贸w.
2.Wypisz nazwy zespo艂贸w, kt贸re nie zatrudniaj膮 pracownik贸w.
SELECT z.id_zesp, nazwa FROM zesp贸艂 z, pracownik p
WHERE p.id_zesp (+) = z.id_zesp AND p.numer IS NULL;
3.Wypisz wszystkie zespo艂y wraz z sumarycznym wynagrodzeniem (miesi臋cznym).
SELECT z.id_zesp, nazwa NVL(SUM(p艂aca_pod), 0) FROM zesp贸艂 z, pracownik p
WHERE p.id_zesp (+) = z.id_zesp GROUP BY z.id_zesp, nazwa;
4.Wypisz pracownik贸w i ich prze艂o偶onych (szef贸w) tak偶e tych, kt贸rzy nie maj膮 prze艂o偶onych.
SELECT p.nazwisko, p.szef, k.nazwisko FROM pracownik p, pracownik k
WHERE p.szef = k.numer (+) ORDER BY k.nazwisko;
PIONOWE 艁膭CZENIE RELACJI
W pionowych po艂膮czeniach relacji stosujemy jeden spo艣r贸d operator贸w zbiorowych: SUMA, PRZEKR脫J, R脫呕NICA. Operatory te dzia艂aj膮 na wynikach co najmniej dw贸ch operacji selekcji, a zatem zapytanie sk艂ada si臋 z dw贸ch lub wi臋cej polece艅 SELECT. Sk艂adnia zapytania wykorzystuj膮cego operatory zbiorowe mo偶e by膰 posta膰:
SELECT <lista atrybut贸w wyra偶e艅> FROM <nazwa relacji1>
[WHERE <warunek logiczny1>]
OPERATOR
SELECT <lista atrybut贸w wyra偶e艅> FROM <nazwa relacji2>
[WHERE <warunek logiczny2>]
[ORDER BY 1,...,n];
gdzie OPERATOR przyjmuje jedn膮 z warto艣ci: UNION, UNION ALL, INTERSECT, MINUS.
UWAGI!!!
-Zastosowanie operatora UNION powoduje wyeliminowanie z wyniku zapytania krotek o takich samych warto艣ciach atrybut贸w, wyznaczonych przez po艂膮czenie tych operatorem zapytania
-Natomiast UNION ALL spowoduje, 偶e w wyniku zapytania pojawiaj膮 si臋 wszystkie krotki
-W 艂膮czonych operatorami zbiorowymi klauzulach SELECT musi wyst膮pi膰 ta sama liczba atrybut贸w, oraz typy odpowiadaj膮cych sobie atrybut贸w (tj. atrybut贸w SELECT) r贸偶nych klauzul musz膮 by膰 zgodne
-W wyniku zapytania pojawiaj膮 si臋 nazwy atrybut贸w wy艂膮cznie z pierwszej klauzuli SELECT
-Po艂膮czenie operatorami zbiorowymi polecenia SELECT s膮 wykonywane w kolejno艣ci ich wyst臋powania (od g贸ry do do艂u)
-Je艣li istnieje potrzeba u偶ycia klauzuli ORDER BY to musi ona wyst膮pi膰 jako ostatnia klauzula ma zapytania
-W klauzuli ORDER BY nie stosujemy nazw atrybut贸w, lecz ich numery porz膮dkowe.
PRZYK艁ADY:
SELECT nazwisko [*] FROM pracownik
WHERE id_zesp = 10
UNION
SELECT nazwisko FROM pracownik
WHERE id_zesp <> 10
ORDER BY 1;
SELECT etat FROM pracownik
WHERE id_zesp = 30
UNION
SELECT etat FROM pracownik
WHERE id_zesp = 10;
SELECT nazwisko, p艂aca_pod `Powy偶ej p艂aca'
FROM pracownik
WHERE p艂aca_pod >1500
UNION
SELECT nazwisko, p艂aca_pod `1500'
FROM pracownik
WHERE p艂aca_pod =1500
UNION
SELECT nazwisko, p艂aca_pod `Poni偶ej p艂aca'
WHERE p艂aca_pod<1500
ORDER BY 2;
SELECT nazwisko, p艂aca_pod, 'Powy偶ej' P艁ACA FROM pracownik
WHERE p艂aca_pod>1500
UNION
SELECT nazwisko,p艂aca_pod,'1500'P艁ACA FROM pracownik
WHERE p艂aca_pod = 1500
UNION
SELECT nazwisko, p艂aca_pod, `Powy偶ej' P艁ACA FROM pracownik
WHERE p艂aca_pod<1500
ORDER BY 2;
SELECT id_zesp FROM zesp贸艂
MINUS
SELECT id_zesp FROM pracownik;
SELECT z.id_zesp, z.nazwa FROM zesp贸艂 z, pracownik p
WHERE p.id_zesp(t) = z.id_zesp
MINUS
SELECT z.id_zesp, z.nazwa FROM zesp贸艂 z, pracownik p
WHERE p.id_zesp = z.id_zesp;
PODZAPYTANIA ZAGNIE呕D呕ONE
Wewn膮trz klauzul WHERE, HAVING, a tak偶e FROM mog膮 wyst膮pi膰 podzapytania, maj膮ce tak膮 sam膮 posta膰 jak zapytania ale uj臋te w nawiasy.
Og贸lna posta膰 zagnie偶d偶enia zapyta艅 w klauzuli WHERE:
SELECT <lista atrybut贸w / wyra偶e艅> FROM <nazwa relacji 1>
WHERE <nazwa atrybutu / lista atrybut贸w>
<OPERATOR>
(SELECT <nazwa atrybutu / lista atrybut贸w> FROM <nazwa relacji 2>
[WHERE < nazwa atrybutu / lista atrybut贸w>
<OPERATOR>
(SELECT <nazwa atrybutu / lista atrybut贸w> FROM <nazwa relacji >
[...]] ))
Mamy do czynienia z zapytaniem zewn臋trznym i podzapytaniem - zapytaniem wewn臋trznym. W podstawowym trybie zagnie偶d偶enia (nieskorelowanym) podzapytanie jest wykonywane jako pierwsze, jednokrotne, a jego wyniki s膮 przekazywane do zapytania zewn臋trznego.
Przyk艂ad:
1)
SELECT * FROM pracownik
WHERE p艂aca_pod = (SELECT MIN (p艂aca_pod) FROM pracownik);
2)
SELECT nazwisko, etat FROM pracownik
WHERE etat = (SELECT etat FROM pracownik WHERE nazwisko = `KOLSKI');
W przypadku, gdy podzapytanie wyznacza dok艂adnie jedn膮 krotk臋 stosujemy tradycyjne operatory =, >, <, ... gdy podzapytanie wyznacza wi臋cej ni偶 jedn膮 krotk臋 stosujemy operator IN z nazwy wcze艣niej a tak偶e nowe operatory ANY, ALL oraz z operatorami por贸wnania. Operator ANY powoduje por贸wnanie pojedynczej warto艣ci (umieszczonej po jego lewej stronie) z ka偶d膮 warto艣ci膮 wyznaczan膮 przez podzapytanie. Warunek selekcji zapytania zewn臋trznego jest spe艂niony, je偶eli lista warto艣ci wyznaczonych przez podzapytanie zawiera cho膰 jeden element spe艂niaj膮cy ten warunek.
Operator ALL powoduje por贸wnanie pojedynczej warto艣ci z ka偶d膮 warto艣ci膮 wyznaczon膮 przez podzapytanie. Warunek selekcji zapytania zewn臋trznego jest spe艂niony je偶eli wszystkie warto艣ci listy spe艂niaj膮 ten warunek.
Przyk艂ad:
Podzapytanie zwracaj膮ce wiele krotek.
&wzorzec_im(naz) - wielokrotne wykorzystanie zmiennej
SELECT nazwisko, rok, gr_dziekan FROM student
WHERE (rok, gr_dziekan) IN
(SELECT rok, gr_dziekan FROM student
WHERE nazwisko LIKE UPPER (`&wzorzec_naz')
AND imiona LIKE UPPER (`&wzorzec_im'));
Wyliczona min. p艂aca podstawowa dla zespo艂贸w, kt贸re s膮 podzielone
SELECT * FROM pracownik
WHERE (p艂aca_pod, id_zesp) IN
(SELECT MIN (p艂aca_pod)0, id_zesp FROM pracownik
GROUP BY id_zesp);
Wybierana p艂aca pod. Bez wylicze艅 dla zesp. 10, a jeden z nich ma p艂ace wy偶sz膮 ni偶 pozostali.
SELECT nazwisko, p艂aca_pod, id_zesp FROM pracownik
WHERE p艂aca_pod > ANY
(SELECT DISTINCT p艂aca_pod FROM pracownik
WHERE id_zesp = 10);
Od ka偶dego zespo艂u 30 otrzymuje list臋 nazwisk.
SELECT nazwisko, p艂aca_pod, id_zesp FROM pracownik
WHERE p艂aca_pod > ALL
(SELECT DISTINCT p艂aca_pod FROM pracownik
WHERE id_zesp = 30);
Dotyczy tabel: pracownik i p艂aca, musi by膰 po艂膮czone, podporz膮dkowanie jest poza podzapytaniem (zawsze tak musi by膰).
SELECT nazwisko, p艂aca_pod FROM pracownik
WHERE p艂aca_pod > ALL
(SELECT p艂aca_pod FROM pracownik p,
zesp贸艂 z
WHERE nazwa = `ADMINISTRACJA'
AND p.id_zesp = z.id_zesp)
ORDER BY nazwisko;
Klauzula HAVING z zagnie偶d偶onymi zapytaniami
Etat w ramach kt贸rego 艣rednia praca jest wy偶sza od 艣redniej p艂acy dyrektorskiej.
SELECT etat AVG (p艂aca_pod) FROM pracownik
HAVING AVG (p艂aca_pod) > (SELECT AVG (p艂aca_pod) FROM pracownik
WHERE etat = `DYREKTOR')
GROUP BY etat;
Etat i 艣redni膮 p艂ac臋 kt贸ra ma by膰 minimum / 艣redniej.
SELECT etat AVG (p艂aca_pod) FROM pracownik
HAVING AVG (p艂aca_pod) = (SELECT MIN (AVG(p艂aca_pod) FROM pracownik
GROUP BY etat)
GROUP BY etat;
Zesp贸艂 w, kt贸rej suma p艂acy podstawowej jest maksymalna.
SELECT id_zesp, nazwa FROM zesp贸艂
WHERE ID_ZESP = (SELECT id_zesp FROM pracownik
GROUP BY id_zesp
HAVING SUM (p艂aca_pod) = (SELECT MAX (SUM (p艂aca_pod) FROM pracownik
GROUP BBY id_zesp));
SELECT imiona, rok, COUNT (*) GROM student
WHERE rok = &&liczba
GROUP BY imiona, rok
HAVING count (*) = (SELECT MAX (count(*)) FROM student
WHERE rok = &&liczba
GROUP BY imiona, rok);
&& - mam do czynienia ze zmienn膮 globaln膮
& - podaj warto艣膰
SELECT a.id_zesp „zesp贸艂”
TRUNC (100 a.liczba_prac /
b.liczba_prac, 1)
AS „%PRACOWNIK脫W”,
TRUNC (100 * a.suma_wyn /
b.suma_wyn, 1)
AS „%WYNAGRODZENIA”
FROM
(SELECT id_zesp, COUNT(*) AS liczba_prac, SUM (p艂aca_pod) AS suma_wyn
FROM pracownik GROUP BY id_zesp) a,
(SELECT COUNT(*) AS liczba_prac, SUM (p艂aca_pod) AS suma_wyn
FROM pracownik) b;
ZAPYTANIA SKORELOWANE
Zwykle podzapytanie jest wykonywane raz, na samym pocz膮tku, a do jego wynik贸w odwo艂uje si臋 zapytanie wewn臋trzne
W przypadku zapytania skorelowanego podzapytanie jest wykonywane dla ka偶dego wiersza z zapytania zewn臋trznego.
Jednym elementem sk艂adniowym r贸偶ni膮cym zapytania skorelowane od nieskorelowanych jest konieczno艣膰 zastosowania alias贸w relacji, na kt贸rych operuje zapytanie zewn臋trzne i odwo艂anie si臋 do nich w podzapytaniu:
SELECT nazwisko, placa_pod, etat
FROM pracownik p
WHERE placa_pod >
(SELECT AVG (placa_pod) FROM pracownik
WHERE etat = p. etat);
(otrzymamy nazwiska pracownik贸w, kt贸rych wynagrodzenie jest wy偶sze od 艣redniej w ramach tego samego etatu).
SELECT nazwisko FROM pracownik p
WHERE 1 < (SELECT COUNT (*)
FROM pracownik
WHERE nazwisko = p. nazwisko );
(tylko te nazwiska, kt贸re si臋 powtarzaj膮)
SELECT nazwisko, placa_pod FROM pracownik p
WHERE 1 >=
(SELECT COUNT (DISTINCT placa_pod)
FROM pracownik
WHERE placa_pod > p. placa_pod);
SELECT nazwisko, id_zesp FROM pracownik p
WHERE EXISTS (SELECT numer FROM pracownik
WHERE pracownik .szef = p. numer);
SELECT numer, nazwisko, etat FROM pracownik p
WHERE NOT EXISTS
(SELECT numer FROM pracownik
WHERE etat = p .etat AND numer != p. numer);
SELECT nazwa, id_zesp, FROM zesp贸艂 z
WHERE NOT EXISTS
(SELECT 1 FROM pracownik p
WHERE p. id_zesp = z. Id_zesp);
Niekt贸re spotykane typy danych:
znakowe typy danych - character lub char (typ o sta艂ej d艂ugo艣ci); variable char lub varchar (typ o zmiennej d艂ugo艣ci)
ca艂kowitoliczbowe typy danych - number, integer, int, smallint, tinyint
dziesi臋tne typy danych - decimal, numeric, real, double precision, float, smallfloat
datowy i czasowy typ danych - s艂u偶膮 do przechowywania daty, czasu oraz kombinacji daty i czasu (niekiedy jest dost臋pny typ przedzia艂贸w czasu) date, time, datetime, interial
binarne typy danych - s艂u偶膮 do przechowywania kodu, obraz贸w : text, blob, longblob
J臉ZYK DEFINIOWANIA DANYCH
Tworzenie relacji:
Polecenie CREATE TABLE o nast臋puj膮cym formacie og贸lnym:
CREATE TABLE <nazwa relacji>
(<nazwa atrybutu 1> <typ atrybutu 1>
(<rozmiar>)
[DEFAULT <warto艣膰 domy艣lna>]
[[CONSTRAINT <nazwa ograniczenia 1>]
<ograniczenie atrybutu 1>],
...
<nazwa atrybutu k> <typ atrybutu k>
(<rozmiar>)
[DEFAULT <warto艣膰 domy艣lna>]
[[CONSTRAINT <nazwa ograniczenia k>]
<ograniczenie atrybutu k >],
...
[[CONSRAINT <nazwa ograniczenia>]
<ograniczenie relacji>] );
W j臋zyku SQL wyr贸偶niamy nast臋puj膮ce typy atrybut贸w :
NUMBER - liczby zapisane za pomoc膮 cyfr (0-9), opcjonalnego znaku (+,-) oraz opcjonalnej kropki dziesi臋tnej. Rozmiar liczby nie mo偶e by膰 wi臋kszy od 38 cyfr.
NUMBER( r ) - jak wy偶ej, z zastrze偶eniem, 偶e rozmiar liczby nie mo偶e by膰 wi臋kszy od r znak贸w.
NUMBER(r, n) - jak wy偶ej, dodatkowo n okre艣la liczb臋 cyfr po przecinku. Je艣li n jest liczb膮 ujemn膮, w贸wczas warto艣膰 atrybutu jest zaokr膮glona do n miejsc przed przecinkiem.
CHAR( r ) - 艂a艅cuchy znakowe, sk艂adaj膮ce si臋 z ma艂ych i du偶ych liter, cyfr, znak贸w specjalnych (+ , - , % , $ , & , etc.), r mo偶e przyjmowa膰 warto艣ci ca艂kowite od 1 do 255.
VARCHAR2( r ) - 艂a艅cuchy znakowe, sk艂adaj膮ce si臋 z du偶ych i ma艂ych liter, cyfr, znak贸w specjalnych (+,-,%,$,etc). R oznacza maksymaln膮 d艂ugo艣膰 艂a艅cucha mo偶e przyjmowa膰 warto艣ci ca艂kowite od 1 do 2000.
Ten typ danych umo偶liwia przechowywanie 艂a艅cuch贸w znakowych o zmiennej d艂ugo艣ci oznacza to 偶e warto艣ci tego atrybutu zajmuj膮 w bazie danych tyle miejsca, ile faktycznie wynosi ich d艂ugo艣膰.
VARCHAR( r ) - podobnie jak VARCHAR2, zaleca si臋 stosowanie typu VARCHAR2 dla atrybut贸w o zmiennej d艂ugo艣ci, poniewa偶 w kolejnych wersjach ORACLE semantyka tego typu mo偶e si臋 zmienia膰.
DATE - data z przedzia艂u od 1 stycznia 4712pne do 31 grudnia 4712
LONG - tak jak CHAR, przy czym maksymalna d艂ugo艣膰 艂a艅cucha wynosi 263.
Wykorzystywanie atrybutu tego typu w poleceniach SQL podlega pewnym ograniczeniom.
LONG RAW - tak jak LON G, ale wykorzystywany do przechowywania danych dowolnego typu (to jest nie tylko znak贸w), np. obraz贸w, d藕wi臋k贸w.
Pseudoatrybuty -
- rowid - Fizyczny adres wiersza w tabeli
- rownum - ilo艣膰 zwracanych wierszy z zapytania
NULL - umo偶liwia nadawanie atrybutom warto艣ci pustych.
NOT NULL - uniemo偶liwia nadawanie atrybutom warto艣ci pustych.
UNIQUE - definiuje atrybut, kt贸ry pe艂ni rol臋 klucza unikalnego relacji. Warto艣膰 tak zdefiniowanego atrybutu jest unikalna dla wszystkich krotek tej relacji.
PRIMARY KEY - definiuje atrybut kt贸ry pe艂ni rol臋 klucza podstawowego relacji
Je偶eli dla atrybutu zdefiniowanego ograniczenie UNIQUE, to nie mo偶na dla tego atrybutu zdefiniowa膰 r贸wnocze艣nie ograniczenia PRIMARY KEY i odwrotnie.
Zdefiniowanie ograniczenia UNIQUE lub PRIMARY KEY uniemo偶liwia nadawanie atrybutom warto艣ci pustych.
REFERENCES - okre艣la tak zwane ograniczenie referencyjne tj. referencj臋 do klucza podstawowego lub unikalnego innej relacji. Ograniczenie to jest wykorzystywane do definiowania tak zwanego klucza obcej relacji. Atrybut b臋d膮cy kluczem obcym nie mo偶e przyjmowa膰 warto艣ci, kt贸rych nie przyjmuje odpowiadaj膮cy mu klucz.
ON DELETE CASCADE - ograniczenie to definiuje si臋 dla klucza obcego. Dzia艂anie tego ograniczenie jest nast臋puj膮ce: je偶eli zostanie usuni臋ta krotka z relacji z kluczem podstawowym, to automatycznie s膮 usuwane te krotki z relacji z kluczem obcym, dla kt贸rych warto艣膰 klucza obcego jest r贸wna warto艣ci klucza podstawowego usuwanej krotki.
W 8
CHECK
Okre艣la warunek, kt贸ry musi by膰 spe艂niony przez wszystkie warto艣ci argument贸w. W definicji tego ograniczenia mo偶na wykorzysta膰 operatory =,<,>,!=,ISNOT,LIKE,BETWEEN,...AND...IN, oraz operatory logiczne AND, OR, NOT
Opcjonalnie jako ostatni element definicji relacji okre艣la si臋 ograniczenia integralno艣ciowe relacji. R贸偶ni膮 si臋 one od ogranicze艅 argument贸w tym, 偶e mog膮 odwo艂ywa膰 si臋 do wi臋cej ni偶 jednego argumentu relacji.
Mo偶na zdefiniowa膰 nast臋puj膮ce ograniczenia tego typu: UNIQUE, PRIMARYKEY, REFERENCES, ONDELETE CASCADE, CHECK; ich znaczenie jest takie samo, jak znaczenie odpowiadaj膮cych im ogranicze艅 integralno艣ciowych atrybutu. Dodatkowo dla relacji istnieje ograniczenie FOREIGN KEY, umo偶liwiaj膮ce zdefinowanie klucza obcego relacji, z艂o偶onego z wielu argument贸w.
Ka偶demu z ogranicze艅 mo偶na opcjonalnie przypisa膰 nazw臋 poprzedzaj膮c j膮 s艂owem kluczowym CONSTRAINT. Je偶eli nazwa nie zostanie jawnie nadana ograniczeniu, to SZBD okre艣li dla niego domy艣ln膮 nazw臋 SYS_Cn gdzie n oznacza numer ograniczenia.
CREATE TABLE dydaktycy (
id_dydakt NUMBER (2) CONSTPAINT id_dydakt_pk PRIMARY KEY,
nazwisko VARCHAR2 (15) NOT NULL,
tytu艂 VARCHAR2 (10) NOT NULL);
CREATE TABLE przedmioty (
id_przedm NUMBER (2) CONSTRAINT id_przedm_pk PRIMARY KEY ,
nazwa VARCHAR2 (15) NOT NULL);
CREATE TABLE zaj臋cia (
id_zaj臋膰 NUMBER(2) CONSTRAINT id_zaj臋膰_pk PRIMARY KEY ,
rodzaj_zaj VARCHAR2 (15) CONSTRAINT rodzaj_zaj_chk CHECK
(rodzaj_zaj IN (`WYK艁AD','LABOLATORIUM','PROJEKT')),
id_dydakt NUMBER(2) NOT NULL,
id_przedm NUMBER(2) NOT NULL,
FOREIGN KEY(id_dydakt)
REFERENCES dydaktycy (id_dydakt) ON DELETE CASCADE,
FOREIGN KEY (id_przedm)
REFERENCES przedmioty (id_przedm));
CREATE TABLE Dzia艂y (
id_dzia艂u NUMBER(3) PRIMARY KEY ,
Nazwa_dzia艂u VARCHAR2(20) NOT NULL UNIQUE,
Miejsce VARCHAR2(50));
CREATE TABLE pracownicy (id_pracownika NUMBER(6) PRIMARY KEY ,
Nazwisko VARCHAR2(9) NOT NULL
Kierownik NUMBER(6) REFERENCES Pracownicy DATA_zatrudnienia DATE
Zarobki NUMBER(8,2), stanowisko VARCHAR2(9),
Premia NUMBER(8,2),
Id_dzia艂u NUMBER(3) REFERENCES Dzia艂y,
CHECK (Premia<Zarobki));
CREATE TABLE Zaszeregowania (
Grupa NUMBER(2) PRIMARY KEY ,
Dolne NUMBER(8,2) NOT NULL,
G贸rne NUMBER(8,2) NOT NULL,
CHECK (Dolne<G贸rne));
W celu utworzenia relacji i jednoczesnego wype艂nienia jej danymi zawartymi w innych ju偶 istniej膮cych relacjach udost臋pniono alternatywny format polecenia CREATE TABLE
CREATE TABLE <nazwa relacji>
[(<nazwa atrybutu 1> [DEFAULT <warto艣膰 domy艣lna>]
[NULL/ NOT NULL],...)]
AS SELECT <klauzula select>;
Opcjonalny fragment polecenia umo偶liwia nadanie nazw atrybutom nowej relacji. W przypadku jego pomini臋cia przyjmowane s膮 nazwy zgodnie z nazwami zawartymi klauzuli select .
PRZYK艁AD
CREATE TABLE lista_p艂ac
(id_pracownika NOT NULL, nazwisko NOT NULL, pensja DEFAULT 750 NOT NULL)
AS
SELECT id_pracownika, nazwisko, zarobki +
Premia
FROM pracownik;
AKTUALIZACJA SCHEMATU RELACJI
DODAWANIE NOWEGO ATRYBUTU
ALTER TABLE <nazwa relacji>
ADD(<nazwa atrybutu> <typ atrybutu>(<rozmiar>)
[DEFAULT <warto艣膰 domy艣lna>]
[[CONSTRAINT <nazwa ograniczenia>]
<ograniczenie atrybutu>] );
ZMODYFIKOWANIE ISTNIEJ膭CEGO ATRYBUTU
ALTER TABLE <nazwa relacji>
MODIIFY(<nazwa atrybutu> <typ atrybutu> <rozmiar>)
[DEFAULT <warto艣膰 domy艣lna>]
[NULL/NOT NULL] );
DODANIE OGRANICZENIA INTEGRALNO艢CIOWEGO
ALTER TABLE <nazwa relacji>
ADD [CONSTRAINT <nazwa ograniczenia>]
<ograniczenie relacji>;
PRZYK艁AD
ALTER TABLE pracownik
ADD (tytu艂_nauk VARCHAR2(10));
ALTER TABLE pracownik MODIFY (tytu艂_nauk VARCHAR2(15)
DEFAULT `mgr in偶.' NOT NULL);
DODANIE OGRANICZENIA - przyk艂ady
ALTER TABLE pracownik ADD (CONSTRAINT etat_chk CHECK (etat IN (`DYREKTOR','PROFESOR','ADIUNKT','STA呕YSTA','SEKRETARKA')));
ALTER TABLE pracownik ADD
(CONSTRAINT prac_fk FOREIGN KEY
(id_dzia艂u) REFERENCES dzia艂 (id_dzia艂));
mo偶liwe jest czasowe wy艂膮czenie lub uaktywnienie ograniczenia integralno艣ciowego stosuj膮c klauzule DISABLE lub ENABLE
ALTER TABLE <nazwa relacji> DISABLE/ENABLE
<rodzaj ograniczenia>
/ CONSTRAINT <nazwa ograniczenia> [CASCADE];
gdzie rodzaj ograniczenia przyjmuje jedn膮 z trzech warto艣ci:
UNIQUE, PRIMARY KEY lub ALL TRIGGERS
opcjonalnie s艂owo CASCADE powoduje odpowiednio wy艂膮czenie lub uaktywnienie wszystkich pozosta艂ych ogranicze艅, kt贸rych dzia艂anie zale偶y od wy艂膮czonego lub uaktywnionego ograniczenia
ALL TRIGGERS
Powoduje czasowe wy艂膮czenie lub uaktywnienie wszystkich wyzwalaczy zdefiniowanych dla relacji.
W 9
Ograniczenia integralno艣ciowe mo偶e r贸wnie偶 zosta膰 usuni臋te z bazy danych.
ALTER TABLE <nazwa relacji>
DROP <rodzaj ograniczenia>/
CONSTRAINT <nazwa ograniczenia>[CASCADE];
-gdzie rodzaj ograniczenia przyjmuje jedn膮 z dw贸ch warto艣ci PRIMARY KEY. UNIQE
-opcjonalne s艂owo CASCADE umo偶liwia usuni臋cie wszystkich pozosta艂ych ogranicze艅, kt贸rych dzia艂anie zale偶y od usuwanego ograniczenia.
PRZYK艁ADY:
ALTER TABLE zaj臋cia DISABLE CONSTRAINT rodzaj_zaj_chk;
ALTER TABLE zaj臋cia DISABLE PRIMARY KEY;
ALTER TABLE pracownik DROP CONSTRAINT etat_chk;
ALTER TABLE zaj臋cia DROP PRIMARY KEY;
Uwagi!
Modyfikacja schematu relacji jest jednak bardzo ograniczona. Nie dopuszcza si臋 zmiany atrybutu, kt贸ry wcze艣niej zosta艂 zadeklarowany jako atrybut mog膮cy przyjmowa膰 warto艣ci puste (tj. atrybut z ograniczeniem NULL), na atrybut niepusty (NOT NULL), je艣li w relacji istnieje co najmniej jedna kratka o pustej warto艣ci tego atrybutu. Nie jest mo偶liwe rozszerzenie relacji o nowy atrybut niepusty. Ponadto, bardzo ograniczone jest zmniejszenie rozmiaru atrybutu (a dok艂adniej zmniejszenie jego typu), kt贸re jest dopuszczalne jedynie w przypadku, gdy wszystkie kratki zawarte w relacji o modyfikowanym schemacie przyjmuj膮 puste warto艣ci tego atrybutu.
POLECENIE
DESCRIBE <nazwa relacji>;
ZMIANA NAZWY RELACJI:
RENAME <stara nazwa relacji> TO <nowa nazwa relacji>
Usuwanie relacji:
DROP TABLE <nazwa relacji>
[CASCADE CONSTRAINT],
-gdzie CASCADE CONSTRAINT jest opcjonaln膮 klauzul膮, umo偶liwiaj膮c膮 usuni臋cie ogranicze艅 integralno艣ciowych w innych relacjach, kt贸re w swej definicji wykorzystuj膮 atrybuty kluczowe i unikalne usuwanie relacji.
Usun膮膰 relacj臋 mo偶e, jedynie jej w艂a艣ciciel tzn. u偶ytkownik kt贸ry j膮 stworzy艂.
Operacja usuwania relacji mo偶e doprowadzi膰 do b艂臋d贸w w sesjach u偶ytkownik贸w odwo艂uj膮cych si臋 do niej w p贸藕niejszym czasie, w spos贸b bezpo艣redni lub przez bazuj膮ce na niej perspektywy
AKTUALIZACJA ZAWARTO艢CI RELACJI(TABELI)
DML -j臋zyk polece艅 manipulowania danymi
Dopisywanie nowych krotek
Wstawianie krotki mog膮 by膰 wynikiem zapytania SELECT, a wi臋c w og贸lno艣ci mog膮 pochodzi膰 z innych relacji.
Posta膰 polecenia b臋dzie mia艂a posta膰:
INSERT INTO <nazwa relacji)[(lista atrybut贸w)]
SELECT <lista atrybut贸w> FROM..)
Dopisywanie jednej krotki to posta膰:
INSERT INTO <nazwa relacji>[(lista atrybut贸w)]
VALUES(warto艣膰1,warto艣膰2,...);
Opcjonalna lista atrybut贸w jest zb臋dna w przypadku wprowadzenia wszystkich atrybut贸w danej relacji.
MODYFIKOWANIE ISTNIEJ膭CYCH KROTEK:
UPDATE <nazwa relacji>[alias] SET <nazwa atrybutu1>[,nazwa atrybutu2]={wyra偶enie/podzapytanie}[WHERE <warunek logiczny>];
USUWANIE KROTEK RELACJI
DELETE FROM <nazwa relacji>[WHERE <warunek logiczny>];
INSERT INTO zajecia
VALUES(5,'LABORATORIUM',10,12);
INSERT INTO pracownik SELECT * FROM pracownik@zgoda.bytom.pl;
(wstaw do tabeli pracownik wynik zapytania)
UPDATE pracownik SET
Placa_pod=(SELECT placa_pod FROM dodatki d WHERE numer IN(SELECT numer FROM dodatki);
UPDATE pracownik SET
placa_pod=(
SELECT
AVG(placa_pod) FROM pracownik
WHERE numer IN(
SELECT
numer FROM pracownik
WHERE placa_pod =
(SELECT
MIN(placa_pod) FROM
(pracownik));
(placa_pod=艣redni p艂acy_pod)
UPDATE pracownik a
SET (a.placa_pod,a.placa_dod)=
(SELECT AVG(placa_pod)*1,2MAX(NVL(placa_dod,0)) FROM pracownik
WHERE id_zesp=a, id_zesp)
WHERE a.pracuje_od>'89/12/31';
Placa_pod wzrasta o ok. 20%
Placa_dod podniesaiona dla pracow.zatrudnionych8/12/01
6) DELETE FROM pracownik
WHERE stanowisko IS NULL;
PERSPEKTYWY
Dost臋p do perspektywy odbywa si臋 z godnie z og贸lnymi zasadami dost臋pu do relacji , a wi臋c:
-za pomoc膮 polecenia SELECT
kt贸rego klauzuli FROM u偶yto
perspektywy
-polece艅
INSERT,UPDATE,DELETE
je偶eli perspektywa modul zawarto艣ci relacji na kt贸rych bazuje.
W zale偶no艣ci od zdefiniowania perspektywy zwykle wyr贸偶nia si臋 perspektywy proste i z艂o偶one.
Perspektywa prosta charakteryzuje si臋 tym , 偶e udost臋pnia dane z pojedynczej relacji, a w jej definicji nie stosuje si臋 operacji na zbiorach, funkcji ani te偶 grupowania krotek.
Og贸lny format jest postaci:
CREATE [OR REPLACE]VIEW <nazwa perspektywy>[(lista atrybut贸w)] AS SELECT...[WITH CHECK OPTIONS];
-opcjonalna klauzula OR REPLACE zast臋puje istniej膮c膮 perspektyw臋 now膮 definicj膮.
-dla wyra偶e艅 wykorzystanych w poleceniu SELECT (np.SUM(placa_pod),NVL(placa_dod,0) nale偶y okre艣li膰 aliasy lub nazwy odpowiadaj膮cym im atrybut贸w perspektywy.
Usuni臋cie perspektywy :
DROP VIEW<nazwa perspektywy>;
Przyk艂ad:
1)
CREATE VIEW asystenci AS
SELECT numer, nazwisko FROM pracownik WHERE etat='asystent';
2)
CREATE VIEW klientki AS SELECT *
FROM klient
WHERE plec='KOBIETA'
MODYFIKACJA
ALTER TABLE moja ADD ... MODIFY
Jednak mo偶na usun膮膰 tabel臋 (najnowsze wersje), czyli
ALTER TABLE moja DROP(k1) usuwamy klucz k1 inaczej / DROP COLUMN k1 - inny zapis
W perspektywie nie u偶ywamy porz膮dkowania
TWORZENIE PERSPEKTYWY
CREATE VIEW etat-zesp贸艂 (nazwa, p艂aca_min,p艂aca_max, p艂aca_prezesa)
AS
SELECT nazwa MIN(p艂aca_pod), MAX(p艂aca_pod), AVG(p艂aca_pod)
FROM pracownik, zesp贸艂
WHERE pracownik.id_zesp=zesp贸艂.id_zesp
GROUP BY nazwa;
CREATE VIEW cd
AS
SELECT numer, nazwisko, p.id_zesp, adres
FROM pracownik p, zesp贸艂 z
WHERE p.id_zesp=z.id_zesp;
Mo偶liwe s膮 zmiany (INSERT, DELETE, UPDATE) w odniesieniu do tabeli pracownik, ale nie w odniesieniu do tabeli zesp贸艂.
CREATE OR REPLACE VIEW adiunkci
AS
SELECT numer, nazwisko, etat
FROM pracownik
WHERE etat='ADIUNKT'
WITH CHECK OPTION;
CREATE VIEW szefowie
AS
SELECT nazwisko, nazwa
FROM pracownik p, zesp贸艂 z
WHERE numer IN (SELECT DISTINCT szef FROM pracownik)
AND p.id_zesp=z.id_zesp;
CREATE VIEW pr_urlop_bezp艂
AS
SELECT *
FROM pracownik
WHERE p艂aca_pod=0 OR p艂aca_pod is NULL,
WITH CHECK OPTION;
LICZNIKI SEKWENCJI
W systemie ORACLE jest specjalna konstrukcji sekwencja (przechowywana jako obiekt w bazie danych), kt贸ra s艂u偶y do generowania jednoznacznych warto艣ci dla kluczy unikalnych. Sk艂adnia jest taka:
CREATE SEQUENCE [nazwa u偶ytkownika]<nazwa licznika>
[INCREMENT BY<Liczba>]
[START WITH <warto艣膰 pocz膮tkowa>]
[CYCLE / NOCYCLE]
nazwa u偶ytkownika jest opcjonalnym parametrem okre艣laj膮cym u偶ytkownika, kt贸ry utworzy艂 licznik
INCREMENT BY jest opcjonalnym parametrem okre艣laj膮cym warto艣膰, o jak膮 b臋dzie zwi臋kszany licznik po ka偶dym odczycie, liczba mo偶e by膰 ujemna
START WITH opcja do okre艣lania pocz膮tkowej warto艣ci licznika
CYCLE / NOCYCLE opcja do okre艣lania czy po osi膮gni臋ciu max licznika zacznie zlicza膰 od nowa (CYCLE)czy nie domy艣lne (NOCYCLE)
Sk艂adnia
<nazwa sekwencji>NEXTVAL - generowanie kolejnej warto艣ci
<nazwa sekwencji>CURRVAL - ostatnio wygenerowana warto艣膰
Przyk艂ad.
CREATE SEQUENCE prac_seg
INCREMENT BY 10
START WITH 1000;
INSERT INTO pracownik
VALUES (prac_seg NEXTVAL, `Stec', 'RADCA PRAWNY', NULL `90/01/20', 1200,0,10);
USUNI臉CIE SEKWENCJI
Instrukcja:
DROP SEQUENCE<nazwa sekwencji>;
TWORZENIE INDEKSU
CREATE [UNIQUE] INDEX<nazwa indeksu>
ONK nazwa relacji(nazwa atrybutu1 [nazwa atrybutu1]);
Po utworzeniu indeksu jest on stosowany w spos贸b automatyczny przez SZBD ka偶dorazowo wtedy, gdy wymaga tego strategia optymalizacji relacji zapyta艅. Oznacza to, 偶e u偶ytkownik nie musi by膰 艣wiadomy istnienia indeksu jak r贸wnie偶 wykorzystania indeksu przy realizacji jego okre艣lonych polece艅.
Uwagi!!!
Indeksy zajmuj膮 miejsce w bazie danych
Kiedy wprowadzamy modyfikujemy lub usuwamy dane z indeksowanej kolumny SZBD musi uaktywnia膰 indeks, mo偶e to spowolni膰 przeprowadzanie operacji
W praktyce nie ma sensu zak艂adanie indeks贸w na ma艂ych relacjach, gdy偶 nie powoduje to odczuwalnej poprawy efektywno艣ci
Dobr膮 zasad膮 jest tworzenie indeks贸w dla kluczy obcych oraz na atrybutach cz臋sto stosowanych w klauzulach WHERE zapyta艅 i na atrybutach po艂膮czeniowych relacji
Indeksy zdecydowanie przyspieszaj膮 dost臋p do danych
Przyk艂ady
CREATE UNIQUE INDEX ind_zespo艂
ON pracownik (id_zesp);
CREATE UNIQUE INDEX ind_nazwisko
ON pracownik (nazwisko);
Indeks mo偶na usun膮膰
DROP INDEX <nazwa indeksu>;
S艂owniki danych
jest zbiorem informacji o obiektach bazy danych. U偶ywany zar贸wno przez system bazy jak i przez u偶ytkownika. U偶ytkownik ma uprawnienia tylko do odczytu informacji ze s艂ownika danych. S艂ownik ma posta膰 zbioru tabel i perspektyw. Oto przyk艂adowe perspektywy s艂ownika danych oracle
1-z przedrostkami User
informacje o wszystkich obiektach, kt贸rych danych u偶ytkownik jest w艂a艣cicielem
np.: User_Table, User_Object
z przedrostkiem ALL
dotyczy wszystkich obiekt贸w, do kt贸rych u偶ytkownik ma uprawnienia
z przedrostkiem DBA
obiekty dost臋pne dla administratora systemu
TRANSAKCJE
Zdarzenia, kt贸re powoduj膮 zmian臋 stanu s膮 w terminologii baz danych nazywane transakcjami.
U偶ytkownik realizuje swoje transakcje albo poprzez polecenia j臋zyka SQL kierowane bezpo艣rednio albo po艣rednio przy u偶yciu wcze艣niej przygotowanych aplikacji bazo danowych.
Przyk艂ady:
przelewy kwoty z konta na konto
system rezerwacji bilet贸w lotniczych (po艂膮czenia)
wysy艂kowa sprzeda偶
Ka偶da transakcja powinna mie膰 w艂a艣ciwo艣ci:
ACID
Atomowo艣ci
Sp贸jno艣ci
Izolacyjno艣ci
Trwa艂o艣ci
INTEGRALNO艢膯
Og贸lnym celem integralno艣ci jest zapewnienie, aby baza danych by艂a dok艂adnym odzwierciedleniem 艣wiata rzeczywistego, kt贸ry reprezentuje. W 艣rodowiskach z wieloma u偶ytkownikami zapewnienie integralno艣ci jest r贸wnie偶 spraw膮 fizycznego wymiaru systemu baz danych. J膮dro systemu SZBD zajmuje si臋 problemami sprz臋tu i oprogramowania, a tak偶e rozdzia艂em zasob贸w mi臋dzy wielu u偶ytkownik贸w.
Zarz膮dzanie transakcjami dotyczy wsp贸艂bie偶nego dost臋pu do bazy danych i zapewnienie sp贸jno艣ci bazy danych.
WSP脫艁BIE呕NO艢膯
Je偶eli do bazy danych ma jednocze艣nie dost臋p wielu u偶ytkownik贸w lub aplikacji, m贸wi si臋, i偶 ich transakcje wykonywane s膮 wsp贸艂bie偶nie.
Transakcje wsp贸艂bie偶ne mog膮 by膰 przeprowadzane na jeden z dw贸ch sposob贸w:
szeregowo
r贸wnolegle
Serializowane transakcje
BOKADY
Blokady (zamki):
do odczytu
do zapisu
wsp贸lne
Blokady mog膮 by膰 stosowane w r贸偶nym stopniu szczeg贸艂owo艣ci na poziomie tabel, stron, rekord贸w, a nawet p贸l w rekordach.
ZAKLESZCZENIE
Jest stanem, w kt贸rym dwie lub wi臋cej transakcji blokuje sobie wzajemnie zasoby. Oznacza to, 偶e 偶adna z transakcji nie mo偶e kontynuowa膰 pracy.
POZIOMY IZOLACJI
Efekty, kantom, niepowtarzalny odczyt, brudny odczyt.
TRANSAKCJE W ORACLE
W Oracle 8 transakcja jest logiczn膮 jednostk膮 dzia艂ania sk艂adaj膮c膮 si臋 z jednej lub wielu polece艅 SQL.
Ka偶da transakcja rozpoczyna si臋 w momencie wprowadzenia pierwszej poprawnej instrukcji SQL.
Kiedy transakcja rozpoczyna si臋, system przypisuje jej segment wycofania. W segmencie tym zapisane s膮 dane pochodz膮ce z momentu poprzedzaj膮cego ich zmian臋 przez transakcje. Dzi臋ki tym informacjom transakcja mo偶e zosta膰 wycofana, a dane znajduj膮ce si臋 w bazie danych przed rozpocz臋ciem transakcji odtworzone.
Zako艅czenie transakcji nast臋puje w wyniku:
wydania polecenia COMMIT lub ROLLBACK
wykonania jednej z instrukcji CREATE, DROP, ALTER
zako艅czenia sesji u偶ytkownika z serwerem
anomalnego zerwania sesji u偶ytkownika
Mo偶liwe jest r贸wnie偶 dzielenie d艂u偶szych transakcji na mniejsze poprzez deklarowanie znacznik贸w po艣rednich.
SAVEPOINT znacznik;
Umo偶liwia to wycofanie w razie b艂臋d贸w jedynie fragmentu transakcji i ponowienie pr贸by jego wykonania bez powtarzania ca艂ej transakcji od pocz膮tku.
Cz臋艣ciowe cofni臋cie transakcji do znacznika nie zamyka transakcji.
ROLLBACK TO SAVEPOINT znacznik;
Oracle automatycznie w艂膮cza i wy艂膮cza r贸偶ne typy blokad zale偶nie od sytuacji i nie wymaga przy tym 偶adnych akcji ze strony u偶ytkownika.
Jawne usuwanie blokady przez u偶ytkownika jest mo偶liwe za pomoc膮 polece艅:
LOCK TABLE
SELECT … FOR UPDATE
Instrukcje steruj膮ce w PL/SQL
J臋zyk PL/SQL posiada wi臋kszo艣膰 typowych instrukcji steruj膮cych
IF <warunek logiczny> THEN
<blok instrukcji>
END IF;
IF <warunek logiczny> THEN
<blok instrukcji>
ELSE <blok instrukcji> END IF;
IF <warunek logiczny> THEN
<blok instrukcji>
ELSIF <warunek logiczny> THEN
<blok instrukcji>
END IF;
LOOP
<blok instrukcji>
(w tym EXIT lub EXIT WHEN <warunek logiczny>
END LOOP
FOR <zmienna> IN <warto艣膰1> <warto艣膰2>
LOOP
<blok instrukcji>
END LOOP
WHILE <warunek logiczny>
LOOP
<blok instrukcji>
END LOOP
[DECLARE
<deklaracja obiekt贸w PL/SQL
zmienne, sta艂e, wyj膮tki, procedury, funkcje>]
BEGIN
<ci膮g instrukcji do wykonania>
[EXCEPTION
<obs艂uga wyj膮tk贸w>
END;
Uwagi !!!
deklaracja i obs艂uga wyj膮tk贸w s膮 opcjonalne
bloki mog膮 by膰 zagnie偶d偶one
jedynymi instrukcjami j臋zyka SQL, kt贸re mog膮 si臋 pojawi膰 w bloku PL/SQL s膮 instrukcje SELECT, INSERT, UPDATE, DELETE, COMMIT, ROLLBACK
WYK艁AD 12 08.01.2002
Deklaracja zmiennych i sta艂ych maj膮 nast臋puj膮c膮 posta膰:
IDENTYFIKATOR TYP_DANYCH [NOT NULL] [:=WYRA呕ENIE];
Identyfikator CONSTRANT typ_danych [NOT NULL] [:=wyra偶enie]
Opcjonalna cz臋艣膰 [:=wyra偶enie] umo偶liwia inicjalizacj臋 warto艣ci zmiennej
Przyk艂ady
Znak CHAR(1);
Wynagrodzenie NUMBER(7,2);
Pi CONSTANT NUMBER(7,5):=3.14159;
Nazwa VARCHAR2(10):='Drukarka';
Termin DATE:=Sysdate;
Stan_cywilny BOOLEAN:=FALSE;
Liczba_dzieci BINARY_INTEGER:=0;
Brak_danych EXCEPTION;
Osoba pracownik.nazwisko% TYPE;
Pracownik_rekord pracownik% ROWTYPE;
Uwagi!
w PL/SQL s膮 dost臋pne typy danych z j臋zyka SQL a ponadto typ BOOLEAN (logiczny) i BINARY_INTEGER liczb ca艂kowitych - niezale偶ny od podtyp贸w NUMBER i przez to wymagaj膮cy przy zapisie mniej pami臋ci
nie nale偶y nadawa膰 tej samej nazwy, co atrybut w tabeli
opr贸cz zmiennych deklarowanych w bloku PL/SQL mog膮 wyst臋powa膰 jeszcze zmienne z aplikacji korzystaj膮cej z bloku PL/SQL - poprzedza si臋 je dwukropkiem (:zmienna)
mog膮 tak偶e wyst臋powa膰 zmienne podstawienia SQL* Plus (&zmienna)
typ zmiennej lub sta艂ej mo偶na zadeklarowa膰 u偶ywaj膮c pseudoatrybutu %TYPE, okre艣laj膮cego typ podanego przed nim atrybutu relacji
zmienn膮 typu rekordowego z u偶yciem pseudoatrybutu %ROWTYPE lub przy u偶yciu zbiorowego typu danych RECORD
ZMIENNE SYSTEMOWE
Jest pewna liczba zmiennych zadeklarowanych przez system z kt贸rych mo偶na korzysta膰 w kodzie PL/SQL (ale nie w SQL). Ich warto艣ci dotycz膮 ostatnio wykonanej instrukcji SQL:
SQL %ROWCOUNT - liczba wierszy przetworzonych przez ostatni膮 instrukcj臋 SQL
SQL %FOUND=TRUE - je艣li wiersz zosta艂 znaleziony (przetworzony - przynajmniej jeden)
SQL %NOTFOUND=TRUE - je艣li wiersz nie zosta艂 znaleziony (przetworzony - przynajmniej jeden)
SQLERRM - tekstowa informacja o b艂臋dzie
SQLCODE - kod b艂臋du
Ostatnie dwie wymienione zmienne mo偶na u偶ywa膰 tylko w sekcji EXCEPTION
PROCEDURY, FUNKCJE I PAKIETY
Procedury, funkcje i pakiety s膮 to obiekty zapisywane w bazie danych, tak jak inne obiekty.
Szczeg贸lnym rodzajem procedur s膮 wyzwalacze bazy danych
WYZWALACZE BAZY DANYCH
Wyzwalacze bazy danych s膮 procedurami sk艂adowanymi w bazie danych w powi膮zaniu z jej konkretn膮 relacj膮. S膮 one uruchamiane automatycznie w momencie wykonania polecenia SQL: INSERT, UPDATE, DELETE
Wyzwalacze bazy danych s艂u偶膮 g艂贸wnie do oprogramowania wi臋z贸w sp贸jno艣ci i do oprogramowania sta艂ych czynno艣ci, kt贸re powinny by膰 wykonywane w ka偶dej aplikacji korzystaj膮cej z bazy danych.
SK艁ADNIA WYZWALACZA BAZY DANYCH:
CREATE [OR REPLACE] TRIGGER
<nazwa wyzwalacza>
BEFORE/AFTER
<specyfikacja instrukcji > ON <nazwa relacji>
[FOR EACHROW]
<blok instrukcji PL/SQL>
specyfikacja instrukcji przyjmuje jedn膮 z operacji INSERT, UPDATE, DELETE lub kilka po艂膮czonych operatorem OR
w przypadku UPDATE podaje si臋 dodatkowo nazw臋 aktualizowanego atrybutu u偶ywaj膮c sk艂adni:
UPDAE OF <nazwa atrybutu>
opcjonalna klauzula FOR EACH ROW spowoduje uruchomienie wyzwalacza dla ka偶dej krotki spe艂niaj膮cej warunek polecenia, brak tej klauzuli spowoduje uruchomienie wyzwalacza dla tylko raz
aby odr贸偶ni膰 w wyzwalaczach wierszowych stare i nowe warto艣ci w wierszu u偶ywa si臋 specjalnych oznacze艅 na wiersz przed zmian膮 i po zmianie:
:OLD <nazwa atrybutu> :NEW <nazwa atrybutu>
PRZYK艁ADY:
1)
CREATE OR REPLACE TRIGGER sprawdz_place
BEFORE INSERT ON pracownik
FOR EACH ROW
BEGIN
IF :NEW.placa_pod<1500
THEN
RAISE_APPLICATION_ERROR
(-20020,'Placa podstawowa jest zbyt niska');
ENDIF;
END;
2)
CREATE TRIGGER sprawdzenie_wynagrodze艅
BEFORE INSERT OR UPDATE OF placa_pod, etat
FOR EACH ROW
DECLARE
Minimum NUMBER;
Maksimum NUMBER;
BEGIN
SELECT gorne, dolne INTO Minimum, Maksimum
FROM etaty WHERE etat=:NEW.etat;
IF :NEW.placa_pod<Minimum
THEN
RAISE_APPLICATION_ERROR
(-20020,'Wynagrodzenie'|| :NEW.placa_pod ||' spoza zakresu');
ENDIF;
END;
Cia艂o wyzwalacza, kt贸ry mo偶e by膰 uruchamiany przez wi臋cej ni偶 jedno polecenie DMI, mo偶e zawiera膰 systemowe zmienne logiczne: inserting, deleting, i updating 艣wiadcz膮ce o rodzaju instrukcji, kt贸re uruchamia dany wyzwalacz.
PRZYK艁AD
1)
CREATE TRIGGER bud偶et_zespolu
AFTER DELETE OR INSERT OR UPDATE
FOR EACH ROW
BEGIN
IF deleting OR (updating AND:OLD.id_zesp<>:NEW.id_zesp)
THEN
UPDATE bud偶et
SET fundusz_plac=fundusz_plac- :OLD.wynagrodzenie
WHERE nr_zesp=:OLD.id_zesp;
ENDIF;
IF inserting OR(updating AND:OLD.id_zesp<>:NEW.id_zesp)
THEN
UPDATE bud偶et
SET fundusz_plac=fundusz_plac+ :NEW.wynagrodzenie
WHERE nr_zesp=:NEW.id_zesp;
END IF;
IF updating AND(:OLD.id_zesp=:NEW.id_zesp) AND
(:OLD.wynagrodzenie<>NEW.wynagrodzenie)
THEN
UPDATE bud偶et
SET fundusz_plac=fundusz_plac- :OLD.wynagrodzenie+NEW.wynagrodzenie
WHERE nr_zesp=:OLD.id_zesp;
ENDIF;
END;
2)
CREATE TRIGGER rejestr
AFTER UPDATE OF
etat, szef, placa_pod, placa_dod,id_zesp
OR DELETE ON pracownik
FOR EACH ROW
BRGIN
IF updating
THEN
INSERT INTO rejestr_prac VALUES(
:OLD.numer, :OLD.nazwisko, :OLD.etat, :OLD.szef, :OLD.pracuje_od, :OLD.placa_pod, :OLD.placa_dod, :OLD.id_zesp, user, sysdate, `DELETE');
ENDIF;
END;
W艁膭CZENIE/WY艁膭CZENIE WYZWALACZA
Wyzwalacz mo偶e by膰 w艂膮czony i wy艂膮czony za pomoc膮 instrukcji:
ALTER TRIGGER <nazwa wyzwalacza> ENABLE/DISABLE
WYZWALACZ MO呕NA USUN膭膯
DROP TRIGGER <nazwa wyzwalacza>
U偶ywaj膮c dotychczas wprowadzonych konstrukcji j臋zyka PL/SQL nie by艂o mo偶liwe przegl膮danie kolejno wszystkich wierszy b臋d膮cych wynikiem zapytania. Do tego celu zosta艂 powo艂any obiekt o nazwie KURSOR, kt贸ry stanowi bufor (obszar roboczy). Przed u偶yciem kursora nale偶y go najpierw zadeklarowa膰 poleceniem w postaci:
DECLARE CURSOR <nazwa kursora> IS SELECT ... FROM … WHERE…;
Na zadeklarowanym kursorze mo偶na wykona膰 operacje jego otwarcia, pobrania warto艣ci I zamkni臋cia.
Kursor otwieramy poleceniem OPEN, kt贸re powoduje przydzielenie niezb臋dnego obszaru pami臋ci.
Do pobrania krotki wskazanej przez kursor stosuje si臋 polecenie FETCH.
Kursor, kt贸ry nie b臋dzie wi臋cej wykorzystywany w programie powinien zosta膰 zamkni臋ty poleceniem CLOSE.
Z ka偶dym kursorem s膮 zwi膮zane cztery atrybuty, w kt贸rych jest przechowywana informacja o przebiegu informacji wykorzystywanych przez kursor
Kursor %FOUND
Kursor %NOT FOUND
Kursor %ROWCOUNT
Kursor %IS OPEN
W 13, 14
1.
BEGIN
DECLARE
CURSOR pracownik_kursor IS
SELECT numer, placa_pod, pracuje_od, pracownik.id_zesp
FROM pracownik, zespol
WHERE pracownik.id_zesp = zespol.id_zesp
AND nazwa = 'BAZY DANYCH';
pracownik_dane pracownik_kursor % ROWTYPE;
BEGIN
OPEN pracownik_kursor;
LOOP
FETCH pracownik_kursor INTO pracownik_dane;
EXIT WHEN pracownik_kursor % NOT FOUND;
IF pracownik_dane.pracuje_od < `80/01/01'
THEN
UPDATE pracownik SET placa_pod = placa_pod*1.3
WHERE numer = pracownik_dane.numer;
ELSE IF pracownik_dane.pracuje_od > `80/12/31'
AND pracownik_dane.pracuje_od < `86/01/01'
THEN
UPDATE pracownik SET placa_pod = placa_pod*1.2
WHERE numer = pracownik_dane.numer;
ELSE
UPDATE pracownik SET
placa_pod = placa_pod*1.5
WHERE numer = pracownik_dane.numer;
END IF;
END LOOP;
COMMIT;
CLOSE pracownik_kursor;
END;
END;
2.
BEGIN
DECLARE
CURSOR pracownik_kursor (id_zespolu NUMBER) IS
SELECT numer, nazwisko, placa_pod
FROM pracownik p
WHERE p. id_zesp = id_zespolu
AND 3 >
SELECT COUNT (DISTINCT placa_pod
FROM pracownik
WHERE id_zesp = p. id_zesp
AND placa_pod <= p.placa_pod);
pracownik_rekord.pracownik_kursor % ROWTYPE;
BEGIN
FOR pracownik_rekord IN pracownik_kursor (20)
LOOP
UPDATE pracownik SET placa_pod = placa_pod*1.05
WHERE numer = pracownik_rekord.numer;
END LOOP;
COMMIT;
END;
END;
3.
BEGIN
DECLARE
CURSOR pracownik_kursor IS
SELECT numer, placa_pod+NVL(placa_dod,0), id_zesp
FROM pracownik ORDER BY id_zesp;
p_placa NUMHER(8);
p_numer NUMBER(4);
p_id_zesp NUMBER(4)
srednia NUMBER(8);
BEGIN
OPEN pracownik_kursor;
FETCH pracownik_kursor INTO p_numer, p_placa, p_id_zesp;
WHILE pracownik_kursor % FOUND
LOOP
SELECT AVG(placa_pod+NVL(placa_dod,0))
INTO srednia FROM pracownik
WHERE id_zesp = p_id_zesp;
IF p_placa < srednia
THEN
UPDATE pracownik SET placa_dod =
NVL(placa_dod,0) + placa_pod*0.2
WHERE numer = p_numer;
ELSE
UPDATE pracownik SET placa_dod =
NVL(placa_dod,0) + placa_pod*0.1
WHERE numer = p_numer;
END IF;
FETCH pracownik_kursor INTO
p_numer, p_placa, p_id_zesp;
END LOOP;
CLOSE pracownik_kursor;
END;
END;
4.
CREATE OR REPLACE FUNCTION
podaj_stan_zespolu (liczba IN NUMBER)
RETURN NUMBER
IS
wartosc NUMBER;
BEGIN
SELECT COUNT(*) INTO wartosc
FROM pracownik WHERE id_zesp = liczba;
RETURN wartosc;
END;
5.
CREATE OR REPLACE PROCEDURE
nowy_pracownik
(nazwisko_pracownika IN CHAR, nazwisko_szefa IN CHAR,
nazwa_zespolu IN CHAR,
etat IN CHAR DEFAULT `STAZYSTA',
pensja IN NUMBER DEFAULT 900)
IS
nr_szefa NUMBER(6);
nr_zespolu NUMBER(6);
BEGIN
SELECT id_zesp INTO nr_zespolu FROM zespol
WHERE nazwa = nazwa_zespolu;
SELECT numer INTO nr_szefa FROM pracownik
WHERE nazwisko = nazwisko_szefa
AND id_zesp = nr_zespolu;
INSERT INTO pracownik VALUES
(seq_pracownik.NEXTVAL, nazwisko_pracownika,
etat, nr_szefa, SYSDATE, pensja, NULL, nr_zespolu);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
RAISE_APPLICATION_ERROR
(-20000,'Nie znaleziono takiego szefa lub zespolu');
END;
6.
CREATE OR REPLACE PROCEDURE
podwyzka(nazw IN CHAR, podwyzka IN NUMBER)
IS
pensja_min NUMBER(8);
pensja_max NUMBER(8);
pensja NUMBER(8);
zbyt_wysoka_pensja EXCEPTION;
BEGIN
SELECT placa_min, placa_max INTO pensja_min, pensja_max
FROM etat WHERE etat =
SELECT etat FROM pracownik
WHERE nazwisko = nazw);
SELECT placa_pod INTO pensja FROM pracownik
WHERE nazwisko = nazw;
IF ((pensja + podwyzka) BETWEEN pensja_min
AND pensja_max)
THEN
UPDATE pracownik SET
placa_pod = placa_pod + podwyzka
WHERE nazwisko = nazw;
ELSE
RAISE zbyt_wysoka_pensja;
END IF;
EXCEPTION
WHEN zbyt_ wysoka_pensja
THEN
DBMS_OUTPUT.PUT_LINE
(`Pensja pracownika jest wieksza ni偶
pensja dozwolona na tym stanowisku');
NULL;
END;
Obiektowo艣膰
R贸偶nica mi臋dzy obiektem a baz膮 danych: obiekt bywa ulotny a baza ma przechowywa膰 informacje w spos贸b trwa艂y.
Obiektow膮 baz膮 danych jest:
- zbi贸r obiekt贸w, ich stan, zachowanie si臋 i zwi膮zki wyst臋puj膮ce mi臋dzy nimi, okre艣lone zgodnie z obiektowym modelem
danych
- sk艂ady trwa艂ych obiekt贸w
- jest to system, kt贸ry umo偶liwia zarz膮dzanie baz膮 danych, zorientowany obiektowo
- jest to system, kt贸ry dziedziczy wszystkie zasadnicze cechy technologii obiektowej i baz danych.
Obiektowy model danych
Model danych, w kt贸rym wykorzystano cechy obiektowo艣ci: poj臋cie klasy i obiekt贸w klasy, enkapsulacja, mechanizm identyfikacji obiekt贸w, dziedziczenie, przeci膮偶anie funkcji.
UML - zunifikowany j臋zyk do modelowania, zawieraj膮cy poj臋cia i notacje s艂u偶膮ce do obiektowej analizy, modelowania
i projektowania. Jest lansowany jako standard notacyjny.
W notacji UML definiowane s膮 nast臋puj膮ce diagramy :
- diagram przypadk贸w u偶ycia
- diagram klas - odmiana klasycznych diagram贸w encja-zwi膮zek
- diagramy odwzorowuj膮ce dynamiczne w艂asno艣ci systemu:
diagram stan贸w
diagram aktywno艣ci
- diagramy implementacyjne, w tym:
diagram komponent贸w
diagram rozprzestrzeniania
ODL
1 : 1
1 : n
m : n
dziedziczy z
ODMG (Object Database Management Group) organizacja skupiaj膮ca firmy tworz膮ce obiektowe bazy danych; tworzy standardy takich baz. Elementami takiego standardu s膮 : ODL (Object Definion Language), OQL (Object Query Language) oraz tzw. wi膮zania do trzech j臋zyk贸w programowania : C++, Smalltalk, Java.
Zadaniem wi膮za艅 jest udost臋pnienie baz danych z poziomu danego j臋zyka programowania. To w艂a艣nie wi膮zania definiuj膮 DML (j臋zyk manipulowania danymi).
Hurtownie danych (magazyn danych)
- jest scentralizowan膮 b.d.
- jest oddzielona od baz operacyjnych
- scala informacj臋 z wielu 藕r贸de艂
- jest zorientowana tematycznie
- przechowuje dane historyczne
- utrzymuje wielk膮 ilo艣膰 informacji
- agreguje informacj臋
Hurtownie zawsze maj膮 tendencj臋 rozrastania si臋.
W hurtowniach danych przechowuje si臋 dane r贸偶nych rodzaj贸w :
- elementarne (kopie aktualnych danych 藕r贸d艂owych pozyskanych z baz operacyjnych)
- zmaterializowane agregaty (wyliczone warto艣ci sum, 艣rednich w r贸偶nych przekrojach)
- metadane.
Baza operacyjna - dane zmieniaj膮 si臋 cz臋sto, jest wielu u偶ytkownik贸w, uczestnicz膮 kr贸tkie transakcje.
Cykl 偶ycia hurtowni to :
- 艂adowanie i scalanie
- agregacja
- przeniesienie do danych historycznych
- usuwanie (rzadko albo nigdy).
Wykorzystanie hurtowni danych :
Korzystaj膮 z nich g艂贸wnie analitycy i menad偶erowie - u偶ytkownicy system贸w wspomagania decyzji.
Systemy takie wykonuj膮 r贸偶nego rodzaju analizy :
- przetwarzanie analityczne OLAP (On-line Analitical Proccessing)
- eksploracja danych (data mining) czyli automatyczne pozyskiwanie wiedzy z baz danych.
Analiza wielowymiarowa i dane wielowymiarowe.
Struktura wielowym. przedstawia elementarne kom贸rki danych, tzw. fakty, w funkcji wielu niezale偶nych czynnik贸w, zwanych wymiarami.
Typowe wymiary to np.:
- czas (np. w dniach, m-cach, kwarta艂ach, latach)
- produkt (np. typ i rodzaj)
- jednostka organizacyjna (np. wydzia艂, filia) lub terytorialna (gmina, miasto, wojew贸dztwo).
Fakty s膮 opisane atrybutami liczbowymi, tzw. miarami. Najbardziej typowym faktem jest wielko艣膰 sprzeda偶y, kt贸rej miarami s膮 np. ilo艣膰 sprzedanego towaru i jego warto艣膰.