05 - sql (μέρος 3)

22
Βάσεις Δεδομένων Ι - 05 SQL – Μέρος 3 ο (Constraints & Joins) Φώτης Κόκκορας (MSc/PhD) Τμήμα Μηχανικών Πληροφορικής ΤΕ ΤΕΙ Θεσσαλίας

Upload: fotis-kokkoras

Post on 05-Jul-2015

259 views

Category:

Education


3 download

DESCRIPTION

Θεωρία και παραδείγματα σε SQL (μέρος 3). περιορισμοί (constraints), ξένα κλειδιά (foreign keys, FKs), κανόνες ακεραιότητας αναφορών (referencial integrity constraints), JOIN πινάκων DATABASE: https://dl.dropboxusercontent.com/u/2690181/myBeersDB.zip

TRANSCRIPT

Page 1: 05 - SQL (μέρος 3)

Βάσεις Δεδομένων Ι - 05

SQL – Μέρος 3ο (Constraints & Joins)

Φώτης Κόκκορας (MSc/PhD) Τμήμα Μηχανικών Πληροφορικής ΤΕ ΤΕΙ Θεσσαλίας

Page 2: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 2 - Βάσεις Δεδομζνων Ι

Πρόζθεηες Διαθάνειες ζε Προηγούμενα Θέμαηα ...ςε Διαγραφή Πλειάδων

Σεκαζηνινγία ηεο εληνιήο DELETE

Σηελ SQL, ε δηαγξαθή πιεηάδσλ (εγγξαθώλ) ιεηηνπξγεί ζε δύν ζηάδηα:

1) Σεκεηώλνληαη όιεο νη πιεηάδεο πνπ πιεξνύλ ηε ζπλζήθε (WHERE) δηαγξαθήο (εθόζνλ ππάξρεη)

2) Γηαγξάθνληαη όιεο νη πιεηάδεο πνπ ζεκεηώζεθαλ ζην ζηάδην (1).

Παπάδειγμα: Έζησ ν πίλαθαο Beers κε 10 εγγξαθέο θαη όηη ζέινπκε λα ζβήζνπκε ηηο

εγγξαθέο ηνπ πίλαθα Beers αλ είλαη πάλσ από 5. Απηόο ν έιεγρνο (είλαη νη εγγξαθέο πάλσ

από 5;) θαη ε απόθαζε ηνπ ηη ζα δηαγξαθεί γίλεηαη αξρηθά. Γειαδή ζηελ πξνθεηκέλε

πεξίπησζε ζα δηαγξαθνύλ όιεο νη θαηαρσξήζεηο.

Είναι λάθορ λα εηπσζεί όηη "κόιηο δηαγξαθνύλ νη 5 από ηηο 10 εγγξαθέο ηόηε ε ζπλζήθε παύεη λα

ηζρύεη, άξα ηειηθά ζηνλ πίλαθα Beers ζα κείλνπλ 5 εγγξαθέο".

Η αθξηβήο ζπκπεξηθνξά εμαξηάηαη από θάζε ζύζηεκα RDBMS θαη ζα πξέπεη λα ην

ειέγρεηε ζηε ηεθκεξίσζε ηνπ ζπζηήκαηνο.

Γηα παξάδεηγκα, ζηνλ MySQL Server δελ επηηξέπεηαη ζε κηα εληνιή DELETE ζε θάπνηνλ

πίλαθα, λα ππάξρεη ζπλζήθε ζην WHERE ηεο δήισζεο πνπ λα εκπιέθεη ηνλ ίδην πίλαθα! Η

αθόινπζε δήισζε πξνθαιεί error : DELETE FROM Beers WHERE 3< (SELECT count(name) FROM Beers);

Page 3: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 3 - Βάσεις Δεδομζνων Ι

Πρόζθεηες Διαθάνειες ζε Προηγούμενα Θέμαηα ...ςε εντολέσ UNION, INTERSECTION και DIFFERENCE

Παξόιν πνπ νη εληνιέο SELECT...FROM...WHERE δύλαηαη λα επηζηξέςνπλ πνιιαπιά

απνηειέζκαηα (κε ηελ έλλνηα όηη κηα πιεηάδα κπνξεί λα εκθαλίδεηαη πεξηζζόηεξεο

από κηα θνξέο ζηα απνηειέζκαηα), δελ ηζρύεη ην ίδην γηα ηηο UNION, INTERSECTION

θαη DIFFERENCE.

Απηέο νη εληνιέο επηζηξέθνπλ αιγεβξηθό ζύλνιν (set) θαη ζηα αιγεβξηθά ζύλνια

δελ κπνξεί κηα πιεηάδα λα επαλαιακβάλεηαη!

Όπσο έρεη εηπσζεί ζε παιαηόηεξα slides, αλ ζε έλα εξώηεκα SELECT δελ επηζπκνύκε

πηζαλέο επαλαιήςεηο πιεηάδσλ, ηόηε ρξεζηκνπνηνύκε ηνλ ηειεζηή DISTINCT.

Από καζεκαηηθήο ζθνπηάο (ζεσξία ζπλόισλ), ηα εξσηήκαηα SELECT επηζηξέθνπλ

