Vous êtes sur la page 1sur 172

ΕΛΛΗΝΙΚΟ ΑΝΟΙΧΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

ΠΡΟΓΡΑΜΜΑ ΣΠΟΥΔΩΝ "ΠΛΗΡΟΦΟΡΙΚΗ" - Θ.Ε. ΠΛΗ11

ΟΜΑΔΙΚΗ ΣΥΜΒΟΥΛΕΥΤΙΚΗ ΣΥΝΑΝΤΗΣΗ IV


ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ – ΜΕΡΟΣ Β’

Υποστηρικτικό Υλικό Συνάντησης

Τόμος Γ’:
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ
Στόχοι για την Τέταρτη Συνάντηση

Απολογισμός της γραπτής


εργασίας ΓΕ-2.
Συζήτηση - Διερεύνηση θεμάτων
του τεσσάρων τελευταίων
κεφαλαίων του Γ’ τόμου (Βάσεις
Δεδομένων), καθώς και της
Κανονικοποίησης Β.Δ..
Παρουσίαση και απορίες
σε σχέση με τη γραπτή
εργασία ΓΕ-3.
Επίλυση Ασκήσεων Βάσεων
Δεδομένων.

2 8/7/2019
Γραπτή Εργασία 2, Γραπτή Εργασία 3 και άλλα…

ΓΕ-2:
Απολογισμός…

ΓΕ-3:
Για την εκπόνηση της ΓΕ3 θα πρέπει να χρησιμοποιήσετε την
SQLite (είτε σε command line είτε σε γραφικό περιβάλλον με το
εργαλείο DB Browser for SQLite).
Υπάρχει επιπλέον υλικό μελέτης για «Κανονικοποίηση Β.Δ.»
(εντός διδακτέας και εκτός εξεταστέας ύλης) και υπάρχει και
αντίστοιχο προαιρετικό θέμα στη ΓΕ3.

3 8/7/2019
Καλή Αρχή…

What men or gods are these? What maidens loth?


What mad pursuit? What struggle to escape?
What pipes and timbrels? What wild ecstasy?
John Keats, Ode on a Grecian Urn

What is the average salary in the Toy department?


Anonymous SQL user

4 8/7/2019
Βάσεις Δεδομένων

Η ΓΛΩΣΣΑ SQL
TA ΒΑΣΙΚΑ

5 8/7/2019
Από πού ξεκίνησε…

Η “standard” γλώσσα για σχεσιακές


βάσεις δεδομένων.

Αρχικά Sequel στην IBM ως μέρος του


System R, τώρα SQL (Structured Query
Language).

SQL-86, SQL-89, SQL-92, SQL: 1999,


SQL: 2003, SQL: 2006, SQL: 2008,
SQL: 2011.

6 8/7/2019
Τμήματα

H SQL έχει διάφορα τμήματα:


Γλώσσα Ορισμού Δεδομένων (ΓΟΔ)
Γλώσσα Χειρισμού Δεδομένων (ΓΧΔ)
Ενσωματωμένη Γλώσσα Χειρισμού Δεδομένων
Ορισμό Όψεων
Εξουσιοδότηση (authentication)
Ακεραιότητα
Έλεγχο Συναλλαγών

7 8/7/2019
Αποτελείται από…

Η SQL αποτελείται από:


DDL (Data Definition Language) - ορισμός,
δημιουργία, τροποποίηση και διαγραφή
σχήματος.
DML (Data Manipulation Language) - ορισμός,
δημιουργία, τροποποίηση, διαγραφή και επιλογή
δεδομένων (γλώσσα ερωτήσεων).
Προδιαγραφές ασφάλειας - χρήστες και
δικαιώματα.

8 8/7/2019
Βάσεις Δεδομένων

ΓΛΩΣΣΑ ΧΕΙΡΙΣΜΟΥ
ΔΕΔΟΜΕΝΩΝ

9 8/7/2019
Βασική Δομή

Βασική Σύνταξη Γλώσσας Χειρισμού Δεδομένων


(ΓΧΔ) (ερωτήσεων)
SELECT-FROM-WHERE

Μια χαρακτηριστική ερώτηση σε SQL έχει την


ακόλουθη μορφή:
ονόματα γνωρισμάτων

SELECT Α1, Α2, .., Αn ονόματα σχέσεων


FROM R1, R2, … Rm
WHERE P συνθήκη

Περίπου ισοδύναμο του: π A1, A2, .., An (σ P (R1 x R2 x … Rm))


10 8/7/2019
Γιατί «περίπου»

Η SQL επιτρέπει σε ένα πίνακα να έχει


δυο ή περισσότερες πλειάδες ταυτόσημες
σε όλα τα γνωρίσματά τους
διαφορά από το σχεσιακό μοντέλο.
αντί για σύνολο, ένας πίνακας είναι ένα πολύ-
σύνολο πλειάδων (bag/multiset).

11 8/7/2019
Βασική Δομή – SELECT

Το SELECT αντιστοιχεί
στην πράξη της π A1, A2, .., An (σ P (R1 x R2 x … Rm))
προβολής της
σχεσιακής άλγεβρας. SELECT Α1, Α2,..., ΑN
FROM R1, R2, … RM
Μας βοηθάει να WHERE P
ορίσουμε ποια
γνωρίσματα θέλουμε να
υπάρχουν στο
αποτέλεσμα της
ερώτησης.

12 8/7/2019
Βασική Δομή – FROM

Το FROM αντιστοιχεί
στην πράξη του π A1, A2, .., An (σ P (R1 x R2 x … Rm))
καρτεσιανού γινομένου
της σχεσιακής άλγεβρας. SELECT Α1, Α2,..., ΑN
FROM R1, R2, … RM
Μας βοηθάει να WHERE P
ορίσουμε ποιες σχέσεις
θα χρησιμοποιηθούν για
τον υπολογισμό του
αποτελέσματος.

13 8/7/2019
Βασική Δομή – WHERE

Το WHERE αντιστοιχεί στη


συνθήκη της πράξης της π (σ (R1 x R2 x … Rm))
A1, A2, .., An P
επιλογής στη σχεσιακή άλγεβρα.

Το κατηγόρημα P έχει SELECT Α1, Α2,..., ΑN


γνωρίσματα των σχέσεων που FROM R1, R2, … RM
εμφανίζονται στο FROM. WHERE P
Όταν δεν υπάρχει το WHERE, το
P θεωρείται ότι ισχύει.

ΠΡΟΣΟΧΗ:
Δε γίνεται απαλοιφή των διπλών
εμφανίσεων.

14 8/7/2019
Στην Πράξη…

Ταινία Τίτλος Έτος Διάρκεια Είδος

Παίζει Όνομα Τίτλος Έτος

Ηθοποιός

Όνομα Διεύθυνση Έτος-Γέννησης Σύζυγος-Ηθοποιού

15 8/7/2019
Τα πρώτα μας ερωτήματα

Παράδειγμα 1: SELECT Όνομα


Ποια είναι τα ονόματα
ηθοποιών που παίζουν FROM Παίζει
στην ταινία Gone with the WHERE Τίτλος= 'Gone with
Wind; the Wind'

Παράδειγμα 2: SELECT Όνομα


Ποια είναι τα ονόματα FROM Παίζει
όλων των ηθοποιών που
έχουν παίξει σε ταινίες
(ή σε ασπρόμαυρες
ταινίες);

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
16 8/7/2019
SELECT DISTINCT και * : Απαλοιφή Διπλών Εμφανίσεων -
Όλα τα Γνωρίσματα

Η SQL επιτρέπει πολλαπλές εμφανίσεις της ίδιας


πλειάδας σε μια σχέση.

Μια σχέση στην SQL είναι ένα πολυσύνολο


(multiset), ή θύλακας (bag).

Απαλοιφή διπλών εμφανίσεων:


SELECT DISTINCT Όνομα
FROM Παίζει

Επιλογή όλων των γνωρισμάτων: SELECT *


FROM Παίζει

17 8/7/2019
SELECT : Αριθμητικές Πράξεις

Μπορούν να γίνουν αριθμητικές πράξεις


(+, -, *, /) ανάμεσα σε σταθερές, ή γνωρίσματα
πλειάδων.
SELECT Τίτλος, Έτος, Διάρκεια/60, Είδος
FROM Ταινία

Επιστρέφει μια σχέση ίδια με τη σχέση Ταινία μόνο


που το γνώρισμα Διάρκεια μας δίνει τις ώρες (έχει
διαιρεθεί με το 60).
Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)
Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

18 8/7/2019
WHERE : Η Συνθήκη

Μπορούμε να έχουμε:
Λογικούς τελεστές: AND, OR, NOT
Τελεστές σύγκρισης: <, <=, >, >=, =, <>,
BETWEEN, NOT BETWEEN
ανάμεσα σε αριθμητικές εκφράσεις, συμβολοσειρές (strings), και
ειδικούς τύπους.

SELECT Τίτλος
Παράδειγμα: FROM Ταινία
WHERE Έτος BETWEEN 1990 AND 1995
αντί του
SELECT Τίτλος
FROM Ταινία
WHERE Έτος >= 1990 AND Έτος <= 1995

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
19 8/7/2019
WHERE: Στην Πράξη…

Παράδειγμα: Ποιος είναι ο τίτλος όλων των ταινιών


που γυρίστηκαν μετά το 1995 και είναι ασπρόμαυρες;

SELECT Τίτλος
FROM Ταινία
WHERE Έτος > 1995 AND Είδος = 'Ασπρόμαυρη'

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

20 8/7/2019
Περίπτωση Γνωρίσματος σε περισσότερες σχέσεις

Όταν το ίδιο γνώρισμα εμφανίζεται στο σχήμα


περισσότερων από μια σχέσεων, τότε θα πρέπει να
γίνει διάκριση βάση του συμβολισμού:
<όνομα-σχέσης>.<όνομα-γνωρίσματος>

Παράδειγμα φυσικής συνένωσης: Ποιοι ηθοποιοί


παίζουν σε ασπρόμαυρες ταινίες;
SELECT DISTINCT Όνομα
FROM Παίζει, Ταινία
WHERE Παίζει.Τίτλος = Ταινία.Τίτλος AND Παίζει.Έτος =
Ταινία.Έτος AND Είδος = 'Ασπρόμαυρη'

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
21 8/7/2019
Μερικά Παραδείγματα…

Βρείτε τις έγχρωμες ταινίες με διάρκεια μέχρι 80 λεπτά.


Ποιοι είναι οι ηθοποιοί που γεννήθηκαν μετά το 1935
και έπαιξαν σε ασπρόμαυρες ταινίες πριν το 1945;
Ποιοι ηθοποιοί γεννήθηκαν μετά το 1967;
Ποιοι ηθοποιοί γεννήθηκαν μετά το 1967 και έπαιξαν
στην ταινία «ΑΙ»;

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

22 8/7/2019
Πράξεις με συμβολοσειρές (%, _)

Η πιο συνηθισμένη πράξη είναι το ταίριασμα


προτύπων:
% : ταιριάζει οποιαδήποτε συμβολοσειρά
_ : ταιριάζει οποιοδήποτε χαρακτήρα

Γίνεται διάκριση ανάμεσα σε κεφαλαία και πεζά.

Η σύγκριση γίνεται χρησιμοποιώντας το LIKE και


NOT LIKE.

23 8/7/2019
Πράξεις με συμβολοσειρές – Παράδειγμα

Βρείτε τους τίτλους όλων των ταινιών που περιέχουν


τη λέξη «Θάλασσα».

SELECT DISTINCT Τίτλος


FROM Ταινία
WHERE Τίτλος LIKE '%Θάλασσα%'

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

24 8/7/2019
Διάταξη Πλειάδων – ORDER BY

Για να γίνει διάταξη πλειάδων γίνεται χρήση του


ORDER BY, ώστε οι πλειάδες στο αποτέλεσμα να
είναι ταξινομημένες με βάση το αντίστοιχο γνώρισμα.

SELECT DISTINCT Τίτλος, Έτος


FROM Παίζει
WHERE Όνομα = 'Robert De Niro'
ORDER BY Έτος

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
25 8/7/2019
Διάταξη Πλειάδων – ORDER BY – ASC, DESC

Η προεπιλεγμένη (default) διάταξη είναι η αύξουσα,


αλλά μπορούμε να την καθορίσουμε χρησιμοποιώντας
το ASC (αύξουσα) ή το DESC (φθίνουσα).

Επίσης, μπορεί να γίνει ταξινόμηση με βάση πολλά


γνωρίσματα.
SELECT *
FROM Ταινία
ORDER BY Έτος DESC, Τίτλος ASC

Η ταξινόμηση είναι δαπανηρή λειτουργία.

26 8/7/2019
Αλλαγή Ονόματος Γνωρίσματος – AS

Τα ονόματα των γνωρισμάτων στο αποτέλεσμα είναι αυτά των


σχέσεων στην ερώτηση.

Υπάρχει η δυνατότητα αλλαγής του ονόματος τόσο μιας σχέσης όσο


και ενός γνωρίσματος:
<παλιό-όνομα> AS <νέο-όνομα>

To AS μπορεί να εμφανίζεται
Στην SQLite μπορεί να
στο SELECT, ή στο FROM.
παραληφθεί το AS.
Για παράδειγμα:
SELECT Τίτλος, Έτος, Διάρκεια / 60 AS Ώρες-Διάρκεια,
Είδος
FROM Ταινία
Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)
Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
27 8/7/2019
Αλλαγή Ονόματος Γνωρίσματος – Πότε

Η αλλαγή ονόματος γνωρίσματος είναι χρήσιμη


όταν:
έχουμε αριθμητικές εκφράσεις στο SELECT και δεν
έχουν όνομα,
θέλουμε να αλλάξουμε το όνομα του γνωρίσματος
στο αποτέλεσμα,
δυο σχέσεις του FROM έχουν γνωρίσματα με το ίδιο
όνομα.

