You are on page 1of 182

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι

Ευαγγελίδης Γεώργιος

Τμήμα Εφαρμοσμένης Πληροφορικής

Ενότητα 1:
Ορισμοί βασικών εννοιών: Μια πρώτη
μοντελοποίηση
Μέρος 1

Ορισμοί βασικών εννοιών

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Τι είναι Βάση Δεδομένων;


• Μια οργανωμένη (ολοκληρωμένη) συλλογή
μεγάλου όγκου δεδομένων.
• Μοντελοποιεί τις δραστηριότητες μιας
πραγματικής επιχείρησης/οργανισμού:
– Αντικείμενα (π.χ., φοιτητές, μαθήματα).
– Συσχετίσεις (π.χ., φοιτητής γράφεται σε μάθημα).
• Βρίσκεται “πίσω” από οποιοδήποτε
πληροφοριακό σύστημα.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Τί είναι Σύστημα Διαχείρισης
Βάσεων Δεδομένων (ΣΔΒΔ);
• Ένα λογισμικό που αποθηκεύει και
διαχειρίζεται βάσεις δεδομένων.
• Εμπορικά ΣΔΒΔ (DBMS).
– Oracle, IBM DB2, Microsoft SQL Server.
• ΕΛ/ΛΑΚ ΣΔΒΔ.
– MySQL (MariaDB), PostgreSQL, SQLite.
• Desktop ΣΔΒΔ.
– Microsoft Access, LibreOffice Base.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Πιο αναλυτικός ορισμός ΣΔΒΔ


• Ένα ΣΔΒΔ μας επιτρέπει:
αποτελεσματική,
αξιόπιστη,
εύκολη,
ασφαλή,
αποθήκευση και πρόσβαση σε τεράστιο όγκο μόνιμων
δεδομένων από πολλούς χρήστες ταυτόχρονα.
• Είναι υπεύθυνο για την ακεραιότητα και
ασφάλεια των δεδομένων μας.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Λειτουργίες ΣΔΒΔ
• Ορισμός/διαχείριση δομής βάσεων δεδομένων.
• Διαχείριση δεδομένων
(εισαγωγή/διαγραφή/ενημέρωση).
• Ανάκτηση δεδομένων μέσω ερωτημάτων
(αιτημάτων).
• Διαχείριση συστήματος (χρήστες, ασφάλεια,
επαναφορά).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ιστορικά στοιχεία (1)


• Σύμφωνα με το χρησιμοποιούμενο μοντέλο
δεδομένων:
– 1960-1970:
• Δικτυωτό μοντέλοIDS (Integrated Data Store) της
General ElectricCharles Bachman βραβείο ACM Turing
1973.
• Ιεραρχικό μοντέλοIMS (Information Management
System) της IBMSabre των IBM και American Airlines.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ιστορικά στοιχεία (2)
• 1970-σήμερα:
– Σχεσιακό μοντέλο (IBM, Edgar Codd βραβείο ACM
Turing 1981) (System R της IBM, SQL ANSI/ISO)
(ταυτοχρονισμός σχεσιακών ΣΔΒΔ, Jim Gray βραβείο
ACM Turing 1999).
• 1980-1990:
– Αντικειμενοστραφές μοντέλο (και υβριδικό
αντικειμενο-σχεσιακό).
• 2000-σήμερα:
– Μετα-σχεσιακό μοντέλο (XML έγγραφα, αποθήκες
ζευγών (κλειδί, τιμή), βάσεις δεδομένων NoSQL,
NewSQL).
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Βασικές έννοιες
• Μοντέλο Δεδομένων.
• Σχήμα και Δεδομένα.
• Γλώσσα Ορισμού Δεδομένων.
• Γλώσσα Διαχείρισης Δεδομένων.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Επίπεδα Αφαίρεσης
• Εξωτερικό Σχήμα.
• Λογικό Σχήμα.
• Εσωτερικό/Φυσικό Σχήμα.

• Λογική Ανεξαρτησία των Δεδομένων.


• Φυσική Ανεξαρτησία των Δεδομένων.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Βασικοί Ρόλοι
• Κατασκευαστής ΣΔΒΔ.
• Αναλυτής/Σχεδιαστής Βάσεων Δεδομένων.
• Προγραμματιστής Βάσεων Δεδομένων.
• Διαχειριστής Βάσεων Δεδομένων (DBA).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Μέρος 2

Μια πρώτη μοντελοποίηση

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Το πρόβλημα
• Έχουμε εκατοντάδες cd από εφημερίδες και
περιοδικά.
• Τα περισσότερα είναι συλλογές τραγουδιών
διάφορων καλλιτεχνών.
• Θέλουμε να κατασκευάσουμε μια εφαρμογή
αναζήτησης με βάση λέξεις κλειδιά σχετικών με
τον τίτλο του cd ή το όνομα του καλλιτέχνη
ή τον τίτλο του τραγουδιού .

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Διάφορες προσεγγίσεις (1)
• Καρτέλες, μια για κάθε cd, ταξινομημένες
αλφαβητικά ως προς τον τίτλο του cd.
• Πιθανόν OK για να βρίσκω τα cd, αλλά στην
περίπτωσή μας δεν βοηθάνε.
• Και αν θέλω να ψάξω για όλα τα τραγούδια
ενός συγκεκριμένου καλλιτέχνη;
• Ή όλα τα τραγούδια που περιέχουν μια λέξη
κλειδί;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Διάφορες προσεγγίσεις (2)


• Μπορώ να έχω και επιπλέον καρτέλες, μια για
κάθε καλλιτέχνη, ταξινομημένες αλφαβητικά ως
προς το όνομα του καλλιτέχνη.
• Επίσης, επιπλέον καρτέλες για τα τραγούδια.
• Αντιστοιχία με τις δομές δεδομένων (εγγραφές
σε πίνακες, λίστες, ουρές, κλπ.)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Μια λύση με έναν μόνο πίνακα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Προβλήματα flat table


• Πολλαπλή καταχώριση της ίδιας πληροφορίας:
– Δυσκολία εισαγωγής, διαγραφής, ενημέρωσης.
– Ασυνέπεια στα δεδομένα.
– Μεγάλος όγκος.
– Απώλεια πληροφορίας.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Μια βελτίωση;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Χρειαζόμαστε και αυτό!


• Είναι οι συσχετίσεις
ανάμεσα στις οντότητες.
• Είναι η δυναμική
πληροφορία που
παράγεται κατά τη
λειτουργία του
πληροφοριακού
συστήματος της
επιχείρισης/ οργανισμού.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 2:
Μοντελο Συσχετίσεων – Οντοτήτων, Μελέτη
Περίπτωσης: Η βάση δεδομένων των CD

Μέρος 1

Μοντέλο Οντοτήτων-Συσχετίσεων

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Σχεδιάζοντας μια ΒΔ
• Ανάλυση απαιτήσεων.
• Σχεδιασμός ιδεατού σχήματος (μοντέλο
Οντοτήτων-Συσχετίσεων).
• Σχεδιασμός λογικού σχήματος (Σχεσιακό
μοντέλο) *** εδώ μπορούμε να φτάσουμε
απευθείας από άλλη οδό (Κανονικοποίηση με
διάσπαση – θα μιλήσουμε σε επόμενο
μάθημα)***.
• Σχεδίαση φυσικού σχήματος (σε επιλεγμένο
ΣΔΒΔ).
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Σχεδιασμός ιδεατού σχήματος


• Διάγραμμα Οντοτήτων-Συσχετίσεων:
– Σύνολα Οντοτήτων και Συσχετίσεων.
– Γνωρίσματα συνόλων οντοτήτων και συσχετίσεων.
– Επιχειρησιακοί κανόνες.
• Αλγόριθμος μετατροπής διαγράμματος ΟΣ σε
σχεσιακό μοντέλο.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Οντότητες
• Αντικείμενα του φυσικού ή ιδεατού κόσμου:
– π.χ., ένα cd, ένα τραγούδι, μια δισκογραφική εταιρία.
• Μια οντότητα έχει συγκεκριμένα γνωρίσματα ή
ιδιότητες:
– π.χ., ένα cd έχει τίτλο, έτος κυκλοφορίας, εταιρία
έκδοσης.
• Κάθε γνώρισμα παίρνει τιμές από ένα
συγκεκριμένο πεδίο ορισμού:
– π.χ., το έτος κυκλοφορίας είναι ακέραιος αριθμός.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Σύνολα οντοτήτων
• Μια συλλογή από μοναδικές όμοιες οντότητες:
– π.χ., όλα τα cd της συλλογής μας.
• Σημασιολογία ίδια με τα μαθηματικά σύνολα.
• Συμβολίζεται από ένα ορθογώνιο.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Περί κλειδιών
• Κλειδί: ελάχιστος συνδυασμός γνωρισμάτων
που προσδιορίζει μονοσήμαντα κάθε οντότητα
σε ένα σύνολο οντοτήτων.
• Υποψήφιο κλειδί: ένα οποιοδήποτε από τα
παραπάνω κλειδιά.
• Κύριο κλειδί: ένα κλειδί της επιλογής μας –
συνήθως το συντομότερο – μπορεί να είναι και
τεχνητό.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Συσχέτιση
• Όταν οντότητες συσχετίζονται μεταξύ τους:
– π.χ., το τραγούδι “Σιγά μην κλάψω” υπάρχει στο cd
“Από 'δω και πάνω”.
• Το ρήμα στην παραπάνω πρόταση δηλώνει μια
συσχέτιση ανάμεσα σε δυο συγκεκριμένες
οντότητες.
• Μια συσχέτιση μπορεί να έχει δικά της
γνωρίσματα.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Σύνολο συσχετίσεων
• Μια συλλογή από μοναδικές όμοιες
συσχετίσεις:
– π.χ., ποια τραγούδια υπάρχουν σε ποια cd.
• Συμβολίζεται με ρόμβο.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παραδείγματα (1)
• Τριαδική συσχέτιση.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Παραδείγματα (2)
• Αναδρομική συσχέτιση.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Περιορισμοί κλειδιού (1)


• Δηλώνουν πόσες οντότητες ενός συνόλου
συσχετίζονται με πόσες οντότητες ενός άλλου
συνόλου.
• Συμβολίζονται με την ύπαρξη ή όχι βέλους.
• 1-1, 1-πολλά, πολλά-1, πολλά-πολλά.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Περιορισμοί κλειδιού (2)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Περιορισμοί συμμετοχής (1)


• Είναι απαραίτητο να συσχετίζονται όλες οι
οντότητες ενός συνόλου με οντότητες ενός
άλλου συνόλου;
• Συμβολίζονται με παχιά ή λεπτή γραμμή.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Περιορισμοί συμμετοχής (2)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Αδύναμες οντότητες
• Όταν μια οντότητα μπορεί να προσδιοριστεί
μονοσήμαντα με τη βοήθεια του κλειδιού μιας
άλλης οντότητας (ισχυρής).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ιεραρχίες ISA
• Όπως η κληρονομικότητα των κλάσεων στον
αντικειμενοστραφή προγραμματισμό.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Συνυπολογισμός
• Δίνει τη δυνατότητα συσχέτισης συνόλων
οντοτήτων και συνόλων συσχετίσεων!

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Μέρος 2

Μελέτη Περίπτωσης: Η βάση δεδομένων των CD

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ένα πρώτο ιδεατό μοντέλο


• Τα cd έχουν τραγούδια και αυτά ερμηνευτές

• Πρόβλημα: η έμμεση συσχέτιση των cd με τους


ερμηνευτές είναι ασαφής.
• Ποιος ερμηνευτής ενός τραγουδιού (από τους πιθανόν
πολλούς) το εκτελεί σε ένα συγκεκριμένο cd;
• Μήπως μερικοί το ερμηνεύουν σε ντουέτο;
Επίσης, δεν γίνεται να υπάρχει ένα τραγούδι >1 φορά σε
ένα cd ή ένας ερμηνευτής να εκτελέσει >1 φορά ένα
τραγούδι
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ένα καλύτερο...
• Τριαδικό σύνολο συσχετίσεων

Πρόβλημα: δεν μπορώ να έχω >1 εμφάνιση του


ίδιου τραγουδιού από τον ίδιο εκτελεστή σε ένα
cd – με τα ντουέτα τί γίνεται;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ένα ακόμη καλύτερο...


• Το πρόβλημα προέκυπτε από τη σύγχυση
ανάμεσα στις έννοιες τραγούδι και ηχογράφηση

Το μόνο που δεν υποστηρίζεται είναι να υπάρχει


>1 φορά μια ηχογράφηση στο ίδιο cd
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 3:
Σχεσιακό Μοντέλο. Από το ιδεατό στο λογικό
(σχεσιακό) μοντέλο. Από το λογικό στο φυσικό
(SQL) μοντέλο

Μέρος 1

Σχεσιακό Μοντέλο

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Σχεσιακό μοντέλο
• E.F. Codd (1970)
• Διαδεδομένο
• Πολύ απλό
• Απλή υψηλού επιπέδου (4ης γενιάς) γλώσσα
• Αποδοτικές υλοποιήσεις

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ορισμοί (1)
• Βάση Δεδομένων
• Σχέσεις (Πίνακες)
• Γνωρίσματα (Στήλες)
• Εγγραφές (Γραμμές)
• Πληθυσμός (Κ)
• Βαθμός (Ν)
• Πεδία Ορισμού
• Σειρά
εγγραφών/στηλών
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ορισμοί (2)
• Σχήμα ΒΔ
• Στιγμιότυπο
πίνακα
• Τιμές NULL
• Κλειδί

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Δημιουργία πινάκων
• Σχήμα πίνακα
CD(code, title, year)