bag (θαη όρη set). Τν bag (ή multiset) είλαη κηα γελίθεπζε ηεο έλλνηαο ηνπ set ζην

νπνίν έλα ζηνηρείν ηνπ ζπλόινπ επηηξέπεηαη λα ππάξρεη πεξηζζόηεξεο από κία θνξέο.

Ο ιόγνο ηεο δηαθνξεηηθήο αληηκεηώπηζεο είλαη νη επηδόζεηο:

Σηα εξσηήκαηα SELECT είλαη βνιηθόηεξν λα απνθεπρζεί ε απαινηθή πνιιαπιώλ εγγξαθώλ

θαζώο επηβαξύλεη αξθεηά ηελ δηαδηθαζία. Αλ ρξεηάδεηαη όκσο, ην δεηάκε κε DISTINCT.

Σηα εξσηήκαηα INTERSECTION θαη DIFFERENCE, γηα ιόγνπο απόδνζεο, πξνεγείηαη

ηαμηλόκεζε ησλ πιεηάδσλ, θάηη πνπ θαζηζηά ηελ απαινηθή ησλ πνιιαπιώλ εύθνιε ππόζεζε.

Page 4: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 4 - Βάσεις Δεδομζνων Ι

Περιοριζμοί (Constraints) Φξεζηκνπνηνύληαη γηα λα ...πεξηνξίζνπκε ην είδνο ησλ δεδνκέλσλ πνπ κπνξεί λα

κπνπλ ζε κηα ζηήιε ελόο πίλαθα. Τν πεξηνξηζκό επηβάιεη ην Σύζηεκα Γηαρείξηζεο

Βάζεσλ Γεδνκέλσλ (ΣΓΒΧ ή DBMS).

Η ζεκαζία ηνπο είλαη δσηηθή θαζώο αλ δελ ηνπο ρξεζηκνπνηήζνπκε (ηνπο παξέρεη

έηνηκνπο ην DBMS) ζα ππνρξεσζνύκε αξγόηεξα λα πινπνηήζνπκε πνιύπινθνπο

κεραληζκνύο ειέγρσλ ζην επίπεδν ηεο εθαξκνγήο πνπ ρξεζηκνπνηεί ηελ database.

ΓΔΝ είλαη θαζόινπ έμππλν λα μαλαθηηάμνπκε θάηη πνπ ην παξέρεη έηνηκν ην DBMS!!!

Οξίδνληαη είηε ζηε θάζε δεκηνπξγίαο ελόο πίλαθα (δει. ζηελ εληνιή CREATE TABLE)

ή εθ ησλ πζηέξσλ, κεηαβάιινληαο ηνλ πίλαθα (δει. κε δειώζεηο ALTER TABLE).

Οη θπξηόηεξνη πεξηνξηζκνί ζε επίπεδν ζηειώλ είλαη (αλαιύνληαη ζηε ζπλέρεηα):

NOT NULL: ην πεδίν πξέπεη λα έρεη νπσζδήπνηε ηηκή

DEFAULT: νξίδεη κηα ηηκή γηα ην πεδίν, ζε πεξίπησζε πνπ δελ δνζεί από ην ρξήζηε.

PRIMARY KEY: ην πεδίν (ή ηα πεδία) απνηειεί πξσηεύνλ θιεηδί ηνπ πίλαθα

UNIQUE: ην πεδίν πξέπεη λα έρεη ηηκή πνπ δελ επαλαιακβάλεηαη

ζην ίδην πεδίν άιιεο εγγξαθήο (πιεηάδαο)

FOREIGN KEY: ην πεδίν απνηειεί πξσηεύνλ θιεηδί ζε θάπνηνλ άιιν (ζπζρεηηδόκελν) πίλαθα

Ενδιαθέπον εδώ έσοςν οι μησανιζμοί ηήπηζηρ ηων πεπιοπιζμών ηος "ξένος κλειδιού".

CHECK: πεξηνξίδεη ηηο ηηκέο πνπ είλαη απνδεθηέο ζε έλα πεδίν

Page 5: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 5 - Βάσεις Δεδομζνων Ι

NOT NULL

Η ζηήιε πξέπεη νπσζδήπνηε λα πάξεη ηηκή. Άξα δελ κπνξεί λα γίλεη INSERT ή

UPDATE κηαο εγγξαθήο ρσξίο λα δνζεί ηηκή ζε ζηήιε πνπ έρεη πεξηνξηζκό NOT NULL.

...εθηόο θη αλ ην πεδίν έρεη επηπιένλ νξηζκέλε θαη DEFAULT ηηκή! (βι. επόκελν slide)

Παπάδειγμα δήισζεο ηνπ πεξηνξηζκνύ CREATE TABLE Beers (

name VARCHAR(45) NOT NULL,

manf VARCHAR(45) NOT NULL )

Page 6: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 6 - Βάσεις Δεδομζνων Ι

DEFAULT

Γελ πξόθεηηαη γηα πεξηνξηζκό, κε ηελ απζηεξή έλλνηα ηνπ όξνπ. Δίλαη κηα ηηκή πνπ