28 8/7/2019
Μεταβλητές Πλειάδων – AS

Μια μεταβλητή πλειάδας μπορεί να οριστεί στο FROM χρησι-


μοποιώντας το AS: SELECT DISTINCT Όνομα
FROM Παίζει AS Π, Ταινία AS Τ
WHERE Π.Τίτλος = Τ.Τίτλος AND
Π.Έτος = Τ.Έτος AND Είδος= 'Ασπρόμαυρη'
Οι μεταβλητές πλειάδων είναι ιδιαίτερα χρήσιμες όταν θέλουμε
να συγκρίνουμε δυο πλειάδες της ίδιας σχέσης.
Παράδειγμα: Τα ονόματα όλων των ταινιών που έχουν
διάρκεια μεγαλύτερη τουλάχιστον από μία ταινία που
γυρίστηκε το 1995.
SELECT DISTINCT Τ.Τίτλος
FROM Ταινία AS S, Ταινία AS T
WHERE T.Διάρκεια > S.Διάρκεια AND S.Έτος = 1995

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
8/7/2019
29
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
Η τιμή NULL

Γίνεται χρήση της λέξης κλειδί IS NULL (IS NOT NULL)


σε μια συνθήκη για να ελέγξουμε αν μια τιμή είναι null.
SELECT Αριθμός-Δανείου
FROM Δάνειο
WHERE Ποσό IS NULL
Εμφάνιση null:
Σε αριθμητικές πράξεις: το αποτέλεσμα είναι null όταν
οποιαδήποτε τιμή είναι null.
Σε συγκρίσεις: σύγκριση με null συνήθως δίνει αποτέλεσμα
unknown.
Η SQL χρησιμοποιεί λογική με τρεις τιμές: Τrue, False, Unknown
Σε συναθροιστικές συναρτήσεις: αγνοείται πλην από το
COUNT(*).
Παράδειγμα: SELECT SUM(Ποσό)
FROM Δάνειο
30 8/7/2019
Βάσεις Δεδομένων

ΣΥΝΑΘΡΟΙΣΤΙΚΕΣ
ΣΥΝΑΡΤΗΣΕΙΣ

31 8/7/2019
Συναθροιστικές Συναρτήσεις

Χρησιμοποιούνται για να κάνουν


περίληψη πολλών πλειάδων σε μια
ομαδοποίηση.
Πριν την περίληψη, διαμερισμός των
πλειάδων
Η SQL έχει 5 ενσωματωμένες (built-in)
συναθροιστικές συναρτήσεις: Oι συναρτήσεις
Μέσος όρος: AVG(A) συνάθροισης
(μόνο σε αριθμούς – To A είναι γνώρισμα) δέχονται τον τελεστή
Ελάχιστο: MIN(A)
DISTINCT και στο
Μέγιστο: MAX(A)
Άθροισμα: SUM(A) (μόνο σε αριθμούς) όρισμά τους.
Πλήθος: COUNT(A)

Οι συναρτήσεις μπορούν να
χρησιμοποιηθούν στο SELECT ή στο
HAVING (νέα εντολή)
Οι τιμές NULL αγνοούνται όταν οι
συναρτήσεις συνάθροισης εφαρμόζονται
σε κάποια στήλη 32 8/7/2019
Συναθροιστικές Συναρτήσεις – Στην Πράξη

Λογαριασμός Όνομα-Υποκαταστήματος Αριθμός-Λογαριασμού Ποσό

Υποκατάστημα Όνομα-Υποκαταστήματος Πόλη Σύνολο

Δάνειο Όνομα-Υποκαταστήματος Αριθμός-Δανείου Ποσό

Δανειζόμενος Όνομα-Πελάτη Αριθμός-Δανείου

Πελάτης Όνομα-Πελάτη Οδός Πόλη

Όνομα-Πελάτη Αριθμός-Λογαριασμού
Καταθέτης

33 8/7/2019
Συναθροιστικές Συναρτήσεις – Μέσος Όρος (AVG)

Παράδειγμα: Ποιο είναι το μέσο ποσό όλων των λογαριασμών


στο υποκατάστημα Ρήγα Φεραίου;
SELECT AVG(Ποσό)
FROM Λογαριασμός
WHERE Όνομα-Υποκαταστήματος = 'Ρήγα Φεραίου'

Το αποτέλεσμα είναι μια σχέση με ένα γνώρισμα και μια


γραμμή.
Μπορούμε να δώσουμε όνομα στο γνώρισμα
χρησιμοποιώντας το AS.
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)

34 8/7/2019
Συναθροιστικές Συναρτήσεις – Μέγιστο (MAX)

Παράδειγμα: Ποιος είναι ο αριθμός λογαριασμού που


έχει το μέγιστο ποσό στο υποκατάστημα Ρήγα Φεραίου;
SELECT Αριθμός-Λογαριασμού, MAX(Ποσό)
FROM Λογαριασμός
WHERE Όνομα-Υποκαταστήματος = Είναι σωστό;;;
'Ρήγα Φεραίου'
Αν το SELECT περιέχει συναθροιστική συνάρτηση,
τότε έχουμε μόνο συναθροιστικές στο σημείο αυτό,
εκτός αν υπάρχει GROUP BY.

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)

35 8/7/2019
Συναθροιστικές Συναρτήσεις – COUNT

Για να μετρήσουμε πόσες πλειάδες έχει μία σχέση


κάνουμε το ακόλουθο:

SELECT COUNT(*)
FROM Πελάτης

Δε μπορούμε να χρησιμοποιήσουμε το DISTINCT


με το COUNT(*).

36 8/7/2019
Ομαδοποίηση: GROUP BY και HAVING

Διαμερίζουμε τη σχέση σε υποσύνολα πλειάδων


με βάση γνωρίσματα ομαδοποίησης
εφαρμόζουμε τη συνάρτηση συνάθροισης σε κάθε
ομάδα ανεξάρτητα

Η εντολή GROUP BY
καθορίζει τα γνωρίσματα ομαδοποίησης
Αν υπάρχουν ΝULL τιμές στο γνώρισμα
ομαδοποίησης
όλες οι πλειάδες με NULL φτιάχνουν χωριστή ομάδα
HAVING: Επιτρέπει παροχή συνθήκης στην
περιληπτική πληροφορία

37 8/7/2019
Συναθροιστικές Συναρτήσεις – GROUP BY

Άρα μπορούμε να εφαρμόσουμε τις συναρτήσεις όχι μόνο σε


ένα σύνολο από πλειάδες, αλλά σε ομάδες από σύνολα
πλειάδων.
Οι ομάδες προσδιορίζονται χρησιμοποιώντας το GROUP BY.

Παράδειγμα: Ποιος είναι το μέσο ποσό των λογαριασμών σε


κάθε υποκατάστημα;
SELECT Όνομα-Υποκαταστήματος, AVG(Ποσό)
FROM Λογαριασμός
GROUP BY Όνομα-Υποκαταστήματος

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)
38 8/7/2019
Συναθροιστικές Συναρτήσεις – GROUP BY

Η ομαδοποίηση μπορεί να γίνει ως προς περισσότερα


του ενός πεδία.

Παράδειγμα: Ποιος είναι o μέσος όρος καταθέσεων ανά


πελάτη και ανά υποκατάστημα;
SELECT Όνομα-Υποκαταστήματος, Όνομα-Πελάτη, AVG(balance)
FROM Καταθέτης, Λογαριασμός
WHERE Καταθέτης.Αριθμός-Λογαριασμού = Λογαριασμός.
Αριθμός-Λογαριασμού
GROUP BY Όνομα-Υποκαταστήματος, Όνομα-Πελάτη
Η ομαδοποίηση γίνεται πρώτα ως προς το Όνομα-
Υποκαταστήματος. Στη συνέχεια δημιουργούνται υποoμάδες
ως προς το Όνομα-Πελάτη.
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 39 8/7/2019
Συναθροιστικές Συναρτήσεις – COUNT DISTINCT

Αν θέλουμε να απαλείψουμε διπλές εμφανίσεις


χρησιμοποιούμε τη λέξη-κλειδί DISTINCT στην αντίστοιχη
έκφραση.
Παράδειγμα: Ποιος είναι o αριθμός των καταθετών σε κάθε
υποκατάστημα;
SELECT Όνομα-Υποκαταστήματος, COUNT(DISTINCT
Όνομα-Πελάτη)
FROM Καταθέτης, Λογαριασμός
WHERE Καταθέτης.Αριθμός-Λογαριασμού = Λογαριασμός.
Αριθμός-Λογαριασμού
GROUP BY Όνομα-Υποκαταστήματος
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)
40 8/7/2019
Συναθροιστικές Συναρτήσεις – HAVING

Μπορούμε να εφαρμόσουμε μια συνθήκη σε μια συγκεκριμένη


ομάδα από πλειάδες χρησιμοποιώντας το HAVING.

Παράδειγμα: Ποια είναι τα ονόματα υποκαταστημάτων με


μέσο ποσό καταθέσεων μεγαλύτερο των 1200€;
SELECT Όνομα-Υποκαταστήματος, AVG(Ποσό)
FROM Λογαριασμός
GROUP BY Όνομα-Υποκαταστήματος
HAVING AVG(Ποσό) > 1200

Η συνθήκη του HAVING εφαρμόζεται αφού σχηματιστούν οι


ομάδες και υπολογιστούν οι συναθροιστικές συναρτήσεις.
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 41 8/7/2019
Συναθροιστικές Συναρτήσεις – HAVING

Όταν εμφανίζονται και το WHERE και το


HAVING:
η συνθήκη του WHERE εφαρμόζεται πρώτα,
οι πλειάδες που ικανοποιούν αυτή τη συνθήκη
τοποθετούνται σε ομάδες με βάση το GROUP BY,
και μετά αν υπάρχει συνθήκη στο HAVING
εφαρμόζεται στις ομάδες.

42 8/7/2019
Συναθροιστικές Συναρτήσεις – HAVING

Παράδειγμα: Ποιο είναι το μέσο ποσό για κάθε πελάτη που ζει
στα Ιωάννινα και έχει τουλάχιστον τρεις λογαριασμούς;
3
SELECT Καταθέτης.Όνομα-Πελάτη, AVG(Λογαριασμός.Ποσό)
FROM Καταθέτης, Λογαριασμός, Πελάτης
1 WHERE Καταθέτης.Αριθμός-Λογαριασμού =
Λογαριασμός.Αριθμός-Λογαριασμού AND Καταθέτης.Όνομα-
Πελάτη = Πελάτης.Όνομα-Πελάτη AND Πόλη = 'Ιωάννινα'
2 GROUP BY Καταθέτης.Όνομα-Πελάτη
4 HAVING COUNT (Καταθέτης.Αριθμός-Λογαριασμού)>=3

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)
43 8/7/2019
Συναθροιστικές Συναρτήσεις – Συγκεντρωτικά

Μέσος όρος: AVG (μόνο σε αριθμούς)


Ελάχιστο: MIN
Μέγιστο: MAX
Άθροισμα: SUM (μόνο σε αριθμούς)
Πλήθος: COUNT

Αν θέλουμε να απαλείψουμε διπλές εμφανίσεις


χρησιμοποιούμε τη λέξη-κλειδί DISTINCT στην αντίστοιχη
έκφραση.
Μπορούμε να εφαρμόσουμε τις συναρτήσεις όχι μόνο σε ένα
σύνολο από πλειάδες, αλλά σε ομάδες από σύνολα
πλειάδων. Οι ομάδες προσδιορίζονται χρησιμοποιώντας το
GROUP BY.
Μπορούμε να εφαρμόσουμε μια συνθήκη σε μια συγκεκριμένη
ομάδα από πλειάδες χρησιμοποιώντας το HAVING. Η
συνθήκη του HAVING εφαρμόζεται αφού σχηματιστούν οι
ομάδες και υπολογιστούν οι συναθροιστικές συναρτήσεις.
44 8/7/2019
Βάσεις Δεδομένων

ΦΩΛΙΑΣΜΕΝΕΣ
ΥΠΟΕΡΩΤΗΣΕΙΣ

45 8/7/2019
Φωλιασμένες Υπο-ερωτήσεις

Η SQL επιτρέπει το φώλιασμα υπο-ερωτήσεων.

Μια υπο-ερώτηση είναι μια έκφραση SELECT-FROM-WHERE


που χρησιμοποιείται μέσα σε μια άλλη ερώτηση
(συγκεκριμένα ως συνθήκη στο WHERE).
Υπολογισμός της
Γενική Δομή:
υποερώτησης για
SELECT ... κάθε γραμμή
FROM ... (πλειάδα) της
Υπο-ερώτηση
εξωτερικής
WHERE <τελεστής> ερώτησης.
(SELECT ...
FROM ...
WHERE ... );
46 8/7/2019
Φωλιασμένες Υποερωτήσεις –Ο τελεστής IN (NOT IN)

Ελέγχει αν μια πλειάδα ανήκει (δεν ανήκει) σε ένα


σύνολο από πλειάδες που έχουν προκύψει από μια
έκφραση SELECT-FROM-WHERE.

Παράδειγμα: Ποια είναι τα ονόματα όλων των πελατών


που έχουν πάρει δάνειο και έχουν καταθέσεις;
SELECT DISTINCT Όνομα-Πελάτη
FROM Δανειζόμενος
WHERE Όνομα-Πελάτη IN (SELECT Όνομα-Πελάτη
FROM Καταθέτης)
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 47 8/7/2019
Φωλιασμένες Υποερωτήσεις – Ο τελεστής IN –
Παραπάνω από δύο γνωρίσματα

Παράδειγμα: Ποια είναι τα ονόματα όλων των πελατών που