• Εντολή DDL της SQL: CREATE TABLE


CREATE TABLE CD (code integer, title
varchar(200), year integer)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Τροποποίηση σχήματος πινάκων
• Εντολή DDL της SQL: ALTER TABLE
ALTER TABLE CD ADD COLUMN bought
DATEALTER TABLE CD DROP COLUMN
yearALTER TABLE CD MODIFY COLUMN year
DATE
• Εντολή DDL της SQL: DROP TABLE
DROP TABLE CD

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Μέρος 2

Από το ιδεατό στο λογικό μοντέλο

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Από το ιδεατό στο λογικό (1)
• Σύνολο οντοτήτων γίνεται πίνακας.

CD(code, year, title)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Από το ιδεατό στο λογικό (2)


• Σύνολο συσχετίσεων γίνεται πίνακας για
περιορισμό κλειδιού πολλά-πολλά.

HAS(cdcode, songcode, pos)


Ξένα κλειδιά: cdcode, songcode
Σύνθετο κλειδί: (cdcode, songcode)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Από το ιδεατό στο λογικό (3)
• Σύνολο συσχετίσεων δεν γίνεται πίνακας για
περιορισμό κλειδιού 1-πολλά, πολλά-1, 1-1.

Αντί για: HAS(companycode, cdcode)


CD(cdcode, ...)
Έχω: CD(cdcode, ..., companycode)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Από το ιδεατό στο λογικό (4)


• Για τον παρακάτω περιορισμό συμμετοχής:

CD(cdcode, ..., companycode)


και companycode δεν μπορεί να πάρει τιμή NULL
Τι κάνουμε σε όλες τις άλλες περιπτώσεις;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Από το ιδεατό στο λογικό (5)
• Αδύναμα σύνολα οντοτήτων

CD(code, ...)
COPY(code, num, condition)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Από το ιδεατό στο λογικό (6)


• Ιεραρχίες ISA

• είτε: RECORDING(code, year)


VINYL(code, price, weight)
MP3(...) CD(...)
• ή: VINYL(code, year, price, weight) MP3(...) CD(...)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Από το ιδεατό στο λογικό (7)
• Συνυπολογισμός

MANAGER(managercode, ...)
CD(cdcode, ...)
ARTIST(artistcode, ...)
CD_HAS_ARTIST(cdcode, artistcode, managercode)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Μέρος 3

Από το λογικό στο φυσικό μοντέλο

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Από το λογικό στο φυσικό (1)
CD(code, title, year)

CREATE TABLE CD (code integer primary key,


title varchar(200) NOT NULL,year integer)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Από το λογικό στο φυσικό (2)


HAS(cdcode, songcode, pos)
Ξένα κλειδιά: cdcode, songcode
Σύνθετο κλειδί: (cdcode, songcode)

CREATE TABLE HAS (


cdcode integer NOT NULL,
songcode integer NOT NULL,
pos integer NOT NULL,
PRIMARY KEY (cdcode, songcode),
FOREIGN KEY (cdcode) REFERENCES CD(code),
FOREIGN KEY (songcode) REFERENCES SONG(code))

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Από το λογικό στο φυσικό (3)
Εναλλακτικά:
CREATE TABLE HAS (
cdcode integer NOT NULL,
songcode integer NOT NULL,
pos integer NOT NULL,
PRIMARY KEY (cdcode, songcode)
CONSTRAINT fk_1 FOREIGN KEY (cdcode)
REFERENCES CD(code),
CONSTRAINT fk_2 FOREIGN KEY(songcode)
REFERENCES SONG(code))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Από το λογικό στο φυσικό (4)


Επίσης:
ALTER TABLE ADD CONSTRAINT...
ALTER TABLE ADD FOREIGN KEY...
ALTER TABLE DROP CONSTRAINT...
ALTER TABLE DROP FOREIGN KEY...
Για σιγουριά δείτε εγχειρίδιο συγκεκριμένου ΣΔΒΔ

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Από το λογικό στο φυσικό (5)
• Περιορισμός συμμετοχής:
CD(cdcode, ..., companycode)
και companycode δεν μπορεί να πάρει τιμή NULL
CREATE TABLE CD (
cdcode integer PRIMARY KEY,
...
companycode integer NOT NULL,
FOREIGN KEY companycode
REFERENCES COMPANY(code))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Από το λογικό στο φυσικό (6)


• Αδύναμο σύνολο οντοτήτων
CD(code, ...)
COPY(code, num, condition)
CREATE TABLE COPY (
code integer NOT NULL,
num integer NOT NULL,
condition char(3),
PRIMARY KEY (code, num),
FOREIGN KEY code REFERENCES CD(code))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Περιορισμοί Ακεραιότητας (1)
• Πεδίου ορισμού
• NULL
• UNIQUE
• Κυρίου κλειδιού (PRIMARY KEY)
CREATE TABLE STUDENT (
AM char(10) NOT NULL PRIMARY KEY,
AT char(8) NOT NULL UNIQUE,
name varchar(100))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Περιορισμοί Ακεραιότητας (2)


• Αναφορική (FOREIGN KEY)
– Τί συμβαίνει σε περίπτωση
διαγραφής/τροποποίησης του κύριου κλειδιού στο
οποίο αναφέρεται το ξένο κλειδί;
– ON DELETE ή ON UPDATE
• NO ACTION
• CASCADE
• SET NULL/SET DEFAULT

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Αναφορική ακεραιότητα
CREATE TABLE HAS (
cdcode integer NOT NULL,
songcode integer NOT NULL,
pos integer NOT NULL,
PRIMARY KEY (cdcode, songcode),
FOREIGN KEY (cdcode) REFERENCES CD(code)
ON DELETE CASCADE
ON UPDATE CASCADE
FOREIGN KEY (songcode) REFERENCES SONG(code)
ON DELETE CASCADE
ON UPDATE CASCADE)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Εντολές DML της SQL


INSERT INTO CD VALUES (1, 'Adele 21')

UPDATE CD
SET title='Adele 22'
WHERE code=1

DELETE FROM CD
WHERE code=1
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 4:
Σχεσιακή Άλγεβρα, Παραδείγματα

Μέρος 1

Σχεσιακή Άλγεβρα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Γλώσσες αιτημάτων
• Χρειάζονται για τη διαχείριση και ανάκτηση
δεδομένων από μια βάση δεδομένων.
• Το σχεσιακό μοντέλο έχει να κάνει με σύνολα.
• Χρειαζόμαστε μια μαθηματική γλώσσα
χειρισμού συνόλων = Σχεσιακή Άλγεβρα.
• Απλό μοντέλο => απλή αλλά ισχυρή γλώσσα
=> επιδέχεται βελτιστοποιήσεων.
• Απαραίτητη για την κατανόηση της SQL.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Εισαγωγικά
• Οι πράξεις της σχεσιακής άλγεβρας έχουν ως
είσοδο σχεσιακούς πίνακες και ως έξοδο
σχεσιακό πίνακα.
• Τα σχήματα των συμμετεχόντων σχέσεων
(πινάκων) καθώς και του αποτελέσματος
παραμένουν σταθερά.
• Δεν μας ενδιαφέρει το περιεχόμενο των
στιγμιοτύπων τους.
• Μπορεί το αποτέλεσμα να είναι ο κενός
πίνακας.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Βασικές πράξεις
• Προβολή (π) φιλτράρει στήλες.
• Επιλογή (σ) φιλτράρει γραμμές.
• Γινόμενο (x) συνδυάζει δυο πίνακες.
• Διαφορά (-) όπως στα σύνολα.
• Ένωση (U) όπως στα σύνολα.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Προβολή (π)
Ποια είναι όλα τα καταχωρισμένα έτη κυκλοφορίας
cd;
π year (CD)

• Γενική μορφή π λίστα-πεδίων (πίνακας).


• Ποιο είναι το κλειδί του αποτελέσματος;
• Οι διπλοεγγραφές αφαιρούνται – το αποτέλεσμα
πρέπει να είναι σχεσιακός πίνακας.
• Σχήμα και πληθυσμός αποτελέσματος;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Επιλογή (σ)
Ποια cd κυκλοφόρησαν το 1965;
σ year=1965 (CD)

• Γενική μορφή σ συνθήκες (πίνακας).


• Μπορεί να έχουμε σύνθετες συνθήκες με τη
χρήση AND, OR, NOT.
• Σχήμα και πληθυσμός αποτελέσματος;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Γινόμενο (x)
• Συνδυάζει όλες ΑxΒ Α x Β = Β x Α;
τις γραμμές Έχει σημασία η
ενός πίνακα με Σχήμα και σειρά των
όλες τις γραμμών;
γραμμές ενός πληθυσμός
άλλου πίνακα. αποτελέσματος; ... η σειρά των
στηλών;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Διαφορά και Ένωση
• Αν CD1 είναι ο πίνακας με τα δικά μου cd και
CD2 με τα cd ενός φίλου μου:
Ποια cd έχω εγώ αλλά όχι ο φίλος μου; CD1 –
CD2
Ποια cd έχουμε και οι δυο μαζί; CD1 U CD2

• Οι πίνακες συμβατοί ως προς την ένωση.


• Τί γίνεται με τις διπλοεγγραφές;
• Σχήμα και πληθυσμός αποτελέσματος;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Σύνθεση πράξεων
• Όπως στις μαθηματικές πράξεις f(g(h(x))).
Ποιοι είναι οι τίτλοι των cd που έχω εγώ αλλά όχι
ο φίλος μου που κυκλοφόρησαν το 2010;

π title (σ year=2010 (CD1 - CD2))

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Μετονομασία (ρ)
• Πρόκειται για βοηθητική πράξη.
• Όταν συνδυάζω πίνακες (π.χ., με γινόμενο), τι
κάνω αν έχω πεδία με την ίδια ονομασία στους
αρχικούς πίνακες;
CD1 x (ρ id2/id, title2/title (CD2))
• Γενική μορφή:
ρ νέο_όνομα_πεδίου/παλιό_όνομα_πεδίου (πίνακας)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Επιπλέον σύνθετες πράξεις (1)


• Τομή (∩) όπως στα σύνολα.
A ∩ Β = Α – (A – B) = B – (B – A)
A ∩ Β = A U B – (A – B) – (B – A)
• Σύζευξη = επιλογή πάνω σε γινόμενο:
Α xσυνθήκη Β = σ συνθήκη (Α x Β)
• Αποκτά νόημα το γινόμενο καθώς επιλέγουμε
ποιες γραμμές θα ανήκουν στο αποτέλεσμά
του.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Επιπλέον σύνθετες πράξεις (2)
• Φυσική σύζευξη = όταν η επιλογή είναι
συνθήκη ισότητας ανάμεσα στα κοινά πεδία
των πινάκων, πρακτικά κύριο κλειδί με ξένο
κλειδί.
π.χ., αν A(a1, a2) και B(b1, b2, b3) και b3 είναι
ξένο κλειδί και αναφέρεται στο a1:
Α |x| Β = σ A.a1=B.b3 (Α x Β)
• Μόνο ένα αντίγραφο της κοινής στήλης μένει
στο αποτέλεσμα της σύζευξης.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Επιπλέον σύνθετες πράξεις (3)


• Φυσική σύζευξη: πολύ χρήσιμη πράξη καθώς
συνδυάζει γραμμές πινάκων μεταξύ τους μέσω
των τιμών κλειδιού/ξένου κλειδιού.
• Έστω:
CD(id, title, year, comid) COMPANY(id, name)
• Ποιες εταιρίες κυκλοφόρησαν cd το 2013;
π company.name ((σ year=2013 (CD)) |x| COMPANY)
ή
π company.name (σ cd.comid=company.id AND year=2013 (CD x COMPANY))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Επιπλέον σύνθετες πράξεις (4)
• Διαίρεση (/) δυαδική πράξη.
Α/Β
Προϋπόθεση: σχήμα(Β) ⊂ σχήμα(Α).
σχήμα(Α / Β) = σχήμα(Α) – σχήμα(Β).
Ερμηνεία αποτελέσματος: όλες οι διακριτές
εγγραφές του Α αφού κρατήσουμε μόνο τα μη
κοινά πεδία του σε σχέση με τον Β που
συνδυάζονται με όλες τις εγγραφές του Β.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Επιπλέον σύνθετες πράξεις (5)


• Παράδειγμα διαίρεσης A / B.
• Μόνο οι εγγραφές (χ, ψ) και (κ, λ) του πίνακα
Α(π1, π3) συνδυάζονται με όλες τις εγγραφές του
Β. Οι (α, β) και (γ, δ) συνδυάζονται με μερικές.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Μέρος 2

Παραδείγματα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Στοιχεία πινάκων
• Έστω το σχήμα βάσης δεδομένων:
RECORDING(rid, title, year) ή R
PERFORMER(pid, name) ή P
HAS(rid, pid) ή H
Όπου:
RECORDING έχει 100 εγγραφές
PERFORMER έχει 10 εγγραφές
HAS έχει 200 εγγραφές
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Προβολές/Επιλογές
• π rid, title, year (R) μας δίνει τον πίνακα R.
• σ 1=1 (R) μας δίνει τον πίνακα R.
• σ 1=2 (R) μας δίνει τον κενό πίνακα (∅).
• σ name='Lemmy' (P) έχει 0 ως 10 εγγραφές.
• σ pid='777' (P) έχει 0 ως 1 εγγραφές.
R 100
• π name (P) έχει 1 ως 10 εγγραφές. P 10
H 200
• π pid (P) έχει 10 εγγραφές.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Γινόμενο/Σύζευξη/Διαίρεση
R x H έχει 20000 εγγραφές.
R |x| H έχει 200 εγγραφές.
Η |x| P έχει 200 εγγραφές.
T = R |x| (H |x| P) έχει 200 εγγραφές.
π pid, name, title (σ name='Lemmy' AND year=2013 (T)).
R 100
H / π pid (P) = οι ηχογραφήσεις που έχουν P 10
ερμηνευτεί από όλους του ερμηνευτές! H 200

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ένωση
Ερμηνευτές (pid) που τραγούδησαν το 1970 ή το
2010:

