Bazy danych-podstawy





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

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] , / [[AS>], ...
FROM , , ...
[WHERE ]
[GROUP BY / [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.
• 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
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 [WHERE ]

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 []

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 WITH

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 WITH

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:
JOINWITHON
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.
UNION

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

RÓŻNICA
DIFFERENCE
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 FROM
[WHERE ]
OPERATOR
SELECT FROM
[WHERE ]
[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 FROM
WHERE

(SELECT FROM
[WHERE < nazwa atrybutu / lista atrybutów>

(SELECT FROM
[...]] ))

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

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

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

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

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

3) 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).
2. SELECT nazwisko FROM pracownik p
WHERE 1 < (SELECT COUNT (*)
FROM pracownik
WHERE nazwisko = p. nazwisko );

(tylko te nazwiska, które się powtarzają)
3. SELECT nazwisko, placa_pod FROM pracownik p
WHERE 1 >=
(SELECT COUNT (DISTINCT placa_pod)
FROM pracownik
WHERE placa_pod > p. placa_pod);

4. SELECT nazwisko, id_zesp FROM pracownik p
WHERE EXISTS (SELECT numer FROM pracownik
WHERE pracownik .szef = p. numer);

5. SELECT numer, nazwisko, etat FROM pracownik p
WHERE NOT EXISTS
(SELECT numer FROM pracownik
WHERE etat = p .etat AND numer != p. numer);

6. 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
(
()
[DEFAULT ]
[[CONSTRAINT ]
],
...

()
[DEFAULT ]
[[CONSTRAINT ]
],
...
[[CONSRAINT ]
] );

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.

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’,v’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
CREATE TABLE Zaszeregowania (
Grupa NUMBER(2) PRIMARY KEY ,
Dolne NUMBER(8,2) NOT NULL,
Górne NUMBER(8,2) NOT NULL,
CHECK (Dolne
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
[( [DEFAULT ]
[NULL/ NOT NULL],...)]
AS 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
ADD( ()
[DEFAULT ]
[[CONSTRAINT ]
] );

ZMODYFIKOWANIE ISTNIEJĄCEGO ATRYBUTU

ALTER TABLE
MODIIFY( )
[DEFAULT ]
[NULL/NOT NULL] );

DODANIE OGRANICZENIA INTEGRALNOŚCIOWEGO

ALTER TABLE
ADD [CONSTRAINT ]
;

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 DISABLE/ENABLE

/ CONSTRAINT [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.
Ograniczenia integralnościowe może również zostać usunięte z bazy danych.
ALTER TABLE
DROP /
CONSTRAINT [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 ;

ZMIANA NAZWY RELACJI:
RENAME TO
Usuwanie relacji:
DROP TABLE
[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 SELECT FROM..)
Dopisywanie jednej krotki to postać:
INSERT INTO [(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 [alias] SET [,nazwa atrybutu2]={wyrażenie/podzapytanie}[WHERE ];

USUWANIE KROTEK RELACJI
DELETE FROM [WHERE ];
1) INSERT INTO zajecia
VALUES(5,’LABORATORIUM’,10,12);
2) INSERT INTO pracownik SELECT * FROM pracownik@zgoda.bytom.pl;
(wstaw do tabeli pracownik wynik zapytania)
3) UPDATE pracownik SET
Placa_pod=(SELECT placa_pod FROM dodatki d WHERE numer IN(SELECT numer FROM dodatki);
4) 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)
5) 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 [(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;

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]
[INCREMENT BY]
[START WITH ]
[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
NEXTVAL – generowanie kolejnej wartości
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;

TWORZENIE INDEKSU
CREATE [UNIQUE] INDEX
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 ;

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 THEN

END IF;

IF THEN

ELSE END IF;

IF THEN

ELSIF THEN

END IF;

LOOP

(w tym EXIT lub EXIT WHEN
END LOOP

FOR IN
LOOP

END LOOP

WHILE
LOOP

END LOOP

[DECLARE
zmienne, stałe, wyjątki, procedury, funkcje>]

BEGIN


[EXCEPTION

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

BEFORE/AFTER
ON
[FOR EACHROW]

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

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 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 ENABLE/DISABLE

WYZWALACZ MOŻNA USUNĄĆ
DROP TRIGGER

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 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ść.