έχουν πάρει δάνειο και έχουν καταθέσεις στο υποκατάστημα
Ψηλά-Αλώνια;
SELECT DISTINCT Όνομα-Πελάτη
FROM Δανειζόμενος, Δάνειο
WHERE Δανειζόμενος.Αριθμός-Δανείου = Δάνειο.Αριθμός-
Δανείου AND Όνομα-Υποκαταστήματος = 'Ψηλά-Αλώνια'
AND (Όνομα-Υποκαταστήματος, Όνομα-Πελάτη) IN
(SELECT Όνομα-Υποκαταστήματος, Όνομα-Πελάτη
FROM Καταθέτης, Λογαριασμός
WHERE Καταθέτης.Αριθμός-Λογαριασμού =
Λογαριασμός.Αριθμός-Λογαριασμού)

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 48 8/7/2019
Φωλιασμένες Υποερωτήσεις – Ο τελεστής IN

Παράδειγμα: Ποια είναι τα ονόματα όλων των


ηθοποιών που έπαιξαν σε ασπρόμαυρη ταινία;
SELECT DISTINCT Παίζει.Όνομα
FROM Παίζει
WHERE (Παίζει.Τίτλος, Παίζει.Έτος) IN
(SELECT Ταινία.Τίτλος, Ταινία.Έτος
FROM Ταινία
WHERE Είδος = 'Ασπρόμαυρη')

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

49 8/7/2019
Φωλιασμένες Υποερωτήσεις – Ο τελεστής IN

Μπορεί να χρησιμοποιηθεί και με enumerated σύνολα.

Παράδειγμα: Ποια είναι τα ονόματα όλων των πελατών που


έχουν πάρει δάνειο και δε λέγονται Παπαδόπουλος ή Πέτρου;

SELECT DISTINCT Όνομα-Πελάτη


FROM Δανειζόμενος
WHERE Όνομα-Πελάτη NOT IN ('Παπαδόπουλος', 'Πέτρου')

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)
50 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων – ANY (SOME)

Ο τελεστής ANY(SOME)έχει τη σημασία του τουλάχιστον ένα από


ένα σύνολο.

Παράδειγμα: Ποια είναι τα ονόματα όλων των υποκαταστημάτων


που έχουν καταθέσεις μεγαλύτερες από τις καταθέσεις ενός
τουλάχιστον υποκαταστήματος των Ιωαννίνων;
SELECT DISTINCT Όνομα-Υποκαταστήματος
FROM Υποκατάστημα
WHERE Σύνολο > SOME (SELECT Σύνολο
FROM Υποκατάστημα
WHERE Πόλη = 'Ιωάννινα')
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)
51 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων – SOME (ANY)

Επίσης:
< SOME
<= SOME
>= SOME
= SOME (ισοδ. του IN)
< > SOME (όχι ισοδ. του NOT IN)

Στην SQLite δεν υποστηρίζεται


ο τελεστής ANY.
52 8/7/2019
Ορισμός της Πρότασης SOME

F <comp> SOME r t  r s.t. (F <comp> t)


όπου <comp> είναι τελεστής σύγκρισης: 
0
(5< SOME 5 ) = true (διαβάζεται: 5 < κάποια πλειάδα στη σχέση)
6
0
(5< SOME 5 ) = false
0
(5 = SOME 5 ) = true

0
(5  SOME 5 ) = true (αφού 0  5)

(= SOME)  IN
Παρ΄ όλα αυτά, ( SOME)  NOT IN
53 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων – ALL

Ο τελεστής ALL έχει τη σημασία του από όλα τα στοιχεία ενός


συνόλου.

Παράδειγμα: Ποια είναι τα ονόματα όλων των


υποκαταστημάτων που έχουν καταθέσεις μεγαλύτερες από τις
καταθέσεις όλων των υποκαταστημάτων των Ιωαννίνων;
SELECT DISTINCT Όνομα-Υποκαταστήματος
FROM Υποκατάστημα
WHERE Σύνολο > ALL (SELECT Σύνολο
FROM Υποκατάστημα
WHERE Πόλη = 'Ιωάννινα')
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 54 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων – ALL

Παράδειγμα: Ποιος είναι ο πιο ηλικιωμένος ηθοποιός


που έπαιξε στην ταινία Μανταλένα;
SELECT DISTINCT Όνομα
FROM Ηθοποιός, Παίζει
WHERE Παίζει.Όνομα = Ηθοποιός.Όνομα AND
Τίτλος = 'Μανταλένα‘ AND Έτος-Γέννησης >= ALL
(SELECT Έτος-Γέννησης
FROM Παίζει, Ηθοποιός
WHERE Παίζει.Όνομα = Ηθοποιός.Όνομα
AND Τίτλος = 'Μανταλένα')
Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)
Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

55 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων – ALL

Επίσης:
< ALL
<= ALL
>= ALL
= ALL
<> ALL (ισοδ. του NOT IN)

Στην SQLite δεν υποστηρίζεται


ο τελεστής ALL.
56 8/7/2019
Ορισμός της Πρότασης ALL

F <comp> ALL r t  r (F <comp> t)

0
(5< ALL 5 ) = false
6
6
(5< ALL 10 ) = true
4
(5 = ALL 5 ) = false

4
(5  ALL 6 ) = true (αφού 5  4 και 5  6)

( ALL)  NOT IN
57 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων – ALL

Παράδειγμα: Ποιο είναι το υποκατάστημα με το


μεγαλύτερο μέσο ποσό καταθέσεων;
SELECT DISTINCT Όνομα-Υποκαταστήματος
FROM Λογαριασμός
GROUP BY Όνομα-Υποκαταστήματος
HAVING AVG(Ποσό) >= ALL (SELECT AVG(Ποσό)
FROM Λογαριασμός
GROUP BY Όνομα-Υποκαταστήματος)

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)

58 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων –
Έλεγχος για Άδεια Σχέση - EXISTS

Ο τελεστής EXISTS επιστρέφει true, αν η υποερώτηση δεν


είναι κενή (EXISTS r  r  Ø).

Παράδειγμα: Ποιοι είναι οι καταθέτες που έχουν πάρει δάνειο;


SELECT Όνομα-Πελάτη
FROM Δανειζόμενος
WHERE EXISTS (SELECT *
FROM Καταθέτης
WHERE Καταθέτης.Όνομα-Πελάτη =
Δανειζόμενος.Όνομα-Πελάτη)
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)
59 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων –
Έλεγχος για Άδεια Σχέση – NOT EXISTS

Ο τελεστής NOT EXISTS μπορεί να χρησιμοποιηθεί για έλεγχο


αν η σχέση A περιέχει τη σχέση B
(NOT EXISTS r  r = Ø).

NOT EXISTS (Β EXCEPT Α)

Σημειώστε ότι X – Y = Ø  X Y

60 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων –
Έλεγχος για Άδεια Σχέση – NOT EXISTS

Παράδειγμα: Ποιοι είναι οι ηθοποιοί που έχουν παίξει


σε όλες τις ταινίες της Βουγιουκλάκη;
SELECT DISTINCT S.Όνομα NOT EXISTS (Β EXCEPT Α)
FROM Παίζει AS S
WHERE NOT EXISTS ((SELECT Τίτλος, Έτος
FROM Παίζει
Βρίσκει όλες τις ταινίες
WHERE Όνομα = 'Βουγιουκλάκη') υπολογισμός
της Βουγιουκλάκη
EXCEPT για κάθε S
(SELECT Τίτλος, Έτος
Βρίσκει όλες τις ταινίες FROM Παίζει AS R
που έχει παίξει ο WHERE R.Όνομα = S.Όνομα))
ηθοποιός S.Όνομα

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
61 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων –
Έλεγχος για Άδεια Σχέση – NOT EXISTS

Παράδειγμα: Ποιοι είναι οι πελάτες που έχουν


καταθέσεις σε όλα τα υποκαταστήματα της Πάτρας;
SELECT DISTINCT S.Όνομα-Πελάτη NOT EXISTS (Β EXCEPT Α)
FROM Καταθέτης AS S
WHERE NOT EXISTS ((SELECT Όνομα-Υποκαταστήματος
FROM Υποκατάστημα
WHERE Πόλη = 'Πάτρα')
EXCEPT
(SELECT R. Όνομα-Υποκαταστήματος
FROM Καταθέτης AS T, Λογαριασμός AS R
WHERE T.Όνομα-Πελάτη = S. Όνομα-Πελάτη AND
T.Αριθμός-Λογαριασμού=R. Αριθμός-Λογαριασμού))
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 62 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων –
Έλεγχος για Διπλές Εμφανίσεις –UNIQUE

Ο τελεστής UNIQUE επιστρέφει true αν η


υποερώτηση δεν έχει πολλαπλές όμοιες
πλειάδες. Υπάρχει και ο NOT UNIQUE.

63 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων –
Έλεγχος για Διπλές Εμφανίσεις –UNIQUE

Παράδειγμα: Ποιοι είναι οι ηθοποιοί που έχουν παίξει το πολύ


σε μία ταινία;
SELECT Όνομα
FROM Παίζει ας T
WHERE UNIQUE (SELECT Τ.Όνομα
FROM Παίζει ας R
WHERE T.Όνομα = R.Όνομα)
SELECT Όνομα
FROM Παίζει
GROUP BY Όνομα
HAVING COUNT(*) < = 1

Ταινία(Τίτλος, Έτος, Διάρκεια, Είδος)


Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

64 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων –
Έλεγχος για Διπλές Εμφανίσεις –UNIQUE

Παράδειγμα: Ποιοι είναι οι πελάτες που έχουν ακριβώς μία


κατάθεση στο υποκατάστημα «Ψηλά Αλώνια»;
SELECT T.Όνομα-Πελάτη
FROM Καταθέτης AS Τ
WHERE UNIQUE (SELECT R.Όνομα-Πελάτη
FROM Λογαριασμός, Καταθέτης AS R
WHERE T.Όνομα-Πελάτη = R.Όνομα-Πελάτη
AND R. Αριθμός-Λογαριασμού =
Λογαριασμός.Αριθμός-Λογαριασμού
AND Λογαριασμός.Όνομα-Υποκαταστήματος =
'Ψηλά Αλώνια')
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)

65 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων –
Έλεγχος για Διπλές Εμφανίσεις –ΝΟΤ UNIQUE

Παράδειγμα: Ποιοι είναι οι πελάτες που έχουν τουλάχιστον


δύο καταθέσεις στο υποκατάστημα «Ψηλά Αλώνια»;
SELECT T.Όνομα-Πελάτη
FROM Καταθέτης AS Τ
WHERE NOT UNIQUE (SELECT R.Όνομα-Πελάτη
FROM Λογαριασμός, Καταθέτης AS R
WHERE T.Όνομα-Πελάτη = R.Όνομα-Πελάτη
AND R. Αριθμός-Λογαριασμού =
Λογαριασμός.Αριθμός-Λογαριασμού
AND Λογαριασμός.Όνομα-Υποκαταστήματος =
'Ψηλά Αλώνια')
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)
66 8/7/2019
Φωλιασμένες Υποερωτήσεις – Σύγκριση Συνόλων – Συνολικά

IN/NOT IN (συμμετοχή σε σύνολο)

(>, =, κ.λπ.) SOME/ANY/ALL (σύγκριση


συνόλων)

EXISTS/NOT EXISTS (έλεγχος για κενά


σύνολα)

UNIQUE/NOT UNIQUE (έλεγχος για διπλότιμα)

67 8/7/2019
Βάσεις Δεδομένων

ΠΡΑΞΕΙΣ
ΣΥΝΟΛΩΝ

68 8/7/2019
Πράξεις Συνόλων

Οι Πράξεις είναι οι ακόλουθες:


σε συμβατές σχέσεις
UNION (ένωση)
INTERSECT (τομή)
EXCEPT ή MINUS (διαφορά)
Σε πολυσύνολα
UNION ALL, INTERSECT ALL , EXCEPT ALL
(SELECT
FROM
WHERE)
UNION/INTERSECT/EXCEPT
(SELECT
FROM
WHERE) 69 8/7/2019
Πράξεις Συνόλων – Στην Πράξη

Λογαριασμός Όνομα-Υποκαταστήματος Αριθμός-Λογαριασμού Ποσό

Υποκατάστημα Όνομα-Υποκαταστήματος Πόλη Σύνολο

Δάνειο Όνομα-Υποκαταστήματος Αριθμός-Δανείου Ποσό

Δανειζόμενος Όνομα-Πελάτη Αριθμός-Δανείου

Πελάτης Όνομα-Πελάτη Οδός Πόλη

Όνομα-Πελάτη Αριθμός-Λογαριασμού
Καταθέτης

70 8/7/2019
Πράξεις Συνόλων – UNION

Παράδειγμα UNION:
Ποια είναι τα ονόματα όλων των πελατών που έχουν
καταθέσεις ή/και έχουν πάρει δάνειο;
(SELECT Όνομα-Πελάτη
FROM Καταθέτης)
UNION
(SELECT Όνομα-Πελάτη
FROM Δανειζόμενος)

Γίνεται απαλοιφή των διπλών εμφανίσεων,


εκτός αν χρησιμοποιηθεί το UNION ALL.
Μέγιστος αριθμός πολλαπλών εμφανίσεων;
71 8/7/2019
Πράξεις Συνόλων – INTERSECT

Παράδειγμα INTERSECT:
Ποια είναι τα ονόματα όλων των πελατών που
έχουν καταθέσεις και έχουν πάρει δάνειο;
(SELECT Όνομα-Πελάτη
FROM Καταθέτης)
INTERSECT
(SELECT Όνομα-Πελάτη
FROM Δανειζόμενος)

Αντίστοιχα υπάρχει το INTERSECT ALL.


Μέγιστος αριθμός πολλαπλών εμφανίσεων;
72 8/7/2019
Πράξεις Συνόλων – EXCEPT ή MINUS

