Bazy趎ych1


Wyk艂ad 1

Baza danych

Dane

Z jakimi rodzajami danych si臋 spotykamy:

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

metadane - dane o danych (dane na temat danych)

Model danych

Poj臋cie niezbyt jednoznaczne, kt贸rego znaczenie jest wypadkow膮 takich cech:

Model danych z punktu widzenia architektury systemu baz danych obejmuje :

Mo偶na wyr贸偶ni膰 trzy g艂贸wne typy:

BAZA DANYCH

w zale偶no艣ci od przyj臋tego punktu widzenia mo偶e by膰 traktowana, co najmniej jako:

W艁ASNO艢CI BAZY DANYCH:

SYSTEM ZARZ膭DZANIA BAZ膭 DANYCH

(database management system DBMS)

system oprogramowania zawieraj膮cy w szczeg贸lno艣ci nast臋puj膮ce mechanizmy:

0x08 graphic

ZESTAW NARZ臉DZI

0x08 graphic

INTERFEJ U呕YTKOWNIKA

0x08 graphic

J膭DRO SYSTEMU

0x08 graphic

BAZA DANYCH

PROCES TWORZENIA BAZY DANYCH:

MODEL ENCJA-ZWI膭ZEK

Zaliczany do modeli poj臋ciowych; j臋zyk wizualnych diagram贸w

J臉ZYK ZAPYTA艃

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艅 =, <, >, <=, >=, <> (!=)

Relacyjne bazy danych

J臋zyk zapyta艅 SQL pochodzi od teorii relacji.

RELACJA to specyficzny rodzaj tablicy, kt贸ra:

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:

  1. We藕 relacj臋 podan膮 w klauzuli FROM.

  2. 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).

  3. Do ka偶dej pozostaj膮cej krotki oblicz warto艣ci wyra偶e艅 na li艣cie SELECT.

  4. Je艣li po s艂owie SELECT wyst臋puje LISTINCT, usu艅 duplikaty w艣r贸d wynikowych krotek.

  5. 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.

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'));

  1. 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);

  1. 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);

  1. 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);

  1. 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

  1. 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;

  1. 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;

  1. 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:

  1. 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).

  1. SELECT nazwisko FROM pracownik p

WHERE 1 < (SELECT COUNT (*)

FROM pracownik

WHERE nazwisko = p. nazwisko );

(tylko te nazwiska, kt贸re si臋 powtarzaj膮)

  1. SELECT nazwisko, placa_pod FROM pracownik p

WHERE 1 >=

(SELECT COUNT (DISTINCT placa_pod)

FROM pracownik

WHERE placa_pod > p. placa_pod);

  1. SELECT nazwisko, id_zesp FROM pracownik p

WHERE EXISTS (SELECT numer FROM pracownik

WHERE pracownik .szef = p. numer);

  1. SELECT numer, nazwisko, etat FROM pracownik p

WHERE NOT EXISTS

(SELECT numer FROM pracownik

WHERE etat = p .etat AND numer != p. numer);

  1. 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:

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];

UNIQUE, PRIMARY KEY lub ALL TRIGGERS

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>];

  1. INSERT INTO zajecia

VALUES(5,'LABORATORIUM',10,12);

  1. INSERT INTO pracownik SELECT * FROM pracownik@zgoda.bytom.pl;

(wstaw do tabeli pracownik wynik zapytania)

  1. UPDATE pracownik SET

Placa_pod=(SELECT placa_pod FROM dodatki d WHERE numer IN(SELECT numer FROM dodatki);

  1. 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]

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!!!

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

informacje o wszystkich obiektach, kt贸rych danych u偶ytkownik jest w艂a艣cicielem

np.: User_Table, User_Object

dotyczy wszystkich obiekt贸w, do kt贸rych u偶ytkownik ma uprawnienia

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:

Ka偶da transakcja powinna mie膰 w艂a艣ciwo艣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:

Serializowane transakcje

BOKADY

Blokady (zamki):

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:

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艅:

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 !!!

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!

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:

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>

UPDAE OF <nazwa atrybutu>

: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',

0x08 graphic
pensja IN NUMBER DEFAULT 900)

IS

0x08 graphic
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

0x08 graphic
1 : 1

0x08 graphic
1 : n

0x08 graphic
0x08 graphic
m : n

0x08 graphic
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艣膰.



Wyszukiwarka