π pid (σ year=1970 (H |x| R)) U π pid (σ year=2010 (H |x| R))

ή με χρήση σύζευξης: R 100


P 10
H 200
π pid (σ year=1970 OR year=2010 (H |x| R))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Τομή (1)
Ερμηνευτές (pid) που τραγούδησαν και το 1970
και το 2010:
π pid (σ year=1970 (H |x| R)) ∩ π pid (σ year=2010 (H |x| R))
ή με χρήση σύζευξης θα πρέπει να συνδυάσω
όλες τις ερμηνείες ενός συγκεκριμένου ερμηνευτή
με τις ερμηνείες του ίδιου ερμηνευτή:
R 100
Η2 = ρ pid2/pid, rid2/rid (H) P 10

σ pid=pid2 (Η x H2) H 200

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Τομή (2)
• Έστω στιγμιότυπο του Η: • Τότε σ pid=pid2 (Η x H2):
a1 a1a1
b1 a1b1
a1c1
c1
b1a1
a2
b1b1
b1c1
c1a1 R 100
c1b1 P 10
c1c1 H 200

a2a2

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Τομή (3)
• ... και για να ελέγξω το έτος ηχογράφησης:
Η2 = ρ pid2/pid, rid2/rid (H)
R2 = ρ rid2/rid, title2/title, year2/year (R)
T1 = Η |x| R
T2 = H2 |x| R2
ANSWER = π pid (σ pid=pid2 AND year=1970 AND year2=2010 (T1 x T2))
R 100
P 10
H 200

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 5: SQL (Απλή SELECT)