Παράδειγμα EXCEPT:
Ποια είναι τα ονόματα όλων των πελατών που
έχουν καταθέσεις και δεν έχουν πάρει δάνειο;
(SELECT Όνομα-Πελάτη
FROM Καταθέτης)
EXCEPT
(SELECT Όνομα-Πελάτη
FROM Δανειζόμενος)

Αντίστοιχα υπάρχει το EXCEPT ALL.


Μέγιστος αριθμός πολλαπλών εμφανίσεων;
73 8/7/2019
Πράξεις Συνόλων σε συνδυασμό με τη λέξη κλειδί ALL σε SQL ερωτήσεις
UNION

Η έκφραση Α UNION Β ενώνει τις εγγραφές που εμφανίζονται στον


πίνακα Α και τις εγγραφές που εμφανίζονται στον πίνακα Β.

Έστω το παρακάτω σχήμα βάσης:


ΛογαριασμόςΚαταθέσεων(ΑριθμόςΛογ, ΌνομαΠελάτη, υπόλοιπο)
ΛογαριασμόςΌψεως(ΑριθμόςΛογ, ΌνομαΠελάτη, υπόλοιπο)

Ερώτηση: Ζητάμε τους “αριθμούς λογαριασμών” και τα “υπόλοιπα”


όλων των πελατών με ποσά πάνω από 10.000€, είτε σε λογαριασμό
καταθέσεων, είτε σε λογαριασμό όψεως.

Απάντηση: SELECT ΑριθμόςΛογ, υπόλοιπο


FROM ΛογαριασμόςΚαταθέσεων
WHERE υπόλοιπο >10000
UNION
SELECT ΑριθμόςΛογ, υπόλοιπο
FROM ΛογαριασμόςΌψεως
WHERE υπόλοιπο >10000
74 8/7/2019
Πράξεις Συνόλων σε συνδυασμό με τη λέξη κλειδί ALL σε SQL ερωτήσεις
INTERSECT

Η έκφραση Α INTERSECT Β δίνει τις εγγραφές που εμφανίζονται


τόσο στον πίνακα Α, όσο και στον πίνακα Β.

Έστω το παρακάτω σχήμα βάσης:


ΛογαριασμόςΚαταθέσεων(ΑριθμόςΛογ, ΌνομαΠελάτη, υπόλοιπο)
ΛογαριασμόςΌψεως(ΑριθμόςΛογ, ΌνομαΠελάτη, υπόλοιπο)

Ερώτηση: Ζητάμε τα “ονόματα” των πελατών που έχουν ποσά


πάνω από 10.000€ τόσο σε λογαριασμό καταθέσεων όσο και σε
λογαριασμό όψεως.

Απάντηση: SELECT ΌνομαΠελάτη


FROM ΛογαριασμόςΚαταθέσεων
WHERE υπόλοιπο >10000
INTERSECT
SELECT ΌνομαΠελάτη
FROM ΛογαριασμόςΌψεως
WHERE υπόλοιπο >10000
75 8/7/2019
Πράξεις Συνόλων σε συνδυασμό με τη λέξη κλειδί ALL σε SQL ερωτήσεις
EXCEPT

Η έκφραση Α EXCEPT Β δίνει τις εγγραφές που εμφανίζονται στον


πίνακα Α, και δεν εμφανίζονται στον πίνακα Β.

Έστω το παρακάτω σχήμα βάσης:


ΛογαριασμόςΚαταθέσεων(ΑριθμόςΛογ, ΌνομαΠελάτη, υπόλοιπο)
ΛογαριασμόςΌψεως(ΑριθμόςΛογ, ΌνομαΠελάτη, υπόλοιπο)

Ερώτηση: Ζητάμε τα “ονόματα” των πελατών χωρίς λογαριασμό


όψεως, οι οποίοι έχουν υπόλοιπο μεγαλύτερο των 10.000€ σε
λογαριασμό καταθέσεων.

Απάντηση: SELECT ΌνομαΠελάτη


FROM ΛογαριασμόςΚαταθέσεων
WHERE υπόλοιπο >10000
EXCEPT
SELECT ΌνομαΠελάτη
FROM ΛογαριασμόςΌψεως

76 8/7/2019
Πράξεις Συνόλων σε συνδυασμό με τη λέξη κλειδί ALL σε SQL ερωτήσεις
Σύνολα και Πολυσύνολα

Τυπικά οι πίνακες ως αποτελέσματα SQL ερωτήσεων μπορεί


να περιέχουν διπλές εγγραφές (πολυσύνολα).

Όταν χρησιμοποιούμε πράξεις συνόλων (UNION, EXCEPT,


INTERSECT) οι πίνακες που προκύπτουν ως αποτέλεσμα
ερωτήσεων δεν περιέχουν διπλές εγγραφές (σύνολα).

Οι πράξεις συνόλων μπορούν να δώσουν πίνακες που είναι


πολυσύνολα εάν συνδυαστούν με τη λέξη κλειδί ALL.

77 8/7/2019
UNION και UNION ALL

Η UNION χειρίζεται τους πίνακες ως σύνολα.

Η UNION ALL χειρίζεται τους πίνακες ως


πολυσύνολα.

Ο αριθμός των διπλών εγγραφών στο αποτέλεσμα της


έκφρασης Α UNION ALL Β είναι το άθροισμα κάθε
φορά των διπλών εγγραφών που εμφανίζονται στο A
και που εμφανίζονται στο Β.

78 8/7/2019
Παράδειγμα UNION [ALL]

ΛογαριασμόςΚαταθέσεων ΛογαριασμόςΌψεως
ΑριθμόςΛογ ΌνομαΠελάτη Υπόλοιπο ΑριθμόςΛογ ΌνομαΠελάτη Υπόλοιπο
1155657 Γεωργίου 24000,0 2345690 Αντωνίου 747,0
1298098 Γεωργίου 7086,0 2677878 Αντωνίου 10747,0
2390200 Αντωνίου 25000,0 6767218 Πέτρου 10000,0
3209399 Αντωνίου 5353,0 6823782 Βασιλείου 100,0
4398760 Πέτρου 1000,0 7276526 Βασιλείου 9393,0
5678908 Βασιλείου 17,3 7882388 Νικολάου 10800,0
8283772 Νικολάου 10800,0

SELECT ΌνομαΠελάτη SELECT ΌνομαΠελάτη ΌνομαΠελάτη

FROM ΛογαριασμόςΚαταθέσεων FROM ΛογαριασμόςΚαταθέσεων Γεωργίου


WHERE υπόλοιπο>6000 WHERE υπόλοιπο>6000 Γεωργίου
UNION ΌνομαΠελάτη UNION ALL Αντωνίου
SELECT ΌνομαΠελάτη Γεωργίου SELECT ΌνομαΠελάτη Αντωνίου
FROM ΛογαριασμόςΌψεως Αντωνίου FROM ΛογαριασμόςΌψεως Βασιλείου
WHERE υπόλοιπο<10000; WHERE υπόλοιπο<10000; 79
Βασιλείου8/7/2019
Βασιλείου
INTERSECT και INTERSECT ALL

Η INTERSECT χειρίζεται τους πίνακες ως σύνολα.

Η INTERSECT ALL χειρίζεται τους πίνακες ως


πολυσύνολα.

Ο αριθμός των διπλών εγγραφών στο αποτέλεσμα της


έκφρασης Α INTERSECT ALL Β είναι o μικρότερος κάθε
φορά μεταξύ των αριθμών διπλών εγγραφών που
εμφανίζονται στο A και που εμφανίζονται στο Β.

80 8/7/2019
Παράδειγμα INTERSECT [ALL]

ΛογαριασμόςΚαταθέσεων ΛογαριασμόςΌψεως
ΑριθμόςΛογ ΌνομαΠελάτη Υπόλοιπο ΑριθμόςΛογ ΌνομαΠελάτη Υπόλοιπο
1155657 Γεωργίου 24000,0 2345690 Αντωνίου 747,0
1298098 Γεωργίου 7086,0 2677878 Αντωνίου 10747,0
2390200 Αντωνίου 25000,0 6767218 Πέτρου 10000,0
3209399 Αντωνίου 5353,0 6823782 Βασιλείου 100,0
4398760 Πέτρου 1000,0 7276526 Βασιλείου 9393,0
5678908 Βασιλείου 17,3 7882388 Νικολάου 10800,0
8283772 Νικολάου 10800,0

SELECT ΌνομαΠελάτη SELECT ΌνομαΠελάτη


FROM ΛογαριασμόςΚαταθέσεων FROM ΛογαριασμόςΚαταθέσεων
INTERSECT INTERSECT ALL ΌνομαΠελάτη
SELECT ΌνομαΠελάτη ΌνομαΠελάτη SELECT ΌνομαΠελάτη Αντωνίου
FROM ΛογαριασμόςΌψεως; Αντωνίου FROM ΛογαριασμόςΌψεως; Αντωνίου
Πέτρου Πέτρου
81 8/7/2019
Βασιλείου Βασιλείου
EXCEPT και EXCEPT ALL

Η EXCEPT χειρίζεται τους πίνακες ως σύνολα.

Η EXCEPT ALL χειρίζεται τους πίνακες ως πολυσύνολα.


Ο αριθμός των διπλών εγγραφών στο αποτέλεσμα της
έκφρασης Α EXCEPT ALL Β είναι η διαφορά κάθε φορά
μεταξύ των αριθμών διπλών εγγραφών που εμφανίζονται στο
Α και που εμφανίζονται στο Β.

82 8/7/2019
Παράδειγμα EXCEPT [ALL]

ΛογαριασμόςΚαταθέσεων ΛογαριασμόςΌψεως
ΑριθμόςΛογ ΌνομαΠελάτη Υπόλοιπο ΑριθμόςΛογ ΌνομαΠελάτη Υπόλοιπο
1155657 Γεωργίου 24000,0 2345690 Αντωνίου 747,0
1298098 Γεωργίου 7086,0 2677878 Αντωνίου 10747,0
2390200 Αντωνίου 25000,0 6767218 Πέτρου 10000,0
3209399 Αντωνίου 5353,0 6823782 Βασιλείου 100,0
4398760 Πέτρου 1000,0 7276526 Βασιλείου 9393,0
5678908 Βασιλείου 17,3 7882388 Νικολάου 10800,0
8283772 Νικολάου 10800,0

SELECT ΌνομαΠελάτη SELECT ΌνομαΠελάτη


FROM ΛογαριασμόςΚαταθέσεων FROM ΛογαριασμόςΚαταθέσεων
EXCEPT EXCEPT ALL ΌνομαΠελάτη
SELECT ΌνομαΠελάτη SELECT ΌνομαΠελάτη Γεωργίου
FROM ΛογαριασμόςΌψεως ΌνομαΠελάτη FROM ΛογαριασμόςΌψεως Γεωργίου
WHERE υπόλοιπο>=10000; Γεωργίου WHERE υπόλοιπο>=10000; Αντωνίου
Βασιλείου 83
Βασιλείου8/7/2019
Βάσεις Δεδομένων

ΣΥΝΕΝΩΣΕΙΣ
ΣΥΝΟΛΩΝ

84 8/7/2019
Συνενώσεις Συνόλων

Η SQL-92 υποστηρίζει διάφορους τύπους


συνενώσεων που συνήθως χρησιμοποιούνται στο
FROM, αλλά μπορούν να χρησιμοποιηθούν
οπουδήποτε μπορεί να χρησιμοποιηθεί μια σχέση.

Γενική σύνταξη:
<όνομα-σχέσης1> <τύπος-συνένωσης>
<όνομα-σχέσης2> <συνθήκη-συνένωσης>
ή
<όνομα-σχέσης1> natural <τύπος-συνένωσης>
<όνομα-σχέσης2>

85 8/7/2019
Συνενώσεις Συνόλων – Τύποι Συνένωσης

Οι τύποι συνένωσης είναι οι ακόλουθοι:


INNER JOIN: εσωτερική (θήτα) συνένωση
LEFT OUTER JOIN: αριστερή εξωτερική συνένωση
RIGHT OUTER JOIN: δεξιά εξωτερική συνένωση
FULL OUTER JOIN: πλήρης εξωτερική συνένωση

86 8/7/2019
Συνένωση (Σύνδεση) Σχέσεων - JOIN

Οι λειτουργίες join παίρνουν ως είσοδο δυο σχέσεις και επιστρέφουν


ως αποτέλεσμα μια άλλη σχέση.

Αυτές οι επιπρόσθετες πράξεις χρησιμοποιούνται συνήθως ως


εκφράσεις υποερωτημάτων στο τμήμα FROM.

Συνθήκη Join: καθορίζει ποιες πλειάδες στις δυο σχέσεις


ταιριάζουν και ποια γνωρίσματα εμφανίζονται στο αποτέλεσμα του
join.

Τύπος Join: καθορίζει πώς επεξεργαζόμαστε τις πλειάδες κάθε


σχέσης, οι οποίες δε ταιριάζουν με κάποια πλειάδα της άλλης
σχέσης (βάσει της συνθήκης του join).
Τύποι Join Συνθήκες Join
INNER JOIN NATURAL
LEFT OUTER JOIN ON <predicate>
RIGHT OUTER JOIN USING (A1, A2, ..., An)
FULL OUTER JOIN 87 8/7/2019
Σύνδεση Σχέσεων – Σύνολα Δεδομένων για τα Παραδείγματα

Σχέση loan:
loan-number branch-name amount
L-170 Downtown 3000
L-230 Redwood 4000
L-260 Perryridge 1700
Σχέση borrower:
customer-name loan-number
Jones L-170
Smith L-230
Hayes L-155
Σημείωση: Λείπει πληροφορία στη σχέση borrower για το
L-260 και στη σχέση loan για το L-155

88 8/7/2019
Σύνδεση Σχέσεων – Παραδείγματα 1/6

loan INNER JOIN borrower ON


loan.loan-number = borrower.loan-number
loan-number branch-name amount customer-name loan-number

