poniedziałek, 13 lutego 2012

20. Zapytania hierarchiczne (connect by prior)

19. Statystyki - czym są, jak są liczone

18. Zapytania równoległe

17. Jak znaleźć wiersze z tabelki A, których nie ma w tabelce B

16. Jakie są możliwości audytu?

15. Tabele i widoki systemowe (DUAL, USER_TABLES, USER_SEGMENTS...)

14. Klauzule UNION, MINUS

13. Kiedy stosuje się w złączeniach zewnętrzych klauzule (or pole is null)

12. Wyrażenia typu (case when...) nvl,nvl2

11. Plan zapytań - interpretacje tego planu

10.Operacje na stringach. Np. replace, decode, substr

9. Funkcje konwersji (to_char, to_number...)

8. Funkcje agregujące Np. rollup, Cube...

Wyciągając z bazy dane przy użyciu samej klauzuli GROUP BY nie uzyskamy częściowych podsumowań po poszczególnych poziomach wymiarów. Do wprowadzenia wyników częściowych podsumowań służą operatory ROLLUP i CUBE. Zapytanie:
SELECT Czas.rok, Miejsce.miasto, Towar.kategoria, SUM(Sprzedaż.wartość)AS "W sumie"
FROM Sprzedaż NATURAL JOIN Miejsce NATURAL JOIN Towar NATURAL JOIN Czas
GROUP BY ROLLUP(Czas.Rok, Miejsce.Miasto, Towar.Kategoria);
da wynik w rodzaju (oczywiście używane po stronie klienckiej narzędzie OLAP przedstawi wynik tego zapytania w bardziej czytelny sposób np. za pomocą wykresu):
   ROK MIASTO     KATEGORIA      W sumie
------ ---------- ----------- ----------
1996   Warszawa   Komputery       100000
1996   Warszawa   Telewizory       50000
....
1996   Warszawa       *          1000000
1996   Łódź       Komputery        50000
1996   Łódź       Telewizory       25000
         .....
1996   Łódź            *          250000
         .....
1996     *             *         2000000
1997   Warszawa   Komputery      1500000
         ....
  *       *            *        10000000
Tab. 7.4 Wynik operacji ROLLUP Operator ROLLUP daje wszystkie częściowe podsumowania po poszczególnych wymiarach – w danej kolejności. W wyniku istotna jest kolejność grupowanych kolumn. W szczególności zapytanie:
SELECT e.Deptno, e.EmpNo, SUM(e.Sal) AS Zarobki
FROM Emp e
GROUP BY ROLLUP(e.Deptno, e.EmpNo);
daje wynik:
    DEPTNO      EMPNO    ZAROBKI
---------- ---------- ----------
        10       7782       2450
        10       7839       5000
        10       7934       1300
        10                  8750
        20       7369        800
        20       7566       2975
        20       7788       3000
        20       7876       1100
        20       7902       3000
        20                 10875
        30       7900        950
        30       7499       1600
        30       7521       1250
        30       7654       1250
        30       7698       2850
        30       7844       1500
        30                  9400
                           29025
Tab. 7.5 Wynik operacji ROLLUP Operator ROLLUP daje więc w szczególności możliwość, której brakowało dotychczas w SQL – zwracania w wyniku zarówno szczegółowych wierszy jak ich podsumowań.
Operator CUBE daje nawet więcej niż ROLLUP, bo również wszystkie częściowe podsumowania po poszczególnych wymiarach – we wszystkich możliwych kolejnościach.
Na przykład, gdybyśmy w powyższej instrukcji SELECT zamienili ROLLUP na CUBE, dostalibyśmy oprócz powyższych wierszy również takie wiersze jak:
 *   Warszawa    Komputery    1000000
          ...
 *   Warszawa         *       9000000
          ...
 *       *       Komputery    8000000
          ....
1996     *       Komputery     500000
Tab. 7.6 Wynik operacji CUBE
  Jest też możliwość łączenia zwykłego grupowania z grupowaniem typu ROLLUP i CUBE. Na przykład:
GROUP BY Miejsce.Miasto, ROLLUP(Czas.Rok, Towar.Kategoria)
Źródło: http://edu.pjwstk.edu.pl/wyklady/szb/scb/wyklad7/w7.htm

7. Co to są funkcje analityczne? Np. rank over partition by

