Baza danych - zbiór powiązanych ze sobą logicznie danych, zorganizowany zgodnie z określonym modelem danych.
System baz danych - wiele baz danych zarządzanych przez jeden system komputerowy.
Składniki systemu baz danych:
System baz danych = Trwała pamięć zewnętrzna + System Zarządzania Bazami Danych (DBMS) + Język zapytań
Trwała pamięć zewnętrzna - urządzenia sprzętowe przechowujące dane.
System Zarządzania Bazami Danych (Data Base Management System) - oprogramowanie zarządzające dostępem do baz danych.
Język zapytań - język wysokiego poziomu, za pomocą którego użytkownik komunikuje się z bazą danych.
Środki służące zwiększeniu niezawodności pamięci zewnętrznej:
dublowanie urządzeń pamięci zewnętrznej
kontrola poprawności zapisu
kody detekcji/korekcji błędów
Funkcje DBMS:
realizacja operacji dostępu do danych na poziomie fizycznym
zapewnienie integralności danych
obsługa współbieżności
ochrona danych
odtwarzanie po awariach
śledzenie operacji dokonywanych na bazie danych
obsługa rozproszenia
obsługa przetwarzania równoległego
Język zapytań = Język definiowania danych (DDL) + Język manipulowania danymi (DML) + Język kontrolowania danych (DCL)
Administrator bazy danych (DBA) - osoba sprawująca kontrolę nad dostępem do bazy danych i nad jej funkcjonowaniem
Zadania DBA:
udzielanie użytkownikom uprawnień dostępu do bazy danych
monitorowanie wydajności bazy danych
definiowanie strategii archiwizowania i odtwarzania danych po awariach
uruchamianie nowych strategii dostępu do danych
Narzędzia do dyspozycji DBA:
program do ładowania bazy danych z plików zewnętrznych
programy do archiwizacji danych
programy do przywracania danych z archiwum
programy do zbierania statystyk i ich analizowania
procedury definiowania użytkowników
programy do operowania na słowniku danych
programy do analizowania dziennika bazy danych
Słownik danych - specjalna baza danych zawierająca informacje o danych przechowywanych w innych bazach danych
Zawartość słownika danych:
opisy struktury obiektów bazy danych
opisy użytkowników
definicje formatów danych stosowanych w bazie danych
dane statystyczne o wartościach danych w bazie danych
Dostęp do słownika danych:
zwykły użytkownik ma prawa tylko do odczytu i to tylko pewnych fragmentów słownika
DBA może mieć pełniejszy dostęp do słownika, jednak jego modyfikowanie może wykonywać tylko poprzez procedury systemowe
DBMS ma pełen dostęp do słownika
Architektura systemu baz danych:
Poziom zewnętrzny (użytkownik)
zbiór zewnętrznych widoków, poprzez które użytkownicy widzą zawartość bazy danych. Widok jest wyabstrahowanym fragmentem bazy danych, zdefiniowanym w terminach języka zapytań
Poziom logiczny (modelu danych)
Zawiera model konceptualny bazy. Model ten obejmuje całą zawartość bazy, tak jak ją widzi administrator lub właściciel bazy
Poziom wewnętrzny (fizyczny)
Fizyczna reprezentacja bazy w postaci plików dyskowych i algorytmów dostępu do nich. Jest to reprezentacja niskiego poziomu.
Program jest zależny od danych jeżeli wiedza na temat struktury danych i metod dostępu do nich jest wbudowana w program. Tzn. nie jest możliwa zmiana:
struktur danych, czyli sposobu przechowywania danych
metod dostępu do danych
bez zmian w programie.
Niezależność programu od danych oznacza sytuację odwrotną.
Korzyści:
można wprowadzać nowe urządzenia pamięciowe,
można wprowadzać nowe struktury danych na dysku i nowe metody dostępu
można zmieniać fizyczną reprezentację danych
bez konieczności dokonywania zmian w kodzie aplikacji bazodanowych.
Przetwarzanie transakcyjne:
Transakcja przeprowadza bazę danych z jednego stanu spójnego do innego. Po drodze mogą wystąpić stany niespójne.
Przetwarzanie transakcyjne gwarantuje, że baza nie pozostanie w stanie spójnym mimo przerwania transakcji.
Encja - pojęcie bazowe (niedefiniowalne). Podstawową cechą encji jest to, że jest rozróżnialna od innych encji.
Każda encja jest inna. W celu uproszczenia świata rzeczywistego, grupujemy (klasyfikujemy) podobne encje w zbiory encji (stosujemy zasadę abstrakcji).
Zbiór encji - grupa podobnych do siebie (wg określonych kryteriów) encji.
Encje w zbiorze encji są rozróżniane przez wartości atrybutów.
Własności atrybutów zbioru encji:
liczba atrybutów jest ustalona (≥1)
typy atrybutów są proste (wartości są niepodzielne, czyli atomowe)
nazwy atrybutów są różne (jednoznaczne)
Klucz zbioru encji.
Własności klucza zbioru encji:
jednoznaczność:
Nie istnieją takie 2 encje w zbiorze, które mają takie same wartości atrybutów kluczowych. Innymi słowy: wartość klucza jednoznacznie identyfikuje encję.
minimalność (dot. Kluczy złożonych):
Nie można z klucza usunąć żadnego atrybutu bez naruszenia wymogu jednoznaczności. Innymi słowy: każda składowa klucza złożonego jest potrzebna.
Związek REL pomiędzy zbiorami encji E1, E2,..., En jest to zbiór krotek n-elementowych (e1,e2,..., en) takich, że e1є E1, e2 є E2, ..., en є En.
Każdy związek stopnia n > 2 można zanienić na n związków binarnych.
Jeśli klucz encji reprezentującej związek staje się długi (wieloczłonowy), warto rozważyć zastąpienie go kluczem prostym typu identyfikator.
Zbiory encji pozostające w związku nie muszą być różne.
Pomiędzy tymi samymi zbiorami encji może zachodzić kilka różnych związków.
Związek IS_A (E1, E2) oznacza, że każda encja ze zbioru E1 jest także encją ze zbioru E2.
Innymi słowy, zbiór encji E1 jest podzbiorem zbioru encji E2.
Związek IS_A jest związkiem wbudowanym w model związków encji (ERM), typu 0..1:1
Każda encja e є E1 ma wszystkie atrybuty encji ze zbioru E2 i atrybuty dodatkowe, nie istniejące w zbiorze E2.
Relacja (bazodanowa) - dowolny podzbiór produktu kartezjańskiego skończonej liczby dziedzin prostych.
Dziedzina jest prosta, jeżeli jej elementy są nierozkładalne (atomowe).
Niech D1, D2, ..., Dn są to dziedziny proste, 0<n<∞.
D1 х D2 х ... х Dn - produkt kartezjański tych dziedzin prostych: zbiór wszystkich krotek (d1, d2, ... dn) takich, że d1 є D1, d2 є D2, ..., dn є Dn.
Liczba n to stopień relacji.
Poszczególne pozycje krotek relacji nazywamy atrybutami relacji.
Relację reprezentujemy w postaci tabeli, w której każdy wiersz odpowiada jednej krotce, a każda kolumna jednemu atrybutowi.
Nazwa kolumny jest nazwą atrybutu. Nazwy atrybutów nie mogą się powtarzać.
Tablica jest tylko wygodną reprezentacją, a nie relacją.
Własności relacji:
w relacji nie ma dwóch identycznych krotek, ponieważ relacja jest matematycznym zbiorem,
krotki nie są uporządkowane, ponieważ relacja jest matematycznym zbiorem,
wartości atrybutów są atomowe.
Klucz relacji (klucz kandydujący) - atrybut (lub zbiór atrybutów) relacji spełniający warunki: jednoznaczności i minimalności.
Każda relacja ma klucz główny.
Klucze relacji - warunki:
integralność encji — żaden atrybut wchodzący w skład klucza głównego relacji nie może przyjmować wartości pustych (NULL),
integralność referencyjna — jeśli relacja R2 zawiera klucz obcy FK odpowiadający kluczowi głównemu PK pewnej relacji R1, wówczas każda wartość FK:
albo być równa wartości PK w pewnej krotce R1,
albo musi być cała równa NULL
Reprezentacja zbiorów encji:
Każdy zbiór encji reprezentujemy jako oddzielną relację o kluczu głównym równym kluczowi głównemu zbioru encji.
Reprezentacja związków pomiędzy zbiorami encji:
Związki „jeden do jeden”
Reprezentujemy przez klucz obcy wstawiony do dowolnej z dwóch relacji.
Związki „jeden do wiele”
Reprezentujemy przez klucz obcy wstawiony do relacji po stronie n związku.
Związki „wiele do wiele”
Reprezentujemy przez oddzielną relację o kluczu będącym złożeniem kluczy głównych związanych zbiorów encji.
Algebra relacji - zestaw operatorów, które mogą być stosowane w stosunku do relacji.
Operatory oznaczone * są prymitywne, tzn. żaden z nich nie może być wyrażony jako kombinacja pozostałych.
Wynikiem każdego operatora algebry relacji jest relacja. Zatem algebra relacji jest domknięta. Umożliwia to budowę dowolnie zagnieżdżonych wyrażeń relacyjnych.
Dwie relacje są zgodne (kompatybilne) jeśli:
mają ten sam stopień n,
i-te atrybuty każdej z nich (i=1, ... n) mają tę samą dziedzinę.
Jak wybrać tylko określone atrybuty relacji?
Do takich celów służy operacja projekcji (PROJECT).
Jak wybrać tylko określone krotki relacji?
Do takich celów służy operacja selekcji (SELECT).
Jak powiązać ze sobą dane z dwóch relacji?
Do takich celów służy operacja złączenia (JOIN).
Złączenie można stosować do kilku tablic.
Złączenia są zwykle składane z projekcją, w przeciwnym razie wynik może mieć bardzo dużą liczbę kolumn.
SQL interakcyjny - instrukcje wprowadzane interakcyjnie, wyniki natychmiast prezentowane użytkownikowi w sposób ustalony przez DBMS (SQL nie zawiera żadnych instrukcji we/wy ani formatujących).
SQL zanurzony - instrukcje są zamieszczone w programie napisanym w innym języku (3GL lub 4GL); wyniki mogą być przekazane do zmiennych programu.
Składniki SQL:
Data Definition Language (DDL) + Data Manipulation Language (DML) + Data Control Language (DCL).
TWORZENIE TABLIC:
Typy danych:
INTEGER, SMALLINT - liczba całkowita (zakres zależy od DBMS)
DECIMAL[(m[,n])], NUMERIC[(m[,n])] - stałoprzecinkowa liczba rzeczywista o m cyfrach znaczących i n cyfrach po przecinku
FLOAT[(m)] - zmiennoprzecinkowa liczba rzeczywista o m cyfrach
REAL - to samo co DECIMAL
DOUBLE PRECISION - to samo co FLOAT
CHARACTER(n) - łańcuch znaków o długości do n znaków (separator: „lub”)
DATE - data
LOGICAL - wartości logiczne: yes/no, false/true
Inne typy danych:
VARCHAR, DATETIME, MONEY, TEXT, IMAGE, BLOB, CLOB ...
Opcje (przykładowe):
NOT NULL [UNIQUE] - w kolumnie musi być wartość, jeśli UNIQUE to unikatowa
[NOT] CASE-SENSITIVE - określa, czy przy porównywaniu wartości w kolumnie znakowej ma być brana pod uwagę wielkość liter
COLUMN-LABEL łańcuch - etykieta (nagłówek) kolumny przy wyświetlaniu tabelarycznym
LABEL łańcuch - etykieta kolumny przy wyświetlaniu swobodnym
FORMAT łańcuch - format wyświetlania wartości kolumny
DEFAULT wartość-początkowa - domyślna wartość kolumny
AUTOINCREMENT - powoduje automatyczne nadawanie wartości kolumny przez system podczas wstawiania nowego wiersza
PRIMARY KEY - określa kolumnę jako klucz główny
REFERENCES [nazwa tablicy] - określa kolumnę jako klucz obcy
Zmiana schematu tablicy:
ALTER TABLE <nazwa tablicy>
{ADD COLUMN <kolumna> <typ danych> [opcje]|
DROP COLUMN <kolumna>|
ALTER COLUMN <kolumna> [opcje] }
Wstawianie danych do tablicy:
INSERT INTO <nazwa tablicy>
[(<lista kolumn>)]
VALUES (<lista wartości>)
SELECT - przegląd:
SELECT [DISTINCT] <lista kolumn/wyrażeń>
FROM <lista tablic>
[ WHERE <warunek>]
[ GROUP BY <lista kolumn>]
[ HAVING <warunek>]
[ UNION <instrukcja SELECT>]
[ ORDER BY <lista kolumn/numerów>]
SELECT - określa, które kolumny z tablic podanych we frazie FROM mają zostać włączone do wyniku (projekcja). Dodatkowo, mogą zostać włączone wyrażenia.
DISTINCT - powoduje wyeliminowanie duplikatów (wierszy powtarzających się).
FROM - określa tablice, na jakich działa instrukcja SELECT. Jeśli jest kilka tablic, dokonywany jest produkt kartezjański tych tablic.
WHERE - określa warunki wyboru wierszy z tablic wymienionych we frazie FROM (selekcja).
GROUP BY - powoduje wiązanie wierszy wynikowych w grupy o jednakowych wartościach we wskazanych kolumnach, a następnie redukowanie tych grup do pojedynczych wierszy.
HAVING - określa warunki wyboru dla wierszy powstałych w wyniku działania frazy GROUP BY.
UNION - oblicza sumę wyników dwóch instrukcji SELECT, eliminując duplikaty (unia).
ORDER BY - porządkuje wiersze wynikowe rosnąco lub malejąco według wartości wskazanych kolumn/wyrażeń
SELECT - zapytania proste:
SELECT [DISTINCT] <lista kolumn/wyrażeń>
FROM <nazwa tablicy>
[WHERE <warunek>]
Zapytanie proste przeprowadza kombinację projekcji i selekcji (jeśli występuje fraza WHERE) w stosunku do jednej tablicy.
Uwaga: <lista kolumn> może przybrać formę * (co oznacza wybór wszystkich kolumn)
Wyrażenia:
Operatory języka SQL występujące w wyrażeniach we frazie SELECT, WHERE i in:
Operatory arytmetyczne:
** ^ - potęgowanie
* / - dzielenie
+ - - dodawanie, odejmowanie
Operatory logiczne:
NOT AND OR
Operatory porównania:
= > < >= <= <>
Operatory specjalne:
IN BETWEEN LIKE MATCHES
Operatory porównania z wartością pustą:
IS NULL IS NOT NULL
Funkcje agregujące:
COUNT() - zwraca liczbę wierszy wybranych w zapytaniu
AVG() - oblicza średnią arytmetyczną w kolumnie numerycznej
SUM() - sumuje wartości kolumn numerycznych
MIN() - znajduje wartość minimalną w kolumnie znakowej, numerycznej lub daty
MAX() - znajduje wartość maksymalną
Operatory specjalne:
IN - sprawdza, czy wartość w kolumnie jest równa jednej z wartości określonej na liście wartości lub będących wynikiem instrukcji SELECT.
BETWEEN - sprawdza, czy wartość w kolumnie jest zawarta w przedziale wartości.
LIKE - porównuje zawartość kolumny znakowej z łańcuchem znaków, który może zawierać symbole wieloznaczne (wildcards). Łańcuch ze znakami wieloznacznymi to wzorzec.
Symbole wieloznaczne:
_ (podkreślenie) - pasuje do dowolnego pojedynczego znaku,
% (procent) - pasuje do dowolnej liczby dowolnych znaków.
CONTAINS - sprawdza, czy wartość w kolumnie znakowej zawiera wskazany łańcuch.
Funkcje agregujące:
COUNT()
COUNT(*) - zwraca liczbę wierszy w tablicy wynikowej
COUNT(DISTINCT <nazwa kolumny>) - zwraca liczbę różnych wartości we wskazanej kolumnie.
SUM([DISTINCT] <nazwa kolumny>)
MIN([DISTINCT] <nazwa kolumny>)
MAX([DISTINCT] <nazwa kolumny>)
AVG([DISTINCT] <nazwa kolumny>)
Zwracają odpowiednio: sumę, minimum, maksimum i średnią z wartości podanej kolumny. Dla SUM() i AVG() kolumna musi być numeryczna, dla MIN() i MAX() kolumna może być też kolumną znakową lub daty.
SELECT - porządkowanie wyników:
Bez frazy ORDER BY wyniki zapytania ukazują się w porządku nieokreślonym (zwykle w porządku wstawienia ich do tablicy).
ORDER BY <nazwa kolumny/numer> [ASC/DESC]
[,<nazwa kolumny/numer> [ASC/DESC]...]
Uwagi:
Numer kolumny we frazie ORDER BY oznacza pozycję kolumny na liście wyboru instrukcji SELECT. Trzeba go użyć, jeśli porządkujemy wg wartości wyrażenia.
Domyślnie przyjmowany jest porządek rosnący (ASC).
SELECT - grupowanie:
GROUP BY <nazwa kolumny>
[,<nazwa kolumny>...]
[HAVING <warunek>]
Fraza ta powoduje powiązanie ze sobą wierszy wynikowych z instrukcji SELECT w grupy wierszy, w których wskazane we frazie GROUP BY kolumny mają tę samą wartość. Następnie każda grupa jest redukowana do pojedynczego wiersza. W tym wierszu występują kolumny z frazy GROUP BY oraz ew. kolumny będące wynikiem funkcji agregujących. Funkcje te wówczas działają na każdej grupie osobno. Następnie eliminowane są wiersze nie spełniające warunku HAVING.
Uwagi:
Każda kolumna występująca we frazie GROUP BY musi wystąpić na liście wyboru instrukcji SELECT i na odwrót.
W warunku HAVING może wystąpić funkcja agregująca (ale nie w warunku WHERE!).
SELECT - złączenia:
Jeśli fraza FROM zawiera więcej niż jedną tablicę, instrukcja SELECT wykonuje produkt kartezjański (operator TIMES) wskazanych tablic. Jeśli dodatkowo występuje fraza WHERE, wykonywana jest operacja relacyjnego złączenia.
Złączenie tablicy z tą samą tablicą nazywamy samozłączeniem.
Samozłączenie umożliwia wiązanie ze sobą informacji zawartych w różnych wierszach.
Do dokonania samozłączenia konieczne jest zastosowanie aliasów (nazw korelacji).
SELECT - podzapytania:
W podzapytaniu instrukcja SELECT jest zagnieżdżona we frazie WHERE lub HAVING. Zagnieżdżona instrukcja SELECT, zwana zapytaniem wewnętrznym, dostarcza wartości dla warunku WHERE lub HAVING. Instrukcja SELECT zawierająca podzapytanie to zapytanie zewnętrzne.
W warunku WHERE może wystąpić operator EXISTS (predykat). EXISTS zwraca True, jeśli podzapytanie zwraca choć jeden wiersz, a False w przeciwnym wypadku.
Wstawianie danych z innych tablic:
INSERT INTO <nazwa tablicy>
[(<lista kolumn>)]
<instrukcja SELECT>
Cel: wstawienie do jednej tablicy wierszy wybranych z innej tablicy lub innych tablic.
Zachowanie wyników zapytania:
Niektóre DBMS pozwalają na zachowanie wyników instrukcji SELECT w tablicy tymczasowej, przez zastosowanie frazy podobnej do poniższej:
INTO TEMP <nazwa tablicy> (<lista kolumn>)
Tablica tymczasowa jest tworzona przez instrukcję SELECT zgodnie z typami danych umieszczonych na liście wyboru instrukcji SELECT. Tablica taka jest automatycznie kasowana podczas zamykania bazy danych przez bieżącego użytkownika.
Tablica tymczasowa może być używana we frazach FROM następnych instrukcji SELECT. W ten sposób można rozbijać skomplikowane zapytania na kilka etapów.
Niektóre systemy DBMS nie dają możliwości bezpośredniego zachowywania wyników instrukcji SELECT w tablicy tymczasowej. W takich wypadkach należy jawnie utworzyć nową tablicę i zastosować „wsadową” wersję instrukcji INSERT.
Aktualizowanie danych:
UPDATE <nazwa tablicy>
SET <nazwa kolumny> = <wyrażenie>
[,<nazwa kolumny> = <wyrażenie>...]
[WHERE <warunek>]
Cel: zmiana wartości w kolumnach jednego lub wielu wierszy tablicy.
Usuwanie danych:
DELETE FROM <nazwa tablicy>
[WHERE <warunek>]
Cel: usunięcie z tablicy jednego lub wielu wierszy.
SELECT - sumowanie tablic:
<instrukcja SELECT>
UNION
<instrukcja SELECT>
Cel: Realizacja operacji algebry relacji UNION w stosunku do tablic będących wynikiem instrukcji SELECT. Tablice muszą być zgodne.
Uwagi:
Z tablicy wynikowej usuwane są wiersze powtarzające się (duplikaty).
Jeśli nazwy kolumn sumowanych tablic są różne, tablica wynikowa przyjmuje nazwy kolumn z pierwszej tablicy.
Jeśli po UNION występuje fraza ORDER BY, muszą w niej występować numery, a nie nazwy kolumn.
Tworzenie indeksów:
CREATE [UNIQUE] INDEX <nazwa indeksu>
ON <nazwa tablicy> (<nazwa kolumny> [ASC/DESC]
[,<nazwa kolumny> [ASC/DESC]...]};
Cel: tworzy indeks na określonych kolumnach, zwanych kluczami indeksu. Domyślnie indeks jest rosnący (ASC). Fraza UNIQUE oznacza, że kolumny indeksu zawierają wartości niepowtarzalne.
Co to jest indeks?
Jest to tablica zawierająca w jednej kolumnie wartości klucza, a w drugiej adresy wierszy w indeksowanej tablicy, które zawierają te wartości.
Do czego służy?
Pozwala zwiększyć efektywność przetwarzania żądań dostępu do danych z tablicy (instrukcji SELECT).
Porządkuje wiersze tablicy w określonym porządku.
Zapobiega powtarzaniu się wartości w wierszach tablicy.
Kiedy tworzyć indeks?
Gdy tablica jest często przetwarzana sekwencyjnie zgodnie z wartościami pewnej kolumny (rosnąco lub malejąco).
Gdy konieczne jest zachowanie unikatowości wartości kolumn(y).
Gdy dostęp do tablicy jest często realizowany zgodnie z wartościami danej kolumny lub kolumn (dostęp asocjacyjny)
Jaki jest koszt?
Koszt pamięciowy (utrzymywanie dodatkowych danych).
Koszt czasowy (konieczność aktualizacji indeksu podczas aktualizowania tablicy (instrukcje INSERT, UPDATE, DELETE).
Widoki:
widok (wirtualna tablica) - kombinacja wierszy i kolumn wybranych z jednej lub kilku tablic. Po utworzeniu widoku można na nim wykonywać instrukcje SELECT jak na zwykłej tablicy. W bazie danych (w słowniku danych) pamiętana jest jedynie definicja widoku. Widok jest materializowany w razie potrzeby.
Korzyści ze stosowania widoków:
Te same dane mogą być widziane w różny sposób przez różnych użytkowników.
Pozwalają koncentrować się na danych istotnych, a ignorować inne.
Wprowadzają dodatkowy poziom niezależności od danych. Jeśli zmieni się coś w schemacie bazy danych, często wystarczy zmienić definicję widoku, nie zmieniając programu.
Wprowadzają ochronę danych przez ich ukrycie: użytkownicy „widzą” tylko widoki, czyli te dane, do których mają prawo dostępu.
Różnice między widokami a tablicami:
Widoki nie zawierają danych; zawierają tylko informacje, jak zebrać te dane w razie potrzeby (tzn. z jakich tablic, z jakich kolumn i w jaki sposób).
Widoków nie można indeksować (ale można indeksować tablice wchodząc w skład widoku).
W ogólności, nie można aktualizować danych poprzez widok.
Tworzenie widoków:
CREATE VIEW <nazwa widoku>
[<lista kolumn>]
AS <instrukcja SELECT>
[WITH CHECK OPTION]
Cel: utworzenie widoku. Opcjonalna <lista kolumn> określa nazwy kolumn widoku. Jeśli jej nie ma, nazwy kolumn pochodzą z instrukcji SELECT widoku.
WITH CHECK OPTION - gwarantuje, że wszystkie aktualizacje widoku (jeśli widok jest aktualizowany) spełniają warunki występujące we frazie WHERE instrukcji SELECT.
Aktualizowanie widoków:
Widok może nie być aktualizowany. Zależy to od ograniczeń na aktualizowanie widoków nałożonych przez konkretny DBMS
Przykładowe ograniczenia:
instrukcja SELECT nie zawiera fraz DISTINCT, GROUP BY, HAVING,
instrukcja SELECT nie zawiera na liście wyboru wyrażeń ani funkcji agregujących,
we frazie FROM występuje tylko jedna tablica,
we frazie WHERE nie występuje podzapytanie,
na liście kolumn widoku występuje klucz główny tablicy występującej we frazie FROM.
Usuwanie tablic, indeksów i widoków:
DROP TABLE <nazwa tablicy>
Cel: skasowanie istniejącej tablicy. Kasowane są wszystkie dane z tablicy. Kasowane są także wszystkie indeksy i widoki zdefiniowane na tej tablicy.
DROP INDEX <nazwa indeksu>
Cel: skasowanie istniejącego indeksu. Nie wpływa na indeksowaną tablicę.
DROP VIEW <nazwa widoku>
Cel: skasowanie istniejącego widoku. Nie wpływa na tablice występujące w definicji widoku.
Kursory:
Kursor - wskaźnik służący do sekwencyjnego poruszania się po zbiorze wynikowym zapytania. W danym momencie wskazuje na jeden wiersz ze zbioru wynikowego.
Kursory są elementem zanurzonego języka SQL. Umożliwiają:
sekwencyjne przetwarzanie przez program wyników zapytania,
pobieranie wartości kolumn z wierszy pobranych przy użyciu instrukcji SELECT,
przypisywanie zmiennym programowym wartości pobranych z kolumn.
Po ustaleniu pozycji kursora na wierszu można:
uaktualnić wiersz,
usunąć wiersz,
przetworzyć wiersz
Fazy użycia kursora:
1. Deklaracja kursora: DECLARE CURSOR
2. Otwarcie kursora: OPEN
3. Pobranie danych: FETCH
i po zakończeniu operowania kursorem
4. Zamknięcie kursora: CLOSE
DECLARE CURSOR - kojarzy nazwę kursora z instrukcją SELECT
OPEN - wybiera wszystkie wiersze, które spełniają warunki instrukcji DECLARE CURSOR, po czym ustawia kursor na pozycję przed pierwszym wierszem.
FETCH - pobiera kolejny wiersz i przypisuje wartości z kolumn do zmiennych programowych. Ustawia kursor na pozycji przed następnym wierszem lub, jeśli nie ma następnego wiersza, po ostatnim wierszu.
UPDATE (pozycyjna) - modyfikuje wiersz, na który wskazuje kursor.
DELETE (pozycyjna) - usuwa wiersz, na który wskazuje kursor.
CLOSE - zamyka kursor.
DECLARE <nazwa kursora> CURSOR FOR <instrukcja SELECT>
[FOR{READ [ONLY]|UPDATE}]
nazwa kursora - określa nazwę nowego kursora,
instrukcja SELECT - określa zbiór wierszy, który będzie dostępny po otwarciu kursora,
FOR READ [ONLY] - określa, że wiersze pobierane przez kursor, nie mogą być modyfikowane,
FOR UPDATE - określa, że wiersze pobierane przez kursor mogą być modyfikowane (o ile instrukcja SELECT nie zawiera UNION).
OPEN <nazwa kursora>
CLOSE <nazwa kursora>
nazwa kursora - nazwa otwartego kursora
Uwaga: Po ponownym otwarciu kursora system pobiera od nowa wynikowy zbiór wierszy, który może różnić się od zbioru poprzedniego.
FETCH <nazwa kursora> INTO <lista zmiennych>
lista zmiennych - lista zmiennych programowych, do których są przekazywane wartości kolumn.
DELETE FROM <nazwa tablicy>
WHERE CURRENT OF <nazwa kursora>
UPDATE <nazwa tablicy>
SET <nazwa kolumny> = {NULL | <wyrażenie>}
[,<nazwa kolumny> = {NULL | <wyrażenie>}]...
WHERE CURRENT OF <nazwa kursora>
Fraza WHERE CURRENT OF nazwa kursora identyfikuje kursor wskazujący na wiersz, który ma zostać usunięty lub zaktualizowany.
Relacyjna zupełność SQL:
Język zapytań jest relacyjnie zupełny, jeśli dla dowolnego wyrażenia algebry relacji istnieje równoważne mu wyrażenie tego języka.
SQL jest relacyjnie zupełny.
Normalizacja relacyjnych baz danych:
Redundancja danych
Druga postać normalna (2NF)
Trzecia postać normalna (3NF)
Czwarta postać normalna (4NF)
Normalizacja - przegląd:
Tablica PARTICIPANTS wykazuje wiele niepożądanych cech wynikających z redundacji (wiele danych jest powtórzonych).
Celem normalizacji jest usunięcie redundancji tak, by jedna informacja była przechowywana w bazie danych tylko jeden raz.
Zależności funkcjonalne:
Atrybut Y zależy funkcjonalnie od atrybutu X (oznaczenie X -> Y) w każdym momencie dla każdej wartości X istnieje dokładnie jedna wartość Y.
Innymi słowy, jeśli istnieją w R dwie krotki z tą samą wartością X, to mają też tę samą wartość Y.
Druga postać normalna:
Atrybut Y zależy w pełni funkcjonalnie od atrybutu X Y zależy funkcjonalnie od X i nie zależy funkcjonalnie od żadnego podzbioru właściwego X.
Relacja jest w drugiej postaci normalnej (2NF)
jest w 1NF
każdy atrybut niekluczowy zależy w pełni funkcjonalnie od klucza głównego.
Trzecia postać normalna:
Zależność funkcjonalna X -> Y jest przechodnia istnieje atrybut Z (Z ≠ X, Z ≠ Y) taki, że X ->Z i Z ->Y.
Relacja jest w trzeciej postaci normalnej (3NF)
jest w 2NF
żaden atrybut niekluczowy nie zależy przechodnio od klucza głównego.
Postać normalna Boyce'a-Codda:
relacja jest w postaci normalnej Boyce'a-Codda (BCNF) każdy wyznacznik jest kluczem kandydującym.
Czwarta postać normalna:
Relacja jest w czwartej postaci normalnej (4NF)
jest w 3NF
nie zawiera dwóch lub więcej zależności wielowartościowych
Zależności wielowartościowe:
Pomiędzy atrybutami X i Y zachodzi zależność wielowartościowa (X ->-> Y) dla każdej wartości X istnieje zbiór możliwych wartości Y i ten zbiór nie zależy od Z.
Normalizacja - podsumowanie:
Dobrze zaprojektowana relacja składa się z klucza głównego (prostego lub złożonego) i z pewnej liczby niezależnych od siebie atrybutów. Każdy atrybut zależy tylko od całego klucza głównego.
2NF dotyczy relacji ze złożonym kluczem głównym. Wymaga by żaden atrybut niekluczowy nie zależał od części klucza głównego.
3NF wymaga by każdy atrybut niekluczowy zależał tylko od klucza głównego.
4NF dotyczy relacji ze złożonym kluczem głównym. Wymaga by relacja zawierała co najwyżej jedną zależność wielowartościową.
W każdym wypadku sprowadzenie do danej postaci normalnej wymaga dekompozycji relacji na kilka innych relacji drogą projekcji.