L-170 Downtown 3000 Jones L-170


L-230 Redwood 4000 Smith L-230

loan borrower
loan-number branch-name amount customer-name loan-number
L-170 Downtown 3000 Jones L-170
L-230 Redwood 4000 Smith L-230
L-260 Perryridge 1700 Hayes L-155

89 8/7/2019
Σύνδεση Σχέσεων – Παραδείγματα 2/6

loan LEFT OUTER JOIN borrower ON


loan.loan-number = borrower.loan-number

loan-number branch-name amount customer-name loan-number


L-170 Downtown 3000 Jones L-170
L-230 Redwood 4000 Smith L-230
L-260 Perryridge 1700 null null

loan borrower
loan-number branch-name amount customer-name loan-number
L-170 Downtown 3000 Jones L-170
L-230 Redwood 4000 Smith L-230
L-260 Perryridge 1700 Hayes L-155

90 8/7/2019
Σύνδεση Σχέσεων – Παραδείγματα 3/6

loan NATURAL INNER JOIN borrower

loan-number branch-name amount customer-name

L-170 Downtown 3000 Jones


L-230 Redwood 4000 Smith

loan borrower
loan-number branch-name amount customer-name loan-number
L-170 Downtown 3000 Jones L-170
L-230 Redwood 4000 Smith L-230
L-260 Perryridge 1700 Hayes L-155

91 8/7/2019
Σύνδεση Σχέσεων – Παραδείγματα 4/6

loan NATURAL RIGHT OUTER JOIN borrower


loan-number branch-name amount customer-name
L-170 Downtown 3000 Jones
L-230 Redwood 4000 Smith
L-155 null null Hayes

loan borrower
loan-number branch-name amount customer-name loan-number
L-170 Downtown 3000 Jones L-170
L-230 Redwood 4000 Smith L-230
L-260 Perryridge 1700 Hayes L-155

92 8/7/2019
Σύνδεση Σχέσεων – Παραδείγματα 5/6

loan FULL OUTER JOIN borrower USING (loan-number)


loan-number branch-name amount customer-name

L-170 Downtown 3000 Jones


L-230 Redwood 4000 Smith
L-260 Perryridge 1700 null
L-155 null null Hayes

loan borrower
loan-number branch-name amount customer-name loan-number
L-170 Downtown 3000 Jones L-170
L-230 Redwood 4000 Smith L-230
L-260 Perryridge 1700 Hayes L-155

93 8/7/2019
Σύνδεση Σχέσεων – Παραδείγματα 6/6

Παράδειγμα: Βρείτε όλους τους πελάτες που είτε έχουν ένα


λογαριασμό, είτε έχουν πάρει ένα δάνειο (αλλά όχι και τα δυο)
στην / από την τράπεζα.

SELECT customer-name
FROM (depositor NATURAL FULL OUTER JOIN borrower)
where account-number IS NULL OR loan-number IS NULL

94 8/7/2019
Συνενώσεις Συνόλων – Συνθήκες Συνένωσης

Συνθήκες Συνένωσης:
ON P
USING (A1, A2,..., An): γνωρίσματα που πρέπει
να ταιριάζουν στη συνένωση είναι τα Ai. Τα Ai πρέπει να
είναι γνωρίσματα κοινά και στις δυο σχέσεις και
εμφανίζονται στο αποτέλεσμα μόνο μια φορά.

Για την εσωτερική συνένωση η συνθήκη δεν είναι


υποχρεωτική, όταν λείπει ισοδυναμεί με καρτεσιανό
γινόμενο.

95 8/7/2019
Συνενώσεις Συνόλων – inner, outer, natural

Οι λέξεις κλειδιά INNER και OUTER είναι προαιρετικές.


NATURAL: φυσική συνένωση, τα γνωρίσματα εμφανίζονται
στο αποτέλεσμα με την εξής διάταξη: πρώτα αυτά με τα οποία
έγινε η συνένωση (δηλ., αυτά που είναι κοινά και στις δύο
σχέσεις), μετά τα υπόλοιπα της πρώτης σχέσης, και τέλος τα
υπόλοιπα της δεύτερης σχέσης.

Παράδειγμα: Ποια είναι τα ονόματα των πελατών που είτε


έχουν καταθέσεις είτε έχουν πάρει δάνεια (αλλά όχι και τα
δυο);

SELECT Όνομα-Πελάτη
FROM Καταθέτης NATURAL FULL OUTER JOIN Δανειζόμενος
WHERE Αριθμός-Λογαριασμού IS NULL
OR Αριθμός-Δανείου IS NULL

96 8/7/2019
Παραγόμενες Σχέσεις

Η SQL-92 δίνει τη δυνατότητα μια υποερώτηση να


χρησιμοποιηθεί στο FROM.

Τότε πρέπει να της δοθεί ένα όνομα και τα


γνωρίσματα της να μετονομαστούν.

Αυτό γίνεται χρησιμοποιώντας το AS.

97 8/7/2019
Παραγόμενες Σχέσεις

Η SQL-92 δίνει τη δυνατότητα χρησιμοποιώντας το


AS να δοθεί ένα προσωρινό όνομα σε μία προσωρινή σχέση που
προκύπτει από μια υποερώτηση.

Παράδειγμα: Ποια είναι τα ονόματα υποκαταστημάτων με μέσο


ποσό καταθέσεων μεγαλύτερο των 1200€;

SELECT Όνομα-Υποκαταστήματος, Μέσο-ποσό


FROM (SELECT Όνομα-Υποκαταστήματος, AVG(Ποσό)
FROM Λογαριασμός
GROUP BY Όνομα-Υποκαταστήματος
AS Αποτέλεσμα(Όνομα-Υποκαταστήματος,
Μέσο-Ποσό)
WHERE Μέσο-Ποσό> 1200
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 98 8/7/2019
Βάσεις Δεδομένων

ΟΡΙΣΜΟΣ
ΟΨΕΩΝ

99 8/7/2019
Ορισμός Όψεων

Μπορούμε να ορίσουμε μια όψη view


χρησιμοποιώντας την εντολή: definition

CREATE VIEW <όνομα--όψης> AS <SELECT-FROM-WHERE ερώτηση>

Επίσης, μπορούν να προσδιοριστούν τα


ονόματα των γνωρισμάτων άμεσα.

CREATE VIEW <όνομα--όψης> (<λίστα ονομάτων-γνωρισμάτων>)


AS <SELECT-FROM-WHERE ερώτηση>

100 8/7/2019
Ορισμός Όψεων - Παράδειγμα

Παράδειγμα: Δημιουργείστε μια όψη που περιλαμβάνει τα


ονόματα όλων των υποκαταστημάτων και το άθροισμα του
ποσού των δανείων που έχουν γίνει από αυτά.

CREATE VIEW Υποκατάστημα-Σύνολο-Δανείων (Όνομα-


Υποκαταστήματος, Σύνολο-Δανείων) AS
SELECT Όνομα-Υποκαταστήματος, SUM(Ποσό)
FROM Δάνειο
GROUP BY Όνομα-Υποκαταστήματος
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)

101 8/7/2019
Ορισμός Όψεων

Τα ονόματα όψεων μπορεί να χρησιμοποιηθούν


οπουδήποτε μπορεί να χρησιμοποιηθεί το όνομα
μιας σχέσης.

Ο ορισμός της όψης παραμένει στη βάση


δεδομένων, εκτός αν σβηστεί:

DROP VIEW <όνομα-όψης>

102 8/7/2019
Βάσεις Δεδομένων

ΓΛΩΣΣΑ ΟΡΙΣΜΟΥ
ΔΕΔΟΜΕΝΩΝ

103 8/7/2019
Ορισμός & Τύποι Δεδομένων SQL

Όροι SQL Σχήμα SQL (ver 


πίνακας (table)  σχέση SQL2)
γραμμή (row)  πλειάδα όνομα σχήματος
στήλη (column)  γνώρισμα ταυτότητα
Κατάλογος εξουσιοδότησης
επώνυμη συλλογή περιγραφείς
σχημάτων
στοιχείων

CREATE SCHEMA COMPANY AUTHORIZATION ‘Jsmith’;

8/7/2019
Γλώσσα Ορισμού Δεδομένων

Σχετικά με το λογικό σχήμα, η ΓΟΔ SQL υποστηρίζει τους


ορισμούς:
του σχήματος κάθε σχέσης
του πεδίου τιμών κάθε γνωρίσματος
των περιορισμών ακεραιότητας

CREATE TABLE R(A1 D1,A2 D2,...,An Dn),


<περιορισμός-ακεραιότητας1>,
…,
<περιορισμός-ακεραιότηταςk>

όπου R είναι το όνομα της σχέσης, Ai τα ονόματα των


γνωρισμάτων, και Di οι τύποι των αντίστοιχων πεδίων τιμών.

105 8/7/2019
Στην Πράξη

CREATE TABLE EMPLOYEE (


Fname VARCHAR(15) NOT NULL,
Minit CHAR,
Lname VARCHAR(15) NOT NULL,
Ssn CHAR(9) NOT NULL,
Bdate DATE,
Address VARCHAR(15),
Sex CHAR
Salary DECIMAL(10,2)
Super_ssn CHAR(9)
Dno INT NOT NULL,
PRIMARY KEY (Ssn)
FOREIGN KEY (Super_ssn) REFERENCES EMPLOYEE(Ssn)
FOREIGN KEY (Dno) REFERENCES DEPARTMENT(Dnumber) );
106 8/7/2019
Στην Πράξη

CREATE TABLE DEPARTMENT(


Dname VARCHAR(15) NOT NULL,
Dnumber INT NOT NULL,
Mgr_ssn CHAR(9) NOT NULL,
Mgr_start_date DATE,
PRIMARY KEY (Dnumber)
UNIQUE (Dname),
FOREIGN KEY (Mgr_ssn) REFERENCES EMPLOYEE(Ssn) );

107 8/7/2019
Τύποι Πεδίου Ορισμού

Για τον ορισμό του πεδίου ορισμού, οι διαθέσιμοι


ενσωματωμένοι (built-in) τύποι περιλαμβάνουν:
char(n) (σταθερού μήκους)
varchar(n)
int
smallint Στην SQLite χρησιμοποιούνται οι
numeric(p, d) (d από ακόλουθοι τύποι :
τα p ψηφία είναι στα NULL: αδιάστατο μέγεθος που αντιστοιχεί
δεξιά της υποδιαστολής) σε μη εισαχθείσα τιμή
real, double precision TEXT: αντιστοιχεί στον τύπο δεδομένων
float(n) <VARCHAR()> του Τόμου Γ’, οι
date (ημερομηνία) αλφαριθμητικές τιμές
time (ώρα) INTEGER: αντιστοιχεί στον τύπο
δεδομένων <INT> του Τόμου Γ’, οι
ακέραιες τιμές αριθμών
REAL: οι πραγματικές τιμές αριθμών
108 8/7/2019
Πεδία Τιμών

Ο ορισμός πεδίου μπορεί να περιέχει τον


προσδιορισμό NOT NULL και default τιμή.

Επίσης, επιτρέπεται η δημιουργία πεδίου:

CREATE DOMAIN <name> AS <type-description>

CREATE DOMAIN Όνομα-Προσώπου char(20)

109 8/7/2019
Περιορισμοί Ακεραιότητας

Επιτρεπτοί περιορισμοί ακεραιότητας είναι της


μορφής:
PRIMARY KEY Aj1, Aj2, ..., Ajn (για ορισμό
πρωτεύοντος κλειδιού)
δεν επιτρέπονται επαναλαμβανόμενες τιμές και NULL τιμές
UNIQUE Aj1, Aj2, ..., Ajn (για ορισμό υποψηφίων
κλειδιών)
δεν επιτρέπονται επαναλαμβανόμενες τιμές
NULL τιμές επιτρέπονται (μόνο μία)
CHECK P (για ορισμό σημασιολογικών περιορισμών)
FOREIGN KEY (Ai) REFERENCES Aj (για ορισμό ξένου
κλειδιού)
Οι περιορισμοί ορίζονται
μια φορά στο σχήμα και
ελέγχονται κάθε φορά που Στην SQLite οι δομές FOREIGN KEY και
γίνεται μια τροποποίηση UNIQUE πρέπει να τίθενται στο τέλος της
του στιγμιότυπου. εντολής δημιουργίας των πινάκων, πριν
τον ορισμό του κλειδιού. 110 8/7/2019
Ορισμός Σχήματος – Παραδείγματα

(1)
CREATE TABLE Πελάτης
(Όνομα-Πελάτη char(20) NOT NULL,
Οδός char(30),
Πόλη char(30),
PRIMARY KEY (Όνομα-Πελάτη))
(2)
CREATE TABLE Λογαριασμός
(Αριθμός-Λογαριασμού char(10) NOT NULL,
Όνομα-Υποκαταστήματος char(15),
Ποσό int,
PRIMARY KEY (Αριθμός-Λογαριασμού)
CHECK (Ποσό >= 0)
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 111 8/7/2019
Ορισμός Σχήματος

Επίσης, μπορούμε να έχουμε πιο περίπλοκες


συνθήκες, π.χ., για ξένα κλειδιά:
CHECK (Όνομα-Υποκαταστήματος IN
SELECT Όνομα-Υποκαταστήματος
FROM Υποκατάστημα)

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)

112 8/7/2019
Περιορισμοί Ακεραιότητας – Περιορισμοί Αναφορικής Ακεραιότητας

Σύνταξη:

FOREIGN KEY (AI) REFERENCES Aj

Όταν μία πράξη παραβιάζει έναν περιορισμό


αναφοράς απορρίπτεται εκτός αν έχει οριστεί:
ON DELETE CASCADE
ON UPDATE CASCADE

113 8/7/2019
Περιορισμοί Ακεραιότητας – Παράδειγμα

