BD PG 08 SQL

background image

#1

© K.Goczyła

5. J

5. J

ę

ę

zyk SQL

zyk SQL

Przegl

Przegl

ą

ą

d

d

Instrukcja wyboru (SELECT)

Instrukcja wyboru (SELECT)

Instrukcje modyfikacji danych

Instrukcje modyfikacji danych

Inne instrukcje

Inne instrukcje

for each
{x=1;
SQL

select

for each
{x=1;
SQL

update

for each
{x=1;
SQL

update

background image

#2

© K.Goczyła

SQL (

SQL (

Structured

Structured

Query

Query

Language

Language

)

)

SEQUEL (1974) - opracowany w IBM Research Laboratory w San Jose. Następnie

jego nazwę zmieniono na SQL (często wymawiane jako „sequel”).

Pierwsze zastosowanie - SYSTEM R, następnie w systemach DB2, SQL/DS, QMF na

komputerach IBM/370 (mainframe).

Standardy:

SQL-86: ANSI X3.135-1986 „Database Language SQL”
SQL-89: ANSI X3.168-1989 „Database Language - Embedded SQL”

ANSI X3.135-1989 „Database Language - SQL with Integrity Enhancement”

SQL-92: ISO/IEC 9075:1992 „Database Language SQL”
SQL-99: ISO/IEC 9075:1999 „Information Technology - Database Languages - 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).

zanurzony - instrukcje są zamieszczone w programie napisanym w innym

języku (3GL lub 4GL); wyniki mogą być przekazane do zmiennych
programu.

SQL

background image

#3

© K.Goczyła

Sk

Sk

ł

ł

adniki SQL

adniki SQL

SQL = Data Definition Language (DDL)

+ Data Manipulation Language (DML)

+ Data Control Language (DCL)

Podstawowe instrukcje ("core SQL"`):

DDL

DML

DCL

CREATE TABLE
CREATE VIEW
CREATE INDEX
ALTER TABLE
DROP TABLE
DROP VIEW
DROP INDEX

SELECT
INSERT
UPDATE
DELETE

GRANT
REVOKE

Standardy SQL-92 i SQL-99 obejmują ponadto szereg innych instrukcji, które rozszerzają
funkcje DBMS np. o definiowanie ograniczeń, reguł, funkcji, wyzwalaczy itd.
Szczegóły na temat konkretnej implementacji SQL - w dokumentacji DBMS.

background image

#4

© K.Goczyła

Tworzenie tablic

Tworzenie tablic

CREATE TABLE <nazwa tablicy>

(<nazwa kolumny> <typ danych> [opcje]
[, <nazwa kolumny
> <typ danych> [opcje]. . . ]
[, UNIQUE (<nazwa kolumny
>, [<nazwa kolumny>])]...);

Cel: Utworzenie w bazie danych nowej tablicy. Trzeba określić:

- nazwę tablicy (niepowtarzalna w bazie danych),
- nazwy kolumn (niepowtarzalne w tablicy),
- typ danych każdej kolumny.

Typy danych: (SQL-89)

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 (zwykle w formacie: mm/dd/yyyy).
LOGICAL - wartości logiczne: yes/no, true/false.

background image

#5

© K.Goczyła

Tworzenie tablic (cd.)

Tworzenie tablic (cd.)

Inne typy danych: (SQL-92)

VARCHAR, DATETIME, MONEY, TEXT, IMAGE, BLOB, CLOB, ...

(szczegóły - w dokumentacji DBMS)

Opcje (przykładowe):

NOT NULL [ UNIQUE ] - w kolumnie musi być wartość, jeśli UNIQUE - to unikatowa.
UNIQUE (<kolumna> [,<kolumna>]...) – wartość w kolumnie (kolumnach) musi być unikatowa.

Każda kolumna musi być zdefiniowana z opcją NOT NULL.

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

Szczegółowy wykaz opcji - w opisie instrukcji CREATE TABLE konkretnego DBMS.

background image

#6

© K.Goczyła

Tworzenie tablic

Tworzenie tablic

-

-

przyk

przyk

ł

ł

ad

ad

Instrukcje tworzące tablice bazy danych School1:

CREATE TABLE Teachers

(Tno

CHAR(3) NOT NULL UNIQUE,

Tname CHAR(12),
Title

CHAR(6),

City CHAR(8),
SupNo CHAR(3));

CREATE TABLE Students

(Sno

CHAR(3) NOT NULL UNIQUE,

Sname CHAR(12),
Sdate DATE,
City CHAR(8));

CREATE TABLE TS

(Tno

CHAR(3) NOT NULL,

Sno

CHAR(3) NOT NULL,

hours INT,
UNIQUE (Tno, Sno));

background image

#7

© K.Goczyła

Tworzenie tablic

Tworzenie tablic

-

-

przyk

przyk

ł

ł

ad

ad

(cd.)

(cd.)

Z zastosowaniem opcji definiujących klucze główne i klucze obce:

CREATE TABLE Teachers

(Tno

CHAR(3) PRIMARY KEY,

Tname CHAR(12),
Title

CHAR(6),

City CHAR(8),
SupNo CHAR(3) REFERENCES Teachers);

CREATE TABLE Students

(Sno

CHAR(3) PRIMARY KEY,

Sname CHAR(12),
Sdate DATE,
City CHAR(8));

CREATE TABLE TS

(Tno

CHAR(3) REFERENCES Teachers,

Sno

CHAR(3) REFERENCES Students,

Hours INT,
PRIMARY KEY (Tno, Sno));

background image

#8

© K.Goczyła

Zmiana schematu tablicy

Zmiana schematu tablicy

ALTER TABLE <nazwa tablicy>

{ ADD COLUMN <kolumna> <typ danych> [opcje] |

DROP COLUMN <kolumna> |
ALTER COLUMN <kolumna
> [opcje] }

Cel: Dodanie nowej kolumny do istniejącej tablicy. Nowa kolumna przyjmuje wartości puste (NULL).

Usunięcie kolumny z istniejącej tablicy.
Zmiana opcji istniejącej kolumny (ale nie typu danych!).

Przykłady:

ALTER TABLE Students

ADD COLUMN PhoneNo Char(13);

ALTER TABLE Teachers

DROP COLUMN City;

ALTER TABLE Teachers

ALTER COLUMN Tname LABEL "Name of Teacher”;

Uwaga: Nie można zmienić niektórych opcji, np. NOT NULL, UNIQUE, PRIMARY KEY, ...

background image

#9

© K.Goczyła

Wstawianie danych do tablicy

Wstawianie danych do tablicy

INSERT INTO <nazwa tablicy>

[( <lista kolumn> )]
VALUES (<lista wartości
>)

Cel: Wstawienie do tablicy nowego wiersza na podstawie listy podanych wartości.

Jeśli nie ma <listy kolumn>, wówczas należy podać wszystkie wartości,

w kolejności kolumn tablicy wynikającej z jej schematu.

Przykłady:

INSERT INTO Teachers

VALUES (“T6”, “Taylor”, “Prof.”, “New York”, “T1”);

INSERT INTO Teachers

( TNo, TName, City )
VALUES (“T7”, “James”, “Paris”);

background image

#10

© K.Goczyła

SELECT

SELECT

-

-

przegl

przegl

ą

ą

d

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

background image

#11

© K.Goczyła

SELECT

SELECT

-

-

zapytania proste

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

Przykłady:

1. Pokaż identyfikatory i nazwiska wszystkich nauczycieli.

SELECT TNo, TName

FROM Teachers;

2. Pokaż nazwy wszystkich miast, skąd pochodzą studenci.

SELECT DISTINCT City

FROM Students;

Uwaga: Bez słowa DISTINCT nazwy miast mogłyby się powtarzać.

background image

#12

© K.Goczyła

SELECT

SELECT

-

-

zapytania proste

zapytania proste

(cd.)

(cd.)

3. Pokaż informacje o zajęciach, które trwały ponad 95 godzin.

SELECT *

FROM TS
WHERE Hours > 95;

4. Pokaż identyfikatory i nazwiska nauczycieli, którzy pochodzą z Londynu.

SELECT TNo, TName

FROM Teachers
WHERE City = “London”;

5. Pokaż identyfikatory, tytuły i nazwiska nauczycieli, którzy mają szefa.

SELECT TNo, Title, TName

FROM Teachers
WHERE SupNo IS NOT NULL;

background image

#13

© K.Goczyła

SELECT

SELECT

-

-

zapytania proste

zapytania proste

(cd.)

(cd.)

6. Dla każdego studenta nauczyciela T3 pokaż średnią liczbę godzin zajęć na tydzień.

SELECT Sno, Hours/15, ”godz. na tydzień”

FROM TS
WHERE Tno = ”T3”;

Wynik:

SNO

EXP1

EXP2

S1

2.13

godz. na tydzień

S2

2.40

godz. na tydzień

S3

4.00

godz. na tydzień

S5

4.80

godz. na tydzień

background image

#14

© K.Goczyła

Wyra

Wyra

ż

ż

enia

enia

Operatory języka SQL występujące w wyrażeniach we frazie SELECT, WHERE i in.:

Operatory arytmetyczne:

** ^

- potęgowanie

* /

- mnożenie, 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

background image

#15

© K.Goczyła

Wyra

Wyra

ż

ż

enia

enia

(cd.)

(cd.)

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ą w kolumnie

znakowej, numerycznej lub daty

Funkcje zależne od DBMS

operujące na datach/godzinach, łańcuchach znakowych, polach tekstowych,
wielkich obiektach binarnych,...

background image

#16

© K.Goczyła

Operatory specjalne

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.
Przykłady:

1.

WHERE City = “London” OR City = “Davos” OR City = “Bristol”

jest równoważne:
WHERE City IN (“London”, “Davos”, “Bristol”)

2. SELECT *

FROM Teachers
WHERE City IN

(SELECT City

FROM Students);

Wynik:

Ci nauczyciele z relacji Teachers, którzy pochodzą z miasta występującego
w relacji Students.

background image

#17

© K.Goczyła

Operatory specjalne

Operatory specjalne

(cd.)

(cd.)

BETWEEN

Sprawdza, czy wartość w kolumnie jest zawarta w przedziale wartości.
Przykłady.
1.

WHERE Hours >= 96 AND Hours <= 126
jest równoważne:
WHERE Hours BETWEEN 96 AND 126

2. SELECT

*

FROM Teachers
WHERE TName BETWEEN “A” AND “C”;

Wynik:

TNO

TNAME TITLE

CITY

SUPNO

T1

Blake

Prof

London

NULL

T5

Adams

MSc

Bristol

T4

gdyż “Clark” > “C”

background image

#18

© K.Goczyła

Operatory specjalne

Operatory specjalne

(cd.)

(cd.)

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.

Przykład:

1. Pokaż wszystkich studentów o nazwiskach rozpoczynających się na “J”:

SELECT SName

FROM Students
WHERE SName LIKE “J%”;

Wynik:

SNAME
Jones
Johnson

Uwaga: Podobne działanie ma operator MATCHES, jednak MATCHES pozwala stosować

znacznie bardziej złożone wzorce niż LIKE. Szczegóły - w dokumentacji konkretnego DBMS.

background image

#19

© K.Goczyła

Operatory specjalne

Operatory specjalne

(cd.)

(cd.)

CONTAINS

Sprawdza, czy wartość w kolumnie znakowej zawiera wskazany łańcuch.

Przykład:

Pokaż wszystkich studentów, których nazwisko zawiera łańcuch "Mary":

SELECT SName

FROM Students
WHERE SName CONTAINS “Mary”;

Uwaga: Łańcuch użyty w operatorze CONTAINS może zawierać znaki specjalne

oznaczające OR i AND. Szczegóły - w dokumentacji konkretnego DBMS.

Przykład (Progress):

SELECT SName

FROM Students
WHERE SName CONTAINS “(Mary) | (Maria)”;

background image

#20

© K.Goczyła

Funkcje agreguj

Funkcje agreguj

ą

ą

ce

ce

COUNT()

1.

COUNT(*)

- zwraca liczbę wierszy w tablicy wynikowej

2.

COUNT(DISTINCT <nazwa kolumny>)

- zwraca liczbę różnych wartości we wskazanej kolumnie.

Przykłady:

1. Z ilu różnych miast pochodzą studenci?

SELECT COUNT(DISTINCT City)

FROM Students;

Wynik:

COUNT1

5

2. Ilu nauczycieli pochodzi z Londynu?

SELECT COUNT(*)

FROM Teachers
WHERE City = “London”;

Wynik:

COUNT1

2

background image

#21

© K.Goczyła

Funkcje agreguj

Funkcje agreguj

ą

ą

ce

ce

(cd.)

(cd.)

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.
Przykłady:

1. Podaj sumę godzin zajęć studenta S5.

SELECT SUM(Hours)

Wynik:

FROM TS

SUM1

WHERE SNo = “S5”;

168.00

2. Podaj minimum, maksimum i średnią godzin zajęć nauczyciela T3.

SELECT MIN(Hours), MAX(Hours), AVG(Hours)

FROM TS
WHERE TNo = “T3”;

Wynik:

MIN1

MAX2

AVG3

32.00

72.00

50.00

background image

#22

© K.Goczyła

SELECT

SELECT

-

-

porz

porz

ą

ą

dkowanie wynik

dkowanie wynik

ó

ó

w

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:

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

2. Domyślnie przyjmowany jest porządek rosnący (ASC).

Przykład 1.

Pokaż alfabetycznie dane o nauczycielach (nazwisko, identyfikator i tytuł.

SELECT TName, TNo,Title

FROM Teachers
ORDER BY Tname;

Wynik:

TNAME

TNO

TITLE

Adams

T5

MSc

Blake

T1

Prof.

Clark

T4

PhD

Jones

T3

Prof.

Smith

T2

PhD

background image

#23

© K.Goczyła

SELECT

SELECT

-

-

porz

porz

ą

ą

dkowanie wynik

dkowanie wynik

ó

ó

w

w

(cd.)

(cd.)

Przykład 2.

Pokaż dane (ident. studenta, liczba godzin, ident. nauczyciela) o zajęciach studentów
S1, S2 i S3, porządkując je rosnąco wg ident. studentów i malejąco wg liczby godzin.

SELECT SNo, Hours, TNo

FROM TS
WHERE SNo IN (“S1”, “S2”, “S3”)
ORDER BY SNo, Hours DESC;

Wynik:

SNO

HOURS

TNO

S1

96

T4

S1

64

T1

S1

32

T3

S2

100

T2

S2

64

T1

S2

36

T3

S3

120

T2

S3

96

T4

S3

60

T3

background image

#24

© K.Goczyła

SELECT

SELECT

-

-

grupowanie

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.
Uwaga 1. Każda kolumna występująca we frazie GROUP BY musi wystąpić na liście wyboru

instrukcji SELECT, i na odwrót.

Uwaga 2. W warunku HAVING może wystąpić funkcja agregująca (ale nie w warunku WHERE!).

Przykład 1.

Dla każdego nauczyciela pokaż,
z iloma studentami miał zajęcia.

SELECT Tno, COUNT(*)

FROM TS
GROUP BY Tno;

Wynik

:

TNO

COUNT1

T1

2

T2

3

T3

4

T4

3

T5

1

background image

#25

© K.Goczyła

SELECT

SELECT

-

-

grupowanie

grupowanie

(cd.)

(cd.)

Przykład 2.

Dla każdego studenta oblicz sumę godzin jego zajęć. Pokaż tylko identyfikatory
tych studentów, dla których ta suma przekracza 160.
Wynik uporządkuj malejąco wg liczby godzin.

SELECT SNo, SUM(Hours)

FROM TS
GROUP BY SNo
HAVING SUM(Hours) > 160
ORDER BY 2 DESC;

Wynik:

SNO

SUM1

S3

276

S2

196

S1

192

background image

#26

© K.Goczyła

SELECT

SELECT

-

-

z

z

łą

łą

czenia

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.

Przykład 1.

Pokaż informacje o wszystkich zajęciach nauczyciela T4, podając identyfikatory i nazwiska
studentów oraz liczby godzin. Wynik uporządkuj alfabetycznie wg nazwisk studentów.

SELECT SName, TS.SNo, Hours

FROM TS, Students
WHERE TS.SNo = Students.SNo AND TNo = “T4”
ORDER BY SName;

Wynik:

STUDENTS.SNAME TS.SNO

TS.HOURS

Ford

S5

96

Henry

S1

96

Johnson

S3

96

background image

#27

© K.Goczyła

SELECT

SELECT

-

-

z

z

łą

łą

czenia

czenia

(cd.)

(cd.)

Przykład 2.

Pokaż wszystkie pary (nauczyciel, student) takie, że nauczyciel i student pochodzą z tego
samego miasta. Podaj identyfikatory i nazwiska studentów i nauczycieli. Wynik uporządkuj
alfabetycznie wg nazw miast, a potem wg nazwisk nauczycieli i studentów.

SELECT T.City, TName, TNo, SName, SNo

FROM Teachers T, Students S
WHERE T.City = S.City
ORDER BY T.City, TName, SName;

Wynik:

T.CITY

T.TNAME

T.TNO

S.SNAME

S.SNO

Bristol

Adams

T5

Ford

S5

London

Blake

T1

Henry

S1

London

Blake

T1

Higgins

S4

London

Jones

T3

Henry

S1

London

Jones

T3

Higgins

S4

Uwaga: S i T są aliasami tablic. W tym przykładzie służą tylko do skrócenia zapisu.

background image

#28

© K.Goczyła

SELECT

SELECT

-

-

z

z

łą

łą

czenia

czenia

(cd.)

(cd.)

Przykład 3.

Dla każdego nauczyciela pokaż jego nazwisko, identyfikator i sumę godzin zajęć.
Wynik uporządkuj alfabetycznie wg nazwisk.

SELECT TName, TS.TNo, SUM(Hours)

FROM Teachers T, TS
WHERE T.TNo = TS.TNo
GROUP BY TName, TS.TNo
ORDER BY TName;

Wynik:

T.TNAME

TS.TNO

SUM1

Adams

T5

32.00

Blake

T1

128.00

Clark

T4

288.00

Jones

T3

200.00

Smith

T2

340.00

background image

#29

© K.Goczyła

SELECT

SELECT

-

-

z

z

łą

łą

czenia

czenia

(cd.)

(cd.)

Złączenie tablicy z tą samą tablicą nazywamy samozłączeniem.

Samozłączenie umożliwia wiązanie ze sobą informacji zawartych w różnych wierszach
jednej tablicy.

Do dokonania samozłączenia konieczne jest zastosowanie aliasów (nazw korelacji).

Przykład 4.

Dla każdego nauczyciela pokaż listę nauczycieli, którzy są jego podwładnymi.
Wynik uporządkuj alfabetycznie wg nazwisk szefów, a potem wg nazwisk podwładnych.

SELECT Over.TName, Over.TNo, “jest szefem dla”, Under.TName, Under.TNo

FROM Teachers Under, Teachers Over
WHERE Under.SupNo = Over.TNo
ORDER BY Over.TName, Under.TName;

Wynik:

OVER.TNAME

OVER.TNO

EXP1

UNDER.TNAME

UNDER.TNO

Blake

T1

jest szefem dla

Jones

T3

Blake

T1

jest szefem dla

Smith

T2

Clark

T4

jest szefem dla

Adams

T5

Jones

T3

jest szefem dla

Clark

T4

background image

#30

© K.Goczyła

SELECT

SELECT

-

-

podzapytania

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.

Przykłady:
1. Pokaż dane o zajęciach nauczycieli pochodzących z Londynu.

SELECT *

FROM TS
WHERE TNo IN

(SELECT TNo

FROM Teachers

WHERE City = “London”) ;

2. Pokaż identyfikatory i nazwiska nauczycieli, którzy prowadzili chociaż jedne zajęcia,

które trwały ponad 64 godziny.

SELECT TNo, TName

FROM Teachers
WHERE TNo IN

(SELECT TNo

FROM TS

WHERE Hours > 64) ;

background image

#31

© K.Goczyła

SELECT

SELECT

-

-

podzapytania

podzapytania

(cd.)

(cd.)

3. Pokaż identyfikatory i nazwiska nauczycieli, którzy prowadzili chociaż jedne zajęcia,

które trwały dłużej niż wynosi średnia liczba godzin na jedno zajęcie.

SELECT TNo, TName

FROM Teachers
WHERE TNo IN

(SELECT TNo

FROM TS

WHERE Hours >

(SELECT AVG(Hours)

FROM TS));

4. Pokaż nazwiska, identyfikatory i tytuły nauczycieli, dla których łączna liczba godzin zajęć

przekracza 200. Uporządkuj wynik alfabetycznie wg nazwisk.

SELECT TName, TNo, Title

FROM Teachers
WHERE TNo IN

(SELECT TNo

FROM TS
GROUP BY TNo
HAVING SUM(Hours) > 200)

ORDER BY TName;

background image

#32

© K.Goczyła

SELECT

SELECT

-

-

podzapytania

podzapytania

(cd.)

(cd.)

5. Pokaż dane o zajęciach, w których nauczyciel lub student pochodzą z Londynu.

Uporządkuj wyniki wg identyfikatorów nauczycieli i studentów.

SELECT *

FROM TS
WHERE TNo IN

(SELECT TNo

FROM Teachers

WHERE City = “London”)

OR SNo IN

(SELECT SNo

FROM Students

WHERE City = “London”)

ORDER BY TNo, SNo;

background image

#33

© K.Goczyła

SELECT

SELECT

-

-

podzapytania

podzapytania

(cd.)

(cd.)

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.

6. Pokaż dane o nauczycielach, którzy uczyli studenta S1.

SELECT *

FROM Teachers
WHERE EXISTS

(SELECT *

FROM TS

WHERE Teachers.TNo = TS.TNo AND

TS.SNo = “S1”);

7. Pokaż dane (ident. i nazwisko) studentów, których nie uczył nauczyciel T3.

SELECT SNo, SName

FROM Students
WHERE NOT EXISTS

(SELECT *

FROM TS
WHERE Students.SNo = TS.SNo AND

TS.TNo = “T3”);

background image

#34

© K.Goczyła

SELECT

SELECT

-

-

podzapytania

podzapytania

(cd.)

(cd.)

8. Pokaż dane (ident., nazwisko, tytuł) o nauczycielach, którzy uczyli wszystkich studentów.

SELECT TNo, TName, Title

FROM Teachers
WHERE NOT EXISTS

(SELECT *

FROM Students
WHERE NOT EXISTS

(SELECT *

FROM TS
WHERE Teachers.TNo = TS.Tno AND

Students.SNo = TS.SNo));

background image

#35

© K.Goczyła

SELECT

SELECT

-

-

podzapytania

podzapytania

(cd.)

(cd.)

9. Pokaż identyfikatory nauczycieli, którzy uczyli więcej niż jednego studenta.

SELECT DISTINCT TS1.TNo

FROM TS TS1
WHERE EXISTS

(SELECT *

FROM TS TS2

WHERE S1.TNo = TS2.TNo AND TS1.SNo <> TS2.SNo);

10. Pokaż nazwiska i identyfikatory tych nauczycieli, którzy są szefami.

SELECT Over.TName, Over.TNo

FROM Teachers Over
WHERE EXISTS

(SELECT *

FROM Teachers Under

WHERE Over.TNo = Under.SupNo);

Uwaga: Ten sam wynik można uzyskać za pomocą złączenia podobnego do tego

z przykładu 4 sekcji "SELECT - złączenia".

background image

#36

© K.Goczyła

Wstawianie danych z innych tablic

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.

Przykład:

Załóżmy, że tablica Students1 ma tę samą strukturę co tablica Students. Instrukcja:

INSERT INTO Students

SELECT *
FROM Students1
WHERE SYear > 1990;

wstawia do tablicy Students wszystkie wiersze z tablicy Students1 dotyczące studentów,
którzy rozpoczęli naukę po roku 1990.

background image

#37

© K.Goczyła

Zachowywanie wynik

Zachowywanie wynik

ó

ó

w zapytania

w zapytania

Niektóre DBMS pozwalają na zachowywanie 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.

background image

#38

© K.Goczyła

Zachowywanie wynik

Zachowywanie wynik

ó

ó

w zapytania

w zapytania

(cd.)

(cd.)

Przykład.

Pokaż nazwiska, identyfikatory i tytuły tych nauczycieli, którzy mieli zajęcia o łącznej długości
przekraczającej średnią łączną długość zajęć na jednego nauczyciela. Wynik uporządkuj

alfabetycznie wg nazwisk.

SELECT TNo, SUM(Hours)

FROM TS
GROUP BY TNo
INTO TEMP Tsum(TNo, HSum);

SELECT TName, TNo, Title

FROM Teachers
WHERE TNo IN

(SELECT TNo

FROM Tsum
WHERE Hsum >

(SELECT AVG(Hsum)

FROM Tsum));

ORDER BY TName;

Tablica TSUM zawiera sumy godzin zajęć dla każdego nauczyciela. W drugim zapytaniu
z tablicy TEACHERS wybieramy tylko tych nauczycieli, dla których suma godzin z tablicy
TSUM przekracza średnią z tych sum.

background image

#39

© K.Goczyła

Zachowywanie wynik

Zachowywanie wynik

ó

ó

w zapytania

w zapytania

(cd.)

(cd.)

Niektóre systemy DBMS nie dają możliwości bezpośredniego zachowywania wyników
instrukcji SELECT w tablicy tymczasowej (tzn. składnia instrukcji SELECT nie zawiera
opcjonalnej frazy INTO TEMP lub podobnej). W takich wypadkach należy jawnie utworzyć
nową tablicę i zastosować “wsadową” wersję instrukcji INSERT:

SELECT ......

FROM ...
WHERE ...

....

INTO TEMP Tab1(kol1, kol2, ...);

CREATE TABLE Tab1

(kol1

typ1,

kol2

typ2, ......);

INSERT INTO Tab1

SELECT ......

FROM ...
WHERE ...;

Przykład:

CREATE TABLE Profes

(PNo

Char(4),

Pname

Char(12));

INSERT INTO Profes

SELECT TNo, Tname

FROM Teachers
WHERE Title = “Prof.”;

SELECT TNo, Tname

FROM Teachers
WHERE Title = “Prof.”
INTO TEMP Profes (PNo, PName);

background image

#40

© K.Goczyła

Aktualizowanie danych

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.

Przykłady:

1. Prof. Blake (ident. T1) zmienił przeniósł się z Londynu do Birmingham.

UPDATE Teachers

SET City = “Birmingham”
WHERE TNo = “T1”;

2. Okazało się, że pan Jones (ident. T3) miał ze wszystkimi swoimi studentami o 8 godzin więcej

niż to zostało poprzednio zapisane. Trzeba dokonać następującej aktualizacji:

UPDATE TS

SET Hours = Hours+8
WHERE Tno = “T3”;

3. Okazało się, że niektóre dane o studencie S3 zostały błędnie zapisane w bazie danych.

Trzeba zmienić wartość kilku pól.

UPDATE Students

SET Sname = “Johnsone”, Syear = 1984, City = “Diblan”
WHERE Sno = “S3”;

background image

#41

© K.Goczyła

Usuwanie danych

Usuwanie danych

DELETE FROM <nazwa tablicy>

[ WHERE <warunek> ]

Cel: Usunięcie z tablicy jednego lub wielu wierszy.

Przykłady:

1. Prof. Blake (ident. T1) zmienił miejsce pracy. Należy usunąć zapis o nim z tablicy Teachers

(gdzie przechowujemy dane tylko o aktualnie zatrudnionych nauczycielach) i przenieść je
do tablicy Teachers1 (o strukturze takiej samej jak Teachers), pełniącej rolę archiwum.

INSERT INTO Teachers1

SELECT *
FROM Teachers
WHERE TNo = “T1”;

DELETE FROM Teachers

WHERE TNo = “T1”;

2. Przy końcu roku akademickiego przenosimy wszystkie rekordy z tablicy TS do TS1,

w której przechowujemy dane archiwalne z tablicy TS. Następnie czyścimy tablicę TS.

INSERT INTO TS1

SELECT *
FROM TS;

DELETE FROM TS;

background image

#42

© K.Goczyła

Sumowanie tablic

Sumowanie tablic

<instrukcja SELECT>
UNION [ALL]
<instrukcja SELECT
>

Cel: Realizacja operacji algebry relacji UNION w stosunku do tablic będących wynikiem

dwóch lub więcej instrukcji SELECT. Tablice muszą być zgodne.

Uwagi:

1. Z tablicy wynikowej usuwane są wiersze powtarzające się (duplikaty), chyba że występuje ALL.
2. Jeśli nazwy kolumn sumowanych tablic są różne, tablica wynikowa przyjmuje nazwy

kolumn z pierwszej tablicy.

3. Jeśli po UNION występuje fraza ORDER BY, muszą w niej występować numery,

a nie nazwy kolumn.

Przykład:

Pokaż alfabetycznie nazwy miast,
skąd pochodzą studenci lub nauczyciele.

SELECT City

FROM Teachers

UNION
SELECT City

FROM Students

ORDER BY 1;

CITY
Adelaide
Bristol
Davos
Dublin
Glasgow
Liverpool
London

background image

#43

© K.Goczyła

Odejmowanie tablic

Odejmowanie tablic

(SQL

(SQL

-

-

92)

92)

<instrukcja SELECT>
MINUS [ALL]
<instrukcja SELECT
>

Cel: Realizacja operacji algebry relacji MINUS w stosunku do tablic będących wynikiem

dwóch lub więcej instrukcji SELECT. Tablice muszą być zgodne.

Uwagi:

1. Z tablicy wynikowej usuwane są wiersze powtarzające się (duplikaty), chyba że występuje ALL.
2. Jeśli nazwy kolumn sumowanych tablic są różne, tablica wynikowa przyjmuje nazwy

kolumn z pierwszej tablicy.

3. Jeśli po MINUS występuje fraza ORDER BY, muszą w niej występować numery,

a nie nazwy kolumn.

Przykład:

Pokaż alfabetycznie nazwy miast,
skąd pochodzą studenci, ale nie nauczyciele.

SELECT City

FROM Students

MINUS
SELECT City

FROM Teachers

ORDER BY 1;

CITY
Adelaide
Davos
Dublin

background image

#44

© K.Goczyła

Przecinanie tablic

Przecinanie tablic

(SQL

(SQL

-

-

92)

92)

<instrukcja SELECT>
INTERSECT [ALL]
<instrukcja SELECT
>

Cel: Realizacja operacji algebry relacji INTERSECT w stosunku do tablic będących wynikiem

dwóch lub więcej instrukcji SELECT. Tablice muszą być zgodne.

Uwagi:

1. Z tablicy wynikowej usuwane są wiersze powtarzające się (duplikaty), chyba że występuje ALL.
2. Jeśli nazwy kolumn sumowanych tablic są różne, tablica wynikowa przyjmuje nazwy

kolumn z pierwszej tablicy.

3. Jeśli po INTERSECT występuje fraza ORDER BY, muszą w niej występować numery,

a nie nazwy kolumn.

Przykład:

Pokaż alfabetycznie nazwy miast, skąd
pochodzą zarówno studenci, jak i nauczyciele.

SELECT City

FROM Students

INTERSECT
SELECT City

FROM Teachers

ORDER BY 1;

CITY
Bristol
London

background image

#45

© K.Goczyła

Tworzenie indeks

Tworzenie indeks

ó

ó

w

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.

Przykłady:

CREATE UNIQUE INDEX TeachInd

ON Teachers (Tno );

CREATE UNIQUE INDEX TSInd

ON TS (Tno, SNo );

CREATE INDEX HrsInd

ON TS (Sno, Hours DESC);

background image

#46

© K.Goczyła

Tworzenie indeks

Tworzenie indeks

ó

ó

w

w

(cd.)

(cd.)

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?

1. Pozwala zwiększyć efektywność przetwarzania żądań dostępu do danych

z tablicy (instrukcji SELECT).

2. Porządkuje wiersze tablicy w określonym porządku.
3. Zapobiega powtarzaniu się wartości w wierszach tablicy.

Kiedy tworzyć indeks?

1. Gdy tablica jest często przetwarzana sekwencyjnie zgodnie z wartościami

pewnej kolumny (rosnąco lub malejąco).

2. Gdy konieczne jest zachowanie unikatowości wartości kolumn(y).
3. Gdy dostęp do tablicy jest często realizowany zgodnie z wartościami

danej kolumny lub kolumn (dostęp asocjacyjny).

Jaki jest koszt?

1. Koszt pamięciowy (utrzymywanie dodatkowych danych).
2. Koszt czasowy (konieczność aktualizacji indeksu podczas aktualizowania

tablicy (instrukcje INSERT, UPDATE, DELETE).

background image

#47

© K.Goczyła

Tworzenie indeks

Tworzenie indeks

ó

ó

w

w

-

-

przyk

przyk

ł

ł

ady

ady

Przykład 1:

CREATE INDEX TSHours

ON TS (Hours DESC);

TSHours

TS

Hours

RecNo

TNO

SNO

HOURS

RecNo

120

4

T1

S1

64

1

120

5

T1

S2

64

2

100

3

T2

S2

100

3

96

10

T2

S3

120

4

96

11

T2

S4

120

5

96

12

T3

S1

32

6

72

9

T3

S2

36

7

64

1

T3

S3

60

8

64

2

T3

S5

72

9

60

8

T4

S1

96

10

36

7

T4

S3

96

11

32

6

T4

S5

96

12

32

13

T5

S6

32

13

background image

#48

© K.Goczyła

Tworzenie indeks

Tworzenie indeks

ó

ó

w

w

-

-

przyk

przyk

ł

ł

ady

ady

(cd.)

(cd.)

Przykład 2:

CREATE INDEX StudHrs

ON TS (Sno, Hours);

StudHrs

TS

SNo+Hours RecNo

TNo

SNo

Hours

RecNo

S1 + 32

6

T1

S1

64

1

S1 + 64

1

T1

S2

64

2

S1 + 96

10

T2

S2

100

3

S2 + 36

7

T2

S3

120

4

S2 + 64

2

T2

S4

120

5

S2 + 100

3

T3

S1

32

6

S3 + 60

8

T3

S2

36

7

S3 + 96

11

T3

S3

60

8

S3 + 120

4

T3

S5

72

9

S4 + 120

5

T4

S1

96

10

S5 + 72

9

T4

S3

96

11

S5 + 96

12

T4

S5

96

12

S6 + 32

13

T5

S6

32

13

background image

#49

© K.Goczyła

Indeksy

Indeksy

bitmapowe

bitmapowe

(Oracle)

(Oracle)

Przykład:

CREATE BITMAP INDEX Titles

ON Teachers (Title);

Titles

Teachers

TNO

TNAME

TITLE

CITY

SUPNO

Rowid

T1

Blake

Prof.

London

NULL

1

T2

Smith

PhD

Glasgow

T1

2

T3

Jones

Prof.

London

T1

3

T4

Clark

PhD

Liverpool

T3

4

T5

Adams

MSc

Bristol

T4

5

Rowid

1
2
3
4
5

0 0 1
0 1 0
0 0 1
0 1 0
1 0 0

MSc

PhD

Prof

Indeks bitmapowy warto stosować wtedy, gdy liczba różnych wartości indeksowanej kolumny
jest b. mała w stosunku do liczby wierszy tablicy i jest z góry znana (nie rośnie).
Typowym zastosowaniem są systemy przetwarzania danych w hurtowniach danych
(bardzo obszerne dane, ale niezmienne w czasie).

background image

#50

© K.Goczyła

Widoki

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ę ma 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 tylko 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ące w skład widoku).
• W ogólności, nie można aktualizować danych poprzez widok.

background image

#51

© K.Goczyła

Tworzenie widok

Tworzenie widok

ó

ó

w

w

CREATE VIEW <nazwa widoku>

[ <lista kolumn> ]

AS <instrukcja SELECT >
[WITH CHECK OPTION]

Cel: Utworzenie widoku (wirtualnej tablicy). 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
aktualizowalny) spełniają warunki występujące we frazie WHERE instrukcji SELECT.

Przykład 1. (widok aktualizowalny)

CREATE VIEW TopTeachers

AS SELECT TNo, TName, Title

FROM Teachers
WHERE Title <> 'MSc'

WITH CHECK OPTION;

SELECT *

FROM TopTeachers;

Wynik zapytania:

TNO

TNAME

TITLE

T1

Blake

Prof.

T2

Smith

PhD

T3

Jones

Prof.

T4

Clark

PhD

background image

#52

© K.Goczyła

Tworzenie widok

Tworzenie widok

ó

ó

w

w

(cd.)

(cd.)

Przykład 2.

CREATE VIEW TSJoined

(TeachNo, TeachName, StudNo, StudName, TeachHours)
AS SELECT Teachers.TNo, Teachers.TName,

Students.SNo, Students.SName, TS.Hours

FROM TS, Teachers, Students
WHERE TS.TNo = Teachers.TNo AND TS.SNo = Students.Sno ;

SELECT *

FROM TSJoined
WHERE TeachHours >= 90 ;

Wynik zapytania:

TEACHNO

TEACHNAME

STUDNO

STUDNAME

TEACHHOURS

T2

Smith

S2

Jones

100

T2

Smith

S3

Johnson

120

T2

Smith

S4

Higgins

120

T4

Clark

S1

Henry

96

T4

Clark

S3

Johnson

96

T4

Clark

S5

Ford

96

Czy widok TSJoined jest aktualizowalny?

background image

#53

© K.Goczyła

Aktualizowanie widok

Aktualizowanie widok

ó

ó

w

w

Widok TSJoined (przykład 2.) może nie być aktualizowalny. 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.

Szczegóły - w dokumentacji DBMS.

background image

#54

© K.Goczyła

Usuwanie tablic, indeks

Usuwanie tablic, indeks

ó

ó

w i widok

w i widok

ó

ó

w

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.

Przykład:

DROP TABLE Books;

DROP INDEX <nazwa indeksu>

Cel: Skasowanie istniejącego indeksu. Nie wpływa na indeksowaną tablicę.
Przykład:

DROP INDEX Hours;

DROP VIEW <nazwa widoku>

Cel: Skasowanie istniejącego widoku. Nie wpływa na tablice występujące w definicji widoku.
Przykład:

DROP VIEW MyView;

background image

#55

© K.Goczyła

Z

Z

łą

łą

czenia zewn

czenia zewn

ę

ę

trzne

trzne

W złączeniu wewnętrznym w wyniku zwracane są zawsze wiersze z obu tablic (lewej i prawej).
Wiersze w jednej tablicy, które nie mają swoich odpowiedników w drugiej tablicy, są odrzucane.
W dowolnym złączeniu zewnętrznym zwracane są wszystkie wiersze zwracane przez
odpowiednie złączenie wewnętrzne. Ponadto:

lewe złączenie zewnętrzne – Dla każdego wiersza wybranego z lewej tablicy,

dla którego nie istnieje odpowiedni wiersz w prawej tablicy, zamiast wiersza
z prawej tablicy zwracany jest wiersz złożony z wartości pustych .
Innymi słowy: Zwracane są wszystkie wiersze z lewej tablicy, nawet te, do których nie
pasują żadne wiersze z prawej tablicy.

prawe złączenie zewnętrzne – Dla każdego wiersza wybranego z prawej tablicy,

dla którego nie istnieje odpowiedni wiersz w lewej tablicy, zamiast wiersza
z lewej tablicy zwracany jest wiersz złożony z wartości pustych .
Innymi słowy: Zwracane są wszystkie wiersze z prawej tablicy, nawet te, do których nie
pasują żadne wiersze z lewej tablicy.

pełne złączenie zewnętrzne – Zwraca wyniki lewego i prawego złączenia zewnętrznego

(czyli wynik operacji UNION dla wyników lewego i prawego złączenia zewnętrznego).

Uwaga 1: DBMS może wprowadzać różne ograniczenia dotyczące złączeń zewnętrznych.

Szczegóły - w dokumentacji konkretnego DBMS.

Uwaga 2: Złączenia zewnętrzne nie są przemienne!

background image

#56

© K.Goczyła

Z

Z

łą

łą

czenia zewn

czenia zewn

ę

ę

trzne

trzne

-

-

przyk

przyk

ł

ł

ady

ady

Przykład lewego złączenia zewnętrznego:

Tablica1

Tablica2

C11

C12

Left Outer

C21

C22

1

2

Join

1

6

2

4

on C11=C21

2

2

5

7

2

5

6

9

3

9

Wynik:

C11

C12

C21

C22

1

2

1

6

2

4

2

2

2

4

2

5

5

7

?

?

6

9

?

?

SQL:

SELECT *
FROM Tablica1 LEFT JOIN Tablica2

ON C11 = C21

SELECT *
FROM Table1 LEFT JOIN Table2
WHERE C11 = C21

background image

#57

© K.Goczyła

Z

Z

łą

łą

czenia zewn

czenia zewn

ę

ę

trzne

trzne

-

-

przyk

przyk

ł

ł

ady

ady

(cd.)

(cd.)

Przykład prawego złączenia zewnętrznego:

Tablica1

Tablica2

C11

C12

Right Outer

C21

C22

1

2

Join

1

6

2

4

on C11=C21

2

2

5

7

2

5

6

9

3

9

Wynik:

C11

C12

C21

C22

1

2

1

6

2

4

2

2

2

4

2

5

?

?

3

9

SQL:

SELECT *
FROM Tablica1 RIGHT JOIN Tablica2

ON C11 = C21

SELECT *
FROM Table1 RIGHT JOIN Table2
WHERE C11 = C21

background image

#58

© K.Goczyła

Z

Z

łą

łą

czenia zewn

czenia zewn

ę

ę

trzne

trzne

-

-

przyk

przyk

ł

ł

ady

ady

(cd.)

(cd.)

Inny przykład:

SELECT T.City, TName, TNo, SName, SNo

FROM Teachers T LEFT JOIN Students S

ON T.City = S.City

WHERE Title <> 'MSc';

Wynik:

T.CITY

TNAME TNO

SNAME

SNO

London

Blake

T1

Henry

S1

London

Blake

T1

Higgins

S4

London

Jones

T3

Henry

S1

London

Jones

T3

Higgins

S4

Glasgow

Smith

T2

?

?

Liverpool

Clark

T4

?

?

background image

#59

© K.Goczyła

NOT IN i NOT EXISTS a z

NOT IN i NOT EXISTS a z

łą

łą

czenia

czenia

zewn

zewn

ę

ę

trzne

trzne

Załóżmy, że tablice table1 i table2 mają kolumny id.

SELECT *

FROM table1
WHERE id NOT IN

(SELECT id

FROM table2);

SELECT *

FROM table1
WHERE NOT EXISTS

(SELECT id

FROM table2
WHERE table1.id=table2.id);

SELECT table1.*

FROM table1 LEFT JOIN table2

ON table1.id=table2.id

WHERE table2.id IS NULL

background image

#60

© K.Goczyła

NOT IN i NOT EXISTS a z

NOT IN i NOT EXISTS a z

łą

łą

czenia

czenia

zewn

zewn

ę

ę

trzne

trzne

-

-

przyk

przyk

ł

ł

ad

ad

Przykład:

Pokaż dane o nauczycielach, którzy pochodzą z takich miast, z których nie
pochodzą studenci.

SELECT T.*

FROM Teachers T LEFT JOIN Students S

ON T.City = S.City

WHERE S.Sno IS NULL;

Wynik:

TNO TNAME TITLE CITY SUPNO

T2 Smith

PhD Glasgow T1

T4 Clark

PhD Liverpool T3

background image

#61

© K.Goczyła

Kursory

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 ustalenia pozycji kursora na wierszu można:

• uaktualnić wiersz
• usunąć wiersz

• przetworzyć wiersz (np. wyświetlić go w sposób niestandardowy)

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

Raz zadeklarowany kursor można otwierać i zamykać wiele razy.

background image

#62

© K.Goczyła

Kursory

Kursory

(cd.)

(cd.)

Instrukcja

Opis

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.

background image

#63

© K.Goczyła

Kursory

Kursory

(cd.)

(cd.)

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

Przykład:

DECLARE c01 CURSOR FOR

SELECT *
FROM Teachers
WHERE City = "London”;

background image

#64

© K.Goczyła

Kursory

Kursory

(cd.)

(cd.)

OPEN <nazwa kursora>

nazwa kursora – nazwa kursora określona w instrukcji DECLARE CURSOR.

Przykład:

OPEN c01;

CLOSE <nazwa kursora>

nazwa kursora – nazwa otwartego kursora.

Przykład:

CLOSE c01;

Uwaga: Po ponownym otwarciu kursora system pobiera od nowa wynikowy zbiór wierszy,

który może różnić się od zbioru poprzedniego.

background image

#65

© K.Goczyła

Kursory

Kursory

(cd.)

(cd.)

FETCH <nazwa kursora> INTO <lista zmiennych>

nazwa kursora – nazwa kursora zadeklarowanego instrukcją DECLARE CURSOR

i otwartego instrukcją OPEN.

lista zmiennych – lista zmiennych programowych, do których są przekazywane wartości kolumn.

Przykład:

FETCH c01

INTO numberv, namev, titlev, cityv, supnov;

background image

#66

© K.Goczyła

Kursory

Kursory

(cd.)

(cd.)

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.

Przykład 1: (Progress SQL/4GL)

DEFINE VARIABLE tnovar LIKE TS.Tno.
DEFINE VARIABLE hoursvar LIKE TS.Hours.
DECLARE c1 CURSOR FOR

SELECT Tno, Hours
FROM TS WHERE Tno = T1.

OPEN c1.
REPEAT:

FETCH c1 INTO tnovar, hoursvar.
UPDATE TS

SET Hours = hoursvar + 12 WHERE CURRENT OF c1.

END.
CLOSE c1.

background image

#67

© K.Goczyła

Kursory

Kursory

(cd.)

(cd.)

Przykład 2: (Progress SQL/4GL)

/* zdefiniuj potrzebne zmienne */

DEF VAR name LIKE Teachers.Tname.
DEF VAR hour LIKE TS.Hours.
DEF VAR name1 AS CHARACTER.

/* zadeklaruj kursor */

DECLARE c1 CURSOR FOR

SELECT Tname, Hours

FROM Teachers, TS
WHERE Teachers.Tno = TS.Tno.

/* otwórz kursor*/

OPEN c1.

/* przeczytaj daną od użytkownika*/

SET name1.

/* przetwarzaj wiersze wynikowe */

REPEAT:

FETCH c1 INTO name, hour.

/* wyświetl wiersze o wartości kolumny Tname podanej przez użytkownika */

IF name = name1 THEN

DISPLAY name hour.

END.

/* zamknij kursor */

CLOSE c1.

background image

#68

© K.Goczyła

Autoinkrementacja

Autoinkrementacja

(

(

MySQL

MySQL

)

)

1. Utworzenie dwóch tablic z kolumnami AUTO_INCREMENT typu

SMALLINT UNSIGNED.

CREATE TABLE Persons

( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

name CHAR(60) NOT NULL,
PRIMARY KEY (id) );

CREATE TABLE Shirts

( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
owner SMALLINT UNSIGNED NOT NULL REFERENCES persons,
PRIMARY KEY (id) );

background image

#69

© K.Goczyła

Autoinkrementacja

Autoinkrementacja

(

(

cd

cd

.)

.)

2. Wstawienie danych do tablic Persons i Shirts.

INSERT INTO Persons

VALUES (NULL, 'Antonio Paz');

INSERT INTO Shirts

VALUES (NULL, 'polo', 'blue', LAST_INSERT_ID()),

(NULL, 'dress', 'white', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());

INSERT INTO Persons

VALUES (NULL, 'Lilliana Angelovska');

INSERT INTO Shirts

VALUES (NULL, 'dress', 'orange', LAST_INSERT_ID()),

(NULL, 'polo', 'red', LAST_INSERT_ID());

background image

#70

© K.Goczyła

Autoinkrementacja

Autoinkrementacja

(

(

cd

cd

.)

.)

3. Odczytanie zawartości tablic Persons i Shirts.

SELECT * FROM Persons;

+----+---------------------+
| id | name

|

+----+---------------------+
| 1 | Antonio Paz

|

| 2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM Shirts;

+----+---------+--------+-------+
| id | style | color

| owner |

+----+---------+--------+-------+
| 1 | polo | blue

| 1 |

| 2 | dress

| white

| 1 |

| 3 | t-shirt | blue

| 1 |

| 4 | dress

| orange | 2 |

| 5 | polo | red | 2 |
+----+---------+--------+-------+

background image

#71

© K.Goczyła

Pseudokolumny

Pseudokolumny

(Oracle)

(Oracle)

Pseudokolumna może wystąpić na liście wyboru SELECT, choć nie jest przechowywana
w tablicy.

ROWNUM - numer kolejny wiersza zwróconego przez SELECT; 1, 2, ...
ROWID - fizyczny adres wiersza w tablicy
LEVEL

- numer poziomu wiersza w wyniku zapytania hierarchicznego; 1, 2, ...

CURRVAL, NEXTVAL - wartości zwracane przez sekwencje

Przykłady:

1. SELECT *

FROM Teachers
WHERE Rownum > 1;

2. SELECT *

FROM Teachers
WHERE Rownum < 3;

To zapytanie nie zwróci żadnego wiersza!

A to zwróci maks. 2 wiersze

background image

#72

© K.Goczyła

Rownum

Rownum

a porz

a porz

ą

ą

dkowanie wynik

dkowanie wynik

ó

ó

w

w

Przykład:

Pokaż te wiersze z tablicy TS, które zawierają 8 największych wartości kolumny Hours.

Rozwiązanie niepoprawne (wynik nieokreślony):

SELECT *

FROM TS
WHERE Rownum <= 8
ORDER BY Hours DESC;

Rozwiązanie poprawne:

SELECT *

FROM (SELECT *

FROM TS
ORDER BY Hours DESC)

WHERE Rownum <= 8

Przykład wyrażenia tablicowego

background image

#73

© K.Goczyła

Zapytania hierarchiczne

Zapytania hierarchiczne

(Oracle)

(Oracle)

[START WITH warunek]

CONNECT BY warunek

Pozwala wydobywać wiersze z relacji w porządku hierarchicznym.
Stosuje się do relacji, w których wiersze powiązane są ze sobą rekursywnym związkiem

typu „jeden do wiele”. Taką relację można reprezentować jako las (w szczególnym
przypadku - drzewo).

Kolejność wydobywania wierszy z relacji przez zapytanie hierarchiczne („depth first”):

background image

#74

© K.Goczyła

Zapytania hierarchiczne

Zapytania hierarchiczne

(cd.)

(cd.)

START WITH określa warunek, przy którym dany wiersz traktowany jest jako korzeń drzewa.
CONNECT BY określa warunek określający związek rodzic-potomek w drzewie.

W tym warunku słowo PRIOR odnosi się do wiersza-poprzednika (rodzica).

Przykład 1:

Pokaż wszystkich nauczycieli w porządku hierarchicznym.

SELECT LPAD(‘ ‘, 2*(LEVEL-1)) || Tname AS “Schemat”, Tno, Title, City

FROM Teachers
START WITH SupNo IS NULL
CONNECT BY PRIOR Tno = SupNo;

Schemat

Tno

Title

City

Blake

T1

Prof.

London

Smith

T2

PhD

Glasgow

Jones

T3

Prof.

London

Clark

T4

PhD

Liverpool

Adams

T5

MSc

Bristol

background image

#75

© K.Goczyła

Zapytania hierarchiczne

Zapytania hierarchiczne

(cd.)

(cd.)

Przykład 2:

Pokaż wszystkich nauczycieli, którzy - pośrednio lub bezpośrednio - są podwładnymi
nauczyciela T3.

SELECT Tname, Tno, Title, City

FROM Teachers
WHERE Tno <> “T3”
START WITH Tno = “T3”
CONNECT BY PRIOR Tno = SupNo;

Tname

Tno

Title

City

Clark

T4

PhD

Liverpool

Adams

T5

MSc

Bristol

Uwaga:

Jednoczesne użycie frazy ORDER BY zakłóci hierarchiczny porządek wierszy w wyniku zapytania.

background image

#76

© K.Goczyła

Wstawianie danych z innych tablic

Wstawianie danych z innych tablic

(Oracle)

(Oracle)

Operację przepisania danych z jednej tablicy do drugiej można połączyć z utworzeniem tej
drugiej tablicy. Schemat tej tworzonej tablicy wynika z listy wyboru instrukcji SELECT.

Przykład:

CREATE TABLE Students1 AS

SELECT *
FROM Students
WHERE SYear > 1990;

Ograniczenia (np.PRIMARY KEY, UNIQUE, NOT ULL lub inne) można
do tak utworzonej tablicy dodać później, instrukcją

ALTER TABLE tablica ADD CONSTRAINT ograniczenie

Np:

ALTER TABLE Students1

ADD CONSTRAINT kl_gl PRIMARY KEY (Sno);

background image

#77

© K.Goczyła

Wstawianie danych z innych tablic

Wstawianie danych z innych tablic

(

(

cd

cd

.)

.)

Przykład 1.

Pokaż nazwiska, identyfikatory i tytuły tych nauczycieli, którzy mieli zajęcia o łącznej długości
przekraczającej średnią łączną długość zajęć na jednego nauczyciela. Wynik uporządkuj

alfabetycznie wg nazwisk nauczycieli.

CREATE TABLE Tsum AS

SELECT Tno, SUM(Hours) Hsum

FROM TS
GROUP BY Tno;

SELECT Tname, Tno, Title

FROM Teachers
WHERE Tno IN

(SELECT Tno

FROM Tsum
WHERE Hsum >

(SELECT AVG(Hsum)

FROM Tsum))

ORDER BY Tname;

DROP TABLE Tsum;

background image

#78

© K.Goczyła

Wyra

Wyra

ż

ż

enia tablicowe

enia tablicowe

(Oracle)

(Oracle)

Rozbijania skomplikowanych zapytań na kilka prostszych można uniknąć, stosując
wyrażenia tablicowe we frazie FROM:

Przykład 1a:

CREATE TABLE Tsum AS

SELECT Tno, SUM(Hours) Hsum

FROM TS

GROUP BY Tno;

SELECT Tname, Tno, Title

FROM Teachers

WHERE Tno IN

(SELECT Tno

FROM Tsum
WHERE Hsum >

(SELECT AVG(Hsum)

FROM Tsum))

ORDER BY Tname;

DROP TABLE Tsum;

SELECT Tname, Tno, Title

FROM Teachers

WHERE Tno IN

(SELECT Tsum.Tno

FROM

(SELECT Tno, SUM(Hours) Hsum

FROM TS

GROUP BY Tno) Tsum

WHERE Hsum >

(SELECT AVG(Hsum)

FROM Tsum))

ORDER BY Tname;

background image

#79

© K.Goczyła

Wyra

Wyra

ż

ż

enia tablicowe

enia tablicowe

(cd.)

(cd.)

Przykład 2

Podaj procentowy udział każdego nauczyciela w łącznej liczbie zajęć i w łącznej sumie
godzin zajęć. Uporządkuj alfabetycznie wg identyfikatorów nauczycieli.

A.

CREATE TABLE Total AS

SELECT COUNT(*) Ile, SUM(Hours) Suma

FROM TS;

SELECT Tno, COUNT(*) / Ile*100 “% zajęć”, SUM(Hours) / Suma*100 “% godzin”

FROM TS, Total
GROUP BY Tno
ORDER BY Tno;

DROP TABLE Total;

SELECT a.Tno, a.Liczba / b.Ile*100 “% zajęć”, a.Godz / b.Suma “% godzin”

FROM

(SELECT Tno, COUNT(*) Liczba, SUM(Hours) Godz

FROM TS
GROUP BY Tno) a,

(SELECT COUNT(*) Ile, SUM(Hours) Suma

FROM TS) b

ORDER BY a.Tno;

B.

background image

#80

© K.Goczyła

Sekwencje

Sekwencje

(Oracle)

(Oracle)

CREATE SEQUENCE <nazwa sekwencji>

[START WITH wartość]
[INCREMENT BY wartość
]
[MAXVALUE wartość
]
[MINVALUE wartość
]
[CYCLE | NOCYCLE]

Cel: Utworzenie obiektu typu sekwencja, służącego do automatycznego generowania

unikatowych wartości całkowitych (np. dla kluczy głównych) relacji.

Można określić:

• wartość początkową (START WITH); domyślnie: 1
• przyrost (INCREMENT BY); domyślnie: 1
• wartość maksymalną (MAXVALUE, jeśli przyrost jest dodatni); domyślnie: brak
• wartość minimalną (MINVALUE, jeśli przyrost jest ujemny); domyślnie: brak
• to, czy sekwencja ma mieć charakter cykliczny (CYCLE, jeśli podano

MAXVALUE lub MINVALUE); domyślnie: nie (NOCYCLE)

Sekwencja ma 2 pseudokolumny:

NEXTVAL - wartość następna (pobranie powoduje inkrementację)
CURRVAL - wartość bieżąca

background image

#81

© K.Goczyła

Sekwencje

Sekwencje

(

(

cd

cd

.)

.)

Przykład:

CREATE SEQUENCE numer_zam

START WITH 2 INCREMENT BY 2 MAXVALUE 100000;

...

INSERT INTO Zamowienia (numer, klient, data)

VALUES (numer_zam.NEXTVAL, ‘Jan Nowak’, SYSDATE);

INSERT INTO PozZam (numer_zam, lp, towar, ilosc)

VALUES (numer_zam.CURRVAL, 1, ‘dysk’, 20);

INSERT INTO PozZam (numer_zam, lp, towar, ilosc)

VALUES (numer_zam.CURRVAL, 2, ‘cd-rom’, 120);

INSERT INTO PozZam (numer_zam, lp, towar, ilosc)

VALUES (numer_zam.CURRVAL, 3, ‘toner’, 2);

Uwaga:

Na bieżącą wartość sekwencji (CURRVAL) jednego użytkownika
nie wpływa wywołanie NEXTVAL na tej samej sekwencji przez innego użytkownika.

background image

#82

© K.Goczyła

Relacyjna zupe

Relacyjna zupe

ł

ł

no

no

ść

ść

SQL

SQL

Definicja

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

Niech R i S są relacjami o atrybutach odpowiednio: A

1,

A

2,

..., A

n

i B

1

, B

2

, ..., B

k

.

Załóżmy dodatkowo, że dla operatorów UNION i MINUS relacje R i S są zgodne.

Algebra relacji

SQL

R UNION S

SELECT *

FROM R

UNION
SELECT *

FROM S

background image

#83

© K.Goczyła

Relacyjna zupe

Relacyjna zupe

ł

ł

no

no

ść

ść

SQL

SQL

(cd.)

(cd.)

Algebra relacji

SQL

R MINUS S

SELECT *

FROM R
WHERE NOT EXISTS

(SELECT *

FROM S
WHERE R.A

1

= S.B

1

AND

R.A

2

= S.B

2

AND ...

R.A

n

= S.B

n

)

R TIMES S

SELECT *

FROM R, S

SELECT R WHERE warunek

SELECT *

FROM R
WHERE warunek

PROJECT R OVER A

i,

A

j,

...

SELECT A

i

, A

j

, ...

FROM R

background image

#84

© K.Goczyła

5. Normalizacja relacyjnych

5. Normalizacja relacyjnych

baz danych

baz danych

Redundancja danych

Redundancja danych

Druga posta

Druga posta

ć

ć

normalna (2NF)

normalna (2NF)

Trzecia posta

Trzecia posta

ć

ć

normalna (3NF)

normalna (3NF)

Czwarta posta

Czwarta posta

ć

ć

normalna (4NF)

normalna (4NF)

background image

#85

© K.Goczyła

Normalizacja

Normalizacja

-

-

przegl

przegl

ą

ą

d

d

PARTICIPANTS (IDENT, NAME, CITY, INHAB, COURSE, GRADE)

Znaczenie: Student identyfikowany przez IDENT, o nazwisku NAME, pochodzący z miasta CITY
o liczbie mieszkańców INHAB ukończył kurs COURSE z oceną GRADE.

PARTICIPANTS

IDENT

NAME

CITY

INHAB

COURSE

GRADE

P1

Collins

London

8000000

English

A

P1

Collins

London

8000000

Geography C

P1

Collins

London

8000000

Logics

A

P2

Jones

Glasgow

400000

Geography B

P2

Jones

Glasgow

400000

Databases

C

P3

Rodin

Aberdeen

400000

Physics

B

P4

Thatcher

London

8000000

Logics

A

P4

Thatcher

London

8000000

Chemistry

C

P5

Biggs

Bristol

800000

Databases

A

P5

Biggs

Bristol

800000

English

A

P5

Biggs

Bristol

800000

Biology

A

background image

#86

© K.Goczyła

Normalizacja

Normalizacja

-

-

przegl

przegl

ą

ą

d

d

(cd.)

(cd.)

Tablica PARTICIPANTS wykazuje wiele niepożądanych cech wynikających z
redundancji (wiele danych jest powtórzonych). Na przykład:

• Jeśli chcemy zmienić liczbę mieszkańców miasta, musimy to uczynić w wielu
wierszach (inaczej baza danych utraci integralność)
• Jeśli usuwamy rekord (np. dane o kursancie P3 Rodin), możemy jako efekt uboczny

utracić pewne inne informacje (w tym wypadku informację o liczbie
mieszkańców miasta Aberdeen).

• Aby dodać informacje o nowym kursie, który ukończył dany kursant, musimy też

dodać informacje, które już istnieją w tablicy PARTICIPANTS:
nazwisko kursanta oraz nazwę i liczbę mieszkańców miasta, skąd pochodzi.

Są to anomalie aktualizacji, powodowane przez redundancję danych.

Celem normalizacji jest usunięcie redundancji tak, by jedna informacja była
przechowywana w bazie danych tylko jeden raz.

background image

#87

© K.Goczyła

Zale

Zale

ż

ż

no

no

ś

ś

ci funkcjonalne

ci funkcjonalne

R - relacja, X ,Y - różne atrybuty relacji R (być może złożone).

Definicja

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.

Diagramy F-D ilustrują zależności funkcjonalne. Diagram F-D dla relacji PARTICIPANTS:

IDENT

COURSE

CITY

NAME

GRADE

INHAB

Zależności funkcjonalne:

IDENT -> CITY
IDENT -> NAME
IDENT -> INHAB
CITY -> INHAB
(IDENT, COURSE) -> GRADE

background image

#88

© K.Goczyła

Druga posta

Druga posta

ć

ć

normalna

normalna

Relacja PARTICIPANTS zawiera także inne zależności funkcjonalne, np.:

(IDENT, COURSE) -> NAME
(IDENT, CITY) -> INHAB

zależności niepełne

Definicja

Atrybut Y zależy w pełni funkcjonalnie od atrybutu X (oznaczenie: X -> Y)

Y zależy funkcjonalnie od X i nie zależy funkcjonalnie od żadnego podzbioru właściwego X.

Definicja

Relacja jest w drugiej postaci normalnej (2NF)

• jest w 1NF,
• każdy atrybut niekluczowy zależy w pełni funkcjonalnie od klucza głównego.

Relacja PARTICIPANTS zawiera następujące niepełne zależności funkcjonalne:

IDENT -> NAME
IDENT -> CITY
IDENT -> INHAB

zatem nie jest w 2NF.

background image

#89

© K.Goczyła

Druga posta

Druga posta

ć

ć

normalna

normalna

-

-

przyk

przyk

ł

ł

ad

ad

Relację PARTICIPANTS możemy sprowadzić do 2NF droga dekompozycji (projekcji) na dwie relacje:

PART_COURSE (IDENT REF PART_DATA, COURSE, GRADE)
PART_DATA (IDENT, NAME, CITY, INHAB)

Diagramy F-D:

PART_DATA

PART_COURSE

IDENT

COURSE

GRADE

IDENT

CITY

NAME

INHAB

background image

#90

© K.Goczyła

Druga posta

Druga posta

ć

ć

normalna

normalna

-

-

przyk

przyk

ł

ł

ad

ad

(cd.)

(cd.)

PART_DATA

PART_COURSE

IDENT

NAME

CITY

INHAB

P1

Collins

London

8000000

P2

Jones

Glasgow

400000

P3

Rodin

Aberdeen

400000

P4

Thatcher

London

8000000

P5

Biggs

Bristol

800000

IDENT

COURSE

GRADE

P1

English

A

P1

Geography C

P1

Logics

A

P2

Geography B

P2

Databases

C

P3

Physics

B

P4

Logics

A

P4

Chemistry

C

P5

Databases

A

P5

English

A

P5

Biology

A

Relacja PART_DATA nadal wykazuje pewną redundancję: Jeśli kilku uczestników pochodzi z tego
samego miasta, liczba mieszkańców będzie się powtarzać.

Przyczyną tego jest fakt, że atrybut INHAB zależy funkcjonalnie od atrybutu niekluczowego CITY.

background image

#91

© K.Goczyła

Trzecia posta

Trzecia posta

ć

ć

normalna

normalna

Definicja

Zależność funkcjonalna X -> Y jest przechodnia

istnieje atrybut Z (Z

≠ X, Z ≠ Y) taki, że X -> Z i Z -> Y.

W relacji PART_DATA: X to IDENT, Y to INHAB, Z to CITY. W tej relacji istnieje zatem
przechodnia zależność funkcjonalna atrybutu INHAB od IDENT. Narusza to definicję 3NF:

Definicja

Relacja jest w trzeciej postaci normalnej (3NF)

• jest w 2NF,
• żaden atrybut niekluczowy nie zależy przechodnio od od klucza głównego.

IDENT

CITY

NAME

INHAB

ta część diagramu F-D
narusza 3NF

background image

#92

© K.Goczyła

Trzecia posta

Trzecia posta

ć

ć

normalna

normalna

-

-

przyk

przyk

ł

ł

ad

ad

Relację PART_DATA możemy sprowadzić do 3NF drogą dekompozycji (projekcji) na dwie relacje:

PART_ID (IDENT, NAME, CITY REF CITIES)
CITIES (CITY, INHAB)

Końcowe diagramy F-D:

PART_ID

IDENT

CITY

NAME

PART_COURSE

IDENT

COURSE

GRADE

CITIES

CITY

INHAB

background image

#93

© K.Goczyła

Trzecia posta

Trzecia posta

ć

ć

normalna

normalna

-

-

przyk

przyk

ł

ł

ad

ad

(cd.)

(cd.)

PART_ID

PART_COURSE

IDENT

COURSE

GRADE

P1

English

A

P1

Geography C

P1

Logics

A

P2

Geography B

P2

Databases

C

P3

Physics

B

P4

Logics

A

P4

Chemistry

C

P5

Databases

A

P5

English

A

P5

Biology

A

IDENT

NAME

CITY

P1

Collins

London

P2

Jones

Glasgow

P3

Rodin

Aberdeen

P4

Thatcher

London

P5

Biggs

Bristol

CITIES

CITY

INHAB

London

8000000

Glasgow

400000

Aberdeen

400000

Bristol

800000

background image

#94

© K.Goczyła

Posta

Posta

ć

ć

normalna

normalna

Boyce'a

Boyce'a

-

-

Codda

Codda

Przykład:

OSOBY(Pesel, Paszport, Nazwisko)

Załóżmy, że jedna osoba może mieć tylko jeden paszport.
Zatem w realcji OSOBY istnieją 2 klucze kandydujące: Pesel i Paszport.

Diagram zależności funkcjonalnych:

Pesel

Paszport

Nazwisko

W relacji OSOBY Istnieją zależności przechodnie, niezależnie od wyboru klucza głównego:

Paszport -> Pesel -> Nazwisko
Pesel -> Paszport -> Nazwisko

Ale czy jest tu jakaś redundancja?

background image

#95

© K.Goczyła

Posta

Posta

ć

ć

normalna

normalna

Boyce'a

Boyce'a

-

-

Codda

Codda

(cd.)

(cd.)

Wyznacznik relacji

Atrybut relacji (być może – złożony), od którego w pełni funkcjonalnie zależy inny
atrybut tej relacji.

Wyznacznik

Atrybut

Definicja postaci normalnej Boyce'a-Codda:

Relacja jest w postaci normalnej Boyce'a-Codda (BCNF) wtedy i tylko wtedy, gdy
każdy wyznacznik jest kluczem kandydującym.

W naszym przykładzie postać BCNF jest spełniona:

Pesel

Paszport

Nazwisko

background image

#96

© K.Goczyła

Posta

Posta

ć

ć

normalna

normalna

Boyce'a

Boyce'a

-

-

Codda

Codda

(

(

cd

cd

.)

.)

Postać BCNF jest silniejsza niż 2NF i 3NF:

Jeśli relacja spełnia BCNF, to spełnia 2NFi 3NF, ale nie na odwrót.

Przykład relacji relacji w 3NF, która nie jest w BCNF:

KODY_POCZTOWE (MIASTO, ULICA, KOD_POCZTOWY)

MIASTO

ULICA

KOD

POCZTOWY

KODY_POCZTOWE

background image

#97

© K.Goczyła

Zale

Zale

ż

ż

no

no

ś

ś

ci wielowarto

ci wielowarto

ś

ś

ciowe

ciowe

Relacja:

PERSONS (SSN, LANGUAGE, SPORT)

Znaczenie: Osoba identyfikowana przez SSN zna język LANGUAGE i uprawia sport SPORT.

Jedna osoba może znać wiele języków i uprawiać wiele sportów.

Klucz główny: (SSN, LANGUAGE, SPORT)

Niech osoba SSN = P1 zna angielski, fiński i francuski oraz uprawia piłkę nożną i narciarstwo.
Oto niektóre możliwe postaci relacji PERSONS:

PERSONS (1)

PERSONS (2)

SSN

LANGUAGE

SPORT

P1

English

football

P1

Finnish

football

P1

French

football

P1

English

skiing

P1

Finnish

skiing

P1

French

skiing

SSN

LANGUAGE

SPORT

P1

English

football

P1

Finnish

football

P1

French

skiing

Obie tablice są w 3NF (bo klucz główny składa się z wszystkich atrybutów), ale:
• W pierwszej tablicy występuje spora redundancja danych. Powoduje to problemy przy dodawaniu

i usuwaniu informacji o językach i sportach.

• W drugiej tablicy jest mniej redundancji, ale jeśli np. osoba P1 przestanie uprawiać narciarstwo,

nie możemy zwyczajnie usunąć odpowiedniego wiersza.

Powód anomalii: relacja PERSONS zawiera dwie zależności wielowartościowe.

background image

#98

© K.Goczyła

Zale

Zale

ż

ż

no

no

ś

ś

ci wielowarto

ci wielowarto

ś

ś

ciowe

ciowe

(cd.)

(cd.)

R - relacja, X ,Y, Z - różne atrybuty relacji R (być może złożone).

Definicja

Pomiędzy atrybutami X i Y zachodzi zależność wielowartościowa (oznaczenie: 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.

W relacji PERSONS:

SSN ->-> LANGUAGE (bo znajomość języków nie zależy od uprawianych sportów)
SSN ->-> SPORT

(bo uprawiane sporty nie zależą od znajomości języków)

Diagram F-D:

SSN

Language

Sport

background image

#99

© K.Goczyła

Zale

Zale

ż

ż

no

no

ś

ś

ci wielowarto

ci wielowarto

ś

ś

ciowe

ciowe

(cd.)

(cd.)

Zastrzeżenie o niezależności od innego atrybutu jest bardzo ważne. Rozważmy przykład:

PERS_LAN (SSN, LANGUAGE, HOURS)

o znaczeniu: Osoba identyfikowana przez SSN zna język LANGUAGE, którego się uczyła przez

HOURS godzin. Jedna osoba może znać wiele języków.

Występuje tu tylko jedna zależność wielowartościowa:

SSN ->-> LANGUAGE

Nie ma takiej zależności pomiędzy SSN i HOURS, gdyż HOURS zależy od (SSN, LANGUAGE).

Diagram F-D:

Language

Hours

SSN

background image

#100

© K.Goczyła

Czwarta posta

Czwarta posta

ć

ć

normalna

normalna

Definicja

Relacja jest w czwartej postaci normalnej (4NF)

jest w trzeciej postaci normalnej (3NF),

nie zawiera dwóch lub więcej zależności wielowartościowych.

Relacja PERSONS może być sprowadzona do 4NF drogą dekompozycji (projekcji) na 2 relacje:

PER_LAN (SSN, LANGUAGE)
PER_SPORT (SSN, SPORT).

Powstałe tablice wyglądają następująco:

PER_LAN

PER_SPORT

SSN

LANGUAGE

P1

English

P1

Finnish

P1

French

SSN

SPORT

P1

football

P1

skiing

background image

#101

© K.Goczyła

Normalizacja

Normalizacja

-

-

podsumowanie

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

BCNF odpowiada 2NF i 3NF dla relacji o kilku kluczach kandydujących.

W każdym wypadku, sprowadzenie do danej postaci normalnej wymaga dekompozycji relacji na
kilka innych relacji drogą projekcji.

Uwaga:

Dla celów efektywnościowych czasami celowo pozostawia się relację w postaci nie w pełni
znormalizowanej. Rozważmy naszą przykładową relację PARTICIPANTS. Jeśli przy
podawaniu informacji o uczestnikach kursów zawsze obok nazwy miasta podajemy jego
liczbę mieszkańców, może być celowe pozostawienie relacji PART_DATA bez sprowadzania
jej do 3NF, tym bardziej że dane o liczbie mieszkańców zmieniają się wolno.
Należy jednak w takich wypadkach zawsze brać pod uwagę konsekwencje:

redundancję danych i anomalie aktualizacji

i starannie kontrolować takie sytuacje.

background image

#102

© K.Goczyła

Przetwarzanie transakcyjne

Przetwarzanie transakcyjne

S

0

S

1

S

2

S

3

S

4

S

5

T

5

T

6

T

2

T

1

T

4

T

3

stan logicznie spójny (integralny)

stan logicznie niespójny

Transakcja przeprowadza bazę danych

z jednego stanu spójnego do innego.

Po drodze mogą wystąpić stany niespójne.

Przetwarzanie transakcyjne gwarantuje, że
baza danych nie pozostanie w stanie niespójnym,
mimo przerwania transakcji (np. wskutek awarii
systemu lub błędu programu).

start transaction

abort

(rollback)

end transaction

(commit)

background image

#103

© K.Goczyła

Transakcje

Transakcje

-

-

cechy

cechy

tomicity (atomowość): Transakcja jest atomowa:
wykonuje się cała albo wcale.

onsistency (spójność): Transakcja przeprowadza bazę
danych z jednego stanu spójnego do innego stanu spójnego.

solation (izolacja): Transakcja wykonuje się w izolacji od innych
transakcji; czyli tak, jakby była wykonywana tylko ona.

urability (trwałość): Efekty wykonania transakcji są trwałe:
po zakończeniu wszystkie zmiany wykonane w trakcie
transakcji stają się permanentne.

background image

#104

© K.Goczyła

Transakcje

Transakcje

-

-

rozpoczynanie i zatwierdzanie

rozpoczynanie i zatwierdzanie

Początek transakcji:

dowolna instrukcja DML: INSERT, UPDATE, DELETE, SELECT

dowolna instrukcja DDL: CREATE, DROP, ALTER, GRANT, REVOKE

Uwaga:

Niektóre DBMS (np. DB2, Informix, Progress) udostępniają specjalne instrukcje
rozpoczynające transakcje, takie jak
DO TRANSACTION, BEGIN WORK, START TRANSACTION itp.

Zatwierdzanie transakcji:

COMMIT

Cel: Zatwierdzenie transakcji: zakończenie jej i uczynienie wszystkich zmian trwałymi.

Uwaga:

Niektóre DBMS (np.Oracle) w sposób niejawny wykonują COMMIT
przed i po każdej instrukcji DDL.

background image

#105

© K.Goczyła

Transakcje

Transakcje

-

-

wycofywanie

wycofywanie

Wycofywanie transakcji:

ROLLBACK [TO SAVEPOINT nazwa]

Cel: Wycofanie i zakończenie całej transakcji lub - opcjonalnie - wskazanie punktu

w transakcji, do którego należy się wycofać.

Uwagi:

1. Wycofanie transakcji nie oznacza cofnięcia się do poprzednio wykonywanych instrukcji!

Oznacza wycofanie skutków wykonania instrukcji wchodzących w skład
wycofywanej transakcji.

2. W razie wystąpienia błędu podczas transakcji (nieprzechwycony przez aplikację błąd

instrukcji SQL, błąd aplikacji, błąd systemu) DBMS niejawnie wykonuje ROLLBACK,
wycofując całą transakcję, w której wstąpił błąd.

background image

#106

© K.Goczyła

Transakcje

Transakcje

-

-

wycofywanie

wycofywanie

(cd.)

(cd.)

Definiowanie punktów wycofania:

rollback to A commit

savepoint A

start

SAVEPOINT nazwa

Cel: Określenie miejsca w transakcji, do którego można się potem wycofać

instrukcją ROLLBACK TO SAVEPOINT.

Przykład:

UPDATE Prac

SET płaca = ...

WHERE ident = ‘Id01’;

SAVEPOINT S1;
UPDATE Prac

SET płaca = ...

WHERE ident = ‘Id02’;

SAVEPOINT S2;

...

SELECT SUM(płaca) FROM Prac

WHERE ...;

...
ROLLBACK TO SAVEPOINT S1;
UPDATE Prac

SET płaca = ...

WHERE ident = ‘Id02’;

COMMIT;

background image

#107

© K.Goczyła

Obs

Obs

ł

ł

uga wsp

uga wsp

ó

ó

ł

ł

bie

bie

ż

ż

no

no

ś

ś

ci

ci

Transakcja A

Transakcja B

READ Konto

----------

Konto = Konto + X

----------

WRITE Konto

----------

---------

READ Konto

---------

Konto = Konto + Y

---------

WRITE Konto

t1

t2

t3

t4

t5

t6

Gdzie są

moje

pieniądze?

background image

#108

© K.Goczyła

Isolation

Isolation

Phenomena

Phenomena

(1)

(1)

LOST UPDATE

t

Trans_A

Trans_B

t1

...

Read

t2

Read

...

t3

Change

...

t4

...

Change

t5

Commit

...

t6

...

Commit

The change made by Trans_A has been lost.

background image

#109

© K.Goczyła

Isolation

Isolation

Phenomena

Phenomena

(2)

(2)

DIRTY READ

t

Trans_A

Trans_B

t1

Read

...

t2

Change

...

t3

...

Read

t4

Rollback

...

t5

...

Commit

Trans_B sees data changed by Trans_A and bases its work on the
value of these data. But Trans_A rolls back its work, so the change
really never happened.

background image

#110

© K.Goczyła

Isolation

Isolation

Phenomena

Phenomena

(3)

(3)

NON-REPEATABLE READ

t

Trans_A

Trans_B

t1

...

Read

t2

Read

...

t3

...

Change

t4

Read

...

t5

...

Commit

t6

Commit

...

Trans_A may suppose that it reads the same row twice. The second time, though,
the values in the row will be different.

Note: This problems is not so serious as Lost Update or Dirty Read,

but breaks the requirement of ACID transactions.

background image

#111

© K.Goczyła

Isolation

Isolation

Phenomena

Phenomena

(4)

(4)

PHANTOM ROWS

t

Trans_A

t1

SELECT * FROM t

WHERE col=5;

t2

t3

t4

SELECT * FROM t

WHERE col=5;

At the beginning (t = t1) , Trans_A does not see some rows that it sees later (t = t4),
because Trans_B has added or updated them.

Note: This problems is not so serious as Lost Update or Dirty Read,

but breaks the requirement of ACID transactions.

Trans_B

INSERT INTO t (col)

VALUES (5);

UPDATE t SET col = 5

WHERE col = 6;

background image

#112

© K.Goczyła

Isolation

Isolation

Levels

Levels

(SQL

(SQL

-

-

99)

99)

Isolation levels of transactions are controlled by SET TRANSACTION statement:

SET TRANSACTION <access mode> ISOLATION LEVEL <isolation level>

This statement tells DBMS what sort of isolation phenomena is intolerable for the next transaction.

Access modes

READ ONLY

READ WRITE (default)

Isolation levels

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

background image

#113

© K.Goczyła

Access

Access

Modes

Modes

READ ONLY

Tells DBMS that all statements in the upcoming transaction will be read statements
(they do not make any changes).

READ WRITE

(default)

Tells DBMS that the statements in the upcoming transaction will be either reads or writes.

Specifying READ ONLY may result in performance gain:

• If all current transactions are READ ONLY, no locks have to be used,

• For such transactions DBMS can make a temporary copy of the rows they fetch

and all SELECTs are performed on this copy, with no conflicts with other transactions.

READ ONLY is especially good for report writers, screen displayers, file dumps, …

Note:

For READ UNCOMMITTED isolation level READ ONLY is the only legal option.

background image

#114

© K.Goczyła

Isolation

Isolation

Levels

Levels

READ UNCOMMITTED

Lowest level of isolation. It implies READ ONLY access mode.

Meaning:

“Allow reading of rows which have been written by other transactions,
but not yet committed”.

Possible:

Dirty Reads, Non-Repeatable Reads, Phantoms

Not possible:

Lost Updates (as changes are not allowed at all).

The highest level of concurrency (no locks are issued); concurrency checking is turned off.

Good choice for slow transactions and transactions which can tolerate small errors,
e.g. SELECT COUNT (*); from large tables. Also reports in which we don’t care about details.

concurrency

isolation

background image

#115

© K.Goczyła

Isolation

Isolation

Levels

Levels

(

(

ctd

ctd

.)

.)

READ COMMITTED

Meaning:

“Allow reading of rows written by other transactions

only after they have been committed”.

Possible:

Non-Repeatable Reads, Phantoms

Not possible:

Lost Updates, Dirty Reads.

Ensures reasonably high level of concurrency: shared locks must be made,
but they can be released again before the transaction ends.

Good compromise between the level of isolation among concurrent transactions
and performance.

Default isolation level in some DBMSs.

isolation

concurrency

background image

#116

© K.Goczyła

Isolation

Isolation

Levels

Levels

(

(

ctd

ctd

.)

.)

REPEATABLE READ

Meaning:

“Do not tolerate non-repeatable reads”.

Possible:

Phantoms

Not possible:

Lost Updates, Dirty Reads, Non-Repeatable Reads.

The concurrency drops sharply, as shared locks obtained during the transaction are kept
until the transaction terminates.

This is a preferable level in multi-statements transactions that involve changes.

concurrency

isolation

background image

#117

© K.Goczyła

Isolation

Isolation

Levels

Levels

(

(

ctd

ctd

.)

.)

SERIALIZABLE

(default in SQL standard)

Meaning:

“Make the transactions serializable”.

Possible:

None

Not possible:

Lost Updates, Dirty Reads, Non-Repeatable Reads, Phantoms

The highest level of isolation, and the lowest level of concurrency.
Often performed by DBMSs as locking whole tables. The only level that guarantees safe,
error-free transactions every time.

If the transactions in an application are all short (fast-executing, affecting only a few records),
they all may be executed as SERIALIZABLE.

concurrency

isolation

background image

#118

© K.Goczyła

Zasady budowy transakcji w aplikacjach

Zasady budowy transakcji w aplikacjach

Transakcje w RDBMS:

pochłaniają zasoby systemowe (dodatkowa pamięć i czas DBMS)
ograniczają współbieżność w dostępie do danych

przez wielu użytkowników

¾

Transakcje powinny trwać możliwie krótko

¾

Powinny być wykonywane na możliwie najniższym poziomie izolacji

(ale na wystarczającym dla zachowania poprawności transakcji!).
Np. nie należy niepotrzebnie stosować poziomu SERIALIZABLE tam,
gdzie wystarczy READ COMMITTED.

¾

Interakcje z użytkownikiem powinny przebiegać poza transakcjami.

background image

#119

© K.Goczyła

Zasady budowy transakcji w aplikacjach (

Zasady budowy transakcji w aplikacjach (

cd

cd

.)

.)

Załóżmy, że w ramach aplikacji bazodanowej użytkownik aktualizuje dane w bazie
danych w zależności od aktualnych wartości innych lub tych samych danych.

Typowy schemat postępowania:

1.

Odczytanie wartości danych z bazy danych.

2.

Wyświetlenie ich użytkownikowi.

3.

Użytkownik podaje wartości danych dla transakcji.

4.

Przeprowadzenie transakcji (aktualizacja danych w bazie danych).

Problemy:

‰

Krok nr 3 może trwać bardzo długo, dlatego nie należy kroków 1.-4. ujmować
w jedną transakcję.

‰

Jeśli transakcję rozpoczniemy między krokiem 3. a 4., to nie mamy
gwarancji, że dane, na podstawie których użytkownik ustalił dane dla
transakcji, nie zostały w międzyczasie zmienione przez innego użytkownika.

background image

#120

© K.Goczyła

Zasady budowy transakcji w aplikacjach (

Zasady budowy transakcji w aplikacjach (

cd

cd

.)

.)

Najprostsza sytuacja:

Użytkownik zmienia te same dane, na podstawie których podejmuje decyzję
o zmianie. Jeśli te dane są zawarte tylko w jednej tablicy, wówczas można
w ogóle obyć się bez trybu transakcyjnego (pojedyncza instrukcja SQL jest
zawsze atomowa – tzw. tryb autocommit):

1. SELECT id, pole1, pole2, ...

FROM Tablica
WHERE id = klucz ;

2.

Wyświetlenie wartości pole1, pole2, ....

3.

Ustalenie przez użytkownika nowych wartości pól pole1, pole2, ...

4. UPDATE Tablica

SET pole1 = <nowa wartość1>,

pole2 = <nowa wartość2>, ...

WHERE id = klucz AND pole1 = <stara wartość1>

AND pole2 = <stara wartość2> AND ... ;

background image

#121

© K.Goczyła

Zasady budowy transakcji w aplikacjach (

Zasady budowy transakcji w aplikacjach (

cd

cd

.)

.)

W ogólnym przypadku:

Po ustaleniu przez użytkownika wartości danych dla transakcji należy rozpocząć
transakcję, w ramach której trzeba sprawdzić, czy dane uprzednio pobrane
z bazy danych i wyświetlone użytkownikowi nie uległy w międzyczasie zmianie.

1. SELECT id, pole1, pole2, ...

FROM Tablica
WHERE id = klucz ;

2.

Wyświetlenie wartości pole1, pole2, .... i zapamiętanie ich.

3.

Ustalenie przez użytkownika wartości danych dla transakcji.

4. START TRANSACTION
5. SELECT id, pole1, pole2, ...

FROM Tablica
WHERE id = klucz ;

6.

Porównanie wartości pole1, pole2, .... z wartościami zapamiętanymi

7.

Jeśli są takie same, to wykonanie aktualizacji i COMMIT.
Jeśli są inne, to COMMIT (albo ROLLBACK) i stosowny komunikat do
użytkownika.

background image

#122

© K.Goczyła

Zasady budowy transakcji w aplikacjach (

Zasady budowy transakcji w aplikacjach (

cd

cd

.)

.)

Uwaga:

Aby ten schemat zadziałał na pewno poprawnie, poziom izolacji transakcji
musi być ustawiony (instrukcją SET TRANSACTION) przynajmniej na
REPEATABLE READ, a jeśli DBMS na to nie pozwala, to na SERIALIZABLE.
W przeciwnym razie nie mamy gwarancji, że między krokami 5 i 7 dane
nie ulegną zmianie.
Inną możliwością jest skorzystanie z opcji FOR UPDATE instrukcji SELECT,
dostępnej w niektórych DBMS. Opcja ta powoduje zablokowanie danych
wybranych instrukcją SELECT przed jakimikolwiek zmianami.

W językach typu 4GL opcja FOR UPDATE odpowiada opcji SHARED LOCK
w instrukcji READ lub podobnej.

...

4. START TRANSACTION
5. SELECT id, pole1, pole2, ...

FROM Tablica
WHERE id = klucz
FOR UPDATE ;

...

background image

#123

© K.Goczyła

Ochrona danych

Ochrona danych

Pełny dostęp

Tylko odczyt

Brak dostępu

background image

#124

© K.Goczyła

Security

Security

in

in

SQL

SQL

-

-

Views

Views

Two ways of security control supported directly in SQL:

• views mechanism

• GRANT and REVOKE statements

Views can be used to hide sensitive data from unauthorised users.

Example 1:

Assume that information where students live (see table STUDENTS)
should be hidden from some users. We can create a view:

CREATE VIEW Stud

AS SELECT Sno, Sname, Syear

FROM Students;

and then we can GRANT specific rights on Stud to those users,
REVOKEing from them all rights on Students.

background image

#125

© K.Goczyła

Security

Security

in

in

SQL

SQL

-

-

Views

Views

(

(

ctd

ctd

.)

.)

Example 2:

We do not want the detailed information about teachings (table TS) to be
commonly available. Instead we offer an ordered summary for each teacher.
We can create a view:

CREATE VIEW TeachingSummary

(Tno, SumHours)
AS SELECT Tno, SUM(Hours)

FROM TS
GROUP BY Tno
ORDER BY Tno;

and establish access rights as desired.

background image

#126

© K.Goczyła

Security

Security

in

in

SQL

SQL

-

-

GRANT, REVOKE

GRANT, REVOKE

Granting rights:

GRANT { ALL | <right list> }

ON <table or view name>
TO { PUBLIC | <user list> }
[ WITH GRANT OPTION ]

This statements grants either all (if ALL) or only specific access rights on the specified table
or view for all users (if PUBLIC) or only for those that are listed on the user list.

WITH GRANT OPTION

- allows a grantee to grant the rights to other users

The <right list> may contain:

• ALTER

- to execute ALTER TABLE statement

• INDEX

- to execute CREATE INDEX statement

• DELETE

- to execute DELETE FROM statement

• SELECT [<column list>]

- to execute SELECT statement (on specific columns)

• INSERT [<column list>]

- to execute INSERT INTO statement (on specific columns)

• UPDATE [<column list>]

- to execute UPDATE statement (on specific columns)

• REFERENCES [<column list>] - to define CONSTRAINTs (on specific columns)

Note: In some DBMSs (compatible with SQL 92) <column list> may be valid only for UPDATE right.

background image

#127

© K.Goczyła

Security

Security

in

in

SQL

SQL

-

-

GRANT,

GRANT,

REVOKE

REVOKE

Revoking rights:

REVOKE { ALL | <right list> }

ON <table or view name>
FROM { PUBLIC | <user list> }

This statement is symmetric to GRANT.

Example:

We want to revoke from all users all rights given before on Teachers, then grant rights to
SELECT and INDEX for each user and to UPDATE specific columns only for some users
(with the right to grant them to other users).

REVOKE ALL

ON Teachers
FROM PUBLIC;

GRANT SELECT, INDEX

ON Teachers
TO PUBLIC;

GRANT UPDATE (Title, City, SupNo)

ON Teachers
TO John, Helen
WITH GRANT OPTION;

background image

#128

© K.Goczyła

Constraints

Constraints

(SQL

(SQL

-

-

99)

99)

Constraints enable DBMS automatically enforce logical integrity of a database.

Constraints may be:

table level constraints
column level constraints
domain constraints

Defining a constraint:

[ CONSTRAINT <constraint name> ]

constraint_type

[ constraint attributes ]

Each constraint has a name. If omitted, DBMS will automatically assign a name to a constraint.

background image

#129

© K.Goczyła

Constraint definition

Constraint definition

constraint_type ::=

<table constraint>
<column constraint>
<domain constraint>

<table constraint> ::=

UNIQUE constraint |
PRIMARY KEY constraint
FOREIGN KEY constraint
CHECK constraint

<column constraint> ::=

UNIQUE constraint |
PRIMARY KEY constraint
FOREIGN KEY constraint
NOT NULL constraint
CHECK constraint

<domain constraint> ::=

CHECK constraint

<constraint attributes> ::= { INITIALLY DEFERRED | INITIALLY IMMEDIATE }

{ [NOT] DEFERRABLE }

default:

INITIALLY IMMEDIATE NOT DEFERRABLE

background image

#130

© K.Goczyła

Constraint attributes

Constraint attributes

· Constraint check time specifies, when within a transaction the constraint is checked:

IMMEDIATEly (just after instruction execution) or
DEFERRED (at COMMIT time).

· Deferral mode specifies whether the constraint check time:

may be changed (DEFERRABLE) or

not may be changed (NOT DEFERRABLE) after it is initially set.

The change of the constraint check time is performed via SET CONSTRAINTS statement:

SET CONSTRAINTS { <constraint name list> | ALL }

{ DEFERRED | IMMEDIATE }

Note:

If deferred constraints are violated at commit time, the whole transaction will be rolled back
(COMMIT fails). If an immediate constraint is violated, only one SQL statement fails and
an SQLSTATE error is issued. The error may be captured by the program that issued
the statement (otherwise the transaction will be rolled back).

background image

#131

© K.Goczyła

Constraint attributes

Constraint attributes

-

-

Examples

Examples

1. A constraint NOT NULL for one column, initially immediate, deferrable,

CREATE TABLE Tab1 (

col1 SMALLINT

CONSTRAINT constr1 NOT NULL

DEFERRABLE INITIALLY IMMEDIATE,

col2 CHAR(16));

CREATE TABLE Tab1 (

col1 SMALLINT,
col2 CHAR(16)),
CONSTRAINT constr1

UNIQUE (col1, col2) DEFERRABLE INITIALLY DEFERRED);

2. A constraint UNIQUE for two columns, initially deferred, deferrable,

background image

#132

© K.Goczyła

PRIMARY KEY, FOREIGN KEY Constraints

PRIMARY KEY, FOREIGN KEY Constraints

Examples of typical usage:

CREATE TABLE Tab1 (

id INTEGER,
name

VARCHAR(64),

CONSTRAINT pr_key1 PRIMARY KEY (id));

CREATE TABLE Tab2 (

id INTEGER,
int_address

VARCHAR(256),

CONSTRAINT fr_key2 FOREIGN KEY (id) REFERENCES Tab1);

In this case, the REFERENCES clause in the second statement references the column
defined in Tab1 as the PRIMARY KEY column.

background image

#133

© K.Goczyła

PRIMARY KEY, FOREIGN KEY Constraints

PRIMARY KEY, FOREIGN KEY Constraints

A FOREIGN KEY clause may reference any unique column(s) of a table.

Example:

CREATE TABLE Tab1 (

col1

SMALLINT,

col2

VARCHAR(4),

col3

DATE,

CONSTRAINT pr_key1 PRIMARY KEY (col1, col2),
CONSTRAINT fr_key1 UNIQUE (col3) NOT DEFERRABLE);

CREATE TABLE Tab2 (

col1

SMALLINT,

col2

VARCHAR(4),

col3

DATE,

CONSTRAINT fr_key2 FOREIGN KEY (col3) REFERENCES Tab1(col3));

In this case, the REFERENCES clause in the second statement references a column
defined in Tab1 as a UNIQUE column.

background image

#134

© K.Goczyła

FOREIGN KEY Constraints

FOREIGN KEY Constraints

-

-

Referential actions

Referential actions

In a FOREIGN KEY constraint may be specified an action to be taken
ON DELETE and/or ON UPDATE, which specifies what to do with referenced table
when the primary key in the referencing table changes.

Possible actions:

• NO ACTION

- no action is taken (default)

• CASCADE

- the update or delete operation is cascaded from

the referenced table to the referencing table.

• RESTRICT

- the update or delete operation causes an SQLSTATE error

to be returned, if any matching row exists in the referencing table
(acts essentially the same as NO ACTION).

• SET NULL

- the update or delete operation causes the foreign key value

to be set to NULL.

• SET DEFAULT - the update or delete operation causes the foreign key value

to be set to its default value (if specified).

background image

#135

© K.Goczyła

Referential actions

Referential actions

-

-

Examples

Examples

Example 1:

CREATE TABLE Tab1 (

col1

SMALLINT DEFAULT 12,

CONSTRAINT ogr1 PRIMARY KEY (col1));

CREATE TABLE Tab2 (

col1

SMALLINT DEFAULT 15,

CONSTRAINT ogr2 FOREIGN KEY (col1) REFERENCES Tab1

ON UPDATE RESTRICT ON DELETE RESTRICT);

INSERT INTO Tab1 VALUES (10);
INSERT INTO Tab1 VALUES (15);
INSERT INTO Tab2 VALUES (10);

Each of the following statements will return an error:

UPDATE Tab1 SET col1 = 11 WHERE col1 = 10;
UPDATE Tab2 SET col1 = 11 WHERE col1 = 10;
INSERT INTO Tab2 VALUES(11);
DELETE FROM Tab1 WHERE col1 = 10;

background image

#136

© K.Goczyła

Referential actions

Referential actions

-

-

Examples

Examples

Example 2:

CREATE TABLE Tab1 (

col1

SMALLINT DEFAULT 12,

CONSTRAINT ogr1 PRIMARY KEY (col1));

CREATE TABLE Tab2 (

col1

SMALLINT DEFAULT 15,
CONSTRAINT ogr2 FOREIGN KEY (col1) REFERENCES Tab1

ON UPDATE CASCADE ON DELETE CASCADE);

INSERT INTO Tab1 VALUES (10);
INSERT INTO Tab1 VALUES (15);
INSERT INTO Tab2 VALUES (10);

Effect of the following statements will cascade down from Tab1 to Tab2:

UPDATE Tab1 SET col1 = 11 WHERE col1 = 10;

DELETE FROM Tab1 WHERE col1 = 10;

background image

#137

© K.Goczyła

CHECK Constraints

CHECK Constraints

CHECK constraint ::=

[ CONSTRAINT <constraint name> ]

CHECK (search condition)

[ <constraint attributes> ]

search condition

- an expression which may normally appear in a WHERE clause

of a SELECT statement (with some limitations and extensions)

Example 1:

A CHECK constraint on a table in CREATE TABLE

CREATE TABLE Tab1 (

col1 SMALLINT,
CONSTRAINT ogr1 CHECK (col1 < 400) NOT DEFERRABLE);

background image

#138

© K.Goczyła

CHECK Constraints

CHECK Constraints

Example 2:

A CHECK constraint on a column in CREATE TABLE

CREATE TABLE Tab1 (

col1 SMALLINT

CONSTRAINT ogr1 CHECK (col1 < 400)

NOT DEFERRABLE,

col2 CHAR(15)));

Example 3:

A CHECK constraint on a table in ALTER TABLE

ALTER TABLE Tab2

ADD CONSTRAINT ogr2 CHECK (col1 > 100 OR col2 = “hello”)

NOT DEFERRABLE INITIALLY IMMEDIATE;

background image

#139

© K.Goczyła

CHECK Constraints

CHECK Constraints

Example 4:

A CHECK constraint on a domain in CREATE DOMAIN

CREATE DOMAIN dom1 AS SMALLINT

CONSTRAINT ogr1 CHECK (VALUE IN (50, 100, 150));

Example 5:

A CHECK constraint on a domain in ALTER DOMAIN

ALTER DOMAIN dom1

ADD CONSTRAINT ogr2 CHECK (VALUE IS NOT NULL);

Example 6:

An inter-table CHECK constraint (may be not supported in many DBMSs):

ALTER TABLE tab1

ADD CONSTRAINT ogr3

CHECK (col1 > (SELECT MAX (col2) FROM Tab2)) NOT DEFERRABLE;

background image

#140

© K.Goczyła

Triggers

Triggers

Trigger (triggered procedure):

A piece of code that is implicitly invoked by DBMS when a specified event
(a triggering event) occurs in the database.

A typical specification of a trigger contains 3 elements:

• the name of the trigger
• a triggering events list
• an executable unit

Possible applications of triggered procedures:

• security (enforcing authorisation constraints or performing

data encryption and decryption);

• performance measurement (monitoring or tracing various database-related events);

• program debugging (monitoring changes to database fields and state variables);

• controlling stored record formats (e.g. compressing and decompressing);

• exception reporting

(e.g. "Warn me if the quantity in stock of any item goes below the danger level").

background image

#141

© K.Goczyła

Triggers

Triggers

in

in

SQL

SQL

-

-

99

99

-

-

Syntax

Syntax

CREATE TRIGGER <trigger name>

{ BEFORE | AFTER } <trigger event> ON <table name>
[ REFERENCING <old or new values alias list> ]
<triggered action>

• <trigger event> ::= INSERT |

DELETE |
UPDATE [ OF <trigger column list> ]

• <old or new values alias> ::=

OLD [ ROW ] [ AS ] <old values correlation name> |
NEW [ ROW ] [ AS ] <new values correlation name> |
OLD TABLE [ AS ] <old values table alias> |
NEW TABLE [ AS ] <new values table alias> |

• <triggered action> ::=

[ FOR EACH { ROW | STATEMENT} ] [ WHEN (<search condition>)]

<triggered SQL statement>

• <triggered SQL statement> ::=

<SQL statement> |
BEGIN ATOMIC {<SQL statement>;}… END

background image

#142

© K.Goczyła

Triggers

Triggers

in

in

SQL

SQL

-

-

99

99

-

-

Examples

Examples

1. We want to keep a log file (Books_deleted_log) containing data from rows

that have been deleted from the BOOKS table.

CREATE TRIGGER Books_delete

AFTER DELETE ON Books

REFERENCING OLD ROW AS Old

FOR EACH ROW

INSERT INTO Books_deleted_log

VALUES (Old.ISBN, Old.Title, Old.Author, Old.Editor);

2. When we add a new customer, we want the value of Home_telephone

to be the same as Work_telephone.

CREATE TRIGGER Customer_insert

BEFORE INSERT ON Customers

REFERENCING NEW ROW AS New

FOR EACH ROW

SET New.Home_telephone = New.Work_telephone;

background image

#143

© K.Goczyła

Triggers in SQL

Triggers in SQL

-

-

99

99

-

-

Examples

Examples

3. When we elect Bob as a president, we all get a 1% tax cut. On the other hand,

every change in taxes will affect the national debt and cause Bob’s popularity to drop.

CREATE TRIGGER President_update
AFTER UPDATE ON Presidents

REFERENCING OLD ROW AS Old, NEW ROW AS New

FOR EACH ROW

WHEN (New.Name = “Bob” AND New.Name <> Old.Name)

UPDATE Taxpayers

SET tax_payable = tax_payable * 0.99;

CREATE TRIGGER Taxpayer_update
AFTER UPDATE ON Taxpayers OF tax_payable

REFERENCING OLD ROW AS Old, NEW ROW AS New

FOR EACH STATEMENT

BEGIN ATOMIC

UPDATE National_debt

SET amount = amount * (Old.tax_payable / New.tax_payable)
WHERE Year = CURRENT_YEAR;

UPDATE Presidents

SET popularity = popularity – 0.01
WHERE Name = “Bob”;

END;

background image

#144

© K.Goczyła

Rozproszenie danych

Rozproszenie danych

Sieć komunikacyjna

B

A

Sieć komunikacyjna

1. Każdy węzeł może pracować autonomicznie
2. Węzły ustaliły zasady współpracy

background image

#145

© K.Goczyła

Rozproszone systemy baz danych

Rozproszone systemy baz danych

Główny problem:

Zachowanie zasady przezroczystości w warunkach

rozproszenia danych
fragmentacji danych
replikacji danych

Przezroczystość rozproszenia (lokalizacji)

Działania użytkownika (aplikacji) nie powinny być uzależnione
od faktycznej lokalizacji danych.

Przezroczystość fragmentacji

Działania użytkownika (aplikacji) nie powinny być uzależnione
od sposobu rozdzielenia danych pomiędzy węzły systemu.

Przezroczystość replikacji

Działania użytkownika (aplikacji) nie powinny być uzależnione
od sposobu replikowania danych.

background image

#146

© K.Goczyła

Fragmentacja danych

Fragmentacja danych

Fragmentacja danych

Rozdzielenie jednej relacji pomiędzy różne węzły systemu
rozproszonego w celu polepszenia efektywności

Fragmentacja pozioma

Rozdzielenie relacji wierszami

Fragmentacja pionowa

Rozdzielenie relacji kolumnami, z zachowaniem klucza głównego
na wszystkich węzłach

background image

#147

© K.Goczyła

Replikacja danych

Replikacja danych

Replikacja danych

Utrzymywanie kopii danych na różnych węzłach systemu
rozproszonego w celu polepszenia efektywności i dostępności.

Podstawowy problem:

Zachowanie integralności replikowanych danych (integralności
rozproszonego systemu baz danych) w warunkach aktualizacji
dokonywanych w wielu węzłach.

background image

#148

© K.Goczyła

Replikacja typu

Replikacja typu

read

read

-

-

only

only

Serwer główny

Serwery

docelowe

Serwery

docelowe

Jeden z serwerów systemu rozproszonego jest serwerem głównym, odpowiedzialnym
za dokonywanie aktualizacji. Repliki danych są przesyłane przez serwer główny
na serwery docelowe, na których są one widoczne dla użytkowników w postaci
tzw. migawek (ang. snapshot), aktualizowanych okresowo lub w sposób ciągły.

Jest to najprostszy i najłatwiejszy w zarządzaniu schemat replikacji.

background image

#149

© K.Goczyła

Replikacja typu

Replikacja typu

update

update

-

-

anywhere

anywhere

Sieć

Definicja

grupy

Wszystkie serwery mają prawo do aktualizacji replikowanych danych,
a także są odpowiedzialne za propagację aktualizacji do wszystkich replik,
rozmieszczonych na innych serwerach. Jeden z serwerów w grupie obsługującej
replikację przechowuje definicję grupy, zawierającą informacje o uczestniczących
w replikacji serwerach i o replikowanych danych.

Schemat ten jest znacznie bardziej skomplikowany w zarządzaniu niż schemat read-only.

background image

#150

© K.Goczyła

Zr

Zr

ó

ó

wnoleglenie przetwarzania

wnoleglenie przetwarzania

Medium komunikacyjne

. . .

. . .

. . .

P

1

D

1

P

2

P

n

M

n

M

2

M

1

D

n

D

2

Procesory

Pamięci RAM

Dyski

Architektura typu shared-nothing

background image

#151

© K.Goczyła

R

R

ó

ó

wnoleg

wnoleg

ł

ł

e przetwarzanie zapyta

e przetwarzanie zapyta

ń

ń

SQL

SQL

MERGE

SORT

DANE A

DANE

SELECT

SELECT

b)

a)

SORT

SORT

SORT

SORT

DANE B

DANE D

DANE C

SELECT

SELECT

SELECT

SPLIT

background image

#152

© K.Goczyła

Ewolucja technologii baz danych

Ewolucja technologii baz danych

Systemy

plików

Hierarchiczne

bazy danych

Sieciowe

bazy danych

Relacyjne

bazy danych

1980

1960

1970

1990

1. Systemy plików:

realizacja operacji plikowych; stanowią poziom fizyczny współczesnych baz danych
ISAM, CSAM, VSAM, WiSS, inne specjalizowane

2. Hierarchiczne bazy danych

dane organizowane są w struktury drzewiaste
IMS, System 2000, ...

3. Sieciowe bazy danych

dane organizowane są w dowolne struktury sieciowe (Codasyl)
IDS, Total, Adabas, IDMS, ...

4. Relacyjne bazy danych

dane organizowane są w relacje (zbiory krotek o ustalonej, prostej strukturze)
Oracle, Informix, DB2, Ingres, Progress, MSQL, ...

background image

#153

© K.Goczyła

Ewolucja technologii baz danych

Ewolucja technologii baz danych

?

Relacyjne

bazy danych

Bazy danych

nowej generacji

2000

1980

1990

2010

Bazy danych nowej generacji - motywacje:

nowe aplikacje baz danych:

CAD, CAM, CAP, CASE, DSS,
automatyzacja prac biurowych, kartografia,
multimedia, sztuczna inteligencja

niedostatki systemów tradycyjnych:

zbyt prosty model danych, nieodpowiedni do modelowania złożonych struktur
ograniczony, nierozszerzalny zestaw typów danych
ograniczone możliwości obliczeniowe
niedopasowanie pomiędzy językiem operowania danymi a językiem programowania
zbyt prosty model transakcji
brak pojęcia wersji
mała elastyczność w operowaniu schematem

background image

#154

© K.Goczyła

Diagramy zwi

Diagramy zwi

ą

ą

zk

zk

ó

ó

w encji

w encji

Wypożyczalnia wideo i DVD

background image

#155

© K.Goczyła

Ź

Ź

le zbudowane

le zbudowane

encje

encje

Książki

ISBN
Autor
Tytuł
Rok wyd.
Wiek autora

Książki

Autor
Tytuł
ISBN
Rok wyd.
Wiek autora

Atrybut „Wiek autora” zależy
od atrybutu, który nie jest
kluczem.

Atrybut „Wiek autora” zależy
od atrybutu, który jest
częścią klucza.


Document Outline


Wyszukiwarka

Podobne podstrony:
BD PG 08 wstep
BD2 LAB01 J Wikarek, bd 02 01 SQL
bd 02 01, SQL
BD2.LAB01.J.Wikarek bd 02 01, SQL
Zagadnienia zaliczenie, Studia PG, Semestr 08, Fundamenty Specjalne, Egzamin
08.Kultura polityczna, 12.PRACA W SZKOLE, ZSG NR 4 2008-2009, PG NR 5
transact sql, Analiza matematyczna, Analiza matematyczna, Analiza matematyczna cz2, BD wyklady, BD w
Zadanie 1 kolokwium 1 2007-08, Budownictwo PG, Semestr 3, Matematyka, Prace domowe-rozwiązania kół
CHAP1 Pg 01 08
bd ii cw1 podstawy jezyka sql
bd 08
pytania z fundamentow-2006, Studia PG, Semestr 08, Fundamenty Specjalne, Egzamin
BD T 01 SQL
08-tlen, Materiały PG, Nieorgana

więcej podobnych podstron