ζα κπεη ζηελ ζηήιε αλ δελ δνζεί άιιε ηηκή.

Παπάδειγμα δήισζεο ηνπ πεξηνξηζκνύ CREATE TABLE Drinker (

name VARCHAR(45) NOT NULL,

city VARCHAR(45) NOT NULL DEFAULT 'Larisa' )

Αλ δελ δίλεηαη ηηκή ζην city, ζα κπαίλεη απηόκαηα 'Larisa'.

Σε κεξηθά DBMS κπνξεί λα νξηζηνύλ σο DEFAULT ηηκέο, ζπλαξηήζεηο ζπζηήκαηνο

πνπ παξάγνπλ θάπνηα ηηκή (πρ ηελ ηξέρνπζα εκεξνκελία).

Πξνζνρή ζηηο ηδηαηηεξόηεηεο θάζε DBMS θαζώο ππάξρνπλ δηαθνξέο ζηνλ ηξόπν πνπ

γίλνληαη θάπνηα πξάγκαηα: http://www.w3schools.com/sql/sql_default.asp

Page 7: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 7 - Βάσεις Δεδομζνων Ι

PRIMARY KEY

Ο ξόινο ηνπ πξσηεύνληνο θιεηδηνύ είλαη λα πξνζδηνξίδεη κνλαδηθά θάζε εγγξαθή ζε

έλα πίλαθα. Γηα απηόλ ην ιόγν, θάζε πιεηάδα έρεη δηαθνξεηηθή ηηκή ζηε ζηήιε (ή ηηο

ζηήιεο) ηνπ πξσηεύνληνο θιεηδηνύ από θάζε άιιε πιεηάδα.

Τν πξσηεύνλ θιεηδί ΓΔΝ κπνξεί λα πάξεη ηηκή NULL.

Κάζε πίλαθαο πξέπεη λα έρεη έλα πξσηεύνλ θιεηδί.

Παπάδειγμα δήισζεο ηνπ πεξηνξηζκνύ

Γηα απιό πξσηεύνλ θιεηδί κηαο ζηήιεο: CREATE TABLE Beers (

name CHAR(20) PRIMARY KEY,

manf CHAR(20) )

Γηα ζύλζεην πξσηεύνλ θιεηδί: CREATE TABLE Sells (

bar CHAR(20),

beer VARCHAR(20),

price REAL,

PRIMARY KEY (bar, beer) );

Πεξηζζόηεξα ζην URL: http://www.w3schools.com/sql/sql_primarykey.asp

Page 8: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 8 - Βάσεις Δεδομζνων Ι

UNIQUE Ο πεξηνξηζκόο UNIQUE κνηάδεη κε απηόλ ηνπ πξσηεύνληνο θιεηδηνύ θαζώο δελ

επηηξέπεη ζε δύν πιεηάδεο κηαο ζρέζεο λα έρνπλ ίδηα ηηκή ζε απηό ην γλώξηζκα, πιελ

όκσο, ζε αληίζεζε κε ην πξσηεύνλ θιεηδί:

ε ζηήιε κε ηε ξύζκηζε UNIQUE κπνξεί λα πάξεη ηηκή NULL ζε πνιιέο πιεηάδεο

κπνξνύκε λα έρνπκε πνιιά επξεηήξηα ηύπνπ UNIQUE (αιιά κόλν έλα πξσηεύνλ θιεηδί)

Άπα:

θάζε PRIMARY KEY έρεη κέζα ηνπ θαη έλα πεξηνξηζκό ηύπνπ UNIQUE

ην UNIQUE δελ ππνθαζηζηά πιήξσο ην PRIMARY KEY

Παπάδειγμα δήισζεο ηνπ πεξηνξηζκνύ

Σε MySQL είλαη αλαγλσξίζηκε ζύληαμε όκνηα κε απηή ηνπ PRIMARY KEY.

Σην MySQL Workbench, ζηε ζρεδίαζε database, ην checkbox UQ παξάγεη ηε δήισζε: CREATE TABLE table1 (

id INT(11) NOT NULL ,

field1 VARCHAR(45) NULL ,

PRIMARY KEY (id) ,

UNIQUE INDEX table1col (field1 ASC) )

δειαδή θηηάρλεη έλα επξεηήξην κνλήο ζηήιεο πνπ δελ

επηηξέπεη πνιιαπιέο θαηαρσξήζεηο (εθηόο από NULL πνπ ζηελ πξνθεηκέλε επηηξέπεηαη).

Page 9: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 9 - Βάσεις Δεδομζνων Ι

FOREIGN KEY (FK) (1/6)

Πξόθεηηαη γηα ηνλ πην ζεκαληηθό πεξηνξηζκό ζε βάζεηο δεδνκέλσλ θαζώο επηηξέπεη

λα πινπνηήζνπκε κε βάζε απηόλ, μησανιζμούρ ακεπαιόηηηαρ δεδομένων, δει.

κεραληζκνύο πνπ ζα εμαζθαιίζνπλ όηη ηα δεδνκέλα ηεο database είλαη "ζωζηά".

Θα δνύκε ηη ζεκαίλεη ην "ζωζηά" ζηε ζπλέρεηα.