CREATE TABLE
..
FOREIGN KEY (Όνομα-Υποκαταστήματος) REFERENCES
Υποκατάστημα
ON DELETE CASCADE
ON UPDATE CASCADE

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)

114 8/7/2019
Ξένα Κλειδιά (Περιορισμοί Αναφορικής Ακεραιότητας)

Η γλώσσα SQL υποδεικνύει μέσω της εντολής


FOREIGN KEY την αντιμετώπιση παραβίασης
Default: Αγνόησε την προσπάθεια ενημέρωσης που
οδηγεί σε παραβίαση
Εναλλακτικά, πρόσθεσε στην εντολή μια συνθήκη
SET NULL, CASCADE, SET DEFAULT
ON DELETE και ON UPDATE
Η ΒΔ αντιμετωπίζει τα SET NULL or SET DEFAULT
με τον ίδιο τρόπο για ON DELETE και ON UPDATE
CASCADE κατάλληλο για “relationship” πίνακες

115 8/7/2019
Στην Πράξη

116 8/7/2019
Ακεραιότητα Αναφορών στη SQL – Παράδειγμα

CREATE TABLE customer


(customer_name char(20),
customer_street char(30),
customer_city char(30),
PRIMARY KEY (customer_name))

CREATE TABLE branch


(branch_name char(15),
branch_city char(30),
assets numeric(12,2), // or Dollars //
PRIMARY KEY (branch_name),
CHECK (assets >= 0))

117 8/7/2019
Ακεραιότητα Αναφορών στη SQL – Παράδειγμα συνέχεια…

CREATE TABLE account


(account_number char(10), // or AccountNumber //
branch_name char(15),
balance integer,
PRIMARY KEY (account_number),
FOREIGN KEY (branch_name) REFERENCES branch
ON DELETE CASCADE,
ON UPDATE CASCADE)

Εξ’ αιτίας του όρου ON DELETE CASCADE που σχετίζεται με τη δήλωση


του ξένου κλειδιού, αν η διαγραφή μιας εγγραφής στη σχέση branch
καταλήξει να παραβιάζεται αυτός ο περιορισμός ακεραιότητας αναφορών,
το σύστημα δεν απορρίπτει τη διαγραφή. Αντίθετα, η διαγραφή μεταφέρεται
διαδοχικά στη σχέση account, διαγράφοντας την εγγραφή που αναφέρεται
στο υποκατάστημα που διαγράφηκε.
Παρομοίως, εξαιτίας του όρου ON UPDATE CASCADE το σύστημα
ενημερώνει το πεδίο branch_name στις αναφερόμενες εγγραφές του
account με τη νέα τιμή.

118 8/7/2019
Ακεραιότητα Αναφορών στη SQL – Παράδειγμα συνέχεια…

CREATE TABLE depositor


(customer_name char(20),
account_number char(10),
PRIMARY KEY (customer_name, account_number),
FOREIGN KEY (customer_name) REFERENCES customer
ON DELETE CASCADE,
ON UPDATE CASCADE,
FOREIGN KEY (account_number) REFERENCES account
ON DELETE CASCADE,
ON UPDATE CASCADE)

119 8/7/2019
Ακεραιότητα Αναφορών στη SQL – Παράδειγμα συνέχεια…

CREATE TABLE loan


(loan_number char(20),
branch_name char(15),
amount integer,
PRIMARY KEY (loan_number),
FOREIGN KEY (branch_name) REFERENCES branch
ON DELETE CASCADE,
ON UPDATE CASCADE,
CHECK (amount >= 0))

120 8/7/2019
Ακεραιότητα Αναφορών στη SQL – Παράδειγμα συνέχεια…

CREATE TABLE borrower


(customer_name char(20),
loan_number char(10),
PRIMARY KEY (customer_name, loan_number),
FOREIGN KEY (customer_name) REFERENCES customer
ON DELETE CASCADE,
ON UPDATE CASCADE,
FOREIGN KEY (loan_number) REFERENCES loan
ON DELETE CASCADE,
ON UPDATE CASCADE)

121 8/7/2019
Περιορισμοί Ακεραιότητας – Πεδίου Ορισμού

Γίνεται χρησιμοποιώντας την εντολή CHECK:


Παραδείγματα:
(1) Ελάχιστο ωρομίσθιο
CREATE DOMAIN Ωρομίσθιο numeric(5, 2)
CONSTRAINT Έλεγχος-Ωρομισθίου CHECK(Ποσό >= 4.00)

(2) Να μην περιέχει την τιμή null


CREATE DOMAIN Πεδίο-Αριθμός-Λογαριασμού char(10)
CONSTRAINT Έλεγχος-Αριθμός-Λογαριασμού CHECK(value
NOT NULL)

(3) Να παίρνει συγκεκριμένες τιμές


CREATE DOMAIN Τύπος-Λογαριασμού char(10)
CONSTRAINT Έλεγχος-Τύπος-Λογαριασμού check value in
(‘Όψεως”, ‘Ταμιευτηρίου”)
122 8/7/2019
Τροποποίηση Σχήματος

ALTER TABLE όνομα πίνακα


ADD - προσθέτει καινούργια στήλη
DROP - διαγράφει μια στήλη
MODIFY - τροποποιεί μια στήλη

123 8/7/2019
Τροποποίηση Σχήματος

Προσθήκη νέου γνωρίσματος:


ALTER TABLE R ADD A D
Όταν γίνει προσθήκη σε μια σχέση R που ήδη
υπάρχει του γνωρίσματος A με πεδίο τιμών D, η τιμή
των πλειάδων της R στο καινούργιο γνώρισμα είναι
null.

Διαγραφή γνωρίσματος:
ALTER TABLE R DROP A

Αλλαγή (μόνο τύπο δεδομένων, όχι όνομα στήλης)


ALTER TABLE R MODIFY (όνομα_στήλης
new_datatype)
124 8/7/2019
Διαγραφή Σχήματος

Μια καινούργια σχέση είναι αρχικά άδεια.

Για να σβηστεί ένα σχήμα:

DROP TABLE R

Διαφορά από

DELETE FROM R

125 8/7/2019
Βάσεις Δεδομένων

ΓΛΩΣΣΑ ΧΕΙΡΙΣΜΟΥ
ΔΕΔΟΜΕΝΩΝ

126 8/7/2019
Τροποποιήσεις - Γλώσσα Χειρισμού Δεδομένων (ΓΧΔ)

Εντολές που ΤΡΟΠΟΠΟΙΟΥΝ το


στιγμιότυπο της βάσης δεδομένων
δηλαδή, το περιεχόμενο των πινάκων

Οι τροποποιήσεις που μπορούν να γίνουν


είναι:
Εισαγωγή πλειάδας
Διαγραφή πλειάδας
Τροποποίηση (Ενημέρωση) πλειάδας
Επιλογή δεδομένων (γλώσσα επερωτήσεων)
127 8/7/2019
Εισαγωγή Πλειάδας

Παρέχει μια λίστα από τιμές γνωρισμάτων για


μια νέα πλειάδα που πρέπει να εισαχθεί στη
σχέση

Για να εισάγουμε δεδομένα σε μια σχέση είτε


(α) προσδιορίζουμε την πλειάδα, είτε
INSERT INTO R(A1, …, An) VALUES (v1,…, vn)
(β) γράφουμε μια ερώτηση που το αποτέλεσμα
της εισάγεται στη σχέση.
INSERT INTO R(A1, …, An) SELECT-FROM-WHERE
Μπορεί να γίνει εισαγωγή και null τιμών

128 8/7/2019
Εισαγωγή Πλειάδας

Ποιους από τους περιορισμούς


πεδίου ορισμού, κλειδιού, ακεραιότητας
οντοτήτων και αναφορικής ακεραιότητας
μπορεί να παραβιάζει μια τέτοια λίστα τιμών;

Σε περίπτωση παραβίασης:
Απόρριψη εισαγωγής

129 8/7/2019
Εισαγωγή - Παράδειγμα

Παράδειγμα για το (α):


INSERT INTO Λογαριασμός
VALUES ('Ψηλά-Αλώνια', 'A--9732', 1200)

Όταν είναι με οποιαδήποτε σειρά, π.χ.,:

INSERT INTO Λογαριασμός (Αριθμός-Λογαριασμού, Όνομα-


Υποκαταστήματος, Ποσό)
VALUES ('A--9732', 'Ψηλά-Αλώνια', 1200)

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)
130 8/7/2019
Εισαγωγή - Παράδειγμα

Παράδειγμα για το (β): Για κάθε πελάτη που έχει πάρει δάνειο
από το υποκατάστημα Ψηλά Αλώνια προστίθεται ως δώρο
ένας λογαριασμός των 200€.
INSERT INTO Λογαριασμός
SELECT Όνομα-Υποκαταστήματος, Αριθμός-
Δανείου, 200
FROM Δάνειο
WHERE Όνομα-Υποκαταστήματος = 'Ψηλά Αλώνια'

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)

131 8/7/2019
Εισαγωγή

Πρέπει πρώτα να υπολογιστεί το select πλήρως και μετά να


γίνει η εισαγωγή.

Τι αποτέλεσμα έχει η παρακάτω εντολή αν αυτό δε συμβαίνει;


INSERT INTO Λογαριασμός
SELECT *
FROM Λογαριασμός

Επίσης, μπορεί να γίνει εισαγωγή null τιμών:


INSERT INTO Λογαριασμός
VALUES (NULL, 'A--9732', 1200)

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 132 8/7/2019
Διαγραφή Πλειάδας

Προσδιορίζεται μια συνθήκη πάνω στα γνωρίσματα της


σχέσης και διαγράφονται οι πλειάδες που την ικανοποιούν.

Μπορούμε να σβήσουμε μόνο ολόκληρες πλειάδες και όχι


συγκεκριμένα γνωρίσματα.

DELETE FROM R WHERE P


Σβήνει όλες τις πλειάδες της R για τις οποίες ισχύει το P.

Όταν λείπει το WHERE σβήνονται όλες οι


πλειάδες μιας σχέσης.

133 8/7/2019
Συνθήκη WHERE

<Όνομα_Γνωρίσματος> <τελεστής>
<Όνομα_Γνωρίσματος> ή <Τιμή>

Τελεστές σύγκρισης: <, <=, >, >=, =, <>,


κ.λπ.
Λογικοί τελεστές: AND, OR, NOT
Πρώτα υπολογίζεται η συνθήκη του
WHERE και μετά διαγράφονται οι πλειάδες
που ικανοποιούν τη συνθήκη.

134 8/7/2019
Διαγραφή – Παραδείγματα

Όλους του λογαριασμούς του Παπαδόπουλου.


DELETE FROM Καταθέτης
WHERE Όνομα-Πελάτη = 'Παπαδόπουλος'
Όλους τους λογαριασμούς στα υποκαταστήματα της Πάτρας.
DELETE FROM Λογαριασμός
WHERE Όνομα-Υποκαταστήματος IN
(SELECT Όνομα-Υποκαταστήματος
FROM Υποκατάστημα
WHERE Πόλη = 'Πάτρα')
Παρατήρηση: δεν υπάρχει τρόπος να διαγράψουμε τη μία
από δυο ίδιες πλειάδες
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 135 8/7/2019
Διαγραφή

Αν και μπορούμε να σβήσουμε πλειάδες μόνο από μία σχέση


τη φορά μπορούμε να αναφερθούμε σε περισσότερες από μια
σχέσεις στην υποερώτηση του WHERE.

Παράδειγμα: Όλους τους λογαριασμούς μιας τράπεζας με


ποσό μικρότερο από το μέσο ποσό στην τράπεζα.
DELETE FROM Λογαριασμός
WHERE Ποσό > (SELECT AVG(Ποσό)
FROM Λογαριασμός)

Πρώτα γίνεται ο έλεγχος σε όλες τις πλειάδες και μετά αυτές


που ικανοποιούν τη συνθήκη διαγράφονται.
Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)
Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού) 136 8/7/2019
Διαγραφή - Παράδειγμα

Μια τράπεζα θέλει να κλείσει όλα τα υποκαταστήματά


της που βρίσκονται στην Καστοριά.
DELETE FROM Υποκατάστημα
WHERE Όνομα-Υποκαταστήματος IN
(SELECT Όνομα-Υποκαταστήματος
FROM Υποκατάστημα
WHERE Πόλη = 'Kαστοριά')

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)

137 8/7/2019
Διαγραφή - Παράδειγμα

Πρέπει να διαγράψουμε και όλους τους λογαριασμούς:


DELETE FROM Λογαριασμός
WHERE Όνομα-Υποκαταστήματος IN
(SELECT Όνομα-Υποκαταστήματος
FROM Υποκατάστημα
WHERE Πόλη = 'Kαστοριά')
ΠΡΟΣΟΧΗ: όταν θέλουμε να διαγράψουμε κάποια δεδομένα,
πρέπει να διαγράψουμε όλα τα δεδομένα που συσχετίζονται
με αυτά. Επίσης πρέπει να προσέξουμε τη σειρά με την οποία
θα γίνουν οι διαγραφές.

Λογαριασμός(Όνομα-Υποκαταστήματος, Αριθμός-Λογαριασμού, Ποσό)


Υποκατάστημα (Όνομα-Υποκαταστήματος, Πόλη, Σύνολο)
Δάνειο(Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, Ποσό)
Δανειζόμενος(Όνομα-Πελάτη, Αριθμός-Δανείου)
Πελάτης(Όνομα-Πελάτη, Οδός, Πόλη)
Καταθέτης(Όνομα-Πελάτη, Αριθμός-Λογαριασμού)
138 8/7/2019
Διαγραφή Πλειάδας και Αναφορική Ακεραιότητα

Σε περίπτωση παραβίασης (αναφορικής ακεραιότητας


- ξένου κλειδιού), έχουμε τις παρακάτω επιλογές:
απόρριψη της διαγραφής (default)
διάδοση της διαγραφής (αυτόματη διαγραφή όλων των
πλειάδων που αναφέρονται σε αυτήν)
τροποποίηση των τιμών των αναφορικών γνωρισμάτων.
Πως;
μια ειδική τιμή ή
την τιμή NULL (αν επιτρέπεται)

