You are on page 1of 479

Διαχείριση Δεδομένων και Βάσεις

Δεδομένων

Αθανάσιος Σταυρακούδης

Πανεπιστήμιο Ιωαννίνων

Ηλεκτρονικοί Υπολογιστές ΙΙ
Περιγραφή και στόχοι του μαθήματος
Οδηγίες προς ναυτιλομένους

Αθανάσιος Σταυρακούδης

΄Ανοιξη 2014

1 / 43
Επισκόπηση 1
1 Δεδομένα, καταγραφή δεδομένων, επεξεργασία δεδομένων
2 Περιεχόμενο και ύλη του μαθήματος
3 Βιβλιογραφία, Εύδοξος, Βιβλιοθήκη
4 Αξιολόγηση φοιτητών, εξετάσεις, εργασίες, βαθμολογίες,
επιδοτήσεις κ.λπ.
5 Ασκήσεις εξάσκησης και προετοιμασίας
6 Επιπλέον βοήθεια, αλληλοβοήθεια, συνεργατική μάθηση, κριτική,
και άλλες πολιτικές.
7 Προετοιμασία για το επόμενο μάθημα

3 / 43

Καταγραφή δεδομένων στη Βίβλο


Καὶ ἐγένετο μετὰ τὴν πληγὴν καὶ ἐλάλησε Κύριος πρὸς Μωυσῆν καὶ
᾿Ελεάζαρ τὸν ἱερέα λέγων· λαβὲ τὴν ἀρχὴν πάσης συναγωγῆς υἱῶν
᾿Ισραὴλ ἀπὸ εἰκοσαετοῦς καὶ ἐπάνω κατ᾿ οἴκους πατριῶν αὐτῶν,
πᾶς ὁ ἐκπορευόμενος παρατάξασθαι ἐν ᾿Ισραήλ· καὶ ἐλάλησε
Μωυσῆς καὶ ᾿Ελεάζαρ ὁ ἱερεὺς ἐν ᾿Αραβὼθ Μωὰβ ἐπὶ τοῦ ᾿Ιορδάνου
κατὰ ῾Ιεριχὼ λέγων· ἀπὸ εἰκοσαετοῦς καὶ ἐπάνω, ὃν τρόπον
συνέταξε Κύριος τῷ Μωυσῇ· καὶ οἱ υἱοὶ ᾿Ισραὴλ οἱ ἐξελθόντες ἐξ
Αἰγύπτου· Ρουβὴν πρωτότοκος ᾿Ισραήλ. υἱοὶ δὲ Ρουβήν· ᾿Ενὼχ καὶ
δῆμος τοῦ ᾿Ενώχ· τῷ Φαλλοὺ δῆμος τοῦ Φαλλουΐ· τῷ ᾿Ασρὼν δῆμος
τοῦ ᾿Ασρωνί·

Παλαιά Διαθήκη, Πεντάτευχος, Αριθμοί, κεφ. 26


http://www.myriobiblos.gr/bible/ot/chapter.asp?book=4&page=26
4 / 43
Κέκρωψ
Πρώτος βασιλιάς της Αθήνας, του
αποδίδονται:
1 Η προτίμηση της Αθηνάς στο
αγώνα Αθηνάς–Ποσειδώνα
2 Η διαίρεση του πληθυσμού της
Αττικής σε Φυλές και Δήμους
3 Η καταγραφή του πληθυσμού
4 Η καθιέρωση της μονογαμίας και η
αναγραφή του πατρωνύμου
5 Η ανακάλυψη του αλφάβητου

Εικόνα από: http://en.wikipedia.org/wiki/Cecrops_I


5 / 43

Δεδομένα στην αρχαιότητα και στο μεσαίωνα

Στρατολογικοί κατάλογοι
Φορολογικοί κατάλογοι
Δωρητές Ναών, Μοναστηριών, κ.λπ.
Καταγραφή αγροτικής παραγωγής
Καταγραφή εμπορικών συναλλαγών

6 / 43
Δεδομένα στις αρχές του 20ου αιώνα

΄Ολα τα προηγηγούμενα
Γενική απογραφή πληθυσμού
Καταγραφή μαθητών σχολείων και βαθμολόγιο
Τήρηση λογιστικών βιβλίων
Εργατικά και επαγγελματικά σωματεία
Βιβλιοθήκες
Εκλογικοί κατάλογοι, αποτελέσματα εκλογών
Λεπτομερής καταγραφή απωλειών πολέμου

7 / 43

Δεδομένα στις αρχές του 21ου αιώνα

΄Ολα τα προηγηγούμενα
Ηλεκτρονικές βάσεις δεδομένων της κυβέρνησης: Ληξιαρχείο,
ασφαλιστικοί φορείς, φοιτητολόγιο, φορολογικές δηλώσεις,
μισθοδοσία Δ/Υ, κ.α.
Τήρηση τραπεζικών συνναλαγών
Πελατολόγιο, παραγγελίες, πωλήσεις, χρηματικές ροές, κ.λπ.
Επικοινωνία, τηλέφωνα, μηνύματα, βιντεοκλήσεις, κ.λπ.
Μετακινήσεις, εισητήρια, διόδια, κ.λπ.
και:

8 / 43
Δεδομένα από ηλεκτρονική δραστηριότητα

9 / 43

Ορολογία

data, database, data management


data structure, structured data, unstructured data
relational database, object oriented database, multimedia
database
data recording, data minimg, data science
row data, statistical data, business data, personal data
data encryption, data transfer, data distribution
data dictionary, data catalog, metadata
OLAP, ERP, DBMS, XML

10 / 43
Στόχος του μαθήματος

1 Το μάθημα έχει στόχο την εξοικείωση με τις βάσεις δεδομένων


και τις εφαρμογές τους στην Οικονομία και τη Διοίκηση.
2 Δεν σχετίζεται 100% με το μάθημα «Ηλεκτρονικοί
Υπολογιστές Ι», και έχει μικρότερη συγγένεια με τα υπόλοιπα
μαθήματα του εξαμήνου από όσο είχε το μάθημα
«Ηλεκτρονικοί Υπολογιστές Ι».
3 Το μάθημα είναι προσαρμοσμένο στις γνώσεις και απαιτήσεις
των φοιτητών τμήματος Οικονομικών Επιστημών: Δεν πηγαίνει
πολύ στα βαθιά, αλλά δεν μένει και στα πολύ ρηχά.
Ιστοσελίδα μαθήματος: http://bit.ly/HY-II
13 / 43

Περιεχόμενο και ύλη του μαθήματος


1 Βάσεις δεδομένων και στατιστικές εφαρμογές.
2 Εισαγωγή στα συστήματα διαχείρισης βάσεων δεδομένων.
3 Μοντέλα δεδομένων με έμφαση στο σχεσιακό. Εισαγωγή στη
σχεσιακή άλγεβρα και σχεσιακό λογισμό.
4 Εννοιολογικά μοντέλα: το μοντέλο οντοτήτων-συσχετίσεων.
5 Θεωρία εξαρτήσεων. Κανονικοποίηση σχήματος (1NF, 2NF,
3NF, BCNF). Σχεδιασμός βάσεων δεδομένων.
6 Αναλυτική παρουσίαση της γλώσσας SQL.
7 Εξαγωγή δεδομένων από βάσεις δεδομένων και στατιστική
ανάλυση. ΄Ελεγχοι υποθέσεων, παλινδρόμηση, κύβοι OLAP.
8 Βάσεις δεδομένων στο διαδίκτυο. Εφαρμογές με MySQL/R.
14 / 43
Βιβλία και ύλη
1 Θα καλύψουμε όλη την ύλη του βιβλίου «Βάσεις δεδομένων και
SQL: Μια πρακτική προσέγγιση».
2 Θα σας δοθούν κάποιες επιπλέον σημειώσεις (γλώσσα R) για
τη στατιστική επεξεργασία δεδομένων.
3 Μπορείτε να χρησιμοποιήσετε οποιοδήποτε άλλο βιβλίο ή
σημειώσεις, δεν υπάρχει καμία απολύτως απαίτηση να
ακολουθείτε τη μία ή την άλλη προσέγγιση.
4 Υπάρχουν δεκάδες βιβλία για να μάθετε (σε επίπεδο χρήστη)
τη γλώσσα SQL, διαβάστε όποιο σας είναι περισσότερο εύκολο
και κατανοητό.
5 Στο μάθημα δε θα ασχοληθούμε με το φυσικό επίπεδο
οργάνωσης βάσεων δεδομένων.
15 / 43

Βιβλία και σημειώσεις


1 Η ύλη των βάσεων δεδομένων καλύπτεται από οποιοδήποτε
βιβλίο επιλέξετε (≈ 400 σελ.)
2 Στη διάρκεια του εξαμήνου σας δοθούν επιπλέον σημειώσεις
(≈ 100 σελ.)
3 Θα δοθεί επιπλέον βιβλιογραφία (≈ 200 σελ.), η οποία
επικαλύπτει την ύλη του μαθήματος, δεν είναι εντελώς
απαραίτητη να τη διαβάσετε, αλλά μια δεύτερη άποψη θα σας
βοηθήσει πολύ, ιδιαίτερα στην εργασία
4 Θα χρειαστεί επίσης να κρατήσετε καλές σημειώσεις από το
μάθημα, το εργαστήριο, και την προσωπική σας μελέτη
(≈ 200 − 300 σελ.)
16 / 43
Βάσεις Δεδομένων και SQL: Μια πρακτική
προσέγγιση

19 / 43

Σχεδιασμός Πληροφορριακών Συστημάτων και


Σχεσιακών Βάσεων Δεδομένων

20 / 43
Συστήματα Βάσεων Δεδομένων

21 / 43

Εισαγωγή στις Βάσεις Δεδομένων

22 / 43
Γενική βιβλιογραφία I

Συστήματα βάσεων δεδομένων SQL


Ε. Ι. Γιαννακουδάκης
http://bit.ly/1axf4O2

Σχεσιακές βάσεις δεδομένων : θεωρία και εργαστηριακές


ασκήσεις
Ε. Κεχρής
http://bit.ly/LSDp5D

Συστήματα διαχείρισης βάσεων δεδομένων


Ramakrishnan , Raghu, Gehrke
http://bit.ly/1cXwHFZ

23 / 43

Γενική βιβλιογραφία II

Θεμελιώδεις αρχές συστημάτων βάσεων δεδομένων


R. Elmasri, S.B. Navathe
http://bit.ly/LB1OMl

Βασικές αρχές για τα συστήματα βάσεων δεδομένων


J.D. Ullman, J. Widom
http://bit.ly/1eWNqWs

Συστήματα βάσεων δεδομένων


A. Silberschatz, H. F. Korth, S. Sudarshan
http://bit.ly/1iu43x8

24 / 43
Ταξίδι στις βάσεις δεδομένων, δεδομένα,
μοντέλα, αρχεία, μετατροπές, διαδίκτυο,
λήψη και χειρισμός δεδομένων

Εισαγωγή στις Βάσεις Δεδομένων


Μια περιγραφική ματιά στον κόσμο ως βάση δεδομένων
Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

2 / 57

Εν αρχή

3 / 57
Μορφότυπο αρχείων

Ορισμός
Μορφότυπο (format) είναι ο προτυποποιημένος τρόπος
κωδικοποίησης δεδομένων (bits) που αποθηκεύονται σε ψηφιακά
μέσα.

Παραδείγματα
Δεδομένα λογιστικών φύλλων, .xls, .ods
Ιστοσελίδες, .htm, .html
Μουσική, .mp3, .flac
Αρχεία κειμένου δεδομένων, .csv, .tsv, .txt
Ταινίες ή βίντεο .avi, .mp4

4 / 57

Αρχεία κειμένου και δυαδικά αρχεία

Αρχεία κειμένου, text file


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

Παραδείγματα
http:
//research.stlouisfed.org/fred2/data/DEXUSEU.txt
Αρχεία ρυθμίσεων σε κάθε υπολογιστή

5 / 57
Αρχεία κειμένου και δυαδικά αρχεία

Δυαδικά αρχεία, binary file


Αρχεία που δεν είναι αρχεία κειμένου. Μπορεί να περιέχουν
οποιαδήποτε επιπλέον πληροφορία ή χαρακτήρες.

Παραδείγματα
Προγράμματα Η/Υ, πχ το πρόγραμμα acroread ή okular με
το οποίο πιθανά βλέπετε αυτό το αρχείο παρουσίασης.
΄Ενα αρχείο μουσικής ή βίντεο στον Η/Υ σας.
Αρχεία του MS Office.
Συμπιεσμένα αρχεία, όπως .zip, .gz, .rar

6 / 57

Αρχεία κειμένου και δυαδικά αρχεία

Ομοιότητες και διαφορές


Τα αρχεία κειμένου μπορούν να διαβαστούν από άνθρωπο
και Η/Υ.
Τα δυαδικά αρχεία δεν διαβάζονται από άνθρωπο, χωρίς
τη μεσολάβηση κάποιου προγράμματος Η/Υ.
Τα δυαδικά αρχεία καταλαμβάνουν μεγαλύτερο χώρο.
Ο χειρισμός δυαδικών αρχείων εξαρτάται από το
λειτουργικό σύστημα και πιθανά τις εκδόσεις των
προγραμμάτων.
Είναι δυνατή η μετατροπή από των ένα τύπο στον άλλο.
Αρχείο κειμένου:
Δυαδικό αρχείο:
7 / 57
Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

8 / 57

Αρχεία .csv

Ορισμός
Αρχεία κειμένου με λίστες τιμών που χωρίζονται με κόμματα, ή
κάποιο άλλο χαρακτήρα.

Παράδειγμα
Country , C a p i t a l , Popul
Fr anc e , P a r i s , 9 . 1
Gr ee c e , Athens , 3 . 7
I t a l y , Rome , 2 . 6
Bulgaria , Sofia ,1.2

Επισύναψη:
9 / 57
΄Ανοιγμα και επεξεργασία αρχείων .csv

Excel ή Calc
Δυνατότητα για :
΄Ανοιγμα και προβολή δεδομένων αρχείων csv.
Επεξεργασία δεδομένων αρχείων csv.
Εξαγωγή δεδομένων σε μορφή csv.

R
Δυνατότητα για :
΄Ανοιγμα και προβολή δεδομένων αρχείων csv.
Επεξεργασία δεδομένων αρχείων csv.
Εξαγωγή δεδομένων σε μορφή csv.

10 / 57

Μορφότυποι δεδομένων από τη eurostat

11 / 57
Δρομολόγια Αστικών Συγκοινωνιών της Αθήνας

http://data.gov.gr/dataset/28

12 / 57

Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

14 / 57
Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

15 / 57

Ηλεκτρονική καταγραφή φίλων

Το πρόβλημα
Ζητείται ένα ηλεκτρονικό αρχείο καταγραφής των επαφών/φίλων
μας, με στοιχεία όπως όνομα, τηλέφωνο, γενέθλια κ.λπ.

Εικόνα από: http://www.iconmonsters.com/icon-packs/


16 / 57
people/urban-ppl-xp-icons
Προσέγγιση με κειμενογράφο

Επισύναψη:

17 / 57

Πολλά προβλήματα
Είναι πολύ εύκολο να γίνει λάθος και να εισαχθεί δεύτερη φορά
το ίδιο πρόσωπο.
Είναι πολύ δύσκολο, ή ακόμα και αδύνατο, να δοθούν
απαντήσεις σε ερωτήματα όπως «πόσες μέρες μένουν για τα
γενέθλια του Νίκου», ή πόσους αριθμούς τηλεφώνου έχουμε
καταχωρίσει για το Στέφανο».
Αν το αρχείο γίνει μεγάλο, τότε γίνεται δύσκολη η αναζήτηση
πληροφοριών, ακόμα και απλών πληροφοριών όπως «σε ποια
πόλη μένει η Αλέκα».

18 / 57
Προσέγγιση με λογιστικό φύλλο

Επισύναψη:
19 / 57

Επιθυμητές ιδιότητες μιας ηλεκτρονικής καταγραφής


1 Εύκολη εισαγωγή μιας νέας καταχώρισης.
2 Εύκολη διαγραφή μιας νέας καταχώρισης.
3 Εύκολη ανάσυρση δεδομένων και πληροφοριών.
4 Αποφυγή καταγραφής διπλότυπων δεδομένων.
5 Ευκολία χειρισμού των διαδικασιών από τον
χρήστη.
6 Δυνατότητα ανάκαμψης από εσφαλμένη
λειτουργία.

20 / 57
Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

21 / 57

Χαρτί και μολύβι...


1 Τι είδους δεδομένα θέλουμε στη διάθεσή μας;
2 Ποιους αφορούν τα δεδομένα;
3 Και άλλα πολλά . . .

22 / 57
Παράδειγμα ανάλυσης απαιτήσεων

Κάθε φίλος μας έχει:


1 ΄Ονομα
2 Διεύθυνση
3 Τηλέφωνο
4 Γενέθλια

23 / 57

Μερική απόκρυψη της πραγματικότητας

Κάθε αναπαράσταση σε μια βάση δεδομένων κρύβει


πολλά:
1 Το όνομα της μητέρας
2 Το νούμερο παπούτσι
3 Το όνειρο της χθεσινής νύχτας
4 Ποια πίτσα προτιμάει
5 Και άλλα πολλά . . .

24 / 57
Ποιος είναι φίλος

Ορισμός
Φίλος είναι «κάτι» που έχει όνομα, διεύθυνση, τηλέφωνο και
γενέθλια.

Παράδειγμα
Νίκος Αλεξίου, Λάρισα, 2410990291, 5/Φεβ.

Αφαίρεση
1 Οι βάσεις δεδομένων περιέχουν δεδομένα που προέρχονται
από αφαίρεση της πραγματικότητας.
2 Η διαδικασία με την οποία γίνεται η αφαίρεση λέγεται
μοντελοποίηση δεδομένων.
25 / 57

Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

31 / 57
Τα πολλά λόγια είναι φτώχεια
΄Ονομα Διεύθυνση

Φίλος

Τηλέφωνο Γενέθλια

1 Μια οντότητα, ο Φίλος, με 4 ιδιότητες.


2 Δεν είναι δυνατό και οι 4 ιδιότητες να έχουν τις ίδιες τιμές.
3 Περιγράφουμε τις έννοιες της βάσης δεδομένων με γεωμετρικά
σχήματα:
Ορθογώνιο: οντότητα της βάσης δεδομένων
΄Ελλειψη: ιδιότητα της οντότητας
32 / 57

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


1 ΄Ενα πρόγραμμα ή σύστημα βάσεων δεδομένων δεν παρέχει
κάποιο «έτοιμο» πλαίσιο εισαγωγής δεδομένων, πχ όπως το
Excel/Calc.
2 Θα πρέπει να ορίσουμε από την αρχή το τι και το πως θα
εισαχθεί.
3 Για το προηγούμενο παράδειγμα χρειάζεται ένας πίνακας με 4
πεδία.
4 Τα δεδομένα αποθηκεύονται είτε σαν κείμενο, είτε σαν
αριθμός.
5 Μεγάλη ποικιλία, αλλά και αυστηρότητα, στον τύπο
δεδομένων.

33 / 57
Ορισμός δεδομένων
1 CREATE TABLE friends
2 (
3 name VARCHAR(50),
4 address VARCHAR(50),
5 phone VARCHAR(50),
6 birthdate VARCHAR(50)
7 );

1 Δημιουργία ενός πίνακα με όνομα friends.


2 Ο πίνακας friends αποτελείται από 4 πεδία με ονόματα
name, address, phone, birthdate.
3 Σε κάθε πεδίο μπορεί να εισαχθεί τιμή με μέγιστο μήκος 50
χαρακτήρες.
34 / 57

Ορισμός δεδομένων σε γραφικό περιβάλλον

35 / 57
Ορισμός δεδομένων σε γραφικό περιβάλλον

36 / 57

Χειρισμός δεδομένων σε γραφικό περιβάλλον

37 / 57
Πρωτεύον κλειδί
1 CREATE TABLE friends
2 (
3 id INTEGER NOT NULL,
4 name VARCHAR(50),
5 address VARCHAR(50),
6 phone VARCHAR(50),
7 birthdate VARCHAR(50),
8 PRIMARY KEY (id)
9 );

΄Ενας μοναδικός κωδικός προσδιορίζει κάθε εγγραφή του πίνακα.

38 / 57

Τύποι δεδομένων, προσοχή!


1 Ο τύπος δεδομένων «κείμενο» δεν είναι πάντοτε επαρκής.
2 Σε περιπτώσεις όπου απαιτούνται αλγεβρικές πράξεις,
προτιμούμε αριθμητικούς τύπους δεδομένων.
3 Προσοχή! Τα παρακάτω δεν είναι αριθμοί:
Αριθμός διαβατηρίου
Αριθμός φορολογικού μητρώου
Αριθμός τηλεφώνου
Αριθμός κυκλοφορίας αυτοκινήτου
Αριθμός τραπεζικού λογαριασμού.
4 Υπάρχουν ειδικοί τύποι δεδομένων για το χειρισμό
χρονολογικών δεδομένων, αποθηκεύονται ως αριθμοί,
παρουσιάζονται ως κείμενο.
5 Πολλοί άλλοι τύποι δεδομένων για ειδικές περιπτώσεις.
39 / 57
Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

41 / 57

Βάσεις δεδομένων και διαδίκτυο

42 / 57
Πηγές οικονομικών δεδομένων
1 The Word Bank http://data.worldbank.org
2 Federal Reserve Economic Data
http://research.stlouisfed.org/fred2
3 Eurostat http://ec.europa.eu/eurostat
4 Data Market http://datamarket.com
5 Fao Stat http://faostat.fao.org
6 Index Mundi http://www.indexmundi.com
7 Ελληνικά Δημόσια Δεδομένα
http://data.gov.gr
43 / 57

Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

44 / 57
Μαθητές ανά δάσκαλο σε δημοτικά σχολεία
Μαθητές ανά δάσκαλο

30
20
5 10
0

1970 1980 1990 2000 2010

Έτος

45 / 57

Μαθητές ανά δάσκαλο σε δημοτικά σχολεία

http://data.worldbank.org/indicator/SE.PRM.ENRL.TC.ZS

46 / 57
R, WDI library

1 library(WDI)
2 DF <- WDI(country=c("GR"),
3 indicator="SE.PRM.ENRL.TC.ZS", start=1970)
4 ppt <- ts(rev(DF$SE), start=1970)
5 cairo_pdf("PupilsPerTeacher.pdf", width=6, height=4)
6 plot(ppt, lwd=2, col=2, ylim=c(0,35), main="",
7 xlab="΄Ετος", ylab="Μαθητές ανά δάσκαλο")
8 dev.off()
Επισύναψη:

47 / 57

Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

48 / 57
Ευρωπαϊκή Στατιστική Υπηρεσία

http://ec.europa.eu/eurostat

49 / 57

Μεταβολή ΑκΕγχΠρ 2012

http://ec.europa.eu/eurostat
50 / 57
Σύγκριση Ελλάδας / Πολωνίας
6
4
% GDP change
2
0
−2

Greece
−6

Poland

2002 2004 2006 2008 2010 2012


Time
51 / 57

Σύγκριση Ελλάδας / Πολωνίας


1 library(SmarterPoland)
2 DF <- getEurostatRCV(kod = "tec00115")
3 gr <- subset(DF, geo=="EL")
4 pl <- subset(DF, geo=="PL")
5 grGrowth <- ts(gr$value, start=2002)
6 plGrowth <- ts(pl$value, start=2002)
7

8 plot(grGrowth, type="n", ylim=c(-7, 7), main="",


9 ylab="% GDP change")
10 grid()
11 lines(grGrowth, lwd=3, col=4)
12 lines(plGrowth, lwd=3, col=2)
13 legend(’bottomleft’, c("Greece", "Poland"), lwd=3, col=c(4,2))
Επισύναψη:
52 / 57
Επισκόπηση

1 Γενικές πληροφορίες για τα αρχεία και τους μορφότυπους


2 Αρχεία .csv ή comma separated values
3 Μια προσωπική βάση δεδομένων για τους φίλους μας
Γενική περιγραφή
Μοντελοποίηση και ανάλυση απαιτήσεων
Μετά τους Beatles και τον Καζαντζίδη
4 Διαδικτυακές βάσεις δεδομένων
Παγκόσμια Τράπεζα
Ευρωπαϊκή Στατιστική Υπηρεσία
Ελληνικά Ανοιχτά Δεδομένα

53 / 57

Δημόσια Δεδομένα της Ελληνικής Κυβέρνησης

http://data.gov.gr
54 / 57
Πόσοι είναι οι δημόσιοι υπάλληλοι;

http://apografi.gov.gr/
http://data.gov.gr/dataset/33

55 / 57

Πόσες κλίνες ξενοδοχείων ανά περιφέρεια;

Φωτογραφία από: http://vacationingreece1.blogspot.gr

Πόσους τουρίστες μπορεί να φιλοξενήσει η Ελλάδα σε μία μέρα;


Ποια είναι η χωρικότητα των ξενοδοχείων ανά περιφέρεια;
http://data.gov.gr/dataset/11

56 / 57
Το σχεσιακό μοντέλο δεδομένων και οι
σχεσιακές βάσεις δεδομένων

Επισκόπηση
1 Οι 12 κανόνες του Codd
2 Κεντρικές έννοιες του σχεσιακού μοντέλου
Ορισμοί για τις σχέσεις
Οι 4 βασικές ιδιότητες των σχέσεων
Τα είδη των σχέσεων
3 Ελλιπείς τιμές, Null
Ιστορία και σημασία των τιμών Null
Παραδείγματα Null τιμών
Πλεονεκτήματα και μειονεκτήματα των Null τιμών
4 Κλειδιά σχέσεων, υπερκλειδί, υποψήφιο κλειδί, πρωτεύον κλειδί,
ξένο κλειδί

2 / 71
Edgar F. Codd
΄Αγγλος επιστήμονας, 1923 – 2003.
Θεμελιωτής του σχεσιακού μοντέλου
βάσεων δεδομένων.
Πιλότος στο 2ο παγκόσμιο πόλεμο.
Εργάστηκε πολλά χρόνια για την IBM.
Περισσότερο γνωστός για την εργασία
του ”A Relational Model of Data for
Large Shared Data Banks”.a
Βραβείο Turing το 1981.
a
http://dl.acm.org/citation.cfm?doid=362384.362685

3 / 71

Κανόνας #1
The information Rule
All information in a relational database (including table and
column names) is represented in only one way, namely as a
value in a table.

The information rule


΄Ολα τα δεδομένα και οι πληροφορίες της βάσης
αναπαριστώνται στο λογικό επίπεδο της βάσης δεδομένων
μέσα σε πίνακες.

4 / 71
Κανόνας #2
The guaranteed access rule
All data must be accessible. This rule is essentially a restate-
ment of the fundamental requirement for primary keys. It says
that every individual scalar value in the database must be log-
ically addressable by specifying the name of the containing
table, the name of the containing column and the primary key
value of the containing row.

The guaranteed access rule


Με βάση το λογικό επίπεδο της βάσης, όλα τα δεδομένα
μπορούν να προσπελαστούν με βάση τον πίνακα στον οποίο
έχουν καταχωρηθεί, με την τιμή του πρωτεύοντος κλειδιού, και
το όνομα της στήλης του πίνακα.
5 / 71

Κανόνας #3
Systematic treatment of null values:
The DBMS must allow each field to remain null (or empty).
Specifically, it must support a representation of ”missing infor-
mation and inapplicable information” that is systematic, dis-
tinct from all regular values (for example, ”distinct from zero
or any other number”, in the case of numeric values), and
independent of data type. It is also implied that such repre-
sentations must be manipulated by the DBMS in a systematic
way.

Οι τιμές NULL πρέπει να χρησιμοποιούνται ως ελλιπής


πληροφορία, όχι ως μηδενικές αριθμητικές τιμές, κενά
αλφαριθμητικά ή ο κενός χαρακτήρας (space).
6 / 71
Επισκόπηση
1 Οι 12 κανόνες του Codd
2 Κεντρικές έννοιες του σχεσιακού μοντέλου
Ορισμοί για τις σχέσεις
Οι 4 βασικές ιδιότητες των σχέσεων
Τα είδη των σχέσεων
3 Ελλιπείς τιμές, Null
Ιστορία και σημασία των τιμών Null
Παραδείγματα Null τιμών
Πλεονεκτήματα και μειονεκτήματα των Null τιμών
4 Κλειδιά σχέσεων, υπερκλειδί, υποψήφιο κλειδί, πρωτεύον κλειδί,
ξένο κλειδί

8 / 71

Τι είναι σχέση;
Κωδικός ΄Ονομα Εξάμηνο
504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3
604 Πληροφοριακά Συστήματα Διοίκησης 6

Η πιο απλή πρακτική αναπαράσταση μιας σχέσης, είναι ένας


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

9 / 71
Αντιστοιχία πίνακα με σχέση
Η αντιστοιχία είναι άτυπη, μια σχέση δεν είναι ακριβώς
ένας πίνακας.
Η σχέση έχει μια επικεφαλίδα, την πρώτη γραμμή του
πίνακα, που συνιστά το σχήμα της σχέσης.
Το σχήμα της σχέσης είναι ένα σύνολο από γνωρίσματα,
πχ {Κωδικός, ΄Ονομα, Εξάμηνο}.
Το σύνολο {504, Βάσεις Δεδομένων, 5} είναι μια πλειάδα
(ή συστοιχία) της σχέσης Μαθήματα.
Μια σχέση έχει ακριβώς ένα καθορισμένο σχήμα, έχει
όμως, ενδεχομένως, πολλές πλειάδες.
Οι τιμές κάθε γνωρίσματος προέρχονται από το κάποιο
πεδίο ορισμού.

10 / 71

Διευκρινίσεις για τις σχέσεις


Μια σχεσιακή βάση δεδομένων καταγράφει δεδομένα μέσα
σε σχέσεις, και μόνο σε αυτές.
Μια πραγματικότητα, όπως είναι ένα μάθημα ενός
προγράμματος σπουδών, γίνεται αντιληπτή στη βάση
δεδομένων, ως ένα σύνολο τιμών που αντιστοιχούν στα
γνωρίσματα μιας σχέσης.
Η σχέση είναι ένα σύνολο από γνωρίσματα, το καθένα με
διαφορετικό όνομα, και κάποιο πεδίο ορισμού.
Η πλειάδα είναι ένα σύνολο από τιμές που προέρχονται
από το πεδίο τιμών του κάθε γνωρίσματος.
Μια σχέση έχει ένα καθορισμένο σύνολο γνωρισμάτων, το
οποίο γενικά μένει σταθερό ως προς το χρόνο χρήσης της
βάσης δεδομένων.
Το σύνολο αυτό λέγεται επικεφαλίδα της σχέσης, ή
σχήμα της σχέσης. 11 / 71
Ενημέρωση σχέσεων
Με τον όρο ενημέρωση της βάσης δεδομένων, εννοείται η
ενημέρωση μιας (ή και περισσότερων) σχέσης (ή σχέσεων)
της βάσης δεδομένων.
Η ενημέρωση μιας σχέσης γίνεται με την έννοια της
πλειάδας, ενός συνόλου τιμών που αντιστοιχούν στα
γνωρίσματα της σχέσης.
΄Οταν για παράδειγμα το όνομα του μαθήματος
‘Προγραμματισμός Υπολογιστών Ι’ αλλάξει σε ‘Εισαγωγή
στον Προγραμματισμό’, με όρους του σχεσιακού μοντέλου,
αυτό που τροποποιήθηκε είναι η πλειάδα με κωδικό 303·
άλλαξε δηλαδή τιμές κάποιο σύνολο και η μεταβολή μιας
τιμής μεταβάλει όλο το σύνολο τιμών, η ενημέρωση των
σχέσεων γίνεται κατά πλειάδες.

12 / 71

Σχήμα σχέσης

Σχήμα σχέσης
Σχήμα μιας σχέσης είναι το σύνολο των γνωρισμάτων της.
R(A1 , A2 , . . . , An )

Κωδικός ΄Ονομα Εξάμηνο


504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3
604 Πληροφοριακά Συστήματα Διοίκησης 6

Το σύνολο {Κωδικός, ΄Ονομα, Εξάμηνο} είναι το σχήμα της


σχέσης Μαθήματα.
Μαθήματα(Κωδικός, ΄Ονομα, Εξάμηνο)
13 / 71
Στιγμιότυπο σχέσης

Στιγμιότυπο σχέσης
Στιγμιότυπο σχέσης που συμβολίζεται με t[R] είναι το σύνολο
όλων των πλειάδων μιας σχέσης μια συγκεκριμένη χρονική στιγμή.
Κωδικός ΄Ονομα Εξάμηνο
504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3
604 Πληροφοριακά Συστήματα Διοίκησης 6

14 / 71

Γνώρισμα σχέσης

Γνώρισμα
Γνώρισμα της σχέσης (πεδίο ή στήλη ενός πίνακα) είναι μια
ιδιότητα της σχέσης και έχει ένα μοναδικό όνομα μέσα στη σχέση.
Κωδικός ΄Ονομα Εξάμηνο
504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3
604 Πληροφοριακά Συστήματα Διοίκησης 6

Παράδειγμα
Ο Κωδικός, το ΄Ονομα και το Εξάμηνο του μαθήματος είναι
γνωρίσματα της σχέσης.
15 / 71
Πεδίο ορισμού γνωρίσματος σχέσης

Πεδίο ορισμού
Πεδίο ορισμού dom(Ai ) ενός γνωρίσματος (Ai ) είναι όλες οι
επιτρεπτές τιμές του γνωρίσματος Ai .
Κωδικός ΄Ονομα Εξάμηνο
504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3
604 Πληροφοριακά Συστήματα Διοίκησης 6

Παράδειγμα
Πεδίο ορισμού του γνωρίσματος Εξάμηνο είναι το σύνολο των
ακεραίων αριθμών {1, 2, 3, 4, 5, 6, 7, 8}.
16 / 71

Συστοιχία ή πλειάδα

Συστοιχία ή πλειάδα
Συστοιχία ή πλειάδα είναι μια διατεταγμένη λίστα από τιμές
t = < v1 , v2 , . . . , vn >, που κάθε μία ανήκει στο πεδίο ορισμού
dom(Ai ) του αντίστοιχου γνωρίσματος Ai .

Κωδικός ΄Ονομα Εξάμηνο


504 Βάσεις Δεδομένων 5

Η διατεταγμένη λίστα τιμών

t = < 504, Βάσεις Δεδομένων, 5 >

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


17 / 71
Ορισμός σχέσης

Σχέση
Είναι ο συνδυασμός του σχήματος R και του στιγμιότυπου r
της σχέσης.
Γράφουμε r (R) και διαβάζουμε

Σχέση
Γράφουμε r (R) και διαβάζουμε:
Μια σχέση r πάνω στο σχήμα R.
Στιγμυότυπο r του (σχεσιακού) σχήματος R.

18 / 71

Βαθμός σχέσης

Βαθμός σχέσης
Βαθμός μιας σχέσης r (R) είναι το πλήθος των γνωρισμάτων
της σχέσης.

Μία σχέση με βαθμό 3


Κωδικός ΄Ονομα Εξάμηνο
504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3
604 Πληροφοριακά Συστήματα Διοίκησης 6

19 / 71
Πληθικότητα σχέσης

Πληθικότητα σχέσης
Πληθικότητα μιας σχέσης r (R) είναι το πλήθος των πλειάδων
της σχέσης.

Μία σχέση με πληθικότητα 4


Κωδικός ΄Ονομα Εξάμηνο
504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3
604 Πληροφοριακά Συστήματα Διοίκησης 6

20 / 71

Σχήμα της βάσης

Σχήμα της βάσης δεδομένων


Είναι το σύνολο των σχέσεων που αποτελούν τη βάση
δεδομένων.

Παράδειγμα
Μαθήματα(Κωδικός, ΄Ονομα, Εξάμηνο)

Αίθουσες(Κωδικός, ΄Ονομα, Χωρητικότητα)

Πρόγραμμα(ΚωδΜαθ, ΚωδΑιθ, Ημέρα, ΄Ωρα)

21 / 71
Ιδιότητες των σχέσεων

1 Μοναδικότητα πλειάδων. Σε μια σχέση, όλες οι


πλειάδες (συστοιχίες) είναι μοναδικές. Δεν υπάρχουν
επαναλαμβανόμενες πλειάδες.
2 Διάταξη πλειάδων. Δεν υπάρχει συγκεκριμένη διάταξη
(ταξινόμηση) των πλειάδων σε μια σχέση.
3 Διάταξη γνωρισμάτων. Δεν υπάρχει επίσης, διάταξη
των γνωρισμάτων μιας σχέσης. Τα γνωρίσματα δεν είναι
διατεταγμένα πχ, από τα αριστερά προς τα δεξιά.
4 Ατομικότητα. Κάθε γνώρισμα έχει μια μόνο τιμή σε μια
συγκεκριμένη πλειάδα.

22 / 71

Μοναδικότητα

ΑΦΜ Επώνυμο Επάγγελμα Διεύθυνση


504341 Αρτέμης Μηχανικός Δημοκρατίας 22
423404 Μακροπούλου Εκπαιδευτικός Δημοκρατίας 22
348753 Σταυρίδης Δημοσιογράφος Δημοκρατίας 22
356712 Παυλίδη Δημοσιογράφος Δημοκρατίας 22
967424 Μακροπούλου Εκπαιδευτικός Δημοκρατίας 22

23 / 71
Μοναδικότητα πλειάδων
Με τον όρο μοναδικότητα υπονοείται πως ένα σύνολο
τιμών (μια πλειάδα) δεν μπορεί να επαναληφθεί μέσα σε
μια σχέση.
Πιθανά να επαναληφθεί ένα υποσύνολο τιμών για κάποια
γνωρίσματα, όχι όμως το σύνολο των τιμών.
Η ιδιότητα της μοναδικότητας εξασφαλίζει την ύπαρξη του
πρωτεύοντος κλειδιού.
Τις περισσότερες φορές βέβαια, ένα υποσύνολο των
γνωρισμάτων της σχέσης είναι αρκετό να ορίσει το
πρωτεύον κλειδί.
Τέτοιο για παράδειγμα, μπορεί να είναι ο αριθμός
κυκλοφορίας ενός αυτοκινήτου, το όνομα χρήστη μιας
υπηρεσίας ηλεκτρονικού ταχυδρομείου, ή το ΑΦΜ ενός
φορολογούμενου.
24 / 71

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

Επώνυμο Ποσό Επώνυμο Ποσό


Δημητριάδης 130.50 Λιάκος 390.10
Θεοδώρου 184.00 Θεοδώρου 184.00
Λιάκος 390.10 Δημητριάδης 130.50
Μαρινάκη 45.90 Τάλλος 129.30
Τάλλος 129.30 Μαρινάκη 45.90
(αʹ) Αύξουσα ταξινόμηση ως (βʹ) Φθίνουσα ταξινόμηση ως
προς το επώνυμο προς το ποσό

25 / 71
Διάταξη πλειάδων
Το θέμα της διάταξης των πλειάδων ανάγεται στην ισότητα
των συνόλων, τα οποία δεν είναι διατεταγμένα.
Δεν έχει νόημα να μιλάμε για την πρώτη ή την έβδομη
πλειάδα μιας σχέσης, όπως ακριβώς δεν έχει νόημα να μιλάμε
για το πρώτο ή έβδομο στοιχείο ενός μη διατεταγμένου
μαθηματικού συνόλου.
Κάθε πλειάδα μιας σχέσης μπορεί να ταυτοποιηθεί με βάση
την τιμή του κλειδιού της, και όχι με βάση τη θέση της σε ένα
σύνολο.
Πχ ενδιαφέρει ο πελάτης με ΑΦΜ 004329439 και όχι ο πελάτης
στην πέμπτη γραμμή του πίνακα πελατών.
Μια πλειάδα προσδιορίζεται με βάση την τιμή κάποιου
γνωρίσματος (για παράδειγμα την τιμή του πρωτεύοντος
κλειδιού).
26 / 71

Διάταξη γνωρισμάτων

΄Οπως και οι πλειάδες, έτσι και τα γνωρίσματα μιας σχέσης, δεν


έχουν διάταξη. Δεν έχει σημασία πιο είναι πρώτο, δεύτερο κτλ.
Κωδικός Εξάμηνο ΄Ονομα
504 5 Βάσεις Δεδομένων
404 4 Μακροοικονομική Θεωρία ΙΙ
303 3 Προγραμματισμός Υπολογιστών Ι
604 6 Πληροφοριακά Συστήματα Διοίκησης
Δείτε, για παράδειγμα, το παραπάνω σχήμα, που απεικονίζει τη
σχέση μάθημα με διαφορετική σειρά εμφάνισης των γνωρισμάτων
της. Αν τα δύο σχήματα ειδωθούν ως σχέσεις, τότε απεικονίζουν
δύο πανομοιότυπες σχέσεις, δεν υπάρχει καμία διαφορά!

27 / 71
Ατομικότητα και 1η κανονική μορφή
Ο όρος ατομικότητα των τιμών αναφέρεται στη μη διάσπασή τους
σε απλούστερες τιμές. Αναφέρεται επίσης στο γεγονός πως κάθε
πλειάδα μιας σχέσης έχει μόνο μία τιμή σε κάθε γνώρισμα.

Πελάτης Παραγγελία Πελάτης Παραγγελία


109 5018 109 5018
163 4012, 5901 163 4012
180 4291, 3103 163 5901
180 4291
180 3103
(αʹ) Μη κανονικοποιημένη σχέση (βʹ) Κανονικοποιημένη σχέση

28 / 71

Ατομικότητα – συνέχεια
Φανέλα ΄Ονομα Επώνυμο
3 Μάριος Αλεξίου
4 Δημήτρης-΄Αγγελος Σταθόπουλος
11 Βασίλης Μαργαρίτης
7 Αλέξανδρος Παπαβασιλείου
19 Βασίλης Βλάχος
Είναι η σχέση σε πρώτη κανονική μορφή; Είναι δηλαδή όλες οι τιμές
όλων των γνωρισμάτων ατομικές; Προσοχή στην παρανόηση: ο
παίχτης με τη φανέλα 4 έχει δύο ονόματα, η τιμή του γνωρίσματος
΄Ονομα είναι πολλαπλή, επομένως παραβιάζεται ο κανόνας της
ατομικότητας και η σχέση Παίχτης δεν είναι στην πρώτη κανονική
μορφή. Ωστόσο, αυτή η άποψη, είναι λανθασμένη. Το όνομα του
παίχτη με τη φανέλα 4 είναι ατομικό από τη σκοπιά του σχεσιακού
μοντέλου, επειδή αναφέρεται σε ένα παίχτη.
29 / 71
Είδη σχέσεων: Επώνυμες σχέσεις

Επώνυμες σχέσεις
Επώνυμες σχέσεις είναι αυτές που έχουν οριστεί από το
Σχεσιακό Σύστημα Διαχείρισης Βάσεων Δεδομένων και
έχουν κάποιο μοναδικό όνομα στη βάση δεδομένων. Για
παράδειγμα, οι πίνακες και όψεις που ορίζονται με τις εντολές της
SQL: CREATE TABLE και CREATE VIEW είναι επώνυμες
σχέσεις. Είναι δουλειά του Σχεσιακού Συστήματος
Διαχείρισης Βάσεων Δεδομένων να ελέγχει την εγκυρότητα
του ορισμού και τη μοναδικότητα του ονόματος. Μια επώνυμη
σχέση, μπορεί στη συνέχεια να κληθεί με το όνομά της

30 / 71

Είδη σχέσεων: Παράστασιμες σχέσεις

Παραστάσιμες σχέσεις
Παραστάσιμες είναι οι σχέσεις που προκύπτουν από σχεσιακές
παραστάσεις επώνυμων σχέσεων. Κάθε επώνυμη σχέση είναι
παραστάσιμη, μια παραστάσιμη σχέση ωστόσο δεν είναι
υποχρεωτικά επώνυμη

31 / 71
Είδη σχέσεων: Παράγωγες σχέσεις

Παράγωγες σχέσεις
Παράγωγες είναι οι επώνυμες σχέσεις που ορίζονται με τη
βοήθεια άλλων επώνυμων σχέσεων. Οι παράγωγες σχέσεις είναι
παραστάσιμες, χωρίς να ισχύει υποχρεωτικά το αντίθετο

32 / 71

Είδη σχέσεων: Βασικές σχέσεις

Βασικές σχέσεις
Βασικές είναι οι επώνυμες σχέσεις που δεν είναι παράγωγες,
δηλαδή ορίζονται αυτόνομα από άλλες σχέσεις. Για παράδειγμα,
οι πίνακες που ορίζονται με την εντολή CREATE TABLE είναι
βασικοί πίνακες (βασικές σχέσεις). Κάθε βάση δεδομένων έχει
τουλάχιστον μία βασική σχέση. Στην πράξη, οι βασικές σχέσεις
είναι οι μόνες που αποθηκεύουν δεδομένα. Επομένως είναι και οι
πιο βασικές

33 / 71
Είδη σχέσεων: ΄Οψεις

΄Οψεις
΄Οψεις (αλλιώς και απόψεις) είναι οι επώνυμες παράγωγες
σχέσεις. Ο ορισμός τους στηρίζεται στην ύπαρξη μιας τουλάχιστον
βασικής σχέσης. Οι όψεις είναι επώνυμες σχέσεις, με την SQL
δημιουργούνται με την εντολή CREATE VIEW. Οι όψεις δεν
αποθηκεύουν δεδομένα, γι΄ αυτό λέγεται και ιδεατοί πίνακες. Μια
όψη μπορεί να οριστεί με βάση κάποια άλλη όψη, ωστόσο, κάπου
στην άκρη του νήματος, πρέπει να υπάρχει μια βασική σχέση.

34 / 71

Είδη σχέσεων: Ενδιάμεσα αποτελέσματα

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

35 / 71
Είδη σχέσεων: Αποτελέσματα ερωτημάτων

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

36 / 71

Η ερμηνεία και το κατηγόρημα μιας σχέσης


Το σχήμα μιας σχέσης έχει ένα νόημα, ή αλλιώς μια ερμηνεία,
που μπορεί να εκληφθεί ως παράσταση αληθείας
Το νόημα κάθε σχέσης μιας βάσης δεδομένων πρέπει να είναι
γνωστό στους χρήστες
Το κατηγόρημα μπορεί να εκτιμηθεί ως TRUE ή FALSE,
ανάλογα με το στιγμιότυπο της σχέσης
Για παράδειγμα, για τη σχέση Υπάλληλος (Κωδικός, ΄Ονομα,
Επώνυμο, Τμήμα, Μισθός, Ημερ.Πρόσληψης) κατηγόρημα είναι
μια πρόταση, όπως: Ο υπάλληλος με κωδικό 243, έχει ΄Ονομα
Δέσποινα, και Επώνυμο Παπαδοπούλου, και εργάζεται στο
Τμήμα με κωδικό 2, και αμείβεται με Μισθό 1609.52 €, και
προσλήφθηκε στις 5/3/1999 και δεν υπάρχει άλλος υπάλληλος
με ακριβώς τον ίδιο κωδικό.
37 / 71
Επισκόπηση
1 Οι 12 κανόνες του Codd
2 Κεντρικές έννοιες του σχεσιακού μοντέλου
Ορισμοί για τις σχέσεις
Οι 4 βασικές ιδιότητες των σχέσεων
Τα είδη των σχέσεων
3 Ελλιπείς τιμές, Null
Ιστορία και σημασία των τιμών Null
Παραδείγματα Null τιμών
Πλεονεκτήματα και μειονεκτήματα των Null τιμών
4 Κλειδιά σχέσεων, υπερκλειδί, υποψήφιο κλειδί, πρωτεύον κλειδί,
ξένο κλειδί

39 / 71

Ελλιπείς τιμές

Παραδείγματα από την καθημερινή ζωή


Σε μερικές περιπτώσεις κάποιες τιμές είναι άγνωστες κάποια
δεδομένη χρονική στιγμή, ή δεν εφαρμόζονται καθόλου για
κάποιες πλειάδες της βάσης δεδομένων:
Τηλέφωνο οικίας: Μη διαθέσιμο
(δεν έχει, δεν το θυμάται, κ.λπ.)
Τόπος γέννησης : ΄Αγνωστος
(παιδί χαμένων προσφύγων)
Ημερομηνία εξέτασης: Δεν έχει ανακοινωθεί ακόμα
(δεν ανακοινώθηκε ακόμη, αλλά θα ανακοινωθεί)
Αριθμός ασφάλισης: Δεν εφαρμόζεται
(μη ασφαλισμένο όχημα)
40 / 71
Αριστοτέλης

Λογικά ή ΄Οργανον
1 Περί Ερμηνείας
2 Κατηγορίαι
3 Αναλυτικά Πρότερα
4 Αναλυτικά ΄Υστερα
5 Τοπικοί και Σοφιστικοί ΄Ελεγχοι

41 / 71

Αληθές και Ψευδές

Μία ερώτηση – Δύο απαντήσεις


α) Αληθές, β) Ψευδές

΄Εξω βρέχει
Αληθές (αν όντως βρέχει)
Ψευδές (αν δεν βρέχει)

Η Αθήνα είναι πρωτεύουσα της Ελλάδος


Αληθές το 2012
Ψευδές το 1830

42 / 71
Αληθές, Ψευδές και ΄Αγνωστο

Μία ερώτηση – Τρεις απαντήσεις


α) Αληθές, β) Ψευδές, γ) ΄Αγνωστο

΄Εξω βρέχει
Αληθές (αν όντως βρέχει)
Ψευδές (αν δεν βρέχει)
΄Αγνωστο (δεν μπορώ να το ελέγξω)

Η Αθήνα είναι πρωτεύουσα της Ελλάδος


Αληθές το 2012
Ψευδές το 1830
Μη εφαρμόσιμο το 1730
43 / 71

Jan Lukasiewicz
1 Λβιβ Γαλικίας 1878 – Δουβλίνο
1956.
2 Πολωνός φιλόσοφος και
μαθηματικός.
3 Πρωτεργάτης της
τριαδικής λογικής.
4 Εφευρέτης της «πολωνικής γραφής».
5 Σημαντικό έργο στα μαθηματικά
και την υπολογιστική επιστήμη.
Εικόνα από: http://en.wikipedia.org/wiki/Jan_Lukasiewicz

44 / 71
Setun
1 Μόσχα 1958.
2 Ο πρώτος Η/Υ τριαδικής λογικής.
3 Μεγάλα πλεονεκτήματα έναντι
Η/Υ δυαδικής λογικής.
4 Το σχέδιο εγκαταλείφθηκε, λόγω μη
συμμόρφωσης των στόχων με την
επικρατούσα ιδεολογία.
5 ΄Αλλος ένας λόγος κατάρρευσης της
Ε.Σ.Σ.Δ.
Εικόνα από: http://en.wikipedia.org/wiki/Ternary_computer

Σχετικό άρθρο: http://dx.doi.org/10.1007/978-3-642-22816-2_10

45 / 71

Τιμή NULL

΄Αγνωστη, μη διαθέσιμη, μη εφαρμόσιμη πληροφορία


Η τιμή NULL αντιπροσωπεύει μια ελλιπή τιμή σε κάποιο
γνώρισμα μιας σχέσης. Ελλιπής τιμή μπορεί να προκύψει από
διάφορες αιτίες:
Η τιμή υπάρχει, αλλά είναι άγνωστη τη στιγμή της
καταγραφής.
Η τιμή μπορεί να μην υπάρχει, για μια συγκεκριμένη
πλειάδα κάποιο γνώρισμα δεν έχει τιμή.
Η τιμή μπορεί να μην έχει νόημα, για μια συγκεκριμένη
πλειάδα κάποιο γνώρισμα δεν εφαρμόζεται.

Πολλά τα προβλήματα
΄Οσο είναι δυνατό, αποφεύγουμε την καταχώριση τιμών NULL. 46 / 71
Τιμή NULL– ΄Αγνωστη τιμή
Κωδικός ΄Ονομα Αυτοκίνητο
1025 Βασίλης Κάππος ΙΧΟ 9239
1026 Μαρίνα Θεοδώρου ΙΥΓ 4561
1027 Νίκη Αλεξιάδου ΙΥΜ 5012
1028 Στέλιος Μακρίδης

Μια εταιρεία καταγράφει τον αριθμό κυκλοφορίας αυτοκινήτου


των υπαλλήλων της έτσι ώστε να εισέρχονται δωρεάν στο χώρο
στάθμευσης.
Ο Στέλιος Μακρίδης είναι σε άδεια, δεν έχει ακόμη ενημερώσει
για το αυτοκίνητό του την εταιρεία.

47 / 71

Τιμή NULL– Μη διαθέσιμη τιμή


Κωδικός ΄Ονομα Εξάμηνο
504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3
951 Ιστορία της Επιστημονικής Σκέψης

Το πρόγραμμα σπουδών προσφέρει ένα νέο μάθημα: «Ιστορία


της Επιστημονικής Σκέψης».
Η επιτροπή προγράμματος σπουδών δεν έχει αποφασίσει ακόμη
σε ποιο εξάμηνο θα ενταχθεί το νέο μάθημα.

48 / 71
Τιμή NULL– Μη διαθέσιμη τιμή
Κωδικός ΄Ονομα Αυτοκίνητο
1025 Βασίλης Κάππος ΙΧΟ 9239
1026 Μαρίνα Θεοδώρου ΙΥΓ 4561
1027 Νίκη Αλεξιάδου ΙΥΜ 5012
1028 Στέλιος Μακρίδης

Μια εταιρεία διαθέτει αυτοκίνητο στους εξωτερικούς συνεργάτες


της.
Ο Στέλιος Μακρίδης μόλις έχει προσληφθεί, δεν του έχει ακόμα
διατεθεί αυτοκίνητο.

49 / 71

Τιμή NULL– Μη εφαρμόσιμη τιμή


Κωδικός ΄Ονομα Εξάμηνο
504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3
951 Ιστορία της Επιστημονικής Σκέψης

Το μάθημα «Ιστορία της Επιστημονικής Σκέψης» με κωδικό 951


δεν προσφέρεται σε κάποιο συγκεκριμένο εξάμηνο σπουδών.
Είναι μάθημα ελεύθερης επιλογής και οι φοιτητές μπορούν να το
παρακολουθήσουν σε οποιοδήποτε στάδιο των σπουδών τους.

50 / 71
Πλεονεκτήματα

Διάσπαση
Χωρίς τη δυνατότητα χρήσης των τιμών NULL θα ήταν
απαραίτητη διάσπαση των σχέσεων της βάσης δεδομένων σε
περισσότερες ειδικές σχέσεις. Κάτι τέτοιο είναι βέβαια δυνατό,
αλλά δυσχεραίνει τη λειτουργικότητα της βάσης δεδομένων.

Δύο πιθανές λύσεις


1 Διάσπαση με βάση το γνώρισμα που πιθανά παίρνει τιμές
NULL.
2 Μεταφορά του γνωρίσματος σε νέα σχέση.

Περισσότερα στο κεφάλαιο της κανονικοποίησης, ακολουθούν


δύο παραδείγματα.
51 / 71

Διάσπαση σε δύο ειδικές σχέσεις


Μία σχέση για μαθήματα με εξάμηνο:
Κωδικός ΄Ονομα Εξάμηνο
504 Βάσεις Δεδομένων 5
404 Μακροοικονομική Θεωρία ΙΙ 4
303 Προγραμματισμός Υπολογιστών Ι 3

Και μία σχέση για μαθήματα χωρίς εξάμηνο:


Κωδικός ΄Ονομα
951 Ιστορία της Επιστημονικής Σκέψης

52 / 71
Μεταφορά γνωρίσματος σε νέα σχέση
Μία σχέση για τα μαθήματα:
Κωδικός ΄Ονομα
504 Βάσεις Δεδομένων
404 Μακροοικονομική Θεωρία ΙΙ
303 Προγραμματισμός Υπολογιστών Ι
951 Ιστορία της Επιστημονικής Σκέψης

Και μία σχέση για το εξάμηνο των μαθημάτων:


Κωδικός Εξάμηνο
504 5
404 4
303 3

53 / 71

Επισκόπηση
1 Οι 12 κανόνες του Codd
2 Κεντρικές έννοιες του σχεσιακού μοντέλου
Ορισμοί για τις σχέσεις
Οι 4 βασικές ιδιότητες των σχέσεων
Τα είδη των σχέσεων
3 Ελλιπείς τιμές, Null
Ιστορία και σημασία των τιμών Null
Παραδείγματα Null τιμών
Πλεονεκτήματα και μειονεκτήματα των Null τιμών
4 Κλειδιά σχέσεων, υπερκλειδί, υποψήφιο κλειδί, πρωτεύον κλειδί,
ξένο κλειδί

55 / 71
Υπερκλειδί

Υπερκλειδί
Υπερκλειδί ενός σχήματος μιας σχέσης R αποτελεί κάθε
υποσύνολο γνωρισμάτων του σχήματος που, για οποιοδήποτε
στιγμιότυπο r της σχέσης R, δεν υπάρχουν δύο πλειάδες με
ίδιες τιμές στα γνωρίσματα αυτά. Δηλαδή ισχύει:
t1 [S] 6= t2 [S]

όπου S είναι υποσύνολο των γνωρισμάτων του σχήματος της


R:
S ⊆R

56 / 71

Κλειδί

Κλειδί
Κλειδί ενός σχήματος μιας σχέσης R είναι ένα υποσύνολο των
γνωρισμάτων της R που είναι υπερκλειδί της R, χωρίς να είναι
δυνατό να αφαιρεθεί ένα γνώρισμα και να παραμείνει
υπερκλειδί. Το κλειδί λέγεται και ελάχιστο υπερκλειδί.

57 / 71
Υποψήφιο κλειδί

Υποψήφιο κλειδί
Υποψήφιο κλειδί είναι κάθε κλειδί της της R. Γενικά, μια
σχέση μπορεί να έχει περισσότερα από ένα κλειδιά.

58 / 71

Πρωτεύον κλειδί

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

Κανόνας ακεραιότητας των οντοτήτων


Το πρωτεύον κλειδί δεν μπορεί να πάρει την τιμή NULL.

59 / 71
Υπογράμμιση και δήλωση πρωτεύοντος κλειδιού

Το πρωτεύον κλειδί μιας σχέσης δηλώνεται συνήθως


με υπογράμμιση των γνωρισμάτων που το συνιστούν:
Μαθήματα (Κωδικός, ΄Ονομα, Εξάμηνο)
Φοιτητές (ΑΜ, ΄Ονομα, Επώνυμο»
Αίθουσες (Κωδικός, ΄Ονομα, Τόπος, Χωρητικότητα)

΄Αλλος τρόπος είναι η τοποθέτηση της δίεσης:


Μαθήματα (Κωδικός#, ΄Ονομα, Εξάμηνο)
Φοιτητές (ΑΜ#, ΄Ονομα, Επώνυμο»
Αίθουσες (Κωδικός, ΄Ονομα, Τόπος, Χωρητικότητα)

60 / 71

Απλό και σύνθετο κλειδί

Το πρωτεύον κλειδί μπορεί να αποτελείται από ένα


μόνο γνώρισμα:
Μαθήματα (Κωδικός, ΄Ονομα, Εξάμηνο)
Φοιτητές (ΑΜ, ΄Ονομα, Επώνυμο»
οπότε λέγεται απλό.

΄Η να αποτελείται από συνδυασμό περισσότερων


γνωρισμάτων:
Διδασκαλία (ΚωδΜαθ, ΚωδΚαθ, ΄Ετος)
Παραγγελίες (ΚωδΠελ, ΚωδΠρο, Ποσότητα)
οπότε λέγεται σύνθετο.
61 / 71
Μοναδικότητα σύνθετου κλειδιού
΄Εστω η σχέση Διδασκαλία με ΚωδΜαθ ΚωδΚαθ ΄Ετος
σύνθετο πρωτεύον κλειδί που
αποτελείται από 3 γνωρίσματα 107 13 2009
για την καταγραφή του 303 11 2009
ιστορικού διδασκαλίας σε ένα 107 19 2010
τμήμα. 303 17 2010
508 17 2010

Μοναδικότητα
Ο συνδυασμός (ΚωδΜαθ, ΚωδΚαθ, ΄Ετος) παίρνει
μοναδικές τιμές.
Τα γνωρίσματα ΚωδΜαθ, ΚωδΚαθ, ΄Ετος μπορεί να
πάρουν διπλότυπα, πχ ο καθηγητής με κωδικό 17.
΄Αλλοι συνδυασμοί μπορεί να πάρουν διπλότυπα, πχ ο
συνδυασμός (17,2010) για τον καθηγητή και το έτος. 62 / 71

Υπερκλειδί
΄Εστω μια σχέση r με σχήμα R = {α, β, γ, δ}. ΄Εστω επίσης τα
γνωρίσματα α και β παίρνουν μοναδικές τιμές και μπορούν να
χρησιμοποιηθούν (το καθένα χωριστά) ως αναγνωριστικό (κλειδί).
Τα υπερκλειδιά της σχέσης r (R):

{α} {β} {α, β}


{α, γ} {α, δ} {α, γ, δ}
{β, γ} {β, δ} {β, γ, δ}
{α, β, γ} {α, β, δ} {α, β, γ, δ}

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


της r , δηλαδή κάθε υποσύνολο του R, που μπορεί να προσδιορίσει
μοναδικά κάθε εγγραφή της r .
63 / 71
Υπερκλειδί – Παράδειγμα
Με την έννοια υπερκλειδί εννοείται κάθε σύνολο γνωρισμάτων
της r , δηλαδή κάθε υποσύνολο του R, που μπορεί να προσδιο-
ρίσει μοναδικά κάθε εγγραφή της r . Παράδειγμα το παρακάτω
σχήμα που δείχνει του υπαλλήλους μιας εταιρείας. Ο πίνακας
έχει δομή αντίστοιχη με τη σχέση r . Τόσο το ΑΦΜ (αριθμός
φορολογικού μητρώου) όσο και το ΑΜΑ (αριθμός μητρώου α-
σφάλισης) μπορούν να χρησιμοποιηθούν ως κλειδιά.

ΑΦΜ ΑΜΚΑ Επώνυμο ΄Ονομα


903410281 4033781 Βασιλειάδης Αριστομένης
345801248 7394873 Νικολάου Βασιλική
673018337 7294091 Δημητριάδης Ιωάννης
648201938 6483842 Βώρος Χαράλαμπος
759120484 0284938 Μακρής Ιωάννης
64 / 71

Ξένο κλειδί

Ξένο κλειδί
Ξένο κλειδί είναι το πρωτεύον κλειδί μιας σχέσης R που
τοποθετείται ως επιπλέον γνώρισμα σε μια σχέση S, έτσι ώστε
οι πλειάδες της των σχέσεων R, S να συσχετίζονται μεταξύ
τους.

Ξένο κλειδί
R(A1 , A2 , A3 ) S(B1 , B2 , A1 )
Το γνώρισμα S.A1 είναι ξένο κλειδί, δεν παίρνει αναγκαστικά
μοναδικές τιμές, δεν είναι πρωτεύον κλειδί της σχέσης S.

65 / 71
Παράδειγμα ξένου κλειδιού, παραγγελίες
ΑρΠαρ Αξία ΚωδΠελ
ΚωδΠελ ΄Ονομα 1 29.10 2
1 Νίκος 2 14.00 1
2 Κατερίνα 3 10.50 2
3 Μαριάνθη 4 19.30 1
4 Ιωάννα 5 25.90 4
(αʹ) Πελάτες 6 17.50 2
(βʹ) Παραγγελίες

66 / 71

Ξένα κλειδιά, αποτελέσματα εξεταστικής


ΚωδΜαθ ΄Ονομα ΑρΜητ ΄Ονομα Επώνυμο
203 Στατιστική II 53 Μαρία Στεργίου
201 Οικονομική II 56 Βασιλική Παυλίδου
207 Ηλεκ.Υπολ. II 57 Ανίτα Καραβία
204 Μαθηματικά II 58 Πέτρος Τσακιρόγλου
(αʹ) Μαθήματα (βʹ) Φοιτητές

ΑρΜητ Βαθμός ΚωδΜαθ Βαθμός


53 9 201 10
56 7 203 6
57 10 204 8
58 7 207 9
(γʹ) ΑποτελΜαθηματικά (δʹ) ΜαρίαΣτεργίου

67 / 71
Αναφορική ακεραιότητα

Κανόνας ακεραιότητας των αναφορών


΄Εστω s.A1 το ξένο κλειδί της σχέσης r που αναφέρεται στο
πρωτεύον κλειδί της σχέσης r .A1 .
1 Κάθε τιμή του ξένου κλειδιού υπάρχει ως τιμή του
πρωτεύοντος κλειδιού στο οποίο αναφέρεται.
Για παράδειγμα:
s.A1 = r .A1
2 Η τιμή του ξένου κλειδιού δεν μπορεί να είναι NULL.

68 / 71

Βέλη στα ξένα κλειδιά


Μαθήματα ( Κωδικός, ΄Ονομα, Εξάμηνο )

Καθηγητές ( Κωδικός, ΄Ονομα, Επώνυμο, E-mail)

Διδασκαλία ( ΚωδΜαθ, ΚωδΚαθ )

Παράδειγμα
Μαθήματα.Κωδικός → Διδασκαλία.ΚωδΜαθ
σημαίνει πως το γνώρισμα ΚωδΜαθ της σχέσης
Διδασκαλία είναι ξένο κλειδί και αναφέρεται στο
γνώρισμα Κωδικός της σχέσης Μαθήματα.
Καθηγητές.Κωδικός → Διδασκαλία.ΚωδΚαθ
σημαίνει πως το γνώρισμα ΚωδΚαθ της σχέσης
Διδασκαλία είναι ξένο κλειδί και αναφέρεται στο
γνώρισμα Κωδικός της σχέσης Καθηγητές. 69 / 71
Γραφική αναπαράσταση σχεσιακού μοντέλου

Το παράδειγμα μιας μικρής σχεσιακής βάσης δεδομένων


για τους υπαλλήλους μιας εταιρίας και τα έργα
στα οποία απασχολούνται.

70 / 71

Σχεσιακή άλγεβρα
Σχεσιακή άλγεβρα
Η σχεσιακή άλγεβρα είναι μια
διαδικαστική (procedural) γλώσσα.
Διαθέτει ένα σύνολο τελεστών για
σχεσιακές πράξεις.
Βασικές πράξεις: Προβολή, Επιλογή, ΄Ενωση,
Διαφορά, Καρτεσιανό Γινόμενο.
Παράγωγες πράξεις: Σύζευξη, Διαίρεση,
Τομή.
Επιπλέον πράξεις: Συνάθροιση,
Μετονομασία, Εισαγωγή, Διαγραφή,
Ενημέρωση.

2 / 88

Κλειστότητα
Η σχεσιακή άλγεβρα και ο σχεσιακός
λογισμός παρέχουν ένα σύνολο από τελεστές
για πράξεις ανάμεσα σε σχέσεις.
Οι πράξεις με σχέσεις παράγουν νέες
σχέσεις.
Το αποτέλεσμα της πράξης έχει καθορισμένο
βαθμό και πληθικότητα.

Κλειστότητα
Το αποτέλεσμα οποιασδήποτε σχεσιακής
πράξης είναι σχέση.

3 / 88
Συμβατότητα τύπου

Ορισμός
Δύο σχέσεις r και s, έχουν συμβατότητα τύπου, αν
και μόνο αν:
΄Εχουν τον ίδιο βαθμό, δηλαδή έχουν το ίδιο πλήθος
γνωρισμάτων.
Τα αντίστοιχα γνωρίσματα έχουν το ίδιο πεδίο
ορισμού.

4 / 88

Συμβατότητα τύπου

Ορισμός
Δύο σχέσεις r και s, έχουν συμβατότητα τύπου, αν
και μόνο αν:
΄Εχουν τον ίδιο βαθμό, δηλαδή έχουν το ίδιο πλήθος
γνωρισμάτων.
Τα αντίστοιχα γνωρίσματα έχουν το ίδιο πεδίο
ορισμού.

Παράδειγμα
A B C A B C

r 1 b 10 s 5 a 20
5 a 30 2 b 10
3 c 20 3 c 20
5 / 88
Παραδείγματα μη συμβατότητας τύπου

Παράδειγμα
A B C A B C A B A B C
r 1 b 10 s 5 a 20 t 5 b u 5 b a
5 a 30 2 b 10 2 b 2 b b
3 c 20 3 c 20 3 c 3 c b

1 Οι σχέσεις r και t δεν έχουν συμβατότητα τύπου.


2 Οι σχέσεις r και u δεν έχουν συμβατότητα τύπου.
3 Οι σχέσεις s και t δεν έχουν συμβατότητα τύπου.
4 Οι σχέσεις s και u δεν έχουν συμβατότητα τύπου.
5 Οι σχέσεις t και u δεν έχουν συμβατότητα τύπου.
6 / 88

Προβολή

Ορισμός της προβολής

r [X ] = {t[X ] | t ∈ r }
Προβολή μιας σχέσης r (R), πάνω στο υποσύνολο γνω-
ρισμάτων της X (X ⊆ R) είναι μια σχέση με σχήμα το
σύνολο X και κορμό εκείνες τις πλειάδες που αντιστοιχο-
ύν σε μοναδικές τιμές για τα γνωρίσματα X .
Η προβολή συμβολίζεται με το ελληνικό γράμμα Π:

ΠA1 ,A2 ,...,Am (r )

7 / 88
Παραδείγματα προβολής
A B C A B B C B A B C
5 a 30 5 a a 30 a 5 a 30
2 b 10 2 b b 10 b 2 b 10
3 c 20 3 c c 20 c 3 c 20
5 b 10 5 b 5 b 10

r ΠA,B (r ) ΠB,C (r ) ΠB (r ) Π(r )

Παρατηρήσεις
Απαλοιφή διπλοεγγραφών.
Π(r ) : Ταυτοτική προβολή.

8 / 88

Επιλογή

Ορισμός της Επιλογής

σφ(r ) = {t ∈ r | t satisfies φ}
Η επιλογή ή αλλιώς και περιορισμός μιας σχέσης r (R),
είναι μια σχέση που έχει το ίδιο σχήμα R με τη σχέση r
και κορμό ένα υποσύνολο του κορμού της r που
ικανοποιεί μια συνθήκη, πχ: X θ Y .
Η επιλογή συμβολίζεται με:

σX θ Y (r )

όπου η συνθήκη περιορισμού είναι μια παράσταση που


μπορεί να αποτιμηθεί σε TRUE, FALSE ή UNK.

9 / 88
Διευκρινίσεις για την επιλογή

Τελεστές, τελεσταίοι, συγκρίσεις, NULL


1 Ο τελεστής θ μπορεί να είναι ένας από
=, 6=, <, ≤, >, ≥.
2 Η τιμή ενός γνωρίσματος μπορεί να συγκριθεί με:
1 Την τιμή ενός άλλου γνωρίσματος
2 Μια κυριολεκτική τιμή
3 Μια αλγεβρική παράσταση
4 Μια σχεσιακή παράσταση (εμφώλευση
ερωτημάτων)
3 Οι παραστάσεις μπορούν επίσης να περιέχουν τους
λογικούς τελεστές AND (∧), OR (∨) και NOT (¬).
4 Το αποτέλεσμα μιας σύγκρισης μπορεί να είναι
TRUE, FALSE ή UNK.
10 / 88

Παραδείγματα επιλογής
΄Εστω η σχέση employees :
empid name salary
101 Αθανασίου Μιχ. 1200
102 Βαφειάδης Νικ. 1150
104 Νικολοπούλου Ναν. 1570
108 Βασιλειάδη Μαρ. 1320

Παραδείγματα:
1
σsalary <1300(employees)
2
σsalary ≥1200∧salary ≤1600(employees)
3
σempid=102(employees)
11 / 88
Υπάλληλοι με μισθό < 1300
empid name salary
101 Αθανασίου Μιχ. 1200
102 Βαφειάδης Νικ. 1150
104 Νικολοπούλου Ναν. 1570
108 Βασιλειάδη Μαρ. 1320

Απάντηση
σsalary <1300 (employees)

empid name salary


101 Αθανασίου Μιχ. 1200
102 Βαφειάδης Νικ. 1150

12 / 88

Υπάλληλοι με μισθό μεταξύ 1200 και 1600


empid name salary
101 Αθανασίου Μιχ. 1200
102 Βαφειάδης Νικ. 1150
104 Νικολοπούλου Ναν. 1570
108 Βασιλειάδη Μαρ. 1320

Απάντηση
σsalary ≥1200∧salary ≤1600 (employees)

empid name salary


101 Αθανασίου Μιχ. 1200
104 Νικολοπούλου Ναν. 1570
108 Βασιλειάδη Μαρ. 1320

13 / 88
Ο υπάλληλος με κωδικό 101
empid name salary
101 Αθανασίου Μιχ. 1200
102 Βαφειάδης Νικ. 1150
104 Νικολοπούλου Ναν. 1570
108 Βασιλειάδη Μαρ. 1320

Απάντηση
σempid=102 (employees)

empid name salary


101 Αθανασίου Μιχ. 1200

14 / 88

Συνδυασμός προβολής και επιλογής

Συνδυασμός σχεσιακών πράξεων


1 Στο αποτέλεσμα μια προβολής μπορεί να
εφαρμοστεί επιλογή.
2 Στο αποτέλεσμα μια επιλογής μπορεί να
εφαρμοστεί προβολή.
3 Στο αποτέλεσμα μια προβολής μπορεί να
εφαρμοστεί νέα προβολή.
4 Στο αποτέλεσμα μια επιλογής μπορεί να
εφαρμοστεί νέα επιλογή.

Κλειστότητα
Το αποτέλεσμα κάθε σχεσιακής πράξης είναι σχέση.

15 / 88
Ο πίνακας employees από τη βάση company
΄Εστω η σχέση employees με σχήμα:

employees(empid, firstname, lastname, depid, salary , hiredate

empid firstname lastname depid salary hiredate


102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02
109 Μαρία Αθανασίου 1 2787.69 2000-01-26
153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15
172 Χρήστος Βλάσσης 3 1101.70 2000-07-04
189 Θεόδωρος Αγγελίνας 6 1908.28 2000-06-19
... ... ... ... ... ...
Δείγμα από τα δεδομένα του πίνακα.
Δείτε τα πλήρη περιεχόμενα εδώ:
http://stavrakoudis.econ.uoi.gr/stavrakoudis/?iid=
400
16 / 88

Ερωτήσεις και απαντήσεις 1–3


1 Να βρεθεί το όνομα και το επώνυμο όλων των
υπαλλήλων:

Πfirstname,lastname (employees)

2 Να βρεθούν οι υπάλληλοι με μισθό μεγαλύτερο του


1500:
σsalary >1500 (employees)
3 Να βρεθεί το όνομα και το επώνυμο όλων των
υπαλλήλων που παίρνουν μισθό μεγαλύτερο από
1500:

Πfirstname,lastname (σsalary >1500 (employees))

17 / 88
Ερωτήσεις και απαντήσεις 4–6
4 Να βρεθούν οι υπάλληλοι (κωδικός, επώνυμο,
τμήμα) που δεν εργάζονται στο τμήμα 2 και έχουν
μισθό μικρότερο από 1200:

Πempid,lastname,depid σ(depid6=2∧salary <1200) (employees)

5 Να βρεθεί το επώνυμο και ο μισθός του υπαλλήλου


με κωδικό 109 μετά την αύξηση 5% στο μισθό του:

Πlastname,salary ∗1.05 (σempid=109 (employees))

6 Να βρεθούν οι κωδικοί των υπαλλήλων που δεν


εργάζονται στα τμήματα 2, 3, 4:

Πempid σ¬(depid=2∨depid=3∨depid=4) (employees)

18 / 88

Η σχεσιακή πράξη της ένωσης

Ορισμός της ένωσης:


r ∪ s = {t | t ∈ r or t ∈ s}
΄Ενωση δύο σχέσεων r (R) και s(S), που έχουν
συμβατότητα τύπου, είναι μια νέα σχέση που
έχει σχήμα (επικεφαλίδα) ίδιο με αυτό της r και
s, και κορμό το σύνολο των κορμών των r και s,
δηλαδή όλες τις πλειάδες που ανήκουν στην r , ή
στην s, η και στις δύο πλειάδες. Η ένωση
συμβολίζεται με r ∪ s ή r UNION s.

19 / 88
Παράδειγμα ένωσης σχέσεων
r s
r = {1, 2}
s = {2, 3}
1 2 3 r ∪ s = {1, 2, 3}

20 / 88

Παράδειγμα ένωσης σχέσεων


r s
r = {1, 2}
s = {2, 3}
1 2 3 r ∪ s = {1, 2, 3}

A B C A B C A B C
1 b 10 5 a 30 1 b 10
5 a 30 2 b 10 5 a 30
3 c 20 3 c 20 3 c 20
2 b 10
r s r ∪s

21 / 88
΄Ενωση και αντιμεταθετική ιδιότητα

Ισχύει η αντιμεταθετική ιδιότητα

r ∪s =s ∪r
Παράδειγμα
A B C A B C
A B C A B C
1 b 10 5 a 30
1 b 10 5 a 30
5 a 30 2 b 10
5 a 30 2 b 10
3 c 20 3 c 20
3 c 20 3 c 20
2 b 10 1 b 10
r s r ∪s s ∪r

22 / 88

΄Ενωση και προσεταιριστική ιδιότητα

Ισχύει η προσεταιριστική ιδιότητα

r ∪ (s ∪ t) = (r ∪ s) ∪ t
Λόγω αυτής της της ιδιότητας, είναι δυνατό να γραφεί
η παρακάτω παράσταση χωρίς παρενθέσεις:

r ∪s ∪t

για να δηλώσει την ένωση τριών ή περισσότερων σχέσεων.

23 / 88
Η σχεσιακή πράξη της διαφοράς

Ορισμός της διαφοράς:


r − s = {t | t ∈ r and t ∈
/ s}
Διαφορά δύο σχέσεων r (R) και s(S), που
έχουν συμβατότητα τύπου, είναι μια νέα σχέση
που έχει σχήμα (επικεφαλίδα) ίδιο με αυτό της r
και s, και κορμό τις πλειάδες που ανήκουν στην
r αλλά όχι στην s. Η διαφορά συμβολίζεται με
r − s ή r MINUS s.

24 / 88

Παράδειγμα διαφοράς δύο σχέσεων


r s
r = {1, 2}
s = {2, 3}
1 2 3 r −s = {1}
s −r = {3}

25 / 88
Παράδειγμα διαφοράς δύο σχέσεων
r s
r = {1, 2}
s = {2, 3}
1 2 3 r −s = {1}
s −r = {3}

A B C A B C A B C A B C
1 b 10 5 a 30 1 b 10 2 b 10
5 a 30 2 b 10
3 c 20 3 c 20
r s r −s s −r

26 / 88

Αντιμεταθετική και προσεταιριστική ιδιότητα


Στη σχεσιακή πράξη της διαφοράς:
Δεν ισχύει η αντιμεταθετική ιδιότητα
r − s 6= s − r

Δεν ισχύει η προσεταιριστική ιδιότητα


r − (s − t) 6= (r − s) − t

Υπενθύμιση
5 − 3 6= 3 − 5
8 − (3 − 2) 6= (8 − 3) − 2

27 / 88
Η σχεσιακή πράξη της τομής

Ορισμός της τομής:


r ∩ s = {t | t ∈ r and t ∈ s}
Τομή δύο σχέσεων r (R) και s(S), που έχουν
συμβατότητα τύπου, είναι μια νέα σχέση που
έχει σχήμα (επικεφαλίδα) ίδιο με αυτό της r και
s, και κορμό τις πλειάδες που ανήκουν στην r
και στην s, δηλαδή τις κοινές πλειάδες. Η τομή
συμβολίζεται με r ∩ s ή r INTERSECT s.

28 / 88

Παράδειγμα τομής δύο σχέσεων


r s
r = {1, 2}
s = {2, 3}
1 2 3 r ∩ s = {2}

29 / 88
Παράδειγμα τομής δύο σχέσεων
r s
r = {1, 2}
s = {2, 3}
1 2 3 r ∩ s = {2}

A B C A B C A B C
1 b 10 5 a 30 5 a 30
5 a 30 2 b 10 3 c 20
3 c 20 3 c 20
r s r ∩s

30 / 88

Τομή και αντιμεταθετική ιδιότητα

Ισχύει η αντιμεταθετική ιδιότητα

r ∩s =s ∩r
Παράδειγμα
A B C A B C A B C A B C
1 b 10 5 a 30 5 a 30 5 a 30
5 a 30 2 b 10 3 c 20 3 c 20
3 c 20 3 c 20
r s r ∩s s ∩r

31 / 88
Τομή και προσεταιριστική ιδιότητα

Ισχύει η προσεταιριστική ιδιότητα

r ∩ (s ∩ t) = (r ∩ s) ∩ t
Λόγω αυτής της της ιδιότητας, είναι δυνατό να γραφεί
η παρακάτω παράσταση χωρίς παρενθέσεις:

r ∩s ∩t

για να δηλώσει την τομή τριών ή περισσότερων σχέσεων.

32 / 88

Η τομή είναι παράγωγη πράξη

Εναλλακτικός ορισμός της τομής

r ∩ s = r − (r − s)
Δηλαδή το αποτέλεσμα της τομής r ∩ s ισούται με το α-
ποτέλεσμα της διαφοράς της r από τη διαφορά r − s.
Παράδειγμα
Δώστε εσείς ένα παράδειγμα που να επιβεβαιώνει (ή να
αναιρεί) τον παραπάνω ορισμό.

33 / 88
Pane Amore

1 Pane, amore e fantasia, (1953)


2 Pane, amore e gelosia, (1954)
3 Pane, amore e ..., (1955)
34 / 88

Pane amore
f g
actorID name actorID name
0001120 Vittorio De Sica 0001120 Vittorio De Sica
0518178 Gina Lollobrigida 0518178 Gina Lollobrigida
0581028 Marisa Merlini 0581028 Marisa Merlini
0139214 Memmo Carotenuto 0139214 Memmo Carotenuto
0728376 Roberto Risso 0681365 Tina Pica
0681365 Tina Pica 0882237 Saro Urzı̀
0188022 Vittoria Crispo 0188022 Vittoria Crispo

35 / 88
Pane amore (Ερωτήματα συμμετοχής)

΄Επαιξαν σε τουλάχιστον μία ταινία


f ∪g

΄Επαιξαν και στις δύο πρώτες ταινίες


f ∩g

΄Επαιξαν μόνο στην πρώτη ταινία


f −g

΄Επαιξαν μόνο στη δεύτερη ταινία


g −f

36 / 88

Τομή fantasia ∩ gelosia


f g
actorID name actorID name
0001120 Vittorio De Sica 0001120 Vittorio De Sica
0518178 Gina Lollobrigida 0518178 Gina Lollobrigida
0581028 Marisa Merlini 0581028 Marisa Merlini
0139214 Memmo Carotenuto 0139214 Memmo Carotenuto
0728376 Roberto Risso 0681365 Tina Pica
0681365 Tina Pica 0882237 Saro Urzı̀
0188022 Vittoria Crispo 0188022 Vittoria Crispo

actorID name
0001120 Vittorio De Sica
0518178 Gina Lollobrigida
0581028 Marisa Merlini
0139214 Memmo Carotenuto
0681365 Tina Pica
0188022 Vittoria Crispo
37 / 88
Διαφορά fantasia − gelosia
f g
actorID name actorID name
0001120 Vittorio De Sica 0001120 Vittorio De Sica
0518178 Gina Lollobrigida 0518178 Gina Lollobrigida
0581028 Marisa Merlini 0581028 Marisa Merlini
0139214 Memmo Carotenuto 0139214 Memmo Carotenuto
0728376 Roberto Risso 0681365 Tina Pica
0681365 Tina Pica 0882237 Saro Urzı̀
0188022 Vittoria Crispo 0188022 Vittoria Crispo

actorID name
0728376 Roberto Risso

38 / 88

Η σχεσιακή πράξη του γινομένου

Ορισμός του γινομένου

r × s = {t u | t ∈ r and u ∈ s}
Καρτεσιανό γινόμενο δύο σχέσεων r (R) και
s(S), είναι μια σχέση που έχει επικεφαλίδα το
σύνολο των γνωρισμάτων των σχέσεων R και S,
και κορμό το σύνολο όλων των συνδυασμών των
πλειάδων που ανήκουν στην r και στην s. Το
καρτεσιανό γινόμενο συμβολίζεται με r × s ή
r TIMES s.

39 / 88
Γνωρίσματα καρτεσιανού γινομένου

Μετονομασία κοινών γνωρισμάτων


Το σχήμα ενός καρτεσιανού γινομένου προκύπτει μετά
από μετονομασία των πιθανών κοινών γνωρισμάτων δύο
σχέσεων.
Για παράδειγμα, αν Y είναι ένα κοινό γνώρισμα των
σχέσεων r (R) και s(S), τότε το σχήμα της σχέσης r × s
είναι:

T = (R − S) ∪ (S − R) ∪ {R.Y , S.Y | Y ∈ R ∩ S}

40 / 88

Βαθμός και πληθικότητα γινομένου

Βαθμός γινομένου
Αν η σχέση r είναι nR βαθμού και η σχέση s είναι nS
βαθμού τότε το αποτέλεσμα του γινομένου έχει βαθμό:
nr ×s = nR + nS

Πληθικότητα γινομένου
Αν η σχέση r είναι mr βαθμού και η σχέση s είναι ms
βαθμού τότε το αποτέλεσμα του γινομένου έχει βαθμό:
mr ×s = mr · ms

41 / 88
Παράδειγμα σχεσιακού γινομένου
r s r ×s
A B D E F A B D E F
1 b b 4 30 1 b b 4 30
5 a a 2 10 1 b a 2 10
3 c 5 a b 4 30
5 a a 2 10
3 c b 4 30
3 c a 2 10

42 / 88

Γινόμενο και μετονομασία γνωρισμάτων


r s r ×s
A B A B F R.A R.B S.A S.B F
1 b b 4 30 1 b b 4 30
5 a a 2 10 1 b a 2 10
3 c 5 a b 4 30
5 a a 2 10
3 c b 4 30
3 c a 2 10

43 / 88
Δενδροειδής απεικόνιση καρτεσιανού γινομένου
1 (a,1)
a A= {a, b, c}
2 (a,2) B= {1, 2}
A×B = {(a, 1), (a, 2)
1 (b,1)
(b, 1), (b, 2),
b
2 (b,2) (c, 1), (c, 2)}

1 (c,1)
c
2 (c,2)

44 / 88

Απεικόνιση καρτεσιανού γινομένου σε σύνολα


A B
A= {a, b, c}
a 1 B= {1, 2}
b A×B = {(a, 1), (a, 2)
c 2 (b, 1), (b, 2),
(c, 1), (c, 2)}

45 / 88
Προσοχή στο καρτεσιανό γινόμενο

Φοιτητές και Μαθήματα


Αν M είναι το σύνολο των μαθημάτων και Φ είναι το
σύνολο των φοιτητών τότε
M ×Φ

είναι ο συνδυασμός όλων των μαθημάτων με όλους τους


φοιτητές (όλοι εξετάζονται σε όλα).

Ηθοποιοί και ταινίες


Αν H είναι το σύνολο των ηθοποιών και T είναι το
σύνολο των ταινιών τότε
H ×T

είναι ο συνδυασμός όλων των ηθοποιών με όλες τις


ταινίες (όλοι παίζουν σε όλες).
46 / 88

Η σχεσιακή πράξη της φυσικής σύζευξης

Ορισμός της φυσικής σύζευξης


r ⊲⊳ s = {t | υπάρχουν πλειάδες u ∈ r και v ∈ s
έτσι ώστε t[R] = u και t[S] = v }

Αν η r είναι σχέση με σχήμα R = {X , Y } και s είναι


σχέση με σχήμα S = {Y , Z }, τότε η φυσική σύζευξη
των r και s είναι μια σχέση με σχήμα R ∪ S = {X , Y , Z }
και κορμό το σύνολο των συνδυασμών των πλειάδων της
r και s για τις οποίες οι τιμές στο κοινό γνώρισμα Y
ταυτίζονται.
Η φυσική σύζευξη των σχέσεων r και s συμβολίζεται με
r ⊲⊳ s, ή r NATURAL JOIN s, ή απλά r JOIN s.

47 / 88
Παράδειγμα φυσικής σύζευξης

A B C C D A B C D
1 b 10 20 1 1 b 10 3
5 a 30 10 3 3 c 20 1
3 c 20 20 3 3 c 20 3
r s r ⊲⊳ s
Παρατηρήσεις
1 Τα κοινά γνωρίσματα, εδώ το C, μόνο μία φορά στο
αποτέλεσμα.
2 Πλειάδες με μη ταιριαστές τιμές δεν συμμετέχουν
στο αποτέλεσμα.
48 / 88

Παράδειγμα φυσικής σύζευξης

A B C C D A B C D
1 b 10 20 1 1 b 10 3
5 a 30 10 3 3 c 20 1
3 c 20 20 3 3 c 20 3
r s r ⊲⊳ s
Παρατηρήσεις
1 Τα κοινά γνωρίσματα, εδώ το C, μόνο μία φορά στο
αποτέλεσμα.
2 Πλειάδες με μη ταιριαστές τιμές δεν συμμετέχουν
στο αποτέλεσμα.
49 / 88
Παράδειγμα φυσικής σύζευξης

A B C C D A B C D
1 b 10 20 1 1 b 10 3
5 a 30 10 3 3 c 20 1
3 c 20 20 3 3 c 20 3
r s r ⊲⊳ s
Παρατηρήσεις
1 Τα κοινά γνωρίσματα, εδώ το C, μόνο μία φορά στο
αποτέλεσμα.
2 Πλειάδες με μη ταιριαστές τιμές δεν συμμετέχουν
στο αποτέλεσμα.
50 / 88

Παράδειγμα φυσικής σύζευξης

A B C C D A B C D
1 b 10 20 1 1 b 10 3
5 a 30 10 3 3 c 20 1
3 c 20 20 3 3 c 20 3
r s r ⊲⊳ s
Παρατηρήσεις
1 Τα κοινά γνωρίσματα, εδώ το C, μόνο μία φορά στο
αποτέλεσμα.
2 Πλειάδες με μη ταιριαστές τιμές δεν συμμετέχουν
στο αποτέλεσμα.
51 / 88
Παράδειγμα φυσικής σύζευξης

A B C C D A B C D
1 b 10 20 1 1 b 10 3
5 a 30 10 3 3 c 20 1
3 c 20 20 3 3 c 20 3
r s r ⊲⊳ s
Παρατηρήσεις
1 Τα κοινά γνωρίσματα, εδώ το C, μόνο μία φορά στο
αποτέλεσμα.
2 Πλειάδες με μη ταιριαστές τιμές δεν συμμετέχουν
στο αποτέλεσμα.
52 / 88

Υπάλληλοι και τμήματα, ξένο κλειδί, 1:Ν


departments: employees:
depid depname empid empname depid
1 Μελετών 102 Αποστολάκης 2
2 Λογιστήριο 154 Βασιλάκης 1
3 Διαφήμισης 132 Χρηστάκης 2
432 Δημητράκης 3
203 Κωστάκης 1
departments ⊲⊳ employees:
depid depname empid empname
1 Μελετών 154 Βασιλάκης
1 Μελετών 203 Κωστάκης
2 Λογιστήριο 102 Αποστολάκης
2 Λογιστήριο 132 Χρηστάκης
3 Διαφήμισης 432 Δημητράκης
53 / 88
Η σχεσιακή πράξη της σύζευξης θ

Ορισμός
Αν η r είναι σχέση με σχήμα R = {A1 , A2 , . . . , An }, s
είναι σχέση με σχήμα S = {B1 , B2 , . . . , Bm }, τα
γνωρίσματα Ai και Bj έχουν το ίδιο πεδίο ορισμού, και θ
είναι τελεστής σύγκρισης, θ ∈ {=, 6=, <, ≤, >, ≥},
τότε η θ σύζευξη των r και s, r ⊲⊳Ai θBj s,
είναι μια σχέση με σχήμα το σύνολο των γνωρισμάτων
των R και S, {A1 , A2 , . . . , An B1 , B2 , . . . , Bm } και κορμό
το σύνολο των πλειάδων από κάθε συνδυασμό των
πλειάδων των r και s, που ικανοποιούν τη συνθήκη
Ai θBj .

54 / 88

Παρατηρήσεις για τη θ σύζευξη


Το αποτέλεσμα είναι μια σχέση με βαθμό nR + nS ,
και πληθικότητα ανάμεσα στο 0 και στο mr · ms .
Αν κάποια πλειάδα έχει στο γνώρισμα που
συμμετέχει στη σύζευξη τιμή NULL τότε δεν
συμμετέχει στο αποτέλεσμα.
Αν ο τελεστής θ είναι το = τότε η σύζευξη καλείται
ισοσύζευξη.
Η σύζευξη θ (θ JOIN) είναι παράγωγη πράξη
γινομένου και επιλογής, έτσι ισχύει:

σX θY (r × s) = r ⊲⊳X θY s

55 / 88
Παράδειγμα σύζευξης θ, ξένο κλειδί, 1:Ν
departments: employees:
depcode depname empid empname depid
1 Μελετών 102 Αποστολάκης 2
2 Λογιστήριο 154 Βασιλάκης 1
3 Διαφήμισης 132 Χρηστάκης 2
432 Δημητράκης 3
203 Κωστάκης 1

departments ⊲⊳depcode=depid employees:


depcode depname empid empname depid
1 Μελετών 154 Βασιλάκης 1
1 Μελετών 203 Κωστάκης 1
2 Λογιστήριο 102 Αποστολάκης 2
2 Λογιστήριο 132 Χρηστάκης 2
3 Διαφήμισης 432 Δημητράκης 3 56 / 88

Ενδυματολογικές προτιμήσεις και θ σύζευξη


shoes: skirts:
color price color price
blue 55 red 30
green 45 green 40
red 30 green 65
blue 30

Να βρεθούν οι συνδυασμοί:
1 Παπούτσια και φούστες ίδιου χρώματος.
2 Παπούτσια και φούστες διαφορετικού χρώματος.
3 Παπούτσια και φούστες με ακριβότερη τη φούστα.

57 / 88
Παπούτσια και φούστες ίδιου χρώματος

shoes ⊲⊳shoes.color =skirts.color skirts

shoes.color shoes.price skirts.color skirts.price


blue 55 blue 30
green 45 green 40
green 45 green 65
red 30 red 30

58 / 88

Παπούτσια και φούστες διαφορετικού χρώματος

shoes ⊲⊳shoes.color 6=skirts.color skirts

shoes.color shoes.price skirts.color skirts.price


blue 55 red 30
blue 55 green 40
blue 55 green 65
green 45 red 30
green 45 blue 30
red 30 green 40
red 30 green 65
red 30 blue 30

59 / 88
Παπούτσια και φούστες με ακριβότερη φούστα

shoes ⊲⊳shoes.price<skirts.price skirts

shoes.color shoes.price skirts.color skirts.price


blue 55 green 65
green 45 green 65
red 30 green 40
red 30 green 65

60 / 88

Εξωτερική σύζευξη

Ορισμός εξωτερική σύζευξης


Αν η r είναι σχέση με σχήμα R = {X , Y }, s είναι σχέση με
σχήμα S = {Y , Z }, τότε η εξωτερική σύζευξη t = r ⊲⊳ s έχει
σχήμα T = {X , Y , Z } και κορμό που αποτελείται από :
1 Τις πλειάδες της εσωτερικής σύζευξης των r ⊲⊳ s
2 Τις πλειάδες της σχέσης r που δεν έχουν ταιριαστές
τιμές στην s, με τιμές NULL στα αντίστοιχα
γνωρίσματα της s
3 Τις πλειάδες της σχέσης s που δεν έχουν ταιριαστές
τιμές στην r , με τιμές NULL στα αντίστοιχα
γνωρίσματα της r

61 / 88
Εξωτερική σύζευξη
Επέκταση της σύζευξης
Η εξωτερική σύζευξη είναι επέκταση της σύζευξης, στην
περίπτωση που υπάρχουν πλειάδες σε μία ή περισσότερες
σχέσεις, χωρίς ταιριαστές τιμές.

Για παράδειγμα:
θεωρείστε τις δύο σχέσεις του σχήματος, που παριστάνουν
ένα δείγμα από τα υποκαταστήματα (Υ) και τους πελάτες
(Π) μιας εταιρείας.
Θέλουμε να βρούμε το αποτέλεσμα της εξωτερικής σύζευξης
των δύο σχέσεων με βάση την πόλη:

Υ ⊲⊳ Π

Δηλαδή τα υποκαταστήματα, ανεξάρτητα από το αν έχουν


ή όχι πελάτες, και τους πελάτες, ανεξάρτητα από το αν
υπάρχει υποκατάστημα στην πόλη τους.
62 / 88

Εξωτερική σύζευξη
Υ Π
id city name city
1 Αθήνα Νίκος Πάτρα
2 Πάτρα Βάσω Κοζάνη
3 Θεσσαλονίκη Αγγελική Πάτρα
Βασίλης Αθήνα

Υ ⊲⊳ Π
id city name
1 Αθήνα Βασίλης
2 Πάτρα Νίκος
2 Πάτρα Αγγελική
3 Θεσσαλονίκη NULL
NULL Κοζάνη Βάσω
63 / 88
Αριστερή εξωτερική σύζευξη

Ορισμός
Αν r είναι σχέση με σχήμα R = {X , Y } και s είναι μία
σχέση με σχήμα S = {Y , Z }, τότε η αριστερή εξωτερική
σύζευξη t = r ⊲⊳ s έχει σχήμα T = {X , Y , Z } και κορμό
που αποτελείται από τις πλειάδες:
r ⊲⊳ s = (r ⊲⊳ s) ∪ ((r − ΠR (r ⊲⊳ s)) × w )

όπου w είναι μία σχέση με σχήμα R − S και μία


πλειάδα με τιμές {null, null, . . . , null}.

64 / 88

Δηλαδή

Επεξήγηση ορισμού αριστερής σύζευξης


Η αριστερή εξωτερική σύζευξη (ή απλώς αριστερή
σύζευξη):
r ⊲⊳ s
έχει σαν αποτέλεσμα μια σχέση με:
Σχήμα όμοιο αυτό της φυσικής σύζευξης r ⊲⊳ s.
Κορμό τις πλειάδες που προκύπτουν από την ένωση
των πλειάδων:
της φυσικής σύζευξης r ⊲⊳ s
όλων των πλειάδων της r (αριστερής σχέσης) που
δεν είναι στο αποτέλεσμα της φυσικής σύζευξης, με
NULL τιμές στα γνωρίσματα της s (δεξιάς σχέσης)

65 / 88
Παράδειγμα αριστερής σύζευξης
Υ Π
id city name city
1 Αθήνα Νίκος Πάτρα
2 Πάτρα Βάσω Κοζάνη
3 Θεσσαλονίκη Αγγελική Πάτρα
Βασίλης Αθήνα

Υ ⊲⊳ Π Υ ⊲⊳ Π
id city name id city name
1 Αθήνα Βασίλης 1 Αθήνα Βασίλης
2 Πάτρα Νίκος 2 Πάτρα Νίκος
2 Πάτρα Αγγελική 2 Πάτρα Αγγελική
3 Θεσσαλονίκη NULL
66 / 88

Δεξιά εξωτερική σύζευξη

Ορισμός
Αν r είναι σχέση με σχήμα R = {X , Y } και s είναι μία
σχέση με σχήμα S = {Y , Z }, τότε η δεξιά εξωτερική
σύζευξη t = r ⊲⊳ s έχει σχήμα T = {X , Y , Z } και κορμό
που αποτελείται από τις πλειάδες:
r ⊲⊳ s = (r ⊲⊳ s) ∪ (w × ((s − ΠS (r ⊲⊳ s)))

όπου w είναι μία σχέση με σχήμα S − R και μία


πλειάδα με τιμές {null, null, . . . , null}.

67 / 88
Επεξήγηση ορισμού δεξιάς σύζευξης

Ορισμός
Η δεξιά εξωτερική σύζευξη (ή απλώς δεξιά σύζευξη):
r ⊲⊳ s

έχει σαν αποτέλεσμα μια σχέση με :


Σχήμα όμοιο αυτό της φυσικής σύζευξης r ⊲⊳ s.
Κορμό τις πλειάδες που προκύπτουν από την ένωση
των πλειάδων:
Της φυσικής σύζευξης r ⊲⊳ s
΄Ολων των πλειάδων της s (δεξιάς σχέσης) που δεν
είναι στο αποτέλεσμα της φυσικής σύζευξης, με
NULL τιμές στα γνωρίσματα της r (αριστερής
σχέσης)

68 / 88

Παράδειγμα δεξιάς σύζευξης


Υ Π
id city name city
1 Αθήνα Νίκος Πάτρα
2 Πάτρα Βάσω Κοζάνη
3 Θεσσαλονίκη Αγγελική Πάτρα
Βασίλης Αθήνα

Υ ⊲⊳ Π Υ ⊲⊳ Π
id city name id city name
1 Αθήνα Βασίλης 1 Αθήνα Βασίλης
2 Πάτρα Νίκος 2 Πάτρα Νίκος
2 Πάτρα Αγγελική 2 Πάτρα Αγγελική
NULL Κοζάνη Βάσω
69 / 88
Γενική μορφή συνάθροισης
Η σύνοψη (ή αλλιώς ομαδοποίηση) ομαδοποιεί πλειάδες μιας
σχέσης με βάση κοινές τιμές σε ένα ή περισσότερα
γνωρίσματα. Σε κάθε ένα από τα υποσύνολα των πλειάδων
που προκύπτουν μπορεί να εφαρμοστεί μια συναθροιστική
συνάρτηση.
Συνάθροιση:
Αν R είναι μια σχεσιακή παράσταση και X ⊂ R και
A ⊂ R τότε η παράσταση:
X GF (A) (R)

δηλώνει την ομαδοποίηση ως προς X των πλειάδων της


r (R) και την εφαρμογή της συνάρτησης F πάνω στα
γνωρίσματα A.
Η συνάθροιση δηλώνεται με το καλλιγραφικό G, G .
Η χρήση της ομαδοποίησης (X ) είναι προαιρετική. 70 / 88

Συναρτήσεις συνάθροισης

5 κύριες συναρτήσεις συνάθροισης:


COUNT(), πλήθος εγγραφών
SUM(), άθροισμα αριθμητικού γνωρίσματος,
AVG(), μέση τιμή αριθμητικού γνωρίσματος,
MIN(), μικρότερη τιμή.
MAX(), μεγαλύτερη τιμή.

71 / 88
Παράδειγμα άθροισης τιμών γνωρίσματος
area employee amount
Ημαθίας Ευθυμίου 1890
Μαγνησίας Αλεξανρίδης 2400
΄Εστω η σχέση sales: Καβάλας Αλεξανρίδης 780
Μαγνησίας Ευθυμίου 2100
Τρικάλων Πετρίδης 4400
Πιερίας Πετρίδης 1820
Καβάλας Ευθυμίου 2400

Να υπολογιστεί το άθροισμα των πωλήσεων


Gsum(amount) (sales)

72 / 88

Ανατομία συνάθροισης με ομαδοποίηση

employee Gsum(amount) (sales)

1 Λαμβάνεται ο κορμός της σχέσης sales, δηλαδή όλες


οι πλειάδες.
2 Ομαδοποίηση ως προς τις τιμές του γνωρίσματος
employee. εδώ, σε 3 υποσύνολα.
3 Ο δείκτης sum(amount) δεξιά από το G
(καλλιγραφικό G), σημαίνει πως θα υπολογιστεί το
άθροισμα των τιμών amount για κάθε διακριτή τιμή
employee.
4 Το αποτέλεσμα της σχεσιακής παράστασης έχει
σχήμα το {employee, sum(amount)}.

73 / 88
Παράδειγμα άθροισης με ομαδοποίηση
area employee amount
΄Αθροισμα πωλήσεων
ανά υπάλληλο Ημαθίας Ευθυμίου 1890
Μαγνησίας Αλεξανρίδης 2400
Καβάλας Αλεξανρίδης 780
employee Gsum(amount) (sales) Μαγνησίας Ευθυμίου 2100
Τρικάλων Πετρίδης 4400
employee sum(amount) Πιερίας Πετρίδης 1820
Καβάλας Ευθυμίου 2400
Ευθυμίου 6390
Αλεξανρίδης 3180
Πετρίδης 6220

74 / 88

Ο πίνακας employees από τη βάση company


΄Εστω η σχέση employees με σχήμα:

employees(empid, firstname, lastname, depid, salary , hiredate)

empid firstname lastname depid salary hiredate


102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02
109 Μαρία Αθανασίου 1 2787.69 2000-01-26
153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15
172 Χρήστος Βλάσσης 3 1101.70 2000-07-04
189 Θεόδωρος Αγγελίνας 6 1908.28 2000-06-19
... ... ... ... ... ...
Δείγμα από τα δεδομένα του πίνακα.
Δείτε τα πλήρη περιεχόμενα εδώ:
http://stavrakoudis.econ.uoi.gr/stavrakoudis/?iid=400

75 / 88
Παραδείγματα συναρτήσεων συνάθροισης

Το άθροισμα των μισθών όλων των υπαλλήλων


Gsum(salary ) (employees)

Ο μέσος μισθός των υπαλλήλων του τμήματος 3


Gavg (salary ) (σdepid=3 (employees))

Πόσοι υπάλληλοι εργάζονται στο τμήμα 4


Gcount(empid) (σdepid=4 (employees))

Ημερομηνία της πιο πρόσφατης πρόσληψης


Gmax(hiredate) (employees)
76 / 88

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

Ο μικρότερος μισθός ανά τμήμα υπαλλήλων


depid Gmin(salary ) (employees)

Να βρεθεί το εύρος μισθού ανά τμήμα


depid Gmax(salary )−min(salary ) (employees)

Πλήθος υπαλλήλων ανά τμήμα με μισθό > 1300


depid Gcount(depid) (σsalary >1300 (employees))

77 / 88
Περιορισμός μετά από ομαδοποίηση

Τμήματα με περισσότερους από 4 υπαλλήλους



σcount(depid)>4 depid Gcount(empid) (employees)

Μόνο οι σκιασμένες
depid count(empid)
γραμμές στο αποτέλεσμα,
1 3 δηλαδή μόνο εκείνες για τις
2 4 οποίες η σύγκριση
3 9
4 5 count(depid) > 4
5 2
6 7 αποδίδει την τιμή TRUE.

78 / 88

Ενημέρωση
Εκτός από τις πράξεις επιλογής, η σχεσιακή άλγεβρα έχει
ανάγκη από τις πράξεις ενημέρωσης της βάσης δεδομένων.
Με αυτές υπάρχει η δυνατότητα:
Εισαγωγής δεδομένων στις σχέσεις, δηλαδή
εισαγωγής μιας ή περισσοτέρων πλειάδων.
Τροποποίησης δεδομένων στις σχέσεις, δηλαδή
αλλαγή στις τιμές των γνωρισμάτων μιας σχέσης.
Διαγραφής δεδομένων από τις σχέσεις, δηλαδή
απαλοιφή μιας ή περισσότερων πλειάδων της
σχέσης.

79 / 88
Επιπτώσεις της ενημέρωσης

Σχήμα της σχέσης


Δεν επηρεάζεται το σχήμα της σχέσης.
Δεν μεταβάλλεται ο βαθμός της σχέσης.

Κορμός της σχέσης


Εισαγωγή : αύξηση πληθικότητας.
Τροποποίηση : σταθερή πληθικότητα.
Διαγραφή : μείωση πληθικότητας.

80 / 88

Η σχέση movies
΄Εστω η σχέση movies(code, title, year ):

code title year


658 Blade Runner 1982
583 Casablanca 1943
779 La Dolce Vita 1960
884 Paris Texas 1984

Μια μικρή βάση δεδομένων με τίτλους ταινιών και το έτος


πρώτης προβολής.
Το γνώρισμα code είναι πρωτεύον κλειδί.

81 / 88
Εισαγωγή

Η εισαγωγή των δεδομένων E (σχεσιακής


έκφρασης) στη σχέση r , γράφετε ως:
r ←r ∪E

Εισαγωγή της ταινίας Blade Runner του 1982 με


κωδικό 658
movies ← movies ∪ {658, ’Blade Runner’, 1982}

82 / 88

Παραβίαση πρωτεύοντος κλειδιού


code title year code title year
658 Blade Runner 1982 658 Blade Runner 1982
583 Casablanca 1943 583 Casablanca 1943
779 La Dolce Vita 1960 779 La Dolce Vita 1960
884 Paris Texas 1984 884 Paris Texas 1984
The Pink Panther 1963

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

movies ← movies ∪ {779, ’The Pink Panther’, 1963}

Η παράσταση δεν είναι έγκυρη, η εισαγωγή πλειάδας


θα αποτύχει.

83 / 88
Τροποποίηση

Τελεστής γενικευμένης προβολής


r ← ΠA1 ,A2 ,...,An (r )

Αλλαγή του έτους κυκλοφορίας


movies ← Πcode,title,year =1942 (movies)

84 / 88

Τροποποίηση του έτους σε 1942

Καθολική εφαρμογή της τροποποίησης


movies ← Πcode,title,year =1942 (movies)

code title year


658 Blade Runner 1942
583 Casablanca 1942
779 La Dolce Vita 1942
884 Paris Texas 1942

85 / 88
Τροποποίηση του έτους σε 1942

Επιλεκτική εφαρμογή της τροποποίησης


movies ← Πcode,title,year =1942 (σcode=583 (movies))

code title year


658 Blade Runner 1982
583 Casablanca 1942
779 La Dolce Vita 1960
884 Paris Texas 1984

86 / 88

Διαγραφή

Διαγραφή των δεδομένων που προκύπτουν από


μια σχεσιακή παράσταση E στη σχέση r
r ←r −E

Διαγραφή της ταινίας Blade Runner με κωδικό


658
movies ← movies − σcode=658 (movies)

87 / 88
Σχεσιακή άλγεβρα

Φεβρουάριος 2013
Περιεχόμενα

1 Σχεσιακή άλγεβρα και βασικές σχεσιακές πράξεις 1


1.1 Κλειστότητα . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Συμβατότητα τύπου . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Συνολοθεωρητικές πράξεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.1 ΄Ενωση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.2 Διαφορά . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.3 Τομή . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.4 Γινόμενο . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.5 Παραδείγματα συνολοθεωρητικών πράξεων. . . . . . . . . . . . . . . . . . . 9
1.4 Οι βασικές πράξεις προβολής και επιλογής . . . . . . . . . . . . . . . . . . . . . . . 18
1.4.1 Προβολή . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.4.2 Επιλογή . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.4.3 Παραδείγματα και ασκήσεις προβολής και επιλογής . . . . . . . . . . . . . . 21
1.5 Συζεύξη . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.5.1 Φυσική σύζευξη . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.5.2 Σύζευξη θήτα . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.5.3 Πλήρης εξωτερική σύζευξη . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.5.4 Αριστερή εξωτερική σύζευξη . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.5.5 Δεξιά εξωτερική σύζευξη . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.6 Διαίρεση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.7 Σύνοψη και συναρτήσεις συνάθροισης . . . . . . . . . . . . . . . . . . . . . . . . . 35
1.8 Ενημέρωση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1.8.1 Εισαγωγή . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.8.2 Διαγραφή . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1.8.3 Τροποποίηση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

i
1 Σχεσιακή άλγεβρα και βασικές σχεσια-
κές πράξεις

Στόχος του κεφαλαίου είναι:

• Να εκτελείτε τις μοναδιαίες πράξεις προβολής και επιλογής.

• Να εκτελείτε τις συνολοθεωρητικές πράξεις ένωσης, διαφοράς και τομής.

• Να εκτελείτε πράξεις καρτεσιανού γινομένου συνόλων.

• Να εκτελείτε πράξεις σύζευξης σχέσεων.

• Να καταλάβετε τις διαφορές και ομοιότητες μεταξύ των διαφορετικών τύπων σύζευξης: φυσι-
κή, θήτα σύζευξη, εξωτερική, δεξιά εξωτερική, αριστερή εξωτερική, κ.α.

• Να εκτελείτε τη σχεσιακή πράξη της διαίρεσης.

• Να εκτελείτε πράξεις σύνοψης και συνάθροισης.

• Να εκτελείτε πράξεις ενημέρωσης σχέσεων: εισαγωγή, διαγραφή και τροποποίηση δεδομένων.

1
2 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

1.1 Κλειστότητα
Η σχεσιακή άλγεβρα και ο σχεσιακός λογισμός παρέχουν ένα σύνολο από τελεστές για πράξεις
ανάμεσα σε σχέσεις. ΄Ολες οι πράξεις στηρίζονται στην ιδιότητα της κλειστότητας, δηλαδή
στο γεγονός πως το αποτέλεσμα οποιασδήποτε σχεσιακής πράξης είναι μια σχέση. Η ιδιότητα
της κλειστότητας επιτρέπει τη λεγόμενη εμφώλευση (ένθεση) παραστάσεων: το αποτέλεσμα μιας
σχεσιακής πράξης είναι σχέση, οπότε αυτό το αποτέλεσμα μπορεί να συμμετέχει ως τελεστέος σε
μια νέα σχεσιακή παράσταση, σε μια νέα σχεσιακή πράξη δηλαδή.
Θυμηθείτε πως κάτι ανάλογο συμβαίνει στην άλγεβρα αριθμών: το σύνολο των αριθμών είναι κλειστό,
δηλαδή πράξεις με αριθμούς, έχουν αποτέλεσμα αριθμούς. Λόγω αυτής της ιδιότητας μπορούν να
γραφούν ένθετες παραστάσεις, όπως:
4 + (3 · 2)
Το ίδιο μπορεί να γίνει και στην άλγεβρα σχέσεων: το αποτέλεσμα μιας σχεσιακής πράξης (σε
αντιστοιχία με το 3 · 2 = 6) μπορεί να είναι τελεστέος σε μια άλλη σχεσιακή πράξη (σε αντιστοιχία
με 4 + 6).
Οι πράξεις με σχέσεις παράγουν σχέσεις. Το αποτέλεσμα της πράξης, αφού είναι σχέση, έχει μια
επικεφαλίδα (σχήμα της σχέσης), επομένως πρέπει να μπορεί να οριστεί ο βαθμός της, δηλαδή το
πλήθος των γνωρισμάτων της σχέσης αποτέλεσμα. Επίσης, έχει κορμό, δηλαδή ένα σύνολο από
πλειάδες (συστοιχίες), επομένως πρέπει να έχει πληθικότητα. Θα πρέπει κανείς, για κάθε σχεσιακή
πράξη, να μπορεί να ορίσει το σχήμα της σχέσης του αποτελέσματος, το βαθμό και την πληθικότητά
του.

1.2 Συμβατότητα τύπου


Θα ορίσουμε σε αυτό το σημείο την έννοια της συμβατότητας τύπου, η οποία έχει εφαρμογή σε
πολλές σχεσιακές πράξεις.
Δύο σχέσεις r και s, έχουν συμβατότητα τύπου, αν και μόνο αν:

• ΄Εχουν τον ίδιο βαθμό, δηλαδή έχουν το ίδιο πλήθος γνωρισμάτων

• Τα αντίστοιχα γνωρίσματα έχουν το ίδιο πεδίο ορισμού

Προσοχή, δεν ενδιαφέρουν τα ονόματα των γνωρισμάτων, παρά μόνο το πλήθος τους και οι τύποι
δεδομένων.

A B C A B C A B A B C
1 b 10 5 a 20 5 b 5 b a
5 a 30 2 b 10 2 b 2 b b
3 c 20 3 c 20 3 c 3 c b
r s t u

Σχήμα 1.1: Παράδειγμα συμβατότητας τύπου οι σχέσεις r και s έχουν συμβατότητα


τύπου. ΄Ολα τα υπόλοιπα ζεύγη σχέσεων δεν έχουν.

Δείτε για παράδειγμα το σχήμα 1.1. Οι σχέσεις r και s έχουν συμβατότητα τύπου γιατί πληρούν και
τις δύο προϋποθέσεις που έχουν αναφερθεί. Αντίθετα οι σχέσεις r και t δεν έχουν συμβατότητα τύπου
1.3. Συνολοθεωρητικές πράξεις 3

επειδή δεν έχουν το ίδιο πλήθος γνωρισμάτων. Επίσης, ούτε οι σχέσεις r και u έχουν συμβατότητα
τύπου. έχουν βέβαια το ίδιο πλήθος γνωρισμάτων, αλλά οι τύποι δεδομένων διαφέρουν. Η γνώρισμα
C της σχέσης r περιέχει ακεραίους, ενώ το γνώρισμα C της σχέσης u περιέχει κείμενο. Επομένως
δεν υπάρχει συμβατότητα τύπου.

1.3 Συνολοθεωρητικές πράξεις

1.3.1 ΄Ενωση
΄Ενωση δύο σχέσεων r(R) και s(S), που έχουν συμβατότητα τύπου, είναι μια νέα σχέση που έχει
σχήμα (επικεφαλίδα) ίδιο με αυτό της r και s, και κορμό το σύνολο των κορμών των r και s, δηλαδή
όλες τις πλειάδες που ανήκουν στην r, ή στην s, η και στις δύο πλειάδες. Η ένωση συμβολίζεται με
r ∪ s ή r U N ION s.
Ορισμός της ένωσης:
r ∪ s = {t | t ∈ r or t ∈ s} (1.1)

r s
r = {1, 2}
s = {2, 3}
1 2 3 r ∪ s = {1, 2, 3}

Σχήμα 1.2: Η ένωση δύο συνόλων έχει ως μέλη τα στοιχεία είτε του ενός είτε του
άλλου συνόλου.

Δείτε για παράδειγμα το σχήμα 1.2, το οποίο αναπαριστά σχηματικά την ένωση r ∪ s. Αν r = {1, 2}
και s = {2, 3} τότε t = r ∪ s = {1, 2, 3}. Δηλαδή η ένωση συμπεριλαμβάνει όλα τα στοιχεία των δύο
συνόλων. Προσέξτε πως το 2 είναι μέλος και των δύο συνόλων. Ωστόσο, στο αποτέλεσμα υπάρχει
μόνο φορά.

A B C
A B C A B C
1 b 10
1 b 10 5 a 30
5 a 30
5 a 30 2 b 10
3 c 20
3 c 20 3 c 20
2 b 10
r s r∪s

Σχήμα 1.3: Παράδειγμα σχεσιακής ένωσης: t = r ∪ s

΄Ενα ακόμη παράδειγμα σχεσιακής ένωσης δίνεται στο σχήμα 1.3. Προσέξτε πως οι πλειάδες
<5,a,30> και <3,c,20> βρίσκονται και στις δύο σχέσεις. Ωστόσο, στο αποτέλεσμα της σχεσια-
κής ένωσης θα υπάρχουν μόνο μία φορά η καθεμία από αυτές.
Για τη σχεσιακή πράξη της ένωσης ισχύει η αντιμεταθετική ιδιότητα:

r∪s=s∪r (1.2)
4 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

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

A B C A B C
A B C A B C
1 b 10 5 a 30
1 b 10 5 a 30
5 a 30 2 b 10
5 a 30 2 b 10
3 c 20 3 c 20
3 c 20 3 c 20
2 b 10 1 b 10
r s r∪s s∪r

Σχήμα 1.4: Παράδειγμα αντιμεταθετικής ιδιότητας της σχεσιακής ένωσης: r ∪s = s∪r.

Για την σχεσιακή πράξη της ένωσης ισχύει επίσης και η προσεταιριστική ιδιότητα:

r ∪ (s ∪ t) = (r ∪ s) ∪ t (1.3)

Λόγω αυτής της της ιδιότητας, είναι δυνατό να γραφεί η παράσταση χωρίς παρενθέσεις:

r∪s∪t

για να δηλώσει την ένωση τριών ή περισσότερων σχέσεων.


Η SQL υποστηρίζει την ένωση με τη χρήση της φράσης UNION. ΄Ετσι, τα αποτελέσματα από δύο
ερωτήματα SELECT, μπορούν να ενωθούν με τη φράση UNION. Για παράδειγμα, η εντολή SQL
που αντιστοιχεί στο παράδειγμα του σχήματος 1.3 είναι:

1 SELECT r.A, r.B, r.C


2 FROM r
3 UNION DISTINCT
4 SELECT s.A, s.B, s.C
5 FROM s

Η επιλογή DISTINCT (που στην SQL είναι προαιρετική) χρειάζεται εδώ για την απαλοιφή των
διπλότυπων εγγραφών. ΄Οπως είναι γνωστό τα αποτελέσματα ερωτημάτων SQL επιτρέπουν την
εμφάνιση διπλότυπων εγγραφών, ενώ κάτι τέτοιο στην σχεσιακή άλγεβρα δεν ισχύει. Ωστόσο, όπως
η σχεσιακή άλγεβρα απαιτεί τη συμβατότητα τύπου για την ένωση, έτσι και η SQL απαιτεί την
ομοιογένεια των δύο αποτελεσμάτων για την ορθή εκτέλεση του ερωτήματος.

1.3.2 Διαφορά
Διαφορά δύο σχέσεων r και s, που έχουν συμβατότητα τύπου, είναι μια νέα σχέση που έχει σχήμα
(επικεφαλίδα) ίδιο με αυτό της r και s, και κορμό τις πλειάδες που ανήκουν στην r αλλά όχι στην s.
Η διαφορά συμβολίζεται με R − S ή r M IN U S s.
Ορισμός της διαφοράς:
r − s = {t | t ∈ r and t ∈
/ s} (1.4)
1.3. Συνολοθεωρητικές πράξεις 5

r s
r = {1, 2}
s = {2, 3}
1 2 3 r − s = {1}
s − r = {3}

Σχήμα 1.5: Η διαφορά δύο συνόλων έχει ως μέλη τα στοιχεία του ενός συνόλου που
δεν ανήκουν στο άλλο σύνολο.

Δείτε το σχήμα 1.5 που απεικονίζει ένα παράδειγμα διαφοράς δύο συνόλων. Προσέξτε πως r − s =
{1}, δηλαδή το αποτέλεσμα της διαφοράς r − s είναι εκείνα τα μέλη του συνόλου r που δεν ανήκουν
στο σύνολο r. Από την άλλη πλευρά, προσέξτε πως s−r = {3}, δηλαδή το αποτέλεσμα της διαφοράς
s − r είναι εκείνα τα μέλη του συνόλου s που δεν ανήκουν στο σύνολο r.
Στη σχεσιακή πράξη της διαφοράς δεν ισχύει η αντιμεταθετική ιδιότητα:

r − s 6= s − r (1.5)

Δηλαδή η σειρά των τελεστέων έχει σημασία. ΄Ενα τέτοιο παράδειγμα φαίνεται στο σχήμα 1.6.

A B C A B C
A B C A B C
1 b 10 5 a 30
5 a 30 2 b 10 1 b 10 2 b 10
3 c 20 3 c 20
r s r−s s−r

Σχήμα 1.6: Παράδειγμα μη ισχύος της αντιμεταθετικής ιδιότητας της σχεσιακής πράξης
της διαφοράς: t1 = r − s και t2 = s − r. Προσέξτε πως t1 6= t2.

Επίσης δεν ισχύει η προσεταιριστική ιδιότητα:

r − (s − t) 6= (s − r) − t (1.6)

1.3.3 Τομή
Τομή δύο σχέσεων r(R) και s(S), που έχουν συμβατότητα τύπου, είναι μια νέα σχέση που έχει
σχήμα (επικεφαλίδα) ίδιο με αυτό της r και s, και κορμό τις πλειάδες που ανήκουν στην r και στην
s, δηλαδή τις κοινές πλειάδες. Η τομή συμβολίζεται με r ∩ s ή r IN T ERSECT s.
Ορισμός της τομής:
r ∩ s = {t | t ∈ r and t ∈ s} (1.7)

Δείτε για παράδειγμα το σχήμα 1.7, το οποίο αναπαριστά σχηματικά την τομή r ∩ s. Αν r = {1, 2}
και s = {2, 3} τότε t = r ∩ s = {2}. Δηλαδή η τομή περιλαμβάνει μόνο τα κοινά στοιχεία των δύο
συνόλων.
΄Ενα ακόμη παράδειγμα σχεσιακής ένωσης δίνεται στο σχήμα 1.8. Μόνο οι κοινές πλειάδες <5,a,30>
και <3,c,20> των δύο σχέσεων υπεισέρχονται στο αποτέλεσμα. Η πλειάδα <1,b,10> της σχέσης
6 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

r s
r = {1, 2}
s = {2, 3}
1 2 3 r ∩ s = {2}

Σχήμα 1.7: Η τομή δύο συνόλων έχει ως μέλη τα κοινά στοιχεία των δύο συνόλων.

A B C A B C
A B C
1 b 10 5 a 30
5 a 30
5 a 30 2 b 10
3 c 20
3 c 20 3 c 20
r s r∩s

Σχήμα 1.8: Παράδειγμα σχεσιακής τομής: t = r ∩ s

r και η πλειάδα <2,b,10> της σχέσης s αποκλείονται από το αποτέλεσμα. Προσέξτε ότι στο απο-
τέλεσμα της σχεσιακής πράξης της τομής κάθε πλειάδα υπάρχει μία μόνο φορά.
Για τη σχεσιακή πράξη της τομής ισχύει η αντιμεταθετική ιδιότητα:

r∩s=s∩r (1.8)

Δηλαδή δεν έχει σημασία η σειρά των τελεστέων, με οποιαδήποτε σειρά και να γίνει η πράξη της
τομής το αποτέλεσμα είναι το ίδιο.
΄Ενα τέτοιο παράδειγμα φαίνεται στο σχήμα 1.9. Με όποια σειρά και αν τοποθετηθούν οι τελεστέοι
της σχεσιακής πράξης, το αποτέλεσμα της τομής είναι το ίδιο.

A B C A B C
A B C A B C
1 b 10 5 a 30
5 a 30 5 a 30
5 a 30 2 b 10
3 c 20 3 c 20
3 c 20 3 c 20
r s r∩s s∩r

Σχήμα 1.9: Παράδειγμα της αντιμεταθετικής ιδιότητας της σχεσιακής πράξης της τομής:
r ∩ s = s ∩ r.

Για τη σχεσιακή πράξη της τομής ισχύει επίσης η προσεταιριστική ιδιότητα:

r ∩ (s ∩ t) = (r ∩ s) ∩ t (1.9)

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

r∩s∩t

για να δηλώσει την τομή τριών ή περισσότερων σχέσεων.


1.3. Συνολοθεωρητικές πράξεις 7

΄Οπως και στην ένωση, έτσι και στην τομή η SQL υποστηρίζει τη φράση INTERSECT που αν-
τιστοιχεί στη σχεσιακή πράξη της τομής. Το παράδειγμα του σχήματος 1.8, μπορεί στην SQL να
γραφεί ως:

1 SELECT r.A, r.B, r.C


2 FROM r
3 INTERSECT
4 SELECT s.A, s.B, s.C
5 FROM s

Ισχύει και εδώ η απαίτηση για ομοιογένεια στα αποτελέσματα των ερωτημάτων, σε αντιστοίχιση με
την απαίτηση για συμβατότητα τύπου, στις παραστάσεις της σχεσιακής άλγεβρας.
Αξίζει να σημειωθεί πως η τομή είναι μια παράγωγη πράξη. Ισχύει:
Ορισμός της τομής:
r ∩ s = r − (r − s) (1.10)

Δηλαδή το αποτέλεσμα της τομής r ∩ s ισούται με το αποτέλεσμα της διαφοράς της r από τη διαφορά
r − s. ΄Ενα παράδειγμα ισχύος της σχέσης 1.10 φαίνεται στο σχήμα 1.10.

A B C A B C
A B C A B C
A B C
1 b 10 5 a 30
5 a 30 5 a 30
5 a 30 2 b 10 1 b 10
3 c 20 3 c 20
3 c 20 3 c 20
r s r−s r − (r − s) r∩s

Σχήμα 1.10: Παράδειγμα τομής ως αποτέλεσμα δύο αφαιρέσεων: r ∩ s = r − (r − s).

1.3.4 Γινόμενο
Στη θεωρία συνόλων το καρτεσιανό γινόμενο ορίζεται ως:
Καρτεσιανό γινόμενο συνόλων:

A × B = { (a, b) : a ∈ A , b ∈ B} (1.11)

Για παράδειγμα, αν A = {a, b} και B = {1, 2, 3} τότε

A × B = {(a, 1), (a, 2), (a, 3), (b, 1), (b, 2), (b, 3)}

Δηλαδή το γινόμενο δύο συνόλων A και B αποτελείται από όλους του συνδυασμούς των μελών των
A και B. Προσέξτε πως το καρτεσιανό γινόμενο περιέχει διατεταγμένα ζεύγη.
Το καρτεσιανό γινόμενο της σχεσιακής άλγεβρας ορίζεται λίγο διαφορετικά. Καρτεσιανό γι-
νόμενο δύο σχέσεων r(R) και s(S), είναι μια σχέση που έχει επικεφαλίδα το σύνολο των γνωρι-
σμάτων των σχέσεων r(R) και s(S), και κορμό το σύνολο όλων των συνδυασμών των πλειάδων που
ανήκουν στην r(R) και στην s(S). Το καρτεσιανό γινόμενο συμβολίζεται με r×s ή r T IM ES s.
Προσέξτε πως δεν υπάρχει καμία απαίτηση για συμβατότητα τύπου ανάμεσα στις r και s.
8 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

Καρτεσιανό γινόμενο σχέσεων:

r × s = { tu | t ∈ r ∧ u ∈ s} (1.12)

Το σχήμα ενός καρτεσιανού γινομένου προκύπτει μετά από μετονομασία των πιθανών κοινών γνωρι-
σμάτων δύο σχέσεων. Για παράδειγμα, αν Y είναι ένα κοινό γνώρισμα των σχέσεων r(R) και s(S),
τότε το σχήμα της σχέσης r × s είναι:

T = (R − S) ∪ (S − R) ∪ {R.Y, S.Y | Y ∈ R ∩ S}

Αυτό σημαίνει πως στο γινόμενο τα κοινά γνωρίσματα υπάρχουν δύο φορές. Προσοχή, αυτό επι-
τρέπεται μόνο μετά από μετονομασία, τα μέλη ενός συνόλου πρέπει να είναι μοναδικά.
Αν η σχέση r είναι mR βαθμού και έχει nR πληθικότητα, και η σχέση s είναι mS βαθμού και έχει
nS πληθικότητα, τότε το αποτέλεσμα είναι mR + mS βαθμού και nR · nS πληθικότητας. Δηλαδή το
αποτέλεσμα έχει βαθμό ίσο με το άθροισμα των βαθμών των σχέσεων r και s, και πληθικότητα το
γινόμενο των πληθικοτήτων των σχέσεων r και s.

A B C D E
A B 1 b b 4 30
D E F
1 b a 2 10
1 b
b 4 30 5 a b 4 30
5 a
a 2 10 5 a a 2 10
3 c
3 c b 4 30
3 c a 2 10
r s r×s

Σχήμα 1.11: Παράδειγμα σχεσιακού καρτεσιανού γινομένου.

Το σχήμα 1.11 απεικονίζει ένα παράδειγμα σχεσιακού καρτεσιανού γινομένου, όπου οι δύο σχέσεις
δεν έχουν γνώρισμα με κοινό όνομα. Αν υπάρχει γνώρισμα με κοινό όνομα στις δύο σχέσεις, τότε
γίνεται μετονομασία του γνωρίσματος. ΄Ενα τέτοιο παράδειγμα φαίνεται στο σχήμα 1.12.

R.A R.B S.A S.B E


A B 1 b b 4 30
A B F
1 b a 2 10
1 b
b 4 30 5 a b 4 30
5 a
a 2 10 5 a a 2 10
3 c
3 c b 4 30
3 c a 2 10
r s r×s

Σχήμα 1.12: Παράδειγμα σχεσιακού καρτεσιανού γινομένου με μετονομασία των κοινών


γνωρισμάτων.

Το γινόμενο, από μόνο του, δεν έχει κάποια χρησιμότητα. Δεν προσθέτει καμία νέα πληροφορία
στη βάση δεδομένων. Η κατανόησή του όμως, είναι απολύτως απαραίτητη διότι χρησιμοποιείται πολύ
συχνά ως ενδιάμεσο αποτέλεσμα πράξεων, όπως είναι η σύζευξη.
1.3. Συνολοθεωρητικές πράξεις 9

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

r × s 6= s × r

Δηλαδή έχει σημασία η σειρά των τελεστέων.


Ισχύει ωστόσο η προσεταιριστική ιδιότητα:

r × (s × t) = (r × s) × t

΄Οπως και στην ένωση και στην τομή, έτσι και στο γινόμενο, είναι δυνατό να γραφεί η παράσταση
χωρίς παρενθέσεις:
r×s×t
για να δηλώσει το γινόμενο τριών ή περισσότερων σχέσεων.

1.3.5 Παραδείγματα συνολοθεωρητικών πράξεων.


Ποδοσφαιριστές

Ας θεωρήσουμε ένα παιχνίδι ποδοσφαίρου, για παράδειγμα ανάμεσα στις ομάδες Milan1 και Real.2
Στο παράδειγμά μας, έχουμε δύο σχέσεις με τους ποδοσφαιριστές των δύο ομάδων:
M ilan(number, name) και Real(number, name).
Οι δύο αυτές σχέσεις, που έχουν συμβατότητα τύπου, περιγράφουν το αριθμό της φανέλας με
τον οποίο αγωνίζεται κάθε ποδοσφαιριστής και το όνομά του. Η χρήση τους είναι πολύ απλή:
βοηθούν τον αθλητικό δημοσιογράφο που καλύπτει τον αγώνα να διακρίνει κάθε ποδοσφαιριστή από
το νούμερο της φανέλας του.
Στο συγκεκριμένο αγώνα, οι πλειάδες των δύο δύο σχέσεων δεν έχουν επικάλυψη: δεν υπάρχει
δηλαδή κανείς ποδοσφαιριστής που να εμφανίζεται και στις δύο σχέσεις. Δεν μπορεί ένας ποδοσφαι-
ριστής, στον ίδιο αγώνα, να αγωνιστεί και με τις δύο ομάδες.
Η ένωση των δύο σχέσεων:
M ilan ∪ Real
μας δίνει το σύνολο των ποδοσφαιριστών που συμμετέχουν στον ποδοσφαιρικό αγώνα, είτε από την
μία ομάδα, είτε από την άλλη. Το αποτέλεσμα είναι το ίδιο με την ένωση:

Real ∪ M ilan

Η σειρά εμφάνισης δεν παίζει κάποιο ρόλο. Λόγω της αντιμεταθετικής ιδιότητας, ισχύει:

M ilan ∪ Real = Real ∪ M ilan

Η τομή των δύο σχέσεων:


M ilan ∩ Real
1
http://en.wikipedia.org/wiki/A.C._Milan
2
http://en.wikipedia.org/wiki/Real_Madrid_C.F.
10 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

θα επιστρέψει το κενό σύνολο. Αυτό γίνεται επειδή καμία πλειάδα της σχέσης M ilan δεν ταυτίζεται
με κάποια πλειάδα της σχέση Real.
Το ίδιο θα συμβεί και με την τομή:
Real ∩ M ilan
θα αποδώσει επίσης το κενό σύνολο, καμία πλειάδα της Real δεν ταυτίζεται με κάποια από της
πλειάδες της M ilan. Το γεγονός αυτό συνοψίζεται με την ισχύ της αντιμεταθετικής ιδιότητας:

M ilan ∩ Real = Real ∩ M ilan

Αν η τομή δύο σχέσεων είναι το κενό σύνολο, τότε η διαφορά των δύο σχέσεων δεν έχει κάποιο
νόημα. Για παράδειγμα:
M ilan − Real = M ilan
όπως επίσης και:
Real − M ilan = Real
Δηλαδή, αν από τους ποδοσφαιριστές της M ilan αφαιρέσουμε τους ποδοσφαιριστές της Real, θα
μας μείνουν οι ποδοσφαιριστές της M ilan. Το ίδιο θα συμβεί και με την ανάποδη σειρά, αν από
τους ποδοσφαιριστές της Real αφαιρέσουμε τους ποδοσφαιριστές της M ilan, θα μας μείνουν οι
ποδοσφαιριστές της Real.
Στη συγκεκριμένη, ακραία, αυτή περίπτωση, ισχύει:

M ilan − Real = M ilan − Real

Το γεγονός αυτό δεν πρέπει να σας μπερδεύει, η ισχύς της παραπάνω σχέσης οφείλεται στη συγκε-
κριμένη περίπτωση και δεν θα πρέπει να γενικευτεί σε άλλες περιπτώσεις. Στη σχεσιακή πράξη της
διαφοράς, γενικά, δεν ισχύει η αντιμεταθετική ιδιότητα.
Διαχρονική καταγραφή των ποδοσφαιριστών των δύο ομάδων.
Ας γενικεύσουμε τώρα το παράδειγμα, ως προς τη χρονική του διάσταση. Ας μην περιοριστούμε
στη διάρκεια ενός παιχνιδιού, αλλά ας καταγράψουμε στις δύο σχέσεις τους ποδοσφαιριστές των δύο
ομάδων σε μια μεγάλη χρονική διάρκεια, για παράδειγμα κατά την τελευταία δεκαετία.
Σε αυτή την περίπτωση, η πληθικότητα των δύο σχέσεων θα είναι αρκετά μεγαλύτερη: περίπου 20–
22 παίκτες ποδοσφαίρου συμμετέχουν από κάθε ομάδα σε ένα παιχνίδι, κάθε ομάδα ωστόσο αλλάζει
περίπου 3–8 παίκτες κάθε περίοδο. Σε μια δεκαετία, μια ομάδα ενδέχεται να έχουν συμμετάσχει
περίπου 50–100 ποδοσφαιριστές. ΄Ενα μικρό δείγμα δεδομένων παρουσιάζεται στο σχήμα 1.13.

number name number name


806 Marek Jankulovski 205 Claude Makélélé
705 Kaká 108 Raúl Albiol
580 Alessandro Nesta 705 Kaká
322 Andriy Shevchenko 203 Xabi Alonso
M ilan Real

Σχήμα 1.13: Ποδοσφαιριστές της Milan και της Real. Εδώ δίνεται ένα μικρό μόνο
δείγμα δεδομένων. Ο αριθμός (number) είναι ένας αυθαίρετος κωδικός αρίθμησης των
ποδοσφαιριστών και δεν έχει σχέση με τη φανέλα του ποδοσφαιριστή σε ένα συγκεκριμένο
παιχνίδι. Το σχήμα παρουσιάζει ποιοι παίκτες έχουν παίξει με τις δύο ομάδες, ως ιστορικός
πίνακας. Κάποιοι παίκτες δεν αγωνίζονται πλέον.
1.3. Συνολοθεωρητικές πράξεις 11

Επίσης υπάρχει και ένα άλλο ενδεχόμενο: κάποιοι ποδοσφαιριστές αλλάζουν ομάδα. Ενδέχεται
λοιπόν κάποιος ποδοσφαιριστής της M ilan να έχει εμφανιστεί, κάποια άλλη περίοδο, ως παίκτης
της Real. Μπορεί βέβαια να συμβεί και το ανάποδο. Μία τέτοια περίπτωση είναι ο βραζιλιάνος
ποδοσφαιριστής Kaká ο οποίος έχει αγωνιστεί και με τις δύο ομάδες.
Αν λοιπόν δεν ισχύει ο περιορισμός ενός ποδοσφαιρικού αγώνα, όπου κάθε ποδοσφαιριστής συμμε-
τέχει σε μία μόνο ομάδα, αλλά εξεταστούν οι συμμετοχές των ποδοσφαιριστών σε ομάδες για μια
μεγάλη χρονική περίοδο. τότε όλες οι απαντήσεις που δώσαμε πριν πρέπει να εξεταστούν εκ νέου.
Ας δούμε πρώτα την ένωση. Δηλαδή:

M ilan ∪ Real

Το αποτέλεσμα της ένωσης, για το δείγμα δεδομένων, απεικονίζεται στο σχήμα 1.14. Οι πλειάδες
των δύο σχέσεων ενώνονται, στο αποτέλεσμα εμφανίζονται όλοι οι παίκτες. Ωστόσο, κάθε παίκτης
εμφανίζεται μία φορά. Για παράδειγμα, ο Kaká εμφανίζεται μία φορά στο αποτέλεσμα.

number name
806 Marek Jankulovski
705 Kaká
580 Alessandro Nesta
322 Andriy Shevchenko
205 Claude Makélélé
108 Raúl Albiol
203 Xabi Alonso
M ilan ∪ Real

Σχήμα 1.14: ΄Ενωση των σχέσεων M ilan και Real, όπως απεικονίζονται στο
σχήμα 1.13. Στο αποτέλεσμα εμφανίζονται οι ποδοσφαιριστές που έχουν αγωνιστεί ε-
ίτε με τη Milan είτε με την Real.

Η τομή των σχέσεων M ilan και Real:

M ilan ∩ Real

θα δώσει ως αποτέλεσμα τις κοινές πλειάδες των δύο σχέσεων, δηλαδή τους ποδοσφαιριστές που
έχουν αγωνιστεί και με τις δύο ομάδες.
Το αποτέλεσμα απεικονίζεται στο σχήμα 1.15. Για το συγκεκριμένο δείγμα δεδομένων, μόνο ο
βραζιλιάνος Kaká έχει αγωνιστεί και με τις δύο ομάδες, οπότε η πλειάδα <505, Kaká> υπάρχει στο
αποτέλεσμα της τομής.

number name
705 Kaká
M ilan ∪ Real

Σχήμα 1.15: Τομή των σχέσεων M ilan και Real, όπως απεικονίζονται στο σχήμα 1.15.
Στο αποτέλεσμα εμφανίζονται οι ποδοσφαιριστές που έχουν αγωνιστεί και με τη Milan
και με την Real.
12 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

Η διαφορά των σχέσεων M ilan και Real θα μας δώσει στο αποτέλεσμα του ποδοσφαιριστές που
έχουν αγωνιστεί μόνο με την μία από τις δύο ομάδες.
Για παράδειγμα, η διαφορά:
M ilan − Real

θα επιστρέψει εκείνες τις πλειάδες της σχέσης M ilan οι οποίες δεν βρίσκονται στη σχέση Real,
δηλαδή τους ποδοσφαιριστές της Milan που δεν έχουν αγωνιστεί με την Real.
Ενώ η διαφορά:
Real − M ilan

θα επιστρέψει εκείνες τις πλειάδες της σχέσης Real οι οποίες δεν βρίσκονται στη σχέση M ilan,
δηλαδή τους ποδοσφαιριστές της Real οι οποίοι δεν έχουν αγωνιστεί με την M ilan.
Τα αποτελέσματα των δύο αυτών σχεσιακών πράξεων απεικονίζονται στο σχήμα 1.16. Παρατηρείστε
πως τα αποτελέσματα είναι διαφορετικά, κάτι που επιβεβαιώνει την μη ισχύ της αντιμεταθετικής
ιδιότητας στη σχεσιακή πράξη της διαφοράς.

number name number name


806 Marek Jankulovski 205 Claude Makélélé
580 Alessandro Nesta 108 Raúl Albiol
322 Andriy Shevchenko 203 Xabi Alonso
M ilan − Real Real − M ilan

Σχήμα 1.16: Διαφορά M ilan−Real και Real−M ilan. Ποδοσφαιριστές της Milan που
δεν έχουν αγωνιστεί με τη Real και ποδοσφαιριστές της Real που δεν έχουν αγωνιστεί
με την Milan, αντίστοιχα.

΄Ενα ενδιαφέρον αποτέλεσμα θα ήταν να είχαμε τους ποδοσφαιριστές των δύο ομάδων που δεν έχουν
αγωνιστεί με άλλη ομάδα. Δηλαδή την ένωση των πλειάδων της σχέσης M ilan και Real χωρίς
τον συνυπολογισμό των κοινών τους πλειάδων. Στο συγκεκριμένο παράδειγμα του σχήματος 1.13,
όλους τους ποδοσφαιριστές, εκτός του βραζιλιάνου Kaká που έχει αγωνιστεί και με τις δύο ομάδες.
Στη σχεσιακή άλγεβρα αυτό μπορεί πολύ εύκολα να υπολογιστεί ως εξής:

(M ilan ∪ Real) − (M ilan ∩ Real) (1.13)

Δηλαδή, από την ένωση των σχέσεων M ilan και Real αφαιρούμε την τομή των των σχέσεων M ilan
και Real. Το αποτέλεσμα θα είναι αυτό του σχήματος 1.17.

Ταινιοθήκη

Ας υποθέσουμε ένα φανταστικό σενάριο, μιας και το θέμα αυτής της ενότητας έχει να κάνει με τον
κινηματογράφο.
Βρισκόμαστε στα 1955, στην Ιταλία. Εκείνη την εποχή δύο ταινίες του παραγωγού (και σεναριο-
γράφου) Marcello Girosi έχουν κάνει μεγάλη επιτυχία: η ταινία Pane, amore e fantasia3 και η ταινία
Pane, amore e gelosia.4
3
http://www.imdb.com/title/tt0046159
4
http://www.imdb.com/title/tt0047327
1.3. Συνολοθεωρητικές πράξεις 13

number name
806 Marek Jankulovski
580 Alessandro Nesta
322 Andriy Shevchenko
205 Claude Makélélé
108 Raúl Albiol
203 Xabi Alonso
M ilan ∪ Real

Σχήμα 1.17: ΄Ενωση των των σχέσεων M ilan και Real, με αποκλεισμό των κοινών
πλειάδων, όπως υπολογίστηκαν με βάση τη σχέση 1.13.

Το σχήμα 1.18 δείχνει ένα αντιπροσωπευτικό δείγμα από τους ηθοποιούς που εμφανίστηκαν στις
δύο ταινίες. Οι δύο σχέσεις έχουν από δύο γνωρίσματα, το κωδικό κάθε ηθοποιού5 και το όνομά
του.
Η σχέση f για την ταινία Pane, amore e fantasia:

f (actoID, name) (1.14)

Η σχέση g για την ταινία Pane, amore e gelosia:

g(actoID, name) (1.15)

actorID name actorID name


0001120 Vittorio De Sica 0001120 Vittorio De Sica
0518178 Gina Lollobrigida 0518178 Gina Lollobrigida
0581028 Marisa Merlini 0581028 Marisa Merlini
0139214 Memmo Carotenuto 0139214 Memmo Carotenuto
0728376 Roberto Risso 0681365 Tina Pica
0681365 Tina Pica 0882237 Saro Urzì
0188022 Vittoria Crispo 0188022 Vittoria Crispo
f g

Σχήμα 1.18: Ηθοποιοί που εμφανίστηκαν στις ταινίες Pane, amore e fantasia (δεξιά)
και Pane, amore e fantasia (αριστερά). Το σχήμα δείχνει μέρος μόνο των ηθοποιών που
εμφανίστηκαν. Το δείγμα ωστόσο είναι αντιπροσωπευτικό και επαρκεί πλήρως για τις
ανάγκες του παραδείγματος της ενότητας.

Το 1955 θα κυκλοφορήσει και η τρίτη ταινία της τριλογίας, η ταινία Pane, amore e...6
Υποθετικά, ας βρεθούμε με τη φαντασία μας στην Ιταλία του 1955, πριν το γύρισμα της τρίτης ταινίας
της τριλογίας «Pane, amore». Λίγο πριν το γύρισμα της τρίτης ταινίας της τριλογίας «Pane, amore»
υπάρχουν προτάσεις για αλλαγές στη σύνθεση των ηθοποιών. Μερικές από τις προτάσεις φαίνονται
στο σχήμα 1.19.
5
΄Οπως δίνονται από την IMDB, http://www.imdb.com
6
http://www.imdb.com/title/tt0050817
14 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

Η σχέση e για την ταινία Pane, amore e...:

e(actoID, name) (1.16)

actorID name
0001120 Vittorio De Sica
0000047 Sophia Loren
0655833 Lea Padovani
0681365 Tina Pica
0139213 Mario Carotenuto

Σχήμα 1.19: Προτεινόμενες συμμετοχές στην ταινία Pane, amore e...

Ας υποθέσουμε λοιπόν πως κάνουμε μια μελέτη για τις τρεις αυτές ταινίες.
Οι ηθοποιοί που έχουν παίξει στις δύο πρώτες ταινίες μπορούν να βρεθούν με την ένωση των σχέσεων
f και g:
f ∪g
Το αποτέλεσμα της ένωσης φαίνεται στο σχήμα 1.20.

actorID name
0001120 Vittorio De Sica
0518178 Gina Lollobrigida
0581028 Marisa Merlini
0139214 Memmo Carotenuto
0728376 Roberto Risso
0681365 Tina Pica
0188022 Vittoria Crispo
0882237 Saro Urzì

Σχήμα 1.20: Ηθοποιοί των δύο πρώτων ταινιών της τριλογίας «Pane, amore».

Πολλοί ηθοποιοί έχουν εμφανιστεί και στις δύο ταινίες, όπως φαίνεται στο σχήμα 1.18. Ωστόσο,
στο αποτέλεσμα της ένωσης, σχήμα 1.20, κάθε ηθοποιός εμφανίζεται μόνο μία φορά.
Υπάρχουν αρκετοί ηθοποιοί που εμφανίστηκαν και στις δύο ταινίες. Αυτοί μπορούν να βρεθούν από
την τομή:
f ∩g

Το αποτέλεσμα της τομής φαίνεται στο σχήμα 1.21 το οποίο απεικονίζει τους ηθοποιούς που εμφα-
νίστηκαν στις δύο πρώτες ταινίες της τριλογίας «Pane, amore». Κάποιοι από τους ηθοποιούς της
ταινίας Pane, amore e fantasia δεν εμφανίζονται στο αποτέλεσμα γιατί δεν έχουν συμμετοχή στην
ταινία Pane, amore e gelosia. Το ίδιο συμβαίνει και για κάποιους από τους ηθοποιούς της ταινίας
Pane, amore e gelosia, δεν εμφανίζονται στο αποτέλεσμα γιατί δεν έχουν παίξει στην ταινία Pane,
amore e fantasia.
Ας δούμε τώρα τι συμβαίνει με τους ηθοποιούς της τρίτης ταινίας (Pane, amore e...). Οι ηθοποιοί
της που έχουν παίξει σε κάποια από τις δύο πρώτες ταινίες είναι:
e ∩ (f ∪ g)
1.3. Συνολοθεωρητικές πράξεις 15

actorID name
0001120 Vittorio De Sica
0518178 Gina Lollobrigida
0581028 Marisa Merlini
0139214 Memmo Carotenuto
0681365 Tina Pica
0188022 Vittoria Crispo

Σχήμα 1.21: Ηθοποιοί των δύο πρώτων ταινιών της τριλογίας «Pane, amore» που
εμφανίστηκαν και στις δύο ταινίες.

actorID name
0001120 Vittorio De Sica
0681365 Tina Pica

Σχήμα 1.22: Ηθοποιοί της τρίτης ταινίας της τριλογίας «Pane, amore» που εμφανίστη-
καν σε κάποια από τις δύο πρώτες δύο ταινίες.

Το αποτέλεσμα φαίνεται στο σχήμα 1.22. Η διαπίστωση μπορεί να γίνει εύκολα συγκρίνοντας τα
σχήματα 1.18 και 1.19.
Χρειάζεται προσοχή στη διατύπωση της παράστασης σχεσιακής άλγεβρας. Για παράδειγμα, η αλλαγή
των παρενθέσεων:
(e ∩ f ) ∪ g

θα δώσει τελείως διαφορετικό αποτέλεσμα: Στους κοινούς ηθοποιούς των δύο πρώτων ταινιών (τομή)
προσθέτουμε (ένωση) τους ηθοποιούς της τρίτης ταινίας. Το αποτέλεσμα φαίνεται στο σχήμα 1.23.

actorID name
0001120 Vittorio De Sica
0518178 Gina Lollobrigida
0581028 Marisa Merlini
0139214 Memmo Carotenuto
0681365 Tina Pica
0188022 Vittoria Crispo
0000047 Sophia Loren
0655833 Lea Padovani
0139213 Mario Carotenuto

Σχήμα 1.23: Αποτέλεσμα της σχεσιακής πράξης (e ∩ f ) ∪ g.

Μπορούμε επίσης να βρούμε τους ηθοποιούς της τρίτης ταινίας που δεν έχουν εμφανιστεί σε καμία
από τις δύο πρώτες:
e − (f ∪ g)
16 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

actorID name
0000047 Sophia Loren
0655833 Lea Padovani
0139213 Mario Carotenuto

Σχήμα 1.24: Αποτέλεσμα της σχεσιακής πράξης (e ∩ f ) ∪ g.

Το αποτέλεσμα φαίνεται στο σχήμα 1.24, το οποίο απεικονίζει τους ηθοποιούς της ταινίας Pane,
amore, e... που δεν εμφανίστηκαν ούτε στην ταινία Pane, amore, e fantasia ούτε στην ταινία Pane,
amore, e gelosia.
Η αλλαγή της θέσης των παρενθέσεων θα δώσει εσφαλμένο αποτέλεσμα, παρόμοιο με αυτό που
είδαμε λίγο παραπάνω.
΄Ενα άλλο συχνό λάθος είναι η χρήση της τομής αντί της ένωσης:

e − (f ∩ g)

Το ερώτημα αυτό θα επιστρέψει στο αποτέλεσμα τους ηθοποιούς της τρίτης ταινίας που δεν έχουν
εμφανιστεί και στις δύο προηγούμενες ταινίες. Προσοχή, το λάθος δεν είναι γραμματικό, είναι
εννοιολογικό και αναφέρεται στη συγκεκριμένη ερώτηση.
Λεπτές διαφορές στη διατύπωση του ερωτήματος απαιτούν διαφορετική διατύπωση στην παράσταση
σχεσιακής άλγεβρας. Με τον ίδιο τρόπο, μικρές διαφορές στην παράσταση σχεσιακής άλγεβρας
(τελεστές, παρενθέσεις, κ.λπ.) προκαλούν αλλαγή στο αποτέλεσμα, στην ουσία απαντούν σε άλλο
ερώτημα.
Τέλος, μπορούμε να βρούμε τους κοινούς ηθοποιούς και των τριών ταινιών:

f ∩ g cape

actorID name
0001120 Vittorio De Sica
0681365 Tina Pica

Σχήμα 1.25: Ηθοποιοί που εμφανίστηκαν σε όλες τις ταινίες της τριλογίας «Pane,
amore».

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

(f ∩ g) ∩ e = f ∩ (g ∩ e)

Προτιμήσεις καταναλωτή

Μια συνοικιακή πιτσαρία δέχεται παραγγελίες πίτσας μέσω μηνυμάτων κινητού τηλεφώνου (SMS).
Τα μηνύματα επεξεργάζονται μέσω Η/Υ και οι παραγγελίες προωθούνται προς εκτέλεση.
Τρία διαδοχικά απογεύματα, η πιτσαρία δέχθηκε παραγγελίες από τον ίδιο πελάτη.
Το περιεχόμενο της κάθε παραγγελίας φαίνεται στο σχήμα 1.26.
1.3. Συνολοθεωρητικές πράξεις 17

product product product


Margarita Calzone Calzone
Napolitana Napolitana Napolitana
Beer Beer Lasagne
order1 order2 order3

Σχήμα 1.26: Τρεις παραγγελίες πελατών μιας πιτσαρίας.

Ο υπεύθυνος πωλήσεων της πιτσαρίας ζητά τη βοήθειά σας για την ανάλυση αυτών των παραγγελι-
ών.7
Τι είναι κοινό σε όλες τις παραγγελίες; Αυτό είναι ένα ερώτημα ένωσης:
order1 ∪ order2 ∪ order3

Το αποτέλεσμα της ένωσης φαίνεται στο σχήμα 1.27.

product
Margarita
Napolitana
Beer
Calzone
Lasagne

Σχήμα 1.27: Το αποτέλεσμα της ένωσης τριών παραγγελιών της πιτσαρίας: order1 ∪
order2 ∪ order3.

Τι κοινό έχουν και οι τρεις παραγγελίες; Αυτό είναι ένα ερώτημα τομής:
order1 ∩ order2 ∩ order3

Το αποτέλεσμα της τομής φαίνεται στο σχήμα 1.28.

product
Napolitana

Σχήμα 1.28: Το αποτέλεσμα της τομής των τριών παραγγελιών της πιτσαρίας: order1∩
order2 ∩ order3.

Τι υπάρχει στην τρίτη παραγγελία, που δεν υπάρχει στις δύο πρώτες; Αυτό είναι ένα ερώτημα
διαφοράς:
order3 − (order1 ∪ order2)

Το αποτέλεσμα της διαφοράς φαίνεται στο σχήμα 1.29.


7
Μην παρασύρεστε από την απλότητα του συγκεκριμένου παραδείγματος. Η ανάλυση παραγγελιών και
πωλήσεων είναι στοιχειώδης λειτουργία κάθε σοβαρής επιχείρησης στις μέρες μας. Κάτι τέτοιο απαιτεί
βέβαια πολύ περισσότερες λειτουργίες από τα απλά παραδείγματα που δίνουμε εδώ. Δείτε το κεφάλαιο ;; για
περισσότερες λεπτομέρειες.
18 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

product
Lasagne

Σχήμα 1.29: Τα προϊόντα της τρίτης παραγγελίας που δεν υπήρχαν στις πρώτες δύο
παραγγελίες.

Τι υπάρχει στην πρώτες δύο παραγγελίες που δεν υπάρχει στην τρίτη; Αυτό είναι ένα ερώτημα
διαφοράς:
(order1 ∪ order2) − order3)

Το αποτέλεσμα της διαφοράς φαίνεται στο σχήμα 1.30.

product
Beer

Σχήμα 1.30: Τα προϊόντα των πρώτων δύο παραγγελιών που δεν υπήρχαν στην τρίτη
παραγγελία.

Συμπέρασμα: Ο πελάτης παραγγέλνει σταθερά πίτσα «Ναπολιτάνα», αλλά φαίνεται να εγκαταλείπει


την παραγγελία μπύρας.

1.4 Οι βασικές πράξεις προβολής και επιλογής

1.4.1 Προβολή
Προβολή μιας σχέσης r, με σχήμα R, πάνω στο υποσύνολο γνωρισμάτων της X (Q ⊆ R) είναι
μια σχέση με σχήμα το σύνολο X και κορμό εκείνες τις πλειάδες που αντιστοιχούν σε μοναδικές
τιμές για τα γνωρίσματα X.
Ορισμός της προβολής:
r[X] = {t[X] | t ∈ r} (1.17)

Με απλά λόγια, η προβολή μιας σχέσης, προκύπτει από την αφαίρεση κάποιων γνωρισμάτων της
και την απαλοιφή των πιθανών διπλότυπων εγγραφών από τις πλειάδες που προκύπτουν. Γιατί είναι
πιθανό να συμβεί αυτό; Μα επειδή από τη λίστα γνωρισμάτων της προβολής μπορεί ενδεχομένως να
λείπει το πρωτεύον ή άλλο υποψήφιο κλειδί.
Η προβολή συμβολίζεται με το ελληνικό γράμμα Π:

ΠA1 ,A2 ,...,Am (r)

Είναι δυνατόν να μην υπάρχει κανένα γνώρισμα στη λίστα γνωρισμάτων, και τότε υπονοείται πως
η προβολή γίνεται σε όλα τα γνωρίσματα. Σε αυτή την περίπτωση έχουμε τη λεγόμενη ταυτοτική
προβολή. Η προβολή δηλαδή μιας σχέσης στον εαυτό της, η οποία συμβολίζεται απλά με όνομα της
σχέσης: Π(r)
Αυτό σημαίνει, πως το όνομα μιας σχέσης, είναι από μόνο του μια σχεσιακή παράσταση.
1.4. Οι βασικές πράξεις προβολής και επιλογής 19

A B C A B A B C
B C B
5 a 30 5 a 5 a 30
a 30 a
2 b 10 2 b 2 b 10
b 10 b
3 c 20 3 c 3 c 20
c 20 c
5 b 10 5 b 5 b 10

r ΠA,B (r) ΠB,C (r) ΠB (r) Π(r)

Σχήμα 1.31: Παραδείγματα προβολής.

Μερικά παραδείγματα προβολής φαίνονται στο σχήμα 1.31. Ας τα δούμε ένα-ένα. Στην πρώτη
περίπτωση, ΠA,B (r), έχουμε:
A B
5 a
ΠA,B (r) = 2 b
3 c
5 b
Δηλαδή, από τα γνωρίσματα της σχέσης r επιλέγονται τα A, B και παραλείπεται το γνώρισμα C. Από
τις πλειάδες της σχέσης r μένουν στο αποτέλεσμα όσες, για τα γνωρίσματα A, B έχουν μοναδικές
τιμές.
Στην δεύτερη περίπτωση του σχήματος 1.31, ΠB,C (r), έχουμε:

B C
a 30
ΠB,C (r) =
b 10
c 20
Δηλαδή, από τα γνωρίσματα της σχέσης r επιλέγονται τα B, C και παραλείπεται το γνώρισμα A. Από
τις πλειάδες της σχέσης r μένουν στο αποτέλεσμα όσες, για τα γνωρίσματα B, C, έχουν μοναδικές
τιμές. Παρατηρείστε ότι η πλειάδα hb, 10i υπάρχει μία φορά στο αποτέλεσμα.
Στην τρίτη περίπτωση του σχήματος 1.31, ΠB (r), έχουμε:

B
a
ΠB (r) =
b
c
Δηλαδή, από τα γνωρίσματα της σχέσης r επιλέγεται το γνώρισμα B και παραλείπονται τα γνω-
ρίσματα A, C. Από τις πλειάδες της σχέσης r μένουν στο αποτέλεσμα όσες, για το γνώρισμα B,
έχουν μοναδικές τιμές. Παρατηρείστε ότι η πλειάδα hbi υπάρχει μία φορά στο αποτέλεσμα.
Στην τελευταία περίπτωση του σχήματος 1.31, Π(r), έχουμε την ταυτοτική προβολή:

A B C
5 a 30
ΠB (r) = 2 b 10
3 c 20
5 b 10
Δηλαδή, από τα γνωρίσματα της σχέσης r επιλέγονται όλα τα τα γνωρίσματα.
Η SQL χρησιμοποιεί τη φράση:
20 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

1 SELECT λίστα πεδίων


2 FROM παράσταση πίνακα

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

1 SELECT *
2 FROM πίνακας

1.4.2 Επιλογή
Η επιλογή ή αλλιώς και περιορισμός μιας σχέσης r(R), είναι μια σχέση που έχει το ίδιο σχήμα R με
τη σχέση r και κορμό ένα υποσύνολο του κορμού της r που ικανοποιεί μια συνθήκη, πχ: X θ Y .
Η επιλογή συμβολίζεται με:
A W HERE X θ Y
ή αλλιώς: σcondition (r), όπου η συνθήκη περιορισμού είναι μια παράσταση που μπορεί να αποτιμηθεί
σε TRUE, FALSE ή NULL. Οι παραστάσεις μπορούν επίσης να περιέχουν τους λογικούς τελεστές
AND ∧, OR ∨ και NOT ¬.
Ο τελεστής θ μπορεί να είναι ένας από =, 6=, <, ≤, >, ≥. Η τιμή ενός γνωρίσματος μπορεί να
συγκριθεί με την τιμή ενός άλλου γνωρίσματος, ή με μια κυριολεκτική τιμή, ή ακόμα και με μια άλλη
σχεσιακή παράσταση που αποδίδει κάποια τιμή (εμφώλευση ερωτημάτων).
Αν φ είναι μια παράσταση που χρησιμοποιεί τελεστές σύγκρισης ή/και λογικούς τελεστές, τότε η
επιλογή μπορεί να οριστεί ως:
Ορισμός της επιλογής:
σφ (r) = {t ∈ r | t satisfies φ} (1.18)

Η SQL υποστηρίζει την πράξη της επιλογή με την προσθήκη της φράσης WHERE:

1 SELECT λίστα πεδίων


2 FROM παράσταση πίνακα
3 WHERE συνθήκη

empid name salary


101 Αθανασίου Μιχ. 1200
102 Βαφειάδης Νικ. 1150
104 Νικολοπούλου Ναν. 1570
108 Βασιλειάδη Μαρ. 1320

Σχήμα 1.32: Οι υπάλληλοι μιας εταιρείας, δείγμα δεδομένων.

Για παράδειγμα αν έχουμε τη σχέση employees(empid, name, salary) των υπαλλήλων που κατα-
γράφει τον κωδικό, το όνομα και το μισθό τους (σε €), όπως φαίνεται στο σχήμα 1.32, τότε μπορούμε
να γράψουμε παραστάσεις όπως:
1.4. Οι βασικές πράξεις προβολής και επιλογής 21

1. Να βρεθούν οι υπάλληλοι με μισθό μικρότερο από 1300 €:

σsalary<1300 (employees)

empid name salary


101 Αθανασίου Μιχ. 1200
102 Βαφειάδης Νικ. 1150

2. Να βρεθούν οι υπάλληλοι με μισθό μεταξύ 1200 και 1600 €:

σsalary≥1200∧salary≤1600 (employees)

empid name salary


101 Αθανασίου Μιχ. 1200
104 Νικολοπούλου Ναν. 1570
108 Βασιλειάδη Μαρ. 1320

3. Να βρεθεί ο υπάλληλος με κωδικό 102:

σempid=102 (employees)

empid name salary


102 Βαφειάδης Νικ. 1150

1.4.3 Παραδείγματα και ασκήσεις προβολής και επιλογής


Στην ενότητα αυτή θα δούμε παραδείγματα προβολής και επιλογής. Για τα παραδείγματα θα χρησι-
μοποιήσουμε τη σχέση employees με σχήμα:

employees(empid, f irstname, lastname, depid, salary, hiredate)

που περιγράφει τους υπαλλήλους μιας εταιρείας. Μέρος από τα περιεχόμενα του πίνακα δίνεται στον
πίνακα1.1. Τα πλήρη δεδομένα δίνονται στον πίνακα ;;, της σελίδας ;;.

Πίνακας 1.1: Μέρος από τα περιεχόμενα του πίνακα employees. Δείτε τον πίνακα ;; της
σελίδας ;; για πλήρη απεικόνιση.

empid firstname lastname depid salary hiredate


102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02
109 Μαρία Αθανασίου 1 2787.69 2000-01-26
153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15
172 Χρήστος Βλάσσης 3 1101.70 2000-07-04
189 Θεόδωρος Αγγελίνας 6 1908.28 2000-06-19
... ... ... ... ... ...
22 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

Στα παραδείγματα θα δούμε πράξεις προβολής, επιλογής ή και συνδυασμούς των δύο πράξεων.
Εκεί όπου το αποτέλεσμα έχει περισσότερες από 5 πλειάδες (εγγραφές πίνακα) οι επιπλέον πλειάδες
δείχνονται με τρεις τελείες, κάτι που υπονοεί πως υπάρχουν υπάρχουν επιπλέον πλειάδες. Η αποκοπή
γίνεται καθαρά για λόγους οικονομίας χώρου.
Οι απαντήσεις στα ερωτήματα δίνονται επίσης στα κεφάλαια ;;–;; με τη γλώσσα SQL. ΄Ετσι μπορείτε
να συνδυάσετε τις γνώσεις σας στη σχεσιακή άλγεβρα με τη γλώσσα ερωτημάτων SQL.

1. Να βρεθεί το επώνυμο των υπαλλήλων:

Πsalary (employees)

2. Να βρεθεί το όνομα και το επώνυμο όλων των υπαλλήλων:

Πf irstname,lastname (employees)

3. Να βρεθούν οι υπάλληλοι με μισθό μεγαλύτερο του 1500:

σsalary>1500 (employees)

4. Να βρεθεί το όνομα και το επώνυμο όλων των υπαλλήλων που παίρνουν μισθό μεγαλύτερο
από 1500:

Πf irstname,lastname (σsalary>1500 (employees))

5. Να βρεθεί το ονοματεπώνυμο και ο μισθός όλων των υπαλλήλων που εργάζονται στο τμήμα
με κωδικό 2:

Πf irstname,lastname,salary (σdepid=2 (employees))

6. Να βρεθεί το ονοματεπώνυμο, το τμήμα και ο μισθός όλων των υπαλλήλων που που εργάζονται
σε τμήμα με κωδικό διαφορετικό του 1:

Πf irstname,lastname,depid,salary (σdepid<>1 (employees))

7. Να βρεθεί το όνομα και ο κωδικός των υπαλλήλων που προσλήφθηκαν πριν από την 1/8/2000:

Πf irstname,lastname,empid (σhiredate<0 2000−08−010 (employees))

8. Να βρεθεί το επώνυμο και ο μισθός του υπαλλήλου με κωδικό 109 μετά την αύξηση 5% στο
μισθό του:
Πlastname,salary∗1.05 (σempid=109 (employees))
1.5. Συζεύξη 23

9. Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων με μισθό μεγαλύτερο του 1200 ή με μισθό
μικρότερο του 1600:

σsalary>1200∨salary<1600 (employees)

10. Να βρεθεί ο κωδικός, το όνομα, ο μισθό, και το τμήμα όλων των υπαλλήλων του τμήματος 2,
αλλά και των υπαλλήλων από άλλα τμήματα με μισθό στο εύρος [1330, 1630):

σ(salary>1330∧salary<1630)∨depid=2 (employees)

11. Να βρεθούν οι υπάλληλοι (κωδικός, επώνυμο, τμήμα) που εργάζονται στο τμήμα 2 και παίρνουν
μισθό μικρότερο από 1200


Πempid,lastname,depid σ(depid=2∨salary<1200 (employees)

12. Να βρεθούν οι υπάλληλοι που δεν εργάζονται στα τμήματα 2, 3, 4:


σ¬(depid=2∨depid=3∨depid=4) (employees)

1.5 Συζεύξη

1.5.1 Φυσική σύζευξη


Η σύζευξη μοιάζει με το γινόμενο, ωστόσο έχει μια σημαντική διαφορά: οι πλειάδες του αποτε-
λέσματος δεν είναι όλοι οι πιθανοί συνδυασμοί, αλλά μόνο οι συνδυασμοί που ικανοποιούν κάποια
συνθήκη. Υπάρχουν διάφορες παραλλαγές συζεύξεων, με σημαντικότερη και περισσότερο διαδε-
δομένη τη σύζευξη ισότητας, ή αλλιώς φυσική σύζευξη, η οποία στηρίζεται στην παρουσία κοινών
γνωρισμάτων στις δύο σχέσεις.
Αν η r είναι σχέση με σχήμα R = {X, Y } και s είναι σχέση με σχήμα S = {Y, Z}, τότε η φυσική
σύζευξη των r και s είναι μια σχέση με σχήμα R ∪ S = {X, Y, Z} και κορμό το σύνολο των
συνδυασμών των πλειάδων της r και s για τις οποίες οι τιμές στο κοινό γνώρισμα Y ταυτίζονται.
Δηλαδή, μια πλειάδα της r, θα συνδυαστεί με μια πλειάδα της s, αν και μόνο αν, οι τιμές στο κοινό
γνώρισμα Y ταυτίζονται μεταξύ τους. Η φυσική σύζευξη των σχέσεων r και s συμβολίζεται με
r ./ s, ή r N AT U RAL JOIN s, ή απλά r JOIN s.
Ορισμός της φυσικής σύζευξης:

r ./ s = {t | υπάρχουν πλειάδες u ∈ r και v ∈ s έτσι ώστε t[R] = u και t[S] = v} (1.19)

Τα σύμβολα X, Y, Z δηλώνουν σύνολα γνωρισμάτων. Επομένως σύζευξη μπορεί να γίνει με περισ-


σότερα από ένα γνωρίσματα, αν το Y για παράδειγμα, αποτελείται από δύο ή περισσότερα γνωρίσματα.
Το σχήμα 1.33 απεικονίζει ένα παράδειγμα σύζευξης. Μπορούμε να παρατηρήσουμε τα εξής:

1. Οι σχέσεις r με σχήμα R = {A, B, C} και s με σχήμα {C, D} έχουν ένα κοινό γνώρισμα, το
C. Σύμφωνα με τα παραπάνω μπορούμε να πούμε πως X = {A, B}, Y = {C} και Z = {D}.
24 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

A B C C D A B C D
1 b 10 20 1 1 b 10 3
5 a 30 10 3 3 c 20 1
3 c 20 20 3 3 c 20 3
r s r ./ s

Σχήμα 1.33: Παράδειγμα σχεσιακής σύζευξης: r ./ s.

2. Το σχήμα της σχέσης που προκύπτει από τη σύζευξη r ./ s είναι R ∪ S = {A, B, C, D}.
Προσοχή, το S υπάρχει μία φορά ως γνώρισμα στο σχήμα της σχέσης που προκύπτει από τη
σύζευξη.

3. Κάθε πλειάδα της r ενώνεται με την αντίστοιχη πλειάδα της s, όταν οι τιμές στο κοινό γνώριμα
C ταυτίζονται.

4. Η πλειάδα h1, b, 10i της r ενώνεται με την πλειάδα h10, 3i της s γιατί οι τιμές στο κοινό
γνώρισμα C ταυτίζονται.

5. Η πλειάδα h5, a, 30i της r δεν ενώνεται με καμία πλειάδα της s γιατί οι τιμές στο κοινό
γνώρισμα C δεν ταυτίζονται.

6. Η πλειάδα h3, c, 20i της r ενώνεται με δύο πλειάδες της s γιατί υπάρχουν δύο πλειάδες της r,
h20, 1i και h20, 3i , για τις οποίες οι τιμές στο κοινό γνώρισμα C ταυτίζονται.

Για τη φυσική σύζευξη δεν ισχύει η αντιμεταθετική ιδιότητα:

r ./ s 6= s ./ r (1.20)

εκτός και αν ακολουθείται από κάποια προβολή:


Σύζευξη και αντιμεταθετική ιδιότητα:

ΠL (r ./ s) = ΠL (s ./ r) (1.21)

όπου L είναι λίστα γνωρισμάτων, L ⊆ (X ∪ Y ∪ Z).


Ισχύει ωστόσο η προσεταιριστική ιδιότητα:
Σύζευξη και προσεταιριστική ιδιότητα:

r ./ (s ./ t) = (r ./ s) ./ t (1.22)

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

r ./ s ./ t = r ./ s ./ t (1.23)

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

1 SELECT *
2 FROM πίνακας1 NATURAL JOIN πίνακας2
1.5. Συζεύξη 25

Η σύζευξη μπορεί να εκφραστεί ως παράγωγη πράξη του γινομένου και της επιλογής.
Σύζευξη ως καρτεσιανό γινόμενο :

r ./0 s = σφ (r × s) (1.24)

όπου φ η συνθήκη σύζευξης: ^


φ= R.Y = S.Y
Y ∈R∪S

A B C C D A B R.C S.C D A B C D
1 b 10 20 1 1 b 10 10 3 1 b 10 3
5 a 30 10 3 3 c 20 20 1 3 c 20 1
3 c 20 20 3 3 c 20 20 3 3 c 20 3
0
r s r ./ s r ./ s

Σχήμα 1.34: Παράδειγμα σχεσιακής σύζευξης: r ./ s ως συνδυασμός γινομένου και


επιλογής r ./0 s. Το κοινό γνώρισμα, μετά τη μετονομασία σε R.C και S.C, υπάρχει δύο
φορές στο αποτέλεσμα r ./0 s.

΄Ενα παράδειγμα σύζευξης ως συνδυασμού γινομένου και επιλογής φαίνεται στο σχήμα 1.34. Πα-
ρατηρείστε ότι το κοινό γνώρισμα C στις δύο σχέσεις r και s του σχήματος 1.34 εμφανίζεται δύο
φορές στο αποτέλεσμα του γινομένου, με διαφορετικό όνομα που προκύπτει από τη συνένωση του
ονόματος της σχέσης και του ονόματος του γνωρίσματος: R.C και S.C αντίστοιχα. Αν θέλουμε να
απαλειφθεί η διπλή εμφάνιση του γνωρίσματος R.C από το αποτέλεσμα, πρέπει να χρησιμοποιήσουμε
τη σχεσιακή πράξη της προβολής (Π).
Μπορούμε έτσι να δώσουμε έναν ακόμα εναλλακτικό ορισμό της φυσικής σύζευξης. Αν Y =
{A1 , A2 , . . . , An } είναι τα κοινά γνωρίσματα στα δύο σχήματα R, S, των σχέσεων r και s αντίστοιχα,
τότε η φυσική σύζευξης μπορεί να οριστεί και ως:
Φυσικής σύζευξη:

r ./ s = ΠR∪S (σR.A1 =S.A2 ∧R.A1 =S.A2 ...∧R.An =S.An (r × s))} (1.25)

Υπάρχουν περιπτώσεις όπου ανάμεσα σε δύο σχέσεις r και s δεν υπάρχει κανένα κοινό γνώρισμα.
Τότε το αποτέλεσμα της φυσικής σύζευξη ισούται με το καρτεσιανό γινόμενο:
Αν για δύο σχέσεις r(R) και s(S) ισχύει R ∩ S = Ø, τότε

r ./ s = r × s (1.26)

1.5.2 Σύζευξη θήτα


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

(r × s) W HERE X θ Y
26 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

όπου X, Y ο τελεστής θ δεν είναι κατά ανάγκη ισότητα. Προσέξτε ότι τα γνωρίσματα που εμπλέκον-
ται στη σύζευξη πρέπει να έχουν κοινό πεδίο ορισμού.
Αν η r είναι σχέση με σχήμα {A1 , A2 , . . . , An }, s είναι σχέση με σχήμα {B1 , B2 , . . . , Bm }, τα
γνωρίσματα Ai και Bj έχουν το ίδιο πεδίο ορισμού, και θ είναι τελεστής σύγκρισης, θ ∈ {=, 6=, <
, ≤, >, ≥}, τότε η θ σύζευξη των R και S, R ./Ai θBj S, είναι μια σχέση με σχήμα το σύνολο των
γνωρισμάτων των R και S, {A1 , A2 , . . . , An B1 , B2 , . . . , Bm } και κορμό το σύνολο των πλειάδων
από κάθε συνδυασμό των πλειάδων των R και S, που ικανοποιούν τη συνθήκη Ai θBj .
Το αποτέλεσμα είναι μια σχέση με βαθμό m + n, και πληθικότητα ανάμεσα στο 0 και στο nR × nS .
Αν κάποια πλειάδα έχει τιμή NULL στο γνώρισμα που συμμετέχει στη σύζευξη (Ai ή Bj ), τότε
δεν συμμετέχει στο αποτέλεσμα. Με αυτή την έννοια το αποτέλεσμα της σύζευξης, ενδεχομένως,
περιέχει λιγότερη πληροφορία, από ότι οι επιμέρους σχέσεις.
Αν ο τελεστής θ είναι το = τότε η σύζευξη καλείται ισοσύζευξη, και πρακτικά είναι φυσική
σύζευξη.
Ορισμός της σύζευξης θ:
r ./θ s = {σθ r × s} (1.27)

A B C C D A B R.C S.C D
A B R.C S.C D
1 b 10 20 1 1 b 10 10 3
5 a 30 10 3
5 a 30 10 3 3 c 20 20 1
3 c 20 10 3
3 c 20 20 3 3 c 20 20 3
r s r ./R.C=S.C s r ./R.C>S.C s

Σχήμα 1.35: Παράδειγμα σχεσιακής σύζευξης θ: r ./R.C=S.C s και r ./R.C>S.C s.

1.5.3 Πλήρης εξωτερική σύζευξη


Η εξωτερική σύζευξη είναι επέκταση της σύζευξης ανάμεσα σε δύο σχέσεις, στην περίπτωση που
υπάρχουν πλειάδες στη μία σχέση, χωρίς ταιριαστές τιμές στην άλλη σχέση στο γνώρισμα (ή τα
γνωρίσματα) της σύζευξης. Η εξωτερική σύζευξη δίνει αποτέλεσμα ό,τι και η εσωτερική, αλλά
και κάτι επιπλέον: πλειάδες από τη μία ή την άλλη σχέση που δεν έχουν ταιριαστές τιμές με την
άλλη σχέση. Αν υπάρχουν τέτοιες πλειάδες, τότε θα εμφανιστούν στο αποτέλεσμα της εξωτερικής
σύζευξης, αλλά όχι στο αποτέλεσμα της φυσικής ή εσωτερικής σύζευξης.
Η εξωτερική σύζευξη μπορεί να είναι πλήρης εξωτερική σύζευξη, αριστερή εξωτερική σύζευξη ή
δεξιά αριστερή σύζευξη. Θα εξετάσουμε πρώτα την πλήρη εξωτερική σύζευξη και στις δύο επόμενες
υποενότητες την αριστερή και δεξιά εξωτερική σύζευξη.
Για παράδειγμα θεωρείστε τις δύο σχέσεις του σχήματος 1.36, που παριστάνουν ένα δείγμα από
τα υποκαταστήματα (b, branches) και τους πελάτες (c, customers) μιας εταιρείας. Χρησιμοποιούμε
μια απλουστευμένη έκδοση της αντίστοιχης βάσης δεδομένων, όπου μόνο για τους πελάτες δίνονται
μόνο το όνομα και η πόλη είναι ορατά για τους πελάτες. Επίσης, μόνο η πόλη και ο αντίστοιχος
κωδικός δίνονται για τα υποκαταστήματα.
΄Εστω πως θέλουμε να βρούμε το αποτέλεσμα της εξωτερικής σύζευξης των δύο σχέσεων με βάση
την πόλη:
b ./ c
Το αποτέλεσμα της εξωτερικής σύζευξης b ./ c φαίνεται στο σχήμα 1.36. Για λόγους σύγκρισης
δίνεται επίσης το αποτέλεσμα της φυσικής σύζευξης. Μπορούμε να παρατηρήσουμε τα εξής:
1.5. Συζεύξη 27

name city
id city
Νίκος Πάτρα
1 Αθήνα
Βάσω Κοζάνη
2 Πάτρα
Αγγελική Πάτρα
3 Θεσσαλονίκη
Βασίλης Αθήνα
Υποκαταστήματα (b) Πελάτες (c)

id city name
id city name
1 Αθήνα Βασίλης
2 Πάτρα Νίκος 1 Αθήνα Βασίλης
2 Πάτρα Αγγελική 2 Πάτρα Νίκος
3 Θεσσαλονίκη NULL 2 Πάτρα Αγγελική
NULL NULL Βάσω
Εξωτερική σύζευξη b ./ c Φυσική σύζευξη b ./ c

Σχήμα 1.36: Πελάτες και υποκαταστήματα μιας εταιρείας

1. Για τις δύο σχέσεις, b και c, γίνεται σύζευξη με βάση την τιμή στο γνώρισμα city, που είναι
κοινό στις δύο σχέσεις. Οπότε ουσιαστικά γίνεται λόγος για φυσική σύζευξη. Το σχήμα της
σχέσης b ./ c είναι το ίδιο με αυτό της φυσικής σύζευξης. Στο αποτέλεσμα της εξωτερικής
σύζευξης b ./ c υπάρχουν όλες οι πλειάδες που υπάρχουν και στο αποτέλεσμα της φυσικής
σύζευξης b ./ c.

2. Υπάρχει το υποκατάστημα 3 στη Θεσσαλονίκη, ενώ δεν υπάρχει κανείς πελάτης από τη Θεσ-
σαλονίκη. Το υποκατάστημα 3 δεν θα εμφανιστεί στο αποτέλεσμα μιας φυσικής ή εσωτερικής
σύζευξης. Εμφανίζεται ωστόσο στο αποτέλεσμα της εξωτερικής σύζευξης.

3. Υπάρχει η πελάτης με όνομα Βάσω από την Κοζάνη, χωρίς στην πόλη αυτή να υπάρχει υπο-
κατάστημα. Η Βάσω δεν θα εμφανιστεί στο αποτέλεσμα μιας φυσικής ή εσωτερικής σύζευξης.
Εμφανίζεται ωστόσο στο αποτέλεσμα της εξωτερικής σύζευξης.

4. Τα υποκαταστήματα σε Αθήνα και Πάτρα θα εμφανιστούν στο αποτέλεσμα μιας φυσικής ή


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

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

6. Το αποτέλεσμα της εξωτερικής σύζευξης θα περιέχει όλες τις πλειάδες της εσωτερικής σύζευ-
ξης, καθώς και επιπλέον τις πλειάδες που πιθανώς δεν έχουν ταιριαστές τιμές. Τέτοιες είναι
το υποκατάστημα στη Θεσσαλονίκη και η πελάτης με όνομα Βάσω.

7. Οι πλειάδες της μίας σχέσης, που δεν έχουν ταιριαστές τιμές στην άλλη σχέση, θα συμπλη-
ρώσουν με τιμές NULL τα γνωρίσματα των σχέσεων (πεδία στους πίνακες) στο αποτέλεσμα
της εξωτερικής σύζευξης. ΄Ετσι η πλειάδα h3, Θεσσαλονίκηi της σχέσης b (υποκατάστημα)
θα υπάρχει στο αποτέλεσμα της εξωτερικής σύζευξης, όμως θα έχει τιμές NULL στα γνω-
ρίσματα της σχέσης c (Πελάτες). Επίσης, η πλειάδα hΒάσω, Κοζάνηi Βάσω, θα υπάρχει στο
αποτέλεσμα της εξωτερικής σύζευξης, αλλά με τιμές NULL στα γνωρίσματα της σχέσης b
(Υποκατάστημα).
28 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

Αν r είναι σχέση με σχήμα R = {X, Y } και s είναι μία σχέση με σχήμα S = {Y, Z}, τότε η
εξωτερική σύζευξη t = r ./ s έχει σχήμα T = {X, Y, Z} και κορμό που αποτελείται από τις
πλειάδες:

r ./ s = (r ./ s) ∪ ((r − ΠR (r ./ s)) × w1 ) ∪ w2 × ((s − ΠS (r ./ s)) (1.28)

όπου w1 είναι μία σχέση με σχήμα R − S και μία πλειάδα με τιμές {null, null, . . . , null}, και
w2 είναι μία σχέση με σχήμα S − R και μία πλειάδα με τιμές {null, null, . . . , null}.

1.5.4 Αριστερή εξωτερική σύζευξη


Η αριστερή εξωτερική σύζευξη μοιάζει με την εξωτερική σύζευξη, αλλά έχει μια διαφορά: μόνο
οι αταίριαστες πλειάδες της αριστερής σχέσης υπάρχουν στο αποτέλεσμα. Δηλαδή, υπάρχουν στο
αποτέλεσμα οι ταιριαστές πλειάδες ανάμεσα στις δύο σχέσεις, αυτές δηλαδή που προέρχονται από
τη φυσική σύζευξη, καθώς και όλες οι πλειάδες της αριστερής σχέσης που δεν έχουν τιμή σύζευξης
με τη δεξιά σχέση. Τα γνωρίσματα της δεξιάς σχέσης συμπληρώνονται στο αποτέλεσμα με τιμές
NULL.
Αν r είναι σχέση με σχήμα R = {X, Y } και s είναι μία σχέση με σχήμα S = {Y, Z}, τότε η
αριστερή εξωτερική σύζευξη t = r ./ s έχει σχήμα T = {X, Y, Z} και κορμό που αποτελείται
από τις πλειάδες:
r ./ s = (r ./ s) ∪ ((r − ΠR (r ./ s)) × w) (1.29)
όπου w είναι μία σχέση με σχήμα R − S και μία πλειάδα με τιμές {null, null, . . . , null}.
Η αριστερή εξωτερική σύζευξη (ή απλώς αριστερή σύζευξη):

r ./ s

έχει σαν αποτέλεσμα μια σχέση με:

• Σχήμα όμοιο αυτό της φυσικής σύζευξης r × s.

• Κορμό τις πλειάδες που προκύπτουν από την ένωση των πλειάδων:
– της φυσικής σύζευξης r ./ s
– όλων των πλειάδων της r (αριστερής σχέσης) που δεν είναι στο αποτέλεσμα της φυσικής
σύζευξης, με NULL τιμές στα γνωρίσματα της s (δεξιάς σχέσης)

1.5.5 Δεξιά εξωτερική σύζευξη


΄Οπως και η από αριστερά εξωτερική σύζευξη, έτσι και η από δεξιά εξωτερική σύζευξη, μοιάζει με
την εξωτερική σύζευξη. Στη περίπτωση αυτή μόνο οι αταίριαστες πλειάδες της από δεξιά σχέσης
υπάρχουν στο αποτέλεσμα. Δηλαδή, υπάρχουν στο αποτέλεσμα οι ταιριαστές πλειάδες ανάμεσα στις
δύο σχέσεις, αυτές δηλαδή που προέρχονται από τη φυσική σύζευξη, και όλες οι πλειάδες της από
δεξιά σχέσης, που δεν έχουν τιμή σύζευξης με τη δεξιά σχέση. Τα γνωρίσματα της δεξιάς σχέσης,
συμπληρώνονται στο αποτέλεσμα με τιμές NULL.
Αν r είναι σχέση με σχήμα R = {X, Y } και s είναι μία σχέση με σχήμα S = {Y, Z}, τότε η
δεξιά εξωτερική σύζευξη t = r ./ s έχει σχήμα T = {X, Y, Z} και κορμό που αποτελείται από
τις πλειάδες:
r ./ s = (r ./ s) ∪ w × ((s − ΠS (r ./ s)) (1.30)
όπου w είναι μία σχέση με σχήμα S − R και μία πλειάδα με τιμές {null, null, . . . , null}.
1.6. Διαίρεση 29

name city
id city
Νίκος Πάτρα
1 Αθήνα
Βάσω Κοζάνη
2 Πάτρα
Αγγελική Πάτρα
3 Θεσσαλονίκη
Βασίλης Αθήνα
Υποκαταστήματα (b) Πελάτες (c)

id city name
id city name
1 Αθήνα Βασίλης
1 Αθήνα Βασίλης
2 Πάτρα Νίκος
2 Πάτρα Νίκος
2 Πάτρα Αγγελική
2 Πάτρα Αγγελική
3 Θεσσαλονίκη NULL
Αριστερή σύζευξη b ./ c Φυσική σύζευξη b ./ c

Σχήμα 1.37: Αριστερή εξωτερική σύζευξη ανάμεσα στα υποκαταστήματα (b) και τους
πελάτες (c) μιας εταιρείας.

Περισσότερο επεξηγηματικά, μπορούμε να πούμε πως η δεξιά εξωτερική σύζευξη (ή απλώς


δεξιά σύζευξη):
r ./ s
έχει σαν αποτέλεσμα μια σχέση με :

• Σχήμα όμοιο με αυτό της φυσικής σύζευξης r ./ s.

• Κορμό τις πλειάδες που προκύπτουν από την ένωση των πλειάδων:
– της φυσικής σύζευξης r ./ s
– όλων των πλειάδων της s (δεξιάς σχέσης) που δεν είναι στο αποτέλεσμα της φυσικής
σύζευξης, με NULL τιμές στα γνωρίσματα της r (αριστερής σχέσης)

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

r ./ s = s ./ r

Το σχήμα 1.38 δείχνει ένα παράδειγμα δεξιάς εξωτερικής σύζευξης. Για λόγους σύγκρισης πα-
ρατίθεται επίσης το αποτέλεσμα της φυσικής σύζευξης των δύο σχέσεων. Παρατηρείστε πως στο
αποτέλεσμα της δεξιάς σύζευξης r ./ s υπάρχουν όλες οι πλειάδες της φυσικής σύζευξης r ./ s.
Υπάρχουν επίσης η πλειάδα της s hΒάσω, Κοζάνηi για την οποία δεν υπάρχει ταιριαστή πλειάδα στην
σχέση r. Το γνώρισμα id συμπληρώνεται με τιμή NULL στο αποτέλεσμα της δεξιάς σύζευξης.

1.6 Διαίρεση
Η διαίρεση είναι μια πολύ ενδιαφέρουσα πράξη. Μοιάζει με τη διαίρεση στην άλγεβρα αριθμών, με
την έννοια πως έχει διαιρετέο και διαιρέτη. Το αποτέλεσμά της είναι μια σχέση με (γενικά) λιγότερα
γνωρίσματα από το διαιρετέο (όσα τα γνωρίσματα του διαιρέτη), και (γενικά) λιγότερες πλειάδες (το
30 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

name city
id city
Νίκος Πάτρα
1 Αθήνα
Βάσω Κοζάνη
2 Πάτρα
Αγγελική Πάτρα
3 Θεσσαλονίκη
Βασίλης Αθήνα
Υποκαταστήματα (b) Πελάτες (c)

id city name
id city name
1 Βασίλης Αθήνα
1 Αθήνα Βασίλης
2 Νίκος Πάτρα
2 Πάτρα Νίκος
2 Αγγελική Πάτρα
2 Πάτρα Αγγελική
NULL Βάσω Κοζάνη
Δεξιά σύζευξη b ./ c Φυσική σύζευξη b ./ c

Σχήμα 1.38: Δεξιά εξωτερική σύζευξη ανάμεσα στα υποκαταστήματα (b) και τους
πελάτες (c) μιας εταιρείας.

πολύ όσες έχει ο διαιρέτης). Από τη σχέση διαιρετέου αφαιρούνται εκείνα τα γνωρίσματα που δεν
υπάρχουν στο διαιρέτη, και εκείνες οι πλειάδες του διαιρετέου που δεν αντιστοιχούν στο διαιρέτη. Ο
διαιρέτης της σχεσιακής πράξης της διαίρεσης με απλά λόγια «οδηγεί» το διαιρετέο σε ένα συνδυασμό
προβολής (λιγότερα γνωρίσματα) και περιορισμού (λιγότερες πλειάδες).
Το πλέον συνηθισμένο πεδίο εφαρμογής της διαίρεσης είναι σε πράξεις αναζήτησης δεδομένων με
τη φράση «όλα», με αναφορά σε δύο σχέσεις (πίνακες). Οι δύο σχέσεις (διαιρετέος και διαιρέτης)
έχουν τουλάχιστον ένα κοινό γνώρισμα, το οποίο δεν εμφανίζεται στο αποτέλεσμα.
Ορισμός της διαίρεσης:
Αν η r είναι σχέση με σχήμα R = {X, Y } και s είναι μια σχέση με σχήμα S = {Y }, δηλαδή
S ⊆ R, τότε, το αποτέλεσμα της διαίρεσης t = r ÷ s, είναι μια σχέση t με σχήμα {X}. Δηλαδή,
η t είναι μια σχέση με σχήμα τη διαφορά R − S = {X}, δηλαδή εκείνα τα γνωρίσματα της r
που δεν ανήκουν στην s.
Ο κορμός της t αποτελείται από εκείνες τις πλειάδες της σχέσης r για οποίες τα (κοινά) γνω-
ρίσματα {X} των σχέσεων r και s έχουν τιμές που ταυτίζονται. Μια πλειάδα t, με γνωρίσματα
R − S = {X}, ανήκει στο αποτέλεσμα όταν:

1. t ∈ ΠR−S (r)

2. ∀ ts ∈ s, ∃ tr ∈ r έτσι ώστε:
• tr [S] = ts [S]
• tr [R − S] = t

Δείτε το παράδειγμα του σχήματος 1.39, που αναπαριστά τη διαίρεση: Σ = A ÷ Π. Σε μια


σχολική τάξη, διάφοροι μαθητές παίρνουν μέρος σε αθλήματα. Στο επόμενο σχολικό πρωτάθλημα,
περιλαμβάνονται τα αθλήματα ποδοσφαίρου και στίβου. Η διαίρεση: Αθλούνται προς Πρωτάθλημα,
βρίσκει εκείνους τους μαθητές που θα πάρουν μέρος σε όλα τα αγωνίσματα του πρωταθλήματος (και
στο στίβο και στο ποδόσφαιρο). Ας εξετάσουμε το αποτέλεσμα, βήμα προς βήμα:

• Διαιρετέος είναι η σχέση Αθλούνται και διαιρέτης η σχέση Πρωτάθλημα ). Το αποτέλεσμα


είναι η σχέση Συμμετοχή. Δηλαδή:
1.6. Διαίρεση 31

΄Ονομα ΄Αθλημα ΄Αθλημα ΄Ονομα


Νίκος Ποδόσφαιρο Ποδόσφαιρο Νίκος
Ανδρέας Κολύμπι Στίβος Βασίλης
Βασίλης Στίβος
Ανδρέας Ποδόσφαιρο
Χρήστος Κολύμπι
Βασίλης Ποδόσφαιρο
Νίκος Στίβος
Γιώργος Ποδόσφαιρο
Χρήστος Στίβος
(αʹ) Αθλούνται (βʹ) Πρωτάθλημα (γʹ) Συμμετοχή

Σχήμα 1.39: Παράδειγμα διαίρεσης. Η σχέση Συμμετοχή προκύπτει από τη διαίρεση


της σχέσης Αθλούνται με τη σχέση Πρωτάθλημα.

Συμμετοχή = Αθλούνται ÷ Πρωτάθλημα

• Το αποτέλεσμα έχει σχήμα τη διαφορά των σχημάτων των δύο σχέσεων. Η σχέση Συμμετοχή
έχει στο σχήμα της εκείνα τα γνωρίσματα της σχέσης Αθλούνται, που δεν υπάρχουν στη
σχέση Πρωτάθλημα, δηλαδή αφαιρείται το γνώρισμα ΄Αθλημα και στο αποτέλεσμα μένει μόνο
το γνώρισμα ΄Ονομα.

• Για το κορμό της σχέσης Συμμετοχή, πρέπει να βρεθούν εκείνες οι πλειάδες της σχέσης Αθλο-
ύνται, για τις οποίες το ΄Αθλημα υπάρχει στις πλειάδες που αντιστοιχούν σε όλες τις πλειάδες
της σχέση Πρωτάθλημα. Δηλαδή, θα ληφθούν τα ονόματα των μαθητών που αθλούνται σε
όλα τα αθλήματα τα οποία υπάρχουν στη λίστα αθλημάτων για το πρωτάθλημα.

• Ακόμα πιο απλά, θέλουμε εκείνες τις πλειάδες της σχέσης Π΄Ονομα (΄Αθλούνται) για τις ο-
ποίες υπάρχει πλήρης αντιστοίχηση, μέσω της σχέσης Π΄Αθλημα (΄Αθλούνται), με τις πλειάδες
της σχέσης Π΄Αθλημα (Πρωτάθλημα): τα ονόματα των μαθητών που συμμετέχουν σε όλα τα
αθλήματα.

• Ο Νίκος συμμετέχει στο πρωτάθλημα, γιατί αγωνίζεται και στο ποδόσφαιρο στο στίβο, στα
δύο αθλήματα του πρωταθλήματος.

• Ο Ανδρέας συμμετέχει στο πρωτάθλημα, γιατί δεν αγωνίζεται στο ποδόσφαιρο, το οποίο είναι
στο πρωτάθλημα.

• Ο Βασίλης συμμετέχει στο πρωτάθλημα, γιατί αγωνίζεται και στο ποδόσφαιρο στο στίβο, στα
δύο αθλήματα του πρωταθλήματος.

• Ο Χρήστος δεν συμμετέχει στο πρωτάθλημα, γιατί δεν αγωνίζεται στο στίβο, το οποίο είναι
στο πρωτάθλημα.

• Ο Γιώργος δεν συμμετέχει στο πρωτάθλημα, γιατί δεν αγωνίζεται στο στίβο, το οποίο είναι
στο πρωτάθλημα.

Μπορούμε να κάνουμε κάποιες επιπλέον παρατηρήσεις. Ξεκινήσαμε με το ερώτημα «Να βρεθούν όλα
τα ονόματα που θα λάβουν μέρος στο πρωτάθλημα». Δεδομένα είναι δύο σχέσεις που περιέχουν τα
32 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

αθλήματα του πρωταθλήματος (διαιρέτης) και το άθλημα κάθε μαθητή (διαιρετέος). Δηλαδή έχουμε
δύο σχέσεις με ένα κοινό γνώρισμα. Το αποτέλεσμα είναι μια σχέση (Συμμετοχή) που προέρχεται
από το διαιρετέο (Αθλούνται) χωρίς το κοινό γνώρισμα ΄Αθλημα, δηλαδή το κοινό γνώρισμα διαιρε-
τέου και διαιρέτη. Από τις πλειάδες της σχέσης Αθλούνται μένουν στο αποτέλεσμα μόνο εκείνες για
τις οποίες η αντίστοιχη τιμή στο γνώρισμα ΄Αθλημα ταυτίζεται με όλες τις τιμές που υπάρχουν στη
σχέση Πρωτάθλημα. Ο Χρήστος, για παράδειγμα, που αθλείται μόνο στο κολύμπι, δεν συμμετέχει
στο πρωτάθλημα. Ο Νίκος συμμετέχει στο πρωτάθλημα, γιατί αγωνίζεται σε όλα τα αθλήματα του
πρωταθλήματος. Ο Ανδρέας που αγωνίζεται μόνο στο ποδόσφαιρο, αλλά όχι στο στίβο, δεν συμμε-
τέχει στο πρωτάθλημα. Παρατηρήστε επίσης ότι, ενώ κάποιοι αθλούνται σε δύο αθλήματα, κανείς
δεν έχει διπλή πλειάδα στο πρωτάθλημα.
Η διαίρεση είναι το αντίστροφο του γινομένου στην άλγεβρα των αριθμών, και το ίδιο μπορεί να
ειπωθεί για τη σχεσιακή άλγεβρα. ΄Ετσι, αν t = r ÷ s, τότε η σχέση t × s, έχει συμβατότητα τύπου
με την r.
Η διαίρεση είναι παράγωγη πράξη, και μπορεί να οριστεί με βάση άλλες σχεσιακές πράξεις. ΄Ενας
εναλλακτικός τρόπος να ορίσουμε τη διαίρεση δύο σχέσεων r και s με σχήματα R και S αντίστοιχα,
όταν S ⊂ R, είναι:
Ορισμός της διαίρεσης:

r ÷ s = ΠR−S (r) − ΠR−S ((ΠR−S (r) × s) − ΠR−S,S (r)) (1.31)

Αν πάρουμε ως R = {΄Ονομα, ΄Αθλημα} και S = {΄Αθλημα} των σχέσεων του σχήματος 1.39,
δηλαδή r = Αθλούνται και s = Πρωτάθλημα τότε ο παραπάνω ορισμός μπορεί να αναλυθεί ως εξής:

Αθλούνται ÷ Πρωτάθλημα = Π΄Ονομα (Αθλούνται)


−Π΄Ονομα ((Π΄Ονομα (Αθλούνται) × Πρωτάθλημα) − Π΄Ονομα, ΄Αθλημα (Αθλούνται))

Ας δούμε αναλυτικά πως αναλύεται η παραπάνω παράσταση:

1. Παίρνουμε την προβολή ΠR−S (r), δηλαδή:

Π{΄Ονομα, ΄Αθλημα}−{΄Αθλημα} (Αθλούνται),

που αντιστοιχεί στην προβολή των ονομάτων του πίνακα Αθλούνται του σχήματος 1.39. Ισχύει:

R − S = {΄Ονομα, Πρωτάθλημα} − {Πρωτάθλημα} = {΄Ονομα}

Η προβολή ΠR−S (r) = Π{΄Ονομα} (Πρωτάθλημα) θα επιστρέψει:

΄Ονομα
Νίκος
Ανδρέας
Βασίλης
Χρήστος
Γιώργος

Δηλαδή τα ονόματα (με απαλοιφή διπλοεγγραφών) των αθλητών.


1.6. Διαίρεση 33

2. Από το προηγούμενο αποτέλεσμα πρέπει να αφαιρέσουμε τις πλειάδες:

ΠR−S ((ΠR−S (r) × s) − ΠR−S,S (r))

ή:
Π΄Ονομα ((Π΄Ονομα (Αθλούνται) × Πρωτάθλημα) − Π΄Ονομα, ΄Αθλημα (Αθλούνται)

3. Το αποτέλεσμα ΠR−S (r) × s ή:

Π΄Ονομα (Αθλούνται) × Πρωτάθλημα

είναι ίσο με:

΄Ονομα ΄Αθλημα
Νίκος Ποδόσφαιρο
΄Ονομα Ανδρέας Ποδόσφαιρο
Βασίλης Ποδόσφαιρο
Νίκος ΄Αθλημα
Χρήστος Ποδόσφαιρο
Ανδρέας
Ποδόσφαιρο Γιώργος Ποδόσφαιρο
Βασίλης
Στίβος Νίκος Στίβος
Χρήστος
Ανδρέας Στίβος
Γιώργος
Βασίλης Στίβος
Χρήστος Στίβος
Γιώργος Στίβος

Π΄Ονομα (Αθλούνται) Πρωτάθλημα Π΄Ονομα (Αθλούνται) × Πρωτάθλημα

4. Η σχέση ΠR−S,S (r) είναι ίδια με την r. Αυτό που γίνεται είναι απλά μια πιθανή αναδιάταξη
των γνωρισμάτων της r έχει ώστε να έχει συμβατότητα τύπου με το γινόμενο ΠR−S (r) × s.
Δηλαδή, τοποθετούνται πρώτα τα γνωρίσματα της r που δεν ανήκουν στην s (R − S) και μετά
τα κοινά γνωρίσματα των r και s. Στην περίπτωσή μας αυτό είναι:

Π΄Ονομα, ΄Αθλημα (Αθλούνται)

Στη συγκεκριμένη περίπτωση η αναδιάταξη είναι περιττή. Το αποτέλεσμα είναι το ίδιο με αυτό
του σχήματος 1.39:

΄Ονομα ΄Αθλημα
Νίκος Ποδόσφαιρο
Ανδρέας Κολύμπι
Βασίλης Στίβος
Ανδρέας Ποδόσφαιρο
Χρήστος Κολύμπι
Βασίλης Ποδόσφαιρο
Νίκος Στίβος
Γιώργος Ποδόσφαιρο
Χρήστος Στίβος
34 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

Ωστόσο, η προβολή ΠR−S,S (r) πρέπει να γίνεται πάντοτε, ώστε να εξασφαλίζεται σίγουρα η
συμβατότητα τύπου για την επόμενη πράξη της αφαίρεσης.

5. Μπορούμε τώρα να κάνουμε την αφαίρεση (ΠR−S (r) × s) − ΠR−S,S (r) που στην περίπτωσή
μας αντιστοιχεί στην αφαίρεση:

(Π΄Ονομα (Αθλούνται) × ΄Αθλημα) − Π΄Ονομα, ΄Αθλημα (Αθλούνται)

Το αποτέλεσμα είναι:

΄Ονομα ΄Αθλημα
΄Ονομα ΄Αθλημα
Νίκος Ποδόσφαιρο
Νίκος Ποδόσφαιρο
Ανδρέας Ποδόσφαιρο
Ανδρέας Κολύμπι
Βασίλης Ποδόσφαιρο ΄Ονομα ΄Αθλημα
Βασίλης Στίβος
Χρήστος Ποδόσφαιρο
Ανδρέας Ποδόσφαιρο Χρήστος Ποδόσφαιρο
Γιώργος Ποδόσφαιρο
Χρήστος Κολύμπι Ανδρέας Στίβος
Νίκος Στίβος
Βασίλης Ποδόσφαιρο Γιώργος Στίβος
Ανδρέας Στίβος
Νίκος Στίβος
Βασίλης Στίβος
Γιώργος Ποδόσφαιρο
Χρήστος Στίβος
Χρήστος Στίβος
Γιώργος Στίβος

(ΠR−S (r) × s) ΠR−S,S (r) (ΠR−S (r) × s) − ΠR−S,S (r)

6. Η προβολή ΠR−S ((ΠR−S (r) × s) − ΠR−S,S (r)) που στην περίπτωσή μας είναι:

Π΄Ονομα ((Π΄Ονομα (Αθλούνται) × Πρωτάθλημα) − Π΄Ονομα, ΄Αθλημα (Αθλούνται))

θα δώσει το αποτέλεσμα:

΄Ονομα
Χρήστος
Ανδρέας
Γιώργος

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

7. Το τελικό αποτέλεσμα βρίσκεται από τη διαφορά:

Αθλούνται ÷ Πρωτάθλημα = Π΄Ονομα (Αθλούνται)


−Π΄Ονομα ((Π΄Ονομα (Αθλούνται) × Πρωτάθλημα) − Π΄Ονομα, ΄Αθλημα (Αθλούνται))
1.7. Σύνοψη και συναρτήσεις συνάθροισης 35

΄Ονομα
΄Ονομα
Νίκος ΄Ονομα
Ανδρέας Χρήστος
Νίκος
Βασίλης Ανδρέας
Βασίλης
Χρήστος Γιώργος
Γιώργος

Αθλούνται ÷ Πρωτάθλημα

1.7 Σύνοψη και συναρτήσεις συνάθροισης


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

area employee amount


Ημαθίας Ευθυμίου 10890
Μαγνησίας Αλεξανρίδης 2400
Καβάλας Αλεξανρίδης 780
Μαγνησίας Ευθυμίου 20100
Τρικάλων Πετρίδης 4400
Πιερίας Πετρίδης 1820
Καβάλας Ευθυμίου 2400

Σχήμα 1.40: Πινακοποιημένη μορφή της σχέσης sales με δείγμα δεδομένων

Θεωρείστε για παράδειγμα τη σχέση sales = {area, employee, amount} που κρατά στοιχεία για το
ύψος πωλήσεων που πετυχαίνουν εμπορικοί αντιπρόσωποι μιας εταιρείας. Δείγμα των δεδομένων
της σχέσης φαίνεται στο σχήμα 1.40. Εύκολα μπορεί να εξαχθεί το συμπέρασμα πως (τουλάχιστον
στο δείγμα) υπάρχουν 4 υπάλληλοι που δραστηριοποιούνται σε 5 νομούς.

1. Ποιο είναι το σύνολο (άθροισμα) των πωλήσεων σε όλους τους νομούς;

2. Ποιο είναι το άθροισμα των πωλήσεων ανά εμπορικό αντιπρόσωπο (υπάλληλο) της εταιρείας;

3. Επίσης, ποιο το πλήθος υπαλλήλων ανά νομό;

Τέτοιες, και άλλες πολλές (αλλά παρόμοιες) ερωτήσεις μπορούν να απαντήσουν τα ερωτήματα με τις
συναρτήσεις συνάθροισης, με ή χωρίς ομαδοποίηση.
Υπάρχουν 5 κύριες συναρτήσεις συνάθροισης:

• COUNT(), επιστρέφει πλήθος εγγραφών.

• SUM(), υπολογίζει και επιστρέφει το άθροισμα αριθμητικού γνωρίσματος,


36 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

• AVG(), υπολογίζει και επιστρέφει το μέσο όρο αριθμητικού γνωρίσματος,

• MIN(), επιστρέφει τη μικρότερη τιμή.

• MAX(), επιστρέφει τη μεγαλύτερη τιμή.

Για παράδειγμα, το άθροισμα όλων των πωλήσεων είναι:

Gsum(amount) (sales)

Στην SQL γράφεται:

1 SELECT SUM(amount)
2 FROM sales

Η τιμή που λαμβάνεται από το προηγούμενο ερώτημα είναι μία, και αντιστοιχεί στην απλή άθροιση των
τιμών του γνωρίσματος amount. Η χρήση της συναθροιστικής συνάρτησης SUM(), σε συνδυασμό
με την ομαδοποίηση ως προς κάποιο γνώρισμα, πχ το employees, μπορεί να δώσει απάντηση σε
περισσότερο πολύπλοκα ερωτήματα, όπως το να βρεθεί το σύνολο των πωλήσεων ανά υπάλληλο:

employee Gsum(amount) (sales)

΄Η στην SQL:

1 SELECT employee, SUM(amount)


2 FROM sales
3 GROUP BY employee;

Η παραπάνω σχεσιακή παράσταση μπορεί να αναλυθεί ως εξής:

1. Λαμβάνεται ο κορμός της σχέσης sales, δηλαδή όλες οι πλειάδες.

2. Ο αριστερός δείκτης employee από το καλλιγραφικό G, σημαίνει πως οι πλειάδες πρέπει να


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

3. Υπάρχουν 4 υπάλληλοι-πωλητές. Επομένως, ο κορμός της sales διαιρείται σε 4 υποσύνο-


λα. Καθένα από αυτά έχει την ίδια τιμή στο γνώρισμα employee. Δηλαδή, ένα υποσύνολο
πλειάδων για κάθε ένα υπάλληλο. Αυτό ακριβώς σημαίνει η φράση «ανά υπάλληλο»

4. Ο δεξιός δείκτης sum(amount) από το G (καλλιγραφικό G), σημαίνει πως στο σύνολο των
πλειάδων της sales θα υπολογιστεί το άθροισμα. Αφού έχει προηγηθεί διάσπαση σε 4 υπο-
σύνολα, το άθροισμα θα υπολογιστεί μία φορά για κάθε ένα υποσύνολο ξεχωριστά. Δηλαδή
θα υπολογιστούν 4 υπο-αθροίσματα: ένα για κάθε ξεχωριστό υπάλληλο.

5. Το αποτέλεσμα της σχεσιακής παράστασης έχει σχήμα το ({employee, sum(amount) }) και


κορμό τις 4 πλειάδες που αντιστοιχούν στα ονόματα των 4 υπαλλήλων και των 4 αθροισμάτων
στο ποσό των πωλήσεων, όπως φαίνεται στο σχήμα ;;.
1.8. Ενημέρωση 37

employee sum(amount)
Ευθυμίου 33390
Αλεξανρίδης 3180
Πετρίδης 6220
Σταθόπουλος 19500

Σχήμα 1.41: ΄Αθροισμα πωλήσεων ανά υπάλληλο

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

• Εισαγωγής δεδομένων στις σχέσεις, δηλαδή εισαγωγής μιας ή περισσοτέρων πλειάδων. Η


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

• Διαγραφής δεδομένων από τις σχέσεις, δηλαδή απαλοιφή μιας ή περισσότερων πλειάδων
της σχέσης. Η πληθικότητα της σχέσης μειώνεται μετά την διαγραφή.
• Τροποποίησης δεδομένων στις σχέσεις, δηλαδή αλλαγή στις τιμές των γνωρισμάτων μιας
σχέσης. Η πληθικότητα της σχέσης δεν μεταβάλλεται μετά την τροποποίηση.

Να έχετε πάντα υπ΄ όψη σας πως οι πράξεις ενημέρωσης είναι πράξεις συνόλων. Αυτό το οποίο
εισάγεται, διαγράφεται ή τροποποιείται είναι μια πλειάδα, δηλαδή ένα σύνολο από τιμές που αντιστοι-
χούν στα γνωρίσματα της σχέσης.

Κωδικός Τίτλος ΄Ετος


0083658 Blade Runner 1982
0034583 Casablanca 1942
0053779 La Dolce Vita 1960
0087884 Paris Texas 1984

Σχήμα 1.42: Πινακοποιημένη μορφή της σχέσης movies με δείγμα δεδομένων.

Δείτε για παράδειγμα το σχήμα 1.42, το οποίο παρουσιάζει ένα δείγμα δεδομένων από τη σχέση
movies = {Κωδικός, Τίτλος, ΄Ετος}. Με άλλα λόγια, έχουμε μια σχέση όπου αποθηκεύονται
στοιχεία για τον τίτλο και το έτος παραγωγής ταινιών. Μια συγκεκριμένη ταινία, σύμφωνα με το
σχεσιακό μοντέλο δεδομένων της σχέσης movies, είναι ένα σύνολο από τρεις τιμές, που αντιστοιχούν
στα τρία γνωρίσματα της σχέσης. ΄Ετσι κάθε ταινία, δηλαδή κάθε πλειάδα που αντιστοιχεί σε μία
ταινία, είναι ένα σύνολο τιμών. Η σχέση movies έχει ως σώμα ένα σύνολο από πλειάδες: όλες τις
ταινίες που περιέχει. Δηλαδή κάθε ταινία είναι ένα σύνολο τιμών, αλλά είναι και μέλος ενός συνόλου:
είναι μέλος όλων των πλειάδων της σχέσης movies.
Κάθε πράξη ενημέρωσης της βάσης (εισαγωγή, διαγραφή, τροποποίηση) αφορά πλειάδες μιας σχέσης
και όχι μεμονωμένες τιμές κάποιου γνωρίσματος. Επίσης οι πράξεις ενημέρωσης δεν μεταβάλλουν
το σχεσιακό σχήμα. Δεν προστίθενται, αφαιρούνται ή τροποποιούνται γνωρίσματα κάποιας σχέσης,
αλλά πλειάδες της σχέσης. Δηλαδή οι πράξεις ενημέρωσης αφορούν το σώμα μιας σχέσης, εδώ είναι
που γίνεται η ενημέρωση.
38 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

Ας δούμε τις τρεις πράξεις ενημέρωσης αναλυτικά.

1.8.1 Εισαγωγή
Η εισαγωγή δεδομένων στη βάση σημαίνει την εισαγωγή μιας πλειάδας σε κάποια σχέση. Θυμηθείτε
ότι η πλειάδα είναι ένα σύνολο τιμών που αντιστοιχούν στα γνωρίσματα μιας σχέσης. Επομένως
υπάρχει πάντα ο περιορισμός της σωστής αντιστοίχισης, καθώς επίσης και της σχεσιακής ακεραι-
ότητας δεδομένων: κάθε τιμή της πλειάδας πρέπει να ανήκει στο πεδίο ορισμού του γνωρίσματος. Η
πλειάδα προς εισαγωγή μπορεί να προκύψει είτε από νέα δεδομένα που εισάγει ο χρήστης της βάσης,
είτε από το αποτέλεσμα ενός ερωτήματος.
Γενικά, η εισαγωγή των E (σχεσιακής έκφρασης) στη σχέση r, γράφετε ως:

r ←r∪E

Για παράδειγμα η εισαγωγή της ταινίας Blade Runner του 1982 με κωδικό 0083658 γίνεται με
σχεσιακή πράξη:
movies ← movies ∪ {0083658, ’Blade Runner’, 1982}

Που σημαίνει πως η σχέση movies αποκτά μια νέα πλειάδα και η πληθικότητά της αυξάνεται κατά
μία μονάδα. Σε περίπτωση που υπάρξει κάποιο λάθος, όπως για παράδειγμα παραβίαση του κανόνα
πρωτεύοντος κλειδιού, τότε η εισαγωγή αποτυγχάνει συνολικά. Αυτό σημαίνει πως αποτυγχάνει
η εισαγωγή μιας πλειάδας στη σχέση, ή μιας εγγραφής στον πίνακα, και όχι η εισαγωγή κάποιας
τιμής ενός γνωρίσματος.
Στην SQL η εισαγωγή δεδομένων γίνεται με την εντολή INSERT. Για παράδειγμα:

1 INSERT
2 INTO movies (code, title, year)
3 VALUES (0083658, 'Blade Runner', 1982);

Κωδικός Τίτλος ΄Ετος


0083658 Blade Runner 1982
0034583 Casablanca 1942
0053779 La Dolce Vita 1960
0087884 Paris Texas 1984
The Pink Panther 1960

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

Για παράδειγμα θεωρείστε την πλειάδα h0053779, ’The Pink Panther’, 1963i που αντιστοιχεί στην
εισαγωγή της διάσημης (και πολύ αγαπημένης) κωμωδίας στη σχέση movies. Η απόπειρα εκτέλεσης
της πράξης:
movies ← movies ∪ {053779, ’The Pink Panther’, 1963}
1.8. Ενημέρωση 39

θα αποτύχει γιατί η τιμή 053779 που αντιστοιχεί στο πρωτεύον κλειδί, υπάρχει ήδη σε άλλη πλειάδα
της σχέσης movies. Αυτό που θα προκύψει είναι ένα μήνυμα λάθους από το Σύστημα Διαχείρισης
Βάσεων Δεδομένων, και όχι μια σχέση στο σώμα της οποίας υπάρχει μια πλειάδα χωρίς πρωτεύον
κλειδί. Το σχήμα 1.43 δεν θα προκύψει ως πίνακας μιας σχεσιακής βάσης ποτέ, και αναπαριστά με
εσφαλμένο τρόπο το αποτέλεσμα της εισαγωγής. ΄Ετσι λοιπόν, μετά από μια αποτυχημένη εισαγωγή
πλειάδων σε σχέση, δεν μεταβάλλεται η πληθικότητά της και η σχέση παραμένει όπως και πριν.

Σχήμα 1.44: Οι ταινίες σε έναν επεξεργαστή κειμένου. Καταχρηστικά, είναι δυνατή η


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

Αυτό είναι ένα πολύ συχνό λάθος των αρχάριων χρηστών των βάσεων δεδομένων: η εισαγωγή
δεδομένων δεν γίνεται ποτέ τιμή προς τιμή, όπως για παράδειγμα σε ένα λογιστικό φύλλο ή σε
έναν επεξεργαστή κειμένου, όπως φαίνεται στο σχήμα 1.44. Οι βάσεις δεδομένων λειτουργούν με
διαφορετικό τρόπο. ΄Οπως φαίνεται στο σχήμα 1.44, σε αυτά τα προγράμματα υπάρχει η δυνατότητα
καταχώρισης δεδομένων χωρίς τους ελέγχους του σχεσιακού μοντέλου. Πιθανότατα, όσοι από
εσάς έχετε δουλέψει σε αντίστοιχα περιβάλλοντα επεξεργασίας κειμένου, θα θυμάστε επίσης τη
διαδικασία αποθήκευσης των αλλαγών που κάνετε στο κείμενο, π.χ. με την εισαγωγή μίας επιπλέον
ταινίας. Στις βάσεις δεδομένων τίποτα τέτοιο δεν ισχύει. Αν μια πλειάδα εισαχθεί με επιτυχία, τότε
δεν χρειάζεται καμία επιπλέον ενέργεια, η έννοια της αποθήκευσης δεν υπάρχει! Αν αποτύχει η
εισαγωγή της πλειάδας, τότε καμία από τις τιμές δεν εισέρχεται στη βάση. Είτε θα εισαχθεί το
σύνολο των τιμών της πλειάδας, είτε τίποτα.

1.8.2 Διαγραφή
Η διαγραφή δεδομένων από τη βάση σημαίνει διαγραφή μιας (ή περισσότερων) πλειάδας σε κάποια
σχέση. ΄Οπως έχει ειπωθεί και στην προηγούμενη ενότητα για την Εισαγωγή δεδομένων, η πλειάδα
είναι σύνολο τιμών που αντιστοιχούν στα γνωρίσματα μιας σχέσης. Αυτό που διαγράφεται είναι το
σύνολο των τιμών που απαρτίζουν την πλειάδα, και όχι κάποια τιμή από την πλειάδα.
Γενικά, η διαγραφή των δεδομένων που προκύπτουν από μια σχεσιακή παράσταση E στη σχέση r,
γράφετε ως:
r ←r−E
40 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

Εδώ εννοείται πως η σχεσιακή παράσταση E έχει συμβατότητα τύπου με τη σχέση r. Η διαγραφή
δεδομένων, όπως είναι φανερό, εμπλέκει τη σχεσιακή πράξη της αφαίρεσης.
Για παράδειγμα η διαγραφή της ταινίας Blade Runner του 1982 με κωδικό 0083658 γίνεται με
σχεσιακή πράξη:
movies ← movies − σΚωδικός=0083658 (movies)

Η SQL χρησιμοποιεί την εντολή DELETE για να διαγράψει εγγραφές από πίνακες:

1 DELETE
2 FROM movies;

Αυτό χρειάζεται προσοχή, επειδή η παραπάνω εντολή διαγράφει όλες τις εγγραφές του πίνακα!
Η παρακάτω εντολή διαγράφει την ταινία Blade Runner του 1982 με κωδικό 0083658 αφήνοντας
ανέπαφες τις υπόλοιπες:

1 DELETE
2 FROM movies
3 WHERE code = 0083658;

΄Οπως και σε άλλες σχεσιακές πράξεις, η παράσταση E δεν είναι υποχρεωτικό να βασίζεται στο
πρωτεύον κλειδί. Για παράδειγμα, να διαγραφούν οι ταινίες με έτος παραγωγής μέχρι και το 1970:

movies ← movies − σ΄Ετος≤1970 (movies)

΄Η με την SQL:

1 DELETE
2 FROM movies
3 WHERE year <= 1970;

Η επιτυχής διαγραφή πλειάδων από τη σχέση έχει ως αποτέλεσμα τη μείωση της πληθικότητάς της.
Σε περίπτωση που σχεσιακή παράσταση E επιστρέψει κενό σύνολο, τότε η εφαρμογή της διαγραφής
δεν επηρεάζει καμία από τις πλειάδες της σχέσης. Αυτό σημαίνει πως η πληθικότητα της σχέσης θα
μείνει αμετάβλητη.

1.8.3 Τροποποίηση
Η τροποποίηση (UPDATE) αφορά την αλλαγή κάποιων τιμών μιας πλειάδας (ή και περισσότερων
πλειάδων). Μετά από κάθε πράξη τροποποίησης η πληθικότητα της σχέσης μένει αμετάβλητη: η
τροποποίηση ούτε αυξάνει, ούτε μειώνει τις πλειάδες μιας σχέσης. Απλά αλλάζει (τροποποιεί)
κάποιες τιμές σε κάποια από τα γνωρίσματα μιας σχέσης.
Για την τροποποίηση χρησιμοποιείται ο τελεστής γενικευμένης προβολής:

r ← ΠF1 ,F2 ,...,Fn (r)

όπου Fi , είναι είτε η τιμή ενός γνωρίσματος, αν δεν είναι στη λίστα τροποποίησης ή μια σχεσιακή
παράσταση που τροποποιεί τα δεδομένα της σχέσης.
1.8. Ενημέρωση 41

Αυτό βέβαια θα αλλάζει τα δεδομένα σε όλες τις πλειάδες μιας σχέσης, κάτι που γενικά δεν είναι
επιθυμητό. Είναι εξαιρετικά σπάνιο να επιβληθεί η ίδια τιμή σε κάποιο γνώρισμα, σε όλες τις πλειάδες
μιας σχέσης. Αν γνωρίζετε λεπτομέρειες από την ιστορία του σινεμά, θα έχετε παρατηρήσει πως
το σχήμα 1.42 εσφαλμένα δείχνει ως έτος παραγωγής της ταινίας Casablanca το 1952 (το σωστό
είναι 1942). Για να αλλάξει μια (εδώ λανθασμένη) τιμή σε κάποια άλλη χρειάζεται η πράξη της
τροποποίησης. Για παράδειγμα, η τροποποίηση:

movies ← ΠΚωδικός, Τίτλος, ΄Ετος=1942 (movies)

θα αλλάξει την χρονολογία παραγωγής στην τιμή 1942 σε όλες τις πλειάδες, δηλαδή για όλες τις
ταινίες. Στην SQL η τροποποίηση δεδομένων σε πίνακες της βάσης, γίνεται με την εντολή UPDATE:

1 UPDATE movies
2 SET year = 1942;

Η εφαρμογή αυτής της εντολής (ή της αντίστοιχης σχεσιακής πράξης) έχει ως αποτέλεσμα την ορθή
τροποποίηση της χρονολογίας παραγωγής της ταινίας Casablanca. Ωστόσο, έχει και ένα σοβαρό
μειονέκτημα: τη λανθασμένη τροποποίηση όλων των υπόλοιπων χρονολογιών, όπως φαίνεται στη
σχήμα 1.45.

Κωδικός Τίτλος ΄Ετος


0083658 Blade Runner 1942
0034583 Casablanca 1942
0053779 La Dolce Vita 1942
0087884 Paris Texas 1942

Σχήμα 1.45: Πινακοποιημένη μορφή της σχέσης movies, μετά την εφαρμογή της κα-
θολικής τροποποίησης της χρονολογίας.

Συνήθως η τροποποίηση αφορά ένα υποσύνολο των πλειάδων μιας σχέσης. Αυτό σημαίνει πως
πρέπει να προηγηθεί κάποιος περιορισμός στις πλειάδες, πριν εφαρμοστεί η τροποποίηση. ΄Ετσι, για
να τροποποιηθεί το έτος παραγωγής της ταινίας Casablanca στο 1942 (το σχήμα 1.42 εσφαλμένα
δείχνει το έτος 1952) θα πρέπει να γράψουμε:

movies ← πcode,title,year=1942 (σcode=583 (movies))

΄Η με την SQL:

1 UPDATE movies
2 SET year = 1942
3 WHERE code = 0034583;

Προσοχή λοιπόν στην τροποποίηση δεδομένων! Σχεδόν πάντα θα πρέπει να συνοδεύεται με περιο-
ρισμό των πλειάδων.
42 Αθανάσιος Σταυρακούδης http://stavrakoudis.econ.uoi.gr

Τροποποίηση υπάρχει και εκεί όπου πολλές φορές μοιάζει με εισαγωγή δεδομένων. Θεωρείστε πως
η σχέση movies επιτρέπει τιμές NULL στην χρονολογία. Αυτό σημαίνει πως, για παράδειγμα είναι
έγκυρη η σχεσιακή παράσταση, που αφορά την εισαγωγή της ταινίας La Dolce Vita:

movies ← movies ∪ {0087884, ’Paris Texas’, NULL}

΄Οπως έχει αναφερθεί, NULL τιμή σημαίνει είτε πως κάποια άλλη τιμή δεν έχει κάποια εφαρμογή,
είτε (όπως θεωρούμε πως συμβαίνει εδώ) δεν είναι γνωστή η τιμή. ΄Ετσι λοιπόν, τα δεδομένα της
σχέσης movies θα είναι όπως φαίνεται στο σχήμα 1.46.

Κωδικός Τίτλος ΄Ετος


0083658 Blade Runner 1942
0034583 Casablanca 1942
0053779 La Dolce Vita 1942
0087884 Paris Texas NULL

Σχήμα 1.46: Πινακοποιημένη μορφή της σχέσης movies χωρίς την χρονολογία της
ταινίας Paris Texas.

Στην περίπτωση που εξετάζουμε, το έτος παραγωγής προσωρινά ήταν άγνωστο και η καταχώρηση
της ταινίας έγινε χωρίς κάποια τιμή, δηλαδή NULL. ΄Οταν κάποια στιγμή γίνει γνωστή αυτή η
τιμή (1984), τότε μπορεί να εισαχθεί στη βάση. Θα πρέπει ωστόσο να γίνει κατανοητό πως, σε
όρους σχεσιακού μοντέλου, αυτό αποτελεί τροποποίηση των δεδομένων της βάσης και όχι εισαγωγή
δεδομένων. ΄Οπως επεξηγήθηκε στην παράγραφο 1.8.1, εισαγωγή δεδομένων στη βάση σημαίνει
εισαγωγή πλειάδων σε κάποια σχέση και αύξηση της πληθικότητάς της. Αντίθετα, στην περίπτωση
που εξετάζουμε, η εισαγωγή της χρονολογίας παραγωγής της ταινίας Paris Texas, δηλαδή της τιμής
1984 στο γνώρισμα year , δεν σημαίνει εισαγωγή πλειάδας στη σχέση (επομένως ούτε και αύξηση
της πληθικότητάς της), αλλά τροποποίηση πλειάδας. Η τιμή NULL θα αλλάξει σε 1984. Αυτό δεν
μεταβάλει την πληθικότητα της σχέσης, απλά τροποποιεί κάποιες τιμές σε ένα γνώρισμα της σχέσης.
Η πράξη που γίνεται είναι η τροποποίηση και όχι η εισαγωγή. Στη σχεσιακή άλγεβρα θα γράψουμε:

movies ← ΠΚωδικός, Τίτλος, ΄Ετος=1984 (σΚωδικός=0087884 (movies))

΄Η με την SQL:

1 UPDATE movies
2 SET year = 1984
3 WHERE code = 0087884;

Σε καμία περίπτωση δεν μπορεί να γίνει εισαγωγή, όπως:

movies ← movies ∪ {884, ’Paris Texas’, 1984}

΄Η με την SQL:
1 INSERT
2 INTO movies (code, title, year)
3 VALUES (884, 'Paris Texas', 1984);

Αυτό δεν μπορεί να συμβεί γιατί η ταινία Paris Texas με κωδικό (πρωτεύον κλειδί) 0087884, υπάρχει
ως πλειάδα της σχέσης movies, και δεν μπορεί να γίνει διπλότυπη εισαγωγή (παραβίαση του κανόνα
ακεραιότητας των οντοτήτων και του πρωτεύοντος κλειδιού).
Τα πρώτα ερωτήματα SQL

Περιεχόμενα
1 Εισαγωγικά σχόλια και παρατηρήσεις
2 Απλά ερωτήματα προβολής, επιλέγοντας στήλες από ένα
πίνακα δεδομένων
3 Απλά ερωτήματα περιορισμού, επιλέγοντας εγγραφές από ένα
πίνακα δεδομένων
4 Σχεσιακή άλγεβρα και απλά ερωτήματα επιλογής
5 Αναζήτηση ημερολογιακών δεδομένων
6 Αναζήτηση κειμένου σε πίνακα δεδομένων
7 Επεκτάσεις της προβολής, πράξεις και αλγεβρικές
παραστάσεις κατά την προβολή δεδομένων
8 Ταξινόμηση

2 / 97
Δυο λόγια για την SQL
Υλοποίηση του σχεσιακού μοντέλου δεδομένων του E.F.
Codd, αρχικά ως DSl/Alpha, αργότερα ως SQUARE και
SEQUEL.

3 / 97

Δυο λόγια για την SQL


Υλοποίηση του σχεσιακού μοντέλου δεδομένων του E.F.
Codd, αρχικά ως DSl/Alpha, αργότερα ως SQUARE και
SEQUEL.
Είναι μια διαδικαστική γλώσσα δεδομένων με δύο μέρη:
α) DDL: γλώσσα ορισμού δεδομένων
β) DML: γλώσσα χειρισμού δεδομένων.

4 / 97
Δυο λόγια για την SQL
Υλοποίηση του σχεσιακού μοντέλου δεδομένων του E.F.
Codd, αρχικά ως DSl/Alpha, αργότερα ως SQUARE και
SEQUEL.
Είναι μια διαδικαστική γλώσσα δεδομένων με δύο μέρη:
α) DDL: γλώσσα ορισμού δεδομένων
β) DML: γλώσσα χειρισμού δεδομένων.
Πρώτη εμπορική υλοποίηση ως System R από την IBM
(1970s).

5 / 97

Δυο λόγια για την SQL


Υλοποίηση του σχεσιακού μοντέλου δεδομένων του E.F.
Codd, αρχικά ως DSl/Alpha, αργότερα ως SQUARE και
SEQUEL.
Είναι μια διαδικαστική γλώσσα δεδομένων με δύο μέρη:
α) DDL: γλώσσα ορισμού δεδομένων
β) DML: γλώσσα χειρισμού δεδομένων.
Πρώτη εμπορική υλοποίηση ως System R από την IBM
(1970s).
Η εταιρεία Relational Software Inc. κατασκευάζει το
λογισμικό που αργότερα θα γίνει γνωστό ως Oracle

6 / 97
Δυο λόγια για την SQL
Υλοποίηση του σχεσιακού μοντέλου δεδομένων του E.F.
Codd, αρχικά ως DSl/Alpha, αργότερα ως SQUARE και
SEQUEL.
Είναι μια διαδικαστική γλώσσα δεδομένων με δύο μέρη:
α) DDL: γλώσσα ορισμού δεδομένων
β) DML: γλώσσα χειρισμού δεδομένων.
Πρώτη εμπορική υλοποίηση ως System R από την IBM
(1970s).
Η εταιρεία Relational Software Inc. κατασκευάζει το
λογισμικό που αργότερα θα γίνει γνωστό ως Oracle
πόλεμος πάντων μὲν πατήρ ἐστι (Ηράκλειτος)

7 / 97

Δυο λόγια για την SQL


Υλοποίηση του σχεσιακού μοντέλου δεδομένων του E.F.
Codd, αρχικά ως DSl/Alpha, αργότερα ως SQUARE και
SEQUEL.
Είναι μια διαδικαστική γλώσσα δεδομένων με δύο μέρη:
α) DDL: γλώσσα ορισμού δεδομένων
β) DML: γλώσσα χειρισμού δεδομένων.
Πρώτη εμπορική υλοποίηση ως System R από την IBM
(1970s).
Η εταιρεία Relational Software Inc. κατασκευάζει το
λογισμικό που αργότερα θα γίνει γνωστό ως Oracle
πόλεμος πάντων μὲν πατήρ ἐστι (Ηράκλειτος)
Dialects: SQL-86, SQL-89, SQL-99, ..., SQL-2011, ...

8 / 97
Δυο λόγια για την SQL
Υλοποίηση του σχεσιακού μοντέλου δεδομένων του E.F.
Codd, αρχικά ως DSl/Alpha, αργότερα ως SQUARE και
SEQUEL.
Είναι μια διαδικαστική γλώσσα δεδομένων με δύο μέρη:
α) DDL: γλώσσα ορισμού δεδομένων
β) DML: γλώσσα χειρισμού δεδομένων.
Πρώτη εμπορική υλοποίηση ως System R από την IBM
(1970s).
Η εταιρεία Relational Software Inc. κατασκευάζει το
λογισμικό που αργότερα θα γίνει γνωστό ως Oracle
πόλεμος πάντων μὲν πατήρ ἐστι (Ηράκλειτος)
Dialects: SQL-86, SQL-89, SQL-99, ..., SQL-2011, ...
NoSQL : Not only SQL

9 / 97

Τυπικό παράδειγμα βάσης δεδομένων

Η βάση company
Μια εταιρεία μελετών έχει πολλούς υπαλλήλους.
Η υπάλληλοι εργάζονται σε διάφορα τμήματα της εταιρείας.
Κάθε τμήμα διοικείται από έναν υπάλληλο.
Οι υπάλληλοι απασχολούνται σε διάφορα έργα μελετών.
Σε κάθε έργο απασχολούνται πιθανά πολλοί υπάλληλοι
από διάφορα τμήματα.
10 / 97
Ο πίνακας employees από τη βάση company
΄Εστω η σχέση employees με σχήμα:

employees(empid, firstname, lastname, depid, salary , hiredate)

empid firstname lastname depid salary hiredate


102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02
109 Μαρία Αθανασίου 1 2787.69 2000-01-26
153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15
172 Χρήστος Βλάσσης 3 1101.70 2000-07-04
189 Θεόδωρος Αγγελίνας 6 1908.28 2000-06-19
... ... ... ... ... ...
Δείγμα από τα δεδομένα του πίνακα.
Δείτε τα πλήρη περιεχόμενα εδώ:
http://stavrakoudis.econ.uoi.gr/stavrakoudis/?iid=400

11 / 97

Ονόματα πινάκων
Σε αντίθεση με έναν απλό κειμενογράφο ή ένα λογιστικό
φύλλο, οι πίνακες των βάσεων δεδομένων έχουν πάντα
όνομα
Δεν υπάρχει πίνακας σε βάση δεδομένων που να μην έχει
όνομα
Κάθε πίνακας έχει ένα μοναδικό όνομα σε μια βάση
δεδομένων: δεν υπάρχουν δύο πίνακες με το ίδιο όνομα στην
ίδια βάση δεδομένων
Ο πίνακας που έχουμε δει έχει το όνομα: employees

12 / 97
Πρόσβαση στη βάση company

Πρόσβαση στη βάση company


Διαδικτυακή πρόσβαση από: http://bit.ly/SQLcmp
username: dbuser
password: econ98

Διαθέσιμη για μεταφόρτωση από την ιστοσελίδα


http://bit.ly/xxy896
σε μορφή:
MS Access
Open/Libre Office
SQL installation script

13 / 97

Περιεχόμενα
1 Εισαγωγικά σχόλια και παρατηρήσεις
2 Απλά ερωτήματα προβολής, επιλέγοντας στήλες από ένα
πίνακα δεδομένων
3 Απλά ερωτήματα περιορισμού, επιλέγοντας εγγραφές από ένα
πίνακα δεδομένων
4 Σχεσιακή άλγεβρα και απλά ερωτήματα επιλογής
5 Αναζήτηση ημερολογιακών δεδομένων
6 Αναζήτηση κειμένου σε πίνακα δεδομένων
7 Επεκτάσεις της προβολής, πράξεις και αλγεβρικές
παραστάσεις κατά την προβολή δεδομένων
8 Ταξινόμηση

14 / 97
Το πιο απλό ερώτημα

Να δοθούν όλα τα δεδομένα του πίνακα των


υπαλλήλων
1 SELECT *
2 FROM employees;

SELECT ΄Ολα τα ερωτήματα ανάσυρσης δεδομένων αρχίζουν


με SELECT.
* Το σύμβολο αυτό υποδηλώνει όλα τα πεδία του
πίνακα.
FROM ΄Ολα τα ερωτήματα ανάσυρσης δεδομένων έχουν τη
δήλωση FROM ώστε να καθοριστεί ο πίνακας (ή η
παράσταση πίνακα) από όπου θα γίνει η άντληση
δεδομένων.
employees Ο πίνακας, τα δεδομένα του οποίου αναζητούμε.
15 / 97

Επιλογή πεδίου από πίνακα

Να βρεθεί το επώνυμο των εργαζομένων


1 SELECT lastname
2 FROM employees;

Το όνομα του πεδίου τοποθετείται μετά το SELECT


Μπορούμε να βάλουμε οποιοδήποτε πεδίο, αρκεί να υπάρχει
στον πίνακα που δηλώνεται μετά το FROM

16 / 97
Επιλογή περισσότερων πεδίων από πίνακα

Να βρεθεί το όνομα και το επώνυμο των υπαλλήλων


1 SELECT firstname, lastname
2 FROM employees;

firstname lastname
Νικηφόρος Διαμαντίδης
Μαρία Αθανασίου
Μαρία Αλεβιζάτου
Χρήστος Βλάσσης
Θεόδωρος Αγγελίνας
Ηλίας Μακρής

17 / 97

Κανόνες επιλογής περισσότερων πεδίων


1 SELECT firstname, lastname
2 FROM employees;

Τα ονόματα των πεδίων τοποθετούνται μετά το SELECT.


Χωρίζονται μεταξύ τους με κόμματα.
Δεν υπάρχει κόμμα μετά το τελευταίο πεδίο.
Μπορούμε να τοποθετήσουμε τα πεδία με όποια σειρά
θέλουμε.
Τοποθετούμε το όνομα του πεδίου (πχ lastname), όχι τη
θέση του στον πίνακα, πχ δεύτερο πεδίο, τέταρτο πεδίο
κ.τλ.

18 / 97
Μετονομασία πεδίου στο αποτέλεσμα

Να δοθεί το επώνυμο των εργαζομένων ως στήλη


με όνομα FamilyName

19 / 97

Μετονομασία πεδίου στο αποτέλεσμα

Να δοθεί το επώνυμο των εργαζομένων ως στήλη


με όνομα FamilyName
1 SELECT lastname AS FamilyName
2 FROM employees;

20 / 97
Μετονομασία πεδίου στο αποτέλεσμα

Να δοθεί το επώνυμο των εργαζομένων ως στήλη


με όνομα FamilyName
1 SELECT lastname AS FamilyName
2 FROM employees;

FamilyName
Αθανασίου
Μαροπούλου
Ρούσσης
........

21 / 97

Εμβέλεια αλλαγής ονόματος πεδίου

ΟΝΟΜΑ αντί για firstname


1 SELECT lastname AS FamilyName
2 FROM employees;

Το πεδίο δηλώνεται κανονικά μετά το


FamilyName SELECT.
Αθανασίου Ακολουθεί ο τελεστής μετονομασίας AS.
Μαροπούλου Η ισχύς του νέου ονόματος περιορίζεται
Ρούσσης μόνο στο αποτέλεσμα του ερωτήματος,
........
δεν αλλάζει κάτι στον ορισμό του πίνακα
δεδομένων.

22 / 97
Περιεχόμενα
1 Εισαγωγικά σχόλια και παρατηρήσεις
2 Απλά ερωτήματα προβολής, επιλέγοντας στήλες από ένα
πίνακα δεδομένων
3 Απλά ερωτήματα περιορισμού, επιλέγοντας εγγραφές από ένα
πίνακα δεδομένων
4 Σχεσιακή άλγεβρα και απλά ερωτήματα επιλογής
5 Αναζήτηση ημερολογιακών δεδομένων
6 Αναζήτηση κειμένου σε πίνακα δεδομένων
7 Επεκτάσεις της προβολής, πράξεις και αλγεβρικές
παραστάσεις κατά την προβολή δεδομένων
8 Ταξινόμηση

23 / 97

Περιορισμός

Να βρεθούν οι εργαζόμενοι του τμήματος 1

24 / 97
Περιορισμός

Να βρεθούν οι εργαζόμενοι του τμήματος 1


1 SELECT *
2 FROM employees
3 WHERE depid = 1;

25 / 97

Περιορισμός

Να βρεθούν οι εργαζόμενοι του τμήματος 1


1 SELECT *
2 FROM employees
3 WHERE depid = 1;

empid firstname lastname depid salary hiredate


109 Μαρία Αθανασίου 1 2787.69 2000-01-26
502 Κρινιώ Μαροπούλου 1 1754.67 2001-03-07
901 Κυριάκος Ρούσσης 1 1852.99 2001-11-01

26 / 97
Περιορισμός

Να βρεθούν οι εργαζόμενοι του τμήματος 1


1 SELECT *
2 FROM employees
3 WHERE depid = 1;

empid firstname lastname depid salary hiredate


109 Μαρία Αθανασίου 1 2787.69 2000-01-26
502 Κρινιώ Μαροπούλου 1 1754.67 2001-03-07
901 Κυριάκος Ρούσσης 1 1852.99 2001-11-01

Στη σχεσιακή άλγεβρα


σdepid=1 (employees)

27 / 97

Ο όρος WHERE σε εντολές SQL


1 SELECT *
2 FROM employees
3 WHERE depid = 1;

Τοποθετείται πάντοτε μετά το FROM.


Είναι προαιρετική, πολλές εντολές SQL δεν έχουν
καθόλου WHERE.
Αν υπάρχει, ακολουθείται από μια παράσταση που
μπορεί να αποτιμηθεί σε TRUE ή FALSE.
Μόνο οι εγγραφές για τις οποίες η παράσταση συνθήκης
αποδίδει την τιμή TRUE εμφανίζονται στο αποτέλεσμα.
Τα πεδία που ακολουθούν τη δήλωση WHERE πρέπει
να υπάρχουν στην παράσταση πίνακα που έχει δηλωθεί
μετά το FROM.

28 / 97
Τελεστές σύγκρισης

Τελεστής SQL Σημασία


= = ίσο με
6 = ! = ή <> διάφορο από
> > μεγαλύτερο από
≥ >= μεγαλύτερο ή ίσο με
< < μικρότερο από
≤ <= μικρότερο ή ίσο με

29 / 97

Περιεχόμενα
1 Εισαγωγικά σχόλια και παρατηρήσεις
2 Απλά ερωτήματα προβολής, επιλέγοντας στήλες από ένα
πίνακα δεδομένων
3 Απλά ερωτήματα περιορισμού, επιλέγοντας εγγραφές από ένα
πίνακα δεδομένων
4 Σχεσιακή άλγεβρα και απλά ερωτήματα επιλογής
5 Αναζήτηση ημερολογιακών δεδομένων
6 Αναζήτηση κειμένου σε πίνακα δεδομένων
7 Επεκτάσεις της προβολής, πράξεις και αλγεβρικές
παραστάσεις κατά την προβολή δεδομένων
8 Ταξινόμηση

30 / 97
Απλές σχεσιακές πράξεις

Προβολή
Επιλογή μέρους από το σύνολο των γνωρισμάτων της
σχέσης, πχ:
Πlastname,salary (employees)

Περιορισμός
Επιλογή μέρους από τις πλειάδες της σχέσης, πχ:
σempid=243 (employees)

Συνδυασμός
Πlastname,salary (σempid=243 (employees))

31 / 97

Συνδυασμός προβολής και περιορισμού

Να βρεθεί το όνομα, ο μισθός και το τμήμα του


υπαλλήλου με κωδικό 243

32 / 97
Συνδυασμός προβολής και περιορισμού

Να βρεθεί το όνομα, ο μισθός και το τμήμα του


υπαλλήλου με κωδικό 243
Πfirstname,lastname,salary ,depid (σempid=243 (employees))

33 / 97

Συνδυασμός προβολής και περιορισμού

Να βρεθεί το όνομα, ο μισθός και το τμήμα του


υπαλλήλου με κωδικό 243
Πfirstname,lastname,salary ,depid (σempid=243 (employees))

1 SELECT firstname, lastname, salary, depid


2 FROM employees
3 WHERE empid = 243;

34 / 97
Συνδυασμός προβολής και περιορισμού

Να βρεθεί το όνομα, ο μισθός και το τμήμα του


υπαλλήλου με κωδικό 243
Πfirstname,lastname,salary ,depid (σempid=243 (employees))

1 SELECT firstname, lastname, salary, depid


2 FROM employees
3 WHERE empid = 243;
firstname lastname salary depid
Δέσποινα Παπαδοπούλου 1609.52 2

35 / 97

Περιεχόμενα
1 Εισαγωγικά σχόλια και παρατηρήσεις
2 Απλά ερωτήματα προβολής, επιλέγοντας στήλες από ένα
πίνακα δεδομένων
3 Απλά ερωτήματα περιορισμού, επιλέγοντας εγγραφές από ένα
πίνακα δεδομένων
4 Σχεσιακή άλγεβρα και απλά ερωτήματα επιλογής
5 Αναζήτηση ημερολογιακών δεδομένων
6 Αναζήτηση κειμένου σε πίνακα δεδομένων
7 Επεκτάσεις της προβολής, πράξεις και αλγεβρικές
παραστάσεις κατά την προβολή δεδομένων
8 Ταξινόμηση

36 / 97
Αναζήτηση με ημερομηνίες

Να βρεθεί το όνομα, ο μισθός και το τμήμα των


υπαλλήλων που προσλήφθηκαν μετά την 1/6/2006

37 / 97

Αναζήτηση με ημερομηνίες

Να βρεθεί το όνομα, ο μισθός και το τμήμα των


υπαλλήλων που προσλήφθηκαν μετά την 1/6/2006
Πfirstname,lastname,salary ,depid (σhiredate>′ 2004−06−01′ (employees))

38 / 97
Αναζήτηση με ημερομηνίες

Να βρεθεί το όνομα, ο μισθός και το τμήμα των


υπαλλήλων που προσλήφθηκαν μετά την 1/6/2006
Πfirstname,lastname,salary ,depid (σhiredate>′ 2004−06−01′ (employees))

1 SELECT firstname, lastname, salary, depid


2 FROM employees
3 WHERE hiredate > ’2004-06-01’;

39 / 97

Αναζήτηση με ημερομηνίες

Να βρεθεί το όνομα, ο μισθός και το τμήμα των


υπαλλήλων που προσλήφθηκαν μετά την 1/6/2006
Πfirstname,lastname,salary ,depid (σhiredate>′ 2004−06−01′ (employees))

1 SELECT firstname, lastname, salary, depid


2 FROM employees
3 WHERE hiredate > ’2004-06-01’;
firstname lastname salary depid
Πέτρος Αρβανιτάκης 1323.80 2
Αντώνης Παύλου 1231.62 3
Κυριάκος Ρούσσης 1852.99 1
Βαγγέλης Χριστόπουλος NULL 4
Παύλος Περίδης NULL 4
Βασιλική Περδίκη 1053.54 3

40 / 97
Περιεχόμενα
1 Εισαγωγικά σχόλια και παρατηρήσεις
2 Απλά ερωτήματα προβολής, επιλέγοντας στήλες από ένα
πίνακα δεδομένων
3 Απλά ερωτήματα περιορισμού, επιλέγοντας εγγραφές από ένα
πίνακα δεδομένων
4 Σχεσιακή άλγεβρα και απλά ερωτήματα επιλογής
5 Αναζήτηση ημερολογιακών δεδομένων
6 Αναζήτηση κειμένου σε πίνακα δεδομένων
7 Επεκτάσεις της προβολής, πράξεις και αλγεβρικές
παραστάσεις κατά την προβολή δεδομένων
8 Ταξινόμηση

41 / 97

Μαρία – Μαρία

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων


με μικρό όνομα Μαρία

42 / 97
Μαρία – Μαρία

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων


με μικρό όνομα Μαρία
σfirstname=‘Μαρία’ (employees)

43 / 97

Μαρία – Μαρία

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων


με μικρό όνομα Μαρία
σfirstname=‘Μαρία’ (employees)

1 SELECT *
2 FROM employees
3 WHERE firstname = ΄Μαρία΄;

44 / 97
Μαρία – Μαρία

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων


με μικρό όνομα Μαρία
σfirstname=‘Μαρία’ (employees)

1 SELECT *
2 FROM employees
3 WHERE firstname = ΄Μαρία΄;
empid firstname lastname depid salary hiredate
109 Μαρία Αθανασίου 1 2787.69 2003-08-29
153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15

45 / 97

Σύγκριση με κείμενο

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων,


που το επώνυμό τους είναι Παπαδοπούλου και
μετά (στη σειρά καταλόγου)

46 / 97
Σύγκριση με κείμενο

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων,


που το επώνυμό τους είναι Παπαδοπούλου και
μετά (στη σειρά καταλόγου)
Πsalary (σlastname≥‘Παπαδοπούλου’ (employees))

47 / 97

Σύγκριση με κείμενο

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων,


που το επώνυμό τους είναι Παπαδοπούλου και
μετά (στη σειρά καταλόγου)
Πsalary (σlastname≥‘Παπαδοπούλου’ (employees))

1 SELECT *
2 FROM employees
3 WHERE lastname >= ΄Παπαδοπούλου΄

48 / 97
Σύγκριση με κείμενο

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων,


που το επώνυμό τους είναι Παπαδοπούλου και
μετά (στη σειρά καταλόγου)
Πsalary (σlastname≥‘Παπαδοπούλου’ (employees))

1 SELECT *
2 FROM employees
3 WHERE lastname >= ΄Παπαδοπούλου΄
empid firstname lastname depid salary hiredate
243 Δέσποινα Παπαδοπούλου 2 1609.52 1999-03-05
412 Αριστείδης Περρής 3 1320.83 1999-11-12
435 Αντώνης Παύλου 3 1231.62 2005-02-05
835 Αθανάσιος Πετράκης 6 1322.01 2001-02-23
901 Κυριάκος Ρούσσης 1 1852.99 2006-11-01
302 Νίκος Στεργιόπουλος 4 1386.05 2002-02-01 49 / 97
431 Κώστας Παπαδόπουλος 3 1100.23 2002-09-16

Τα πρώτα ερωτήματα SQL

Αθανάσιος Σταυρακούδης

http://stavrakoudis.econ.uoi.gr

΄Ανοιξη 2014

50 / 97
Περιεχόμενα
1 Εισαγωγικά σχόλια και παρατηρήσεις
2 Απλά ερωτήματα προβολής, επιλέγοντας στήλες από ένα
πίνακα δεδομένων
3 Απλά ερωτήματα περιορισμού, επιλέγοντας εγγραφές από ένα
πίνακα δεδομένων
4 Σχεσιακή άλγεβρα και απλά ερωτήματα επιλογής
5 Αναζήτηση ημερολογιακών δεδομένων
6 Αναζήτηση κειμένου σε πίνακα δεδομένων
7 Επεκτάσεις της προβολής, πράξεις και αλγεβρικές
παραστάσεις κατά την προβολή δεδομένων
8 Ταξινόμηση

51 / 97

Γενικευμένη προβολή

Αλγεβρικές παραστάσεις σε αριθμητικά πεδία


salary × 1.05
Η πράξη εφαρμόζεται σε όλες τις εγγραφές του πίνακα:
αύξηση του μισθού κατά 5%.
Λογιστικά φύλλα: «σύρσιμο» τύπου προς τα κάτω.
Γλώσσες προγραμματισμού: βρόγχος επανάληψης.

52 / 97
Γενικευμένη προβολή

Αλγεβρικές παραστάσεις σε αριθμητικά πεδία


salary × 1.05
Η πράξη εφαρμόζεται σε όλες τις εγγραφές του πίνακα:
αύξηση του μισθού κατά 5%.
Λογιστικά φύλλα: «σύρσιμο» τύπου προς τα κάτω.
Γλώσσες προγραμματισμού: βρόγχος επανάληψης.

Εφαρμογή συναρτήσεων
Αριθμητικές, πχ SQRT(salary)
Κειμένου, πχ LEFT(firstname, 1)
Ημερομηνίας πχ YEAR(hiredate)

53 / 97

Γενικευμένη προβολή και SQL

Εφαρμογή σε οποιοδήποτε όρο


SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
54 / 97
Παράδειγμα γενικευμένης προβολής – 1

Να βρεθεί το όνομα και ο νέος μισθός όλων των


υπαλλήλων που εργάζονται στο τμήμα 2 μετά από
αύξηση 150 € στο μισθό τους

55 / 97

Παράδειγμα γενικευμένης προβολής – 1

Να βρεθεί το όνομα και ο νέος μισθός όλων των


υπαλλήλων που εργάζονται στο τμήμα 2 μετά από
αύξηση 150 € στο μισθό τους
Πfirstname,lastname,salary +150 (employees)

56 / 97
Παράδειγμα γενικευμένης προβολής – 1

Να βρεθεί το όνομα και ο νέος μισθός όλων των


υπαλλήλων που εργάζονται στο τμήμα 2 μετά από
αύξηση 150 € στο μισθό τους
Πfirstname,lastname,salary +150 (employees)

1 SELECT firstname, lastname, salary+150


2 FROM employees
3 WHERE depid = 2;

57 / 97

Παράδειγμα γενικευμένης προβολής – 1

Να βρεθεί το όνομα και ο νέος μισθός όλων των


υπαλλήλων που εργάζονται στο τμήμα 2 μετά από
αύξηση 150 € στο μισθό τους
Πfirstname,lastname,salary +150 (employees)

1 SELECT firstname, lastname, salary+150


2 FROM employees
3 WHERE depid = 2;
firstname lastname salary+150
Δέσποινα Παπαδοπούλου 1759.52
Πέτρος Αρβανιτάκης 1473.80
Μαριλένα Κρέσπα 1255.04
Μαρία Αλεβιζάτου 1471.92
58 / 97
Παράδειγμα γενικευμένης προβολής – 2

Να βρεθεί το όνομα και ο μισθός των υπαλλήλων


που ο μισθός τους θα ανέβει περισσότερο από 80 €
αν πάρουν αύξηση 4%

59 / 97

Παράδειγμα γενικευμένης προβολής – 2

Να βρεθεί το όνομα και ο μισθός των υπαλλήλων


που ο μισθός τους θα ανέβει περισσότερο από 80 €
αν πάρουν αύξηση 4%
Πlastname,firstname,salary (σsalary ∗0.04>80 (employees))

60 / 97
Παράδειγμα γενικευμένης προβολής – 2

Να βρεθεί το όνομα και ο μισθός των υπαλλήλων


που ο μισθός τους θα ανέβει περισσότερο από 80 €
αν πάρουν αύξηση 4%
Πlastname,firstname,salary (σsalary ∗0.04>80 (employees))

1 SELECT *
2 FROM employees
3 WHERE salary*0.04 > 80;
firstname lastname salary
Δέσποινα Παπαδοπούλου 1609.52
Αδαμαντία Αθανασίου 2787.69
Θεόδωρος Αγγελίνας 1908.28
... ... ...
61 / 97

Υπολογισμοί με ποσοστά
Αν:
s1 είναι η αρχική τιμή του
μισθού, όπως είναι
αποθηκευμένη στο πεδίο salary
του πίνακα employees,
s2 είναι η νέα τιμή, αυτή που
προκύπτει μετά την μεταβολή,
v είναι το ποσό της μεταβολής,
σ είναι η σχετική μεταβολή, και
π είναι η σχετική ποσοστιαία
μεταβολή

62 / 97
Υπολογισμοί με ποσοστά
Αν: τότε ισχύουν οι σχέσεις:
s1 είναι η αρχική τιμή του
μισθού, όπως είναι s2 = s1 + v
αποθηκευμένη στο πεδίο salary s 2 − s1
σ=
του πίνακα employees, s1
(s2 − s1 )
s2 είναι η νέα τιμή, αυτή που π= 100
s1
προκύπτει μετά την μεταβολή,
s2 = (1 + σ)s1
v είναι το ποσό της μεταβολής, π
s2 = (1 + )s1
σ είναι η σχετική μεταβολή, και 100
π είναι η σχετική ποσοστιαία
μεταβολή

63 / 97

Παράδειγμα γενικευμένης προβολής – 3

Να βρεθεί ο κωδικός, ο μισθός, ο νέος μισθός των υπαλλήλων μετά


από αύξηση 80 € αν ο μισθός μεταβληθεί περισσότερο από 4% με
φθίνουσα ταξινόμηση ως προς το ποσοστό αύξησης του μισθού.

64 / 97
Παράδειγμα γενικευμένης προβολής – 3

Να βρεθεί ο κωδικός, ο μισθός, ο νέος μισθός των υπαλλήλων μετά


από αύξηση 80 € αν ο μισθός μεταβληθεί περισσότερο από 4% με
φθίνουσα ταξινόμηση ως προς το ποσοστό αύξησης του μισθού.
1 SELECT empid, salary, salary+80, 80*100/salary
2 FROM employees
3 WHERE salary+80 > salary*1.04
4 ORDER BY 80*100/salary DESC;
5

65 / 97

Παράδειγμα γενικευμένης προβολής – 3

Να βρεθεί ο κωδικός, ο μισθός, ο νέος μισθός των υπαλλήλων μετά


από αύξηση 80 € αν ο μισθός μεταβληθεί περισσότερο από 4% με
φθίνουσα ταξινόμηση ως προς το ποσοστό αύξησης του μισθού.
1 SELECT empid, salary, salary+80, 80*100/salary
2 FROM employees
3 WHERE salary+80 > salary*1.04
4 ORDER BY 80*100/salary DESC;
5

6 empid salary salary+80 80*100/salary


7 -----------------------------------------
8 205 1050.96 1130.96 7.6121
9 490 1051.92 1131.92 7.6051
10 .........................................
11 811 1323.98 1403.98 6.0424
12 342 1351.96 1431.96 5.9173
13 ......................................... 66 / 97
Περιεχόμενα
1 Εισαγωγικά σχόλια και παρατηρήσεις
2 Απλά ερωτήματα προβολής, επιλέγοντας στήλες από ένα
πίνακα δεδομένων
3 Απλά ερωτήματα περιορισμού, επιλέγοντας εγγραφές από ένα
πίνακα δεδομένων
4 Σχεσιακή άλγεβρα και απλά ερωτήματα επιλογής
5 Αναζήτηση ημερολογιακών δεδομένων
6 Αναζήτηση κειμένου σε πίνακα δεδομένων
7 Επεκτάσεις της προβολής, πράξεις και αλγεβρικές
παραστάσεις κατά την προβολή δεδομένων
8 Ταξινόμηση

68 / 97

Ταξινόμηση

ORDER BY column [ ASC | DESC ]

69 / 97
Ταξινόμηση

ORDER BY column [ ASC | DESC ]


1 Είναι προαιρετική.

70 / 97

Ταξινόμηση

ORDER BY column [ ASC | DESC ]


1 Είναι προαιρετική.
2 Αν υπάρχει ORDER BY στην πρόταση SQL, τότε
τοποθετείται πάντα στο τέλος.

71 / 97
Ταξινόμηση

ORDER BY column [ ASC | DESC ]


1 Είναι προαιρετική.
2 Αν υπάρχει ORDER BY στην πρόταση SQL, τότε
τοποθετείται πάντα στο τέλος.
3 Μπορεί να περιέχει ονόματα πεδίων που είτε έχουν, είτε δεν
έχουν δηλωθεί στο SELECT, αρκεί τα πεδία να υπάρχουν
στην έκφραση πίνακα που ακολουθεί το FROM.

72 / 97

Ταξινόμηση

ORDER BY column [ ASC | DESC ]


1 Είναι προαιρετική.
2 Αν υπάρχει ORDER BY στην πρόταση SQL, τότε
τοποθετείται πάντα στο τέλος.
3 Μπορεί να περιέχει ονόματα πεδίων που είτε έχουν, είτε δεν
έχουν δηλωθεί στο SELECT, αρκεί τα πεδία να υπάρχουν
στην έκφραση πίνακα που ακολουθεί το FROM.
4 Μπορεί να γίνει ταξινόμηση σε ένα πεδίο μετά από κάποιο
είδος υπολογισμού (αλγεβρική παράσταση ή κλήση
συνάρτησης).

73 / 97
Ταξινόμηση

ORDER BY column [ ASC | DESC ]


1 Είναι προαιρετική.
2 Αν υπάρχει ORDER BY στην πρόταση SQL, τότε
τοποθετείται πάντα στο τέλος.
3 Μπορεί να περιέχει ονόματα πεδίων που είτε έχουν, είτε δεν
έχουν δηλωθεί στο SELECT, αρκεί τα πεδία να υπάρχουν
στην έκφραση πίνακα που ακολουθεί το FROM.
4 Μπορεί να γίνει ταξινόμηση σε ένα πεδίο μετά από κάποιο
είδος υπολογισμού (αλγεβρική παράσταση ή κλήση
συνάρτησης).
5 Αν ο προσδιορισμός αύξουσας (ASC) ή φθίνουσας (DESC)
ταξινόμησης παραληφθεί τότε γίνεται αύξουσα ταξινόμηση
(ASC).
74 / 97

Ταξινόμηση ως προς το τμήμα

Να βρεθεί το όνομα, ο μισθός, και το τμήμα των υπαλλήλων, με


αύξουσα ταξινόμηση ως προς το τμήμα

75 / 97
Ταξινόμηση ως προς το τμήμα

Να βρεθεί το όνομα, ο μισθός, και το τμήμα των υπαλλήλων, με


αύξουσα ταξινόμηση ως προς το τμήμα
1 SELECT firstname, lastname, salary, depid
2 FROM employees
3 ORDER BY depid;
4

76 / 97

Ταξινόμηση ως προς το τμήμα

Να βρεθεί το όνομα, ο μισθός, και το τμήμα των υπαλλήλων, με


αύξουσα ταξινόμηση ως προς το τμήμα
1 SELECT firstname, lastname, salary, depid
2 FROM employees
3 ORDER BY depid;
4

5 firstname lastname salary depid


6 ------------------------------------------
7 Μαρία Αθανασίου 2787.69 1
8 Κρινιώ Μαροπούλου 1754.67 1
9 Κυριάκος Ρούσσης 1852.99 1
10 Δέσποινα Παπαδοπούλου 1609.52 2
11 Πέτρος Αρβανιτάκης 1323.80 2
12 Μαριλένα Κρέσπα 1105.04 2
13 ..........................................
77 / 97
Ταξινόμηση ως προς το μισθό

Να βρεθεί το όνομα και ο μισθός όλων των υπαλλήλων με


αύξουσα ταξινόμηση ως προς το μισθό

78 / 97

Ταξινόμηση ως προς το μισθό

Να βρεθεί το όνομα και ο μισθός όλων των υπαλλήλων με


αύξουσα ταξινόμηση ως προς το μισθό
1 SELECT firstname, lastname, salary
2 FROM employees
3 ORDER BY salary ASC;
4

79 / 97
Ταξινόμηση ως προς το μισθό

Να βρεθεί το όνομα και ο μισθός όλων των υπαλλήλων με


αύξουσα ταξινόμηση ως προς το μισθό
1 SELECT firstname, lastname, salary
2 FROM employees
3 ORDER BY salary ASC;
4

5 firstname lastname salary


6 -----------------------------------
7 Βαγγέλης Χριστόπουλος NULL
8 Ηρακλής Μανωλάκης NULL
9 Παύλος Περίδης NULL
10 Βασιλική Περδίκη 1053.54
11 Περικλής Κιτσάκης 1100.13
12 Κώστας Παπαδόπουλος 1100.23
13 ....................................
80 / 97

Φθίνουσα ταξινόμηση ημερομηνιών

Να βρεθεί το όνομα, ο κωδικός, και η ημερομηνία πρόσληψης των


υπαλλήλων που προσελήφθησαν μετά την 1/1/2004, με φθίνουσα
ταξινόμηση ως προς την ημερομηνία πρόσληψης

81 / 97
Φθίνουσα ταξινόμηση ημερομηνιών

Να βρεθεί το όνομα, ο κωδικός, και η ημερομηνία πρόσληψης των


υπαλλήλων που προσελήφθησαν μετά την 1/1/2004, με φθίνουσα
ταξινόμηση ως προς την ημερομηνία πρόσληψης
1 SELECT firstname, lastname, empid, hiredate
2 FROM employees
3 WHERE hiredate > ’2004-01-01’
4 ORDER BY hiredate DESC;
5

82 / 97

Φθίνουσα ταξινόμηση ημερομηνιών

Να βρεθεί το όνομα, ο κωδικός, και η ημερομηνία πρόσληψης των


υπαλλήλων που προσελήφθησαν μετά την 1/1/2004, με φθίνουσα
ταξινόμηση ως προς την ημερομηνία πρόσληψης
1 SELECT firstname, lastname, empid, hiredate
2 FROM employees
3 WHERE hiredate > ’2004-01-01’
4 ORDER BY hiredate DESC;
5

6 firstname lastname empid hiredate


7 -------------------------------------------
8 Βαγγέλης Χριστόπουλος 230 2007-12-03
9 Κυριάκος Ρούσσης 901 2006-11-01
10 Πέτρος Αρβανιτάκης 419 2006-07-17
11 Αντώνης Παύλου 435 2005-02-05
12 ...........................................
83 / 97
Διπλή ταξινόμηση: τμήμα και μισθός

Να βρεθεί ο κωδικός, ο μισθός και το τμήμα των υπαλλήλων με


αύξουσα ταξινόμηση ως προς το τμήμα και φθίνουσα ταξινόμηση
ως προς το μισθό

84 / 97

Διπλή ταξινόμηση: τμήμα και μισθός

Να βρεθεί ο κωδικός, ο μισθός και το τμήμα των υπαλλήλων με


αύξουσα ταξινόμηση ως προς το τμήμα και φθίνουσα ταξινόμηση
ως προς το μισθό
1 SELECT empid, salary, depid
2 FROM employees
3 ORDER BY depid ASC, salary DESC;
4

85 / 97
Διπλή ταξινόμηση: τμήμα και μισθός

Να βρεθεί ο κωδικός, ο μισθός και το τμήμα των υπαλλήλων με


αύξουσα ταξινόμηση ως προς το τμήμα και φθίνουσα ταξινόμηση
ως προς το μισθό
1 SELECT empid, salary, depid
2 FROM employees
3 ORDER BY depid ASC, salary DESC;
4

5 empid salary depid


6 -----------------------
7 109 2787.69 1
8 901 1852.99 1
9 502 1754.67 1
10 243 1609.52 2
11 419 1323.80 2
12 ......................
86 / 97

Διπλή ταξινόμηση: μισθός και τμήμα

Να βρεθεί ο κωδικός, ο μισθός και το τμήμα των υπαλλήλων με


αύξουσα ταξινόμηση ως προς το τμήμα και φθίνουσα ταξινόμηση
ως προς το μισθό

87 / 97
Διπλή ταξινόμηση: μισθός και τμήμα

Να βρεθεί ο κωδικός, ο μισθός και το τμήμα των υπαλλήλων με


αύξουσα ταξινόμηση ως προς το τμήμα και φθίνουσα ταξινόμηση
ως προς το μισθό
1 SELECT empid, salary, depid
2 FROM employees
3 ORDER BY salary DESC, depid ASC;
4

88 / 97

Διπλή ταξινόμηση: μισθός και τμήμα

Να βρεθεί ο κωδικός, ο μισθός και το τμήμα των υπαλλήλων με


αύξουσα ταξινόμηση ως προς το τμήμα και φθίνουσα ταξινόμηση
ως προς το μισθό
1 SELECT empid, salary, depid
2 FROM employees
3 ORDER BY salary DESC, depid ASC;
4

5 empid salary depid


6 -----------------------
7 109 2787.69 1
8 801 2312.56 3
9 189 1908.28 6
10 901 1852.99 1
11 502 1754.67 1
12 ......................
89 / 97
Περίληψη μαθήματος
1 SELECT .. FROM .. WHERE : ανάσυρση δεδομένων.

90 / 97

Περίληψη μαθήματος
1 SELECT .. FROM .. WHERE : ανάσυρση δεδομένων.
2 Ο όρος SELECT πρέπει να ακολουθείται από τουλάχιστον
ένα πεδίο.

91 / 97
Περίληψη μαθήματος
1 SELECT .. FROM .. WHERE : ανάσυρση δεδομένων.
2 Ο όρος SELECT πρέπει να ακολουθείται από τουλάχιστον
ένα πεδίο.
3 Το * υποδηλώνει την επιλογή όλων των πεδίων των πινάκων
που δηλώνονται στον όρο FROM.

92 / 97

Περίληψη μαθήματος
1 SELECT .. FROM .. WHERE : ανάσυρση δεδομένων.
2 Ο όρος SELECT πρέπει να ακολουθείται από τουλάχιστον
ένα πεδίο.
3 Το * υποδηλώνει την επιλογή όλων των πεδίων των πινάκων
που δηλώνονται στον όρο FROM.
4 Ο όρος WHERE τοποθετείται μετά το FROM, στην
περίπτωση όπου είναι επιθυμητό να γίνει περιορισμός των
εγγραφών του αποτελέσματος.

93 / 97
Περίληψη μαθήματος
1 SELECT .. FROM .. WHERE : ανάσυρση δεδομένων.
2 Ο όρος SELECT πρέπει να ακολουθείται από τουλάχιστον
ένα πεδίο.
3 Το * υποδηλώνει την επιλογή όλων των πεδίων των πινάκων
που δηλώνονται στον όρο FROM.
4 Ο όρος WHERE τοποθετείται μετά το FROM, στην
περίπτωση όπου είναι επιθυμητό να γίνει περιορισμός των
εγγραφών του αποτελέσματος.
5 Αν υπάρχει όρος WHERE, τότε μόνο οι εγγραφές για τις
οποίες η παράσταση δίνει τιμή TRUE εμφανίζονται στο
αποτέλεσμα του ερωτήματος.

94 / 97

Περίληψη μαθήματος
1 SELECT .. FROM .. WHERE : ανάσυρση δεδομένων.
2 Ο όρος SELECT πρέπει να ακολουθείται από τουλάχιστον
ένα πεδίο.
3 Το * υποδηλώνει την επιλογή όλων των πεδίων των πινάκων
που δηλώνονται στον όρο FROM.
4 Ο όρος WHERE τοποθετείται μετά το FROM, στην
περίπτωση όπου είναι επιθυμητό να γίνει περιορισμός των
εγγραφών του αποτελέσματος.
5 Αν υπάρχει όρος WHERE, τότε μόνο οι εγγραφές για τις
οποίες η παράσταση δίνει τιμή TRUE εμφανίζονται στο
αποτέλεσμα του ερωτήματος.
6 Οι ημερομηνίες ή το κείμενο σε παραστάσεις σύγκρισης
απαιτούν τη χρήση εισαγωγικών.

95 / 97
Περίληψη μαθήματος
1 SELECT .. FROM .. WHERE : ανάσυρση δεδομένων.
2 Ο όρος SELECT πρέπει να ακολουθείται από τουλάχιστον
ένα πεδίο.
3 Το * υποδηλώνει την επιλογή όλων των πεδίων των πινάκων
που δηλώνονται στον όρο FROM.
4 Ο όρος WHERE τοποθετείται μετά το FROM, στην
περίπτωση όπου είναι επιθυμητό να γίνει περιορισμός των
εγγραφών του αποτελέσματος.
5 Αν υπάρχει όρος WHERE, τότε μόνο οι εγγραφές για τις
οποίες η παράσταση δίνει τιμή TRUE εμφανίζονται στο
αποτέλεσμα του ερωτήματος.
6 Οι ημερομηνίες ή το κείμενο σε παραστάσεις σύγκρισης
απαιτούν τη χρήση εισαγωγικών.
7 Τα αποτελέσματα ενός ερωτήματος μπορούν να
ταξινομηθούν με τον όρο ORDER BY.
96 / 97

Ερωτήματα επιλογής SQL, σύζευξη,


διάζευξη, NULL, ταίριασμα κειμένου
Περισσότερα για τα απλά ερωτήματα SQL
DISTINCT, LIKE, NULL, AND, OR, BETWEEN

( 1 / 21

Σκοπός του μαθήματος

Μετά από αυτό το μάθημα θα μπορείτε να:


Αποκλείσετε διπλοεγγραφές από αποτελέσματα ερωτημάτων
Χειρίζεστε άγνωστες ή ελλιπείς τιμές (NULL)
Εφαρμόζετε αναζήτηση με βάση ταίριασμα κειμένου
Εκτελείτε ερωτήματα πολύπλοκων περιορισμών εφαρμόζοντας
λογικούς τελεστές
Εκτελείτε ερωτήματα με τη χρήση του τελεστή συνόλου και του
τελεστή περιοχής

(stavrakoudis.econ.uoi.gr) 1 / 21
Απαλοιφή διπλοεγγραφών

Να βρεθεί σε ποια τμήματα απασχολούνται οι υπάλληλοι


Χωρίς απαλοιφή διπλοεγγραφών Με απαλοιφή διπλοεγγραφών

SELECT d e p i d SELECT DISTINCT d e p i d


FROM e m p l o y e e s ; FROM e m p l o y e e s ;
depid depid
1 1
1 2
1 3
2 4
2 5
... 6

(stavrakoudis.econ.uoi.gr) 2 / 21

Συνδυασμός πεδίων

Να δοθεί το τμήμα και ο μισθός των υπαλλήλων

SELECT DISTINCT d e p i d , s a l a r y
FROM e m p l o y e e s ;

Εδώ ελέγχεται ο συνδυασμός των τιμών στα


depid salary πεδία depid και salary
6 1212.50 ΄Ετσι, μια τιμή στο πεδίο depid μπορεί να
1 2787.69 εμφανιστεί δεύτερη (ή πολλαπλή) επειδή
2 1321.92 αντιστοιχίζεται με διαφορετική τιμή στο πεδίο
3 1101.70 salary
6 1908.28 Αν το ζεύγος τιμών τμήμα–μισθός είναι ίδιο
... ... για δύο διαφορετικές εγγραφές τότε θα
εμφανιστεί στο αποτέλεσμα μόνο μία φορά
(λόγω DISTINCT)

(stavrakoudis.econ.uoi.gr) 3 / 21
DISTINCT και προβολή στη σχεσιακή άλγεβρα
Η σχεσιακή πράξη της προβολής, πχ:

Πdepid (employees)

εκφράζεται στην SQL πάντα με DISTINCT:

SELECT DISTINCT d e p i d
FROM e m p l o y e e s ;

και όχι χωρίς αυτό, πχ:

SELECT d e p i d
FROM e m p l o y e e s ;

Ο λόγος είναι απλός: η σχεσιακή άλγεβρα αφορά πράξεις συνόλων,


οπότε δε μπορεί να υπάρχουν διπλοεγγραφές, τα στοιχεία ενός συνόλου
είναι μοναδικά.
(stavrakoudis.econ.uoi.gr) 4 / 21

Και κάτι για εξάσκηση

Να βρεθούν τα τμήματα στα οποία ο μισθός των υπαλλήλων θα


ανέβει πάνω από 80 € αν πάρουν αύξηση 3.5%
Πdepid (σsalary ∗0.035>80 (employees))

SELECT DISTINCT d e p i d
FROM e m p l o y e e s
WHERE s a l a r y ∗ 0 . 0 3 5 > 8 0 ;

Μόνο στα τμήματα 1 και 3 υπάρχουν υπάλληλοι


που αν ο μισθός τους αυξηθεί κατά 3.5% η
depid αύξηση θα είναι μεγαλύτερη από 80 €. Στα
1 τμήματα αυτά, πιθανά να υπάρχουν περισσότεροι
3 από ένας υπάλληλος με τέτοια αύξηση. Αλλά
αυτό που ενδιαφέρει είναι σε ποιο τμήμα, όχι σε
ποιους και πόσους υπαλλήλους.
(stavrakoudis.econ.uoi.gr) 5 / 21
Χειρισμός τιμών NULL

Δε μπορούμε να χειριστούμε τιμές NULL με τελεστές σύγκρισης


Μια τιμή είναι (IS) ή δεν είναι (IS NOT) NULL
Ο έλεγχος για τιμές NULL αποδίδει πάντοτε TRUE ή FALSE
Δύο τιμές NULL δεν είναι ίσες μεταξύ τους, η μεταξύ τους
σύγκριση δεν έχει νόημα

(stavrakoudis.econ.uoi.gr) 6 / 21

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

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων χωρίς


καταχωρημένο μισθό

SELECT ∗
FROM e m p l o y e e s
WHERE s a l a r y I S NULL;

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων με


καταχωρημένο μισθό

SELECT ∗
FROM e m p l o y e e s
WHERE s a l a r y I S NOT NULL;

(stavrakoudis.econ.uoi.gr) 7 / 21
Ταίριασμα κειμένου

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων με μικρό όνομα


Νίκη

SELECT ∗
FROM e m p l o y e e s
WHERE f i r s t n a m e = ’ NIKH ’ ;

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


σύγκρισης όπως και με αριθμούς
Ωστόσο, το αλφαριθμητικό τοποθετείται πάντα μέσα σε
εισαγωγικά
Ο έλεγχος για τιμές NULL αποδίδει πάντοτε TRUE ή FALSE
Τα εισαγωγικά μπορεί να είναι μονά (’) ή διπλά (’’), ποτέ όμως
δεν είναι αυτάκια!

(stavrakoudis.econ.uoi.gr) 8 / 21

Ταίριασμα κειμένου με τον τελεστή LIKE

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων με μικρό όνομα


που αρχίζει από Ν

SELECT ∗
FROM e m p l o y e e s
WHERE f i r s t n a m e LIKE ’N%’ ;

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων με μικρό όνομα


που αρχίζει από Α και τελειώνει σε Α

SELECT ∗
FROM e m p l o y e e s
WHERE f i r s t n a m e LIKE ’A%A ’ ;

(stavrakoudis.econ.uoi.gr) 9 / 21
LIKE: χαρακτήρες υποκατάστασης

% (ή *) : υποκαθιστά από κανένα ως πολλούς χαρακτήρες


(ή ?) : υποκαθιστά ακριβώς ένα χαρακτήρα
Οι χαρακτήρες υποκατάστασης μπορούν αν συνδυαστούν μεταξύ
τους

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων με μικρό όνομα


που έχει 5 χαρακτήρες και τελειώνει σε Α

SELECT ∗
FROM e m p l o y e e s
WHERE f i r s t n a m e LIKE ’ A ’;

(stavrakoudis.econ.uoi.gr) 10 / 21

Ο τελεστής AND

Δύο παραστάσεις στη φράση WHERE μπορούν να συνδυαστούν


μεταξύ τους με το λογικό τελεστή AND
Χρησιμοποιούμε τον τελεστή AND όταν θέλουμε να ελέγξουμε την
τιμή αληθείας και των δύο παραστάσεων ταυτόχρονα
Οι βάσεις δεδομένων ακολουθούν την τριαδική λογική TRUE,
FALSE, NULL
Στο αποτέλεσμα του ερωτήματος εισέρχονται μόνο οι εγγραφές
που αποδίδουν TRUE
Πίνακας αληθείας:
AND TRUE FALSE NULL
TRUE TRUE FALSE UNK
FALSE FALSE FALSE FALSE
UNK UNK FALSE UNK
Ο τελεστής AND αποδίδει TRUE μόνο όταν και οι δύο παραστάσεις
είναι TRUE
(stavrakoudis.econ.uoi.gr) 11 / 21
΄Ενα παράδειγμα με τον τελεστή AND

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων που εργάζονται


στο τμήμα 4 και ο μισθός τους είναι μεγαλύτερος από 1000 €

SELECT ∗
FROM employees
WHERE depid = 4
AND s a l a r y >= 1 0 0 0 ;

empid firstname lastname depid salary hiredate


206 Νίκος Βλάχος 4 1102.04 2002-12-03
311 Νίκος Στεργιόπουλος 4 1386.05 2002-02-01
780 Ευθαλεία Μικράκη 4 1054.71 2002-12-03

(stavrakoudis.econ.uoi.gr) 12 / 21

Ο τελεστής OR

Δύο παραστάσεις στη φράση WHERE μπορούν να συνδυαστούν


μεταξύ τους με το λογικό τελεστή OR
Χρησιμοποιούμε τον τελεστή OR όταν θέλουμε να ελέγξουμε την
τιμή αληθείας τουλάχιστον μιας από τις δύο παραστάσεις
Οι βάσεις δεδομένων ακολουθούν την τριαδική λογική TRUE
FALSE NULL
Στο αποτέλεσμα του ερωτήματος εισέρχονται μόνο οι εγγραφές
που αποδίδουν TRUE
Πίνακας αληθείας:
OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE UNK
UNK TRUE UNK UNK
Ο τελεστής OR αποδίδει TRUE όταν μία τουλάχιστον παράσταση είναι
TRUE
(stavrakoudis.econ.uoi.gr) 13 / 21
΄Ενα παράδειγμα με τον τελεστή OR

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων που εργάζονται


στο τμήμα 4 ή ο μισθός τους είναι μεγαλύτερος από 1000 €

SELECT ∗
FROM e m p l o y e e s
WHERE d e p i d = 4
OR s a l a r y >= 1 0 0 0 ;

empid firstname lastname depid salary hiredate


.......................................
206 Νίκος Βλάχος 4 1102.04 2002-12-03
230 Βαγγέλης Χριστόπουλος 4 NULL 2002-12-03
234 Αδαμαντία Θεοτοκάτου 5 1534.65 1999-10-01
243 Δέσποινα Παπαδοπούλου 2 1609.52 1999-03-05
311 Νίκος Στεργιόπουλος 4 1386.05 2002-02-01
.......................................
(stavrakoudis.econ.uoi.gr) 14 / 21

Μακριά από παγίδες


Να βρεθούν τα ονοματεπώνυμα των υπαλλήλων που εργάζονται
στα τμήματα 1 και 3
Λάθος απάντηση

SELECT firstname , lastname


FROM employees
WHERE depid = 1
AND depid = 3;

Σωστή απάντηση

SELECT firstname , lastname


FROM employees
WHERE depid = 1
OR depid = 3;

(stavrakoudis.econ.uoi.gr) 15 / 21
Σύνθετες παραστάσεις και παρενθέσεις
Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων που δεν
προσλήφθηκαν το 2002 και εργάζονται στο τμήμα 3
Λάθος απάντηση

SELECT ∗
FROM employees
WHERE depid = 3
AND h i r e d a t e < ’ 2002−01−01 ’
OR h i r e d a t e > ’ 2002−12−31 ’ ;

Σωστή απάντηση

SELECT ∗
FROM employees
WHERE depid = 3
AND ( h i r e d a t e < ’ 2002−01−01 ’
OR h i r e d a t e > ’ 2002−12−31 ’ ) ;

(stavrakoudis.econ.uoi.gr) 16 / 21

Ο τελεστής συνόλου IN

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων που εργάζονται


στα τμήματα 2, 3 και 4

SELECT ∗
FROM employees
WHERE depid = 2
OR depid = 3
OR depid = 4;

Το ίδιο, αλλά πιο απλά


SELECT ∗
FROM e m p l o y e e s
WHERE d e p i d IN ( 2 , 3 , 4 ) ;

(stavrakoudis.econ.uoi.gr) 17 / 21
΄Αρνηση του IN

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων που δεν


εργάζονται στα τμήματα 2, 3 και 4

SELECT ∗
FROM e m p l o y e e s
WHERE d e p i d NOT IN ( 2 , 3 , 4 ) ;

΄Η, ισοδύναμα με:

SELECT ∗
FROM employees
WHERE d e p i d != 2
AND d e p i d != 3
AND d e p i d != 4 ;

(stavrakoudis.econ.uoi.gr) 18 / 21

Ο τελεστής περιοχής τιμών

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων για εκείνους τους


υπαλλήλους που παίρνουν μισθό από 1100 ως 1200 €

SELECT ∗
FROM e m p l o y e e s
WHERE s a l a r y BETWEEN 1100 AND 1 2 0 0 ;

empid firstname lastname depid salary hiredate


172 Χρήστος Βλάσσης 3 1101.70 2000-07-04
206 Νίκος Βλάχος 4 1102.04 2002-12-03
381 Περικλής Κιτσάκης 6 1100.13 2003-02-14
431 Κώστας Παπαδόπουλος 3 1100.23 2002-09-16
503 Μαριλένα Κρέσπα 2 1105.04 2001-03-07

(stavrakoudis.econ.uoi.gr) 19 / 21
Ο τελεστής περιοχής τιμών για ημερομηνίες

Να βρεθεί ο κωδικός των τμημάτων στα οποία απασχολούνται


υπάλληλοι που προσλήφθηκαν μέσα στο 2004

SELECT DISTINCT d e p i d
FROM e m p l o y e e s
WHERE h i r e d a t e BETWEEN ’ 2004−01−01 ’ AND ’ 2004−12−31

depid
4
3

(stavrakoudis.econ.uoi.gr) 20 / 21

SQL Ερωτήματα ομαδοποίησης και


συνάθροισης
SQL: Ερωτήματα ομαδοποίησης και συνάθροισης
GROUP BY, HAVING, COUNT, MIN, MAX, SUM, AVG,
ROLLUP

Περιεχόμενα

1 Εισαγωγή, γενικές παρατηρήσεις

2 Συναρτήσεις συνάθροισης

3 Τιμές NULL και μοναδικές τιμές

4 Ομαδοποίηση εγγραφών

5 Περιορισμός μετά την ομαδοποίηση

6 Μερικά και ολικά αθροίσματα

2 / 56
Σκοπός του μαθήματος

Αν κατανοήσετε αυτό το μάθημα, θα μπορείτε να:


Βρίσκετε πλήθος εγγραφών ή ακραίες τιμές (μέγιστα,
ελάχιστα) πεδίων.
Βρίσκετε αθροίσματα και μέσους όρους αριθμητικών
πεδίων.
Ομαδοποιείτε εγγραφές με βάση ταυτιζόμενες τιμές σε
κάποια πεδία με τη φράση GROUP BY.
Εφαρμόζετε τις συναρτήσεις συνάθροισης στις εγγραφές
που προκύπτουν από την ομαδοποίηση/συνάθροιση.
Εφαρμόζετε την επέκταση της ομαδοποίησης για να
παίρνετε μερικά αθροίσματα με την επιλογή WITH
ROLLUP.
Εφαρμόζετε περιορισμό στις εγγραφές που προκύπτουν
μετά την ομαδοποίηση με τη φράση HAVING.
3 / 56

Συναρτήσεις συνάθροισης
Υπάρχουν πέντε βασικές συναρτήσεις συνάθροισης, που
υποστηρίζονται από όλα τα συστήματα SQL
COUNT για την καταμέτρηση πλήθους
SUM για το άθροισμα
AVG για το μέσο όρο
MIN για την ελάχιστη τιμή
MAX για την μέγιστη τιμή
Υπάρχουν αρκετές άλλες συναρτήσεις (πχ STDEV, VAR),
αλλά η υποστήριξή τους ποικίλει από σύστημα σε σύστημα.

4 / 56
Διάγραμμα σύνταξης των συναρτήσεων
συνάθροισης
COUNT(*)

DISTINCT

COUNT( όνομα πεδίου)

MIN(έκφραση)

MAX(έκφραση)

DISTINCT όνομα πεδίου

AVG( έκφραση )

DISTINCT όνομα πεδίου

SUM( έκφραση )

5 / 56

Ο πίνακας employees από τη βάση company


΄Εστω η σχέση employees με σχήμα:

employees(empid, firstname, lastname, depid, salary , hiredate)

empid firstname lastname depid salary hiredate


102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02
109 Μαρία Αθανασίου 1 2787.69 2000-01-26
153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15
172 Χρήστος Βλάσσης 3 1101.70 2000-07-04
189 Θεόδωρος Αγγελίνας 6 1908.28 2000-06-19
... ... ... ... ... ...
Δείγμα από τα δεδομένα του πίνακα.
Δείτε τα πλήρη περιεχόμενα εδώ:
http://stavrakoudis.econ.uoi.gr/stavrakoudis/?iid=400

6 / 56
Περιεχόμενα

1 Εισαγωγή, γενικές παρατηρήσεις

2 Συναρτήσεις συνάθροισης

3 Τιμές NULL και μοναδικές τιμές

4 Ομαδοποίηση εγγραφών

5 Περιορισμός μετά την ομαδοποίηση

6 Μερικά και ολικά αθροίσματα

7 / 56

Παράδειγμα αθροίσματος στήλης


Να βρεθεί το άθροισμα των μισθών όλων των
υπαλλήλων
Gsum(salary ) (employees)

8 / 56
Παράδειγμα αθροίσματος στήλης
Να βρεθεί το άθροισμα των μισθών όλων των
υπαλλήλων
Gsum(salary ) (employees)

1 SELECT SUM(salary)
2 FROM employees;
3

4 | SUM(salary) |
5 |-------------|
6 | 38232.03 |

9 / 56

Παράδειγμα αθροίσματος στήλης


Να βρεθεί το άθροισμα των μισθών όλων των
υπαλλήλων
Gsum(salary ) (employees)

1 SELECT SUM(salary)
2 FROM employees;
3

4 | SUM(salary) |
5 |-------------|
6 | 38232.03 |

10 / 56
Παράδειγμα αθροίσματος υπό συνθήκη

Να βρεθεί το άθροισμα των μισθών όλων των


υπαλλήλων του τμήματος 4
Gsum(salary ) (σdepid=4 (employees))

11 / 56

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

Να βρεθεί το άθροισμα των μισθών όλων των


υπαλλήλων του τμήματος 4
Gsum(salary ) (σdepid=4 (employees))

1 SELECT SUM(salary)
2 FROM employees
3 WHERE depid = 4;
4

5 | SUM(salary) |
6 |-------------|
7 | 3542.80 |

12 / 56
Παράδειγμα αθροίσματος γενικευμένης προβολής

Να βρεθεί το επιπλέον ποσό που θα δοθεί σε


μισθούς αν οι υπάλληλοι του τμήματος 3 πάρουν
αύξηση 3%
Gsum(salary ×0.03)→sumsal3 (σdepid=3 (employees))

13 / 56

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

Να βρεθεί το επιπλέον ποσό που θα δοθεί σε


μισθούς αν οι υπάλληλοι του τμήματος 3 πάρουν
αύξηση 3%
Gsum(salary ×0.03)→sumsal3 (σdepid=3 (employees))

1 SELECT SUM(salary*0.03) AS sumsal3


2 FROM employees
3 WHERE depid = 3;

14 / 56
Παράδειγμα αθροίσματος γενικευμένης προβολής

Να βρεθεί το επιπλέον ποσό που θα δοθεί σε


μισθούς αν οι υπάλληλοι του τμήματος 3 πάρουν
αύξηση 3%
Gsum(salary ×0.03)→sumsal3 (σdepid=3 (employees))

1 SELECT SUM(salary*0.03) AS sumsal3


2 FROM employees
3 WHERE depid = 3;

Η μετονομασία του πεδίου είναι χρήσιμη αλλά προαιρετική.


Κάντε την πράξη με λογιστικό φύλλο και αναλύστε
πλεονεκτήματα/μειονεκτήματα.
Προσέξτε πως το μόνο που δηλώνει ο χρήστης στην SQL είναι
ονόματα πεδίων και πινάκων. 15 / 56

Παράδειγμα υπολογισμού μέσου όρου

Να βρεθεί ο μέσος μισθός όλων των υπαλλήλων


Gavg (salary ) (employees)

16 / 56
Παράδειγμα υπολογισμού μέσου όρου

Να βρεθεί ο μέσος μισθός όλων των υπαλλήλων


Gavg (salary ) (employees)

1 SELECT AVG(salary)
2 FROM employees;
3

4 | AVG(salary) |
5 ---------------
6 | 1416.001111 |

17 / 56

Μέσος όρος με περιορισμό εγγραφών

Να βρεθεί ο μέσος μισθός των υπαλλήλων του


τμήματος 3
Gavg (salary ) (σdepid=3 (employees))

18 / 56
Μέσος όρος με περιορισμό εγγραφών

Να βρεθεί ο μέσος μισθός των υπαλλήλων του


τμήματος 3
Gavg (salary ) (σdepid=3 (employees))

1 SELECT AVG(salary)
2 FROM employees
3 WHERE depid = 3;
4

5 | AVG(salary) |
6 ---------------
7 | 1311.651250 |

19 / 56

Ελάχιστη τιμή

Να βρεθεί ο μικρότερος μισθός των υπαλλήλων


του τμήματος 3
Gmin(salary ) σdepid=3 (employees)

20 / 56
Ελάχιστη τιμή

Να βρεθεί ο μικρότερος μισθός των υπαλλήλων


του τμήματος 3
Gmin(salary ) σdepid=3 (employees)

1 SELECT MIN(salary)
2 FROM employees
3 WHERE depid = 3;
4

5 | MIN(salary) |
6 ---------------
7 | 1050.96 |

21 / 56

Μέγιστη τιμή

Να βρεθεί η ημερομηνία της πιο πρόσφατης


πρόσληψης
Gmax(hiredate) (employees)

1 SELECT MAX(hiredate)
2 FROM employees;
3

4 | MAX(hiredate) |
5 -----------------
6 | 2004-10-05 |

22 / 56
Καταμέτρηση πλήθους

Να βρεθεί πόσοι υπάλληλοι εργάζονται στο


τμήμα 4
Gcount(empid) (σdepid=4 (employees))

23 / 56

Καταμέτρηση πλήθους

Να βρεθεί πόσοι υπάλληλοι εργάζονται στο


τμήμα 4
Gcount(empid) (σdepid=4 (employees))

1 SELECT COUNT(empid)
2 FROM employees
3 WHERE depid = 4;
4

5 | COUNT(empid) |
6 ----------------
7 | 5 |

24 / 56
COUNT(*)

Να βρεθεί πόσοι υπάλληλοι εργάζονται στο


τμήμα 4
1 SELECT COUNT(*)
2 FROM employees
3 WHERE depid = 4;
4

5 | COUNT(*) |
6 ----------------
7 | 5 |

1 COUNT(empid) : Καταμέτρηση εγγραφών με μη


NULL τιμές στο πεδίο empid.
2 COUNT(*) : Καταμέτρηση εγγραφών
25 / 56

Δύο συναρτήσεις στο ίδιο ερώτημα

Να βρεθεί το εύρος το μισθών του τμήματος 4


Gmax(salary )−min(salary ) (employees)

26 / 56
Δύο συναρτήσεις στο ίδιο ερώτημα

Να βρεθεί το εύρος το μισθών του τμήματος 4


Gmax(salary )−min(salary ) (employees)

1 SELECT MAX(salary)-MIN(salary)
2 FROM employees
3 WHERE depid = 4;
4

5 | MAX(salary)-MIN(salary) |
6 ---------------------------
7 | 331.34 |

27 / 56

Περιεχόμενα

1 Εισαγωγή, γενικές παρατηρήσεις

2 Συναρτήσεις συνάθροισης

3 Τιμές NULL και μοναδικές τιμές

4 Ομαδοποίηση εγγραφών

5 Περιορισμός μετά την ομαδοποίηση

6 Μερικά και ολικά αθροίσματα

28 / 56
Πλήθος μισθοδοτούμενων υπαλλήλων

Να βρεθεί το πλήθος Να βρεθεί το πλήθος


καταχωρημένων μισθών των κωδικών των
1 SELECT COUNT(salary) υπαλλήλων
2 FROM employees; 1 SELECT COUNT(empid)
3
2 FROM employees;
4 | count(salary) | 3
5 ----------------- 4 | count(empid) |
6 | 27 | 5 ----------------
6 | 30 |

Υπάρχουν 30 υπάλληλοι αλλά 27 μισθοί


COUNT(salary) δεν μετράει τις τιμές NULL
Το πεδίο empid δεν παίρνει ποτέ τιμές NULL
γιατί είναι πρωτεύον κλειδί
29 / 56

Τιμές NULL

Να βρεθεί το πλήθος των Να βρεθεί το πλήθος των


υπαλλήλων χωρίς μισθό υπαλλήλων χωρίς μισθό
1 SELECT COUNT(salary) 1 SELECT COUNT(empid)
2 FROM employees 2 FROM employees
3 WHERE salary IS NULL; 3 WHERE salary IS NULL;
4 4

5 | COUNT(salary) | 5 | count(empid) |
6 ----------------- 6 ----------------
7 | 0 | 7 | 3 |

Οι τιμές NULL δεν απαριθμούνται.


Το πλήθος των εγγραφών με τιμή NULL
στο πεδίο salary είναι 3.
30 / 56
Καταμέτρηση μοναδικών τιμών (Λάθος)

Να βρεθεί το πλήθος των τμημάτων των


υπαλλήλων
1 SELECT COUNT(depid)
2 FROM employees;
3

4 | COUNT(depid) |
5 ----------------
6 | 30 |

31 / 56

Καταμέτρηση μοναδικών τιμών (Σωστό)

Να βρεθεί το πλήθος των τμημάτων των


υπαλλήλων
1 SELECT COUNT(DISTINCT depid)
2 FROM employees;
3

4 | COUNT(DISTINCT depid) |
5 -------------------------
6 | 6 |

32 / 56
Περιεχόμενα

1 Εισαγωγή, γενικές παρατηρήσεις

2 Συναρτήσεις συνάθροισης

3 Τιμές NULL και μοναδικές τιμές

4 Ομαδοποίηση εγγραφών

5 Περιορισμός μετά την ομαδοποίηση

6 Μερικά και ολικά αθροίσματα

33 / 56

Ομαδοποίηση
Μέχρι τώρα είδαμε απλά ερωτήματα, η απάντηση των
οποίων ήταν μία τιμή.
Πολλές φορές το ζητούμενο είναι μια λίστα τιμών, μία
τιμή ανά κατηγορία.
Πχ ο μέσος μισθός ανά τμήμα, ή ο αρχαιότερος
υπάλληλος ανά τμήμα
Για αυτές τις περιπτώσεις θα χρειαστούμε μια νέα
φράση: GROUP BY

34 / 56
Πλήθος υπαλλήλων ανά τμήμα
Πλήθος υπαλλήλων ανά τμήμα
depid Gcount(∗) (employees)

35 / 56

Πλήθος υπαλλήλων ανά τμήμα


Πλήθος υπαλλήλων ανά τμήμα
depid Gcount(∗) (employees)

1 SELECT depid, COUNT(*)


2 FROM employees
3 GROUP BY depid;

depid COUNT(*)
1 3
2 4
3 9
4 5
5 2
6 7
36 / 56
Πλήθος υπαλλήλων ανά τμήμα
Πλήθος υπαλλήλων ανά τμήμα
depid Gcount(∗) (employees)

1 SELECT depid, COUNT(*)


2 FROM employees
3 GROUP BY depid;

depid COUNT(*) Η SQL έχει πλεονεκτήματα:


Δεν χρειάζεται να γνωρίζουμε το
1 3
μέγεθος του πίνακα.
2 4
3 9 Το ίδιο ακριβώς ερώτημα SQL θα
χρησιμοποιηθεί έστω και αν
4 5 αλλάξουν τα δεδομένα του πίνακα
5 2 μετά από προσθήκη ή αφαίρεση
6 7 εγγραφών.
37 / 56

Μικρότερο ανά ...

Ο μικρότερος μισθός ανά τμήμα υπαλλήλων


depid Gmin(salary ) (employees)

38 / 56
Μικρότερο ανά ...

Ο μικρότερος μισθός ανά τμήμα υπαλλήλων


depid Gmin(salary ) (employees)

1 SELECT depid, MIN(salary)


2 FROM employees
3 GROUP BY depid;
4

5 depid MIN(salary)
6 -------------------
7 1 1754.67
8 2 1105.04
9 3 1050.96
10 4 1054.71
11 5 1051.92
12 6 1100.13
39 / 56

Περιορισμός και ομαδοποίηση

Να βρεθεί το άθροισμα των μισθών των


υπαλλήλων ανά τμήμα για τους υπαλλήλους που
προσλήφθηκαν μέσα στο 2004

depid Gsum(salary )
(σhiredate≥′ 2004−01−01′ ∧hiredate≤′ 2004−12−31′ (employees))

40 / 56
Περιορισμός και ομαδοποίηση

Να βρεθεί το άθροισμα των μισθών των


υπαλλήλων ανά τμήμα για τους υπαλλήλους που
προσλήφθηκαν μέσα στο 2004

depid Gsum(salary )
(σhiredate≥′ 2004−01−01′ ∧hiredate≤′ 2004−12−31′ (employees))

1 SELECT depid, SUM(salary)


2 FROM employees
3 WHERE hiredate BETWEEN ’2004-01-01’
4 AND ’2004-12-31’
5 GROUP BY depid;

41 / 56

Ομαδοποίηση και ταξινόμηση


Να βρεθεί το άθροισμα των μισθών των
υπαλλήλων ανά τμήμα με φθίνουσα ταξινόμηση
ως προς το άθροισμα των μισθών

42 / 56
Ομαδοποίηση και ταξινόμηση
Να βρεθεί το άθροισμα των μισθών των
υπαλλήλων ανά τμήμα με φθίνουσα ταξινόμηση
ως προς το άθροισμα των μισθών
1 SELECT depid, SUM(salary)
2 FROM employees
3 GROUP BY depid
4 ORDER BY SUM(salary) DESC;
5 | depid | SUM(salary) |
6 |-------|-------------|
7 | 3 | 10493.21 |
8 | 6 | 9853.82 |
9 | 1 | 6395.35 |
10 | 2 | 5360.28 |
11 | 4 | 3542.80 |
12 | 5 | 2586.57 |
43 / 56

Περιεχόμενα

1 Εισαγωγή, γενικές παρατηρήσεις

2 Συναρτήσεις συνάθροισης

3 Τιμές NULL και μοναδικές τιμές

4 Ομαδοποίηση εγγραφών

5 Περιορισμός μετά την ομαδοποίηση

6 Μερικά και ολικά αθροίσματα

44 / 56
Περιορισμός μετά την ομαδοποίηση
Τμήματα με περισσότερους από 4 υπαλλήλους

σcount(depid)>4 depid Gcount(empid) (employees)

45 / 56

Περιορισμός μετά την ομαδοποίηση


Τμήματα με περισσότερους από 4 υπαλλήλους

σcount(depid)>4 depid Gcount(empid) (employees)

1 SELECT depid, COUNT(depid)


2 FROM employees
3 GROUP BY depid
4 HAVING COUNT(depid) > 4;

46 / 56
Περιορισμός μετά την ομαδοποίηση
Τμήματα με περισσότερους από 4 υπαλλήλους

σcount(depid)>4 depid Gcount(empid) (employees)

1 SELECT depid, COUNT(depid)


2 FROM employees
3 GROUP BY depid
4 HAVING COUNT(depid) > 4;

depid COUNT(*) Ο όρος HAVING τοποθετείται μετά


τον όρο GROUP BY.
1 3
2 4 Η σύνταξη είναι παρόμοια με αυτή
3 9 του όρου WHERE.
4 5 Ο όρος HAVING περιορίζει το
5 2 αποτέλεσμα του ερωτήματος με βάση
6 7 πεδία που παράγονται από τον όρο
GROUP BY. 47 / 56

Περιορισμός πριν και μετά την ομαδοποίηση

Να βρεθούν τα τμήματα με περισσότερους από 3


υπαλλήλους με μισθό μεγαλύτερο από 1200 €

σcount(depid)>3 depid Gcount(empid) (σsalary >1200 (employees))

48 / 56
Περιορισμός πριν και μετά την ομαδοποίηση

Να βρεθούν τα τμήματα με περισσότερους από 3


υπαλλήλους με μισθό μεγαλύτερο από 1200 €

σcount(depid)>3 depid Gcount(empid) (σsalary >1200 (employees))

1 SELECT depid
2 FROM employees
3 WHERE salary > 1200
4 GROUP BY depid
5 HAVING COUNT(depid) > 3;
6

7 | depid |
8 |-------|
9 | 3 |
10 | 6 |
49 / 56

Περιεχόμενα

1 Εισαγωγή, γενικές παρατηρήσεις

2 Συναρτήσεις συνάθροισης

3 Τιμές NULL και μοναδικές τιμές

4 Ομαδοποίηση εγγραφών

5 Περιορισμός μετά την ομαδοποίηση

6 Μερικά και ολικά αθροίσματα

50 / 56
ROLLUP (μερικά αθροίσματα)
Πλήθος των υπαλλήλων ανά τμήμα και το
συνολικό πλήθος των υπαλλήλων της εταιρείας

51 / 56

ROLLUP (μερικά αθροίσματα)


Πλήθος των υπαλλήλων ανά τμήμα και το
συνολικό πλήθος των υπαλλήλων της εταιρείας
1 SELECT depid, COUNT(*)
2 FROM employees
3 GROUP BY depid WITH ROLLUP;

52 / 56
ROLLUP (μερικά αθροίσματα)
Πλήθος των υπαλλήλων ανά τμήμα και το
συνολικό πλήθος των υπαλλήλων της εταιρείας
1 SELECT depid, COUNT(*)
2 FROM employees
3 GROUP BY depid WITH ROLLUP;

depid COUNT(*)
1 3 WITH ROLLUP : μετά το
2 4 πεδίο που ακολουθεί τον όρο
3 9 GROUP BY.
4 5 Προσοχή την τιμή NULL στο
5 2 τέλος που αντιστοιχεί στο
6 7 σύνολο των εγγραφών.
NULL 30
53 / 56

Μερικά αθροίσματα με διπλή ομαδοποίηση


Να βρεθεί ο μέσος μισθός των υπαλλήλων ανά
τμήμα και έτος πρόσληψης για τμήματα με κωδικό 2
και 6
1 SELECT depid, YEAR(hiredate), AVG(salary)
2 FROM employees
3 WHERE depid IN (2,6)
4 GROUP BY depid, YEAR(hiredate) WITH ROLLUP;
5

6 | depid | YEAR(hiredate) | AVG(salary) |


7 ----------------------------------------
8 | 2 | 1999 | 1609.520000 |
9 | 2 | 2000 | 1323.800000 |
10 | 2 | 2001 | 1213.480000 |
11 | 2 | NULL | 1340.070000 |
12 | 6 | 2000 | 1771.620000 |
13 | 6 | 2001 | 1336.985000 |
14 | 6 | 2002 | 1323.980000 |
15 | 6 | 2003 | 1156.315000 |
16 | 6 | NULL | 1407.688571 |
17 | NULL | NULL | 1383.100000 |

54 / 56
Αναστροφή της λίστας πεδίων
Ο μέσος μισθός των υπαλλήλων ανά έτος πρόσληψης και
τμήμα για τμήματα με κωδικό 2 και 6

1 SELECT YEAR(hiredate), depid, AVG(salary)


2 FROM employees
3 WHERE depid IN (2,6)
4 GROUP BY YEAR(hiredate), depid WITH ROLLUP;
5

6 | YEAR(hiredate) | depid | AVG(salary) |


7 ----------------------------------------
8 | 1999 | 2 | 1609.520000 |
9 | 1999 | NULL | 1609.520000 |
10 | 2000 | 2 | 1323.800000 |
11 | 2000 | 6 | 1771.620000 |
12 ........................................
13 | NULL | NULL | 1383.100000 |
55 / 56

Ερωτήματα SQL με σύζευξη πινάκων


Ερωτήματα SQL με σύζευξη πινάκων

ΜΗ ΕΙΝΑΙ ΒΑΣΙΛΙΚΗΝ
ΑΤΡΑΠΟΝ ΕΠΙ
ΓΕΩΜΕΤΡΙΑΝ

Σκοπός του μαθήματος

Εκτελείτε ερωτήματα ανάσυρσης δεδομένων από πολλούς πίνακες

Εφαρμόζετε κατάλληλες συνδέσεις (JOIN) στους πίνακες

Εκτελείτε ερωτήματα που αντιστοιχούν στις σχεσιακές πράξεις


καρτεσιανού γινομένου, σύζευξης, τομής, διαφοράς και διαίρεσης

Αντιληφθείτε τις διαφορές και ομοιότητες ανάμεσα στους


διαφορετικούς τύπους συζεύξεων

2 / 30
Το σχήμα της βάσης company

departments(depid, depname, manager )


employees(empid, firstname, lastname, depid, salary , hiredate)
projects(proid, title, budget, startdate, enddate, progress)
workson(empid, proid)

departments, τα τμήματα της εταιρείας


employees, οι υπάλληλοι της εταιρείας
projects, τα έργα που εκτελεί η εταιρεία
workson, η απασχόληση των υπαλλήλων στα έργα

3 / 30

Το σχήμα της βάσης company

departments, τα
τμήματα της εταιρείας
employees, οι υπάλληλοι
της εταιρείας
projects, τα έργα που
εκτελεί η εταιρεία
workson, η απασχόληση
των υπαλλήλων στα
έργα

4 / 30
Πρωτεύοντα και ξένα κλειδιά

Κάθε πίνακας έχει ένα πρωτεύον κλειδί, δηλαδή ένα υποσύνολο


των πεδίων παίρνει μοναδικές τιμές που δεν επαναλαμβάνονται
Το πρωτεύον κλειδί μπορεί να είναι απλό (ένα πεδίο), ή σύνθετο
(συνδυασμός πεδίων)
Κάθε εγγραφή ενός πίνακα μπορεί να προσδιοριστεί με τη χρήση του
πρωτεύοντος κλειδιού
Η σύνδεση δεδομένων από διαφορετικούς πίνακες σύζευξη γίνεται
(συνήθως) με τη χρήση του ξένου κλειδιού
Το ξένο κλειδί είναι η μεταφορά του πρωτεύοντος κλειδιού ενός
πίνακα σε έναν άλλο πίνακα
΄Ενας πίνακας μπορεί να έχει πολλά ξένα κλειδιά
ή να μην έχει κανένα

5 / 30

Συσχέτιση departments και employees

Ο πίνακας departments έχει πρωτεύον κλειδί το πεδίο depid


Ο πίνακας employees έχει πρωτεύον κλειδί το πεδίο empid
Ο πίνακας employees έχει ξένο κλειδί το πεδίο depid, ο οποίο
παίρνει τιμές που αναφέρονται στις τιμές του πεδίου depid του
πίνακα departments:

departments.depid = employees.depid

Το πεδίο employees.depid δεν είναι πρωτεύον κλειδί και δεν παίρνει


μοναδικές τιμές: πολλοί υπάλληλοι εργάζονται στο ίδιο τμήμα
Οι πίνακες departments και employees
συσχετίζονται μεταξύ τους με συσχέτιση ΄Ενα προς Πολλά

6 / 30
Συσχέτιση employees και projects

Ο πίνακας workson έχει πρωτεύον κλειδί το συνδυασμό των πεδίων


empid και proid (σύνθετο κλειδί)
Ο πίνακας departments έχει πρωτεύον κλειδί το πεδίο depid
Ο πίνακας projects έχει πρωτεύον κλειδί το πεδίο poid
΄Ενας υπάλληλος απασχολείται σε πολλά έργα,
ένα έργο απασχολεί πολλούς υπαλλήλους,
επομένως η συσχέτιση είναι Πολλά προς Πολλά
Σε τέτοιες περιπτώσεις απαιτούνται δύο ξένα κλειδιά,
τα οποία πρέπει να τοποθετηθούν σε ξεχωριστό πίνακα
Η λύση βρίσκεται στη δημιουργία του πίνακα workson
ο οποίος έχει δύο ξένα κλειδιά: empid και proid
Η σύζευξη των πινάκων employees και projects
γίνεται μέσω του πίνακα workson

7 / 30

Συσχέτιση employees και projects μέσω workson

Ο πίνακας employees έχει πρωτεύον κλειδί το πεδίο empid


Το πεδίο empid είναι ξένο κλειδί στον πίνακα workson
Η συσχέτιση ανάμεσα στους πίνακες employees και workson είναι
΄Ενα προς Πολλά: ένας υπάλληλος απασχολείται σε πολλά έργα
Ο πίνακας projects έχει πρωτεύον κλειδί το πεδίο proid
Το πεδίο proid είναι ξένο κλειδί στον πίνακα workson
Η συσχέτιση ανάμεσα στους πίνακες projects και workson είναι
΄Ενα προς Πολλά: ένα έργο απασχολεί πολλούς υπαλλήλους

8 / 30
Το σχήμα της βάσης company

departments, τα
τμήματα της εταιρείας
employees, οι υπάλληλοι
της εταιρείας
projects, τα έργα που
εκτελεί η εταιρεία
workson, η απασχόληση
των υπαλλήλων στα
έργα

9 / 30

Καρτεσιανό γινόμενο στη βάση δεδομένων company

Ο συνδυασμός των πινάκων departments και employees

departments × employees

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


των δεδομένων των πινάκων departments και employees:
Το αποτέλεσμα είναι πίνακας με πεδία τα πεδία τόσο του πίνακα
departments όσο και τα πεδία του πίνακα employees
Το αποτέλεσμα έχει εγγραφές όλους τους συνδυασμούς των
εγγραφών του πίνακα departments με τις εγγραφές του πίνακα
employees
Το καρτεσιανό γινόμενο είναι χρήσιμο μόνο ως ενδιάμεσο
αποτέλεσμα

10 / 30
Καρτεσιανό γινόμενο, στην SQL

departments × employees

Καρτεσιανό γινόμενο τμημάτων και υπαλλήλων

SELECT ∗
FROM d e p a r t m e n t s , e m p l o y e e s ;

Η σύνταξη στην SQL είναι απλή: γράφουμε τους πίνακες μετά το


FROM και τους χωρίζουμε με κόμμα
Μπορούμε να γράψουμε περισσότερο από δύο πίνακες
Προσοχή! το αποτέλεσμα μπορεί να περιέχει μεγάλο όγκο
εγγραφών, πχ δύο πίνακες με 20 και 50 εγγραφές αντίστοιχα,
δίνουν στο αποτέλεσμα 20 × 50 = 1000 εγγραφές

11 / 30

Φυσική σύζευξη στην SQL

departments ⊲⊳ employees

Σύζευξη τμημάτων και υπαλλήλων

SELECT ∗
FROM d e p a r t m e n t s NATURAL JOIN e m p l o y e e s ;

Πempid,lastname,depname (departments ⊲⊳ employees)

Να βρεθεί ο κωδικός και το επώνυμο των υπαλλήλων, καθώς και το


όνομα του τμήματος στο οποίο απασχολούνται

SELECT empid , l a s t n a m e , depname


FROM d e p a r t m e n t s NATURAL JOIN e m p l o y e e s ;

12 / 30
Σύζευξη θήτα στην SQL

departments ⊲⊳departments.depid=employees.depid employees

Σύζευξη τμημάτων και υπαλλήλων

SELECT ∗
FROM d e p a r t m e n t s , e m p l o y e e s
WHERE d e p a r t m e n t s . d e p i d = e m p l o y e e s . d e p i d ;

Προσέξτε τη γραφή πίνακας.πεδίο


Το καρτεσιανό γινόμενο είναι χρήσιμο μόνο ως ενδιάμεσο
αποτέλεσμα
Στη φράση WHERE μπορούν να προστεθούν
επιπλέον περιορισμοί (με AND)
Στη θήτα σύζευξη είναι δυνατό να πραγματοποιηθεί
και με πεδία που δεν έχουν το ίδιο όνομα
13 / 30

Εσωτερική σύζευξη στην SQL

Σύζευξη τμημάτων και υπαλλήλων

SELECT ∗
FROM d e p a r t m e n t s INNER JOIN e m p l o y e e s
ON d e p a r t m e n t s . d e p i d = e m p l o y e e s . d e p i d ;

Οι δύο πίνακες χωρίζονται με τη φράση INNER JOIN


Αντί για WHERE υπάρχει (υποχρεωτικά) μετά το INNER JOIN η
φράση ON
Η πρώτη έκδοση της SQL δεν υποστηρίζει αυτό τον τρόπο γραφής

14 / 30
Παράδειγμα INNER JOIN – 1
Να δοθεί το επώνυμο των υπαλλήλων και το όνομα του τμήματος στο
οποίο εργάζονται
Πfirstname,lastname,depname
(departments ⊲⊳departments.depid=employees.depid employees)

SELECT e m p l o y e e s . l a s t n a m e , d e p a r t m e n t s . depname
FROM d e p a r t m e n t s INNER JOIN e m p l o y e e s
ON e m p l o y e e s . d e p i d = d e p a r t m e n t s . d e p i d ;

Η ερώτηση ζητά δεδομένα που είναι αποθηκευμένα σε δύο πίνακες


Επομένως χρειάζεται σύζευξη των πινάκων employees και
departments
Η σύζευξη γίνεται με βάση το κοινό του πεδίο depid
Το πεδίο depid είναι πρωτεύον κλειδί στον πίνακα departments
Το πεδίο depid είναι ξένο κλειδί στον
πίνακα employees
Η σύζευξη με βάση πρωτεύον και ξένο κλειδί
είναι η πλέον συνηθισμένη περίπτωση σύζευξης
15 / 30

Μετονομασία πινάκων
Με χρήση του AS

FROM e m p l o y e e s AS e

Χωρίς χρήση του AS

FROM e m p l o y e e s e

Στη σύζευξη

FROM e m p l o y e e s e INNER JOIN d e p a r t m e n t s d

16 / 30
Παράδειγμα INNER JOIN – 2

Να δοθεί το όνομα των υπαλλήλων, το όνομα του τμήματος στο οποίο


εργάζονται, και ο μισθός τους
Πfirstname,lastname,depname,salary
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees))

SELECT e . f i r s t n a m e , e . l a s t n a m e , d . depname , e . s a l a r y
FROM e m p l o y e e s e INNER JOIN d e p a r t m e n t s d
ON e . d e p i d = d . d e p i d ;

firstname lastname depname salary


Μαρία Αθανασίου Διοίκησης/Επίβλεψης 2787.69
Κρινιώ Μαροπούλου Διοίκησης/Επίβλεψης 1754.67
Κυριάκος Ρούσσης Διοίκησης/Επίβλεψης 1852.99
Μαρία Αλεβιζάτου Οικονομολόγων/Λογιστών 1321.92
Δέσποινα Παπαδοπούλου Οικονομολόγων/Λογιστών 1609.52
Πέτρος Αρβανιτάκης Οικονομολόγων/Λογιστών 1323.80
... ... ... ...
17 / 30

Παράδειγμα INNER JOIN – 3

Να δοθεί το όνομα των υπαλλήλων, το όνομα του τμήματος στο οποίο


εργάζονται και ο μισθός τους, για υπαλλήλους με μισθός μεταξύ 1050
και 1300 €
Πfirstname,lastname,depname,salary (σsalary ≥1050∧salary ≤1300
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)))

SELECT e . f i r s t n a m e , e . l a s t n a m e , d . depname , e . s a l a r y
FROM e m p l o y e e s e INNER JOIN d e p a r t m e n t s d
ON e . d e p i d = d . d e p i d
WHERE e . s a l a r y BETWEEN 1050 AND 1 3 0 0 ;

Ο όρος WHERE μπορεί να χρησιμοποιηθεί


για περιορισμό των εγγραφών.
Η παράσταση συνθήκης μπορεί να αφορά οποιοδήποτε
πεδίο από αυτά που υπάρχουν στους δύο πίνακες.
18 / 30
Παράδειγμα INNER JOIN – 4
Να βρεθεί ο κωδικός και το όνομα όλων των υπαλλήλων που
απασχολούνται στο έργο με κωδικό 38, με αύξουσα ταξινόμηση ως προς
το επώνυμο

Πempid,firstname,lastname (σproid=38 (̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)))

SELECT e . empid , e . f i r s t n a m e , e . l a s t n a m e
FROM e m p l o y e e s e INNER JOIN workson w
ON e . empid = w . empid
WHERE w . p r o i d = 38
ORDER BY e . l a s t n a m e ASC;

Ο όρος ORDER BY πάντα στο τέλος.


Προσέξτε πως χρειάζεται σύζευξη ακόμα και αν
όλα τα πεδία που εμφανίζονται στη φράση SELECT
βρίσκονται σε ένα πίνακα (γιατί;)
19 / 30

Πολλά προς πολλά

Να βρεθούν τα ονόματα των υπαλλήλων και ο κωδικός και ο


προϋπολογισμός των έργων στα οποία συμμετέχουν υπάλληλοι με μισθό
μεγαλύτερο του 1700 €

Πfirstname,lastname,proid,budget (σsalary >1700


(̺e (employees) ⊲⊳d.depid=e.depid ̺w (workson) ⊲⊳w .proid=p.proid ̺p (projects)))

SELECT e . f i r s t n a m e , e . l a s t n a m e , p . p r o i d , p . b u d g e t
FROM ( e m p l o y e e s e INNER JOIN workson w
ON e . empid = w . empid )
INNER JOIN p r o j e c t s p
ON p . p r o i d = w . p r o i d
WHERE e . s a l a r y > 1 7 0 0 ;

20 / 30
Πολλά προς πολλά – Εναλλακτικός τρόπος

Να βρεθούν τα ονόματα των υπαλλήλων και ο κωδικός και ο


προϋπολογισμός των έργων στα οποία συμμετέχουν υπάλληλοι με μισθό
μεγαλύτερο του 1700 €

Πfirstname,lastname,proid,budget (σe.empid=w .empid∧p.proid=w .proid∧e.salary >1700


(̺e (employees) × ̺w (workson) × ̺p (projects)))

SELECT e . f i r s t n a m e , e . lastname , p . proid , p . budget


FROM e m p l o y e e s e , workson w , p r o j e c t s p
WHERE e . empid = w . empid
AND p . proid = w. proid
AND e . s a l a r y > 1700;

21 / 30

Ερώτημα με 4 πίνακες
Να βρεθεί το όνομα των υπαλλήλων και του τμήματος των υπαλλήλων
για όλους τους υπαλλήλους που προσλήφθηκαν μετά τις 1/1/2005 και
απασχολούνται σε έργα με προϋπολογισμό πάνω από 300,000 €
Πfirstname,lastname,depname (σhiredate>′ 2004−01−01′ ∧budget>100000
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)
⊲⊳e.empid=w .empid ̺w (workson) ⊲⊳w .proid=p.proid ̺p (projects))

SELECT e . f i r s t n a m e , e . l a s t n a m e , d . depname
FROM ( ( d e p a r t m e n t s d INNER JOIN e m p l o y e e s e
ON d . d e p i d = e . d e p i d )
INNER JOIN workson w
ON e . empid = w . empid )
INNER JOIN p r o j e c t s p
ON p . p r o i d = w . p r o i d
WHERE e . h i r e d a t e > ’ 2004−01−01 ’
AND p . b u d g e t > 3 0 0 0 0 0 ;

22 / 30
Παράδειγμα εξωτερικής σύζευξης – το πρόβλημα

Να βρεθούν τα ονόματα των υπαλλήλων του τμήματος 4 και οι κωδικοί


των έργων που συμμετέχουν
Πe.firstname,e.lastname,w .proid (σe.depid=4
(̺e (employees) ⊲⊳d.depid=e.depid ̺w (workson)))

SELECT e . f i r s t n a m e , e . l a s t n a m e , w . p r o i d
FROM e m p l o y e e s e INNER JOIN workson w
ON e . empid = w . empid
WHERE e . d e p i d = 4 ;

firstname lastname proid Τι γίνεται με τους υπαλλήλους του


Νίκος Βλάχος 12 τμήματος 4 που δεν απασχολούνται σε
Βαγγέλης Χριστόπουλος 12 κανένα έργο;
Παύλος Περίδης 43
Πως μπορούμε να τους εμφανίσουμε
Ευθαλεία Μικράκη 21
στο αποτέλεσμα;

23 / 30

Παράδειγμα εξωτερικής σύζευξης – Η λύση


Να βρεθούν τα ονόματα των υπαλλήλων του τμήματος 4 και οι κωδικοί των
έργων που συμμετέχουν
Πe.firstname,e.lastname,w .proid (σe.depid=4
(̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)))

SELECT e . f i r s t n a m e , e . l a s t n a m e , w . p r o i d
FROM e m p l o y e e s e LEFT JOIN workson w
ON e . empid = w . empid
WHERE e . d e p i d = 4 ;

firstname lastname proid


Νίκος Βλάχος 12 Το όνομα του υπαλλήλου εμφανίζεται
Βαγγέλης Χριστόπουλος 12 στο αποτέλεσμα.
Νίκος Στεργιόπουλος NULL Η στήλη proid συμπληρώνεται με
Παύλος Περίδης 43 NULL.
Ευθαλεία Μικράκη 21 Η τιμή NULL
δημιουργήθηκε κατά
την εκτέλεση του 24 / 30
ερωτήματος, δεν υπήρχε
Αριστερή και δεξιά σύζευξη – Ισοδυναμία
Να βρεθούν τα ονόματα των υπαλλήλων του τμήματος 4 και οι κωδικοί
των έργων που συμμετέχουν
Αριστερή σύζευξη
Πe.firstname,e.lastname,w .proid (σe.depid=4
(̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)))

SELECT e . f i r s t n a m e , e . l a s t n a m e , w . p r o i d
FROM e m p l o y e e s e LEFT JOIN workson w
ON e . empid = w . empid
WHERE e . d e p i d = 4 ;

Δεξιά σύζευξη
Πe.firstname,e.lastname,w .proid (σe.depid=4
(̺w (workson) ⊲⊳ w .empid=e.empid ̺e (employees)))

SELECT e . f i r s t n a m e , e . l a s t n a m e , w . p r o i d
FROM workson w RIGHT JOIN e m p l o y e e s e
ON w . empid = e . empid
WHERE e . d e p i d = 4 ;

25 / 30

Αριστερή και δεξιά σύζευξη

1 Οι δύο προτάσεις SQL είναι απολύτως ισοδύναμες και δίνουν το


ίδιο αποτέλεσμα.
2 Κατά παράδοση, προτιμάται η αριστερή σύζευξη.
3 Οι εξωτερικές συζεύξεις χρησιμοποιούνται όταν θέλουμε στο
αποτέλεσμα όλες τις εγγραφές ενός πίνακα, ανεξάρτητα αν αυτές
έχουν σύνδεση με τον άλλο πίνακα που υπάρχει στη σύζευξη.
4 Κατά την εξωτερική σύζευξη, αν υπάρχουν μη συνδεδεμένες
εγγραφές, δημιουργούνται τιμές NULL.
5 Ο έλεγχος (WHERE) για τιμές NULL είναι πολύ συχνός στις
εξωτερικές συνδέσεις.

26 / 30
Εξωτερική σύζευξη και διαφορά
Ποιοι υπάλληλοι δεν απασχολούνται σε κανένα έργο;
Πe.∗ (σw .empid IS NULL
(̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)))

SELECT e . ∗
FROM e m p l o y e e s e LEFT JOIN workson w
ON e . empid = w . empid
WHERE w . empid I S NULL;

1 Το ερώτημα δε μπορεί να απαντηθεί με φυσική ή εσωτερική σύζευξη.


2 Οι τιμές των πεδίων e.empid και w.empid
είτε ταυτίζονται, είτε κάποια τιμή
του πεδίου e.empid δεν έχει
αντίστοιχη τιμή στον πίνακα workson.
3 Τέτοιες περιπτώσεις συλλαμβάνονται
με τον έλεγχο για τιμές NULL.
27 / 30

Εξωτερική σύζευξη – επιπλέον ανάλυση


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

SELECT e . empid , w . empid


FROM e m p l o y e e s e LEFT JOIN workson w
ON e . empid = w . empid
WHERE w . empid I S NULL;

Η συνθήκη e.empid = w.empid δεν ισχύει


για τρεις εγγραφές
Πχ, το 311, υπάρχει στον πίνακα
e.empid w.empid employees αλλά δεν υπάρχει στον πίνακα
311 NULL workson
721 NULL Η αριστερή σύζευξη επιτρέπει
811 NULL την εμφάνιση της τιμής 311 στο
πεδίο e.empid
Το πεδίο w.empid θα συμπληρωθεί
με NULL
28 / 30
Εξωτερική σύζευξη – σύνοψη

1 Τρεις εγγραφές του πίνακα employees δεν έχουν ταιριαστές


εγγραφές στον πίνακα workson
2 Ο πίνακας workson δεν περιέχει καμία εγγραφή με NULL τιμές Ο
τρόπος με τον οποίο συνδυάστηκαν οι δύο πίνακες παρήγαγε τις
τιμές NULL, που αντιστοιχούν στα πεδία empid, proid του πίνακα
workson
3 Η αριστερή εξωτερική σύζευξη, ορίζει πως στο αποτέλεσμα θα
υπάρχουν όλες οι εγγραφές του αριστερού πίνακα και στα πεδία του
δεξιού πίνακα θα τοποθετηθούν είτε τιμές που αντιστοιχούν στον
κανόνα της σύζευξης, εδώ e.empid = w.empid, είτε τιμές NULL,
εκεί όπου δεν βρέθηκαν ταιριαστές εγγραφές
4 Επομένως, οι τρεις εγγραφές με NULL τιμές στα πεδία του
πίνακα workson, δεν οφείλονται σε αποθηκευμένες τιμές,
αλλά σε παραγόμενες μετά από εξωτερική σύζευξη

29 / 30

Ερωτήματα SQL με σύζευξη και


ομαδοποίηση
Ερωτήματα SQL με σύζευξη και ομαδοποίηση
Παραδείγματα και εφαρμογές από τη βάση δεδομένων company

Περιεχόμενα

1 Πλήθος υπαλλήλων ανά τμήμα με μισθό άνω των 1300 €

2 Υπάλληλοι σε ακριβώς 2 έργα

3 ΄Εργα με 3 υπαλλήλους του τμήματος 2

4 Απασχόληση σε έργα των υπαλλήλων του τμήματος 4

5 Πλήθος υπαλλήλων που προσλήφθηκαν το 2002 και


εργάζονται σε έργα με πρόοδο < 75%

6 Ασκήσεις επανάληψης

2 / 128
Ομαδοποίηση 1:Ν

Να βρεθεί το πλήθος των εργαζομένων με μισθό


μεγαλύτερο των 1300 € ανά όνομα τμήματος

3 / 128

Ομαδοποίηση 1:Ν

Να βρεθεί το πλήθος των εργαζομένων με μισθό


μεγαλύτερο των 1300 € ανά όνομα τμήματος
1 depname COUNT(*)
2 ------------------------------------------
3 Γραμματείας 1
4 Διοίκησης/Επίβλεψης 3
5 Εξωτερικών συνεργατών 1
6 Επιστημόνων/Μηχανικών 3
7 Μάνατζμεντ/Πωλήσεων 5
8 Οικονομολόγων/Λογιστών 3

4 / 128
Ομαδοποίηση 1:Ν

Να βρεθεί το πλήθος των εργαζομένων με μισθό


μεγαλύτερο των 1300 € ανά όνομα τμήματος
1 depname COUNT(*)
2 ------------------------------------------
3 Γραμματείας 1
4 Διοίκησης/Επίβλεψης 3
5 Εξωτερικών συνεργατών 1
6 Επιστημόνων/Μηχανικών 3
7 Μάνατζμεντ/Πωλήσεων 5
8 Οικονομολόγων/Λογιστών 3

Δεδομένα από δύο πίνακες: departments, employees,


επομένως θα χρειαστεί κάποιου είδους σύζευξη.
Ομαδοποίηση απαραίτητη: πλήθος ανά ...
5 / 128

΄Εχουμε ξαναδεί παρόμοιο παράδειγμα

Πλήθος υπαλλήλων ανά τμήμα


depid Gcount(∗) (employees)

6 / 128
΄Εχουμε ξαναδεί παρόμοιο παράδειγμα

Πλήθος υπαλλήλων ανά τμήμα


depid Gcount(∗) (employees)

1 SELECT depid, COUNT(*) depid COUNT(*)


2 FROM employees 1 3
3 GROUP BY depid; 2 4
3 9
4 5
5 2
6 7

7 / 128

Ομαδοποίηση 1:Ν – βήμα 1

Τρόπος σκέψης
Χρειαζόμαστε το όνομα τμήματος, δηλαδή το πεδίο
depname του πίνακα departments.
Οι υπάλληλοι αποθηκεύονται στον πίνακα employees, και
γνωρίζουμε ότι το πεδίο depid του πίνακα αυτού μας
πληροφορεί για το τμήμα όπου απασχολείται κάθε
υπάλληλος.

8 / 128
Ομαδοποίηση 1:Ν – βήμα 2
Οι πίνακες departments και employees έχουν συσχέτιση ένα
προς πολλά, το πεδίο employees.depid είναι ξένο κλειδί.

9 / 128

Ομαδοποίηση 1:Ν – βήμα 2


Οι πίνακες departments και employees έχουν συσχέτιση ένα
προς πολλά, το πεδίο employees.depid είναι ξένο κλειδί.

Σύνδεση πινάκων:
departments ⊲⊳departments.depid=employees.depid employees

1 FROM departments INNER JOIN employees


2 ON departments.depid = employees.depid

10 / 128
Ομαδοποίηση 1:Ν – βήμα 2
Οι πίνακες departments και employees έχουν συσχέτιση ένα
προς πολλά, το πεδίο employees.depid είναι ξένο κλειδί.

Σύνδεση πινάκων:
departments ⊲⊳departments.depid=employees.depid employees

1 FROM departments INNER JOIN employees


2 ON departments.depid = employees.depid

ή με τη χρήση ψευδωνύμων των πινάκων:


̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)

1 FROM employees e INNER JOIN departments d


2 ON e.depid = d.depid
11 / 128

Ομαδοποίηση 1:Ν – βήμα 3

Περιορισμός εγγραφών
Υπάρχει ο περιορισμός για τον μισθό των υπαλλήλων στο
ερώτημα. Επομένως πρέπει να συμπληρωθεί ο όρος WHERE:
σe.salary >1300 (̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees))

12 / 128
Ομαδοποίηση 1:Ν – βήμα 3

Περιορισμός εγγραφών
Υπάρχει ο περιορισμός για τον μισθό των υπαλλήλων στο
ερώτημα. Επομένως πρέπει να συμπληρωθεί ο όρος WHERE:
σe.salary >1300 (̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees))

1 FROM employees e INNER JOIN departments d


2 ON e.depid = d.depid
3 WHERE e.salary > 1300

13 / 128

Ομαδοποίηση 1:Ν – βήμα 4

Η φράση «ανά τμήμα» δηλώνει ομαδοποίηση, επομένως


χρειαζόμαστε τη συμπλήρωση όρου GROUP BY. Η
ομαδοποίηση χρειάζεται για τον υπολογισμό του πλήθους
(COUNT) «ανά τμήμα».

d.depname Gcount(∗) (σe.salary >1300


(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)))

14 / 128
Ομαδοποίηση 1:Ν – βήμα 4

Η φράση «ανά τμήμα» δηλώνει ομαδοποίηση, επομένως


χρειαζόμαστε τη συμπλήρωση όρου GROUP BY. Η
ομαδοποίηση χρειάζεται για τον υπολογισμό του πλήθους
(COUNT) «ανά τμήμα».

d.depname Gcount(∗) (σe.salary >1300


(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)))

1 FROM employees e INNER JOIN departments d


2 ON e.depid = d.depid
3 WHERE e.salary > 1300
4 GROUP BY d.depname

15 / 128

Ομαδοποίηση 1:Ν – βήμα 5

Προβολή πεδίων
Από το σύνολο των πεδίων που διατίθενται μετά τη σύζευξη
των πινάκων employees και departments μας ζητούνται
μόνο το όνομα του τμήματος (άρα
departments.depname) και το πλήθος εργαζομένων ανά
τμήμα, δηλαδή COUNT(employees.depid):
d.depname Gcount(∗) (σe.salary >1300
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)))

16 / 128
Ομαδοποίηση 1:Ν – βήμα 5

Προβολή πεδίων
Από το σύνολο των πεδίων που διατίθενται μετά τη σύζευξη
των πινάκων employees και departments μας ζητούνται
μόνο το όνομα του τμήματος (άρα
departments.depname) και το πλήθος εργαζομένων ανά
τμήμα, δηλαδή COUNT(employees.depid):
d.depname Gcount(∗) (σe.salary >1300
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)))

1 SELECT d.depname, COUNT(e.depid)


2 FROM employees e INNER JOIN departments d
3 ON e.depid = d.depid
4 WHERE e.salary > 1300
5 GROUP BY d.depname
17 / 128

Ομαδοποίηση 1:Ν – βήμα 6

Επιπλέον επιλογές και παρατηρήσεις

18 / 128
Ομαδοποίηση 1:Ν – βήμα 6

Επιπλέον επιλογές και παρατηρήσεις


1 Δεν υπάρχει κάποια απαίτηση για περιορισμό των
εγγραφών μετά την ομαδοποίηση, δεν χρειάζεται ο όρος
HAVING.

19 / 128

Ομαδοποίηση 1:Ν – βήμα 6

Επιπλέον επιλογές και παρατηρήσεις


1 Δεν υπάρχει κάποια απαίτηση για περιορισμό των
εγγραφών μετά την ομαδοποίηση, δεν χρειάζεται ο όρος
HAVING.
2 Δεν υπάρχει απαίτηση για ταξινόμηση των εγγραφών
του αποτελέσματος, δεν χρειάζεται ο όρος ORDER BY.

20 / 128
Ομαδοποίηση 1:Ν – βήμα 6

Επιπλέον επιλογές και παρατηρήσεις


1 Δεν υπάρχει κάποια απαίτηση για περιορισμό των
εγγραφών μετά την ομαδοποίηση, δεν χρειάζεται ο όρος
HAVING.
2 Δεν υπάρχει απαίτηση για ταξινόμηση των εγγραφών
του αποτελέσματος, δεν χρειάζεται ο όρος ORDER BY.
3 Το ερώτημα είναι πλήρες λοιπόν.

21 / 128

Ομαδοποίηση 1:Ν – Τελική διατύπωση

Επιπλέον επιλογές και παρατηρήσεις

22 / 128
Ομαδοποίηση 1:Ν – Τελική διατύπωση

Επιπλέον επιλογές και παρατηρήσεις


1 Δεν υπάρχει κάποια απαίτηση για περιορισμό των
εγγραφών μετά την ομαδοποίηση, δεν χρειάζεται ο όρος
HAVING.

23 / 128

Ομαδοποίηση 1:Ν – Τελική διατύπωση

Επιπλέον επιλογές και παρατηρήσεις


1 Δεν υπάρχει κάποια απαίτηση για περιορισμό των
εγγραφών μετά την ομαδοποίηση, δεν χρειάζεται ο όρος
HAVING.
2 Δεν υπάρχει απαίτηση για ταξινόμηση των εγγραφών
του αποτελέσματος, δεν χρειάζεται ο όρος ORDER BY.

24 / 128
Ομαδοποίηση 1:Ν – Τελική διατύπωση

Επιπλέον επιλογές και παρατηρήσεις


1 Δεν υπάρχει κάποια απαίτηση για περιορισμό των
εγγραφών μετά την ομαδοποίηση, δεν χρειάζεται ο όρος
HAVING.
2 Δεν υπάρχει απαίτηση για ταξινόμηση των εγγραφών
του αποτελέσματος, δεν χρειάζεται ο όρος ORDER BY.
3 Το ερώτημα είναι πλήρες λοιπόν.

25 / 128

Ομαδοποίηση 1:Ν – Τελική διατύπωση


Να βρεθεί το πλήθος των εργαζομένων με μισθό
μεγαλύτερο των 1300 € ανά όνομα τμήματος

26 / 128
Ομαδοποίηση 1:Ν – Τελική διατύπωση
Να βρεθεί το πλήθος των εργαζομένων με μισθό
μεγαλύτερο των 1300 € ανά όνομα τμήματος
1 SELECT d.depname, COUNT(e.depid)
2 FROM employees e INNER JOIN departments d
3 ON e.depid = d.depid
4 WHERE e.salary > 1300
5 GROUP BY d.depname
6

27 / 128

Ομαδοποίηση 1:Ν – Τελική διατύπωση


Να βρεθεί το πλήθος των εργαζομένων με μισθό
μεγαλύτερο των 1300 € ανά όνομα τμήματος
1 SELECT d.depname, COUNT(e.depid)
2 FROM employees e INNER JOIN departments d
3 ON e.depid = d.depid
4 WHERE e.salary > 1300
5 GROUP BY d.depname
6

7 depname COUNT(*)
8 ------------------------------------------
9 Γραμματείας 1
10 Διοίκησης/Επίβλεψης 3
11 Εξωτερικών συνεργατών 1
12 Επιστημόνων/Μηχανικών 3
13 Μάνατζμεντ/Πωλήσεων 5
14 Οικονομολόγων/Λογιστών 3
28 / 128
Περιεχόμενα

1 Πλήθος υπαλλήλων ανά τμήμα με μισθό άνω των 1300 €

2 Υπάλληλοι σε ακριβώς 2 έργα

3 ΄Εργα με 3 υπαλλήλους του τμήματος 2

4 Απασχόληση σε έργα των υπαλλήλων του τμήματος 4

5 Πλήθος υπαλλήλων που προσλήφθηκαν το 2002 και


εργάζονται σε έργα με πρόοδο < 75%

6 Ασκήσεις επανάληψης

29 / 128

Ομαδοποίηση 1:Ν με 3 πίνακες

Να βρεθούν οι υπάλληλοι (κωδικός, όνομα, όνομα


τμήματος) που απασχολούνται σε ακριβώς 2 έργα

30 / 128
Ομαδοποίηση 1:Ν με 3 πίνακες

Να βρεθούν οι υπάλληλοι (κωδικός, όνομα, όνομα


τμήματος) που απασχολούνται σε ακριβώς 2 έργα
1

2 empid firstname lastname depname


3 ------------------------------------------------------
4 153 Μαρία Αλεβιζάτου Οικονομολόγων/Λογιστών
5 234 Αδαμαντία Θεοτοκάτου Γραμματείας
6 243 Δέσποινα Παπαδοπούλου Οικονομολόγων/Λογιστών
7 431 Κώστας Παπαδόπουλος Επιστημόνων/Μηχανικών
8 435 Αντώνης Παύλου Επιστημόνων/Μηχανικών
9 483 Ηρακλής Μανωλάκης Επιστημόνων/Μηχανικών
10 503 Μαριλένα Κρέσπα Οικονομολόγων/Λογιστών
11 835 Αθανάσιος Πετράκης Μάνατζμεντ/Πωλήσεων

31 / 128

Ομαδοποίηση 1:Ν με 3 πίνακες – Ανάλυση

Ποιοι πίνακες χρειάζονται;

32 / 128
Ομαδοποίηση 1:Ν με 3 πίνακες – Ανάλυση

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία υπαλλήλων empid, firstname, lastname,
επομένως ο πίνακας employees.

33 / 128

Ομαδοποίηση 1:Ν με 3 πίνακες – Ανάλυση

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία υπαλλήλων empid, firstname, lastname,
επομένως ο πίνακας employees.
2 Στοιχεία τμήματος depname, επομένως ο πίνακας
departments.

34 / 128
Ομαδοποίηση 1:Ν με 3 πίνακες – Ανάλυση

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία υπαλλήλων empid, firstname, lastname,
επομένως ο πίνακας employees.
2 Στοιχεία τμήματος depname, επομένως ο πίνακας
departments.
3 Στοιχεία απασχόλησης: πλήθος συμμετοχών σε έργα,
επομένως ο πίνακας workson.

35 / 128

Ομαδοποίηση 1:Ν με 3 πίνακες – Ανάλυση

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία υπαλλήλων empid, firstname, lastname,
επομένως ο πίνακας employees.
2 Στοιχεία τμήματος depname, επομένως ο πίνακας
departments.
3 Στοιχεία απασχόλησης: πλήθος συμμετοχών σε έργα,
επομένως ο πίνακας workson.
4 Υπενθύμιση: Απασχόληση ενός υπαλλήλου σε 2 έργα
σημαίνει πως υπάρχουν 2 εγγραφές στον πίνακα
workson με τον κωδικό του. 36 / 128
Ομαδοποίηση 1:Ν με 3 πίνακες – βήμα 1

Σύζευξη πινάκων departments και employees


̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)

1 FROM departments d INNER JOIN employees e


2 ON d.depid = e.depid

37 / 128

Ομαδοποίηση 1:Ν με 3 πίνακες – βήμα 1

Σύζευξη πινάκων departments και employees


̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)

1 FROM departments d INNER JOIN employees e


2 ON d.depid = e.depid

Σύζευξη departments, employees και workson


̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)
⊲⊳e.empid=w .empid ̺w (workson)

1 FROM (departments d INNER JOIN employees e


2 ON d.depid = e.depid)
3 INNER JOIN workson w
4 ON e.empid = w.empid
38 / 128
Ομαδοποίηση 1:Ν με 3 πίνακες – βήμα 2

Ομαδοποίηση εγγραφών
Στο ερώτημα υπάρχει ο περιορισμός για υπαλλήλους που
εργάζονται σε 2 ακριβώς έργα. Απαιτείται η ομαδοποίηση
ως προς τα πεδία που ζητούνται στο ερώτημα
e.empid, e.firstname, e.lastname, d.depname:
e.empid,e.firstname,e.lastname,d.depname Gcount(∗)
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)
⊲⊳e.empid=w .empid ̺w (workson))

39 / 128

Ομαδοποίηση 1:Ν με 3 πίνακες – βήμα 2

Ομαδοποίηση εγγραφών
Στο ερώτημα υπάρχει ο περιορισμός για υπαλλήλους που
εργάζονται σε 2 ακριβώς έργα. Απαιτείται η ομαδοποίηση
ως προς τα πεδία που ζητούνται στο ερώτημα
e.empid, e.firstname, e.lastname, d.depname:
e.empid,e.firstname,e.lastname,d.depname Gcount(∗)
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)
⊲⊳e.empid=w .empid ̺w (workson))

1 FROM (departments d INNER JOIN employees e


2 ON d.depid = e.depid)
3 INNER JOIN workson w
4 ON e.empid = w.empid
5 GROUP BY e.empid, e.firstname, e.lastname, d.depname
40 / 128
Ομαδοποίηση 1:Ν με 3 πίνακες – βήμα 3

Περιορισμός μετά την ομαδοποίηση


Είμαστε τώρα σε θέση να εφαρμόσουμε τον περιορισμό για
ακριβώς 2 συμμετοχές υπαλλήλων σε έργα. Στον όρο
HAVING και όχι στον όρο WHERE:
σcount(∗)=2 (e.empid,e.firstname,e.lastname,d.depname Gcount(∗)
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)
⊲⊳e.empid=w .empid ̺w (workson)))

41 / 128

Ομαδοποίηση 1:Ν με 3 πίνακες – βήμα 3

Περιορισμός μετά την ομαδοποίηση


Είμαστε τώρα σε θέση να εφαρμόσουμε τον περιορισμό για
ακριβώς 2 συμμετοχές υπαλλήλων σε έργα. Στον όρο
HAVING και όχι στον όρο WHERE:
σcount(∗)=2 (e.empid,e.firstname,e.lastname,d.depname Gcount(∗)
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)
⊲⊳e.empid=w .empid ̺w (workson)))

1 FROM (departments d INNER JOIN employees e


2 ON d.depid = e.depid)
3 INNER JOIN workson w
4 ON e.empid = w.empid
5 GROUP BY e.empid, e.firstname, e.lastname, d.depname
6 HAVING COUNT(*) = 2
42 / 128
Ομαδοποίηση 1:Ν με 3 πίνακες – Τελική
Τελική διατύπωση: υπάλληλοι σε 2 έργα
Πe.empid,e.firstname,e.lastname,d.depname
(σcount(∗)=2 (e.empid,e.firstname,e.lastname,d.depname Gcount(∗)
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)
⊲⊳e.empid=w .empid ̺w (workson))))

43 / 128

Ομαδοποίηση 1:Ν με 3 πίνακες – Τελική


Τελική διατύπωση: υπάλληλοι σε 2 έργα
Πe.empid,e.firstname,e.lastname,d.depname
(σcount(∗)=2 (e.empid,e.firstname,e.lastname,d.depname Gcount(∗)
(̺d (departments) ⊲⊳d.depid=e.depid ̺e (employees)
⊲⊳e.empid=w .empid ̺w (workson))))

1 SELECT e.empid, e.firstname, e.lastname, d.depname


2 FROM (departments d INNER JOIN employees e
3 ON d.depid = e.depid)
4 INNER JOIN workson w
5 ON e.empid = w.empid
6 GROUP BY e.empid, e.firstname, e.lastname, d.depname
7 HAVING COUNT(*) = 2;

44 / 128
Περιεχόμενα

1 Πλήθος υπαλλήλων ανά τμήμα με μισθό άνω των 1300 €

2 Υπάλληλοι σε ακριβώς 2 έργα

3 ΄Εργα με 3 υπαλλήλους του τμήματος 2

4 Απασχόληση σε έργα των υπαλλήλων του τμήματος 4

5 Πλήθος υπαλλήλων που προσλήφθηκαν το 2002 και


εργάζονται σε έργα με πρόοδο < 75%

6 Ασκήσεις επανάληψης

45 / 128

Σύζευξη 3 πινάκων, πολλά προς πολλά


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

46 / 128
Σύζευξη 3 πινάκων, πολλά προς πολλά
Να βρεθεί ο κωδικός και ο τίτλος των έργων στα
οποία απασχολούνται ακριβώς 3 υπάλληλοι του
τμήματος 2
1 proid title
2 --------------------------------------
3 21 Παροχή συμβουλευτικών υπηρεσιών...
4 38 Μελέτη εναλλακτικών λύσεων για...

47 / 128

Σύζευξη 3 πινάκων, πολλά προς πολλά


Να βρεθεί ο κωδικός και ο τίτλος των έργων στα
οποία απασχολούνται ακριβώς 3 υπάλληλοι του
τμήματος 2
1 proid title
2 --------------------------------------
3 21 Παροχή συμβουλευτικών υπηρεσιών...
4 38 Μελέτη εναλλακτικών λύσεων για...

48 / 128
Σύζευξη 3 πινάκων, πολλά προς πολλά
Να βρεθεί ο κωδικός και ο τίτλος των έργων στα
οποία απασχολούνται ακριβώς 3 υπάλληλοι του
τμήματος 2
1 proid title
2 --------------------------------------
3 21 Παροχή συμβουλευτικών υπηρεσιών...
4 38 Μελέτη εναλλακτικών λύσεων για...

1 Πληροφορίες από τον πίνακα projects

49 / 128

Σύζευξη 3 πινάκων, πολλά προς πολλά


Να βρεθεί ο κωδικός και ο τίτλος των έργων στα
οποία απασχολούνται ακριβώς 3 υπάλληλοι του
τμήματος 2
1 proid title
2 --------------------------------------
3 21 Παροχή συμβουλευτικών υπηρεσιών...
4 38 Μελέτη εναλλακτικών λύσεων για...

1 Πληροφορίες από τον πίνακα projects


2 Αναζήτηση με βάση δεδομένα από τους πίνακες
employees, workson

50 / 128
Σύζευξη 3 πινάκων, πολλά προς πολλά
Να βρεθεί ο κωδικός και ο τίτλος των έργων στα
οποία απασχολούνται ακριβώς 3 υπάλληλοι του
τμήματος 2
1 proid title
2 --------------------------------------
3 21 Παροχή συμβουλευτικών υπηρεσιών...
4 38 Μελέτη εναλλακτικών λύσεων για...

1 Πληροφορίες από τον πίνακα projects


2 Αναζήτηση με βάση δεδομένα από τους πίνακες
employees, workson
3 Λύση: σύζευξη πινάκων

51 / 128

Πολλά προς πολλά – πίνακες

Ποιοι πίνακες χρειάζονται;

52 / 128
Πολλά προς πολλά – πίνακες

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία έργων proid, title, επομένως ο πίνακας
projects.

53 / 128

Πολλά προς πολλά – πίνακες

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία έργων proid, title, επομένως ο πίνακας
projects.
2 Στοιχεία υπαλλήλων: depid=2, επομένως ο πίνακας
employees.

54 / 128
Πολλά προς πολλά – πίνακες

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία έργων proid, title, επομένως ο πίνακας
projects.
2 Στοιχεία υπαλλήλων: depid=2, επομένως ο πίνακας
employees.
3 Στοιχεία απασχόλησης: πλήθος συμμετοχών σε έργα,
επομένως ο πίνακας workson.

55 / 128

Πολλά προς πολλά – πίνακες

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία έργων proid, title, επομένως ο πίνακας
projects.
2 Στοιχεία υπαλλήλων: depid=2, επομένως ο πίνακας
employees.
3 Στοιχεία απασχόλησης: πλήθος συμμετοχών σε έργα,
επομένως ο πίνακας workson.
4 Υπενθύμιση: Απασχόληση ενός υπαλλήλου σε 3 έργα
σημαίνει πως υπάρχουν 2 εγγραφές στον πίνακα
workson με τον κωδικό του. 56 / 128
Πολλά προς πολλά – βήμα 1
Σύζευξη employees, workson, projects
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)

57 / 128

Πολλά προς πολλά – βήμα 1


Σύζευξη employees, workson, projects
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)

1 FROM (employees e INNER JOIN workson w


2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid

58 / 128
Πολλά προς πολλά – βήμα 1
Σύζευξη employees, workson, projects
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)

1 FROM (employees e INNER JOIN workson w


2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid

59 / 128

Πολλά προς πολλά – βήμα 2


Περιορισμός εγγραφών e.depid=2
Υπάρχει ο περιορισμός που αφορά τους υπαλλήλους του
τμήματος 2:
σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))

60 / 128
Πολλά προς πολλά – βήμα 2
Περιορισμός εγγραφών e.depid=2
Υπάρχει ο περιορισμός που αφορά τους υπαλλήλους του
τμήματος 2:
σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))
1 FROM (employees e INNER JOIN workson w
2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid
5 WHERE e.depid = 2

61 / 128

Πολλά προς πολλά – βήμα 3


Ομαδοποίηση εγγραφών
Στο ερώτημα υπάρχει ο περιορισμός για ακριβώς 3
συμμετοχές υπαλλήλων σε έργα. Απαιτείται η εφαρμογή
ομαδοποίησης εγγραφών ως προς τα ζητούμενα του
ερωτήματος:

62 / 128
Πολλά προς πολλά – βήμα 3
Ομαδοποίηση εγγραφών
Στο ερώτημα υπάρχει ο περιορισμός για ακριβώς 3
συμμετοχές υπαλλήλων σε έργα. Απαιτείται η εφαρμογή
ομαδοποίησης εγγραφών ως προς τα ζητούμενα του
ερωτήματος:
p.proid,p.title Gcount(∗) (σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)))

63 / 128

Πολλά προς πολλά – βήμα 3


Ομαδοποίηση εγγραφών
Στο ερώτημα υπάρχει ο περιορισμός για ακριβώς 3
συμμετοχές υπαλλήλων σε έργα. Απαιτείται η εφαρμογή
ομαδοποίησης εγγραφών ως προς τα ζητούμενα του
ερωτήματος:
p.proid,p.title Gcount(∗) (σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)))
1 FROM (employees e INNER JOIN workson w
2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid
5 WHERE e.depid = 2
6 GROUP BY p.proid, p.title
64 / 128
Πολλά προς πολλά – βήμα 4
Περιορισμός μετά την ομαδοποίηση
Μετά την ομαδοποίηση των εγγραφών εφαρμόσουμε τον
περιορισμό για ακριβώς 3 συμμετοχές των υπαλλήλων στα
έργα:
σcount(∗)=3 (p.proid,p.title Gcount(∗) (σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))))

65 / 128

Πολλά προς πολλά – βήμα 4


Περιορισμός μετά την ομαδοποίηση
Μετά την ομαδοποίηση των εγγραφών εφαρμόσουμε τον
περιορισμό για ακριβώς 3 συμμετοχές των υπαλλήλων στα
έργα:
σcount(∗)=3 (p.proid,p.title Gcount(∗) (σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))))
1 FROM (employees e INNER JOIN workson w
2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid
5 WHERE e.depid = 2
6 GROUP BY p.proid, p.title
7 HAVING COUNT(*) = 3
66 / 128
Πολλά προς πολλά – Τελική διατύπωση
Ποια πεδία θέλουμε στο αποτέλεσμα:
Πp.proid,p.title (σcount(∗)=3 (p.proid,p.title Gcount(∗) (σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)))))

67 / 128

Πολλά προς πολλά – Τελική διατύπωση


Ποια πεδία θέλουμε στο αποτέλεσμα:
Πp.proid,p.title (σcount(∗)=3 (p.proid,p.title Gcount(∗) (σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)))))
1 SELECT p.proid, p.title
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON p.proid = w.proid
6 WHERE e.depid = 2
7 GROUP BY p.proid, p.title
8 HAVING COUNT(*) = 3;

68 / 128
Περιεχόμενα

1 Πλήθος υπαλλήλων ανά τμήμα με μισθό άνω των 1300 €

2 Υπάλληλοι σε ακριβώς 2 έργα

3 ΄Εργα με 3 υπαλλήλους του τμήματος 2

4 Απασχόληση σε έργα των υπαλλήλων του τμήματος 4

5 Πλήθος υπαλλήλων που προσλήφθηκαν το 2002 και


εργάζονται σε έργα με πρόοδο < 75%

6 Ασκήσεις επανάληψης

69 / 128

Πλήθος υπαλλήλων ανά έργο


Να βρεθεί το πλήθος των των συμμετοχών σε έργα
των υπαλλήλων του τμήματος 4, ανά κωδικό και
τίτλο έργου στα οποία απασχολούνται

70 / 128
Πλήθος υπαλλήλων ανά έργο
Να βρεθεί το πλήθος των των συμμετοχών σε έργα
των υπαλλήλων του τμήματος 4, ανά κωδικό και
τίτλο έργου στα οποία απασχολούνται
1 proid title COUNT(*)
2 ------------------------------------------------
3 12 Επίβλεψη κατασκευής σταθμού... 2
4 14 Μελέτη και επίβλεψη κατασκευής... 1
5 38 Μελέτη εναλλακτικών λύσεων για... 1
6 43 Μελέτη οικονομικής βιωσιμότητας... 1

71 / 128

Πλήθος υπαλλήλων ανά έργο


Να βρεθεί το πλήθος των των συμμετοχών σε έργα
των υπαλλήλων του τμήματος 4, ανά κωδικό και
τίτλο έργου στα οποία απασχολούνται
1 proid title COUNT(*)
2 ------------------------------------------------
3 12 Επίβλεψη κατασκευής σταθμού... 2
4 14 Μελέτη και επίβλεψη κατασκευής... 1
5 38 Μελέτη εναλλακτικών λύσεων για... 1
6 43 Μελέτη οικονομικής βιωσιμότητας... 1

72 / 128
Πλήθος υπαλλήλων ανά έργο
Να βρεθεί το πλήθος των των συμμετοχών σε έργα
των υπαλλήλων του τμήματος 4, ανά κωδικό και
τίτλο έργου στα οποία απασχολούνται
1 proid title COUNT(*)
2 ------------------------------------------------
3 12 Επίβλεψη κατασκευής σταθμού... 2
4 14 Μελέτη και επίβλεψη κατασκευής... 1
5 38 Μελέτη εναλλακτικών λύσεων για... 1
6 43 Μελέτη οικονομικής βιωσιμότητας... 1

1 Πληροφορίες από τον πίνακα projects

73 / 128

Πλήθος υπαλλήλων ανά έργο


Να βρεθεί το πλήθος των των συμμετοχών σε έργα
των υπαλλήλων του τμήματος 4, ανά κωδικό και
τίτλο έργου στα οποία απασχολούνται
1 proid title COUNT(*)
2 ------------------------------------------------
3 12 Επίβλεψη κατασκευής σταθμού... 2
4 14 Μελέτη και επίβλεψη κατασκευής... 1
5 38 Μελέτη εναλλακτικών λύσεων για... 1
6 43 Μελέτη οικονομικής βιωσιμότητας... 1

1 Πληροφορίες από τον πίνακα projects


2 Αναζήτηση με βάση δεδομένα από τους πίνακες
employees, workson

74 / 128
Πλήθος υπαλλήλων ανά έργο
Να βρεθεί το πλήθος των των συμμετοχών σε έργα
των υπαλλήλων του τμήματος 4, ανά κωδικό και
τίτλο έργου στα οποία απασχολούνται
1 proid title COUNT(*)
2 ------------------------------------------------
3 12 Επίβλεψη κατασκευής σταθμού... 2
4 14 Μελέτη και επίβλεψη κατασκευής... 1
5 38 Μελέτη εναλλακτικών λύσεων για... 1
6 43 Μελέτη οικονομικής βιωσιμότητας... 1

1 Πληροφορίες από τον πίνακα projects


2 Αναζήτηση με βάση δεδομένα από τους πίνακες
employees, workson
3 Λύση: σύζευξη πινάκων
75 / 128

Πλήθος υπαλλήλων ανά έργο

Ποιοι πίνακες χρειάζονται;

76 / 128
Πλήθος υπαλλήλων ανά έργο

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία έργων proid, title, επομένως ο πίνακας
projects.

77 / 128

Πλήθος υπαλλήλων ανά έργο

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία έργων proid, title, επομένως ο πίνακας
projects.
2 Στοιχεία υπαλλήλων: depid=4, επομένως ο πίνακας
employees.

78 / 128
Πλήθος υπαλλήλων ανά έργο

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία έργων proid, title, επομένως ο πίνακας
projects.
2 Στοιχεία υπαλλήλων: depid=4, επομένως ο πίνακας
employees.
3 Στοιχεία απασχόλησης: πλήθος συμμετοχών σε έργα,
επομένως ο πίνακας workson.

79 / 128

Πλήθος υπαλλήλων ανά έργο – βήμα 1


Σύζευξη πινάκων
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)

80 / 128
Πλήθος υπαλλήλων ανά έργο – βήμα 1
Σύζευξη πινάκων
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)

1 FROM (employees e INNER JOIN workson w


2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid

81 / 128

Πλήθος υπαλλήλων ανά έργο – βήμα 1


Σύζευξη πινάκων
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)

1 FROM (employees e INNER JOIN workson w


2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid

82 / 128
Πλήθος υπαλλήλων ανά έργο – βήμα 2
Περιορισμός εγγραφών e.depid=4
Υπάρχει ο περιορισμός που αφορά τους υπαλλήλους του
τμήματος 4:
σe.depid=4 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))

83 / 128

Πλήθος υπαλλήλων ανά έργο – βήμα 2


Περιορισμός εγγραφών e.depid=4
Υπάρχει ο περιορισμός που αφορά τους υπαλλήλους του
τμήματος 4:
σe.depid=4 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))
1 FROM (employees e INNER JOIN workson w
2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid
5 WHERE e.depid = 4

84 / 128
Πλήθος υπαλλήλων ανά έργο – βήμα 3
Ομαδοποίηση
«πλήθος των υπαλλήλων ανά έργο», δηλαδή
ομαδοποίηση:
p.proid,p.title Gcount(∗) (σe.depid=4 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)))

85 / 128

Πλήθος υπαλλήλων ανά έργο – βήμα 3


Ομαδοποίηση
«πλήθος των υπαλλήλων ανά έργο», δηλαδή
ομαδοποίηση:
p.proid,p.title Gcount(∗) (σe.depid=4 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)))

1 FROM (employees e INNER JOIN workson w


2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid
5 WHERE e.depid = 4
6 GROUP BY p.proid, p.title

86 / 128
Πλήθος υπαλλήλων ανά έργο – βήμα 4
Τελική διατύπωση
p.proid,p.title Gcount(∗) (σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)))

87 / 128

Πλήθος υπαλλήλων ανά έργο – βήμα 4


Τελική διατύπωση
p.proid,p.title Gcount(∗) (σe.depid=2 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)))

1 SELECT p.proid, p.title, COUNT(*)


2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON p.proid = w.proid
6 WHERE e.depid = 4
7 GROUP BY p.proid, p.title;

88 / 128
Περιεχόμενα

1 Πλήθος υπαλλήλων ανά τμήμα με μισθό άνω των 1300 €

2 Υπάλληλοι σε ακριβώς 2 έργα

3 ΄Εργα με 3 υπαλλήλους του τμήματος 2

4 Απασχόληση σε έργα των υπαλλήλων του τμήματος 4

5 Πλήθος υπαλλήλων που προσλήφθηκαν το 2002 και


εργάζονται σε έργα με πρόοδο < 75%

6 Ασκήσεις επανάληψης

89 / 128

Πρόσληψη το 2002
Να βρεθεί το πλήθος των υπαλλήλων που
προσλήφθηκαν μέσα στο 2002 και απασχολούνται
σε έργα με βαθμό προόδου μικρότερο του 75%

90 / 128
Πρόσληψη το 2002
Να βρεθεί το πλήθος των υπαλλήλων που
προσλήφθηκαν μέσα στο 2002 και απασχολούνται
σε έργα με βαθμό προόδου μικρότερο του 75%
1 COUNT(DISTINCT e.empid)
2 ------------------------
3 3

91 / 128

Πρόσληψη το 2002
Να βρεθεί το πλήθος των υπαλλήλων που
προσλήφθηκαν μέσα στο 2002 και απασχολούνται
σε έργα με βαθμό προόδου μικρότερο του 75%
1 COUNT(DISTINCT e.empid)
2 ------------------------
3 3

92 / 128
Πρόσληψη το 2002
Να βρεθεί το πλήθος των υπαλλήλων που
προσλήφθηκαν μέσα στο 2002 και απασχολούνται
σε έργα με βαθμό προόδου μικρότερο του 75%
1 COUNT(DISTINCT e.empid)
2 ------------------------
3 3

1 Πληροφορίες από τον πίνακα employees

93 / 128

Πρόσληψη το 2002
Να βρεθεί το πλήθος των υπαλλήλων που
προσλήφθηκαν μέσα στο 2002 και απασχολούνται
σε έργα με βαθμό προόδου μικρότερο του 75%
1 COUNT(DISTINCT e.empid)
2 ------------------------
3 3

1 Πληροφορίες από τον πίνακα employees


2 Αναζήτηση με βάση δεδομένα από τους πίνακες
employees, projects

94 / 128
Πρόσληψη το 2002
Να βρεθεί το πλήθος των υπαλλήλων που
προσλήφθηκαν μέσα στο 2002 και απασχολούνται
σε έργα με βαθμό προόδου μικρότερο του 75%
1 COUNT(DISTINCT e.empid)
2 ------------------------
3 3

1 Πληροφορίες από τον πίνακα employees


2 Αναζήτηση με βάση δεδομένα από τους πίνακες
employees, projects
3 Λύση: σύζευξη πινάκων

95 / 128

Πρόσληψη το 2002
Να βρεθεί το πλήθος των υπαλλήλων που
προσλήφθηκαν μέσα στο 2002 και απασχολούνται
σε έργα με βαθμό προόδου μικρότερο του 75%
1 COUNT(DISTINCT e.empid)
2 ------------------------
3 3

1 Πληροφορίες από τον πίνακα employees


2 Αναζήτηση με βάση δεδομένα από τους πίνακες
employees, projects
3 Λύση: σύζευξη πινάκων
4 Προσοχή στη χρήση του πίνακα workson

96 / 128
Πρόσληψη το 2002

Ποιοι πίνακες χρειάζονται;

97 / 128

Πρόσληψη το 2002

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία υπαλλήλων empid, hiredate, επομένως ο
πίνακας employees.

98 / 128
Πρόσληψη το 2002

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία υπαλλήλων empid, hiredate, επομένως ο
πίνακας employees.
2 Στοιχεία έργων: progress, επομένως ο πίνακας
projects.

99 / 128

Πρόσληψη το 2002

Ποιοι πίνακες χρειάζονται;


1 Στοιχεία υπαλλήλων empid, hiredate, επομένως ο
πίνακας employees.
2 Στοιχεία έργων: progress, επομένως ο πίνακας
projects.
3 Σύζευξη πινάκων υπαλλήλων και έργων, επομένως ο
πίνακας workson.

100 / 128
Πρόσληψη το 2002 – βήμα 1
Σύζευξη πινάκων
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)

101 / 128

Πρόσληψη το 2002 – βήμα 1


Σύζευξη πινάκων
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)

1 FROM (employees e INNER JOIN workson w


2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid

102 / 128
Πρόσληψη το 2002 – βήμα 1
Σύζευξη πινάκων
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects)

1 FROM (employees e INNER JOIN workson w


2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid

103 / 128

Πρόσληψη το 2002 – βήμα 2


Περιορισμός εγγραφών
Περιορισμός με βάση την ημερομηνία πρόσληψης και την
πρόοδο έργου:
σσe.hiredate≥′ 2002−01−01′ ∧e.hiredate≤′ 2002−12−31′ ∧p.progress>75 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))

104 / 128
Πρόσληψη το 2002 – βήμα 2
Περιορισμός εγγραφών
Περιορισμός με βάση την ημερομηνία πρόσληψης και την
πρόοδο έργου:
σσe.hiredate≥′ 2002−01−01′ ∧e.hiredate≤′ 2002−12−31′ ∧p.progress>75 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))
1 FROM (employees e INNER JOIN workson w
2 ON e.empid = w.empid)
3 INNER JOIN projects p
4 ON w.proid = p.proid
5 WHERE e.hiredate BETWEEN ’2002-01-01’ AND ’2002-12-31’
6 AND p.progress < 75

105 / 128

Πρόσληψη το 2002 – τελική διατύπωση


Καταμέτρηση πλήθους
Gcount(e.empid) σσe.hiredate≥′ 2002−01−01′ ∧e.hiredate≤′ 2002−12−31′ ∧p.progress>75 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))

106 / 128
Πρόσληψη το 2002 – τελική διατύπωση
Καταμέτρηση πλήθους
Gcount(e.empid) σσe.hiredate≥′ 2002−01−01′ ∧e.hiredate≤′ 2002−12−31′ ∧p.progress>75 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))
1 SELECT COUNT(DISTINCT e.empid)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON p.proid = w.proid
6 WHERE e.hiredate BETWEEN ’2002-01-01’ AND ’2002-12-31’
7 AND p.progress < 75;
8

9 COUNT(DISTINCT e.empid)
10 ------------------------
11 3 107 / 128

Πρόσληψη το 2002 – λάθος διατύπωση


Χωρίς απαλοιφή διπλοεγγραφών
Gcount(e.empid) σσe.hiredate≥′ 2002−01−01′ ∧e.hiredate≤′ 2002−12−31′ ∧p.progress>75 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))

108 / 128
Πρόσληψη το 2002 – λάθος διατύπωση
Χωρίς απαλοιφή διπλοεγγραφών
Gcount(e.empid) σσe.hiredate≥′ 2002−01−01′ ∧e.hiredate≤′ 2002−12−31′ ∧p.progress>75 (
̺e (employees) ⊲⊳e.empid=w .empid ̺w (workson)
⊲⊳w .proid=p.proid ̺p (projects))
1 SELECT COUNT(e.empid)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON p.proid = w.proid
6 WHERE e.hiredate BETWEEN ’2002-01-01’ AND ’2002-12-31’
7 AND p.progress < 75;
8

9 COUNT(e.empid)
10 ---------------
11 5 109 / 128

Πρόσληψη το 2002 – γιατί DISTINCT;


Τι παρατηρείτε;
1 SELECT e.empid, e.hiredate, p.proid, p.progress
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON w.proid = p.proid
6 WHERE e.hiredate BETWEEN ’2002-01-01’ AND ’2002-12-31’
7 AND p.progress < 75;
8

9 empid hiredate proid progress


10 ------------------------------------
11 206 2002-12-03 12 60.0
12 230 2002-12-03 12 60.0
13 230 2002-12-03 14 20.0
14 431 2002-09-16 14 20.0
15 230 2002-12-03 38 0.0
110 / 128
Διαχωρισμός δύο εννοιών

111 / 128

Διαχωρισμός δύο εννοιών


Πλήθος συμμετοχών υπαλλήλων σε έργα
1 SELECT COUNT(e.empid)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON w.proid = p.proid
6 WHERE e.hiredate BETWEEN ’2002-01-01’ AND ’2002-12-31’
7 AND p.progress < 75;

112 / 128
Διαχωρισμός δύο εννοιών
Πλήθος συμμετοχών υπαλλήλων σε έργα
1 SELECT COUNT(e.empid)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON w.proid = p.proid
6 WHERE e.hiredate BETWEEN ’2002-01-01’ AND ’2002-12-31’
7 AND p.progress < 75;

Πλήθος υπαλλήλων σε έργα


1 SELECT COUNT(DISTINCT e.empid)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON w.proid = p.proid
6 WHERE e.hiredate BETWEEN ’2002-01-01’ AND ’2002-12-31’
7 AND p.progress < 75; 113 / 128

Περιεχόμενα

1 Πλήθος υπαλλήλων ανά τμήμα με μισθό άνω των 1300 €

2 Υπάλληλοι σε ακριβώς 2 έργα

3 ΄Εργα με 3 υπαλλήλους του τμήματος 2

4 Απασχόληση σε έργα των υπαλλήλων του τμήματος 4

5 Πλήθος υπαλλήλων που προσλήφθηκαν το 2002 και


εργάζονται σε έργα με πρόοδο < 75%

6 Ασκήσεις επανάληψης

114 / 128
Πλήθος υπαλλήλων ανά έργο ...
Να βρεθεί το πλήθος των εργαζομένων με μισθό μικρότερο του
1500, ανά κωδικό και τίτλο έργου, με αύξουσα ταξινόμηση ως
προς το πλήθος εργαζομένων, για έργα που απασχολούν λιγότερο
από 5 υπαλλήλους.

115 / 128

Πλήθος υπαλλήλων ανά έργο ...


Να βρεθεί το πλήθος των εργαζομένων με μισθό μικρότερο του
1500, ανά κωδικό και τίτλο έργου, με αύξουσα ταξινόμηση ως
προς το πλήθος εργαζομένων, για έργα που απασχολούν λιγότερο
από 5 υπαλλήλους.
1 SELECT p.proid, p.title, COUNT(*)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON p.proid = w.proid

116 / 128
Πλήθος υπαλλήλων ανά έργο ...
Να βρεθεί το πλήθος των εργαζομένων με μισθό μικρότερο του
1500, ανά κωδικό και τίτλο έργου, με αύξουσα ταξινόμηση ως
προς το πλήθος εργαζομένων, για έργα που απασχολούν λιγότερο
από 5 υπαλλήλους.
1 SELECT p.proid, p.title, COUNT(*)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON p.proid = w.proid
6 WHERE e.salary < 1500

117 / 128

Πλήθος υπαλλήλων ανά έργο ...


Να βρεθεί το πλήθος των εργαζομένων με μισθό μικρότερο του
1500, ανά κωδικό και τίτλο έργου, με αύξουσα ταξινόμηση ως
προς το πλήθος εργαζομένων, για έργα που απασχολούν λιγότερο
από 5 υπαλλήλους.
1 SELECT p.proid, p.title, COUNT(*)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON p.proid = w.proid
6 WHERE e.salary < 1500
7 GROUP BY p.proid, p.title

118 / 128
Πλήθος υπαλλήλων ανά έργο ...
Να βρεθεί το πλήθος των εργαζομένων με μισθό μικρότερο του
1500, ανά κωδικό και τίτλο έργου, με αύξουσα ταξινόμηση ως
προς το πλήθος εργαζομένων, για έργα που απασχολούν λιγότερο
από 5 υπαλλήλους.
1 SELECT p.proid, p.title, COUNT(*)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON p.proid = w.proid
6 WHERE e.salary < 1500
7 GROUP BY p.proid, p.title
8 HAVING COUNT(*) < 5

119 / 128

Πλήθος υπαλλήλων ανά έργο ...


Να βρεθεί το πλήθος των εργαζομένων με μισθό μικρότερο του
1500, ανά κωδικό και τίτλο έργου, με αύξουσα ταξινόμηση ως
προς το πλήθος εργαζομένων, για έργα που απασχολούν λιγότερο
από 5 υπαλλήλους.
1 SELECT p.proid, p.title, COUNT(*)
2 FROM (employees e INNER JOIN workson w
3 ON e.empid = w.empid)
4 INNER JOIN projects p
5 ON p.proid = w.proid
6 WHERE e.salary < 1500
7 GROUP BY p.proid, p.title
8 HAVING COUNT(*) < 5
9 ORDER BY COUNT(*) ASC;

120 / 128
Μισθοδοσία ανά τμήμα ...
Να βρεθεί ο κωδικός και το όνομα των τμημάτων, καθώς και το
άθροισμα μισθοδοσίας των υπαλλήλων ανά τμήμα, που
απασχολούνται σε όλα τα έργα με πρόοδο πάνω από 50%, και
που απασχολούν (τα έργα) περισσότερους από έναν υπαλλήλους.

121 / 128

Μισθοδοσία ανά τμήμα ...


Να βρεθεί ο κωδικός και το όνομα των τμημάτων, καθώς και το
άθροισμα μισθοδοσίας των υπαλλήλων ανά τμήμα, που
απασχολούνται σε όλα τα έργα με πρόοδο πάνω από 50%, και
που απασχολούν (τα έργα) περισσότερους από έναν υπαλλήλους.
1 SELECT d.depid, d.depname, SUM(DISTINCT e.salary)
2 FROM ((employees e INNER JOIN departments d
3 ON e.depid = d.depid)
4 INNER JOIN workson w
5 ON e.empid = w.empid)
6 INNER JOIN projects p
7 ON p.proid = w.proid

122 / 128
Μισθοδοσία ανά τμήμα ...
Να βρεθεί ο κωδικός και το όνομα των τμημάτων, καθώς και το
άθροισμα μισθοδοσίας των υπαλλήλων ανά τμήμα, που
απασχολούνται σε όλα τα έργα με πρόοδο πάνω από 50%, και
που απασχολούν (τα έργα) περισσότερους από έναν υπαλλήλους.
1 SELECT d.depid, d.depname, SUM(DISTINCT e.salary)
2 FROM ((employees e INNER JOIN departments d
3 ON e.depid = d.depid)
4 INNER JOIN workson w
5 ON e.empid = w.empid)
6 INNER JOIN projects p
7 ON p.proid = w.proid
8 WHERE p.progress > 50

123 / 128

Μισθοδοσία ανά τμήμα ...


Να βρεθεί ο κωδικός και το όνομα των τμημάτων, καθώς και το
άθροισμα μισθοδοσίας των υπαλλήλων ανά τμήμα, που
απασχολούνται σε όλα τα έργα με πρόοδο πάνω από 50%, και
που απασχολούν (τα έργα) περισσότερους από έναν υπαλλήλους.
1 SELECT d.depid, d.depname, SUM(DISTINCT e.salary)
2 FROM ((employees e INNER JOIN departments d
3 ON e.depid = d.depid)
4 INNER JOIN workson w
5 ON e.empid = w.empid)
6 INNER JOIN projects p
7 ON p.proid = w.proid
8 WHERE p.progress > 50
9 GROUP BY d.depid, d.depname

124 / 128
Μισθοδοσία ανά τμήμα ...
Να βρεθεί ο κωδικός και το όνομα των τμημάτων, καθώς και το
άθροισμα μισθοδοσίας των υπαλλήλων ανά τμήμα, που
απασχολούνται σε όλα τα έργα με πρόοδο πάνω από 50%, και
που απασχολούν (τα έργα) περισσότερους από έναν υπαλλήλους.
1 SELECT d.depid, d.depname, SUM(DISTINCT e.salary)
2 FROM ((employees e INNER JOIN departments d
3 ON e.depid = d.depid)
4 INNER JOIN workson w
5 ON e.empid = w.empid)
6 INNER JOIN projects p
7 ON p.proid = w.proid
8 WHERE p.progress > 50
9 GROUP BY d.depid, d.depname
10 HAVING COUNT(*) > 1;

125 / 128

Διευθυντές και έργα


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

126 / 128
Διευθυντές και έργα
Να βρεθεί το όνομα του τμήματος, το επώνυμο και ο κωδικός του
διευθυντή και το πλήθος των έργων στα οποία απασχολείται ο
κάθε διευθυντής.
1 SELECT d.depname, e.lastname, w.empid, COUNT(*)
2 FROM (departments d INNER JOIN employees e
3 ON d.manager = e.empid)
4 LEFT JOIN workson w
5 ON e.empid = w.empid
6 GROUP BY d.depname, e.lastname, w.empid;

127 / 128

Υποερωτήματα SQL
Η ανάγκη για υποερώτημα
Ποιος υπάλληλος παίρνει το μεγαλύτερο μισθό;
Αν ξέραμε το μεγαλύτερο μισθό, πχ 2000, θα γράφαμε:

SELECT ∗
FROM e m p l o y e e s
WHERE s a l a r y = 2 0 0 0 ;

Ο μεγαλύτερος μισθός μπορεί να βρεθεί με:

SELECT MAX( s a l a r y )
FROM e m p o l y e e s ;

2 / 31

Το πρόβλημα με τα δύο ερωτήματα

Στην ερώτηση ποιος υπάλληλος παίρνει το μεγαλύτερο μισθό,


πρέπει πρώτα να βρούμε το μεγαλύτερο μισθό
Δηλαδή να απαντήσουμε σε δύο ερωτήματα και μάλιστα με σωστή
σειρά:
1 Ποιος είναι ο μεγαλύτερος μισθός: MAX(salary)
2 Ποιος υπάλληλος έχει τόσο μισθό; WHERE
Η τιμή που προκύπτει από το τρώτο ερώτημα δεν μπορεί να εισαχθεί
αυτόματα στο δεύτερο
Στα λογιστικά φύλλα, μπορούμε να απαντήσουμε τέτοια
ερωτήματα με συνδυασμό INDEX MATCH MAX
Στην SQL το πρόβλημα λύνεται εύκολα με υποερώτημα :
εμφώλευση SELECT

3 / 31
΄Ενα απλό υποερώτημα

Να βρεθεί ο υπάλληλος με το μεγαλύτερο μισθό:

SELECT ∗
FROM e m p l o y e e s
WHERE s a l a r y = (SELECT MAX( s a l a r y )
FROM e m p l o y e e s ) ;

Η λύση λοιπόν είναι η εμφώλευση SELECT


Σε αντίθεση με τα λογιστικά φύλλα, το ερώτημα θα δώσει ορθή
απάντηση στην περίπτωση που δύο ή περισσότεροι υπάλληλοι έχουν
τον ίδιο μισθό
Το υποερώτημα χρειάζεται παρενθέσεις
Αυτό είναι ένα παράδειγμα υποερωτήματος ως βαθμωτής
(scalar) μεταβλητής

4 / 31

Παρατηρήσεις για τα υποερωτήματα

Το υποερώτημα πρέπει να είναι ένα αυτοτελές ερώτημα


Υποερωτήματα μπορούν να χρησιμοποιηθούν τόσο στη φράση
WHERE όσο και στη φράση HAVING
Στις περισσότερες των περιπτώσεων, η φράση SELECT στο
υποερώτημα ακολουθείται ένα μόνο πεδίο και μάλιστα κλειδί
Το υποερώτημα δεν μπορεί (και δεν έχει νόημα) να περιέχει τη
φράση ORDER BY
Το υποερώτημα μπορεί να αναφέρεται σε πεδία που υπάρχουν
στον πίνακα του εξωτερικού ερωτήματος, αλλά γενικά πρέπει να
έχουν τη δική τους φράση FROM

5 / 31
Υποερώτημα ή αυτοσύζευξη;
Να βρεθούν οι υπάλληλοι που εργάζονται στο ίδιο τμήμα με αυτό που
εργάζεται ο υπάλληλος με κωδικό 102
Με αυτοσύζευξη

SELECT e1 . ∗
FROM e m p l o y e e s e1 , e m p l o y e e s e2
WHERE e1 . d e p i d = e2 . d e p i d
AND e2 . empid =102;

Με υποερώτημα

SELECT ∗
FROM e m p l o y e e s
WHERE d e p i d = (SELECT d e p i d
FROM e m p l o y e e s
WHERE empid = 1 0 2 ) ;

6 / 31

Υποερώτημα μετά το HAVING

Να βρεθεί το πλήθος των υπαλλήλων ανά όνομα τμήματος, για εκείνα


τα τμήματα που απασχολούν λιγότερους από τους μισούς υπαλλήλους
που απασχολούνται στο έργο 43

SELECT d . depname , COUNT( ∗ )


FROM e m p l o y e e s e INNER JOIN departments d
ON e . depid = d . depid
GROUP BY d . depname
HAVING COUNT( ∗ ) < 0 . 5 ∗ (SELECT COUNT( empid )
FROM workson
WHERE proid = 43);

Στο έργο 43 απασχολούνται 5


depname COUNT(*) υπάλληλοι και στο τμήμα
Γραμματείας 2 Γραμματείας εργάζονται 2,
δηλαδή λιγότερο από
το μισό του 5
7 / 31
Δύο υποερωτήματα

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων που προσλήφθηκαν


ανάμεσα στην πιο παλιά και στην πρόσφατη ημερομηνία έναρξης των
έργων, και δεν εργάζονται στο τμήμα 6

SELECT ∗
FROM e m p l o y e e s
WHERE h i r e d a t e BETWEEN ( SELECT MIN( s t a r t d a t e )
FROM projects )
AND ( SELECT MAX( s t a r t d a t e )
FROM projects )
AND d e p i d != 6 ;

8 / 31

Υποερώτημα με τελεστή συνόλου IN


Να βρεθεί το όνομα όλων των τμημάτων στα οποία εργάζονται
υπάλληλοι, οι οποίοι αν πάρουν αύξηση κατά 5% ο μισθός τους θα
ανέβει περισσότερο από 100 €

SELECT depname
FROM d e p a r t m e n t s
WHERE d e p i d IN (SELECT DISTINCT d e p i d
FROM e m p l o y e e s
WHERE s a l a r y ∗ 0 . 0 5 > 1 0 0 ) ;

Η φράση FROM στο υποερώτημα μπορεί να έχει έχει διαφορετικό


πίνακα από τη φράση FROM του εξωτερικού υποερωτήματος
Η φράση SELECT του υποερωτήματος ακολουθείται
από ένα μόνο πεδίο
Στο υποερώτημα, η φράση DISTINCT μπορεί να
παραληφθεί (με ποινή στην ταχύτητα)
9 / 31
Ισοδυναμία με σύζευξη

Να βρεθεί το όνομα όλων των τμημάτων στα οποία εργάζονται


υπάλληλοι, οι οποίοι αν πάρουν αύξηση κατά 5% ο μισθός τους θα
ανέβει περισσότερο από 100 €

SELECT DISTINCT d . depname


FROM e m p l o y e e s e INNER JOIN d e p a r t m e n t s d
ON e . d e p i d = d . d e p i d
WHERE e . s a l a r y ∗ 0 . 0 5 > 1 0 0 ;

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


τόσο με υποερώτημα όσο και με σύζευξη
Δεν έχει σημασία ποιο τρόπο θα επιλέξετε
Να ξέρετε και τους δύο τρόπους! Υπάρχουν περιπτώσεις
που ένας μόνο είναι σωστός!

10 / 31

Τεστ σύγκρισης με ALL

Να βρεθούν οι υπάλληλοι που προσλήφθηκαν μετά την έναρξη όλων των


έργων

SELECT ∗
FROM e m p l o y e e s
WHERE h i r e d a t e > ALL (SELECT DISTINCT s t a r t d a t e
FROM p r o j e c t s ) ;

Οι συγκρίσεις με ALL αποδίδουν TRUE, αν ο τελεσταίος της


σύγκρισης αποδίδει TRUE με όλες τις εγγραφές που επιστρέφει το
υποερώτημα
Το ALL τοποθετείται μετά τον τελεστή σύγκρισης
και πριν το υποερώτημα

11 / 31
Ισοδυναμία λόγω βέλους του χρόνου

Να βρεθούν οι υπάλληλοι που προσλήφθηκαν μετά την έναρξη όλων των


έργων

SELECT ∗
FROM e m p l o y e e s
WHERE h i r e d a t e > (SELECT MAX( s t a r t d a t e )
FROM p r o j e c t s ) ;

Τα δύο υποερωτήματα είναι ισοδύναμα


Αν μια ημερομηνία είναι πιο πρόσφατη από την πιο πρόσφατη
έναρξη έργου τότε θα είναι και πιο πρόσφατη από όλες τις άλλες
Αυτό εφαρμόζεται μόνο σε χρονικά δεδομένα,
σε άλλες περιπτώσεις είναι πιθανό η χρήση του
τελεστή ALL να είναι αναπόφευκτη

12 / 31

Παρατηρήσεις για τα υποερωτήματα με ALL

Για τη χρήση του ALL, σε παραστάσεις

WHERE X θ ALL Y

όπου Y υποερώτημα, πρέπει να ξέρουμε:


Αν το υποερώτημα επιστρέψει το κενό σύνολο τότε η σύγκριση με το
ALL αποδίδει TRUE
Αν η σύγκριση επιστρέψει true για όλες τις όλες τις εγγραφές που
επιστρέφει το υποερώτημα, τότε και μόνο τότε, η παράσταση
επιστρέφει TRUE
Αν η σύγκριση επιστρέψει FALSE για τουλάχιστον μία φορά, τότε η
παράσταση επιστρέφει FALSE
Αν για κάποια σύγκριση, επιστραφεί η τιμή NULL, τότε η
παράσταση επιστρέφει NULL

13 / 31
Τεστ σύγκρισης με ANY

Να βρεθούν οι υπάλληλοι που προσλήφθηκαν μέχρι την 31/12/2003 και


παίρνουν μισθό μικρότερο από το μισθό οποιουδήποτε υπαλλήλου που
προσλήφθηκε μετά την 1/1/2004

SELECT ∗
FROM employees
WHERE h i r e d a t e <= ’ 2003−12−31 ’
AND s a l a r y < ANY (SELECT DISTINCT s a l a r y
FROM e m p l o y e e s
WHERE h i r e d a t e > ’ 2004−01−01 ’ ) ;

Το πεδίο salary υπάρχει στη φράση WHERE του εξωτερικού


ερωτήματος
και στη φράση SELECT του υποερωτήματος
Εδώ μας ενδιαφέρει η σύγκριση να αποδώσει τουλάχιστον
μία φορά TRUE
14 / 31

Παρατηρήσεις για τα υποερωτήματα με ANY

Για τη χρήση του ANY, σε παραστάσεις

WHERE X θ ANY Y

όπου Y υποερώτημα, πρέπει να ξέρουμε:


Αν το υποερώτημα επιστρέψει το κενό σύνολο τότε η σύγκριση με το
ANY αποδίδει FALSE
Αν η σύγκριση επιστρέψει true τουλάχιστον μία φορά, τότε, η
παράσταση επιστρέφει TRUE
Αν η σύγκριση επιστρέψει FALSE για όλες τις όλες τις εγγραφές που
επιστρέφει το υποερώτημα, τότε και μόνο τότε, η παράσταση
επιστρέφει FALSE
Αν για κάποια σύγκριση, επιστραφεί η τιμή NULL, τότε η
παράσταση επιστρέφει NULL

15 / 31
Τεστ σύγκρισης με EXISTS

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων που απασχολούνται


σε τουλάχιστον ένα έργο

SELECT ∗
FROM e m p l o y e e s e
WHERE EXISTS (SELECT empid
FROM workson w
WHERE e . empid = w . empid ) ;

Ο τελεστής EXISTS λέγεται τελεστής ύπαρξης


Οι εγγραφές του υποερωτήματος αναφέρονται
στις εγγραφές του εξωτερικού ερωτήματος,
τέτοια υποερωτήματα λέγονται συσχετιζόμενα
Το τεστ EXISTS δεν επιστρέφει ποτέ NULL,
μόνο TRUE ή FALSE

16 / 31

Ανάλυση του παραδείγματος με τον τελεστή ύπαρξης

1 Αρχικά πρέπει να γνωρίζουμε ότι αν απασχολείται κάποιος


υπάλληλος σε κάποιο έργο, τότε θα υπάρχει μια αντίστοιχη
εγγραφή στον πίνακα workson
2 Επομένως, αυτό που ψάχνουμε μπορεί να θεωρηθεί ισοδύναμο με
την έκφραση: να βρεθούν οι υπάλληλοι, ο κωδικός των οποίων
εμφανίζεται στον πίνακα workson
3 Η SQL εκτελεί το εξωτερικό ερώτημα και βρίσκει τον κωδικό όλων
των υπαλλήλων
4 Στη συνέχεια, για κάθε εγγραφή του κυρίου ερωτήματος, εκτελεί το
υποερώτημα, σύμφωνα με τη σύγκριση:
WHERE e.empid = w.empid
5 Αν το υποερώτημα επιστρέψει εγγραφές (αδιάφορο πόσες)
τότε το τεστ EXISTS επιστρέφει TRUE
6 Διαφορετικά, αν το υποερώτημα δεν επιστρέψει εγγραφές,
το τεστ EXISTS επιστρέφει FALSE
17 / 31
Ισοδυναμία ύπαρξης με σύζευξη

Να βρεθούν όλες οι λεπτομέρειες των υπαλλήλων που απασχολούνται


σε τουλάχιστον ένα έργο

SELECT DISTINCT e . ∗
FROM e m p l o y e e s e INNER JOIN workson w
ON e . empid = w . empid

Μερικές φορές ο τελεστής EXISTS ισοδυναμεί με σύζευξη


Αυτό γίνεται εύκολα αντιληπτό από την έκφραση
WHERE e.empid = w.empid
που χρησιμοποιήσαμε στο υποερώτημα
Το EXISTS έχει άρνηση το NOT EXISTS
Για παράδειγμα, πως μπορούν να βρεθούν οι υπάλληλοι
που δεν απασχολούνται σε κάποιο έργο;

18 / 31

Υποερωτήματα στη φράση SELECT

Να υπολογιστεί το ποσοστό των υπαλλήλων ανά τμήμα, και το


συνολικό ποσοστό (100%)

SELECT d e p i d , 100∗ count ( empid ) /


(SELECT count ( empid ) FROM e m p l o y e e s )
AS perEmp
FROM e m p l o y e e s
GROUP BY d e p i d WITH ROLLUP;

depid perEmp
1 10.0000
2 13.3333
3 30.0000
4 16.6667
5 6.6667
6 23.3333
NULL 100.0000

19 / 31
Υποερωτήματα στη φράση FROM
΄Ενα οποιοδήποτε ερώτημα

SELECT d e p i d , sum( s a l a r y )
FROM e m p l o y e e s
GROUP BY d e p i d

Μπορεί να ‘‘μεταφερθεί’’ στη φράση FROM αν του δώσουμε όνομα:

SELECT ∗
FROM ( SELECT d e p i d , sum( s a l a r y )
FROM e m p l o y e e s
GROUP BY d e p i d ) e s ;

Η ονοματοδοσία του υποερωτήματος στη φράση FROM είναι


υποχρεωτική
Το επώνυμο αποτέλεσμα του ερωτήματος μέσα στις παρενθέσεις
μπορεί να χρησιμοποιηθεί στη συνέχεια ως πίνακας ή όψη, πχ σε
νέα σύζευξη
20 / 31

Να βρεθεί το ποσό της μισθοδοσίας ανά όνομα τμήματος


Με υποερώτημα στο FROM

SELECT depname , sumSal


FROM (
SELECT d e p i d , SUM( s a l a r y ) AS sumSal
FROM e m p l o y e e s
GROUP BY d e p i d
) es
INNER JOIN d e p a r t m e n t s d
ON e s . d e p i d = d . d e p i d

Με φυσική σύζευξη

SELECT depname , SUM( s a l a r y ) AS sumSal


FROM e m p l o y e e s NATURAL JOIN d e p a r t m e n t s
GROUP BY depname ;

21 / 31
Να βρεθεί όνομα του τμήματος με το μεγαλύτερο ποσό
μισθοδοσίας

SELECT depname
FROM d e p a r t m e n t s NATURAL JOIN e m p l o y e e s
GROUP BY depname
HAVING sum( s a l a r y )=
(
SELECT sumSal
FROM (
SELECT d e p i d , SUM( s a l a r y ) AS sumSal
FROM e m p l o y e e s
GROUP BY d e p i d
) es
WHERE sumSal >= ALL (
SELECT SUM( s a l a r y )
FROM e m p l o y e e s
GROUP BY d e p i d )
)

22 / 31

Να βρεθεί όνομα που τμήματος με το μεγαλύτερο ποσό


μισθοδοσίας

Επειδή πάντα υπάρχει ο πιο εύκολος τρόπος

SELECT depname
FROM d e p a r t m e n t s NATURAL JOIN e m p l o y e e s
GROUP BY depname
ORDER BY SUM( s a l a r y ) DESC
LIMIT 0 , 1

Η λύση αυτή δεν είναι ‘‘αλγεβρική’’,


βασίζεται στο τρυκ με τη χρήση του LIMIT 0, 1.

23 / 31
Να βρεθεί το όνομα του τμήματος και ο μέσος μισθός των
υπαλλήλων του, για το τμήμα με το μικρότερη μέση τιμή
στους μισθούς
Διπλή χρήση του υποερωτήματος στη φράση FROM και WHERE

SELECT d . depname , e1 . m s a l
FROM ( SELECT d e p i d , AVG( s a l a r y ) AS m s a l
FROM e m p l o y e e s
GROUP BY d e p i d
) e1
INNER JOIN d e p a r t m e n t s d ON e1 . d e p i d=d . d e p i d
WHERE e1 . m s a l =
( SELECT MIN( e2 . m s a l )
FROM ( SELECT d e p i d , AVG( s a l a r y )
AS m s a l
FROM e m p l o y e e s
GROUP BY d e p i d
) e2
);

24 / 31

Να βρεθούν οι κωδικοί των έργων με τη μικρότερη


απασχόληση εργαζομένων

Διπλή εμφώλευση υποερωτήματος στη φράση HAVING

SELECT proid
FROM workson
GROUP BY proid
HAVING count ( empid ) <= ALL
( SELECT c n t
FROM
(
SELECT p r o i d , count ( empid ) AS c n t
FROM workson
GROUP BY p r o i d
) w2
);

25 / 31
Να βρεθούν οι κωδικοί των έργων με τη μικρότερη
απασχόληση εργαζομένων, άλλος τρόπος με χρήση της
συνάρτησης min
Διπλή εμφώλευση υποερωτήματος στη φράση HAVING

SELECT proid
FROM workson
GROUP BY proid
HAVING count ( empid ) =
( SELECT min ( c n t )
FROM
(
SELECT p r o i d , count ( empid ) AS c n t
FROM workson
GROUP BY p r o i d
) w2
);

26 / 31

΄Ενωση
Γενική μορφή ερωτημάτων ένωσης

SELECT . . .
UNION [ ALL | DISTINCT ]
SELECT . . .

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


‘‘συμβατότητα τύπου’’: ίδιο πλήθος πεδίων με αντίστοιχα κοινό
πεδίο ορισμού
Η επιλογή ALL θα επιστρέψει την ένωση κρατώντας τις διπλότιμες
τιμές
Η επιλογή DISTINCT θα επιστρέψει την ένωση χωρίς
τις διπλότιμες τιμές, κάτι που είναι περισσότερο κοντά
στον ορισμό της σχεσιακής πράξης της ένωσης

27 / 31
Παράδειγμα ένωσης - 1

Να βρεθούν οι υπάλληλοι που εργάζονται στα τμήματα 3 και 4

SELECT ∗
FROM employees
WHERE depid = 3
UNION
SELECT ∗
FROM employees
WHERE depid = 4;

Ισοδύναμο με:

SELECT ∗
FROM e m p l o y e e s
WHERE d e p i d IN ( 3 , 4 ) ;

28 / 31

Παράδειγμα ένωσης - 2
Να βρεθεί ο κωδικός και το όνομα των υπαλλήλων που είτε ανήκουν στο
τμήμα με κωδικό 1, είτε δεν απασχολούνται σε κανένα έργο

SELECT empid , f i r s t n a m e , l a s t n a m e
FROM e m p l o y e e s e1
WHERE depid = 1
UNION
SELECT empid , f i r s t n a m e , l a s t n a m e
FROM e m p l o y e e s e2
WHERE NOT EXISTS (SELECT empid
FROM workson w
WHERE e2 . empid = w . empid ) ;

Ισοδύναμο με:

SELECT e . empid , e . f i r s t n a m e , e . l a s t n a m e
FROM e m p l o y e e s e LEFT JOIN workson w ON e . empid = w . empid
WHERE e . depid = 1
OR w . empid I S NULL;

29 / 31
Παράδειγμα ένωσης - 3
΄Οπως το προηγούμενο, αλλά με ένα επιπλέον πεδίο που να περιγράφει αν ο
υπάλληλος είναι στη μία ή άλλη περίπτωση, πχ με το προσδιοριστικό
«ΤΜΗΜΑ 1» ή «ΚΑΝΕΝΑ ΕΡΓΟ»

SELECT empid , f i r s t n a m e , l a s t n a m e , ’ Department 1 ’


AS s t a t u s
FROM e m p l o y e e s e1
WHERE d e p i d = 1
UNION
SELECT empid , f i r s t n a m e , l a s t n a m e , ’ Not i n p r o j e c t ’
AS s t a t u s
FROM e m p l o y e e s e2
WHERE NOT EXISTS (SELECT empid
FROM workson w
WHERE e2 . empid = w . empid ) ;

empid firstname lastname status


109 Μαρία Αθανασίου Department 1
502 Κρινιώ Μαροπούλου Department 1
901 Κυριάκος Ρούσσης Department 1
311 Νίκος Στεργιόπουλος Not in project 30 / 31
721 Βασιλική Περδίκη Not in project

Επιπλέον ενσωματωμένες συναρτήσεις


SQL
Ενσωματωμένες συναρτήσεις στην SQL και
επιπλέον στοιχεία προγραμματισμού
Παραδείγματα και εφαρμογές από τη βάση δεδομένων company

Περιεχόμενα

1 Πράξεις αριθμομηχανής

2 Συναρτήσεις αλγεβρικών όρων και παραστάσεων

3 Συναρτήσεις κειμένου και αλφαριθμητικών

4 Συναρτήσεις ημερομηνίας και ώρας

5 Συναρτήσεις ελέγχου ροής

2 / 106
Ο πίνακας DUAL

SQL ως αριθμομηχανή
1 SELECT 1
2 FROM DUAL;
3

4 1
5 ---
6 1

4 / 106

Ο πίνακας DUAL

SQL ως αριθμομηχανή
1 SELECT 1
2 FROM DUAL;
3

4 1
5 ---
6 1
1 SELECT 1+1
2 FROM DUAL;
3

4 1+1
5 ----
6 2

5 / 106
Πράξεις με συναρτήσεις

Εφαρμογή γνωστών συναρτήσεων

6 / 106

Πράξεις με συναρτήσεις

Εφαρμογή γνωστών συναρτήσεων


1 SELECT sqrt(2)
2 FROM DUAL;
3

4 sqrt(2)
5 ----------------
6 1.4142135623731

7 / 106
Πράξεις με συναρτήσεις

Εφαρμογή γνωστών συναρτήσεων


1 SELECT sqrt(2)
2 FROM DUAL;
3

4 sqrt(2)
5 ----------------
6 1.4142135623731
1 SELECT cos(pi()/4)
2 FROM DUAL;
3

4 cos(pi()/4)
5 ------------------
6 0.707106781186548

8 / 106

Πολλές παραστάσεις μαζί

Προβολή πολλών παραστάσεων

9 / 106
Πολλές παραστάσεις μαζί

Προβολή πολλών παραστάσεων


1 SELECT sqrt(2), log(2), exp(2)
2 FROM DUAL;
3

4 sqrt(2) log(2) exp(2)


5 -----------------------------------------------------
6 1.4142135623731 0.693147180559945 7.38905609893065

10 / 106

Πολλές παραστάσεις μαζί

Προβολή πολλών παραστάσεων


1 SELECT sqrt(2), log(2), exp(2)
2 FROM DUAL;
3

4 sqrt(2) log(2) exp(2)


5 -----------------------------------------------------
6 1.4142135623731 0.693147180559945 7.38905609893065
1 SELECT 2, log(2)/sqrt(2)
2 FROM DUAL;
3

4 2 log(2)/sqrt(2)
5 ---------------------
6 2 0.490129071734274

11 / 106
Ερωτήματα χωρίς FROM;

Ο πίνακας DUAL δεν είναι απαραίτητος στη


MySQL

12 / 106

Ερωτήματα χωρίς FROM;

Ο πίνακας DUAL δεν είναι απαραίτητος στη


MySQL
1 SELECT CURRENT_DATE
2 FROM DUAL;
3

4 CURRENT_DATE
5 -------------
6 2014-03-31

13 / 106
Ερωτήματα χωρίς FROM;

Ο πίνακας DUAL δεν είναι απαραίτητος στη


MySQL
1 SELECT CURRENT_DATE
2 FROM DUAL;
3

4 CURRENT_DATE
5 -------------
6 2014-03-31
1 SELECT CURRENT_DATE;
2

3 CURRENT_DATE
4 -------------
5 2014-03-31

14 / 106

Περιεχόμενα

1 Πράξεις αριθμομηχανής

2 Συναρτήσεις αλγεβρικών όρων και παραστάσεων

3 Συναρτήσεις κειμένου και αλφαριθμητικών

4 Συναρτήσεις ημερομηνίας και ώρας

5 Συναρτήσεις ελέγχου ροής

15 / 106
Αριθμητικές συναρτήσεις
1 Υπάρχουν πολλές διαθέσιμες συναρτήσεις για αριθμούς
ή αλγεβρικές παραστάσεις, παρόμοιες με αυτές που
έχουμε εξετάσει στα λογιστικά φύλλα.

16 / 106

Αριθμητικές συναρτήσεις
1 Υπάρχουν πολλές διαθέσιμες συναρτήσεις για αριθμούς
ή αλγεβρικές παραστάσεις, παρόμοιες με αυτές που
έχουμε εξετάσει στα λογιστικά φύλλα.
2 Για παράδειγμα, log για τον υπολογισμό λογαρίθμου,
pow για ύψωση σε δύναμη ή cos για υπολογισμό
συνημιτόνου.

17 / 106
Αριθμητικές συναρτήσεις
1 Υπάρχουν πολλές διαθέσιμες συναρτήσεις για αριθμούς
ή αλγεβρικές παραστάσεις, παρόμοιες με αυτές που
έχουμε εξετάσει στα λογιστικά φύλλα.
2 Για παράδειγμα, log για τον υπολογισμό λογαρίθμου,
pow για ύψωση σε δύναμη ή cos για υπολογισμό
συνημιτόνου.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.

18 / 106

Αριθμητικές συναρτήσεις
1 Υπάρχουν πολλές διαθέσιμες συναρτήσεις για αριθμούς
ή αλγεβρικές παραστάσεις, παρόμοιες με αυτές που
έχουμε εξετάσει στα λογιστικά φύλλα.
2 Για παράδειγμα, log για τον υπολογισμό λογαρίθμου,
pow για ύψωση σε δύναμη ή cos για υπολογισμό
συνημιτόνου.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.
4 Προσοχή, το όρισμα πρέπει να είναι έγκυρο.

19 / 106
Αριθμητικές συναρτήσεις
1 Υπάρχουν πολλές διαθέσιμες συναρτήσεις για αριθμούς
ή αλγεβρικές παραστάσεις, παρόμοιες με αυτές που
έχουμε εξετάσει στα λογιστικά φύλλα.
2 Για παράδειγμα, log για τον υπολογισμό λογαρίθμου,
pow για ύψωση σε δύναμη ή cos για υπολογισμό
συνημιτόνου.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.
4 Προσοχή, το όρισμα πρέπει να είναι έγκυρο.
5 Ακολουθούν παραδείγματα.

20 / 106

Στρογγυλοποίηση με τη ROUND

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


4 καθώς και ο μισθός με στρογγυλοποίηση σε εκατοντάδες.

21 / 106
Στρογγυλοποίηση με τη ROUND

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


4 καθώς και ο μισθός με στρογγυλοποίηση σε εκατοντάδες.
1 SELECT empid, salary, ROUND(salary, -2)
2 FROM employees
3 WHERE depid = 4;
4

22 / 106

Στρογγυλοποίηση με τη ROUND

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


4 καθώς και ο μισθός με στρογγυλοποίηση σε εκατοντάδες.
1 SELECT empid, salary, ROUND(salary, -2)
2 FROM employees
3 WHERE depid = 4;
4

5 empid salary ROUND(salary, -2)


6 ----------------------------------
7 206 1102.04 1100
8 230 NULL NULL
9 311 1386.05 1400
10 593 NULL NULL
11 780 1054.71 1100

23 / 106
Ομαδοποίηση μετά από στρογγυλοποίηση
Να βρεθεί το πλήθος των υπαλλήλων ανά εκατοντάδα μισθού.

24 / 106

Ομαδοποίηση μετά από στρογγυλοποίηση


Να βρεθεί το πλήθος των υπαλλήλων ανά εκατοντάδα μισθού.
1 SELECT ROUND(salary, -2) AS SalCat, COUNT(*) AS cntSC
2 FROM employees
3 GROUP BY ROUND(salary, -2);
4

25 / 106
Ομαδοποίηση μετά από στρογγυλοποίηση
Να βρεθεί το πλήθος των υπαλλήλων ανά εκατοντάδα μισθού.
1 SELECT ROUND(salary, -2) AS SalCat, COUNT(*) AS cntSC
2 FROM employees
3 GROUP BY ROUND(salary, -2);
4

5 SalCat cntSC
6 --------------
7 NULL 3
8 1100 9
9 1200 2
10 1300 6
11 1400 2
12 1500 1
13 1600 2
14 1800 1
15 1900 2
16 2300 1 26 / 106

2800 1
Στρογγυλοποίηση στο 250
Να βρεθεί το πλήθος των υπαλλήλων ανά εκατοντάδα μισθού.

27 / 106
Στρογγυλοποίηση στο 250
Να βρεθεί το πλήθος των υπαλλήλων ανά εκατοντάδα μισθού.
1 SELECT ROUND(salary, -2) AS SalCat, COUNT(*) AS cntSC
2 FROM employees
3 GROUP BY ROUND(salary, -2);
4

28 / 106

Στρογγυλοποίηση στο 250


Να βρεθεί το πλήθος των υπαλλήλων ανά εκατοντάδα μισθού.
1 SELECT ROUND(salary, -2) AS SalCat, COUNT(*) AS cntSC
2 FROM employees
3 GROUP BY ROUND(salary, -2);
4

5 SalCat cntSC
6 --------------
7 NULL 3
8 1100 9
9 1200 2
10 1300 6
11 1400 2
12 1500 1
13 1600 2
14 1800 1
15 1900 2
16 2300 1 29 / 106

2800 1
Στρογγυλοποίηση με τη FLOOR

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


2 καθώς και ο μισθός με στρογγυλοποίηση προς τα κάτω.

30 / 106

Στρογγυλοποίηση με τη FLOOR

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


2 καθώς και ο μισθός με στρογγυλοποίηση προς τα κάτω.
1 SELECT empid, salary, FLOOR(salary)
2 FROM employees
3 WHERE depid = 2;
4

31 / 106
Στρογγυλοποίηση με τη FLOOR

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


2 καθώς και ο μισθός με στρογγυλοποίηση προς τα κάτω.
1 SELECT empid, salary, FLOOR(salary)
2 FROM employees
3 WHERE depid = 2;
4

5 empid salary FLOOR(salary)


6 ------------------------------
7 153 1321.92 1321
8 243 1609.52 1609
9 419 1323.80 1323
10 503 1105.04 1105

32 / 106

Στρογγυλοποίηση με τη FLOOR σε εκατοντάδα

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


2 καθώς και ο μισθός με στρογγυλοποίηση εκατοντάδας προς τα
κάτω.

33 / 106
Στρογγυλοποίηση με τη FLOOR σε εκατοντάδα

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


2 καθώς και ο μισθός με στρογγυλοποίηση εκατοντάδας προς τα
κάτω.
1 SELECT empid, salary, FLOOR(salary/100)*100
2 FROM employees
3 WHERE depid = 2;
4

34 / 106

Στρογγυλοποίηση με τη FLOOR σε εκατοντάδα

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


2 καθώς και ο μισθός με στρογγυλοποίηση εκατοντάδας προς τα
κάτω.
1 SELECT empid, salary, FLOOR(salary/100)*100
2 FROM employees
3 WHERE depid = 2;
4

5 empid salary FLOOR(salary/100)*100


6 --------------------------------------
7 153 1321.92 1300
8 243 1609.52 1600
9 419 1323.80 1300
10 503 1105.04 1100

35 / 106
Στρογγυλοποίηση με FLOOR x 250

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


2 καθώς και ο μισθός με στρογγυλοποίηση προς τα κάτω σε
πολλαπλάσιο του 250.

36 / 106

Στρογγυλοποίηση με FLOOR x 250

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


2 καθώς και ο μισθός με στρογγυλοποίηση προς τα κάτω σε
πολλαπλάσιο του 250.
1 SELECT empid, salary, FLOOR(salary/250)*250
2 FROM employees
3 WHERE depid = 2;
4

37 / 106
Στρογγυλοποίηση με FLOOR x 250

Να βρεθεί ο κωδικός και ο μισθός των υπαλλήλων του τμήματος


2 καθώς και ο μισθός με στρογγυλοποίηση προς τα κάτω σε
πολλαπλάσιο του 250.
1 SELECT empid, salary, FLOOR(salary/250)*250
2 FROM employees
3 WHERE depid = 2;
4

5 empid salary FLOOR(salary/250)*250


6 --------------------------------------
7 153 1321.92 1250
8 243 1609.52 1500
9 419 1323.80 1250
10 503 1105.04 1000

38 / 106

Περιεχόμενα

1 Πράξεις αριθμομηχανής

2 Συναρτήσεις αλγεβρικών όρων και παραστάσεων

3 Συναρτήσεις κειμένου και αλφαριθμητικών

4 Συναρτήσεις ημερομηνίας και ώρας

5 Συναρτήσεις ελέγχου ροής

39 / 106
Συναρτήσεις κειμένου και αλφαριθμητικών
1 Συναρτήσεις που επεξεργάζονται κείμενο και
συμβολοσειρές.

40 / 106

Συναρτήσεις κειμένου και αλφαριθμητικών


1 Συναρτήσεις που επεξεργάζονται κείμενο και
συμβολοσειρές.
2 Για παράδειγμα, left για τη λήψη αριστερού
μέρους ενός αλφαριθμητικού, length για την
καταμέτρηση χαρακτήρων, ή replace για την
αντικατάσταση κειμένου από κείμενο.

41 / 106
Συναρτήσεις κειμένου και αλφαριθμητικών
1 Συναρτήσεις που επεξεργάζονται κείμενο και
συμβολοσειρές.
2 Για παράδειγμα, left για τη λήψη αριστερού
μέρους ενός αλφαριθμητικού, length για την
καταμέτρηση χαρακτήρων, ή replace για την
αντικατάσταση κειμένου από κείμενο.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.

42 / 106

Συναρτήσεις κειμένου και αλφαριθμητικών


1 Συναρτήσεις που επεξεργάζονται κείμενο και
συμβολοσειρές.
2 Για παράδειγμα, left για τη λήψη αριστερού
μέρους ενός αλφαριθμητικού, length για την
καταμέτρηση χαρακτήρων, ή replace για την
αντικατάσταση κειμένου από κείμενο.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.
4 Προσοχή, το όρισμα πρέπει να είναι έγκυρο.

43 / 106
Συναρτήσεις κειμένου και αλφαριθμητικών
1 Συναρτήσεις που επεξεργάζονται κείμενο και
συμβολοσειρές.
2 Για παράδειγμα, left για τη λήψη αριστερού
μέρους ενός αλφαριθμητικού, length για την
καταμέτρηση χαρακτήρων, ή replace για την
αντικατάσταση κειμένου από κείμενο.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.
4 Προσοχή, το όρισμα πρέπει να είναι έγκυρο.
5 Ακολουθούν παραδείγματα.

44 / 106

Ενοποίηση κειμένου
Να δώσετε το όνομα και το επώνυμο των υπαλλήλων του
τμήματος 4 σε μία στήλη, ως ονοματεπώνυμο.

45 / 106
Ενοποίηση κειμένου
Να δώσετε το όνομα και το επώνυμο των υπαλλήλων του
τμήματος 4 σε μία στήλη, ως ονοματεπώνυμο.
1 SELECT CONCAT(firstname, ’ ’, lastname)
2 FROM employees
3 WHERE depid = 4;
4

46 / 106

Ενοποίηση κειμένου
Να δώσετε το όνομα και το επώνυμο των υπαλλήλων του
τμήματος 4 σε μία στήλη, ως ονοματεπώνυμο.
1 SELECT CONCAT(firstname, ’ ’, lastname)
2 FROM employees
3 WHERE depid = 4;
4

5 CONCAT(firstname, ’ ’, lastname)
6 ---------------------------------
7 Νίκος Βλάχος
8 Βαγγέλης Χριστόπουλος
9 Νίκος Στεργιόπουλος
10 Παύλος Περίδης
11 Ευθαλεία Μικράκη

47 / 106
Ενοποίηση και αποκοπή κειμένου
Να δώσετε το αρχικό του ονόματος και το επώνυμο των
υπαλλήλων του τμήματος 4 σε μία στήλη, ως ονοματεπώνυμο.

48 / 106

Ενοποίηση και αποκοπή κειμένου


Να δώσετε το αρχικό του ονόματος και το επώνυμο των
υπαλλήλων του τμήματος 4 σε μία στήλη, ως ονοματεπώνυμο.
1 SELECT CONCAT(LEFT(firstname, 1), ’. ’, lastname)
2 FROM employees
3 WHERE depid = 4;
4

49 / 106
Ενοποίηση και αποκοπή κειμένου
Να δώσετε το αρχικό του ονόματος και το επώνυμο των
υπαλλήλων του τμήματος 4 σε μία στήλη, ως ονοματεπώνυμο.
1 SELECT CONCAT(LEFT(firstname, 1), ’. ’, lastname)
2 FROM employees
3 WHERE depid = 4;
4

5 CONCAT(LEFT(firstname, 1), ’. ’, lastname)


6 -------------------------------------------
7 Ν. Βλάχος
8 Β. Χριστόπουλος
9 Ν. Στεργιόπουλος
10 Π. Περίδης
11 Ε. Μικράκη

50 / 106

Ενοποίηση και αποκοπή κειμένου


Να δώσετε ονοματεπώνυμο και το μήκος της συμβολοσειράς του
των υπαλλήλων του τμήματος 4.

51 / 106
Ενοποίηση και αποκοπή κειμένου
Να δώσετε ονοματεπώνυμο και το μήκος της συμβολοσειράς του
των υπαλλήλων του τμήματος 4.
1 SELECT CONCAT(firstname, ’ ’, lastname)
2 AS name,
3 LENGTH(CONCAT(firstname, lastname))
4 AS cnt
5 FROM employees
6 WHERE depid = 4;
7

52 / 106

Ενοποίηση και αποκοπή κειμένου


Να δώσετε ονοματεπώνυμο και το μήκος της συμβολοσειράς του
των υπαλλήλων του τμήματος 4.
1 SELECT CONCAT(firstname, ’ ’, lastname)
2 AS name,
3 LENGTH(CONCAT(firstname, lastname))
4 AS cnt
5 FROM employees
6 WHERE depid = 4;
7

8 name cnt
9 ------------------------------
10 Βαγγέλης Χριστόπουλος 40
11 Ευθαλεία Μικράκη 30
12 Νίκος Βλάχος 22
13 Νίκος Στεργιόπουλος 36
14 Παύλος Περίδης 26
53 / 106
Προσοχή! utf-8
Να δώσετε ονοματεπώνυμο και το μήκος της συμβολοσειράς του
των υπαλλήλων του τμήματος 4.
1 SELECT CONCAT(firstname, ’ ’, lastname)
2 AS name,
3 LENGTH(CONCAT(firstname, lastname))/2
4 AS cnt
5 FROM employees
6 WHERE depid = 4;
7

8 name cnt
9 ------------------------------
10 Βαγγέλης Χριστόπουλος 20
11 Ευθαλεία Μικράκη 15
12 Νίκος Βλάχος 11
13 Νίκος Στεργιόπουλος 18
14 Παύλος Περίδης 13
54 / 106

Πιο σωστός τρόπος


Να δώσετε ονοματεπώνυμο και το μήκος της συμβολοσειράς του
των υπαλλήλων του τμήματος 4.
1 SELECT CONCAT(firstname, ’ ’, lastname)
2 AS name,
3 CHAR_LENGTH(CONCAT(firstname, lastname))
4 AS cnt
5 FROM employees
6 WHERE depid = 4;
7

8 name cnt
9 ------------------------------
10 Βαγγέλης Χριστόπουλος 20
11 Ευθαλεία Μικράκη 15
12 Νίκος Βλάχος 11
13 Νίκος Στεργιόπουλος 18
14 Παύλος Περίδης 13
55 / 106
Αλλαγή σε κεφαλαία
Να δώσετε τον κωδικό και το όνομα των τμημάτων με κεφαλαία
γράμματα.

56 / 106

Αλλαγή σε κεφαλαία
Να δώσετε τον κωδικό και το όνομα των τμημάτων με κεφαλαία
γράμματα.
1 SELECT depid, UPPER(depname)
2 FROM departments;
3

57 / 106
Αλλαγή σε κεφαλαία
Να δώσετε τον κωδικό και το όνομα των τμημάτων με κεφαλαία
γράμματα.
1 SELECT depid, UPPER(depname)
2 FROM departments;
3

4 depid UPPER(depname)
5 ------------------------------
6 1 ΔΙΟ΄ΙΚΗΣΗΣ/ΕΠ΄ΙΒΛΕΨΗΣ
7 2 ΟΙΚΟΝΟΜΟΛ΄ΟΓΩΝ/ΛΟΓΙΣΤ΄ΩΝ
8 3 ΕΠΙΣΤΗΜ΄ΟΝΩΝ/ΜΗΧΑΝΙΚ΄ΩΝ
9 4 ΕΞΩΤΕΡΙΚ΄ΩΝ ΣΥΝΕΡΓΑΤ΄ΩΝ
10 5 ΓΡΑΜΜΑΤΕ΄ΙΑΣ
11 6 ΠΩΛ΄ΗΣΕΩΝ

58 / 106

Αντικατάσταση κειμένου
Να δώσετε τον κωδικό και το όνομα των τμημάτων με κεφαλαία
γράμματα, χωρίς τόνους.

59 / 106
Αντικατάσταση κειμένου
Να δώσετε τον κωδικό και το όνομα των τμημάτων με κεφαλαία
γράμματα, χωρίς τόνους.
1 SELECT depid, REPLACE(UPPER(depname), ’´’, ’’)
2 FROM departments;
3

60 / 106

Αντικατάσταση κειμένου
Να δώσετε τον κωδικό και το όνομα των τμημάτων με κεφαλαία
γράμματα, χωρίς τόνους.
1 SELECT depid, REPLACE(UPPER(depname), ’´’, ’’)
2 FROM departments;
3

4 depid REPLACE(UPPER(depname), ’´’, ’’)


5 ------------------------------
6 1 ΔΙΟΙΚΗΣΗΣ/ΕΠΙΒΛΕΨΗΣ
7 2 ΟΙΚΟΝΟΜΟΛΟΓΩΝ/ΛΟΓΙΣΤΩΝ
8 3 ΕΠΙΣΤΗΜΟΝΩΝ/ΜΗΧΑΝΙΚΩΝ
9 4 ΕΞΩΤΕΡΙΚΩΝ ΣΥΝΕΡΓΑΤΩΝ
10 5 ΓΡΑΜΜΑΤΕΙΑΣ
11 6 ΠΩΛΗΣΕΩΝ

61 / 106
Μέρος συμβολοσειράς
Χαρακτήρες 1 – 3

62 / 106

Μέρος συμβολοσειράς
Χαρακτήρες 1 – 3
1 SELECT lastname, SUBSTR(lastname, 1, 3)
2 FROM employees
3 WHERE empid = 419;
4

63 / 106
Μέρος συμβολοσειράς
Χαρακτήρες 1 – 3
1 SELECT lastname, SUBSTR(lastname, 1, 3)
2 FROM employees
3 WHERE empid = 419;
4

5 lastname SUBSTR(lastname, 1, 3)
6 ------------------------------------
7 Αρβανιτάκης Αρβ

64 / 106

Μέρος συμβολοσειράς
Χαρακτήρες 1 – 3
1 SELECT lastname, SUBSTR(lastname, 1, 3)
2 FROM employees
3 WHERE empid = 419;
4

5 lastname SUBSTR(lastname, 1, 3)
6 ------------------------------------
7 Αρβανιτάκης Αρβ

Χαρακτήρες -6 – 3

65 / 106
Μέρος συμβολοσειράς
Χαρακτήρες 1 – 3
1 SELECT lastname, SUBSTR(lastname, 1, 3)
2 FROM employees
3 WHERE empid = 419;
4

5 lastname SUBSTR(lastname, 1, 3)
6 ------------------------------------
7 Αρβανιτάκης Αρβ

Χαρακτήρες -6 – 3
1 SELECT lastname, SUBSTR(lastname, -6, 3)
2 FROM employees
3 WHERE empid = 419;
4

66 / 106

Μέρος συμβολοσειράς
Χαρακτήρες 1 – 3
1 SELECT lastname, SUBSTR(lastname, 1, 3)
2 FROM employees
3 WHERE empid = 419;
4

5 lastname SUBSTR(lastname, 1, 3)
6 ------------------------------------
7 Αρβανιτάκης Αρβ

Χαρακτήρες -6 – 3
1 SELECT lastname, SUBSTR(lastname, -6, 3)
2 FROM employees
3 WHERE empid = 419;
4

5 lastname SUBSTR(lastname, -6, 3)


6 ------------------------------------
7 Αρβανιτάκης ιτά 67 / 106
Θέση αλφαριθμητικού σε κείμενο
Να βρεθεί το όνομα και η θέση του λ στο όνομα των υπαλλήλων
του τμήματος 4.

68 / 106

Θέση αλφαριθμητικού σε κείμενο


Να βρεθεί το όνομα και η θέση του λ στο όνομα των υπαλλήλων
του τμήματος 4.
1 SELECT firstname, LOCATE(’λ’, firstname)
2 FROM emloyees
3 WHERE depid = 4;
4

69 / 106
Θέση αλφαριθμητικού σε κείμενο
Να βρεθεί το όνομα και η θέση του λ στο όνομα των υπαλλήλων
του τμήματος 4.
1 SELECT firstname, LOCATE(’λ’, firstname)
2 FROM emloyees
3 WHERE depid = 4;
4

5 firstname LOCATE(’λ’, firstname)


6 --------------------------------------
7 Νίκος 0
8 Βαγγέλης 6
9 Νίκος 0
10 Παύλος 4
11 Ευθαλεία 5

70 / 106

Περιεχόμενα

1 Πράξεις αριθμομηχανής

2 Συναρτήσεις αλγεβρικών όρων και παραστάσεων

3 Συναρτήσεις κειμένου και αλφαριθμητικών

4 Συναρτήσεις ημερομηνίας και ώρας

5 Συναρτήσεις ελέγχου ροής

71 / 106
Συναρτήσεις ημερομηνίας και ώρας
1 Συναρτήσεις που επεξεργάζονται
ημερολογιακά δεδομένα.

72 / 106

Συναρτήσεις ημερομηνίας και ώρας


1 Συναρτήσεις που επεξεργάζονται
ημερολογιακά δεδομένα.
2 Για παράδειγμα, year για τη λήψη έτους μιας
ημερομηνίας, hour για τη ώρας, ή datediff για
τον υπολογισμό διαφοράς δύο ημερομηνιών.

73 / 106
Συναρτήσεις ημερομηνίας και ώρας
1 Συναρτήσεις που επεξεργάζονται
ημερολογιακά δεδομένα.
2 Για παράδειγμα, year για τη λήψη έτους μιας
ημερομηνίας, hour για τη ώρας, ή datediff για
τον υπολογισμό διαφοράς δύο ημερομηνιών.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.

74 / 106

Συναρτήσεις ημερομηνίας και ώρας


1 Συναρτήσεις που επεξεργάζονται
ημερολογιακά δεδομένα.
2 Για παράδειγμα, year για τη λήψη έτους μιας
ημερομηνίας, hour για τη ώρας, ή datediff για
τον υπολογισμό διαφοράς δύο ημερομηνιών.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.
4 Προσοχή, το όρισμα πρέπει να είναι έγκυρο.

75 / 106
Συναρτήσεις ημερομηνίας και ώρας
1 Συναρτήσεις που επεξεργάζονται
ημερολογιακά δεδομένα.
2 Για παράδειγμα, year για τη λήψη έτους μιας
ημερομηνίας, hour για τη ώρας, ή datediff για
τον υπολογισμό διαφοράς δύο ημερομηνιών.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.
4 Προσοχή, το όρισμα πρέπει να είναι έγκυρο.
5 Ακολουθούν παραδείγματα.

76 / 106

Ημερομηνία και ώρα τώρα


Ημερομηνία και ώρα:
1 SELECT CURDATE(), CURTIME()
2 FROM DUAL;
3

4 CURDATE() CURTIME()
5 ----------------------
6 2014-03-24 11:24:43

77 / 106
Ημερομηνία και ώρα τώρα
Ημερομηνία και ώρα:
1 SELECT CURDATE(), CURTIME()
2 FROM DUAL;
3

4 CURDATE() CURTIME()
5 ----------------------
6 2014-03-24 11:24:43

΄Ολα μαζί:
1 SELECT NOW()
2 FROM DUAL;
3

4 NOW()
5 --------------------
6 2014-03-24 11:24:43

78 / 106

Χρονοσφραγίδα
Εδώ:
1 SELECT LOCALTIMESTAMP()
2 FROM DUAL;
3

4 LOCALTIMESTAMP()
5 --------------------
6 2014-03-24 11:24:43

79 / 106
Χρονοσφραγίδα
Εδώ:
1 SELECT LOCALTIMESTAMP()
2 FROM DUAL;
3

4 LOCALTIMESTAMP()
5 --------------------
6 2014-03-24 11:24:43

UTC:
1 SELECT UTC_TIMESTAMP()
2 FROM DUAL;
3

4 UTC_TIMESTAMP()
5 --------------------
6 2014-03-24 09:24:43

80 / 106

΄Ετος πρόσληψης
Να βρεθεί το πλήθος των προσλήψεων το 2003
1 SELECT COUNT(*)
2 FROM employees
3 WHERE hiredate BETWEEN ’2003-01-01’ AND ’2003-12-31’;
4

5 COUNT(*)
6 ---------
7 3

81 / 106
΄Ετος πρόσληψης
Να βρεθεί το πλήθος των προσλήψεων το 2003
1 SELECT COUNT(*)
2 FROM employees
3 WHERE hiredate BETWEEN ’2003-01-01’ AND ’2003-12-31’;
4

5 COUNT(*)
6 ---------
7 3

Να βρεθεί το πλήθος των προσλήψεων το 2003


1 SELECT COUNT(*)
2 FROM employees
3 WHERE YEAR(hiredate) = 2003;
4

5 COUNT(*)
6 ---------
7 3 82 / 106

Μορφοποίηση ημερομηνίας
Να δοθεί ο τίτλος και η ημερομηνία έναρξης όλων τον έργων με
τη μορφή mm/yy (μήνας/έτος)
1 SELECT title, DATE_FORMAT(startdate, ’%b/%y’)
2 AS StartMonth
3 FROM projects;
4

5 title startMonth
6 -------------------------------------
7 Επίβλεψη έρευνας για ... Jun/05
8 Επίβλεψη κατασκευής ... Jun/06
9 Μελέτη και επίβλεψη ... Apr/06
10 Παροχή συμβουλευτικών ... Jun/03
11 Μελέτη εναλλακτικών ... Aug/07
12 Μελέτη οικονομικής ... Apr/03

83 / 106
Ημέρα της εβδομάδος
Να βρεθεί το πλήθος των προσλήψεων υπαλλήλων ανά ημέρα
της εβδομάδας.
1 SELECT DATE_FORMAT(hiredate, ’%W’) AS wDay,
2 COUNT(*) AS cnt
3 FROM employees
4 GROUP BY DATE_FORMAT(hiredate, ’%w’)
5 ORDER BY DATE_FORMAT(hiredate, ’%w’);
6

7 wDay cnt
8 ---------------
9 Monday 6
10 Tuesday 8
11 Wednesday 4
12 Thursday 4
13 Friday 8

84 / 106

Διάρκεια σε μήνες
Να βρεθεί ο κωδικός και η διάρκεια σε μήνες εκτέλεσης όλων των
έργων στα οποία απασχολούνται υπάλληλοι του τμήματος 5 με
μισθό πάνω από 1500 €.
1 SELECT DISTINCT p.proid,
2 (YEAR(p.enddate)-YEAR(p.startdate))*12
3 +(MONTH(p.enddate)-MONTH(p.startdate)) AS period
4 FROM (projects p INNER JOIN workson w
5 ON p.proid = w.proid)
6 INNER JOIN employees e
7 ON e.empid = w.empid
8 WHERE e.depid = 5
9 AND e.salary > 1500;
10

11 proid period
12 --------------
13 14 49
14 38 23 85 / 106
Πρόσθεση με ημερομηνίες
Να βρεθεί η ημερομηνία λήξης του έργου 21 μετά από παράταση
2 μηνών.
1 SELECT DATE_ADD(enddate, INTERVAL 2 month)
2 AS NewEnddate
3 FROM projects
4 WHERE proid = 21;
5

6 NewEnddate
7 -----------
8 2005-07-31

86 / 106

Πρόσθεση με ημερομηνίες
Να βρεθεί η ημερομηνία λήξης του έργου 21 μετά από παράταση
60 ημερών.
1 SELECT DATE_ADD(enddate, INTERVAL 60 day)
2 AS NewEnddate
3 FROM projects
4 WHERE proid = 21;
5

6 NewEnddate
7 -----------
8 2005-07-30

87 / 106
Περιεχόμενα

1 Πράξεις αριθμομηχανής

2 Συναρτήσεις αλγεβρικών όρων και παραστάσεων

3 Συναρτήσεις κειμένου και αλφαριθμητικών

4 Συναρτήσεις ημερομηνίας και ώρας

5 Συναρτήσεις ελέγχου ροής

88 / 106

Συναρτήσεις ελέγχου ροής


1 Εισάγουν στοιχεία προγραμματισμού και
δομών ελέγχου.

89 / 106
Συναρτήσεις ελέγχου ροής
1 Εισάγουν στοιχεία προγραμματισμού και
δομών ελέγχου.
2 Για παράδειγμα, if για τη απόδοση τιμής υπό
συνθήκη, case για την απόδοση τιμής σε
διάφορες υπο-περιπτώσεις.

90 / 106

Συναρτήσεις ελέγχου ροής


1 Εισάγουν στοιχεία προγραμματισμού και
δομών ελέγχου.
2 Για παράδειγμα, if για τη απόδοση τιμής υπό
συνθήκη, case για την απόδοση τιμής σε
διάφορες υπο-περιπτώσεις.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.

91 / 106
Συναρτήσεις ελέγχου ροής
1 Εισάγουν στοιχεία προγραμματισμού και
δομών ελέγχου.
2 Για παράδειγμα, if για τη απόδοση τιμής υπό
συνθήκη, case για την απόδοση τιμής σε
διάφορες υπο-περιπτώσεις.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.
4 Προσοχή, το όρισμα πρέπει να είναι έγκυρο.

92 / 106

Συναρτήσεις ελέγχου ροής


1 Εισάγουν στοιχεία προγραμματισμού και
δομών ελέγχου.
2 Για παράδειγμα, if για τη απόδοση τιμής υπό
συνθήκη, case για την απόδοση τιμής σε
διάφορες υπο-περιπτώσεις.
3 Επιτρέπεται η εμφώλευση συναρτήσεων.
4 Προσοχή, το όρισμα πρέπει να είναι έγκυρο.
5 Ακολουθούν παραδείγματα.

93 / 106
η συνάρτηση IF
1η απλή περίπτωση
1 SELECT IF(5>3, ’T’, ’F’)
2 FROM DUAL;
3

4 IF(5>3, ’T’, ’F’)


5 ------------------
6 T

94 / 106

η συνάρτηση IF
1η απλή περίπτωση
1 SELECT IF(5>3, ’T’, ’F’)
2 FROM DUAL;
3

4 IF(5>3, ’T’, ’F’)


5 ------------------
6 T

1η απλή περίπτωση
1 SELECT IF(3>5, 1, -1)
2 FROM DUAL;
3

4 IF(3>5, 1, -1)
5 ---------------
6 -1

95 / 106
Η συνάρτηση IF
Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 2
καθώς και η έκφραση Ναι/΄Οχι ανάλογα με το αν παίρνουν
μισθό άνω του 1500.

96 / 106

Η συνάρτηση IF
Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 2
καθώς και η έκφραση Ναι/΄Οχι ανάλογα με το αν παίρνουν
μισθό άνω του 1500.
1 SELECT firstname, lastname,
2 IF(salary>1500, ’Ναι’, ’΄Οχι’) AS sLevel
3 FROM employees
4 WHERE depid = 2;
5

6 firstname lastname sLevel


7 ------------------------------------
8 Μαρία Αλεβιζάτου ΄Οχι
9 Δέσποινα Παπαδοπούλου Ναι
10 Πέτρος Αρβανιτάκης ΄Οχι
11 Μαριλένα Κρέσπα ΄Οχι

97 / 106
Απασχόληση; Ναί ή ΄Οχι
Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 1
καθώς και η έκφραση Ναι/΄Οχι ανάλογα με το αν
απασχολούνται σε κάποιο έργο.

98 / 106

Απασχόληση; Ναί ή ΄Οχι


Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 1
καθώς και η έκφραση Ναι/΄Οχι ανάλογα με το αν
απασχολούνται σε κάποιο έργο.
1 SELECT DISTINCT e.firstname, e.lastname,
2 IF(w.empid IS NULL, ’Ναι’, ’΄Οχι’) AS status
3 FROM employees e LEFT JOIN workson w
4 ON e.empid = w.empid
5 WHERE depid = 1;
6

7 firstname lastname status


8 -----------------------------------
9 Μαρία Αθανασίου ΄Οχι
10 Κρινιώ Μαροπούλου ΄Οχι
11 Κυριάκος Ρούσσης Ναι

99 / 106
Απασχόληση; Ναί ή ΄Οχι
Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 1
καθώς και η έκφραση Ναι/΄Οχι ανάλογα με το αν
απασχολούνται σε κάποιο έργο.

100 / 106

Απασχόληση; Ναί ή ΄Οχι


Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 1
καθώς και η έκφραση Ναι/΄Οχι ανάλογα με το αν
απασχολούνται σε κάποιο έργο.
1 SELECT DISTINCT e.firstname, e.lastname,
2 IFNULL(w.empid, ’Ναι’, ’΄Οχι’) AS status
3 FROM employees e LEFT JOIN workson w
4 ON e.empid = w.empid
5 WHERE depid = 1;
6

7 firstname lastname status


8 -----------------------------------
9 Μαρία Αθανασίου ΄Οχι
10 Κρινιώ Μαροπούλου ΄Οχι
11 Κυριάκος Ρούσσης Ναι

101 / 106
Ροή ελέγχου: CASE
Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 2
καθώς και η έκφραση Μικρό/Μεγάλο (επίπεδο μισθού) ανάλογα
με το αν παίρνουν μισθό άνω του 1500.

102 / 106

Ροή ελέγχου: CASE


Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 2
καθώς και η έκφραση Μικρό/Μεγάλο (επίπεδο μισθού) ανάλογα
με το αν παίρνουν μισθό άνω του 1500.
1 SELECT firstname, lastname,
2 CASE
3 WHEN salary > 1500 THEN ’Μεγάλο’
4 ELSE ’Μικρό’
5 END AS dep2sal
6 FROM employees
7 WHERE depid = 2;
8

9 firstname lastname dep2sal


10 ----------------------------------------
11 Μαρία Αλεβιζάτου Μικρό
12 Δέσποινα Παπαδοπούλου Μεγάλο
13 Πέτρος Αρβανιτάκης Μικρό
14 Μαριλένα Κρέσπα Μικρό 103 / 106
Ροή ελέγχου: CASE 3 περιπτώσεων
Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 2
καθώς και η έκφραση Μικρό/Μεσαίο/Μεγάλο ανάλογα με το αν
παίρνουν μισθό άνω του 1300 ή 1500.

104 / 106

Ροή ελέγχου: CASE 3 περιπτώσεων


Να βρεθεί το ονοματεπώνυμο των υπαλλήλων του τμήματος 2
καθώς και η έκφραση Μικρό/Μεσαίο/Μεγάλο ανάλογα με το αν
παίρνουν μισθό άνω του 1300 ή 1500.
1 SELECT firstname, lastname,
2 CASE
3 WHEN salary > 1500 THEN ’Μεγάλο’
4 WHEN salary > 1200 THEN ’Μεσαίο’
5 ELSE ’Μικρό’
6 END AS dep2sal
7 FROM employees
8 WHERE depid = 2;
9

10 firstname lastname dep2sal


11 ----------------------------------------
12 Μαρία Αλεβιζάτου Μεσαίο
13 Δέσποινα Παπαδοπούλου Μεγάλο
14 Πέτρος Αρβανιτάκης Μεσαίο 105 / 106
Ενημέρωση βάσης δεδομένων με τις
εντολές INSERT, DELETE, UPDATE

Περιεχόμενα

1 Γενικά για την αποθήκευση δεδομένων και την ενημέρωση της βάσης
δεδομένων

2 Διαγραφή δεδομένων με την εντολή DELETE

3 Τροποποίηση δεδομένων με την εντολή UPDATE

4 Εισαγωγή δεδομένων INSERT

5 Ανάλυση ενός προβλήματος

2 / 88
Σκοπός του μαθήματος
Ενημέρωση είναι η τροποποίηση του περιεχομένου της βάσης
δεδομένων.

3 / 88

Σκοπός του μαθήματος


Ενημέρωση είναι η τροποποίηση του περιεχομένου της βάσης
δεδομένων.
Η γλώσσα SQL διαθέτει τρεις εντολές για το σκοπό αυτό:

4 / 88
Σκοπός του μαθήματος
Ενημέρωση είναι η τροποποίηση του περιεχομένου της βάσης
δεδομένων.
Η γλώσσα SQL διαθέτει τρεις εντολές για το σκοπό αυτό:
DELETE για τη διαγραφή εγγραφών από πίνακες,

5 / 88

Σκοπός του μαθήματος


Ενημέρωση είναι η τροποποίηση του περιεχομένου της βάσης
δεδομένων.
Η γλώσσα SQL διαθέτει τρεις εντολές για το σκοπό αυτό:
DELETE για τη διαγραφή εγγραφών από πίνακες,
UPDATE για την τροποποίηση εγγραφών σε πίνακες,

6 / 88
Σκοπός του μαθήματος
Ενημέρωση είναι η τροποποίηση του περιεχομένου της βάσης
δεδομένων.
Η γλώσσα SQL διαθέτει τρεις εντολές για το σκοπό αυτό:
DELETE για τη διαγραφή εγγραφών από πίνακες,
UPDATE για την τροποποίηση εγγραφών σε πίνακες,
INSERT για την εισαγωγή εγγραφών σε πίνακες.

7 / 88

Σκοπός του μαθήματος


Ενημέρωση είναι η τροποποίηση του περιεχομένου της βάσης
δεδομένων.
Η γλώσσα SQL διαθέτει τρεις εντολές για το σκοπό αυτό:
DELETE για τη διαγραφή εγγραφών από πίνακες,
UPDATE για την τροποποίηση εγγραφών σε πίνακες,
INSERT για την εισαγωγή εγγραφών σε πίνακες.

8 / 88
Σκοπός του μαθήματος
Ενημέρωση είναι η τροποποίηση του περιεχομένου της βάσης
δεδομένων.
Η γλώσσα SQL διαθέτει τρεις εντολές για το σκοπό αυτό:
DELETE για τη διαγραφή εγγραφών από πίνακες,
UPDATE για την τροποποίηση εγγραφών σε πίνακες,
INSERT για την εισαγωγή εγγραφών σε πίνακες.

Σκοπός του μαθήματος είναι να καταλάβετε


τη λειτουργία ενημέρωσης μιας βάσης δεδομένων
μέσα από τις εντολές DELETE, UPDATE, INSERT.

9 / 88

Διαρκής μεταβολή του περιεχομένου

10 / 88
Διαρκής μεταβολή του περιεχομένου
Τι μεταβάλλεται
Το πλήθος των εγγραφών ενός ή περισσότερων
πινάκων.
Οι τιμές ενός ή περισσότερων πεδίων σε έναν η
περισσότερους πίνακες.

11 / 88

Διαρκής μεταβολή του περιεχομένου


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

Τι δεν μεταβάλλεται
Το πλήθος των πινάκων της βάσης δεδομένων
(σχήμα).
Η δομή των πινάκων της βάσης δεδομένων
(σχήμα).
12 / 88
Σε μια απόδειξη πώλησης;

Τι καταγράφεται κατά την πώληση ενός προϊόντος;


Εικόνα από: http://en.wikipedia.org/wiki/Receipt
13 / 88

Που καταγράφεται;

Που καταγράφεται η πώληση ενός προϊόντος;


14 / 88
Συναλλαγές στο ΑΤΜ

Τι καταγράφεται σε μια συναλλαγή σε ένα ΑΤΜ;


Εικόνα από: http://en.wikipedia.org/wiki/Automated_teller_machine
15 / 88

Καταγραφή τραπεζικών συναλλαγών.

Που καταγράφονται οι τραπεζικές συναλλαγές;

16 / 88
Στο facebook;

Τι καταγράφεται κατά την εγγραφή στο facebook;


17 / 88

Στο facebook;
Που καταγράφονται τα μηνύματα του facebook;

18 / 88
Στο facebook;
Που καταγράφονται τα μηνύματα του facebook;

19 / 88

Στο facebook;
Που καταγράφονται τα μηνύματα του facebook;

20 / 88
Στο facebook;
Που καταγράφονται τα μηνύματα του facebook;

1 Πόσο «ρεύμα» πληρώνει η εταιρεία facebook;


2 Πόση ενέργεια καταναλώνεται παγκοσμίως για τις ανάγκες
του διαδικτύου;
3 Τι ξέρετε για τη Βόρεια Καρολίνα;
21 / 88

Περιεχόμενα

1 Γενικά για την αποθήκευση δεδομένων και την ενημέρωση της βάσης
δεδομένων

2 Διαγραφή δεδομένων με την εντολή DELETE

3 Τροποποίηση δεδομένων με την εντολή UPDATE

4 Εισαγωγή δεδομένων INSERT

5 Ανάλυση ενός προβλήματος

22 / 88
Διαγραφή εγγραφών με την εντολή DELETE
DELETE FROM πίνακας
WHERE παράσταση

23 / 88

Διαγραφή εγγραφών με την εντολή DELETE


DELETE FROM πίνακας
WHERE παράσταση

Παρατηρήσεις για την εντολή DELETE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
DELETE.

24 / 88
Διαγραφή εγγραφών με την εντολή DELETE
DELETE FROM πίνακας
WHERE παράσταση

Παρατηρήσεις για την εντολή DELETE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
DELETE.
2 Χρειάζεται έγκυρο όνομα πεδίου που ακολουθεί φράση
WHERE.

25 / 88

Διαγραφή εγγραφών με την εντολή DELETE


DELETE FROM πίνακας
WHERE παράσταση

Παρατηρήσεις για την εντολή DELETE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
DELETE.
2 Χρειάζεται έγκυρο όνομα πεδίου που ακολουθεί φράση
WHERE.
3 Η διαγραφή γίνεται κατά πλειάδες (εγγραφές) και όχι
μεμονωμένα.

26 / 88
Διαγραφή εγγραφών με την εντολή DELETE
DELETE FROM πίνακας
WHERE παράσταση

Παρατηρήσεις για την εντολή DELETE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
DELETE.
2 Χρειάζεται έγκυρο όνομα πεδίου που ακολουθεί φράση
WHERE.
3 Η διαγραφή γίνεται κατά πλειάδες (εγγραφές) και όχι
μεμονωμένα.
4 Η φράση WHERE είναι προαιρετική, αλλά χωρίς αυτή θα
γίνει διαγραφή όλων των εγγραφών.

27 / 88

Διαγραφή δεδομένων ενός πίνακα

Διαγραφή όλων των δεδομένων ενός πίνακα


1 DELETE
2 FROM projects;

28 / 88
Διαγραφή δεδομένων ενός πίνακα

Διαγραφή όλων των δεδομένων ενός πίνακα


1 DELETE
2 FROM projects;

Προσοχή:
Θα διαγραφούν όλες οι εγγραφές του πίνακα. ΄Ολες.

29 / 88

Διαγραφή δεδομένων ενός πίνακα

Διαγραφή όλων των δεδομένων ενός πίνακα


1 DELETE
2 FROM projects;

Προσοχή:
Θα διαγραφούν όλες οι εγγραφές του πίνακα. ΄Ολες.

Σφάλμα:
1 DELETE *
2 FROM projects;

30 / 88
Επιλεκτική διαγραφή δεδομένων

31 / 88

Επιλεκτική διαγραφή δεδομένων

DELETE με WHERE για τη διαγραφή υποσυνόλου των δεδομένων


1 DELETE
2 FROM projects
3 WHERE proid = 43;

32 / 88
Επιλεκτική διαγραφή δεδομένων

DELETE με WHERE για τη διαγραφή υποσυνόλου των δεδομένων


1 DELETE
2 FROM projects
3 WHERE proid = 43;

1 Τι θα συμβεί αν δεν υπάρχει εγγραφή στον πίνακα


projects με proid=43;
2 Τι θα συμβεί στον πίνακα workson για την απασχόληση
των υπαλλήλων στο έργο με proid=43;

33 / 88

Διαγραφή δεδομένων με υποερώτημα

Να διαγραφεί η συμμετοχή υπαλλήλων στο έργο με κωδικό 43 για


τους υπαλλήλους με μισθό άνω των 1400 €

34 / 88
Διαγραφή δεδομένων με υποερώτημα

Να διαγραφεί η συμμετοχή υπαλλήλων στο έργο με κωδικό 43 για


τους υπαλλήλους με μισθό άνω των 1400 €
1 DELETE
2 FROM workson
3 WHERE proid = 43
4 AND empid

35 / 88

Διαγραφή δεδομένων με υποερώτημα

Να διαγραφεί η συμμετοχή υπαλλήλων στο έργο με κωδικό 43 για


τους υπαλλήλους με μισθό άνω των 1400 €
1 DELETE
2 FROM workson
3 WHERE proid = 43
4 AND empid IN (SELECT empid
5 FROM employees
6 WHERE salary > 1400);

36 / 88
Διαγραφή δεδομένων με υποερώτημα σύζευξης

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

37 / 88

Διαγραφή δεδομένων με υποερώτημα σύζευξης

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


1 DELETE
2 FROM employees
3 WHERE empid IN

38 / 88
Διαγραφή δεδομένων με υποερώτημα σύζευξης

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


1 DELETE
2 FROM employees
3 WHERE empid IN
4 (SELECT e.empid
5 FROM employees e LEFT JOIN workson w
6 ON e.empid = w.empid
7 WHERE w.empid IS NULL);

39 / 88

Περιεχόμενα

1 Γενικά για την αποθήκευση δεδομένων και την ενημέρωση της βάσης
δεδομένων

2 Διαγραφή δεδομένων με την εντολή DELETE

3 Τροποποίηση δεδομένων με την εντολή UPDATE

4 Εισαγωγή δεδομένων INSERT

5 Ανάλυση ενός προβλήματος

40 / 88
Ενημέρωση εγγραφών με την εντολή UPDATE
UPDATE πίνακας
SET πεδίο=τιμή
WHERE παράσταση

41 / 88

Ενημέρωση εγγραφών με την εντολή UPDATE


UPDATE πίνακας
SET πεδίο=τιμή
WHERE παράσταση

Παρατηρήσεις για την εντολή UPDATE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
UPDATE.

42 / 88
Ενημέρωση εγγραφών με την εντολή UPDATE
UPDATE πίνακας
SET πεδίο=τιμή
WHERE παράσταση

Παρατηρήσεις για την εντολή UPDATE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
UPDATE.
2 Χρειάζεται έγκυρο όνομα πεδίου που ακολουθεί φράση SET.

43 / 88

Ενημέρωση εγγραφών με την εντολή UPDATE


UPDATE πίνακας
SET πεδίο=τιμή
WHERE παράσταση

Παρατηρήσεις για την εντολή UPDATE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
UPDATE.
2 Χρειάζεται έγκυρο όνομα πεδίου που ακολουθεί φράση SET.
3 Τήρηση κανόνων ακεραιότητας.

44 / 88
Ενημέρωση εγγραφών με την εντολή UPDATE
UPDATE πίνακας
SET πεδίο=τιμή
WHERE παράσταση

Παρατηρήσεις για την εντολή UPDATE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
UPDATE.
2 Χρειάζεται έγκυρο όνομα πεδίου που ακολουθεί φράση SET.
3 Τήρηση κανόνων ακεραιότητας.
4 Ταυτόχρονη αλλαγή δύο ή περισσότερων πεδίων.

45 / 88

Ενημέρωση εγγραφών με την εντολή UPDATE


UPDATE πίνακας
SET πεδίο=τιμή
WHERE παράσταση

Παρατηρήσεις για την εντολή UPDATE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
UPDATE.
2 Χρειάζεται έγκυρο όνομα πεδίου που ακολουθεί φράση SET.
3 Τήρηση κανόνων ακεραιότητας.
4 Ταυτόχρονη αλλαγή δύο ή περισσότερων πεδίων.
5 Η ενημέρωση γίνεται κατά πλειάδες (εγγραφές) και όχι
μεμονωμένα.

46 / 88
Ενημέρωση εγγραφών με την εντολή UPDATE
UPDATE πίνακας
SET πεδίο=τιμή
WHERE παράσταση

Παρατηρήσεις για την εντολή UPDATE


1 Χρειάζεται έγκυρο όνομα πίνακα που ακολουθεί φράση
UPDATE.
2 Χρειάζεται έγκυρο όνομα πεδίου που ακολουθεί φράση SET.
3 Τήρηση κανόνων ακεραιότητας.
4 Ταυτόχρονη αλλαγή δύο ή περισσότερων πεδίων.
5 Η ενημέρωση γίνεται κατά πλειάδες (εγγραφές) και όχι
μεμονωμένα.
6 Η φράση WHERE είναι προαιρετική, αλλά χωρίς αυτή θα
γίνει τροποποίηση όλων των εγγραφών.
47 / 88

Παράδειγμα ενημέρωσης
Αύξηση μισθού κατά 100 € του υπαλλήλου με κωδικό 153

48 / 88
Παράδειγμα ενημέρωσης
Αύξηση μισθού κατά 100 € του υπαλλήλου με κωδικό 153
1 UPDATE employees
2 SET salary = salary + 100
3 WHERE empid = 153;

49 / 88

Παράδειγμα ενημέρωσης
Αύξηση μισθού κατά 100 € του υπαλλήλου με κωδικό 153
1 UPDATE employees
2 SET salary = salary + 100
3 WHERE empid = 153;

Πριν την ενημέρωση


1 SELECT empid, salary
2 FROM employees
3 WHERE empid = 153;
4

5 empid salary
6 ---------------
7 153 1321.92

50 / 88
Παράδειγμα ενημέρωσης
Αύξηση μισθού κατά 100 € του υπαλλήλου με κωδικό 153
1 UPDATE employees
2 SET salary = salary + 100
3 WHERE empid = 153;

Πριν την ενημέρωση Μετά την ενημέρωση


1 SELECT empid, salary 1 SELECT empid, salary
2 FROM employees 2 FROM employees
3 WHERE empid = 153; 3 WHERE empid = 153;
4 4

5 empid salary 5 empid salary


6 --------------- 6 ---------------
7 153 1321.92 7 153 1421.92

51 / 88

Τροποποίηση δεδομένων με υποερώτημα

Να δοθεί αύξηση 7% στους υπαλλήλους που απασχολούνται σε


περισσότερα από 2 έργα

52 / 88
Τροποποίηση δεδομένων με υποερώτημα

Να δοθεί αύξηση 7% στους υπαλλήλους που απασχολούνται σε


περισσότερα από 2 έργα
1 UPDATE employees
2 SET salary = salary*1.07
3 WHERE empid IN

53 / 88

Τροποποίηση δεδομένων με υποερώτημα

Να δοθεί αύξηση 7% στους υπαλλήλους που απασχολούνται σε


περισσότερα από 2 έργα
1 UPDATE employees
2 SET salary = salary*1.07
3 WHERE empid IN (SELECT empid
4 FROM workson
5 GROUP BY empid
6 HAVING COUNT(*) > 2);

54 / 88
Τροποποίηση δεδομένων με υποερώτημα

Να δοθεί αύξηση 7% στους υπαλλήλους που απασχολούνται σε


περισσότερα από 2 έργα
1 UPDATE employees
2 SET salary = salary*1.07
3 WHERE empid IN (SELECT empid
4 FROM workson
5 GROUP BY empid
6 HAVING COUNT(*) > 2);

1 Θα εκτελεστεί πρώτα το υποερώτημα και θα επιστρέψει


μια λίστα τιμών empid.
2 Θα εκτελεστεί ενημέρωση των εγγραφών του πίνακα
employees για όλες τι τιμές της λίστας empid
που επιστρέφονται από το υποερώτημα. 55 / 88

Ενημέρωση σύνθετου κλειδιού


Μετάθεση υπαλλήλου 419 από το έργο 43 στο έργο 5

56 / 88
Ενημέρωση σύνθετου κλειδιού
Μετάθεση υπαλλήλου 419 από το έργο 43 στο έργο 5
1 UPDATE workson
2 SET proid = 5
3 WHERE proid = 43 AND empid = 419;

57 / 88

Ενημέρωση σύνθετου κλειδιού


Μετάθεση υπαλλήλου 419 από το έργο 43 στο έργο 5
1 UPDATE workson
2 SET proid = 5
3 WHERE proid = 43 AND empid = 419;

Λάθος ενημέρωση της βάσης


1 UPDATE workson
2 SET proid = 5
3 WHERE empid = 419;

Αν ο υπάλληλος με κωδικό 419, απασχολείται σε 2 έργα,


τότε ο δεύτερος τρόπος θα παράξει διπλότυπες τιμές στο
πρωτεύον κλειδί του πίνακα workson και η ενημέρωση
θα αποτύχει. 58 / 88
Περιεχόμενα

1 Γενικά για την αποθήκευση δεδομένων και την ενημέρωση της βάσης
δεδομένων

2 Διαγραφή δεδομένων με την εντολή DELETE

3 Τροποποίηση δεδομένων με την εντολή UPDATE

4 Εισαγωγή δεδομένων INSERT

5 Ανάλυση ενός προβλήματος

59 / 88

Η εντολή INSERT για την εισαγωγή δεδομένων


Γενική μορφή της εντολής INSERT
1 INSERT INTO tablename(column1, column2, ..., columnN)
2 VALUES (value1, value2, ..., valueN);

60 / 88
Η εντολή INSERT για την εισαγωγή δεδομένων
Γενική μορφή της εντολής INSERT
1 INSERT INTO tablename(column1, column2, ..., columnN)
2 VALUES (value1, value2, ..., valueN);

Γενικές παρατηρήσεις για την εντολή INSERT


1 Χρειάζεται έγκυρο όνομα πίνακα/πεδίων μετά τον όρο
INSERT INTO.

61 / 88

Η εντολή INSERT για την εισαγωγή δεδομένων


Γενική μορφή της εντολής INSERT
1 INSERT INTO tablename(column1, column2, ..., columnN)
2 VALUES (value1, value2, ..., valueN);

Γενικές παρατηρήσεις για την εντολή INSERT


1 Χρειάζεται έγκυρο όνομα πίνακα/πεδίων μετά τον όρο
INSERT INTO.
2 Δίνουμε το όνομα του πίνακα και μέσα σε παρενθέσεις τη
λίστα πεδίων.

62 / 88
Η εντολή INSERT για την εισαγωγή δεδομένων
Γενική μορφή της εντολής INSERT
1 INSERT INTO tablename(column1, column2, ..., columnN)
2 VALUES (value1, value2, ..., valueN);

Γενικές παρατηρήσεις για την εντολή INSERT


1 Χρειάζεται έγκυρο όνομα πίνακα/πεδίων μετά τον όρο
INSERT INTO.
2 Δίνουμε το όνομα του πίνακα και μέσα σε παρενθέσεις τη
λίστα πεδίων.
3 Με τον όρο VALUES δίνουμε έγκυρες τιμές στα πεδία.

63 / 88

Η εντολή INSERT για την εισαγωγή δεδομένων


Γενική μορφή της εντολής INSERT
1 INSERT INTO tablename(column1, column2, ..., columnN)
2 VALUES (value1, value2, ..., valueN);

Γενικές παρατηρήσεις για την εντολή INSERT


1 Χρειάζεται έγκυρο όνομα πίνακα/πεδίων μετά τον όρο
INSERT INTO.
2 Δίνουμε το όνομα του πίνακα και μέσα σε παρενθέσεις τη
λίστα πεδίων.
3 Με τον όρο VALUES δίνουμε έγκυρες τιμές στα πεδία.
4 Το πλήθος πεδίων πρέπει να ταυτίζεται με το πλήθος τιμών.

64 / 88
Η εντολή INSERT για την εισαγωγή δεδομένων
Γενική μορφή της εντολής INSERT
1 INSERT INTO tablename(column1, column2, ..., columnN)
2 VALUES (value1, value2, ..., valueN);

Γενικές παρατηρήσεις για την εντολή INSERT


1 Χρειάζεται έγκυρο όνομα πίνακα/πεδίων μετά τον όρο
INSERT INTO.
2 Δίνουμε το όνομα του πίνακα και μέσα σε παρενθέσεις τη
λίστα πεδίων.
3 Με τον όρο VALUES δίνουμε έγκυρες τιμές στα πεδία.
4 Το πλήθος πεδίων πρέπει να ταυτίζεται με το πλήθος τιμών.
5 Μπορούμε να παραλείψουμε από τη λίστα πεδίων όσα πεδία
μπορούν να πάρουν τιμή NULL.

65 / 88

Η εντολή INSERT για την εισαγωγή δεδομένων


Γενική μορφή της εντολής INSERT
1 INSERT INTO tablename(column1, column2, ..., columnN)
2 VALUES (value1, value2, ..., valueN);

Γενικές παρατηρήσεις για την εντολή INSERT


1 Χρειάζεται έγκυρο όνομα πίνακα/πεδίων μετά τον όρο
INSERT INTO.
2 Δίνουμε το όνομα του πίνακα και μέσα σε παρενθέσεις τη
λίστα πεδίων.
3 Με τον όρο VALUES δίνουμε έγκυρες τιμές στα πεδία.
4 Το πλήθος πεδίων πρέπει να ταυτίζεται με το πλήθος τιμών.
5 Μπορούμε να παραλείψουμε από τη λίστα πεδίων όσα πεδία
μπορούν να πάρουν τιμή NULL.
6 Αν μια τιμή αντιστοιχεί σε πεδίο κειμένου ή ημερομηνίας
χρειάζονται εισαγωγικά πχ ΄Δημήτριος΄ ή ΄2005-05-10΄. 66 / 88
Εισαγωγή δεδομένων με INSERT

Τοποθέτηση του υπαλλήλου με κωδικό 811 στο έργο με κωδικό 5


1 INSERT INTO workson (empid, proid)
2 VALUES (811, 5);

Τοποθέτηση του υπαλλήλου με κωδικό 811 στο έργο με κωδικό 5


1 INSERT INTO workson (proid, empid)
2 VALUES (5, 811);

Τοποθέτηση του υπαλλήλου με κωδικό 811 στο έργο με κωδικό 5


1 INSERT INTO workson
2 VALUES (811, 5);

67 / 88

Τι ισχύει για την εντολή INSERT


1 Το πλήθος πεδίων στη λίστα πεδίων πρέπει να είναι ακριβώς
το ίδιο με το πλήθος της λίστας τιμών.
2 Οι τιμές της λίστας τιμών αντιστοιχίζονται ένα-προς-ένα στα
πεδία της λίστας πεδίων.
3 Η σειρά εμφάνισης στη λίστα πεδίων δεν παίζει ρόλο.
4 Στη λίστα πεδίων πρέπει να συμπεριλαμβάνονται όλα τα
πεδία που, κατά τη δημιουργία του πίνακα δηλώθηκαν ως
NOT NULL.
5 ΄Ολες οι τιμές της λίστας τιμών, θα πρέπει να είναι σύμφωνες
με το πεδίου ορισμού όλων των των πεδίων του πίνακα.

68 / 88
Τι ισχύει για την εντολή INSERT - συνέχεια
1 Αν πρέπει να δηλωθεί η τιμή NULL κατά την εισαγωγή
δεδομένων πληκτρολογείται ως NULL και όχι με εισαγωγικά
“NULL”.
2 Αν ένα πεδίο παραληφθεί από τη λίστα πεδίων, τότε σε αυτό
το πεδίο εισάγεται η προκαθορισμένη (DEFAULT) από τη
δημιουργία του πίνακα τιμή.
3 Σε συσχετιζόμενους πίνακες, η εισαγωγή δεδομένων στον
πατρικό πίνακα δεν έχει καμία επίδραση στον θυγατρικό
πίνακα.
4 Σε συσχετιζόμενους πίνακες, η εισαγωγή δεδομένων στο
θυγατρικό πίνακα, επηρεάζεται από την ακεραιότητα
αναφορών.
5 Αν για οποιοδήποτε λόγο, αποτύχει η εκτέλεση μιας εντολής 69 / 88
INSERT η αποτυχία ισχύει συνολικά για την εγγραφή και

Αποτυχία INSERT

70 / 88
Αποτυχία INSERT

Λείπει το υποχρεωτικό πεδίο lastname


1 INSERT INTO employees (empid, depid, hiredate)
2 VALUES (199, 5, CURRENT_DATE());

71 / 88

Αποτυχία INSERT

Λείπει το υποχρεωτικό πεδίο lastname


1 INSERT INTO employees (empid, depid, hiredate)
2 VALUES (199, 5, CURRENT_DATE());

Λείπει η τιμή από το πεδίο lastname


1 INSERT INTO employees (empid, depid, lastname)
2 VALUES (199, 5)

72 / 88
Αποτυχία INSERT

Λείπει το υποχρεωτικό πεδίο lastname


1 INSERT INTO employees (empid, depid, hiredate)
2 VALUES (199, 5, CURRENT_DATE());

Λείπει η τιμή από το πεδίο lastname


1 INSERT INTO employees (empid, depid, lastname)
2 VALUES (199, 5)

Η τιμή του πρωτεύοντος κλειδιού υπάρχει ήδη


1 INSERT INTO employees (empid, depid, lastname)
2 VALUES (811, 4, ’Κάτου’)

73 / 88

Εναλλακτικός τρόπος για την εντολή INSERT

Εισαγωγή νέας εγγραφής στον πίνακα employees


1 INSERT INTO employees
2 SET empid = 199,
3 lastname = ’Κάτου’,
4 firstname = ’΄Αννα’,
5 depid = 5,
6 salary = 1500,
7 hiredate = ’2010-03-15’;

74 / 88
Εναλλακτικός τρόπος για την εντολή INSERT

Εισαγωγή νέας εγγραφής στον πίνακα employees


1 INSERT INTO employees
2 SET empid = 199,
3 lastname = ’Κάτου’,
4 firstname = ’΄Αννα’,
5 depid = 5,
6 salary = 1500,
7 hiredate = ’2010-03-15’;

1 Ο τρόπος αυτός μοιάζει με την εντολή UPDATE.

75 / 88

Εναλλακτικός τρόπος για την εντολή INSERT

Εισαγωγή νέας εγγραφής στον πίνακα employees


1 INSERT INTO employees
2 SET empid = 199,
3 lastname = ’Κάτου’,
4 firstname = ’΄Αννα’,
5 depid = 5,
6 salary = 1500,
7 hiredate = ’2010-03-15’;

1 Ο τρόπος αυτός μοιάζει με την εντολή UPDATE.


2 Χρησιμοποιούμε τη γραφή SET column = value.

76 / 88
Εναλλακτικός τρόπος για την εντολή INSERT

Εισαγωγή νέας εγγραφής στον πίνακα employees


1 INSERT INTO employees
2 SET empid = 199,
3 lastname = ’Κάτου’,
4 firstname = ’΄Αννα’,
5 depid = 5,
6 salary = 1500,
7 hiredate = ’2010-03-15’;

1 Ο τρόπος αυτός μοιάζει με την εντολή UPDATE.


2 Χρησιμοποιούμε τη γραφή SET column = value.
3 Χωρίζουμε τη λίστα πεδίων με κόμματα.

77 / 88

Εναλλακτικός τρόπος για την εντολή INSERT

Εισαγωγή νέας εγγραφής στον πίνακα employees


1 INSERT INTO employees
2 SET empid = 199,
3 lastname = ’Κάτου’,
4 firstname = ’΄Αννα’,
5 depid = 5,
6 salary = 1500,
7 hiredate = ’2010-03-15’;

1 Ο τρόπος αυτός μοιάζει με την εντολή UPDATE.


2 Χρησιμοποιούμε τη γραφή SET column = value.
3 Χωρίζουμε τη λίστα πεδίων με κόμματα.
4 Η σειρά εμφάνισης των πεδίων δεν έχει σημασία.
78 / 88
Εναλλακτικός τρόπος για την εντολή INSERT

Εισαγωγή νέας εγγραφής στον πίνακα employees


1 INSERT INTO employees
2 SET empid = 199,
3 lastname = ’Κάτου’,
4 firstname = ’΄Αννα’,
5 depid = 5,
6 salary = 1500,
7 hiredate = ’2010-03-15’;

1 Ο τρόπος αυτός μοιάζει με την εντολή UPDATE.


2 Χρησιμοποιούμε τη γραφή SET column = value.
3 Χωρίζουμε τη λίστα πεδίων με κόμματα.
4 Η σειρά εμφάνισης των πεδίων δεν έχει σημασία.
5 Ισχύουν όλοι οι περιορισμοί ακεραιότητας δεδομένων 79 / 88

NULL

Εισαγωγή δεδομένων με υποερώτημα

Να τοποθετηθεί στο έργο με 5 ο υπάλληλος του τμήματος 4 που


παίρνει το μεγαλύτερο μισθό
1 INSERT INTO workson(proid, empid)
2 SELECT 5, empid
3 FROM employees
4 WHERE salary = ( SELECT MAX(salary)
5 FROM employees
6 WHERE depid = 4 );

1 Δε χρειάζεται η φράση VALUES σε υποερωτήματα μετά το


INSERT.
2 Προσοχή στην παράσταση SELECT 5, empid.
3 Τι θα συμβεί αν όλοι οι υπάλληλοι του τμήματος 4
έχουν τον ίδιο μισθό; 80 / 88
Περιεχόμενα

1 Γενικά για την αποθήκευση δεδομένων και την ενημέρωση της βάσης
δεδομένων

2 Διαγραφή δεδομένων με την εντολή DELETE

3 Τροποποίηση δεδομένων με την εντολή UPDATE

4 Εισαγωγή δεδομένων INSERT

5 Ανάλυση ενός προβλήματος

81 / 88

Διπλή εισαγωγή
Εισαγωγή επιπλέον εγγραφής για τον ίδιο υπάλληλο
1 INSERT INTO employees(empid, lastname, depid)
2 VALUES (781, ’Μικράκη’, 4);

82 / 88
Διπλή εισαγωγή
Εισαγωγή επιπλέον εγγραφής για τον ίδιο υπάλληλο
1 INSERT INTO employees(empid, lastname, depid)
2 VALUES (781, ’Μικράκη’, 4);

Ωστόσο, η κ. Μικράκη υπάρχει ήδη στη βάση δεδομένων


1 SELECT empid, lastname, depid
2 FROM employees
3 WHERE lastname = ’Μικράκη’;
4

5 empid lastname depid


6 ----------------------
7 780 Μικράκη 4
8 781 Μικράκη 4
83 / 88

Λανθασμένη διόρθωση του προβλήματος


Διαγραφή της υπαλλήλου με επώνυμου ΜΙΚΡΑΚΗ
1 DELETE FROM employees
2 WHERE lastname = ’Μικράκη’;
3

4 Query OK, 2 rows affected (0.00 sec)

84 / 88
Λανθασμένη διόρθωση του προβλήματος
Διαγραφή της υπαλλήλου με επώνυμου ΜΙΚΡΑΚΗ
1 DELETE FROM employees
2 WHERE lastname = ’Μικράκη’;
3

4 Query OK, 2 rows affected (0.00 sec)

Τώρα η κ. ΜΙΚΡΑΚΗ δεν υπάρχει καθόλου στη βάση δεδομένων


1 SELECT empid, lastname, depid
2 FROM employees
3 WHERE lastname = ’Μικράκη’;
4

5 Empty set (0.01 sec)

Διαγράφηκαν και οι δύο εγγραφές!! 85 / 88

Πιο προσεκτική διόρθωση του προβλήματος


Διαγραφή της υπαλλήλου με κωδικό υπαλλήλου 781
1 DELETE FROM employees
2 WHERE empid=781;
3

4 Query OK, 1 row affected (0.00 sec)

86 / 88
Πιο προσεκτική διόρθωση του προβλήματος
Διαγραφή της υπαλλήλου με κωδικό υπαλλήλου 781
1 DELETE FROM employees
2 WHERE empid=781;
3

4 Query OK, 1 row affected (0.00 sec)

Τώρα η κ. Μικράκη υπάρχει μία φορά στη βάση δεδομένων


1 SELECT empid, lastname, depid
2 FROM employees
3 WHERE lastname = ’Μικράκη’;
4

5 empid lastname depid


6 ----------------------
7 780 Μικράκη 4

87 / 88

Όψεις (views) στην SQL


΄Οψεις (VIEWS) στην SQL
Η εντολή CREATE VIEW

Περιεχόμενα

1 Εισαγωγικά για τις όψεις

2 ΄Οψεις και συζεύξεις

3 Επιπλέον χρήση των όψεων

4 Ενημέρωση όψεων

2 / 55
Σκοπός του μαθήματος
Δημιουργείτε όψεις με βάση ερωτήματα επιλογής
SELECT.

3 / 55

Σκοπός του μαθήματος


Δημιουργείτε όψεις με βάση ερωτήματα επιλογής
SELECT.
Χρησιμοποιήσετε την εντολή CREATE VIEW.

4 / 55
Σκοπός του μαθήματος
Δημιουργείτε όψεις με βάση ερωτήματα επιλογής
SELECT.
Χρησιμοποιήσετε την εντολή CREATE VIEW.
Χρησιμοποιήσετε όψεις ως πίνακες σε νέα ερωτήματα.

5 / 55

Σκοπός του μαθήματος


Δημιουργείτε όψεις με βάση ερωτήματα επιλογής
SELECT.
Χρησιμοποιήσετε την εντολή CREATE VIEW.
Χρησιμοποιήσετε όψεις ως πίνακες σε νέα ερωτήματα.
Χρησιμοποιήσετε όψεις σε ερωτήματα σύνοψης.

6 / 55
Σκοπός του μαθήματος
Δημιουργείτε όψεις με βάση ερωτήματα επιλογής
SELECT.
Χρησιμοποιήσετε την εντολή CREATE VIEW.
Χρησιμοποιήσετε όψεις ως πίνακες σε νέα ερωτήματα.
Χρησιμοποιήσετε όψεις σε ερωτήματα σύνοψης.
Δημιουργείτε όψεις για προσαρμοζόμενη
αλληλεπίδραση του χρήστη με τη βάση δεδομένων.

7 / 55

Σκοπός του μαθήματος


Δημιουργείτε όψεις με βάση ερωτήματα επιλογής
SELECT.
Χρησιμοποιήσετε την εντολή CREATE VIEW.
Χρησιμοποιήσετε όψεις ως πίνακες σε νέα ερωτήματα.
Χρησιμοποιήσετε όψεις σε ερωτήματα σύνοψης.
Δημιουργείτε όψεις για προσαρμοζόμενη
αλληλεπίδραση του χρήστη με τη βάση δεδομένων.
Ενημερώνετε τη βάση δεδομένων με χρήση όψεων.

8 / 55
Δημιουργία όψης

Η όψη είναι ένα αποθηκευμένο επώνυμο ερώτημα


1 CREATE VIEW ViewName AS
2 SELECT ...

1 Οι όψεις δημιουργούνται με την εντολή CREATE


VIEW.
2 Οι όψεις πρέπει να έχουν ένα μοναδικό όνομα στη
βάση δεδομένων.
3 Μπορούν να οριστούν με βάση οποιοδήποτε
έγκυρο ερώτημα SELECT.

9 / 55

Παράδειγμα δημιουργίας/χρήσης μιας όψης


Δημιουργία της όψης «Τμήμα 3»
1 CREATE VIEW dep3 AS
2 SELECT *
3 FROM employees
4 WHERE depid = 3;

10 / 55
Παράδειγμα δημιουργίας/χρήσης μιας όψης
Δημιουργία της όψης «Τμήμα 3»
1 CREATE VIEW dep3 AS
2 SELECT *
3 FROM employees
4 WHERE depid = 3;

Χρήση της dep3


1 SELECT empid, salary
2 FROM dep3
3 WHERE salary > 1300;
4

5 empid salary
6 ---------------
7 412 1320.83
8 543 1321.77
9 801 2312.56
11 / 55

Παράδειγμα δημιουργίας μιας όψης σύνοψης


«Πλήθος υπαλλήλων ανά τμήμα»
1 CREATE VIEW depcount AS
2 SELECT depid, COUNT(depid) as nemp
3 FROM employees
4 GROUP BY depid;

12 / 55
Παράδειγμα δημιουργίας μιας όψης σύνοψης
«Πλήθος υπαλλήλων ανά τμήμα»
1 CREATE VIEW depcount AS
2 SELECT depid, COUNT(depid) as nemp
3 FROM employees
4 GROUP BY depid;

Προβολή των περιεχομένων της όψης depcount


1 SELECT *
2 FROM depcount;
3 depid nemp
4 -------------
5 1 3
6 2 4
7 3 9
8 4 5
9 5 2
13 / 55
10 6 7

΄Οψεις και πίνακες

Παρατηρήσεις:
Η όψη μπορεί να χρησιμοποιηθεί ως πίνακας σε
ερωτήματα ή υποερώτημα SELECT.

14 / 55
΄Οψεις και πίνακες

Παρατηρήσεις:
Η όψη μπορεί να χρησιμοποιηθεί ως πίνακας σε
ερωτήματα ή υποερώτημα SELECT.
Το όνομα μιας όψης πρέπει να είναι διαφορετικό από
τα ονόματα των πινάκων και άλλων όψεων της βάσης
δεδομένων.

15 / 55

΄Οψεις και πίνακες

Παρατηρήσεις:
Η όψη μπορεί να χρησιμοποιηθεί ως πίνακας σε
ερωτήματα ή υποερώτημα SELECT.
Το όνομα μιας όψης πρέπει να είναι διαφορετικό από
τα ονόματα των πινάκων και άλλων όψεων της βάσης
δεδομένων.
Οι πίνακες αντιστοιχούν σε βασικές σχέσεις, οι όψεις
αντιστοιχούν σε παράγωγες σχέσεις.

16 / 55
΄Οψεις και πίνακες

Παρατηρήσεις:
Η όψη μπορεί να χρησιμοποιηθεί ως πίνακας σε
ερωτήματα ή υποερώτημα SELECT.
Το όνομα μιας όψης πρέπει να είναι διαφορετικό από
τα ονόματα των πινάκων και άλλων όψεων της βάσης
δεδομένων.
Οι πίνακες αντιστοιχούν σε βασικές σχέσεις, οι όψεις
αντιστοιχούν σε παράγωγες σχέσεις.
Οι όψεις δεν αποθηκεύουν δεδομένα.

17 / 55

΄Οψεις και πίνακες

Παρατηρήσεις:
Η όψη μπορεί να χρησιμοποιηθεί ως πίνακας σε
ερωτήματα ή υποερώτημα SELECT.
Το όνομα μιας όψης πρέπει να είναι διαφορετικό από
τα ονόματα των πινάκων και άλλων όψεων της βάσης
δεδομένων.
Οι πίνακες αντιστοιχούν σε βασικές σχέσεις, οι όψεις
αντιστοιχούν σε παράγωγες σχέσεις.
Οι όψεις δεν αποθηκεύουν δεδομένα.
Τα δεδομένα αποθηκεύονται σε πίνακες.

18 / 55
΄Οψεις και πίνακες

Παρατηρήσεις:
Η όψη μπορεί να χρησιμοποιηθεί ως πίνακας σε
ερωτήματα ή υποερώτημα SELECT.
Το όνομα μιας όψης πρέπει να είναι διαφορετικό από
τα ονόματα των πινάκων και άλλων όψεων της βάσης
δεδομένων.
Οι πίνακες αντιστοιχούν σε βασικές σχέσεις, οι όψεις
αντιστοιχούν σε παράγωγες σχέσεις.
Οι όψεις δεν αποθηκεύουν δεδομένα.
Τα δεδομένα αποθηκεύονται σε πίνακες.
Η διαγραφή μιας όψης δε σημαίνει διαγραφή
δεδομένων από τη βάση δεδομένων.
19 / 55

΄Οψη με περιορισμό σε ένα πίνακα

΄Οψη για τους υπαλλήλους του τμήματος 3


1 CREATE VIEW dep3 AS
2 SELECT *
3 FROM employees
4 WHERE depid = 3;

1 Πρόσβαση στην όψη δεπ3 σημαίνει πρόσβαση μόνο


στους υπαλλήλους του τμήματος 3
2 Διαγραφή, τροποποίηση, ή εισαγωγή δεδομένων για
τους υπαλλήλους του τμήματος 3 στον πίνακα
εμπλοψεες σημαίνει αυτόματη ενημέρωση των
περιεχομένων της όψης

20 / 55
΄Οψη με προβολή πεδίων σε ένα πίνακα

Να δημιουργηθεί μια όψη με τους κωδικούς και


τα ονοματεπώνυμα όλων των υπαλλήλων
1 CREATE VIEW enames AS
2 SELECT empid, lastname, firstname
3 FROM employees;

1 Πρόσβαση στην όψη enames σημαίνει πρόσβαση σε


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

21 / 55

Ορισμός ονομάτων πεδίων όψης

Αλλαγή στα ονόματα:


1 CREATE VIEW depcount(d_id, n_emp) AS
2 SELECT depid, COUNT(depid)
3 FROM employees
4 GROUP BY depid;

Αν δεν δώσουμε ονόματα, τότε κληρονομούνται από τα


ονόματα του πίνακα.
Το πλήθος ονομάτων μέσα στις παρενθέσεις και το
πλήθος των πεδίων στη φράση SELECT πρέπει να είναι
το ίδιο.

22 / 55
Πλεονεκτήματα στη χρήση των όψεων

23 / 55

Πλεονεκτήματα στη χρήση των όψεων


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

24 / 55
Πλεονεκτήματα στη χρήση των όψεων
1 Κάθε χρήστης μπορεί να έχει διαφορετική
εξουσιοδότηση για το χειρισμό δεδομένων
(χρηστικότητα, ασφάλεια).
2 Η χρήση των όψεων στα ερωτήματα μπορεί να
απλοποιήσει μερικά σύνθετα ερωτήματα.

25 / 55

Πλεονεκτήματα στη χρήση των όψεων


1 Κάθε χρήστης μπορεί να έχει διαφορετική
εξουσιοδότηση για το χειρισμό δεδομένων
(χρηστικότητα, ασφάλεια).
2 Η χρήση των όψεων στα ερωτήματα μπορεί να
απλοποιήσει μερικά σύνθετα ερωτήματα.
3 Δεν υπάρχει ανάγκη ο κάθε χρήστης να γνωρίζει το
πλήρες σχήμα της βάσης δεδομένων.

26 / 55
Πλεονεκτήματα στη χρήση των όψεων
1 Κάθε χρήστης μπορεί να έχει διαφορετική
εξουσιοδότηση για το χειρισμό δεδομένων
(χρηστικότητα, ασφάλεια).
2 Η χρήση των όψεων στα ερωτήματα μπορεί να
απλοποιήσει μερικά σύνθετα ερωτήματα.
3 Δεν υπάρχει ανάγκη ο κάθε χρήστης να γνωρίζει το
πλήρες σχήμα της βάσης δεδομένων.
4 Με μικρές μόνο τροποποιήσεις, οι όψεις μπορεί να
παραμείνουν αναλλοίωτες, σε πιθανές αλλαγές
του σχήματος της βάσης δεδομένων.

27 / 55

Πλεονεκτήματα στη χρήση των όψεων


1 Κάθε χρήστης μπορεί να έχει διαφορετική
εξουσιοδότηση για το χειρισμό δεδομένων
(χρηστικότητα, ασφάλεια).
2 Η χρήση των όψεων στα ερωτήματα μπορεί να
απλοποιήσει μερικά σύνθετα ερωτήματα.
3 Δεν υπάρχει ανάγκη ο κάθε χρήστης να γνωρίζει το
πλήρες σχήμα της βάσης δεδομένων.
4 Με μικρές μόνο τροποποιήσεις, οι όψεις μπορεί να
παραμείνουν αναλλοίωτες, σε πιθανές αλλαγές
του σχήματος της βάσης δεδομένων.
5 Οι όψεις υποστηρίζουν την ακεραιότητα δεδομένων,
όπως ακριβώς και οι πίνακες από τους οποίους
προέρχονται.
28 / 55
Μειονεκτήματα στη χρήση των όψεων

29 / 55

Μειονεκτήματα στη χρήση των όψεων


1 Το μεγαλύτερο μειονέκτημα στη χρήση όψεων είναι η
μικρότερη απόδοση των ερωτημάτων, η μειωμένη
ταχύτητα με την οποία εκτελούνται

30 / 55
Μειονεκτήματα στη χρήση των όψεων
1 Το μεγαλύτερο μειονέκτημα στη χρήση όψεων είναι η
μικρότερη απόδοση των ερωτημάτων, η μειωμένη
ταχύτητα με την οποία εκτελούνται
2 Οι όψεις μπορούν να δεχτούν ενημέρωση (INSERT,
DELETE ή UPDATE), αλλά κάτω από περιορισμούς.
Πολλές φορές, είναι αδύνατη η ενημέρωση όψεων (Read
only iews).

31 / 55

Περιεχόμενα

1 Εισαγωγικά για τις όψεις

2 ΄Οψεις και συζεύξεις

3 Επιπλέον χρήση των όψεων

4 Ενημέρωση όψεων

33 / 55
΄Οψη προβολής μετά από σύζευξη πινάκων
Ονόματα τμημάτων και υπαλλήλων
1 CREATE VIEW depemps AS
2 SELECT d.depname, e.lastname, e.firstname
3 FROM departments d INNER JOIN employees e
4 ON d.depid=e.depid
5 ORDER BY d.depid ASC, e.lastname ASC;

1 Η όψη παρέχει συνδυασμό πληροφοριών από δύο πίνακες.


2 Ενημέρωση των πινάκων employees ή/και departments,
θα έχει αποτέλεσμα την αυτόματη ενημέρωση της όψης
depemps.
3 Μεταβολή (UPDATE) της τιμής του μισθού ενός
υπαλλήλου δε θα επηρεάσει τα αποτελέσματα της όψης.
4 Μεταβολή (UPDATE) του τμήματος υπαλλήλου θα
επηρεάσει τα αποτελέσματα της όψης. 34 / 55

Σύζευξη πίνακα και όψης

Να βρεθεί το όνομα του τμήματος με τους περισσότερους


υπαλλήλους
1 SELECT depname
2 FROM depcount, departments
3 WHERE depcount.depid = departments.depid
4 AND nemp = ( SELECT MAX(nemp)
5 FROM depcount );

Το ίδιο, αλλά με φυσική σύζευξη


1 SELECT depname
2 FROM depcount NATURAL JOIN departments
3 WHERE nemp = ( SELECT MAX(nemp)
4 FROM depcount );

35 / 55
Σύγκριση με υποερώτημα στη φράση HAVING

Να βρεθεί το όνομα του τμήματος με τους περισσότερους


υπαλλήλους
1 SELECT depname
2 FROM depcount NATURAL JOIN departments
3 WHERE nemp = ( SELECT MAX(nemp)
4 FROM depcount );

Με υποερώτημα στη φράση HAVING, χωρίς τη χρήση της όψης


1 SELECT depname
2 FROM departments NATURAL JOIN employees
3 GROUP BY depname
4 HAVING COUNT(*) >= ALL ( SELECT COUNT(depid)
5 FROM employees
6 GROUP BY depid );
36 / 55

Περιεχόμενα

1 Εισαγωγικά για τις όψεις

2 ΄Οψεις και συζεύξεις

3 Επιπλέον χρήση των όψεων

4 Ενημέρωση όψεων

38 / 55
Ορισμός όψης με βάση άλλη όψη

Δημιουργία της όψης emp3 με βάση τον πίνακα employees


1 CREATE VIEW emp3 AS
2 SELECT empid, lastname, firstname, salary
3 FROM employees
4 WHERE depid = 3;

39 / 55

Ορισμός όψης με βάση άλλη όψη

Δημιουργία της όψης emp3 με βάση τον πίνακα employees


1 CREATE VIEW emp3 AS
2 SELECT empid, lastname, firstname, salary
3 FROM employees
4 WHERE depid = 3;

Δημιουργία της όψης emp3_s1300 με βάση την όψη emp3


1 CREATE VIEW emp3_s1300 AS
2 SELECT *
3 FROM emp3
4 WHERE salary > 1300;

Μια όψη μπορεί να οριστεί με βάση μια άλλη όψη.

40 / 55
Διαγραφή όψης

Διαγραφή της όψης viewName


1 DROP VIEW viewName;

41 / 55

Διαγραφή όψης

Διαγραφή της όψης viewName


1 DROP VIEW viewName;

Διαδοχική διαγραφή της όψης viewName και όσων εξαρτώνται


από αυτή
1 DROP VIEW viewName CASCADE;

42 / 55
Διαγραφή όψης

Διαγραφή της όψης viewName


1 DROP VIEW viewName;

Διαδοχική διαγραφή της όψης viewName και όσων εξαρτώνται


από αυτή
1 DROP VIEW viewName CASCADE;

Αποφυγή διαδοχική διαγραφής της όψης viewName και όσων


εξαρτώνται από αυτή
1 DROP VIEW viewName RESTRICT;

43 / 55

Περιεχόμενα

1 Εισαγωγικά για τις όψεις

2 ΄Οψεις και συζεύξεις

3 Επιπλέον χρήση των όψεων

4 Ενημέρωση όψεων

45 / 55
Ενημέρωση όψεων
1 Οι όψεις μπορούν να ενημερωθούν με τις εντολές
INSERT, DELETE, UPDATE, όπως και οι πίνακες
μιας βάσης δεδομένων.

47 / 55

Ενημέρωση όψεων
1 Οι όψεις μπορούν να ενημερωθούν με τις εντολές
INSERT, DELETE, UPDATE, όπως και οι πίνακες
μιας βάσης δεδομένων.
2 Ενημέρωση γίνεται σε όψεις που έχουν δημιουργηθεί με
βάση ένα μόνο πίνακα, όχι περισσότερους.

48 / 55
Ενημέρωση όψεων
1 Οι όψεις μπορούν να ενημερωθούν με τις εντολές
INSERT, DELETE, UPDATE, όπως και οι πίνακες
μιας βάσης δεδομένων.
2 Ενημέρωση γίνεται σε όψεις που έχουν δημιουργηθεί με
βάση ένα μόνο πίνακα, όχι περισσότερους.
3 Δεν μπορεί να γίνει ενημέρωση μιας όψης που έχει
δημιουργηθεί με ερώτημα ομαδοποίησης GROUP BY.

49 / 55

Ενημέρωση όψεων
1 Οι όψεις μπορούν να ενημερωθούν με τις εντολές
INSERT, DELETE, UPDATE, όπως και οι πίνακες
μιας βάσης δεδομένων.
2 Ενημέρωση γίνεται σε όψεις που έχουν δημιουργηθεί με
βάση ένα μόνο πίνακα, όχι περισσότερους.
3 Δεν μπορεί να γίνει ενημέρωση μιας όψης που έχει
δημιουργηθεί με ερώτημα ομαδοποίησης GROUP BY.
4 Οι εντολές INSERT, DELETE, UPDATE σε μια όψη
υπόκεινται στους ίδιους περιορισμούς ενημέρωσης της
βάσης δεδομένων όπως αν εκτελούνταν στους βασικούς
πίνακες.

50 / 55
Ενημέρωση όψεων
1 Οι όψεις μπορούν να ενημερωθούν με τις εντολές
INSERT, DELETE, UPDATE, όπως και οι πίνακες
μιας βάσης δεδομένων.
2 Ενημέρωση γίνεται σε όψεις που έχουν δημιουργηθεί με
βάση ένα μόνο πίνακα, όχι περισσότερους.
3 Δεν μπορεί να γίνει ενημέρωση μιας όψης που έχει
δημιουργηθεί με ερώτημα ομαδοποίησης GROUP BY.
4 Οι εντολές INSERT, DELETE, UPDATE σε μια όψη
υπόκεινται στους ίδιους περιορισμούς ενημέρωσης της
βάσης δεδομένων όπως αν εκτελούνταν στους βασικούς
πίνακες.
5 ΄Ολες οι πράξεις ενημέρωσης εκτελούνται στην ουσία
στους πίνακες που ορίζουν την όψη.
51 / 55

Παράδειγμα ενημέρωσης όψης

Αύξηση του μισθού των υπαλλήλων του τμήματος 3


1 UPDATE emp3
2 SET salary = salary + 50

Η ενημέρωση θα γίνει στον πίνακα employees αλλά μόνο


στους υπαλλήλους του τμήματος 3.

52 / 55
Παράδειγμα ενημέρωσης όψης

Αύξηση του μισθού των υπαλλήλων του τμήματος 3


1 UPDATE emp3
2 SET salary = salary + 50

Η ενημέρωση θα γίνει στον πίνακα employees αλλά μόνο


στους υπαλλήλους του τμήματος 3. Ισοδύναμα:
Αύξηση του μισθού των υπαλλήλων του τμήματος 3
1 UPDATE employees
2 SET salary = salary + 50
3 WHERE depid = 3;

53 / 55

Περιορισμοί στην ενημέρωσης μιας όψης

Αποτυχία εισαγωγής νέου υπαλλήλου στο τμήμα 3


1 INSERT INTO emp3
2 VALUES (980, ’Κάτου’, ’΄Αννα’, 1200);

θα αποτύχει γιατί:
1 Το πεδίο depid του πίνακα employees έχει οριστεί ως
NOT NULL και λείπει από τον ορισμό της όψης, οπότε
η εισαγωγή δεδομένων στον πίνακα employees μέσω
της όψης emp3 θα αποτύχει.
2 Το πεδίο depid του πίνακα employees έχει οριστεί ως
ξένο κλειδί με αναφορική ακεραιότητα στον πίνακα
departments, πρέπει οπωσδήποτε να δοθεί μια έγκυρη
τιμή του.

54 / 55
Εντολές ορισμού δεδομένων (DDL) στην
SQL

Σκοπός της διάλεξης

Να δημιουργείτε πίνακες και να να ορίζετε τα πεδία που


περιέχουν (CREATE TABLE)
Να ορίζετε τα πεδία ορισμού για κάθε πεδίο του πίνακα
Να εφαρμόζετε τους περιορισμούς πρωτεύοντος (PRIMARY KEY)
και ξένου κλειδιού (FOREIGN KEY)
Να εφαρμόζετε τα εναύσματα (πυροδοτήσεις) διαδοχικής
ενημέρωσης και διαγραφής (ON UPDATE CASCADE, ON
DELETE CASCADE)
Να τροποποιείτε τη σχεδίαση των πινάκων, για παράδειγμα να
πραγματοποιείτε προσθήκη και κατάργηση πεδίων, αλλαγή του
πεδίου τιμών, εφαρμογή περιορισμών ξένου κλειδιού, κ.λπ..
(ALTER TABLE)
Να υλοποιείτε μια ολόκληρη βάση δεδομένων με μια σειρά
εντολών CREATE TABLE.

2 / 40
Η εντολή CREATE TABLE
Γενική μορφή
1 CREATE TABLE πίνακας
2 (
3 λίστα πεδίων,
4 λίστα περιορισμών,
5 άλλες επιλογές,
6 );

3 / 40

Η εντολή CREATE TABLE


Γενική μορφή
1 CREATE TABLE πίνακας
2 (
3 λίστα πεδίων,
4 λίστα περιορισμών,
5 άλλες επιλογές,
6 );

Παράδειγμα
1 CREATE TABLE friends
2 (
3 id INTEGER NOT NULL PRIMARY KEY,
4 name CHAR(20) NOT NULL,
5 age INTEGER,
6 phone CHAR(10)
7 );

4 / 40
Λίστα περιορισμών

Περιορισμοί
1 Περιορισμοί ως προς το πρωτεύον κλειδί (PRIMARY KEY)
2 Περιορισμοί ως προς τα ξένα κλειδιά (FOREIGN KEY)
3 Περιορισμοί για έλεγχο μοναδικότητας (UNIQUE)
4 Περιορισμοί για έλεγχο των εισαγόμενων τιμών (CHECK)

5 / 40

Λίστα περιορισμών

Περιορισμοί
1 Περιορισμοί ως προς το πρωτεύον κλειδί (PRIMARY KEY)
2 Περιορισμοί ως προς τα ξένα κλειδιά (FOREIGN KEY)
3 Περιορισμοί για έλεγχο μοναδικότητας (UNIQUE)
4 Περιορισμοί για έλεγχο των εισαγόμενων τιμών (CHECK)

Παράδειγμα PRIMARY KEY


CONSTRAINT pk PRIMARY KEY(id)

6 / 40
Λίστα περιορισμών

Περιορισμοί
1 Περιορισμοί ως προς το πρωτεύον κλειδί (PRIMARY KEY)
2 Περιορισμοί ως προς τα ξένα κλειδιά (FOREIGN KEY)
3 Περιορισμοί για έλεγχο μοναδικότητας (UNIQUE)
4 Περιορισμοί για έλεγχο των εισαγόμενων τιμών (CHECK)

Παράδειγμα PRIMARY KEY


CONSTRAINT pk PRIMARY KEY(id)

Παράδειγμα FOREIGN KEY


CONSTRAINT fk_depid FOREIGN KEY(depid)
REFERENCES departments (depid)

7 / 40

Σύνθετο πρωτεύον κλειδί

Παράδειγμα PRIMARY KEY


1 CREATE TABLE friends
2 (
3 name CHAR(20) NOT NULL,
4 age INTEGER,
5 phone CHAR(10),
6 CONSTRAINT pk PRIMARY KEY(name, phone)
7 );

8 / 40
Σύνθετο πρωτεύον κλειδί

Παράδειγμα PRIMARY KEY


1 CREATE TABLE friends
2 (
3 name CHAR(20) NOT NULL,
4 age INTEGER,
5 phone CHAR(10),
6 CONSTRAINT pk PRIMARY KEY(name, phone)
7 );

Προσοχή
Ο πίνακας έχει ένα πρωτεύον κλειδί.
Το πρωτεύον κλειδί αποτελείται από δύο πεδία του
πίνακα.
Είναι λάθος να πούμε πως «δύο πεδία είναι
πρωτεύοντα κλειδιά».
Δεν υπάρχει πίνακας με δύο πρωτεύοντα κλειδιά. 9 / 40

Ξένο κλειδί
departments

1 CREATE TABLE departments (


2 depid INTEGER NOT NULL,
3 depname CHAR(30) NOT NULL,
4 manager INTEGER
5 CONSTRAINT pk PRIMARY KEY(depid)
6 );

employees

1 CREATE TABLE employees (


2 empid INTEGER NOT NULL,
3 firstname CHAR(30) NOT NULL,
4 lastname CHAR(30) NOT NULL,
5 depid INTEGER NOT NULL,
6 salary FLOAT,
7 hiredate DATE,
8 CONSTRAINT pk PRIMARY KEY(empid),
9 CONSTRAINT fk_depid FOREIGN KEY(depid)
10 REFERENCES departments(depid)
11 ); 10 / 40
Παρατηρήσεις για τα ξένα κλειδιά

1 Γενικά τα ξένα κλειδιά θα πρέπει να είναι ορισμένα με την


επιλογή NOT NULL προς αποφυγή διαφόρων ανωμαλιών στην
ενημέρωση της βάσης.
2 Τα ξένα κλειδιά δεν έχουν καμία επίδραση στις εντολές SELECT.
3 Η επίδραση που έχουν οι περιορισμοί ξένου κλειδιού αφορά τις
πράξεις ενημέρωσης της βάσης (INSERT, DELETE και UPDATE).
4 Αν το ξένο κλειδί παίρνει πολλαπλές τιμές, π.χ. εμφανίζεται
πολλές φορές ο ίδιος κωδικός τμήματος για διαφορετικούς
υπαλλήλους, τότε ο περιορισμός του ξένου κλειδιού ισοδυναμεί με
τη συσχέτιση ένα προς πολλά.
5 Αν το ξένο κλειδί έχει επιπλέον περιορισμό μοναδικότητας,
δηλαδή κάθε εγγραφή έχει μοναδική τιμή σε αυτό το πεδίο,
και αναφέρεται σε πρωτεύον κλειδί ενός άλλου πίνακα ή
σε πεδίο που επίσης έχει περιορισμό μοναδικότητας, τότε
αυτό ισοδυναμεί με τη συσχέτιση ένα προς ένα.
11 / 40

Επίδραση ξένου κλειδιού

Εισαγωγή τμήματος
1 INSERT INTO departments (depid, depname)
2 VALUES (1, ΄Διοίκησης΄);

13 / 40
Επίδραση ξένου κλειδιού

Εισαγωγή τμήματος
1 INSERT INTO departments (depid, depname)
2 VALUES (1, ΄Διοίκησης΄);

Εισαγωγή υπαλλήλου
1 INSERT INTO employees (empid, firstname, lastname, depid)
2 VALUES (101, ΄Μαρία΄, ΄Αθανασίου΄, 1);

14 / 40

Επίδραση ξένου κλειδιού

Εισαγωγή τμήματος
1 INSERT INTO departments (depid, depname)
2 VALUES (1, ΄Διοίκησης΄);

Εισαγωγή υπαλλήλου
1 INSERT INTO employees (empid, firstname, lastname, depid)
2 VALUES (101, ΄Μαρία΄, ΄Αθανασίου΄, 1);

Αποτυχία
1 INSERT INTO employees (empid, firstname, lastname, depid)
2 VALUES (201, ΄Κρινιώ΄, ΄Παπαδοπούλου΄, 2);

15 / 40
Συσχέτιση πολλά προς πολλά
projects
1 CREATE TABLE projects (
2 proid INTEGER NOT NULL,
3 title VARCHAR(120) NOT NULL,
4 budget NUMERIC(9,2) NOT NULL DEFAULT 0,
5 startdate DATE,
6 enddate DATE,
7 progress NUMERIC(3,1) NOT NULL DEFAULT 0,
8 CONSTRAINT pk_projects PRIMARY KEY (proid) );

workson
1 CREATE TABLE workson (
2 empid INTEGER NOT NULL,
3 proid INTEGER NOT NULL,
4 CONSTRAINT pk_workson PRIMARY KEY (empid, proid),
5 CONSTRAINT fk_emp FOREIGN KEY (empid)
6 REFERENCES employees(empid),
7 CONSTRAINT fk_pro FOREIGN KEY (proid)
8 REFERENCES projects(proid) ); 16 / 40

Μοναδικές τιμές

UNIQUE index
1 CREATE TABLE employees
2 (
3 empid INTEGER NOT NULL,
4 firstname CHAR(50) NOT NULL,
5 lastname CHAR(50) NOT NULL,
6 amka CHAR(12) NOT NULL,
7 depid INTEGER NOT NULL,
8 salary NUMERIC(6,2),
9 hiredate DATE,
10 CONSTRAINT pk_employees PRIMARY KEY (empid),
11 INDEX i_depid (depid),
12 UNIQUE u_amka (amka),
13 CONSTRAINT fk_depid FOREIGN KEY (depid)
14 REFERENCES departments(depid)
15 );

17 / 40
Πυροδοτήσεις ενημέρωσης

Διαγραφή
ON DELETE [CASCADE | RESTRICT | SET NULL | SET DEFAULT]

Τροποποίηση
ON UPDATE [CASCADE | RESTRICT | SET NULL | SET DEFAULT]

1 CASCADE Ενεργοποιεί τη διαδοχική πράξη ενημέρωσης ή


διαγραφής.
2 RESTRICT Αποτρέπει την ενημέρωση ή διαγραφή.
3 SET NULL Ενημερώνει το ξένο κλειδί σε τιμή NULL.
4 SET DEFAULT Ενημερώνει το ξένο κλειδί στην
προεπιλεγμένη τιμή (DEFAULT).

18 / 40

ON DELETE CASCADE

workson
1 CREATE TABLE workson
2 (
3 empid INTEGER NOT NULL,
4 proid INTEGER NOT NULL,
5 CONSTRAINT pk_workson PRIMARY KEY (empid, proid),
6 INDEX i_empid (empid),
7 INDEX i_proid (proid),
8 CONSTRAINT fk_empid FOREIGN KEY (empid)
9 REFERENCES employees(empid)
10 ON DELETE CASCADE,
11 CONSTRAINT fk_proid FOREIGN KEY (proid)
12 REFERENCES projects(proid)
13 );

19 / 40
Πυροδότηση διαδοχικής διαγραφής

1 SELECT *
2 FROM workson
3 WHERE empid = 419;
4

5 empid proid
6 --------------
7 419 12
8 419 21
9 419 43

20 / 40

Πυροδότηση διαδοχικής διαγραφής

1 SELECT *
2 FROM workson
3 WHERE empid = 419;
4
1 DELETE FROM employees
5 empid proid 2 WHERE empid = 419;
6 --------------
7 419 12
8 419 21
9 419 43

21 / 40
Πυροδότηση διαδοχικής διαγραφής

1 SELECT *
2 FROM workson
3 WHERE empid = 419;
4
1 DELETE FROM employees
5 empid proid 2 WHERE empid = 419;
6 --------------
7 419 12
8 419 21
9 419 43

1 SELECT *
2 FROM employees
3 WHERE empid = 419;
4
5 Empty set (0.00 sec)

22 / 40

Πυροδότηση διαδοχικής διαγραφής

1 SELECT *
2 FROM workson
3 WHERE empid = 419;
4
1 DELETE FROM employees
5 empid proid 2 WHERE empid = 419;
6 --------------
7 419 12
8 419 21
9 419 43

1 SELECT * 1 SELECT *
2 FROM employees 2 FROM workson
3 WHERE empid = 419; 3 WHERE empid = 419;
4 4
5 Empty set (0.00 sec) 5 Empty set (0.00 sec)

23 / 40
ON UPDATE CASCADE

workson
1 CREATE TABLE workson
2 (
3 empid INTEGER NOT NULL,
4 proid INTEGER NOT NULL,
5 CONSTRAINT pk_workson PRIMARY KEY (empid, proid),
6 INDEX i_empid (empid),
7 INDEX i_proid (proid),
8 CONSTRAINT fk_empid FOREIGN KEY (empid)
9 REFERENCES employees(empid)
10 ON DELETE CASCADE
11 ON UPDATE CASCADE,
12 CONSTRAINT fk_proid FOREIGN KEY (proid)
13 REFERENCES projects(proid)
14 );

24 / 40

ON UPDATE CASCADE
Υπάλληλος με κωδικό 419
1 SELECT *
2 FROM employees
3 WHERE empid = 419;
4
5 empid firstname lastname depid salary hiredate
6 -----------------------------------------------------------
7 419 Πέτρος Αρβανιτάκης 2 1323.80 2000-07-17

΄Εργα που συμμετέχει


1 SELECT *
2 FROM workson
3 WHERE empid = 419;
4
5 empid proid
6 -------------
7 419 12
8 419 21
9 419 43
25 / 40
Τροποποίηση κωδικού
Αλλαγή του κωδικού 419 σε 406
1 UPDATE employees
2 SET empid = 406
3 WHERE empid = 419;

Νέος κωδικός
1 SELECT *
2 FROM employees
3 WHERE empid = 406;
4
5 empid firstname lastname depid salary hiredate
6 -----------------------------------------------------------
7 419 Πέτρος Αρβανιτάκης 2 1323.80 2000-07-17

26 / 40

Τροποποίηση κωδικού
419
1 SELECT *
2 FROM workson
3 WHERE empid = 419;
4
5 Empty set (0.00 sec)

406
1 SELECT *
2 FROM workson
3 WHERE empid = 406;
4
5 empid proid
6 -------------
7 419 12
8 419 21
9 419 43
27 / 40
Αυτοματοποίηση ενημέρωσης

UPDATE workson
1 UPDATE workson
2 SET empid = 406
3 WHERE empid = 419;

28 / 40

Αλυσίδα διαγραφής -1

Το τμήμα 2
1 SELECT *
2 FROM departments
3 WHERE depid = 2;
4
5 depid depname manager
6 -------------------------------------------
7 2 Οικονομολόγων/Λογιστών 153

29 / 40
Αλυσίδα διαγραφής -2

Υπάλληλοι του τμήματος 2


1 SELECT *
2 FROM departments
3 WHERE depid = 2;
4
5 empid firstname lastname depid salary hiredate
6 --------------------------------------------------------------
7 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15
8 243 Δέσποινα Παπαδοπούλου 2 1609.52 1999-03-05
9 419 Πέτρος Αρβανιτάκης 2 1323.80 2000-07-17
10 503 Μαριλένα Κρέσπα 2 1105.04 2001-03-07

30 / 40

Αλυσίδα διαγραφής -1

Απασχόληση των υπαλλήλων του τμήματος 2


1 SELECT w.*
2 FROM employees e INNER JOIN workson w
3 ON e.empid=w.empid
4 WHERE e.depid = 2;
5
6 empid proid
7 -------------
8 153 14
9 153 38
10 243 21
11 243 38
12 419 12
13 419 21
14 419 43
15 503 21
16 503 38
31 / 40
Διαγραφή

Διαγραφή του τμήματος 2


1 DELETE FROM departments
2 WHERE depid = 2;

Επιβεβαίωση
1 SELECT *
2 FROM departments
3 WHERE depid = 2;
4
5 Empty set (0.00 sec)

32 / 40

Καταστροφική αλυσίδα διαγραφής

Υπάλληλοι
1 SELECT *
2 FROM employees
3 WHERE depid = 2;
4
5 Empty set (0.00 sec)

Απασχόληση σε έργα
1 SELECT w.*
2 FROM employees e INNER JOIN workson w
3 ON e.empid=w.empid
4 WHERE e.depid = 2;
5
6 Empty set (0.00 sec)

33 / 40
ON DELETE RESTRICT

employees
1 CREATE TABLE employees
2 (
3 empid INTEGER NOT NULL,
4 firstname CHAR(30) NOT NULL,
5 lastname CHAR(30) NOT NULL,
6 depid INTEGER NOT NULL,
7 salary NUMERIC(6,2),
8 hiredate DATE,
9 CONSTRAINT pk_employees PRIMARY KEY (empid),
10 INDEX i_depid (depid),
11 CONSTRAINT fk_depid FOREIGN KEY (depid)
12 REFERENCES departments(depid)
13 ON DELETE RESTRICT
14 ON UPDATE CASCADE
15 );

34 / 40

ON DELETE RESTRICT

Αποτυχία διαγραφής
1 DELETE
2 FROM departments
3 WHERE depid = 2;
4
5 ERROR 1451 (23000): Cannot delete or update a parent row:
6 a foreign key constraint fails
7 (employees, CONSTRAINT fk_depid FOREIGN KEY (depid)
8 REFERENCES departments (depid) ON UPDATE CASCADE)

35 / 40
Σειρά διαγραφής

Μπορεί να γίνει έτσι


1 DELETE FROM workson ...
2 DELETE FROM employees ...
3 DELETE FROM departments ...

Αλλά όχι έτσι


1 DELETE FROM departments ...
2 DELETE FROM employees ...
3 DELETE FROM workson ...

36 / 40

ON UPDATE RESTRICT

workson
1 CREATE TABLE workson
2 (
3 empid INTEGER NOT NULL,
4 proid INTEGER NOT NULL,
5 CONSTRAINT pk_workson PRIMARY KEY (empid, proid),
6 INDEX i_empid (empid),
7 INDEX i_proid (proid),
8 CONSTRAINT fk_empid FOREIGN KEY (empid)
9 REFERENCES employees(empid)
10 ON DELETE RESTRICT
11 ON UPDATE RESTRICT,
12 CONSTRAINT fk_proid FOREIGN KEY (proid)
13 REFERENCES projects(proid)
14 ON DELETE RESTRICT
15 ON UPDATE RESTRICT
16 );
37 / 40
Αποτυχία ενημέρωσης

UPDATE workson
1 UPDATE projects
2 SET proid = 50
3 WHERE proid = 43;
4
5 ERROR 1451 (23000): Cannot delete or update a parent row:
6 a foreign key constraint fails
7 (workson, CONSTRAINT fk_proid FOREIGN KEY (proid)
8 REFERENCES projects (proid))

38 / 40

Υπενθύμιση
UPDATE projects
1 UPDATE projects
2 SET budget = 150000
3 WHERE proid = 43;
4
5 Query OK, 1 row affected (0.03 sec)
6 Rows matched: 1 Changed: 1 Warnings: 0

SELECT workson
1 SELECT *
2 FROM workson
3 WHERE proid = 43;
4
5 empid proid
6 -------------
7 189 43
8 419 43
9 593 43
10 901 43
39 / 40
Περίληψη διάλεξης
1 Η εντολή CREATE TABLE δημιουργεί πίνακες.
2 Ο όρος CONSTRAINT ... PRIMARY KEY ... ορίζει
το πρωτεύον κλειδί.
3 Ο όρος CONSTRAINT ... FOREIGN KEY ... ορίζει το
πρωτεύον κλειδί.
4 Η διαδοχική διαγραφή ενεργοποιείται με τον όρο ON
DELETE CASCADE.
5 Η αποτροπή διαδοχικής διαγραφής ενεργοποιείται με
τον όρο ON DELETE RESTRICT.
6 Ο ορισμός ξένου κλειδιού δεν επηρεάζει την εισαγωγή
δεδομένων στον γονικό πίνακα, επηρεάζει την
εισαγωγή δεδομένων στο θυγατρικό πίνακα.
7 Ο όρος ON DELETE [CASCADE—RESTRICT]
καθορίζει τον τρόπο με τον οποίο το ΣΔΒΔ χειρίζεται
εγγραφές του θυγατρικού πίνακα όταν εκτελείται
διαγραφή αντίστοιχων εγγραφών στον γονικό πίνακα. 40 / 40

You might also like