Σε κηα ζρέζε (πίλαθα) ηα foreign keys (μέλα θιεηδηά) είλαη γλσξίζκαηα (ζηήιεο) ηα

νπνία απνηεινύλ πξσηεύσλ θιεηδί ζε θάπνην άιιν πίλαθα ηεο ίδηαο database.

Γηα παξάδεηγκα, ζηελ myBeersDB ζηνλ πίλαθα Sells(bar, beer, price):

ην γλώξηζκα bar είλαη πξσηεύνλ θιεηδί ζηνλ πίλαθα Bars

ην γλώξηζκα beer είλαη πξσηεύνλ θιεηδί ζηνλ πίλαθα Beers

Πξνθαλώο δελ ππάξρεη αλάγθε ην όλνκα ησλ πεδίσλ πνπ είλαη foreign keys λα είλαη

ίδην κε απηό ησλ ζρεηηθώλ primary keys πεδίσλ. Δίλαη όκσο κηα πολύ καλή ηακηική

να δίνεηε ηα ίδια ονόμαηα γηα δηθή ζαο επθνιία αιιά θαη γηαηί πνιιά ΣΓΒΓ ην

αλαγλσξίδνπλ απηόκαηα θαη ζαο βνεζνύλ ζηε ζρεδίαζε.

Δίλαη επίζεο πξνθαλέο όηη ν ηύπνο ησλ πεδίσλ (foreign key θαη ζπζρεηηδόκελν

primary key) πξέπεη λα είλαη ίδηνο. Μόλν ηπρόλ ξύζκηζε AI (auto incremental) ζε

ηερλεηό primary key ΔΕΝ πξέπεη λα επαλαιακβάλεηαη ζηε δήισζε ηνπ foreign key.

Page 10: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 10 - Βάσεις Δεδομζνων Ι

FOREIGN KEY (2/6)

Τα foreign keys δειώλνληαη κέζσ ηεο δήισζεο REFERENCES πνπ κπαίλεη:

είηε κεηά ην όλνκα ηνπ γλσξίζκαηνο (εθόζνλ ην foreign key απνηειείηαη από έλα γλώξηζκα)

ή σο μερσξηζηή δήισζε ζην schema ηνπ πίλαθα κε ηελ αθόινπζε ζύληαμε

FOREIGN KEY (<λίστα γνωρισμάτων>) REFERENCES <relation> (<λίστα γνωρισμάτων>)

Παπάδειγμα CREATE TABLE Beers ( /* ο πίνακας ποσ ορίζει ηο πεδίο ποσ θα τρηζιμοποιηθεί ως foreign key */

name CHAR(20) PRIMARY KEY,

manf CHAR(20) );

/* πρώηος ηρόπος δήλωζης */

CREATE TABLE Sells ( /* ο πίνακας ποσ επανατρηζιμοποιεί ηο πεδίο name ηοσ Beers ως foreign key */

bar CHAR(20),

beer CHAR(20) REFERENCES Beers (name),

price REAL );

/* δεύηερος ηρόπος δήλωζης */

CREATE TABLE Sells ( /* ο πίνακας ποσ επανατρηζιμοποιεί ηο πεδίο name ηοσ Beers ως foreign key */

bar CHAR(20),

beer CHAR(20),

price REAL,

FOREIGN KEY (beer) REFERENCES Beers (name) );

Page 11: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 11 - Βάσεις Δεδομζνων Ι

FOREIGN KEY (3/6) Επιβολή Περιοριςμών Ξένου Κλειδιού – Κανόνεσ Ακεραιότητασ

Όηαλ ππάξρεη πεξηνξηζκόο μέλνπ θιεηδηνύ από ηε ζρέζε R (πνπ θηινμελεί

ην μέλν θιεηδί) ζηε ζρέζε S (πνπ νξίδεη ην πεδίν πνπ ρξεζηκνπνηείηαη σο

μέλν θιεηδί), δύν είλαη νη πηζαλνί θίλδπλνη γηα παξαβίαζε ηνπ πεξηνξηζκνύ:

Δληνιή INSERT ή UPDATE ζηε ζρέζε R (πνπ θηινμελεί ην μέλν θιεηδί) δίλεη ζην πεδίν μέλνπ

θιεηδηνύ ηηκή πνπ δελ ππάξρεη ζηε ζρέζε S (πνπ νξίδεη ην πεδίν ηνπ μέλνπ θιεηδηνύ).

π.ρ. ζηε ζρέζε Sells(bar,beer,price) δελ κπνξνύκε λα θαηαρσξήζνπκε εγγξαθή κε ηηκή ζην

bar πνπ δελ ππάξρεη ζηε ζρέζε Bars, ή/θαη κε ηηκή ζην beer πνπ δελ ππάξρεη ζηε ζρέζε Beers.

Γηαγξαθή ή κεηαβνιή (DELETE ή UPDATE) θάπνηαο πιεηάδαο (εγγξαθήο) ζηε ζρέζε S,

δεκηνπξγεί ζηελ R εγγξαθέο πνπ έρνπλ ηηκέο ζην μέλν θιεηδί πνπ δελ ππάξρνπλ!