Η SQL μας επιτρέπει να προσδιορίσουμε ποιες από


τις παραπάνω επιλογές θα πραγματοποιείται σε
περίπτωση παραβίασης μέσω της συνθήκης ON
DELETE όταν ορίζουμε το σχήμα.

139 8/7/2019
Διαγραφή Πλειάδας και Αναφορική Ακεραιότητα

Σε περίπτωση παραβίασης (αναφορικής


ακεραιότητας):
απόρριψη της διαγραφής (αν δεν υπάρχει προσδιορισμός)
ή
ON DELETE NO ACTION

διάδοση της διαγραφής (αυτόματη διαγραφή όλων των


πλειάδων που αναφέρονται σε αυτήν)
ON DELETE CASCADE

τροποποίηση των τιμών των αναφορικών γνωρισμάτων.


Πως;
μια ειδική τιμή ON DELETE SET DEFAULT ή
την τιμή NULL on DELETE SET NULL

140 8/7/2019
Διαγραφή

Υποκατάστημα Λογαριασμός
Πόλη Όνομα_Υποκ Όνομα_Υποκ Όνομα-Πελάτη Υπόλοιπο
Καστοριά Κ1 Κ1 ΚΩΣΤΗΣ 350.000
Καστοριά Κ3 Κ2 ΑΠΟΣΤΟΛΙΔΗΣ 230.000
Θεσσαλονίκη Θ1 Θ1 ΣΤΕΦΑΝΟΥ 670.000
Θεσσαλονίκη Θ2 Θ2 ΠΑΠΑΝΙΚΟΛΑΟΥ 256.000
Αθήνα Α1 Κ3 ΧΑΤΖΟΠΟΥΛΟΣ 410.000

Αν διαγράψουμε από τον πίνακα υποκατάστημα όλα τα


υποκαταστήματα της Καστοριάς, θα έχουμε πρόβλημα
ορθότητας στον πίνακα Λογαριασμός.

Πρώτα πρέπει να διαγράψουμε τους λογαριασμούς και μετά


τα υποκαταστήματα.

141 8/7/2019
Τροποποίηση Πλειάδας

Προσδιορίζεται μια συνθήκη πάνω στα γνωρίσματα της


σχέσης και τροποποιούνται οι πλειάδες που την ικανοποιούν

UPDATE R
SET Attr = New_Value
WHERE P

Παράδειγμα: Αύξηση όλων των καταθέσεων που είναι


μεγαλύτερες των 100€ κατά 5% λόγω τοκισμού.
UPDATE Λογαριασμός
SET Ποσό = Ποσό * 1.05
WHERE Ποσό > 100

142 8/7/2019
Τροποποίηση Πλειάδας και Αναφορική Ακεραιότητα

Σε περίπτωση παραβίασης (αναφορικής ακεραιότητας


- ξένου κλειδιού), έχουμε τις παρακάτω επιλογές:
απόρριψη της τροποποίησης (default)
διάδοση της τροποποίησης (αυτόματη τροποποίηση όλων
των πλειάδων που αναφέρονται σε αυτήν)
τροποποίηση των τιμών των αναφορικών γνωρισμάτων.
Πως;
μια ειδική τιμή ή
την τιμή NULL (αν επιτρέπεται)

Η SQL μας επιτρέπει να προσδιορίσουμε ποιες από


τις παραπάνω επιλογές θα πραγματοποιείται σε
περίπτωση παραβίασης μέσω της συνθήκης ON
UPDATE όταν ορίζουμε το σχήμα.

143 8/7/2019
Τροποποίηση Πλειάδας και Αναφορική Ακεραιότητα

Σε περίπτωση παραβίασης (αναφορικής


ακεραιότητας):
απόρριψη της τροποποίησης (αν δεν υπάρχει
προσδιορισμός) ή
ON UPDATE NO ACTION

διάδοση της τροποποίησης (αυτόματη διαγραφή όλων των


πλειάδων που αναφέρονται σε αυτήν)
ON UPDATE CASCADE

τροποποίηση των τιμών των αναφορικών γνωρισμάτων.


Πως;
μια ειδική τιμή on UPDATE SET DEFAULT ή
την τιμή NULL on UPDATE SET NULL

144 8/7/2019
Ενημερώσεις

Παράδειγμα:
στους πελάτες που έχουν υπόλοιπο < 1.000.000 η τράπεζα
δίνει 5% και στους πελάτες που έχουν υπόλοιπο > 1.000.000
δίνει 9%:

UPDATE Λογαριασμός
SET Ποσό = Ποσό * 1.05
WHERE Ποσό < 1.000.000

UPDATE Λογαριασμός
SET Ποσό = Ποσό * 1.09
WHERE Ποσό > 1.000.000

Ποιο update θα πρέπει να τρέξουμε πρώτα;

145 8/7/2019
Ενημερώσεις

Παράδειγμα: Αύξηση όλων των υπολοίπων που


είναι μεγαλύτερα από τον μέσο όρο κατά 5%.

UPDATE Λογαριασμός
SET Υπόλοιπο = Υπόλοιπο * 1.05
WHERE Υπόλοιπο > SELECT AVG(Υπόλοιπο)
FROM Λογαριασμός

146 8/7/2019
Συμπληρωματικό Υλικό

Πολύ ενδιαφέρον συμπληρωματικό υλικό,


θα βρείτε στις διευθύνσεις:
http://www.w3schools.com/sql/default.asp
http://www.tutorialspoint.com/sql/
https://www.codecademy.com/learn/learn-sql

147 8/7/2019
Βάσεις Δεδομένων

ΕΙΣΑΓΩΓΗ ΣΤΗΝ
ΚΑΝΟΝΙΚΟΠΟΙΗΣΗ
ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ
148 8/7/2019
Το πρόβλημα του πλεονασμού

Παράδειγμα (πληροφορία για >1 οντότητες σε μία


σχέση.

ΑΜ Ονομ/μο Διεύθυνση Κωδ-ΘΕ ΘΕ ΣΕΠ ΣΕΠ-email

ΓΕΩΡΓΙΟΥ ΤΕΧΝΟΛΟΓΙΑ
123 ΦΙΛΟΛΑΟΥ 12 ΠΛΗ11 ΔΕΛΗΣ del@eap.gr
ΝΙΚΟΣ ΛΟΓΙΣΜΙΚΟΥ

ΓΕΩΡΓΙΟΥ
123 ΦΙΛΟΛΑΟΥ 12 ΠΛΗ12 ΜΑΘΗΜΑΤΙΚΑ Ι ΡΑΜΦΟΣ ram@eap.gr
ΝΙΚΟΣ

ΓΕΩΡΓΙΟΥ ΕΙΣΑΓΩΓΗ ΣΤΗΝ


123 ΦΙΛΟΛΑΟΥ 12 ΠΛΗ10 ΡΟΤΙΔΗΣ rot@eap.gr
ΝΙΚΟΣ ΠΛΗΡΟΦΟΡΙΚΗ

ΛΕΚΑΣ ΤΕΧΝΟΛΟΓΙΑ
134 ΜΑΡΑΘΩΝΟΣ 2 ΠΛΗ11 ΔΕΛΗΣ del@eap.gr
ΜΑΡΙΟΣ ΛΟΓΙΣΜΙΚΟΥ

149 8/7/2019
Το πρόβλημα του πλεονασμού – Δυσλειτουργίες

Επανάληψη πληροφορίας
Δυσλειτουργία ενημέρωσης
Δυσλειτουργία εισαγωγής
Δυσλειτουργία διαγραφής
ΑΜ Ονομ/μο Διεύθυνση Κωδ-ΘΕ ΘΕ ΣΕΠ ΣΕΠ-email

ΓΕΩΡΓΙΟΥ ΤΕΧΝΟΛΟΓΙΑ
123 ΦΙΛΟΛΑΟΥ 12 ΠΛΗ11 ΔΕΛΗΣ del@eap.gr
ΝΙΚΟΣ ΛΟΓΙΣΜΙΚΟΥ

ΓΕΩΡΓΙΟΥ
123 ΦΙΛΟΛΑΟΥ 12 ΠΛΗ12 ΜΑΘΗΜΑΤΙΚΑ Ι ΡΑΜΦΟΣ ram@eap.gr
ΝΙΚΟΣ

ΓΕΩΡΓΙΟΥ ΕΙΣΑΓΩΓΗ ΣΤΗΝ


123 ΦΙΛΟΛΑΟΥ 12 ΠΛΗ10 ΡΟΤΙΔΗΣ rot@eap.gr
ΝΙΚΟΣ ΠΛΗΡΟΦΟΡΙΚΗ

ΛΕΚΑΣ ΤΕΧΝΟΛΟΓΙΑ
134 ΜΑΡΑΘΩΝΟΣ 2 ΠΛΗ11 ΔΕΛΗΣ del@eap.gr
ΜΑΡΙΟΣ ΛΟΓΙΣΜΙΚΟΥ

150 8/7/2019
Το πρόβλημα του πλεονασμού – Λύση

Αποδόμηση

ΦΟΙΤΗΤΗΣ (ΑΜ, Ονομ/μο, Διεύθυνση)


ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ (Κωδ-ΘΕ, ΘΕ, ΣΕΠ, ΣΕΠ-email)
ΕΓΓΡΑΦΗ (ΑΜ, Κωδ-ΘΕ)

ΑΜ Ονομ/μο Διεύθυνση Κωδ-ΘΕ ΘΕ ΣΕΠ ΣΕΠ-email

ΓΕΩΡΓΙΟΥ ΤΕΧΝΟΛΟΓΙΑ
123 ΦΙΛΟΛΑΟΥ 12 ΠΛΗ11 ΔΕΛΗΣ del@eap.gr
ΝΙΚΟΣ ΛΟΓΙΣΜΙΚΟΥ
ΓΕΩΡΓΙΟΥ
123 ΦΙΛΟΛΑΟΥ 12 ΠΛΗ12 ΜΑΘΗΜΑΤΙΚΑ Ι ΡΑΜΦΟΣ ram@eap.gr
ΝΙΚΟΣ

151 8/7/2019
Κανονικές Μορφές

1NF
2NF
3NF
BCNF (Boyce Codd)
4NF
5NF

152 8/7/2019
Κανονικοποίηση μέσω αποδόμησης

Δεν υπάρχει καμία σχεδιαστική ή θεωρητική


υποχρέωση για κανονικοποίηση στο μέγιστο βαθμό.

Η σχετική απόδοση στην επεξεργασία ερωτημάτων


πρέπει να λαμβάνεται υπόψη.

Στην πράξη η ανάγκη για κανονικοποίηση στην


πλειοψηφία των περιπτώσεων εξαντλείται στην τρίτη
κανονική μορφή ή στην Boyce-Codd κανονική μορφή.

Η αποδόμηση πρέπει πάντα να εξασφαλίζει την


αντίστροφη διαδικασία, δηλαδή τη σύνθεση των
αρχικών σχέσεων.

153 8/7/2019
Πλεονασμός ή επανάληψη;

Κωδικός-πελάτη Επώνυμο- Κωδικός- Περιγραφή- Ποσότητα


πελάτη ανταλλακτικού ανταλλακτικού
Π4 ΓΕΩΡΓΙΟΥ Α7 Φανάρι 1
Π4 ΓΕΩΡΓΙΟΥ Α2 Προφυλακτήρας 3
Π2 ΓΕΩΡΓΙΟΥ Α2 Προφυλακτήρας 3
Π8 ΒΑΣΙΛΕΙΟΥ Α4 Προφυλακτήρας 1

Ποιες από τις πιο κάτω περιπτώσεις αποτελούν


παραδείγματα πλεονασμού;
α) οι δύο εμφανίσεις του κωδικού ‘Π4’
β) οι δύο εμφανίσεις του ‘ΓΕΩΡΓΙΟΥ’ στις γραμμές 1 και 2
γ) οι δύο εμφανίσεις του ‘ΓΕΩΡΓΙΟΥ’ στις γραμμές 1 και 3
δ) οι δύο εμφανίσεις του ‘Προφυλακτήρας’ στις γραμμές 4 και 3
ε) οι δύο εμφανίσεις της ποσότητας ‘1’ στις γραμμές 1 και 4

154 8/7/2019
Πλεονασμός και Επιχειρησιακή Λογική

Κωδ-ΘΕ Κωδ-ΣΕΠ Επώνυμο

ΠΛΗ11 123 ΓΕΩΡΓΙΟΥ

ΠΛΗ12 124 ΝΙΚΟΛΑΟΥ

ΠΛΗ11 125 ΒΑΣΙΛΕΙΟΥ

Έχουμε πλεονασμό;

Εξαρτάται από την επιχειρησιακή λογική.


Ένα μέλος ΣΕΠ μπορεί να είναι υπεύθυνο για παραπάνω από
μία ενότητες;

155 8/7/2019
Κανονικές Μορφές 1NF

Κωδ-ΣΕΠ Επώνυμο ΘΕ

12 ΓΕΩΡΓΙΟΥ ΠΛΗ11, ΠΛΗ10, ΠΛΗ12

13 ΝΙΚΟΛΑΟΥ ΠΛΗ21

Κωδ-ΣΕΠ Επώνυμο ΘΕ
12 ΓΕΩΡΓΙΟΥ ΠΛΗ11
12 ΓΕΩΡΓΙΟΥ ΠΛΗ10
12 ΓΕΩΡΓΙΟΥ ΠΛΗ12
13 ΝΙΚΟΛΑΟΥ ΠΛΗ21

Μια σχέση βρίσκεται στην πρώτη κανονική μορφή (1NF) αν και μόνο αν
τα πεδία της περιέχουν μόνο ατομικές τιμές.