Σκοποί ενότητας
προβολή, επιλογή, κανονικές εκφράσεις,
γινόμενο, φυσική σύζευξη, συναρτήσεις, ένωση,
τομή, διαφορά, διπλότυπα, any, all, υπο-αιτήματα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 01
-- απλή προβολή πεδίων ενός πίνακα
select pid, name
from performer;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 02
-- συνθήκη επιλογής πάνω σε πίνακα και
-- προβολή, δοκιμάστε και =, >=, <=, >, <, <>
select pid, name
from performer
where pid > 5;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 03
-- συνθήκη συμμετοχής σε σύνολο
select pid, name
from performer
where pid in (3, 4, 9);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 04
-- συνθήκη συμμετοχής σε διάστημα
-- τιμών [α, β]
select pid, name
from performer
where pid between 3 and 8;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 05
-- χρήση κανονικών εκφράσεων (reg exp)
-- ΠΡΟΣΟΧΗ: η Oracle είναι case sensitive
-- στις reg exp
select pid, name
from performer
where name like '%adel%'; -- και '_adel%'

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 06
-- προβολή όλων των πεδίων του πίνακα
select *
from cd;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 07
-- αληθής συνθήκη επιλογής (επιστρέφεται
-- ολόκληρος ο πίνακας)
-- δοκιμάστε με 5 = 2
select *
from cd
where 2 = 2;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 08
-- γινόμενο πινάκων
select *
from cd, track;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 09
-- φυσική σύζευξη
select ctitle, pos
from cd, track
where cd.cid = track.cid;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 10
-- στη select χρειαζόμαστε performer.pid ή
-- track.pid, αλλιώς υπάρχει ασάφεια για το ποιο
-- pid μιλάμε
-- χρήση distinct για απάλειψη διπλοτύπων
select pid, name
from performer, track
where performer.pid = track.pid and pos > 11;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 11
-- όλοι οι τίτλοι τραγουδιών που βρίσκονται
-- στη 10η θέση των cd
select stitle, pid, cid
from track, song
where track.sid = song.sid and pos = 10;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 12
-- φυσική σύζευξη όλων των πινάκων και
-- ταξινόμηση βάσει τίτλου τραγουδιού σε
-- φθίνουσα σειρά - μπορούμε και πολλαπλή
-- ταξινόμηση
select name, ctitle, stitle, year
from performer, song, track, cd
where cd.cid = track.cid and performer.pid =
track.pid and song.sid = track.sid
order by stitle desc;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 13
-- τεχνητά πεδία στην απάντηση με χρήση
-- συναρτήσεων και πράξεων
select ctitle, ceil(year/100)
from cd;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 14
-- ίδιο με το Query 12 αλλά με χρήση μεταβλητών
-- ως εναλλακτικών ονομάτων πινάκων
select name, ctitle, stitle, year
from performer p, song s, track t, cd c
where c.cid = t.cid and p.pid = t.pid and
s.sid = t.sid;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 15
-- σύζευξη πίνακα με τον εαυτό του - αλλά
-- παίρνω άχρηστη και περιττή πληροφορία
-- πρώτα προσθέτω c1.cid <> c2.cid και μετά
-- αλλάζω τη συνθήκη σε < ή >
select c1.ctitle, c1.year, c2.ctitle, c2.year
from cd c1, cd c2
where c1.year = c2.year;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 16
-- union και union all
select ctitle from cd where ctitle like 'S%'
union
select stitle from song where stitle like 'S%'
order by ctitle;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 17
-- τα cd που περιέχουν κάποιο ομώνυμο
-- τραγούδι, intersect
-- ΠΡΟΣΟΧΗ: η MySQL δεν υποστηρίζει το
-- intersect
select ctitle from cd
intersect
select stitle from song;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 18
-- εναλλακτική υλοποίηση του intersect
select ctitle
from song, cd
where stitle = ctitle;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 19
-- τα cd που ΔΕΝ περιέχουν κάποιο ομώνυμο
-- τραγούδι, difference
-- ΠΡΟΣΟΧΗ: η MySQL δεν υποστηρίζει το
-- except και η Oracle χρησιμοποιεί το minus
select ctitle from cd
except
select stitle from song;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 20
-- εναλλακτική υλοποίηση του except
-- (δεν λύνεται με σύζευξη)
select distinct cd.ctitle
from song, cd
where stitle <> ctitle;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 21
-- εμφωλευμένo αίτημα με in, εναλλακτικός
-- τρόπος για intersect
select ctitle
from cd
where ctitle in (select stitle from song);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 22
-- εμφωλευμένo αίτημα, εναλλακτικός τρόπος
-- για difference
select ctitle
from cd
where ctitle not in (select stitle from song);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 23
-- τα cd που δεν είναι μοναδικά σε κάποια
-- χρονιά - εμφωλευμένo αίτημα με exists,
-- προσθήκη c1.cid <> c2.cid
select *
from cd c1
where exists
(select *
from cd c2
where c1.year = c2.year);
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 24
-- εύρεση μεγαλύτερης (ή μικρότερης) χρονιάς
select year
from cd c1
where not exists
(select *
from cd c2
where c2.year > c1.year);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 25
-- πρώτα διπλότυπα,
-- δεν υπάρχει λύση με σύζευξη
select c1.ctitle, c1.year
from cd c1, cd c2
where c1.year > c2.year;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 26
-- χρήση all, εύρεση max year
-- ΠΡΟΣΟΧΗ: δεν δουλεύει στην Oracle εξαιτίας
-- του NULL
select ctitle, year
from cd
where year >= all (select year from cd);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 27
-- δουλεύει μόνο αν το max (ή min) year είναι
-- μοναδικό και δεν έχουμε τιμές NULL!!!
select ctitle, year
from cd c1
where year < all
(select year
from cd c2
where c2.cid <> c1.cid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 28
-- χρήση any, (< all) == (! >= any)
select ctitle, year
from cd c1
where not year >= any
(select year
from cd c2
where c2.year is not null and c2.cid <>
c1.cid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 29
-- οι ερμηνευτές που το όνομά τους είναι
-- ταξινομικά μεγαλύτερο από όλους τους τίτλους
-- cd που έχουν κυκλοφορήσει
select *
from performer p1
where name < all
(select ctitle
from cd c, track t
where c.cid=t.cid and t.pid=p1.pid);
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 30
-- ίδιο με το Query 29: μπορούμε και χωρίς το any
-- και το all - χρησιμοποιούμε exists
select *
from performer p1
where not exists
(select *
from cd c, track t
where c.cid=t.cid and t.pid=p1.pid
and p1.name > c.ctitle);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 31
-- υλοποίηση του Query 22 (difference) με any
-- αντί του exists - λάθος η συγκεκριμένη
-- υλοποίηση, χρειάζεται "not ctitle = any"
select ctitle
from cd
where ctitle <> any (select stitle from song);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 32
-- τα cd του 21 αιώνα
select ctitle, ceil(year/100)
from cd
where ceil(year/100) > 20;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 33
-- όπως το Query 32 με select στο from!
select ctitle, century
from
(select ctitle, ceil(year/100) as century
from cd) cdnew
where century > 20;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 34
-- για κάθε cd το τραγούδι με τον ταξινομικά
-- μικρότερο τίτλο
select ctitle, stitle
from cd c, track t, song s
where c.cid = t.cid and t.sid = s.sid
and s.stitle <= all
(select stitle
from track t, song s
where c.cid = t.cid and t.sid = s.sid);
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 35
-- όπως το Query 34 με χρήση select στην select!
-- (προσοχή στο distinct)
select ctitle,
(select distinct stitle from track t, song s
where cd.cid = t.cid and t.sid = s.sid
and s.stitle <= all
(select stitle from track t, song s
where cd.cid = t.cid and
t.sid = s.sid)) as orderedfirst
from cd;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 36
-- πρόβλημα όταν το υποερώτημα στην
-- select επιστρέφει πολλές τιμές
select ctitle,
(select distinct stitle from track t, song s
where cd.cid = t.cid and t.sid = s.sid) as
songs
from cd;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 6: SQL (Συζεύξεις,
Εμφώλευση, Ομαδοποίηση)

Σκοποί ενότητας
σύζευξη υπό συνθήκη, εξωτερικές συζεύξεις,
συναθροιστικά αιτήματα, ομαδοποίηση

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 01
-- σύζευξη υπό συνθήκη (εδώ φυσική σύζευξη)
select distinct *
from performer, track
where performer.pid = track.pid;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 02
-- εναλλακτικός τρόπος γραφής (δουλεύει και
-- χωρίς το inner)
select distinct name, cid
from performer inner join track
on performer.pid = track.pid;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 03
-- η επιπλέον συνθήκη μπορεί να μπει και στο on
select distinct *
from performer inner join track on
performer.pid = track.pid and cid < 5;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 04
-- τίτλοι cd με ονόματα ερμηνευτών
-- ΠΡΟΣΟΧΗ: δεν δουλεύει στην Oracle -
-- η σύζευξη είναι δυαδική πράξη
select distinct ctitle, name
from (cd c join track t on c.cid=t.cid) join
performer p on t.pid=p.pid;
select distinct ctitle, name
from performer p, cd, track t
where p.pid=t.pid and cd.cid=t.cid;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 05
-- φυσική σύζευξη η οποία κρατά μόνο ένα
-- αντίγραφο της κοινής στήλης (όπως στη
-- σχεσιακή άλγεβρα!)
select distinct *
from performer natural join track;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 06
-- φυσική σύζευξη με χρήση του using
-- (καλύτερη πρακτική)
select distinct *
from performer join track using(pid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 07
-- ζεύγη cd που κυκλοφόρησαν την ίδια χρονιά
-- (από το προηγούμενο μάθημα)
select c1.ctitle, c1.year, c2.ctitle, c2.year
from cd c1, cd c2
where c1.year = c2.year and c1.cid < c2.cid;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 08
-- σύζευξη πίνακα με τον εαυτό του με using
select c1.ctitle, c1.year, c2.ctitle, c2.year
from cd c1 join cd c2 using (year)
where c1.cid > c2.cid;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 09
-- φυσική σύζευξη πίνακα με τον εαυτό του
select *
from cd c1 natural join cd c2;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 10
-- η φυσική σύζευξη επιστρέφει μόνο τις
-- ταιριαστές εγγραφές
select ctitle, year, name
from cd inner join company using(comid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 11
-- left outer join για να πάρουμε όλες τις
-- εγγραφές των cd
-- μπορούμε να παραλείψουμε το outer
-- μπορούμε να χρησιμοποιήσουμε
-- natural left join
select ctitle, year, name
from cd left outer join company using(comid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 12
-- τρόπος υλοποίησης left join αν δεν
-- υποστηρίζεται από το DBMS
select ctitle, year, name
from cd join company using(comid)
union
select ctitle, year, NULL
from cd
where comid not in (select comid from company);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 13
-- right outer join για να πάρουμε όλες τις
-- εγγραφές των εταιριών
select ctitle, year, name
from cd right join company using(comid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 14
-- τρόπος υλοποίησης right join αν δεν
-- υποστηρίζεται από το DBMS
select ctitle, year, name
from company join cd using(comid)
union
select null, null, name
from company
where not comid in (select comid from cd);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 15
-- full outer join
-- ΠΡΟΣΟΧΗ: δεν υποστηρίζεται από την MySQL
select ctitle, year, name
from cd full outer join company using(comid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 16
-- τρόπος υλοποίησης full outer join αν δεν
-- υποστηρίζεται από το DBMS
select ctitle, year, name
from cd left join company using(comid)
union
select ctitle, year, name
from cd right join company using(comid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 17
-- τρόπος υλοποίησης full outer join χωρίς
-- συζεύξεις
select ctitle, year, name from cd, company
where cd.comid = company.comid
union
select ctitle, year, NULL from cd
where comid not in (select comid from company)
union
select null, null, name from company
where not comid in (select comid from cd);
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 18
-- αιτήματα συνάθροισης
-- (avg, max, min, sum, count)
select avg(year)
from cd;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 19
-- μέση χρονιά κυκλοφορίας των cd της Adele
select avg(year)
from (cd join track using(cid)) join
performer using(pid)
where name = 'Adele';

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 20
-- η σωστή εκδοχή του Query 19
select avg(year)
from cd
where cid in
(select cid
from track join performer using(pid)
where name = 'Adele');

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 21
-- πλήθος εγγραφών που ικανοποιούν συνθήκη
select count(*)
from cd
where ctitle > 'k';

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 22
-- πλήθος ερμηνευτών που ερμηνεύουν κομμάτια
select count(pid)
from track;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 23
-- ενδιαφέρουσα χρήση του count στη where
-- (δοκιμάστε και με >=, >)
select *
from performer p1, performer p2
where
(select count(pid) from track
where pid = p1.pid) =
(select count(pid) from track
where pid = p2.pid)
and p1.pid > p2.pid;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 24
-- έλεγχος πλήθους δυο ομάδων που
-- δημιουργούνται στο from
select AtoJ.tracks >= KtoZ.tracks
from
(select count(pid) as tracks
from performer join track using(pid)
where name < 'k') AtoJ,
(select count(pid) as tracks
from performer join track using(pid)
where name >= 'k') KtoZ;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 25
-- το ίδιο με το Query 24 αλλά
-- με τα υπο-αιτήματα στο select
select
(select count(pid) as tracks
from performer join track using(pid)
where name < 'k') >=
(select count(pid) as tracks
from performer join track using(pid)
where name >= 'k') as result
from cd;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 26
-- ομαδοποίηση
select cid, count(*)
from track
group by cid;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 27
-- άλλη μια ομαδοποίηση με χρήση
-- συναρτήσεων αλφαριθμητικών
select substring(stitle,1,1), count(*) cnt
from song
group by substring(stitle,1,1)
order by cnt desc;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 28
-- πιο πολύπλοκη ομαδοποίηση
select pid, name, count(*)
from performer p join track t using(pid)
where name > 'K'
group by pid;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 29
-- ομαδοποίηση δυο επιπέδων
select cid, substring(stitle,1,1) letter, count(*) cnt
from track join song using(sid)
group by cid, substring(stitle,1,1);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 30
-- προσοχή στο τί μετράμε
select year, count(distinct cid)
from cd join track using(cid)
group by year;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 31
-- πως εμφανίζουμε αυτά που δεν
-- συμμετέχουν σε μια σύζευξη
select comid, count(*)
from cd join company using (comid)
group by comid
union
select comid, 0
from company
where comid not in (select comid from cd);
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 32
-- συνθήκη σε επίπεδο ομάδας (having)
select cid
from track
group by cid
having count(*) > 13;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 33
-- εναλλακτική σύνταξη χωρίς group by ... having
select distinct cid
from track t1
where 13 <
(select count(*)
from track t2
where t1.cid = t2.cid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 34
-- τα cd που έχουν πλήθος κομματιών μεγα-
-- λύτερο από τον μέσο όρο κομματιών ανά cd
select cid, count(*)
from track
group by cid
having count(*) >
(select avg(trackcount)
from
(select count(*) as trackcount from track
group by cid) A);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 7α: SQL (NULL, Διαίρεση)

Τμήμα Εφαρμοσμένης Πληροφορικής

Σκοποί ενότητας
null, διαίρεση

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 01
-- παίρνουμε ένα υποσύνολο των cd
-- (δοκιμάστε και με year > 1990)
select *
from cd
where year <= 1990;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 02
-- θεωρητικά η παρακάτω συνθήκη είναι πάντα
-- αληθής - είναι όμως έτσι;
select *
from cd
where year <= 1990 or year > 1990;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 03
-- να η πάντα αληθής συνθήκη!
select *
from cd
where year <= 1990 or year > 1990 or
year is null;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 04
-- και αυτή είναι πάντα αληθής (αφού δεν
-- εμπλέκει κανένα πεδίο)
select *
from cd
where 1=1;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 05
-- εδώ παίρνουμε το cd με null year χάριν της
-- δεύτερης συνθήκης που δεν εμπλέκει το year
select *
from cd
where year <= 1990 or ctitle < 'K';

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 06
-- πλήθος μη null καταχωρισμένων ετών
select count(*)
from cd
where year is not null;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 07
-- πλήθος μη null διακριτών
-- καταχωρισμένων ετών
select count(distinct year)
from cd
where year is not null;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 08
-- παραλείποντας τη συνθήκη παίρνω την ίδια
-- απάντηση (άρα το count δεν μετρά τα null)
select count(distinct year)
from cd;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 09
-- εδώ όμως παίρνω και τα null
select distinct year
from cd;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Διαίρεση
-- διαίρεση με σχεσιακή άλγεβρα
-- οι καλλιτέχνες που ΟΛΑ τους τα τραγούδια
-- αρχίζουν από γράμμα με το οποίο αρχίζει
-- κάποιο cd της βάσης
Α = π pid, substr(stitle) (track |x| song)
B = π substr(ctitle) (cd)
Result = A / B

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 10
-- με αφαίρεση συνόλων: οι καλλιτέχνες για
-- τους οποίους δεν υπάρχει το σύνολο που
-- σχηματίζεται αν αφαιρέσουμε από το σύνολο
-- όλων των αρχικών γραμμάτων των τίτλων
-- των κομματιών του καλλιτέχνη το σύνολο όλων
-- των αρχικών γραμμάτων των τίτλων cd

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 10 (συνέχεια)
select *
from performer p
where not exists
((select substring(stitle,1,1)
from track t join song s using(sid)
where t.pid = p.pid)
minus
(select substring(ctitle,1,1) from cd));

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 11
-- διαίρεση με διπλή άρνηση: οι ερμηνευτές
-- για τους οποίους ΔΕΝ ΥΠΑΡΧΕΙ κομμάτι
-- που ΝΑ ΜΗΝ αρχίζει ο τίτλος του από γράμμα
-- που αρχίζει ο τίτλος κάποιου cd

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 11 (συνέχεια)
select *
from performer
where not exists
(select * from track
where pid = performer.pid and not exists
(select * from song
where sid=track.sid and
substring(stitle,1,1) in
(select substring(ctitle,1,1)
from cd)));
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 12
-- τι ρωτάει αυτό το αίτημα;
select *
from cd
where not exists
((select substr(stitle,1,1) from track t join
song using(sid)
where t.cid=cd.cid)
minus
(select substr(name,1,1) from performer));
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ενότητα 7β: SQL (Πρακτική Εξάσκηση 1)

Τμήμα Εφαρμοσμένης Πληροφορικής


Σκοποί ενότητας
αιτήματα πάνω στη βάση με τα CD

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 01γ
-- με σύζευξη (δείτε ότι εδώ μπορούμε να
-- πάρουμε στην απάντηση και πεδία του track,
-- όπως η θέση)
select stitle, pos
from song, track
where song.sid=track.sid and
stitle like 'A%' and pos<10

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 01δ
-- με σύζευξη (σύνταξη inner join)
select stitle, pos
from song inner join track on song.sid=track.sid
where stitle like 'A%' and pos<10

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 02α
-- Ονόματα ερμηνευτών που συμμετέχουν σε
-- cd της εταιρίας Atlantic.
-- τριπλή σύζευξη με 4 πίνακες
select distinct name
from performer, track, cd, company
where performer.pid=track.pid and
track.cid=cd.cid and
cd.comid=company.comid and
company.name='Atlantic'
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 02β
-- το ίδιο αλλά με inner joins (οι παρενθέσεις δεν
-- είναι υποχρεωτικές)
select distinct name
from ((performer inner join track on
performer.pid=track.pid) inner join cd on
track.cid=cd.cid) inner join company on
cd.comid=company.comid
where company.name='Atlantic'

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 02γ
-- το ίδιο με τριπλή εμφώλευση με in (προφανώς
-- θα μπορούσαμε να χρησιμοποιήσουμε
-- οποιοδήποτε συνδυασμό με in και exists)
select name from performer where pid in
(select pid from track where cid in
(select cid from cd where comid in
(select comid from company
where name='Atlantic')))

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 03α
-- Τα ονόματα των εταιριών που
-- κυκλοφόρησαν cd μέσα στο 1996.
-- με εμφώλευση με in
select name
from company
where comid in
(select comid
from cd
where year='1996')
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 03β
-- με σύζευξη
select name
from company, cd
where company.comid=cd.comid and year='1996'

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 04α
-- Τα ονόματα (name) όλων των ερμηνευτών
-- οι οποίοι εκτελούν εννέα ή περισσότερα track
-- από αυτά που καταχωρεί η βάση.
-- η δεύτερη select βρίσκει τους κωδικούς
-- ερμηνευτών που εκτελούν >=9 track
select name from performer where pid in
(select pid from track
group by pid
having count(*)>8)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 04β
-- η δεύτερη select μετρά τα track που εκτελεί ο
-- κάθε ένας ερμηνευτής
select name
from performer
where
(select count(*)
from track
where track.pid=performer.pid) > 8

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 05α
-- Οι τίτλοι των cd που περιέχουν
-- πάνω από 21 tracks.
-- η δεύτερη select βρίσκει τους κωδικούς cd με
-- πάνω από 21 tracks
select ctitle from cd where cid in
(select cid
from track
group by cid
having count(*)>21)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 05β
-- λύση χακεράδικη: η δεύτερη select βρίσκει τα
-- cd που έχουν track στην 22 θέση,
-- άρα έχουν >21 tracks
select ctitle
from cd
where cid in
(select cid
from track
where pos=22)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 8: SQL (Πρακτική Εξάσκηση 2)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 06
-- Τα ονόματα (name) των ερμηνευτών οι
-- οποίοι συμπεριλαμβάνονται σε ΟΛΑ τα CDs
-- της εταιρίας με κωδικό 2.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 06α
-- υλοποίηση της διαίρεσης με διπλή άρνηση,
-- δηλαδή, οι ερμηνευτές για τους οποίους δεν
-- υπάρχει cd της εταιρίας 2 που να μην περιέχει
-- track τους
select name from performer where not exists
(select * from cd where comid=2 and not
exists
(select * from track
where track.pid=performer.pid and
track.cid=cd.cid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 06β
-- η δεύτερη select βρίσκει όλα τα cd της εταιρίας
-- 2 και η τρίτη όλα τα cd του κάθε ερμηνευτή,
-- οπότε η διαφορά τους είναι κενή όταν ο
-- ερμηνευτής συμμετέχει σε όλα τα cd της
-- δεύτερης select
select name from performer where not exists
((select cid from cd where comid=2)
minus
(select cid from track
where track.pid=performer.pid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 07
-- Ονόματα ερμηνευτών που κυκλοφόρησαν
-- track σε καθεμιά από τις χρονιές που είναι
-- καταχωρημένες στη βάση (δηλαδή υπάρχει
-- τουλάχιστον ένα track τους σε κάποιο cd για
-- όλες τις καταχωρημένες χρονιές).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 07α
-- οι ερμηνευτές για τους οποίους δεν υπάρχει
-- καταχωρημένη χρονιά στην οποία να μην έχει
-- κυκλοφορήσει cd με track που εκτελούν
select name from performer where not exists
(select * from cd where year not in
(select year from cd where cid in
(select cid from track
where pid=performer.pid)))

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 07β
-- το ίδιο με μικρή παραλλαγή: η δεύτερη select
-- βρίσκει όλες τις χρονιές στις οποίες έχει
-- κυκλοφορήσει cd (οι καταχωρημένες χρονιές)
-- και η τρίτη select βρίσκει όλες τις χρονιές στις
-- οποίες κυκλοφόρησε cd με track που εκτελεί
-- ένας συγκεκριμένος ερμηνευτής, οπότε η
-- διαφορά είναι κενή όταν ο συγκεκριμένος
-- ερμηνευτής έχει κυκλοφορήσει track σε όλες τις
-- χρονιές
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 07β (συνέχεια)


select name
from performer
where not exists
((select year
from cd)
minus
(select year
from track inner join cd on track.cid=cd.cid
where track.pid=performer.pid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 08
-- Οι τίτλοι των cd που έχουν την
-- αποκλειστικότητα σε ένα τουλάχιστον track
-- τους, δηλαδή, όπου το αντίστοιχο τραγούδι δεν
-- περιέχεται σε άλλο cd.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 08α
-- τα cd που έχουν track (t1.cid=cd.cid) που
-- αντιστοιχεί σε τραγούδι που δεν υπάρχει
-- (t1.sid=t2.sid) και σε άλλο cd (t1.cid<>t2.cid),
-- δηλαδή, αυτό ακριβώς που διατυπώνει το
-- ερώτημα
select ctitle from cd where exists
(select * from track t1 where t1.cid=cd.cid
and not exists
(select * from track t2
where t1.sid=t2.sid and t1.cid<>t2.cid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 08β
-- το ίδιο με in/not in αντί exists/not exists
select ctitle
from cd
where cid in
(select cid
from track t1
where sid not in
(select sid
from track t2
where t1.cid<>t2.cid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 08γ
-- η δεύτερη select βρίσκει τα τραγούδια του κάθε
-- ενός cd και η τρίτη όλα τα τραγούδια με
-- μοναδική εμφάνιση, οπότε η τομή είναι μη κενή
-- όταν το συγκεκριμένο cd έχει τουλάχιστον ένα
-- αποκλειστικό τραγούδι
select ctitle from cd where exists
((select sid from track where track.cid=cd.cid)
intersect
(select sid from track
group by sid having count(*)=1))

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 08δ
-- η δεύτερη select βρίσκει τα τραγούδια του κάθε
-- ενός cd και η τρίτη όλα τα τραγούδια με μη
-- μοναδική εμφάνιση, οπότε η διαφορά είναι μη
-- κενή όταν το συγκεκριμένο cd έχει τουλάχιστον
-- ένα αποκλειστικό τραγούδι
select ctitle from cd where exists
((select sid from track where track.cid=cd.cid)
minus
(select sid from track
group by sid having count(*)>1))

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 09
-- Οι τίτλοι των cd στα οποία δεν υπάρχει
-- τραγούδι που να υπάρχει σε άλλο cd.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 09α
-- τα cd που δεν έχουν track (t1.cid=cd.cid) που
-- να αντιστοιχεί σε τραγούδι που υπάρχει
-- (t1.sid=t2.sid) και σε άλλο cd (t1.cid<>t2.cid),
-- δηλαδή, αυτό ακριβώς που διατυπώνει το
-- ερώτημα
select ctitle from cd where not exists
(select * from track t1
where t1.cid=cd.cid and exists
(select * from track t2
where t1.cid<>t2.cid and t1.sid=t2.sid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 09β
-- το ίδιο με not in/in αντί not exists/exists
select ctitle
from cd
where cid not in
(select cid
from track t1
where sid in
(select sid
from track t2
where t1.cid<>t2.cid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 09γ
-- ξανά το ίδιο με not exists/in (προφανώς μπο-
-- ρούν να γίνουν όλοι οι δυνατοί συνδυασμοί)
select ctitle from cd
where not exists
(select *
from track t1
where t1.cid=cd.cid and t1.sid in
(select t2.sid
from track t2
where t1.cid<>t2.cid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 09δ
-- ξανά το ίδιο με not exists και σύζευξη: η
-- εμφώλευση της 2ης και 3ης select μετατράπηκε
-- σε σύζευξη
select ctitle from cd
where not exists
(select *
from track t1, track t2
where t1.sid=t2.sid and t1.cid<>t2.cid and
t1.cid=cd.cid)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 09ε
-- αφού το αρχικό ερώτημα μπορεί να διατυπωθεί
-- και ως "τα cd που όλα τα τραγούδια τους είναι
-- αποκλειστικά" έχουμε την περίπτωση διαίρεσης
-- με δυο αρνήσεις: τα cd που δεν έχουν τραγούδι
-- που να μην είναι αποκλειστικό
select ctitle from cd where cid not in
(select cid from track where sid not in
(select sid from track
group by sid having count(*)=1))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 09 (συνέχεια)
-- Είναι ενδιαφέρον να δείτε τις ομοιότητες και
-- διαφορές των παρακάτω δυο λύσεων με τις
-- αντίστοχες λύσεις του ερωτήματος Query 08

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 09ζ
-- η δεύτερη select βρίσκει τα τραγούδια του κάθε
-- ενός cd και η τρίτη όλα τα τραγούδια με
-- μοναδική εμφάνιση, οπότε η διαφορά είναι κενή
-- όταν το συγκεκριμένο cd έχει όλα τα τραγούδια
-- του αποκλειστικά
select ctitle from cd where not exists
((select sid from track where track.cid=cd.cid)
minus
(select sid from track
group by sid having count(*)=1))

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 09η
-- η δεύτερη select βρίσκει τα τραγούδια του κάθε
-- ενός cd και η τρίτη όλα τα τραγούδια με μη
-- μοναδική εμφάνιση, οπότε η τομή είναι κενή
-- όταν το συγκεκριμένο cd έχει όλα τα τραγούδια
-- του αποκλειστικά
select ctitle from cd where not exists
((select sid from track where track.cid=cd.cid)
intersect
(select sid from track
group by sid having count(*)>1))

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 10
-- Οι τίτλοι των cd που περιέχουν μόνο μη
-- αποκλειστικά τραγούδια (δηλαδή, όλα τα
-- τραγούδια υπάρχουν και σε κάποιο άλλο cd).
-- Στα παρακάτω μελετήστε τις ομοιότητες και
-- διαφορές με το q9. Μπορούμε και εδώ να
-- έχουμε αντίστοιχες λύσεις με αυτές του
-- ερωτήματος q9. Ενδεικτικά:

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 10α
-- το ερώτημα μπορεί να διατυπωθεί και ως "οι
-- τίτλοι των cd που δεν έχουν τραγούδι που να
-- μην υπάρχει και σε άλλο cd", οπότε η
-- παρακάτω λύση βρίσκει τα cd που δεν έχουν
-- τραγούδι (t1.cid=cd.cid) που να μην υπάρχει
-- (t1.sid=t2.sid) και σε άλλο cd (t1.cid<>t2.cid),
-- δηλαδή, αυτό ακριβώς που διατυπώνει το
-- ερώτημα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 10α (συνέχεια)
select ctitle
from cd
where not exists
(select *
from track t1
where t1.cid=cd.cid and not exists
(select *
from track t2
where t1.cid<>t2.cid and t1.sid=t2.sid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 10β
-- επίσης, το ερώτημα μπορεί να διατυπωθεί και
-- ως "οι τίτλοι των cd που όλα τα τραγούδια τους
-- είναι μη αποκλειστικά", οπότε πρόκειται για
-- διαίρεση και μια λύση είναι η διπλή άρνηση "οι
-- τίτλοι των cd που δεν έχουν τραγούδι που να
-- μην είναι μη αποκλειστικό"
select * from cd where cid not in
(select cid from track where sid not in
(select sid from track
group by sid having count(*)>1))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 10γ
-- υλοποίηση με διαφορά (γίνεται και με τομή)
select * from cd where not exists
((select sid from track where
track.cid=cd.cid)
minus
(select sid from track
group by sid having count(*)>1))

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 11
-- Τα ονόματα ερμηνευτών που έχουν μόνο
-- "solo" cd (δηλαδή μόνο cd στα οποία υπάρχουν
-- μόνο δικά τους τραγούδια και όχι άλλων
-- ερμηνευτών).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 11α
-- Μπορούμε να διατυπώσουμε το ερώτημα αυτό
-- κατ' αντιστοιχία του Query 09: "Οι ερμηνευτές
-- που δεν έχουν cd που να περιέχει άλλους
-- ερμηνευτές", οπότε προκύπτουν πάλι όλες οι
-- αντίστοιχες λύσεις. Ενδεικτικά:
select name from performer where pid not in
(select pid from track t1 where cid in
(select cid from track t2
where t1.pid<>t2.pid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 11β
select name
from performer
where not exists
(select *
from track t1 inner join track t2 on
t1.cid=t2.cid
where performer.pid=t1.pid and
t1.pid<>t2.pid)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 12
-- Αν μας ζητούσαν τους ερμηνευτές που
-- έχουν τουλάχιστον ένα "solo" cd, ορίστε και μια
-- φευγάτη λύση: η δεύτερη select ομαδοποιεί τα
-- τραγούδια ως προς cd και performer και κρατά
-- εκείνα τα group που έχουν πλήθος τραγουδιών
-- ίσο με το πλήθος τραγουδιών του
-- συγκεκριμένου cd, άρα το cd περιέχει μόνο
-- τραγούδια ενός ερμηνευτή!

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 12 (συνέχεια)
select name
from performer
where pid in
(select pid
from track t1
group by cid, pid
having count(pid)=
(select count(*)
from track t2
where t2.cid=t1.cid))
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 9α: Περιορισμοί (Constraints)
Εναύσματα (Triggers)

Μέρος 1

Περιορισμοί (Constraints)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Γενικά περί περιορισμών
• Γνωστοί και ως περιορισμοί ακεραιότητας
(integrity constraints).
• Υπάρχουν στο standard της SQL.
• Κανένα DBMS δεν τους υλοποιεί πλήρως.
• Σπάνια δυο διαφορετικά DBMS συμφωνούν
πλήρως στις υλοποιήσεις τους...
• Σκοπός τους είναι να περιορίσουν τις
επιτρεπτές καταστάσεις μιας βάσης
δεδομένων.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παραδείγματα περιορισμών
Στη βάση cdbase:
• 0 < track.pos <= 99
• cd.year >= 1900 or null
• performer.dob >= cd.year στην περίπτωση που
υπάρχει στο cd track που ερμηνεύει ο
συγκεκριμένος performer

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Χρήση περιορισμών
• Για επιβολή περιορισμών επιπλέον αυτών που
προκύπτουν από τη δομή και τα πεδία ορισμού.
• Για αποφυγή λαθών στην εισαγωγή δεδομένων.
• Για έλεγχο ορθότητας όταν τροποποιούνται τα
δεδομένα.
• Για επιβολή συνέπειας.
• Για να “ξέρει” το σύστημα τη φύση των
δεδομένων.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Τύποι περιορισμών
• Non-Null.
• Κλειδιού (primary, unique).
• Αναφορικής ακεραιότητας (αλλιώς ξένου
κλειδιού).
• Πάνω σε πεδίο.
• Πάνω σε εγγραφή.
• Γενικοί ισχυρισμοί (general assertions).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Δήλωση/Επιβολή περιορισμών
Πότε δηλώνονται:
• Κατά τη δήλωση των πινάκων (create table).
• Αργότερα με ανεξάρτητη δήλωση.
Πώς επιβάλλονται:
• Κάθε φορά που υπάρχει κάποια τροποποίηση.
• Μετά από μια ομάδα τροποποιήσεων (deferred
checking).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Μέρος 2

Εναύσματα (Triggers)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Γενικά περί εναυσμάτων
• Παρακολουθούν τις τροποποιήσεις που
συμβαίνουν στη βάση δεδομένων, ελέγχουν
συνθήκες και εκτελούν ενέργειες.
• Είναι της μορφής: “event-condition-action”.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παραδείγματα εναυσμάτων
• Αν τροποποιηθεί το έτος γέννησης ενός
ερμηνευτή και είναι πλέον μεγαλύτερο από το
έτος κυκλοφορίας κάποιου cd στο οποίο
συμμετέχει, κάνε το έτος γέννησης NULL.
• Αν εισαχθεί ένα νέο track σε ένα cd και η τιμή
του pos είναι τέτοια ώστε να μην υπάρχουν για
το cd αυτό όλες οι προηγούμενες τιμές από το 0
ως το pos-1, σήμανε λάθος.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Χρήση εναυσμάτων
• Για να μεταφέρουμε μέρος της επιχειρησιακής
λογικής από την εφαρμογή στο DBMS.
• Για να επιβάλλουμε (υλοποιήσουμε)
περιορισμούς (constraints).
• Δυστυχώς, υπάρχουν μεγάλες διαφορές στις
υλοποιήσεις στα διάφορα DMBS (ακόμα και
όσον αφορά στη συμφωνία με το standard της
SQL).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Εναύσματα στην SQL


Create trigger name
Before | After | Instead Of events
[referencing-variables]
[For Each Row]
When (condition)
action

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Εναύσματα στην SQL
Create trigger name
Before | After | Instead Of events
[referencing-variables]
[For Each Row]
When (condition)
action

events: insert, delete, update on table


condition: όπως στην where
action: μπλοκ sql εντολών
referencing variables: old row as var1, new table as var2

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ενότητα 9β: SQL (Διαχείριση εγγρα-


φών, Όψεις, Περιορισμοί, Εναύσματα)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Σκοποί ενότητας
εισαγωγή-διαγραφή-τροποποίηση εγγραφών,
όψεις, περιορισμοί ακεραιότητας (non-null,
κλειδιού, αναφορικής ακεραιότητας, πεδίου,
εγγραφής, γενικοί ισχυρισμοί), εναύσματα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Αιτήματα διαχείρισης
δεδομένων
-- insert into Table values (VA1, VA2, ... , VAn)
-- insert into Table Select-Statement
-- delete from Table where Condition
-- update Table
-- set A1 = Expr1, A2 = Expr2, ..., An = Exprn
-- where Condition

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 01
-- εισαγωγή μιας εγγραφής στον πίνακα cd
insert into cd
values (100, 'My first album', 2013, 1);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 02
-- μαζική εισαγωγή από άλλη select
insert into performer
select pid+1000, concat(name, ' Junior')
from performer;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 03
-- μια πιο περιπετειώδης εισαγωγή
insert into cd
select 1000+sid, stitle, 2013, 1
from song s join track t using (sid)
where pos = 13

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 04
-- διαγραφή εγγραφών βάσει συνθήκης
delete from performer
where pid not in (select pid from track);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 05
-- αυτό όμως δεν δουλεύει σε όλα τα DBMS
delete from performer
where pid in
(select pid
from performer
where name like '%Junior%');

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 06
-- λύση: δημιουργούμε προσωρινό πίνακα και
-- μετά εκτελούμε τη διαγραφή
create temporary table tt as
select pid from performer
where name like '%Junior%';
delete from performer
where pid in (select pid from tt);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 07
-- τροποποίηση πεδίων βάσει συνθήκης - τι
-- πετυχαίνει η εντολή αυτή;
update track
set pid=pid+1000
where pid+1000 in (select pid from performer);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 08
-- να και μια περίεργη τροποποίηση...
update cd
set year = 2000+comid,
comid = (select min(comid) from company);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Όψεις
-- View = Query
-- σχήμα της όψης είναι το σχήμα του αιτήματος
-- θα μπορούσαμε να ορίσουμε την όψη ως
-- ιδεατό (virtual) πίνακα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 09
-- δημιουργία όψης
create view 21centurycd as
select * from cd where year > 1999;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 10
-- χρήση όψης
select cc.ctitle, count(*)
from 21centurycd cc join track t using (cid)
group by cc.cid;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 11
-- ιδεατή εκτέλεση του παραπάνω
create temporary table temp as
select * from cd where year > 1999;
select cc.ctitle, count(*)
from temp cc join track t using (cid)
group by cc.cid;
drop table temp;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 12
-- στην όμως πράξη το DBMS
-- κάνει αυτό (rewritting):
select cc.ctitle, count(*)
from (select * from cd where year > 1999) cc
join track t using (cid)
group by cc.cid, cc.ctitle;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 13
-- ...ή για την ακρίβεια αυτό! (αν έχει καλό
-- βελτιστοποιητή)
select cc.ctitle, count(*)
from cd cc join track t using (cid)
where year > 1999
group by cc.cid, cc.ctitle;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 14
-- ορισμός όψης πάνω σε όψη
create view 21centuryperf as
select name
from (21centurycd join track using(cid))
join performer using(pid);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 15
-- τί γίνεται αν διαγράψω την όψη;
drop view 21centurycd;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Περιορισμοί
-- περιορισμοί non-null,
-- κλειδιού (primary, unique), ξένου κλειδιού
-- καθυστερημένος έλεγχος όταν έχουμε
-- μπλοκ εντολών τύπου
-- begin...commit ή begin...rollback (συναλλαγή)
-- το παρακάτω χρειάζεται στην sqlite γιατί ο
-- περιορισμός ξένου κλειδιού δεν ελέγχεται
-- by default
PRAGMA foreign_keys = ON;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 16
-- τί σημαίνει unique(year, ctitle);
create table cd2 (
cid integer primary key,
ctitle varchar(200),
year integer not null,
comid integer references company2(comid)
deferrable initially deferred,
unique(year, ctitle));

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 17
-- έχει ενδιαφέρον η περίπτωση unique όταν το
-- name είναι null
create table company2 (
comid integer primary key,
name varchar(200) unique);

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 18
-- εξαιτίας του "deferrable initially deferred" τα
-- παρακάτω είναι ΟΚ
begin;
insert into cd2 values
(1, 'My first cd', 2013, 3);
insert into company2 values
(3, 'My record company');
commit;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 19
-- περιορισμός ξένου κλειδιού: αντιμετώπιση
-- ενημερώσεων/διαγραφών
create table cd2 (
cid integer primary key,
ctitle varchar(200),
year integer not null,
comid integer references company2(comid)
on
update cascade on delete set null);
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 20
-- περιορισμοί επιπέδου πεδίου/εγγραφής
-- ΠΡΟΣΟΧΗ: η MySQL δέχεται τέτοιους
-- περιορισμούς, αλλά δεν τους ελέγχει...
create table cd2 (cid integer primary key,
ctitle varchar(200) check(ctitle not like '0%'),
year integer not null check(year > 1900),
comid integer references company2(comid)
deferrable initially deferred,
unique(year, ctitle),
check(ctitle like 'a%'
or year between 1990 and 2000));
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 21
-- παρόλο που το standard της SQL προβλέπει
-- εμφωλευμένα αιτήματα μέσα σε περιορισμούς
-- τύπου check, κανένα DBMS δεν έχει
-- υλοποιήσει κάτι τέτοιο

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 21 (συνέχεια)
-- Επίσης, κανένα DBMS δεν έχει υλοποιήσει
-- γενικούς ισχυρισμούς (general assertions)
-- παρόλο που υποστηρίζονται από το standard
-- της SQL
create assertion cdsize
check (not exists
(select cid
from track join cd using(cid)
group by cid
having count(*)>99));
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 22
-- Εναύσματα - δοκιμάστε τα στην MySQL
-- τί κάνει αυτό το έναυσμα;
create trigger cascade_delete
after delete on company2
for each row
begin
delete from cd2 where comid = old.comid;
end;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 23
-- αυτόματη εισαγωγή νέας εταιρίας
create trigger auto_insert_company
after insert on cd2
for each row
begin
insert into company2 values (new.comid,
concat('new company for cd: ', new.ctitle);
end;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 24
-- ενημέρωση μετά από εισαγωγή
create trigger update_counter
after insert on cd2
for each row
begin
update counter set val=val+1;
end;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 25
-- Εναύσματα - δοκιμάστε τα στην sqlite
-- έναυσμα υπό συνθήκη
create trigger tracks_less_than_4
after insert on track2
for each row
when 3 <
(select count(*) from track2 where cid =
new.cid)
begin
delete from track2 where cid=new.cid and pos=new.pos;
end; ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Query 26
-- ή ακόμα καλύτερα χρησιμοποιώντας το
-- raise(ignore) της sqlite:
create trigger tracks_less_than_4
before insert on track2
for each row
when 2 < (select count(*) from track2 where cid =
new.cid)
begin
select raise(ignore);
end;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Query 27
-- έλεγχος σειριακής αρίθμησης των track
create trigger track_numbering
before insert on track2
for each row
when (new.pos=1 and exists
(select cid from track2 where cid=new.cid)) or
(new.pos<>1 and new.pos-1 not in
(select pos from track2 where cid=new.cid))
begin
select raise(ignore);
end;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 10:
Εισαγωγικά περί κανονικοποίησης
Συναρτησιακές εξαρτήσεις – BCNF

Μέρος 1

Εισαγωγικά περί κανονικοποίησης

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Πως προκύπτει ένα σχήμα;
• Top-down με σχεδίαση ενός διαγράμματος
Οντοτήτων-Συσχετίσεων και μετατροπή αυτού
σε ένα σύνολο πινάκων (σχέσεων) [δες
ενότητες 2 και 3].
• Bottom-up με αυτοματοποιημένο αλγοριθμικό
τρόπο (χρήση της θεωρίας
κανονικοποίησης).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παράδειγμα με CDBASE (1)


Επίπεδος (flat) πίνακας, παρόμοιος με λογιστικό
φύλλο:
TRACK(cd_title, year, company_name,
track_position, song_title, performer_name,
composer_name, lyricist_name)
Πρόβλημα: Πως ξεχωρίζω cd με τον ίδιο τίτλο,
τραγούδια με τον ίδιο τίτλο, εταιρίες / ερμηνευτές /
συνθέτες / στιχουργούς με το ίδιο όνομα;
Λύση: χρήση κάποιου έξτρα πεδίου που παίρνει
μοναδικές τιμές για κάθε ένα από αυτά τα
αντικείμενα (οντότητες;)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Παράδειγμα με CDBASE (2)
• Μια βελτιωμένη εκδοχή:
TRACK(cd_id, cd_title, year, company_id,
company_name, track_position, song_id,
song_title, performer_id, performer_name,
composer_id, composer_name, lyricist_id,
lyricist_name)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παράδειγμα με CDBASE (3)


• Αλλά, όπως ήδη είδαμε έχουμε περιττή
επανάληψη πληροφορίας καθώς και όλα τα
αρνητικά επακόλουθα (στις ενημερώσεις και στις
διαγραφές).
• Πόσες εγγραφές χρειαζόμαστε για ένα track που
έχει 4 ερμηνευτές, 3 στιχουργούς και 2 συνθέτες;
• Στο παραπάνω σενάριο (δηλαδή για την
καταγραφή της πληροφορίας ενός μόνο track),
πόσες φορές δηλώνουμε κάποια πληροφορία για
το cd και την εταιρία; - για κάθε ερμηνευτή /
συνθέτη / στιχουργό;
• Πρόκειται για ένα κακό σχήμα.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Παράδειγμα με CDBASE (4)
Τώρα “μπαίνουν στο παιχνίδι” και οι επιχειρησιακοί
κανόνες που προκύπτουν κατά τη φάση της
ανάλυσης απαιτήσεων:
• Μπορεί να υπάρχουν πολλαπλές εκδοχές
(ηχογραφήσεις) ενός τραγουδιού;
• Μπορεί το ίδιο τραγούδι να εμφανίζεται στο ίδιο cd
είτε με την ίδια είτε με διαφορετική ηχογράφηση;
• Μπορεί ένα τραγούδι να έχει πολλούς συνθέτες ή
στιχουργούς;
• Μπορεί μια ηχογράφηση να έχει πολλούς
ερμηνευτές;
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ένα καλύτερο σχήμα


SONG(song_id, song_title)
COMPOSER(composer_id, composer_name)
LYRICIST(lyricist_id, lyricist_name)
SONG_COMP(song_id, composer_id)
SONG_LYR(song_id, lyricist_id)
RECORDING(rec_id, song_id)
PERFORMER(performer_id, performer_name)
REC_PERF(rec_id, performer_id)
TRACK(cd_id, track_pos, rec_id)
CD(cd_id, cd_title, year, company_id)
COMPANY(company_id, company_name)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Σχεδίαση με κανονικοποίηση (1)
Πως φτάνω όμως στο προηγούμενο “καλό”
σχήμα;
• Ξεκινώ από έναν universal πίνακα.
• Διασπώ σε μικρότερους καλύτερους πίνακες.
• Η όλη διαδικασία γίνεται με αυτοματοποιημένο
τρόπο (αλγόριθμος).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Σχεδίαση με κανονικοποίηση (2)


• Για να δουλέψει ο αλγόριθμος χρειάζεται
επιπλέον πληροφορία εκτός της universal
σχέσης.
• Είναι πληροφορία που σχετίζεται με τους
επιχειρησιακούς κανόνες, δηλαδή με τις
ιδιότητες που έχουν τα δεδομένα.
• Ο αλγόριθμος παράγει ένα σύνολο πινάκων
που ικανοποιούν μια κανονική μορφή (normal
form).
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Σχεδίαση με κανονικοποίηση (3)
• Συναρτησιακές εξαρτήσεις ==> Boyce-Codd NF
• Εξαρτήσεις πολλαπλών τιμών ==> 4NF

Συναρτησιακή εξάρτηση = Functional dependency


Εξάρτηση πολλαπλών τιμών = Multivalued
dependency

• Στα επόμενα θα χρησιμοποιούμε τις


συντομογραφίες FD και MVD.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Συναρτησιακές εξαρτήσεις
TRACK(cd_id, cd_title, year, rec_id, track_pos)
• Κακός σχεδιασμός.
• Έχουμε την FD: cd_id → cd_title, year
BCNF: αν Α → Β τότε το Α πρέπει να είναι κλειδί
• Άρα διασπώ τον TRACK σε:
CD(cd_id, cd_title, year)
TRACK(cd_id, rec_id, track_pos)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Εξαρτήσεις πολλαπλών τιμών
SONG(song_id, composer_id, lyricist_id)
• Κακός σχεδιασμός παρόλο που είναι σε BCNF.
• Πρακτικά, δεν υπάρχει καμία FD στον Song.
• Όμως έχω την MVD: song_id —≫ composer_id
4NF: αν Α —≫ Β τότε το Α πρέπει να είναι κλειδί
• Άρα διασπώ τον SONG σε:
SONG_COMP(song_id, composer_id)
SONG_LYR(song_id, lyricist_id)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Μέρος 2

Συναρτησιακές εξαρτήσεις – BCNF

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ορισμός FD
A→B
• Όταν σε δυο διαφορετικές εγγραφές ενός
πίνακα τα A έχουν την ίδια τιμή τότε και τα B
έχουν την ίδια τιμή.
• Αλλιώς, το Α προσδιορίζει το Β.
• Γενίκευση:
A1, A2, ... An → B1, B2, ... Bm ή Χ → Υ
• Παράδειγμα: cd_id → cd_title, year
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

FD και κλειδί
• Έχω έναν πίνακα R χωρίς διπλότυπα.
• Έστω ότι Α, Β → όλα-τα-πεδία-του-R.
• Αυτός όμως είναι ορισμός του κλειδιού.
• Στα παρακάτω χρησιμοποιούμε τους
συμβολισμούς A, B, C για πεδία και X, Y, Z για
σύνολα πεδίων.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Είδη FD
• Τετριμμένες:
Χ → Υ και Υ ⊆ Χ
• Μη-τετριμμένες:
Χ → Υ και Υ ⊆ Χ
• Πλήρως μη-τετριμμένες
Χ → Υ και Χ ∩ Υ = ∅
Μας ενδιαφέρουν μόνο FD του τελευταίου είδους.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Κανόνες για FD (1)


Κανόνας διαχωρισμού:
Αν Χ → B1, B2, ... Bm τότε
Χ → B1
Χ → B2
...
Χ → Bm
Το ανάποδο δεν ισχύει!

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Κανόνες για FD (2)
Κανόνας συνένωσης:
Αν
Χ → B1
Χ → B2
...
Χ → Bm τότε
Χ → B1, B2, ... Bm

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Κανόνες για FD (3)


Τετριμμένοι κανόνες:
Χ → Υ τότε Χ → Χ ∪ Υ
Χ → Υ τότε Χ → Χ ∩ Υ

Μεταβατικός κανόνας:
Χ → Υ και Υ → Ζ τότε Χ → Ζ

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Εγκλεισμός πεδίων
• Έχω έναν πίνακα R, ένα σύνολο από FDs, και
ένα σύνολο πεδίων Χ του R.
• Εγκλεισμός του Χ, ή Χ+, είναι το σύνολο όλων
των πεδίων Υ του R για τα οποία ισχύει Χ → Υ.
• Αλγόριθμος; Ξεκινώ θέτοντας Χ+ = Χ και μετά
για κάθε FD Υ → Ζ με Υ ⊆ Χ προσθέτω το Ζ
στο Χ+. Συνεχίζω μέχρι να μην μπορεί να
προστεθεί κάτι στο Χ+.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παράδειγμα εγκλεισμού
RECORDING(song_id, song_title, rec_id,
performer_id, performer_name) και ισχύουν
song_id → song_title
performer_id → performer_name
rec_id → song_id
Τότε {performer_id, rec_id}+ = {όλα τα πεδία}

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Εγκλεισμός και κλειδιά
• Πότε ξέρουμε αν X είναι κλειδί του R;
• Αν Χ+ ισούται με το σύνολο των πεδίων του R!
• Άρα αν έχουμε έναν πίνακα R και ένα σύνολο από
FDs, πως βρίσκουμε τα κλειδιά του R;
• Αλγόριθμος: δοκιμάζουμε αν Α+ είναι κλειδί για
κάθε πεδίο Α του R. Αν δεν βρούμε κανένα κλειδί,
δοκιμάζουμε με ζεύγη πεδίων, κοκ.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Καθορίζοντας FDs για πίνακα (1)


• Αν έχω δυο σύνολα S1 και S2 από FDs για
έναν πίνακα R, τότε το S2 προκύπτει από το
S1 αν κάθε εγγραφή του R που ικανοποιεί τις
FDs του S1 ικανοποιεί και τις FDs του S2.
• Παράδειγμα: το S2 = {rec_id → song_title}
προκύπτει από το S1 = {rec_id → song_id,
song_id → song_title}
• Πως βρίσκω αν Χ → Υ προκύπτει από ένα
σύνολο S από FDs; Υπολογίζω το Χ+ βάσει του
S και ελέγχω αν το Υ ανήκει στο Χ+.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Καθορίζοντας FDs για πίνακα (2)
• Ποιες FDs θέλουμε για έναν πίνακα R;
• Το ελάχιστο σύνολο από πλήρως μη-
τετριμμένες FDs ώστε όλες οι FDs που
ισχύουν για τον πίνακα R να προκύπτουν
από αυτό το σύνολο.
• Θα το δούμε στην πράξη!

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Διάσπαση πίνακα
Έχουμε μια καλή διάσπαση όταν
ο αρχικός πίνακας R(Χ)
διασπάται στους πίνακες R1(Υ) και R2(Ζ)
ώστε Υ ∪ Ζ = Χ και R1 |x| R2 = R

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Κανονικοποίηση με διάσπαση
• Ξεκινάμε από έναν universal πίνακα και
ιδιότητες των δεδομένων (FDs).
• Ο αλγόριθμος διασπά βάσει των FDs.
• Στο τέλος μετά από μια σειρά καλών
διασπάσεων έχουμε ένα σύνολο καλών
πινάκων (που είναι σε BCNF).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ορισμός BCNF
• Ένας πίνακας R με FDs είναι σε BCNF αν
Για κάθε Χ → B, το Χ είναι κλειδί

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Παράδειγμα BCNF (1)
R(song_id, song_title, rec_id, performer_id,
performer_name)
και ισχύουν
song_id → song_title
performer_id → performer_name
rec_id → song_id
Tο ελάχιστο κλειδί του R είναι το {performer_id,
rec_id}.
Βάσει των τριών FD ο R δεν είναι σε BCNF.
Διασπώ...
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παράδειγμα BCNF (2)


R1(song_id, song_title) είναι σε BCNF
R2(song_id, rec_id, performer_id, performer_name)
συνεχίζω τη διάσπαση
R21(performer_id, performer_name) είναι σε BCNF
R22(song_id, rec_id, performer_id)
συνεχίζω τη διάσπαση
R221(rec_id, song_id) είναι σε BCNF
R222(rec_id, performer_id) είναι σε BCNF

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Αλγόριθμος διάσπασης BCNF
• Input: πίνακας R και FDs του R
• Output: διάσπαση του R σε σύνολο πινάκων σε BCNF
• Υπολόγισε με τη βοήθεια των FDs τα κλειδιά του R.
• Επανέλαβε μέχρι να είναι όλοι οι πίνακες σε BCNF:
• Πάρε έναν πίνακα R' ο οποίος εξαιτίας μιας X → Y να
μην είναι σε BCNF.
• Διάσπασε τον R' σε R1(X, Y) και R2(X, υπόλοιπα-
πεδία).
• Υπολόγισε τις FDs των R1 και R2.
• Υπολόγισε τα κλειδιά των R1 και R2.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Γιατί οι BCNF πίνακες είναι καλοί


• Δεν έχουν προβλήματα πλεονασμού.
• Μπορούν να αναδημιουργήσουν τους
αρχικούς πίνακες με σύζευξη.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Πλήρες παράδειγμα (1)
T(cd_id, cd_title, year, company_id, company_name, track_position,
track_duration, rec_id, rec_duration, song_id, song_title, performer_id,
performer_name, composer_id, composer_name, lyricist_id,
lyricist_name)
1. song_id → song_title
2. composer_id → composer_name
3. lyricist_id → lyricist_name
4. rec_id → song_id, rec_duration
5. performer_id → performer_name
6. cd_id, track_position → rec_id, track_duration
7. cd_id → cd_title, year, company_id
8. company_id → company_name
Ελάχιστο κλειδί = {cd_id, track_position, performer_id, composer_id,
lyricist_id)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Πλήρες παράδειγμα (2)


O T δεν είναι σε BCNF. Διασπώ με την FD
1. song_id → song_title
Τ1(song_id, song_title) BCNF
T2(cd_id, cd_title, year, company_id,
company_name, track_position, track_duration,
rec_id, rec_duration, song_id, performer_id,
performer_name, composer_id, composer_name,
lyricist_id, lyricist_name)
Κλειδί = {cd_id, track_position, performer_id,
composer_id, lyricist_id}, FDs = {2, 3, 4, 5, 6, 7, 8}.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Πλήρες παράδειγμα (3)
O T2 δεν είναι σε BCNF. Διασπώ με τις FDs 2, 3, 5, 7, 8:
T3(composer_id, composer_name) BCNF
Τ4(lyricist_id, lyricist_name) BCNF
T5(performer_id, performer_name) BCNF
T6(cd_id, cd_title, year, company_id) BCNF
T7(company_id, company_name) BCNF
T8(cd_id, track_position, track_duration, rec_id,
rec_duration, song_id, performer_id, composer_id,
lyricist_id)
Κλειδί = {cd_id, track_position, performer_id, composer_id,
lyricist_id}FDs = {4, 6}.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Πλήρες παράδειγμα (4)


Ο Τ8 δεν είναι σε BCNF. Διασπώ με την
4. rec_id → song_id, rec_duration
T9(rec_id, song_id, rec_duration) BCNF
T10(cd_id, track_position, track_duration,
rec_id, performer_id, composer_id, lyricist_id)
Κλειδί = {cd_id, track_position, performer_id,
composer_id, lyricist_id}, FDs = {6}.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Πλήρες παράδειγμα (5)
O T10 δεν είναι σε BCNF. Διασπώ με την
6. cd_id, track_position → rec_id,
track_duration
T11(cd_id, track_position, rec_id,
track_duration) BCNF
T12(cd_id, track_position, performer_id,
composer_id, lyricist_id) BCNF
Κλειδί = {cd_id, track_position, performer_id,
composer_id, lyricist_id}, FDs = {}.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Πλήρες παράδειγμα (6)


Τελικό BCNF Σχήμα:
SONG(song_id, song_title)
COMPOSER(composer_id, composer_name)
LYRICIST(lyricist_id, lyricist_name)
PERFORMER(performer_id, performer_name)
CD(cd_id, cd_title, year, company_id)
COMPANY(company_id, company_name)
RECORDING(rec_id, song_id, rec_duration)
TRACK(cd_id, track_position, rec_id, track_duration)
TRACK_CONTRIB(cd_id, track_position, performer_id,
composer_id, lyricist_id)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 11: Εξαρτήσεις πολλαπλών τιμών -
4NF, 1NF, 2NF, 3NF, Μελέτη Περίπτωσης

Μέρος 1

Εξαρτήσεις πολλαπλών τιμών – 4NF

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Παράδειγμα προβλήματος
TRACK_CONTRIB(cd_id, track_position,
performer_id, composer_id, lyricist_id)
Κλειδί = {όλα τα πεδία}
FDs = {}
Είναι όμως καλός πίνακας;
Εξαρτήσεις πολλαπλών τιμών (MVD)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ορισμός MVD
X —≫ Y
• Έχω τον πίνακα R(Χ, Υ, Ζ)
• Όταν δυο διαφορετικές εγγραφές του R έχουν
τα ίδια Χ, τότε υπάρχει μια τρίτη εγγραφή που
και αυτή έχει το ίδιο Χ, αλλά έχει το Υ της
πρώτης εγγραφής και το Ζ της δεύτερης.
• Πρακτικά, τα Υ και Ζ είναι ανεξάρτητα μεταξύ
τους, και συνεπώς έχουμε όλους τους δυνατούς
συνδυασμούς τους για δεδομένο Χ.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Επιστροφή στο παράδειγμα (1)
T8(cd_id, track_position, track_duration,
rec_id, rec_duration, song_id, performer_id,
composer_id, lyricist_id)
Σε μια εγγραφή του Τ8, τα performer_id,
composer_id, lyricist_id είναι ανεξάρτητα
μεταξύ τους.
Για ένα track που έχει 4 ερμηνευτές, 3 συνθέτες
και 2 στιχουργούς, χρειάζομαι 24 εγγραφές με τα
υπόλοιπα πεδία να έχουν τις ίδιες τιμές σε όλες
αυτές τις εγγραφές!
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Επιστροφή στο παράδειγμα (2)


Εδώ, εκτός των δυο FDs:
4. rec_id → song_id, rec_duration
6. cd_id, track_position → rec_id, track_duration
Έχω και τις εξής MVDs:
9. rec_id —≫ performer_id
10. song_id — ≫ composer_id
11. song_id —≫ lyricist_id

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Είδη MVD
• Τετριμμένες:
Χ —≫ Υ και Υ ⊆ Χ ή Χ ∪ Υ = {όλα τα πεδία}
• Μη-τετριμμένες:
διαφορετικά

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Κανόνες για MVD


Κάθε FD είναι MVD:
Χ → Υ τότε Χ —≫ Υ
Τομής:
Χ —≫ Υ και Χ —≫ Ζ τότε Χ —≫ Υ ∩ Ζ
Μεταβατικός:
Χ —≫ Υ και Υ —≫ Ζ τότε Χ —≫ Ζ - Υ

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
4NF
• Ένας πίνακας R με MVDs είναι σε 4NF αν
Για κάθε μη-τετριμμένη Α —≫ B, το Α είναι κλειδί

• Ένας πίνακας σε 4NF είναι σε BCNF

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Αλγόριθμος διάσπασης 4NF


Input: πίνακας R και FDs και MVDs του R
Output: διάσπαση του R σε σύνολο πινάκων σε 4NF
Υπολόγισε με τη βοήθεια των FDs τα κλειδιά του R.
Επανέλαβε μέχρι να είναι όλοι οι πίνακες σε 4NF:
• Πάρε έναν πίνακα R' ο οποίος εξαιτίας μιας A —≫ B
να μην είναι σε 4NF.
• Διάσπασε τον R' σε R1(A, B) και R2(A, υπόλοιπα-
πεδία).
• Υπολόγισε τις FDs και MVDs των R1 και R2.
• Υπολόγισε τα κλειδιά των R1 και R2.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Πλήρες παράδειγμα (7)
T8(cd_id, track_position, track_duration,
rec_id, rec_duration, song_id, performer_id,
composer_id, lyricist_id)
O T8 δεν είναι σε 4NF. Διασπώ βάσει της MVD:
9. rec_id —≫ performer_id
T9(rec_id, performer_id) 4NF
T10(cd_id, track_position, track_duration,
rec_id, rec_duration, song_id, composer_id,
lyricist_id)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Πλήρες παράδειγμα (8)


O T10 δεν είναι σε 4NF. Διασπώ βάσει των MVD:
10. song_id —≫ composer_id
11. song_id —≫ lyricist_id
T11(song_id, composer_id) 4NF
T12(song_id, lyricist_id) 4NF
T13(cd_id, track_position, track_duration,
rec_id, rec_duration, song_id)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Πλήρες παράδειγμα (9)
T13(cd_id, track_position, track_duration, rec_id,
rec_duration, song_id)
O T13 δεν έχει MVDs και δεν είναι σε BCNF. Διασπώ
βάσει των FDs 4 και 6:
4. rec_id → song_id, rec_duration
6. cd_id, track_position → rec_id, track_duration
T14(rec_id, song_id, rec_duration) BCNF+4NF
T15(cd_id, track_position, rec_id, track_duration)
BCNF+4NF
Ο Τ15 μένει ως έχει.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Πλήρες παράδειγμα (10)


Τελικό 4NF Σχήμα:
SONG(song_id, song_title)
COMPOSER(composer_id, composer_name)
LYRICIST(lyricist_id, lyricist_name)
PERFORMER(performer_id, performer_name)
CD(cd_id, cd_title, year, company_id)
COMPANY(company_id, company_name)
REC_PERF(rec_id, performer_id)
SONG_COMP(song_id, composer_id)
SONG_LYR(song_id, lyricist_id)
RECORDING(rec_id, song_id, rec_duration)
TRACK(cd_id, track_position, rec_id, track_duration)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ποιο είναι το αντίστοιχο EER;

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Να και το αντίστοιχο ER

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Μέρος 2

1NF, 2NF, 3NF

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

1NF
• Ένας πίνακας R είναι σε 1NF όταν τα πεδία
ορισμού όλων των πεδίων του περιέχουν μόνο
ατομικές τιμές, και οι τιμές των πεδίων
αποτελούνται από μία μόνο τέτοια τιμή.
• Παράδειγμα πίνακα που δεν είναι σε 1NF (από
First Normal Form πηγη:Wikipedia):

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
2NF
• Ένας πίνακας R είναι σε 2NF αν και μόνο αν
είναι σε 1NF και κάθε πεδίο του που δεν
ανήκει σε κλειδί δεν εξαρτάται από
υποσύνολο κάποιου υποψήφιου κλειδιού.
• Αν για παράδειγμα R(A, B, C) και Β → C, τότε ο
R δεν είναι σε 2FN.
• Πρέπει να διασπαστεί σε R1(B, C) και R2(A, B).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

2NF παράδειγμα (1)


• (από Second Normal Form πηγή: Wikipedia):
• Κλειδί: {Employee, Skill} FD: Employee →
Current_Work_Location

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
2NF παράδειγμα (2)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

3NF
• Ένας πίνακας R είναι σε 3NF αν είναι σε 2NF
και κάθε πεδίο που δεν ανήκει σε κλειδί δεν
εξαρτάται από πεδίο που δεν ανήκει σε
κλειδί.
• Αν για παράδειγμα R(A, B, C) και Β → C, τότε ο
R δεν είναι σε 3FN.
• Πρέπει να διασπαστεί σε R1(B, C) και R2(A, B).

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
3NF παράδειγμα (1)
• (από Third Normal Form πηγή: Wikipedia):
• Κλειδί: {Tournament, Year} FD: Winner →
Winner_Date_of_Birth

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

3NF παράδειγμα (2)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Πίνακες 3NF που δεν είναι BCNF
• (από Boyce-Codd Normal Form πηγή: Wikipedia):
• Υποψήφια κλειδιά: {Court, Start Time}, {Court, End
Time}, {Rate Type, Start Time}, {Rate Type, End
Time}
• FD: Rate Type → Court

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

BCNF παράδειγμα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Ανέφικτη BCNF (1)
• (από Boyce-Codd Normal Form πηγή: Wikipedia):
• FDs:Person, Shop_Type →
Nearest_ShopNearest_Shop → Shop_Type
• Υποψήφια κλειδιά:{Person, Shop_Type}{Person,
Nearest_Shop}

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ανέφικτη BCNF (2)

Παρόλο που οι πίνακες είναι σε BCNF, τώρα


έχουμε ένα νέο σοβαρό πρόβλημα: δεν υπάρχει
εγγύηση ότι ικανοποιείται η FD Person,
Shop_Type → Shop
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Μέρος 3

Μελέτη Περίπτωσης

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

On-line κρατήσεις εισιτηρίων (1)


• Υπάρχουν χώροι όπου γίνονται καλλιτεχνικές
εκδηλώσεις.
• Μια εκδήλωση μπορεί να γίνει σε διαφορετικούς χώρους
ακόμη και την ίδια ημερομηνία. Αυτό το ονομάζουμε
παράσταση.
• Υποθέτουμε ότι μια εκδήλωση γίνεται μια φορά σε έναν
χώρο μια συγκεκριμένη ημερομηνία.
• Σε μια εκδήλωση συμμετέχουν ένας ή παραπάνω
καλλιτέχνες και τα ονόματά τους εμφανίζονται στο
πρόγραμμα με συγκεκριμένη σειρά.
• Οι χώροι έχουν θέσεις που ανήκουν σε συγκεκριμένες
τιμολογιακές κατηγορίες.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
On-line κρατήσεις εισιτηρίων (2)
• Μια παράσταση έχει συγκεκριμένες τιμές
εισιτηρίων για κάθε τιμολογιακή κατηγορία.
• Το σύστημα πουλά εισιτήρια παραστάσεων σε
εγγεγραμμένους πελάτες.
• Κάθε κράτηση που κάνει ένας πελάτης αφορά
συγκεκριμένη παράσταση.
• Κάθε κράτηση πελάτη μπορεί να περιέχει πολλά
εισιτήρια, καθένα από τα οποία αντιστοιχεί σε μια
θέση του χώρου της παράστασης και προφανώς
ανήκει σε κάποια κατηγορία τιμολόγησης.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Πεδία προβλήματος
• Κχώρου, Οχώρου, αρ_θέσης, κατηγ_θέσης
• Κεκδήλ, Οεκδήλ, ημερομ_παράστ,
κόστος_εισιτηρίου
• Κκαλλ, Οκαλλ, σειρά_εμφάνισης
• Κπελάτη, Οπελάτη, email, διεύθυνση
• Κκράτησης, γραμμή_κράτησης

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
FDs και MVDs προβλήματος
1. Κχώρου → Οχώρου
2. Κχώρου, αρ_θέσης → κατηγ_θέσης
3. Κεκδήλ → Οεκδήλ
4. Κχώρου, Κεκδήλ → ημερομ_παράστ
5. Κχώρου, Κεκδήλ, κατηγ_θέσης → κόστος_εισιτηρίου
6. Κκαλλ → Οκαλλ
7. Κεκδήλ, Κκαλλ → σειρά_εμφάνισης
8. Κπελάτη → Οπελάτη, email, διεύθυνση
9. Κπελάτη, Κκράτησης → Κχώρου, Κεκδήλ
10. Κπελάτη, Κκράτησης, γραμμή_κράτησης → αρ_θέσης
11. Κεκδήλ —≫ Κκαλλ

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Κανονικοποίηση σε 4NF (1)


Κλειδί: {Κπελάτη, Κκράτησης,
γραμμή_κράτησης, Κκαλλ}
Αρχικός πίνακας:
R(Κχώρου, Οχώρου, αρ_θέσης, κατηγ_θέσης,
Κεκδήλ, Οεκδήλ, ημερομ_παράστ,
κόστος_εισιτηρίου, Κκαλλ, Οκαλλ,
σειρά_εμφάνισης, Κπελάτη, Οπελάτη, email,
διεύθυνση, Κκράτησης, γραμμή_κράτησης)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Κανονικοποίηση σε 4NF (2)
• Πρώτα διασπώ με τις FD 1, 3, 6, 8:
R1(Κχώρου, Οχώρου)
R2(Κεκδήλ, Οεκδήλ)
R3(Κκαλλ, Οκαλλ)
R4(Κπελάτη, Οπελάτη, email, διεύθυνση)
R5(Κχώρου, αρ_θέσης, κατηγ_θέσης, Κεκδήλ,
ημερομ_παράστ, κόστος_εισιτηρίου, Κκαλλ,
σειρά_εμφάνισης, Κπελάτη, Κκράτησης,
γραμμή_κράτησης)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Κανονικοποίηση σε 4NF (3)


• Συνεχίζω με την FD 5: Κχώρου, Κεκδήλ,
κατηγ_θέσης → κόστος_εισιτηρίου
R6(Κχώρου, Κεκδήλ, κατηγ_θέσης,
κόστος_εισιτηρίου)
R7(Κχώρου, αρ_θέσης, κατηγ_θέσης, Κεκδήλ,
ημερομ_παράστ, Κκαλλ, σειρά_εμφάνισης,
Κπελάτη, Κκράτησης, γραμμή_κράτησης)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Κανονικοποίηση σε 4NF (4)
• Συνεχίζω με την FD 2: Κχώρου, αρ_θέσης →
κατηγ_θέσης
R8(Κχώρου, αρ_θέσης, κατηγ_θέσης)
R9(Κχώρου, αρ_θέσης, Κεκδήλ,
ημερομ_παράστ, Κκαλλ, σειρά_εμφάνισης,
Κπελάτη, Κκράτησης, γραμμή_κράτησης)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Κανονικοποίηση σε 4NF (5)


• Συνεχίζω με την FD 4: Κχώρου, Κεκδήλ →
ημερομ_παράστ
R10(Κχώρου, Κεκδήλ, ημερομ_παράστ)
R11(Κχώρου, αρ_θέσης, Κεκδήλ, Κκαλλ,
σειρά_εμφάνισης, Κπελάτη, Κκράτησης,
γραμμή_κράτησης)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Κανονικοποίηση σε 4NF (6)
• Συνεχίζω με την FD 7: Κεκδήλ, Κκαλλ →
σειρά_εμφάνισης
R12(Κεκδήλ, Κκαλλ, σειρά_εμφάνισης)
R13(Κχώρου, αρ_θέσης, Κεκδήλ, Κκαλλ,
Κπελάτη, Κκράτησης, γραμμή_κράτησης)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Κανονικοποίηση σε 4NF (7)


• Συνεχίζω με την MVD 11: Κεκδήλ —≫ Κκαλλ
R14(Κεκδήλ, Κκαλλ)
R15(Κχώρου, αρ_θέσης, Κεκδήλ, Κπελάτη,
Κκράτησης, γραμμή_κράτησης)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Κανονικοποίηση σε 4NF (8)
• Συνεχίζω με την FD 9:
Κπελάτη, Κκράτησης → Κχώρου, Κεκδήλ
R16(Κπελάτη, Κκράτησης, Κχώρου, Κεκδήλ)
R17(Κπελάτη, Κκράτησης, γραμμή_κράτησης,
αρ_θέσης)
• Έχω τελειώσει επειδή η FD 10 ισχύει για την R17:
Κπελάτη, Κκράτησης, γραμμή_κράτησης →
αρ_θέσης

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Τελικό σχεσιακό σχήμα (1)


R1(Κχώρου, Οχώρου)
R2(Κεκδήλ, Οεκδήλ)
R3(Κκαλλ, Οκαλλ)
R4(Κπελάτη, Οπελάτη, email, διεύθυνση)
R6(Κχώρου, Κεκδήλ, κατηγ_θέσης, κόστος_εισιτηρίου)
R8(Κχώρου, αρ_θέσης, κατηγ_θέσης)
R10(Κχώρου, Κεκδήλ, ημερομ_παράστ)
R12(Κεκδήλ, Κκαλλ, σειρά_εμφάνισης)
R14(Κεκδήλ, Κκαλλ)
R16(Κπελάτη, Κκράτησης, Κχώρου, Κεκδήλ)
R17(Κπελάτη, Κκράτησης, γραμμή_κράτησης, αρ_θέσης)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Τελικό σχεσιακό σχήμα (2)
ΧΩΡΟΣ(Κχώρου, Οχώρου)
ΕΚΔΗΛΩΣΗ(Κεκδήλ, Οεκδήλ)
ΚΑΛΛΙΤΕΧΝΗΣ(Κκαλλ, Οκαλλ)
ΠΕΛΑΤΗΣ(Κπελάτη, Οπελάτη, email, διεύθυνση)
ΚΑΤΗΓ_ΘΕΣΗΣ(κατηγ_θέσης)
ΤΙΜΟΛΟΓΗΣΗ(Κχώρου, Κεκδήλ, κατηγ_θέσης, κόστος_εισιτηρίου)
ΘΕΣΗ(Κχώρου, αρ_θέσης, κατηγ_θέσης)
ΠΑΡΑΣΤΑΣΗ(Κχώρου, Κεκδήλ, ημερομ_παράστ)
ΕΚΔΗΛ_ΚΑΛΛ(Κεκδήλ, Κκαλλ, σειρά_εμφάνισης)
ΚΡΑΤΗΣΗ(Κπελάτη, Κκράτησης, Κχώρου, Κεκδήλ)
ΕΙΣΙΤΗΡΙΟ(Κπελάτη, Κκράτησης, γραμμή_κράτησης, αρ_θέσης)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Σχεσιακό σχήμα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Διάγραμμα ΟΣ

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Ενότητα 12:
Παραδείγματα Κανονικοποίησης
Παράδειγμα 1
R (A, B, C, D, E, F) 2NF: ήδη σε 2NF
A --> B, C 3NF
B --> D R1 (B, D)
A, B --> E R2 (E, F)
E --> F R2 (A, B, C, E)

key {A}

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παράδειγμα 2
R (A, B, C, D, E, F) 2NF
R1 (A, B, C)
A --> B, C
R2 (D, F)
B --> C R3 (A, D, E)
A, D --> E 3NF
D --> F R1 (A, B)
R2 (D, F)
R3 (A, D, E)
key {A, D} R4 (B, C)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Παράδειγμα 3
R (A, B, C, D, E, F) 2NF
A --> B R1 (A, B, C, D)
B --> C, D R2 (A, E, F)
3NF
key {A, E, F} R1 (A, B)
R2 (A, E, F)
R3 (B, C, D)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παράδειγμα 4
R (A, B, C, D, E, F) 2NF και 3NF
A --> B R1 (A, B)
R2 (A, E, F)
B --> C, D
R3 (B, C, D)
A -->> E 4NF
A -->> F R1 (A, B)
key {A, E, F} R3 (B, C, D)
R4 (A, E)
R5 (A, F)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής
Παράδειγμα 5
R (A, B, C, D) R (A, B, C, D)
A, B --> C, D είναι 3NF
D --> B R (A, B, C, D)
δεν είναι 3NF

key {A, B} or {A, D}


BCNF
R1 (A, C, D)
R2 (D, B)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

Παράδειγμα 6
2NF (key {C, G})
R (A, B, C, D, E, F, G)
R1 (C, A, B)
A --> B, C R2 (C, D, E, F, G)
C --> A, B 3NF
R1 (C, A, B)
D, E --> F R2 (C, F, G)
F --> D, E R3 (F, D, E)
BCNF
C, G --> F
R4 (C, A)
R5 (A, B)
keys {A, G} or {C, G} R2 (C, F, G)
R3 (F, D, E)
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι
Τμήμα Εφαρμοσμένης Πληροφορικής

You might also like