π.ρ. ζηε ζρέζε Beers, δελ κπνξνύκε αλεμέιεγθηα λα δηαγξάςνπκε κηα πιεηάδα πνπ αθνξά ζε

κπύξα ηεο νπνίαο ην name ρξεζηκνπνηείηαη ζην πεδίν beer ηεο ζρέζεο Sells.

Σηελ ππώηη πεπίπηωζη ηα πξάγκαηα είλαη μεθάζαξα: ηέηνηνπ είδνπο εληνιή πξέπεη

λα απνξξηθζεί θαη απηό γίλεηαη απηόκαηα από ην ΣΓΒΓ, εθόζνλ δεισζεί θάηη ηέηνην.

Γελ ππάξρεη απάληεζε ζην ηη είλαη ζσζηό λα θάλνπκε γηα ηε δεύηεπη πεπίπηωζη.

Τν ζίγνπξν όκσο είλαη όηη ΠΡΕΠΕΙ λα θάλνπκε θάηη. Δίλαη θαζαξά ζέκα ηνπ ηη

ζέινπκε εκείο λα γίλεηαη θαη πξνθαλώο απηό ην θαζνξίδεη ε εθαξκνγή καο.

Οη 3+1 επηινγέο πνπ έρνπκε αλαιύνληαη ζηε ζπλέρεηα...

Page 12: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 12 - Βάσεις Δεδομζνων Ι

FOREIGN KEY (4/6)

Έζησ ην παξάδεηγκα όπνπ R=Sells(bar,beer,price) θαη S=Beers(name,θηι).

Σε πηζαλή εληνιή DELETE ή UPDATE ζηνλ πίλαθα Beers, ν πεξηνξηζκόο αθεξαη

όηεηαο μέλνπ θιεηδηνύ καο επηβάιεη λα θάλνπκε έλα από ηα αθόινπζα:

RESTRICT: απαγόξεπζε – ε κεηαβνιή απνξξίπηεηαη από ην ΣΓΒΓ

CASCADE: νη αιιαγέο πξνσζνύληαη θαη ζηελ ζρέζε Sells

Αλ έγηλε δηαγξαθή (DELETE) κπύξαο, ηόηε δηαγξάθνληαη από ηνλ Sells νη ζρεηηδόκελεο εγγξαθέο.

Αλ έγηλε κεηαβνιή (UPDATE) ζην name ηνπ Beers, αιιάδεη όκνηα ην πεδίν beer ηνπ Sells.

SET NULL: Σην πεδίν beer ησλ ζρεηηθώλ εγγξαθώλ ηνπ Sells κπαίλεη ε ηηκή NULL.

Κάπνην από ηα παξαπάλσ ζα γίλεηαη απηόκαηα από ην ΣΓΒΓ, αξθεί

λα έρεη δεισζεί "ηη", ζηε ζρεδίαζε ηεο database.

H 4ε επηινγή πνπ έρνπκε (είπακε ππάξρνπλ 3+1 επηινγέο) είλαη λα κελ θάλνπκε

ηίπνηε (NO ACTION) θαη λα ην επηηξέςνπκε λα γίλεη. Απηό σο επηινγή ζηέθεη κόλν αλ

ζε επίπεδν εθαξκνγήο, πινπνηήζνπκε εκείο κηα από ηηο παξαπάλσ 3 πνιηηηθέο.

Αληηιακβάλεζηε όηη αλ δελ θάλνπκε ηίπνηε (no action), ζα θαηαιήμνπκε κε κηα άρξεζηε

database, άξα ε 4ε επηινγή πθίζηαηαη κόλν ζεσξεηηθά, εθηόο θη αλ πινπνηήζεηε κόλνη ζαο

ζην επίπεδν ηεο εθαξκνγήο πνπ ζα ρξεζηκνπνηεί ηελ database, ηηο 3 ζσζηέο πνιηηηθέο πνπ

αλαθέξζεθαλ! Κάηι ηέηοιο είναι επίπονο και θα ζαρ βάλει ηεπάζηιο θόπηο σωπίρ λόγο!!!

Σε MySQL, ε InnoDB engine (ε default) ππνζηεξίδεη ηα παξαπάλσ, ε MyISAM όρη!

Page 13: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 13 - Βάσεις Δεδομζνων Ι

FOREIGN KEY (5/6)

Παπάδειγμα CASCADE:

Σε δηαγξαθή ηεο κπύξαο Budweiser από ηνλ Beers απηόκαηα ζα δηαγξαθνύλ θαη όιεο νη

πιεηάδεο ηνπ Sells πνπ έρνπλ beer='Budweiser'.

Σε κεηαβνιή ηεο κπύξαο Budweiser – έζησ αιιάδνπκε ην όλνκά ηεο ζε 'Bud' – απηόκαηα

ζα γίλεη ε ίδηα αιιαγή ζε όιεο ηηο πιεηάδεο ηνπ Sells πνπ έρνπλ beer='Budweiser'.

Παπάδειγμα SET NULL:

Σε δηαγξαθή ηεο κπύξαο Budweiser από ηνλ Beers απηόκαηα ζα κπεη ηηκή NULL ζην πεδίν

beer, ζε όιεο ηηο πιεηάδεο ηνπ Sells πνπ έρνπλ beer='Budweiser'.

Σε κεηαβνιή ηεο κπύξαο Budweiser – έζησ αιιάδνπκε ην όλνκά ηεο ζε 'Bud' – απηόκαηα

ζα κπεη ηηκή NULL ζην πεδίν beer, ζε όιεο ηηο πιεηάδεο ηνπ Sells πνπ έρνπλ beer='

Budweiser'.

Σπλήζσο, ζηηο πεξηπηώζεηο UPDATE ζέινπκε/βάδνπκε CASCADE ελώ ζηηο

πεξηπηώζεηο DELETE εμαξηάηαη θαζαξά από ην ηη ζέιεη ε εθαξκνγή κε

ζπλήζεηο επηινγέο ηα RESTRICT θαη CASCADE.

Page 14: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 14 - Βάσεις Δεδομζνων Ι

FOREIGN KEY (6/6) Πώσ ορίζουμε περιοριςμούσ ξένου κλειδιού

Σηε δήισζε μέλνπ θιεηδηνύ, επηηξέπεηαη λα νξίζνπκε ηηο πνιηηηθέο πνπ ζέινπκε λα

ηζρύνπλ, μερσξηζηά γηα ηηο δηαγξαθέο (DELETE) θαη ηηο κεηαβνιέο (UPDATE), σο εμήο:

ON DELETE <ενέργεια>

ON UPDATE <ενέργεια>

όπνπ <ενέργεια> ζε MySQL server είλαη έλα εθ ησλ RESTRICT, CASCADE, NO ACTION, SET NULL

Διέγμηε ηελ αθξηβή ζύληαμε πνπ ηζρύεη γηα ην ΣΓΒΓ πνπ ρξεζηκνπνηείηε.

Σε όια ηα slide ηνπ καζήκαηνο δίλεηαη πξνηεξαηόηεηα ζηε ζύληαμε ηνπ MySQL Server.

Παπάδειγμα από ηην myBeersBD

CREATE TABLE Sells (

bar VARCHAR(45) NOT NULL,

beer VARCHAR(45) NOT NULL,

price DECIMAL(3,2) NOT NULL,

PRIMARY KEY (bar, beer),

(ζυνέχεια δεξιά)

CONSTRAINT fk_Sells_Bars FOREIGN KEY (bar)

REFERENCES Bars(name)

ON DELETE RESTRICT

ON UPDATE CASCADE,

CONSTRAINT fk_Sells_Beers FOREIGN KEY (beer)

REFERENCES Beers(name)

ON DELETE RESTRICT

ON UPDATE CASCADE

)

Page 15: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 15 - Βάσεις Δεδομζνων Ι

Κανόνες Ακεραιόηηηας FK ζε Workbench

Σην MySQL Workbench, ηα μέλα

θιεηδηά νξίδνληαη εύθνια κε ηε

βνήζεηα ηνπ button πνπ

επηζεκαίλεηαη ζηελ εηθόλα.

Π.ρ. ην fk_Sells_Bars θηηάρλεηαη

σο εμήο:

A. παηάκε ην θίηξηλν button

B. θάλνπκε θιηθ ζην πεδίν πνπ απνηε-

ιεί μέλν θιεηδί, δει. ζην Sells.bar

C. θάλνπκε θιηθ ζην ίδην πεδίν αιιά

ζηνλ πίλαθα πνπ ην νξίδεη, δει. ζην Bars.name

Η δήισζε μέλνπ θιεηδηνύ απνζε-

θεύεηαη ζην schema ηεο ζρέζεο πνπ

ην πεξηέρεη (εδώ ζηε Sells).

Οη θαλόλεο αθεξαηόηεηαο ζην

παξαπάλσ μέλν θιεηδί ξπζκίδνληαη

από ηελ θαξηέια Foreign Keys ησλ ξπζκίζεσλ ηνπ πίλαθα Sells (βι. εηθόλα).

Page 16: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 16 - Βάσεις Δεδομζνων Ι

CHECK (ζε γνωρίζμαηα)

Μέζσ ηεο δήισζεο CHECK κπνξνύκε λα νξίζνπκε πεξηνξηζκνύο ζηηο ηηκέο πνπ

επηηξέπεηαη λα πάξεη κηα ζηήιε.

ύνηαξη: CHECK <συνθήκη>

Παπάδειγμα: CREATE TABLE Sells (

bar CHAR(20),

beer CHAR(20) CHECK ( beer IN (SELECT name FROM Beers)),

price REAL CHECK ( price <= 5.00 ) );

Τν πεδίν beer επηηξέπεηαη λα πάξεη ηηκέο από ηηο ηηκέο ηνπ πεδίνπ name ηνπ πίλαθα Beers.

Τν πεδίν price επηηξέπεηαη λα πάξεη ηηκέο ην πνιύ κέρξη 5.

Γειαδή, ε <συνθήκη> κπνξεί λα ρξεζηκνπνηεί ην όλνκα ηνπ πεδίνπ. Άιια όκσο πεδία

ή ζρέζεηο κπνξνύλ λα εκπιαθνύλ ζηελ ζπλζήθε κόλν ζε ππνεξώηεκα!

ΠΡΟΟΥΗ! Οη παξαπάλσ έιεγρνη εθαξκόδνληαη κόλν θαηά ην INSERT ή ην UPDATE

Παπάδειγμα #1: ην CHECK ( price <= 5.00 ) ειέγρεη θάζε λέα ηηκή θαη απνξξίπηεη ηελ

θαηαρώξεζε ή κεηαβνιή ηεο πιεηάδαο αλ ην price είλαη κεγαιύηεξν από 5.

Παπάδειγμα #2: ην CHECK ( beer IN (SELECT name FROM Beers)) ΔΕΝ ειέγρεηαη όηαλ κηα

κπύξα δηαγξάθεηαη (DELETE) από ηνλ πίλαθα Beers.

Γειαδή, είλαη ιάζνο λα ππνζέζεηε όηη αληηθαζηζηά ηνλ πεξηνξηζκό μέλνπ θιεηδηνύ!

Page 17: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 17 - Βάσεις Δεδομζνων Ι

CHECK (ως ζηοιχεία ζηο schema)

Δθηόο από γλσξίζκαηα νη δειώζεηο CHECK <συνθήκη> κπνξεί λα κπνπλ θαη σο

ζηνηρεία ζην schema κηαο ζρέζεο.

Όπσο θαη πξηλ, έηζη θαη εδώ:

ε <συνθήκη> κπνξεί λα αλαθέξεηαη απεπζείαο ζε νπνηνδήπνηε γλώξηζκα ηεο ζρέζεο.

Δκπινθή όκσο άιισλ ζρέζεσλ (θαη ησλ γλσξηζκάησλ ηνπο) απαηηεί ηε ρξήζε

ππνεξσηήκαηνο.

ε <συνθήκη> ειέγρεηαη όηη ηζρύεη κόλν θαηά ηε θάζε ηνπ INSERT θαη ηνπ UPDATE

Παπάδειγμα: CREATE TABLE Sells (

bar CHAR(20),

beer CHAR(20),

price REAL,

CHECK (bar = 'Caravan' OR price <= 5.00)

);

Γειαδή, κόλν ζην bar Caravan κπνξεί ε κπύξα λα θνζηίδεη πάλσ από 5!

Page 18: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 18 - Βάσεις Δεδομζνων Ι

JOINs (1/3)

Ο ηειεζηήο JOIN ρξεζηκνπνηείηαη ζε κηα έθθξαζε SQL όηαλ απεπζπλόκαζηε

ζε δεδνκέλα δύν πηλάθσλ θαη αμηνπνηεί θάπνηα ζρέζε πνπ ππάξρεη κεηαμύ

ζπγθεθξηκέλσλ γλσξηζκάησλ ησλ πηλάθσλ.

Έρνπκε ήδε αλαθέξεη έλαλ παξόκνηαο θύζεο ηειεζηή, ην ',' (θόκκα !!) κέζσ ηνπ

νπνίνπ δηαρσξίδνπκε ηνπο πίλαθεο ζηε ζύληαμε ηνπ ηειεζηή FROM.

Σηελ πξαγκαηηθόηεηα δελ ηνπο δηαρσξί-

δνπκε αιιά, όπσο έρνπκε πεη, ηνπο ζπλδπ-

άδνπκε (γηλόκελν ζρέζεσλ – βι. εηθόλα):

Υπελζπκίδεηαη όηη έρνπκε έιεγρν ζηηο

παξαγόκελεο πιεηάδεο βάδνληαο ηπρόλ

πεξηνξηζκό πνπ κπνξεί λα ππάξρεη κεηαμύ

πεδίσλ ζην WHERE ηκήκα κηαο SELECT

δήισζεο.

Γελ είλαη βέβαηα απηό ην JOIN! Ο ηειεζηήο JOIN δίλεη αθόκε κεγαιύηεξν έιεγρν ζην

πώο ζα ζπλδπαζηνύλ νη πιεηάδεο ησλ επί κέξνπο ζρέζεσλ.

Έζησ ινηπόλ νη ζρέζεηο R θαη S ηνπ ζρήκαηνο δεμηά....

Page 19: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 19 - Βάσεις Δεδομζνων Ι

JOINs (2/3)

JOIN (ή INNER JOIN)

Σηελ ηειηθή ζρέζε ζπκκεηέρνπλ

ΜΟΝΟ νη γξακκέο ησλ δύν

πηλάθσλ πνπ ζπζρεηίδνληαη.

Παξάδεηγκα: U = R JOIN S ON R.B=S.B

FULL JOIN (ή OUTER JOIN, ή FULL OUTER JOIN)

Σηελ ηειηθή ζρέζε ζπκκεηέρνπλ όιεο νη γξακκέο ησλ δύν πηλάθσλ,

αθόκε θη αλ κηα δελ ζπζρεηίδεηαη κε θάπνηα γξακκή ζηνλ άιιν πίλαθα.

Παξάδεηγκα: U = R FULL JOIN S ON R.B=S.B

αλ ππάξρεη ζπζρεηηζκόο (βι. 1ε γξακκή ζην παξάδεηγκα), ζηελ παξαγόκελε πιεηάδα ζπκκεηέ-

ρνπλ νη ηηκέο ησλ δύν πιεηάδσλ

αλ δελ ππάξρεη ζπζρεηηζκόο, ζπκκεηέρεη ε κία πιεηάδα θαη ηα ππόινηπα πεδία ζπκπιεξώλνληαη

κε NULL (βι. 2ε θαη 3ε γξακκή ζην παξάδεηγκα) – δει. απηό γίλεηαη θαη ζηνπο δύν πίλαθεο

Page 20: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 20 - Βάσεις Δεδομζνων Ι

JOINs (3/3)

LEFT JOIN (ή LEFT OUTER JOIN)

Σηελ ηειηθή ζρέζε ζπκκεηέρνπλ ΜΟΝΟ νη γξακκέο ηνπ ΑΡΙΣΕΡΟΤ πίλαθα, αζρέησο αλ

ζπζρεηίδνληαη ή όρη κε γξακκέο ηνπ άιινπ πίλαθα.

Παξάδεηγκα: U = R LEFT JOIN S ON R.B=S.B

RIGHT JOIN (ή RIGHT OUTER JOIN)

Σηελ ηειηθή ζρέζε ζπκκεηέρνπλ ΜΟΝΟ νη γξακκέο ηνπ ΔΕΞΙΟΤ πίλαθα, αζρέησο αλ

ζπζρεηίδνληαη ή όρη κε γξακκέο ηνπ άιινπ πίλαθα.

Παξάδεηγκα: U = R RIGHT JOIN S ON R.B=S.B

Page 21: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 21 - Βάσεις Δεδομζνων Ι

Παράδειγμα ζε myBeersDB

Πόζεο κπύξεο αξέζνπλ ζε θάζε drinker;

SELECT drinker, count(beer)

FROM likes

GROUP BY drinker;

Τν παξαπάλσ εξώηεκα δελ καο ιέεη ξεηά γηα ηνπο ππόινηπνπο

drinkers, αθόκε θη αλ ξσηήζνπκε σο εμήο:

SELECT name, count(beer)

FROM drinkers, likes

WHERE name=drinker

GROUP BY name;

Βάδνληαο όκσο LEFT JOIN:

SELECT name, count(beer)

FROM drinkers LEFT JOIN likes ON name=drinker

GROUP BY name;

έρνπκε απνηέιεζκα γηα όινπο ηνπο drinkers.

Page 22: 05 - SQL (μέρος 3)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 22 - Βάσεις Δεδομζνων Ι

Σην ζεκείν απηό νινθιεξώλεηαη ε παξνπζίαζε ησλ βαζηθώλ ζηνηρείσλ ηεο γιώζ-

ζαο SQL. Γελ ηελ έρνπκε θαιύςεη θαηά 100% - θάηη ηέηνην είλαη δύζθνιν αιιά

θπξίσο ρσξίο νπζία θαζώο ζα ήηαλ εμαηξεηηθά ρξνλνβόξν θαη ακθηβόινπ αμίαο.

Καιύςακε αλαιπηηθά εθείλα ηα ζηνηρεία πνπ απνηεινύλ βαζηθά εθόδηα γηα λα

αζρνιεζεί θαλείο ζνβαξά κε ηελ SQL θαη ην θπξηόηεξν, λα κπνξεί λα αληαπνθξη-

ζεί αμηνπξεπώο ζηηο απαηηήζεηο ελόο ηππηθνύ, κέζεο πνιππινθόηεηαο project. Η

ηξηβή κε ην αληηθείκελν θαη ε πεξαηηέξσ κειέηε ηεο εθάζηνηε ηεθκεξίσζεο ζα

ζαο δώζεη ηηο δηάθνξεο ιεπηνκέξεηεο πνπ ζε απηή ηε θάζε δελ έρνπλ ζεκαζία.

Να ηνληζηεί γηα κηα αθόκε θνξά όηη ππάξρνπλ κηθξνδηαθνξέο ζηε αθξηβή

ζύληαμε εληνιώλ κεηαμύ ησλ δηαθόξσλ ΣΓΒΓ. Σηα παξαδείγκαηα αθνινπζήζεθε

ν ηξόπνο ηνπ MySQL server. Αλ δνπιέςεηε ζε άιιε πιαηθόξκα νθείιεηε λα

ξίμεηε κηα καηηά ζηελ ηεθκεξίσζή ηεο (documentation) ώζηε λα δείηε ηπρόλ

δηαθνξέο. Οη έλλνηεο σο επί ησλ πιείζησλ είλαη ίδηεο – ε ζύληαμε ίζσο αιιάδεη!

Μηα γξήγνξε εηθόλα γηα ην ηη ηζρύεη ζηηο δηάθνξεο πινπνηήζεηο

ΣΓΒΓ δίλεη (πνην άιιν!) ην site w3Schools ζην ηκήκα ηνπ γηα SQL.

Κάληε ην bookmark, είλαη must!

http://www.w3schools.com/sql