Funkcje analityczne to specjalna konstrukcja języka SQL dotycząca operacji statystycznych wykonywanych na wierszach wynikowych zapytania na samym końcu jego realizacji i tylko przed zastosowaniem klauzuli ORDER BY.
Mianowicie, dla każdego wynikowego wiersza zapytania określamy zbiór powiązanych z nim wierszy - nazywany oknem tego wiersza. Definiuje się go za pomocą tzw. klauzuli analitycznej. Rozmiary okien określa się, albo za pomocą liczby wierszy stosując klauzulę ROWS, albo za pomocą przedziałów wartości, takich jak czas, stosując klauzulę RANGE. Zbiór wszystkich wynikowych wierszy można najpierw podzielić na zbiór rozłącznych grup (np. pracownicy pracujący w tym samym departamencie, pracownicy pracujący na tym samym stanowisku), a następnie w ramach jednej grupy określać okno danego wiersza.
Oto składnia funkcji analitycznej:
 
nazwa_funkcji_grupowej(argument,...) OVER (klauzula_analityczna)

gdzie klauzula analityczna może zawierać następujące cztery podklauzule:
  • PARTITION BY wyrażenie, ...  określa podział całego zbioru wynikowego wierszy na grupy; jeśli zostanie opuszczona, cały zbiór wynikowych wierszy stanowi jedną grupę. Wiersze wchodzące w skład okna są zawsze ograniczone (zawarte) do jednej grupy.
  • ORDER BY wyrażenie, ...       określa porządek wierszy w ramach podziału określonego w grupie przez podklauzulę PARTITION BY.
  • ROWS specyfikacja_okna      specyfikuje okno poprzez określenie liczby wierszy;
  • RANGE specyfikacja_okna     specyfikuje okno poprzez określenie zakresu wierszy.
W przypadku gdy nie ma ani ROWS ani RANGE, okno danego wiersza pokrywa się z jego grupą.
Podamy teraz kilka przykładów zastosowań.
Przykład (podklauzula PARTITION)
PARTITION jest podobne do GROUP BY z tym, że wartości podsumowujące są załączane do każdego wiersza w grupie, a nie tylko raz dla całej grupy.
SELECT e.Ename, e.Sal,
       SUM(e.Sal) OVER (PARTITION BY e.Deptno) AS Suma_zarob,
       Round(100*e.Sal/(SUM(e.Sal) OVER (PARTITION BY e.Deptno))) AS
                                                        Proc_zarob