156 8/7/2019
Συναρτησιακές Εξαρτήσεις (Functional Dependencies)

Έστω μια σχέση R και δύο κατηγορήματά της A, B. Το κατηγόρημα


Β της σχέσης εξαρτάται συναρτησιακά (ή απλά εξαρτάται) από το
κατηγόρημα Α, αν και μόνο αν κάθε δυνητική τιμή του Α στη σχέση
σχετίζεται με μία μοναδική (δυνητικά και NULL) τιμή του Β.

Α→Β A B

(C, D) → (E, F) C E

D F

Αν το Α είναι υποψήφιο κλειδί, τότε η εξάρτηση Α → Β ισχύει


πάντα;
157 8/7/2019
Κανονική Μορφή 2NF

Μια σχέση βρίσκεται στη δεύτερη κανονική μορφή (2NF) αν


και μόνο αν
α) είναι στην πρώτη κανονική μορφή και
β) κάθε κατηγόρημα που δε συμμετέχει σε κλειδί εξαρτάται
συναρτησιακά πλήρως από κάθε υποψήφιο κλειδί της σχέσης.

Έστω η σχέση ΦΟΙΤΗΤΗΣ (ΑΜ, Ονομ/μο, Κωδ-ΘΕ, ΘΕ)


και οι εξαρτήσεις ΑΜ → Ονομ/μο, Κωδ-ΘΕ → ΘΕ
το ζευγάρι (ΑΜ, Κωδ-ΘΕ) είναι το μόνο υποψήφιο κλειδί

H σχέση είναι 2NF;

Αποδόμηση: ΦΟΙΤΗΤΗΣ (ΑΜ, Ονομ/μο)


ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ (Κωδ-ΘΕ, ΘΕ)
ΕΓΓΡΑΦΗ (ΑΜ, Κωδ-ΘΕ)

158 8/7/2019
Κανονική Μορφή 3NF

Έστω η σχέση ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ (Κωδ-ΘΕ, ΘΕ, ΣΕΠ, ΣΕΠ-email)

και οι εξαρτήσεις Κωδ-ΘΕ → ΘΕ, Κωδ-ΘΕ → ΣΕΠ, ΣΕΠ → ΣΕΠ-email


Λόγω μεταβατικότητας μπορούμε να συνάγουμε την εξάρτηση

Κωδ-ΘΕ → ΣΕΠ-email - συνεπώς η σχέση είναι σε 2NF

Κωδ-ΘΕ ΘΕ ΣΕΠ ΣΕΠ-email


ΠΛΗ11 ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ ΔΕΛΗΣ del@eap.gr
???
ΠΛΗ12 ΜΑΘΗΜΑΤΙΚΑ Ι ΔΕΛΗΣ del@eap.gr

ΠΛΗ10 ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΔΕΛΗΣ del@eap.gr

Μια σχέση βρίσκεται στην τρίτη κανονική μορφή (3NF) αν


και μόνο αν
α) είναι στη δεύτερη κανονική μορφή και
β) κάθε κατηγόρημα που δε συμμετέχει σε κλειδί εξαρτάται μη
μεταβατικά από κάθε υποψήφιο κλειδί της σχέσης. 159 8/7/2019
Κανονική Μορφή 3NF – Συνέχεια…

Αποδόμηση:

ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ (Κωδ-ΘΕ, ΘΕ, ΣΕΠ)

ΜΕΛΟΣ-ΣΕΠ (ΣΕΠ, ΣΕΠ-email)

160 8/7/2019
Κανονική Μορφή BCNF

ΕΓΓΡΑΦΗ-ΦΟΙΤΗΤΗ (ΑΜ, Ονομ/μο, Κωδ-ΘΕ, ΘΕ, Ημ/νια-εγγραφής)

η σχέση έχει τα ακόλουθα υποψήφια κλειδιά:


(ΑΜ, Κωδ-ΘΕ)
(ΑΜ, ΘΕ)
(Ονομ/μο, Κωδ-ΘΕ)
(Ονομ/μο, ΘΕ)
Προφανώς με βάση αυτές τις παραδοχές, θεωρήσαμε πως το όνομα μιας
θεματικής ενότητας την καθορίζει μονοσήμαντα, το ίδιο και το ονομ/μο
ενός φοιτητή καθορίζει μονοσήμαντα το φοιτητή. Συνεπώς ισχύουν οι
ακόλουθες εξαρτήσεις:
Κωδ-ΘΕ → ΘΕ
ΑΜ → Ονομ/μο η σχέση είναι 3NF

161 8/7/2019
Κανονική Μορφή BCNF – Συνέχεια…

Ημ/νια-
ΑΜ Ονομ/μο Κωδ-ΘΕ ΘΕ
εγγραφής
ΓΕΩΡΓΙΟΥ ΤΕΧΝΟΛΟΓΙΑ
123 ΠΛΗ11 2/9/2008
ΝΙΚΟΣ ΛΟΓΙΣΜΙΚΟΥ
ΓΕΩΡΓΙΟΥ
123 ΠΛΗ12 ΜΑΘΗΜΑΤΙΚΑ Ι 2/9/2008
ΝΙΚΟΣ
ΝΙΚΟΛΑΟΥ ΤΕΧΝΟΛΟΓΙΑ
134 ΠΛΗ11 1/9/2008
ΓΙΩΡΓΟΣ ΛΟΓΙΣΜΙΚΟΥ
ΝΙΚΟΛΑΟΥ
134 ΠΛΗ12 ΜΑΘΗΜΑΤΙΚΑ Ι 1/9/2008
ΓΙΩΡΓΟΣ

Υπάρχει πλεονασμός;

Μια σχέση R βρίσκεται στην κανονική μορφή Boyce-Codd (BCNF)


αν και μόνο αν όποτε υπάρχει εξάρτηση της μορφής Χ→Α στην R,
και το Α δεν ανήκει στο Χ, τότε το Χ είναι υποψήφιο κλειδί.

162 8/7/2019
Κανονική Μορφή BCNF – Συνέχεια…

ΦΟΙΤΗΤΗΣ (ΑΜ, Ονομ/μο)

ΘΕΜΑΤΙΚΗ-ΕΝΟΤΗΤΑ (Κωδ-ΘΕ, ΘΕ)

ΕΓΓΡΑΦΗ (ΑΜ, Κωδ-ΘΕ, Ημ/νια-εγγραφής)

Αποδόμηση

163 8/7/2019
Ιδιότητες Αποδόμησης

Διατήρηση κατηγορημάτων
Άρση πλεονασμού
Αποφυγή απώλειας σύνδεσης
Διατήρηση εξαρτήσεων (όχι πάντα επιτεύξιμη)

Έστω η σχέση

ΕΓΓΡΑΦΗ (ΑΜ, Κωδ-ΘΕ, Ημ/νια, Αίθουσα, Μέλος-ΣΕΠ)

Έστω επίσης η ακόλουθη αποδόμηση:


ΕΓΓΡΑΦΗ1 (ΑΜ, Κωδ-ΘΕ, Ημ/νια)
ΕΓΓΡΑΦΗ2 (Ημ/νια, Αίθουσα, Μέλος-ΣΕΠ)

164 8/7/2019
Ιδιότητες Αποδόμησης – Συνέχεια…

ΑΜ Κωδ-ΘΕ Ημ/νια Αίθουσα Μέλος-ΣΕΠ


123 ΠΛΗ11 2/9/2008 ΑΑ-21 ΔΕΛΗΣ
123 ΠΛΗ12 2/9/2008 ΑΑ-21 ΓΕΩΡΓΙΟΥ
134 ΠΛΗ11 1/9/2008 ΑΑ-21 ΔΕΛΗΣ
1351 ΠΛΗ21 2/9/2008 ΠΑ-2 ΝΙΚΟΛΑΟΥ
138 ΠΛΗ22 5/9/2008 ΠΑ-6 ΑΝΤΩΝΙΟΥ

ΑΜ Κωδ-ΘΕ Ημ/νια Ημ/νια Αίθουσα Μέλος-ΣΕΠ


123 ΠΛΗ11 2/9/2008 2/9/2008 ΑΑ-21 ΔΕΛΗΣ

123 ΠΛΗ12 2/9/2008 2/9/2008 ΑΑ-21 ΓΕΩΡΓΙΟΥ

134 ΠΛΗ11 1/9/2008 1/9/2008 ΑΑ-21 ΔΕΛΗΣ

1351 ΠΛΗ21 2/9/2008 2/9/2008 ΠΑ-2 ΝΙΚΟΛΑΟΥ

138 ΠΛΗ22 5/9/2008 5/9/2008 ΠΑ-6 ΑΝΤΩΝΙΟΥ

165 8/7/2019
Ιδιότητες Αποδόμησης – Συνέχεια…

Η σύνδεση των δύο τελευταίων σχέσεων:


ΑΜ Κωδ-ΘΕ Ημ/νια Αίθουσα Μέλος-ΣΕΠ
123 ΠΛΗ11 2/9/2008 ΑΑ-21 ΔΕΛΗΣ
123 ΠΛΗ11 2/9/2008 ΑΑ-21 ΓΕΩΡΓΙΟΥ
123 ΠΛΗ11 2/9/2008 ΠΑ-2 ΝΙΚΟΛΑΟΥ
123 ΠΛΗ12 2/9/2008 ΑΑ-21 ΔΕΛΗΣ
123 ΠΛΗ12 2/9/2008 ΑΑ-21 ΓΕΩΡΓΙΟΥ
123 ΠΛΗ12 2/9/2008 ΠΑ-2 ΝΙΚΟΛΑΟΥ
1351 ΠΛΗ21 2/9/2008 ΑΑ-21 ΔΕΛΗΣ
1351 ΠΛΗ21 2/9/2008 ΑΑ-21 ΓΕΩΡΓΙΟΥ
1351 ΠΛΗ21 2/9/2008 ΠΑ-2 ΝΙΚΟΛΑΟΥ
134 ΠΛΗ11 1/9/2008 ΑΑ-21 ΔΕΛΗΣ
138 ΠΛΗ22 5/9/2008 ΠΑ-6 ΑΝΤΩΝΙΟΥ
166 8/7/2019
Ιδιότητες Αποδόμησης – Συνέχεια…

Η αποδόμηση μιας σχέσης R σε ένα σύνολο


σχέσεων R1, R2, ..., Rn ονομάζεται «αποδόμηση
χωρίς απώλειες σύνδεσης» αν και μόνο αν η
σχέση R είναι το αποτέλεσμα της φυσικής
σύνδεσης των σχέσεων R1, R2, ..., Rn.

167 8/7/2019
Αποδόμηση σε BCNF – Μέθοδος A’

Κάθε ορίζουσα (αριστερό μέλος εξάρτησης) που δεν είναι


υποψήφιο κλειδί, γίνεται κλειδί σε νέα σχέση στην οποία
προσθέτουμε ως πεδία τα εξαρτόμενα κατηγορήματα της
ορίζουσας.

Τα υποψήφια κλειδιά του παλιού πίνακα μαζί με τα αμέσως (κι


όχι μεταβατικά) εξαρτώμενα πεδία τους θα παραμείνουν στο
συμπτυγμένο πλέον παλιό πίνακα.

168 8/7/2019
Αποδόμηση σε BCNF – Μέθοδος A’ – Συνέχεια…

R(Α,B,C,D,Ε,F,G) A C E

B F G

R1(Α,B,F) A
D
A
C D

R2(Α,C) F A C E
F C E
B
R3(C,D,Ε) G
B
G

R4(F,G)
C D
A F A
F F C E
B G B
D F

A C E G

A C
A
F
B
D

F G C E

169 8/7/2019
Αποδόμηση σε BCNF – Μέθοδος Β’

Για κάθε σχέση R και για κάθε εξάρτηση της μορφής (μάλιστα
προσθέτουμε στο δεξί μέρος όλα τα Βi, i = 1...ν, τα οποία εξαρτώνται
από το (Α1, Α2, ..., Αν))

(Α1, Α2, ..., Αν) → (Β1, Β2, ..., Βν)

η οποία παραβιάζει τη BCNF μορφή (δηλαδή το (Α1, Α2, ..., Αν) δεν
είναι υποψήφιο κλειδί) δημιουργούμε νέα σχέση R’ με τα
κατηγορήματα Α1, Α2, ... Αν, Β1, Β2, ... Βν.
Τα Αi, αποτελούν το κλειδί της νέας σχέσης. Στη σχέση R πλέον
παραμένουν τα αρχικά κατηγορήματα πλην των Βi.

λοιπά
πεδία Αi Bi

170 8/7/2019
Έλεγχος για lossless Αποδόμηση

1. Έστω η σχέση R

2. Έστω F το σύνολο όλων των συναρτησιακών εξαρτήσεων


πάνω στην R και F’ το σύνολο όλων των εξαρτήσεων που
μπορούν να παραχθούν από το F (με βάση την ιδιότητα της
μεταβατικότητας)

3. Έστω R1 και R2 μια αποδόμηση της R

4. Η αποδόμηση δεν παρουσιάζει απώλειες σύνδεσης αν


τουλάχιστο μία από τις ακόλουθες εξαρτήσεις ανήκει στο F’

R1 ∩ R2 → R1
R1 ∩ R2 → R2

171 8/7/2019
Ερωτήσεις

Επιμέλεια Υλικού:
Γ. Τζήμας, Μ. Παρασκευάς, Γ. Οικονόμου
μέλη Σ.Ε.Π. Θ.Ε. ΠΛΗ11
Το σύνολο των διαφανειών προήλθε από το υλικό και τις διαφάνειες του Δρ. Β. Δελή, από
διαφάνειες της Δρ. Ε. Πιτουρά και του Δρ. Χ. Γκουμόπουλου και από το βιβλίο “Database
System Concepts”, Silberschatz et al. 172 8/7/2019

Vous aimerez peut-être aussi