FROM Emp e
ORDER BY e.Deptno, e.Ename;
SUM(e.Sal) OVER (PARTITION BY e.Deptno) jest funkcją analityczną, która sumuje zarobki wszystkich pracowników pracujących w tym samym departamencie.
W tym przypadku okno obliczeniowe dla danego pracownika pokrywa się z grupą określoną przez PARTITION BY - czyli ze zbiorem pracowników pracujących w tym samym departamencie co dany pracownik. Oto wynik:
ENAME             SAL SUMA_ZAROB PROC_ZAROB
---------- ---------- ---------- ----------
CLARK            2450       8750         28
KING             5000       8750         57
MILLER           1300       8750         15
ADAMS            1100      10875         10
FORD             3000      10875         28
JONES            2975      10875         27
SCOTT            3000      10875         28
SMITH             800      10875          7
ALLEN            1600       9400         17
BLAKE            2850       9400         30
JAMES             950       9400         10
MARTIN           1250       9400         13
TURNER           1500       9400         16
WARD             1250       9400         13
Tab. 7.7 Ilustracja działania podklauzuli PARTITION Przykład (podklauzula RANGE)
Rozważmy problem analityczny wyznaczenia dla każdego pracownika, liczby pracowników, których zarobki są co najwyżej 50zł mniejsze lub 150zł większe od zarobków tego pracownika. W tym przypadku okno obliczeniowe dla danego pracownika o zarobkach e.Sal nie zależy od departamentu i obejmuje wszystkich pracowników, których zarobki są w przedziale [e.Sal-50, e.Sal+150]. (Jest określona tylko jedna grupa - zbiór wszystkich wierszy.)
Zauważmy, że co najmniej jedna osoba spełnia ten warunek – pracownik względem którego określamy okno.
SELECT e.Ename, e.Sal,
COUNT(*) OVER (ORDER BY e.Sal RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS Licznik
FROM Emp e;
Oto wynik:
ENAME         SAL LICZNIK
--------- ------- -------
SMITH        800        2
JAMES        950        2
ADAMS       1100        3
WARD        1250        3
MARTIN      1250        3
MILLER      1300        3
TURNER      1500        2
ALLEN       1600        1
CLARK       2450        1
BLAKE       2850        4
JONES       2975        3
SCOTT       3000        3
FORD        3000        3
KING        5000        1
Tab. 7.8 Ilustracja działania podklauzuli RANGE Przykład (podklauzula ROWS)
Dla każdego pracownika podaj numer jego kierownika, datę zatrudnienia, zarobki oraz średnią wartość zarobków pracowników zatrudnionych bezpośrednio przed i po zatrudnieniu tego pracownika (włącznie z tym pracownikiem) wśród pracowników tego kierownika.
SELECT mgr, ename, hiredate, sal,
AVG(sal) OVER (PARTITION BY mgr ORDER BY hiredate
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS ave
FROM Emp;
Oto wynik:
       MGR ENAME      HIREDATE        SAL        AVE
---------- ---------- -------- ---------- ----------
      7566 FORD       81/12/03       3000       3000
      7566 SCOTT      82/12/09       3000       3000
      7698 ALLEN      81/02/20       1600       1425
      7698 WARD       81/02/22       1250       1450
      7698 TURNER     81/09/08       1500       1333,3
      7698 MARTIN     81/09/28       1250       1233,3
      7698 JAMES      81/12/03        950       1100
      7782 MILLER     82/01/23       1300       1300
      7788 ADAMS      83/01/12       1100       1100
      7839 JONES      81/04/02       2975       2912,5
      7839 BLAKE      81/05/01       2850       2758,3
      7839 CLARK      81/06/09       2450       2650
      7902 SMITH      80/12/17        800        800
           KING       81/11/17       5000       5000
Tab. 7.9 Ilustracja działania podklauzuli ROWS
Oracle dostarcza dodatkowych funkcji statystycznych do zastosowania w funkcjach analitycznych. Dwie z nich są pokazane poniżej.
Przykład
Rozważmy problem analityczny wyznaczenia dla każdego pracownika procentowego zaszeregowania jego zarobków w jego departamencie (procentowe zaszeregowanie zarobków danego pracownika określamy jako pr=(i-1)/(n-1), gdzie n>1 jest liczbą pracowników w dziale, a i jest numerem zaszeregowania zarobków danego pracownika wśród zarobków pracowników w jego dziale według wzrastających zarobków).
SELECT e.Deptno, e.Ename, e.Sal,
PERCENT_RANK() OVER (PARTITION BY e.Deptno ORDER BY e.Sal) AS Pr
FROM Emp e;
Oto wynik:
 DEPTNO ENAME       SAL     PR
------- ------- ------- ------
     10 MILLER     1300      0
     10 CLARK      2450     .5
     10 KING       5000      1
     20 SMITH       800      0
     20 ADAMS      1100    .25
     20 JONES      2975     .5
     20 SCOTT      3000    .75
     20 FORD       3000    .75
     30 JAMES       950      0
     30 WARD       1250     .2
     30 MARTIN     1250     .2
     30 TURNER     1500     .6
     30 ALLEN      1600     .8
     30 BLAKE      2850      1
Tab. 7.10  Ilustracja działania funkcji PERCENT_RANK z podklauzulą PARTITIONPrzedstawione dane można użyć do sporządzenia wykresu słupkowego obrazującego zaszeregowania zarobków pracowników w ramach ich działów.
Przykład
Rozważmy problem analityczny wyznaczenia dla każdego sprzedawcy stosunku jego zarobków do sumy zarobków wszystkich sprzedawców.
SELECT e.Ename, e.Sal, RATIO_TO_REPORT(e.Sal) OVER () AS Rr
FROM Emp e
WHERE e.Job = 'SALESMAN';
Oto wynik:
ENAME     SAL          RR
-------- ---- ------------
ALLEN    1600  .285714286
WARD     1250  .223214286
MARTIN   1250  .223214286
TURNER   1500  .267857143
Tab. 7.11 Ilustracja działania funkcji RATIO_TO_REPORT
Jako dodatkową informację podajemy możliwość stosowania algorytmów eksplorujących dane na serwerze bazy danych Oracle.
ODM - Oracle Data Mining
Oracle rozpoczął w wersji 10g wprowadzanie pojęć i algorytmów data-miningowych na razie głównie przy pomocy pakietu DBMS_DATA_MINING (jeszcze nie na poziomie SQL i specjalnych obiektów zapisywanych w bazie danych). Centralne pojęcie to model określający parametry, algorytm data-miningowy i wprowadzone dane uczące.
Dane do analizy – zbiór punktów w przestrzeni wielowymiarowej - są dostarczane w jednej tabeli. Wiersze są nazywane przypadkami (ang. cases). Kolumna ID przypadku dostarcza jednoznacznego identyfikatora np. CUSTOMER ID w tabeli klientów. Kolumny są nazywane atrybutami. Np. model regresji może przewidzieć poziom dochodów klienta (atrybut typu target) w oparciu o datę urodzenia i płeć (atrybuty typu predictors).
Parametry procedury CREATE_MODEL
  • model_name -- nazwa modelu
  • mining_function -- stała reprezentująca rodzaj problemu eksploracji danych np. klasyfikacja, clustering, regresja
  • data_table_name -- nazwa tabeli z danymi „uczącymi” model
  • case_id_column_name
  • target_column_name -- NULL dla modeli deskryptywnych, nie NULL dla modeli predyktywnych
  • settings_table_name -- ustawienia dla funkcji i algorytmu (np. nazwa algorytmu eksploracyjnego)
Procedura APPLY (model)
Stosuje podany model eksploracyjny do podanych danych i generuje wyniki w tabeli, której nazwa jest specyfikowana w APPLY. Operacja APPLY jest też nazywana scoring. Dla modeli predyktywnych, operacja APPLY generuje wynik w kolumnie docelowej. Dla modeli deskryptywnych jak clustering, operacja APPLY przyporządkowuje każdemu przypadkowi prawdopodobieństwo należenia do klastra.
DBMS_DATA_MINING.APPLY
(model_name IN VARCHAR2,
data_table_name IN VARCHAR2,
case_id_column_name IN VARCHAR2,
result_table_name IN VARCHAR2
-- schemat tworzonej przez APPLY tabeli zależy od algorytmu );
 Źródło: http://edu.pjwstk.edu.pl/wyklady/szb/scb/wyklad7/w7.htm
6. Jakie są rodzaje złączeń (hash join,merge join)?

5. W jaki sposób korzysta się z optymalizacji regułowej? Np. /*+use_hash*/

4. Jak działa optymalizator?

3. Rodzaje indeksów, jak działają indeksy, jak są zbudowane, jak są implementowane, z ilu indeksó można naraz korzystać

2. Co to są i jak się tworzy, kasuje, modyfikuje i do czego służą:



1. Partycje (także indeksy na partycjach)
2. Tabele zorganizowane na indeksach
3. Klastry
4. kursory
5. tabele tymczasowe
6. widoki
7. snapshoty
8. przestrzenie tabel
9. sekwencje


1. Co to są postacie normalne (1NF, 2NF,3NF i BCNF)? Do czego służy normalizacja baz danych, czemu ma zapobiegać, czy zawsze się ją stosuje?

 NORMALIZACJA (struktury baz danych)- technika projektowania struktury bazy danych w oparciu o tabele i pola, która pozwala uniknąć problemów związanych z niepotrzebnym powielaniem danych i niemożliwością jednoznacznego identyfikowania rekordów, co ma ogromny wpływ na ograniczenie przestrzeni pamięciowej ale  poprzez mnożenie liczby tabel wydłuża czas dostępu do danych.

Tab. Źródło: http://andrzejklusiewicz.blogspot.com/2010/11/kurs-oracle-sql-podstawowe-definicje.html

PIERWSZA POSTAĆ NORMALNA (1NF) - reguły, które regulują proces tworzenia dobrze zorganizowanej struktury bazy danych.
- organizowanie informacji w kolumny
- określenie typu danych dla każdej z kolumn (np. char, varchar, real, decimal, date)
- umieszczenie powiązanych kolumn w odpowiednich tabelach
- wyeliminowanie problemu powielania grup danych
- wskazanie kluczy głównych poszczególnych tabel

DRUGA POSTAĆ NORMALNA (2NF)
pierwsza postać normalna zakłada, że każda tabela ma swój klucz główny (unikalny identyfikator rekordu). Druga, że nie mogą istnieć żadne (nawet częściowe) zależności pomiędzy jakimikolwiek kolumnami wchodzącymi w skład klucza głównego.
Założenia:
- spełnione są wszystkie wymagania pierwszej postaci normalnej
- należy usunąć wszystkie podzbiory danych, które mają zastosowanie do wielu wierszy w tabeli i  umieścić je w oddzielnych tabelach.
- należy utworzyć relacje pomiędzy tymi tabelami i połączyć je za pomocą kluczy obcych

Przykład:
Zamiast tabeli z powielonym ID aktorów
                                                                                                                                             
powinny być następujące tabele:
 















TRZECIA POSTAĆ NORMALNA (3NF)
występuje tylko wtedy, gdy spełnia następujące warunki:
- znajduje się w drugiej postaci normalnej
- wszystkie pola, które nie należą do klucza głównego, są od tego klucza zależne 

POSTAĆ NORMALNA BOYCE- CODDA (najmocniejsza)






PYTANIA I ODPOWIEDZI.ĆWICZENIA

1. ENCJI odpowiada w relacyjnej bazie danych: TABELA
2. ZWIĄZKOWI JEDNOZNACZNEMU odpowiada w relacyjnej bazie danych:KLUCZ OBCY
3. ZWIĄZKOWI WIELOZNACZNEMU odpowiada w relacyjnej bazie danych:TABELA
4. ATRYBUTOWI w relacyjnej bazie danych odpowiada: KOLUMNA W TABELI
5. JEDNOZNACZNEMU IDENTYFIKATOROWI odpowiada w relacyjnej bazie danych:
KLUCZ GŁÓWNY
5. SPÓJNOŚĆ REFERENCYJNA dotyczy faktu: wartością klucza obcego może być null lub wartość odpowiadającego mu klucza głównego
6. III POSTAĆ NORMALNA dotyczy faktu: wartości w kolumnie niekluczowej nie mogą zależeć ani od części klucza ani nawet przechodnio od klucza
7. Które ze sformułowań są prawdziwe w modelu relacyjnym - wszystkie poniższe:
- wiersze nie powtarzają się
- kolejność kolumn jest nieistotna
- wiersze nie mają tożsamości obiektowej
- związek jednoznaczny reprezentuje się przy pomocy klucza obcego
- tabela jest konkretną reprezentacją relacji  
- dla klucza jednoznacznego jest automatycznie zakładany indeks
- dla klucza głównego jest automatycznie zakładany indeks jednoznaczny
- wartości klucza głównego nie mogą się powtarzać
- klucz główny nie może być częścią właściwą klucza obcego
- może być wiele kluczy obcych
- może być wiele kluczy jednoznacznych
- może być wiele indeksów

8. ZALEŻNOŚĆ ZŁĄCZENIOWA jest uogólnieniem zależności wielowartościowej w następującym sensie:dotyczy rozbicia tabeli na więcej niż dwie tabele,
9. POSTAĆ NORMALNA BOYCE- CODDA dotyczy faktu:
każda nietrywialna zależność funkcyjna jest zależnością od nadklucza,
10. Które z poniższych stwierdzeń są prawdziwe - wszystkie poniższe:
- w tabeli nie powinno być żadnych niekontrolowanych redundancji,
- jedyną poprawną, nietrywialną zależnością funkcyjną jest zależność do klucza,
- należy skonsultować z użytkownikiem poprawność skonstruowanego modelu danych,
- każdy fakt przechowywany w bazie danych powinien być w niej wyrażany tylko na jeden sposób,

11. Na jakich poziomach projektuje się relacyjną bazę danych:
- logicznym,
- użytkowym,
- fizycznym.
12. Kto jest twórcą relacyjnego modelu baz danych: Edgar Codd
13. W której firmie zaimplementowano po raz pierwszy system zarządzania relacyjną bazą danych:
      - IBM
14. Gdy schemat tabel nie jest w trzeciej postaci normalnej mamy do czynienia z:
- anomaliami przy wstawianiu,
- anomaliami przy usuwaniu,
- redundancją,
- anomaliami przy modyfikacji.
 15. ZALEŻNOŚĆ FUNKCYJNA dotyczy zależności między: atrybutami
Eliminacja zależności częściowych i przechodnich prowadzi do:
zwiększenia liczby tabel,
III postaci normalnej,
 Przy przejściu do tabeli obiektowej wiersz tabeli:
staje się obiektem pewnej klasy,
uzyskuje tożsamość obiektową,
może mieć związane ze sobą metody,
Jakiego typu może być wartość atrybutu w modelu obiektowo-relacyjnym:
zbiorem wartości,
listą wartości,
wartością atomową.
referencją do obiektu,
Dany jest schemat relacyjny R={Student,Uczelnia,Adres,Akademik}, F {Student, Uczelnia->Klub; Klub->Adres}. W której postaci normalnej jest ten schemat:
I i II postać normalna

Dany jest schemat relacyjny R={Student,Uczelnia,Adres,Klub}, F {Student->Uczelnia; Klub->Adres Uczelnia->Adres}. W której postaci normalnej jest ten schemat:
I postać normalna

Dany jest schemat relacyjny R={Student,Uczelnia,Adres,Klub}, F {Student->Uczelnia; Klub->Adres}. W której postaci normalnej jest ten schemat:
I postać normalna
Dany jest schemat relacyjny R={Student,Adres,Akademik}, F {Student->Adres; Akademik->Adres; Student->Akademik}. W której postaci normalnej jest ten schemat:
Dany jest schemat relacyjny R={Student,Adres,Akademik}, F {Student->Adres; Akademik->Adres; Student->Akademik}. W której postaci normalnej jest ten schemat:
I i II postać normalna
Dany jest schemat relacyjny R={Ulica, Kod, Sklep}, F = {Ulica->Kod; Ulica, Numer ->Sklep}. W której postaci normalnej jest ten schemat::
I postać normalna
52. Dany jest schemat relacyjny R={Ulica, Kod, Sklep}, F = {Ulica->Kod; Sklep->Ulica}. W której postaci normalnej jest ten schemat
I i II postać normalna
 Dany jest schemat relacyjny R={Miasto, Ulica, Kod}, F = {Miasto,Ulica->Kod}. W której postaci normalnej jest ten schemat::
III postać normalna
II postać normalna
I postać normalna
postać normalna Boyce’a-Codda

Dany jest schemat relacyjny R={Miasto, Ulica, Kod, Poczta}, F {Miasto,Ulica->Kod; Kod->Poczta}. W której postaci normalnej jest ten schemat:
I i II postać normalna
 Dany jest schemat relacyjny R={Miasto, Ulica, Kod, Poczta}, F {Miasto,Ulica->Kod; Kod->Miasto; Kod->Poczta}. W której postaci normalnej jest ten schemat::I postać normalna 
Dany jest schemat relacyjny R={Miasto, Ulica, Kod}, F {Miasto,Ulica->Kod; Kod->Miasto}. W której postaci normalnej jest ten schemat:
III postać normalna
II postać normalna
I postać normalna  
Specyfikacje języka ODL obejmują:
dziedziczenie,związki odwrotne 

Dany jest schemat relacyjny R={Miasto, Ulica, Kod}, F = {Miasto,Ulica->Kod; Kod->Miasto}. Schemat ten:
jest w III postaci normalnej,
jest w III postaci normalnej ale nie jest w postaci normalnej Boyce’a-Codda,
Dany jest schemat relacyjny R={Miasto, Ulica, Kod, Poczta}, F {Miasto,Ulica->Kod; Kod->Miasto; Kod->Poczta}. Schemat ten:
nie jest ani w III postaci normalnej ani w postaci normalnej Boyce’a-Codda. 
Dany jest schemat relacyjny R={Miasto, Ulica, Kod, Poczta}, F = {Miasto,Ulica->Kod; Kod->Poczta}. Schemat ten: 
nie jest ani w III postaci normalnej ani w postaci normalnej Boyce’a-Codda.

Dany jest schemat relacyjny R={Miasto, Ulica, Kod}, F = {Miasto,Ulica->Kod}. Schemat ten:
 jest w postaci normalnej Boyce’a-Codda,jest w III postaci normalnej, 

Dany jest schemat relacyjny R={Ulica, Kod, Sklep}, F = {Ulica->Kod; Sklep->Ulica}. Schemat ten:
 nie jest ani w III postaci normalnej ani w postaci normalnej Boyce’a-Codda.
Dany jest schemat relacyjny R={Ulica, Kod, Sklep, Numer}, F = {Ulica->Kod; Ulica, Numer ->Sklep}. Schemat ten:
nie jest ani w III postaci normalnej ani w postaci normalnej Boyce’a-Codda. 

Dany jest schemat relacyjny R={Student,Adres,Akademik}, F {Student->Adres; Akademik->Adres; Student->Akademik}. Schemat ten:

 nie jest ani w III postaci normalnej ani w postaci normalnej Boyce’a-Codda. 


 Dany jest schemat relacyjny R={Student,Uczelnia,Adres,Klub}, F = {Student->Uczelnia; Klub->Adres}. Schemat ten:Dany jest schemat relacyjny R={Student,Uczelnia,Adres,Klub}, F {Student->Uczelnia; Klub->Adres; Uczelnia->Adres}. Schemat ten:Dany jest schemat relacyjny R={Student,Uczelnia,Adres,Klub}, F = {Student, Uczelnia->Klub; Klub->Adres}. Schemat ten: