1
Περιεχόμενα Πρόλογος... 21 Μέρος Ι Μια βόλτα στις βάσεις δεδομένων... 23 1 Μια βόλτα στις βάσεις δεδομένων...25 1.1 Η πρώτη βάση δεδομένων... 26 1.1.1 Άλλοι τρόποι... 26 1.1.2 Απαιτήσεις της εφαρμογής... 29 1.1.3 Δημιουργία της βάσης... 31 1.1.4 MS Access... 34 1.2 Ένα βήμα μπροστά: κλειδιά και πρώτη κανονική μορφή... 37 1.2.1 Πρωτεύον κλειδί... 38 1.3 Σύνθετες ιδιότητες οντοτήτων... 42 1.4 Περισσότεροι τύποι δεδομένων... 44 1.5 Συμπεράσματα και προοπτικές... 45 1.6 Περίληψη... 46 1.7 Ασκήσεις... 47 2 Το σχεσιακό μοντέλο...49 2.1 Εισαγωγή στο σχεσιακό μοντέλο... 50 2.2 Κεντρικές έννοιες του σχεσιακού μοντέλου... 52 2.3 Ιδιότητες των σχέσεων... 54 2.3.1 Μοναδικότητα πλειάδων... 55 2.3.2 Διάταξη πλειάδων... 55 2.3.3 Διάταξη γνωρισμάτων... 56 2.3.4 Ατομικότητα... 57 2.4 Είδη σχέσεων... 59 2.5 Η ερμηνεία και το κατηγόρημα μιας σχέσης... 60 5
6 Περιεχόμενα 2.6 Σχέσεις και κλειδιά... 61 2.6.1 Υπερκλειδί...62 2.7 Σχεσιακή άλγεβρα και βασικές πράξεις... 63 2.7.1 Κλειστότητα...63 2.7.2 Ένωση...64 2.7.3 Τομή...66 2.7.4 Διαφορά...68 2.7.5 2.7.6 Γινόμενο...69 Επιλογή...70 2.7.7 Προβολή...72 2.7.8 2.7.9 Σύζευξη...73 Διαίρεση...77 2.7.10 Σύνοψη και συναρτήσεις συνάθροισης...80 2.7.11 Ενημέρωση...83 3 Σημασιολογική μοντελοποίηση με το μοντέλο Οντοτήτων/Συσχετίσεων...91 3.1 Εισαγωγή... 92 3.2 Οντότητες και ιδιότητες οντοτήτων... 92 3.2.1 Κατηγορίες ιδιοτήτων...94 3.2.2 Ακεραιότητα οντοτήτων...95 3.3 Συσχετίσεις... 96 3.4 Περιορισμοί... 97 3.4.1 Λόγος πληθικότητας...97 3.4.2 Περιορισμοί συμμετοχής...99 3.4.3 Παραδείγματα περιορισμών...100 3.5 Κλειδιά... 106 3.5.1 Πρωτεύον κλειδί συσχετίσεων...108 3.6 Σχεδιασμός... 110 3.6.1 Ποιες οντότητες αναπαριστούν τις έννοιες της βάσης...110 3.6.2 Οντότητες ή ιδιότητες...111 3.7 Διαγράμματα Ο/Σ... 113 3.8 Ασθενείς Οντότητες... 114 4 Μετατροπή του μοντέλου Οντοτήτων/Συσχετίσεων σε σχεσιακό...117 4.1 Γενικοί κανόνες μετασχηματισμού... 118 4.2 Ισχυρές οντότητες... 119 4.3 Ασθενείς οντότητες... 119 4.4 Συσχετίσεις... 119
Περιεχόμενα 7 4.4.1 Ένα προς ένα... 119 4.4.2 Ένα προς πολλά... 122 4.4.3 Πολλά προς πολλά... 123 4.5 Σύνθετες ιδιότητες... 124 4.6 Πλειότιμες ιδιότητες... 124 5 Κανονικοποίηση...125 5.1 Πρώτη κανονική μορφή... 126 5.2 Συναρτησιακές εξαρτήσεις... 132 5.2.1 Γενικά γα τις συναρτησιακές εξαρτήσεις... 132 5.2.2 Τετριμμένες συναρτησιακές εξαρτήσεις... 136 5.3 Εγκλεισμός ή θήκη του συνόλου εξαρτήσεων... 138 5.3.1 Ισοδύναμα σύνολα εξαρτήσεων... 139 5.3.2 Μη αναγώγιμα (ελάχιστα) σύνολα εξαρτήσεων... 140 5.4 Δεύτερη κανονική μορφή... 141 5.5 Τρίτη κανονική μορφή... 146 5.5.1 Περιγραφή και ορισμός της τρίτης κανονικής μορφής... 146 5.5.2 Ενημέρωση της βάσης με εισαγωγή πλειάδων... 150 5.5.3 Ενημέρωση της βάσης με διαγραφή πλειάδων... 152 5.5.4 Ενημέρωση της βάσης με τροποποίηση πλειάδων... 153 5.5.5 Απόδοση στα ερωτήματα... 156 5.6 Περίληψη κεφαλαίου... 159 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων... 161 6 Εισαγωγή...163 6.1 Η αρχή... 163 6.2 Το πρότυπο... 163 6.3 Διάλεκτοι... 164 6.4 Για την πληρότητα... 164 6.5 Περιγραφή της βάσης δεδομένων για τα παραδείγματα... 164 7 Απλά ερωτήματα επιλογής...167 7.1 Προβολή και περιορισμός, ερωτήματα σε έναν πίνακα... 168 7.1.1 Το πιο απλό ερώτημα... 168 7.1.2 Συστήματα διαχείρισης και περιβάλλοντα επεξεργασίας ερωτημάτων... 169 7.1.3 Επιλογή πεδίων από πίνακα... 173
8 Περιεχόμενα 7.2 Μετονομασία πεδίων στο αποτέλεσμα... 174 7.3 Περιορισμός εγγραφών... 175 7.3.1 Συγκρίσεις κειμένου και αλφαριθμητικών...177 7.3.2 Συγκρίσεις με ημερομηνίες...178 7.3.3 Ασκήσεις...179 7.4 Πεδία και αλγεβρικές παραστάσεις... 186 7.4.1 Παρατήρηση για τον υπολογισμό ποσοστού...187 7.4.2 Ασκήσεις...188 7.5 Ταξινόμηση δεδομένων... 189 7.5.1 Ασκήσεις...190 7.6 Περίληψη κεφαλαίου... 192 7.7 Επαναληπτικές ασκήσεις... 193 8 Περισσότερα για τα ερωτήματα επιλογής...195 8.1 Απαλοιφή διπλοεγγραφών... 196 8.1.1 Ασκήσεις...197 8.2 Χειρισμός άγνωστων τιμών... 198 8.3 Ταίριασμα κειμένου και χαρακτήρων... 199 8.3.1 Ασκήσεις...200 8.4 Οι λογικοί τελεστές... 201 8.4.1 Ασκήσεις...207 8.5 Ο τελεστής συνόλου... 208 8.5.1 Ασκήσεις...210 8.6 Ο τελεστής περιοχής τιμών... 210 8.6.1 Ασκήσεις...211 8.7 Περίληψη κεφαλαίου... 213 8.8 Επαναληπτικές ασκήσεις... 214 9 Συναρτήσεις συνάθροισης και ερωτήματα ομαδοποίησης ν...217 9.1 Συναρτήσεις συνάθροισης... 218 9.1.1 Γενικά για τις συναρτήσεις συνάθροισης...218 9.1.2 Υπολογισμός του αθροίσματος...219 9.1.3 Υπολογισμός του μέσου όρου...220 9.1.4 Υπολογισμός της μικρότερης και της μεγαλύτερης τιμής...220 9.1.5 Καταμέτρηση του πλήθους...221 9.2 Ομαδοποίηση και συναρτήσεις συνάθροισης... 223 9.2.1 Ασκήσεις...225 9.3 Περιορισμός εγγραφών σε ερωτήματα ομαδοποίησης με συναρτήσεις συνάθροισης... 227
Περιεχόμενα 9 9.3.1 Μια ολοκληρωμένη πρόταση... 228 9.3.2 Ασκήσεις... 229 9.4 Περίληψη κεφαλαίου... 231 9.5 Επαναληπτικές ασκήσεις... 232 10 Ερωτήματα επιλογής με σύζευξη πινάκων...233 10.1 Καρτεσιανό γινόμενο και σύζευξη... 234 10.2 Ψευδώνυμα πινάκων... 238 10.3 Ερωτήματα σε πίνακες με συσχέτιση ένα προς πολλά... 239 10.3.1 Ασκήσεις... 243 10.4 Ερωτήματα σε πίνακες με συσχέτιση πολλά προς πολλά... 248 10.4.1 Ασκήσεις... 250 10.5 Εξωτερικές συζεύξεις... 254 10.6 Οι σχεσιακές πράξεις αφαίρεσης και τομής με τη χρήση εξωτερικών συζεύξεων... 260 10.6.1 Ασκήσεις... 263 10.7 Σύζευξη με περισσότερα από ένα πεδία... 264 10.8 Αυτοσύζευξη... 266 10.9 Άλλες (εξωτικές) συζεύξεις... 268 10.10 Περίληψη κεφαλαίου... 272 10.11 Επαναληπτικές ασκήσεις... 273 11 Ερωτήματα επιλογής με ομαδοποίηση σε πολλούς πίνακες...275 11.1 Γενικά για ερωτήματα σύνοψης σε πολλούς πίνακες... 276 11.2 Ανάλυση ενός παραδείγματος... 277 11.3 Ασκήσεις με απαντήσεις... 278 11.4 Περίληψη κεφαλαίου... 285 11.5 Επαναληπτικές ασκήσεις... 285 12 Υποερωτήματα...289 12.1 Υποερωτήματα... 290 12.1.1 Απλά υποερωτήματα... 290 Ασκήσεις... 296 12.1.3 Ένωση... 298 12.2 Εύρεση της τομής δύο συνόλων με υποερώτημα... 301 12.3 Περίληψη κεφαλαίου... 302
10 Περιεχόμενα 13 Ενσωματωμένες συναρτήσεις...305 13.1 Εισαγωγή... 305 13.2 Συναρτήσεις για αριθμούς... 305 13.3 Συναρτήσεις αλφαριθμητικών... 307 13.4 Συναρτήσεις ημερομηνίας και ώρας... 307 13.5 Ασκήσεις... 309 14 Ενημέρωση της βάσης δεδομένων...313 14.1 Διαγραφή δεδομένων... 314 14.1.1 Διαγραφή όλων των δεδομένων...314 14.1.2 Διαγραφή δεδομένων υπό όρους...314 14.1.3 Διαγραφή δεδομένων με υποερωτήματα...315 14.1.4 Ασκήσεις...316 14.2 Τροποποίηση δεδομένων... 317 14.2.1 Απλές περιπτώσεις...317 14.2.2 Ενημέρωση με βάση την τιμή ενός πεδίου...318 14.2.3 Ενημέρωση σύνθετου κλειδιού: απόψεις και προβλήματα...319 14.2.4 Τροποποίηση δεδομένων με υποερωτήματα...322 14.2.5 Ασκήσεις...323 14.3 Εισαγωγή δεδομένων... 324 14.3.1 Ένα πρόβλημα με διαδοχική εισαγωγή και διαγραφή...326 14.3.2 Εισαγωγή δεδομένων με υποερώτημα...328 14.3.3 Ασκήσεις...330 14.4 Περίληψη κεφαλαίου... 331 15 Η γλώσσα ορισμού δεδομένων...333 15.1 Δημιουργία βάσης δεδομένων... 334 15.2 Δημιουργία πινάκων... 334 15.2.1 Η λίστα πεδίων...335 15.2.2 Τύποι δεδομένων...336 15.2.3 Λίστα περιορισμών...339 15.2.4 Ξένα κλειδιά...340 15.2.5 Συσχέτιση πολλά προς πολλά...343 15.2.6 Δείκτες και περιορισμοί μοναδικότητας...344 15.2.7 Πυροδοτήσεις (εναύσματα) για τα ξένα κλειδιά...347
Περιεχόμενα 11 15.3 Τροποποίηση δομής πίνακα... 351 15.3.1 Ασκήσεις με απαντήσεις... 353 15.4 Επαναληπτικές ασκήσεις... 360 16 Όψεις...363 16.1 Εισαγωγικά... 364 16.2 Πλεονεκτήματα και μειονεκτήματα στη χρήση των όψεων... 366 16.2.1 Πλεονεκτήματα της χρήσης όψεων... 366 16.2.2 Μειονεκτήματα της χρήσης όψεων... 366 16.3 Παραδείγματα χρήσης των όψεων... 367 16.4 Όψεις και ερωτήματα σύζευξης... 368 16.5 Όψεις με ομαδοποίηση... 370 16.6 Ενημέρωση όψεων... 371 16.7 Διαγραφή όψεων... 374 17 Ασφάλεια βάσεων δεδομένων...375 17.1 Εκχώρηση δικαιωμάτων σε χρήστες... 375 17.2 Ανάκληση δικαιωμάτων... 380 17.3 Κανόνες ασφαλείας στην πράξη... 381 17.4 Η πικρή χαρά μιας ιστοσελίδας... 382 18 Αποθηκευμένες διαδικασίες...385 18.1 Απλό παράδειγμα χωρίς παραμέτρους... 386 18.2 Απλό παράδειγμα με παραμέτρους... 386 18.3 Διαδικασίες με πολλές εντολές... 388 18.4 Ολική συμμετοχή σε συσχέτιση ένα προς πολλά... 390 18.5 Ασκήσεις... 392 19 Εναύσματα...393 19.1 Γενικά για τα εναύσματα... 394 19.2 Πλεονεκτήματα και μειονεκτήματα της χρήσης εναυσμάτων... 398 19.2.1 Πλεονεκτήματα... 398 19.2.2 Μειονεκτήματα... 399 19.3 Εφαρμογές των εναυσμάτων... 399 19.3.1 Αλλαγή τιμών... 399 19.3.2 Πυροδοτήσεις ακεραιότητας αναφορών... 401
12 Περιεχόμενα ΜΕΡΟΣ ΙIΙ Παραδείγματα και εφαρμογές...405 20 Καταγραφή γεννήσεων σε μια μαιευτική κλινική...407 20.1 Το πρόβλημα: περιγραφή και ανάλυση απαιτήσεων... 407 20.2 Σχεδίαση μοντέλου Οντοτήτων/Συσχετίσων... 408 20.2.1 Γενικά...408 20.2.2 Ιδιότητες των οντοτήτων...410 20.2.3 Παιδιά, ιδιότητα ή οντότητα;...413 20.3 Μετατροπή σε σχεσιακό μοντέλο... 414 20.4 Κανονικοποίηση... 415 20.5 Πίνακες, ερωτήματα, όψεις, και φόρμες... 415 20.5.1 Πίνακες MySQL...415 20.5.2 MS Access...417 20.5.3 Ερωτήματα στη βάση μαιευτηρίου...422 20.6 Προγραμματισμός της εφαρμογής... 429 20.6.1 Γενικά...429 20.6.2 Επεξεργασία πινάκων...429 20.6.3 Ερωτήματα και όψεις...436 20.6.4 Εκθέσεις...445 20.6.5 Φόρμες...446 20.7 Ο θρίαμβος του σχεσιακού μοντέλου... 448 20.8 Συμπεράσματα... 456 Βιβλιογραφία... 457 Ευρετήριο... 459
Κατάλογος Πινάκων 06.1 Περιγραφή (λεξικό δεδομένων) του πίνακα τμημάτων (departments). 165 06.2 Περιγραφή (λεξικό δεδομένων) του πίνακα εργαζομένων (employees)... 165 06.3 Περιγραφή (λεξικό δεδομένων) του πίνακα έργων (projects).... 166 06.4 Περιγραφή (λεξικό δεδομένων) του πίνακα απασχόλησης (workson).. 166 07.1 Τελεστές σύγκρισης... 177 08.1 Αληθείας για AND... 201 08.2 Αληθείας για OR... 201 09.1 Οι βασικές συναρτήσεις συνάθροισης... 218 13.1 Συναρτήσεις για αριθμούς... 306 13.2 Συναρτήσεις για αλφαριθμητικά... 307 13.3 Συναρτήσεις για ημερομηνίες και ώρες... 308 15.1 Βασικοί τύποι δεδομένων... 336 15.2 Βασικοί τύποι δεδομένων για αριθμούς... 337 15.3 Βασικοί τύποι δεδομένων για κείμενο και αλφαριθμητικά... 338 15.4 Βασικοί τύποι δεδομένων για ημερομηνίες και χρόνους... 339 19.1 Τα εναύσματα συνδέονται πάντα με κάποιον πίνακα της βάσης δεδομένων.... 395 13
Κατάλογος Σχημάτων 1.1 Δείγμα της βάσης δεδομένων των φίλων μας σε επεξεργαστή κειμένου... 27 1.2 Δείγμα της βάσης δεδομένων των φίλων μας σε λογιστικό φύλλο... 27 1.3 Εύρεση πληροφοριών από τη βάση δεδομένων των φίλων.... 29 1.4 Σχηματική αναπαράσταση των φίλων μας... 30 1.5 Σύνδεση με το διακομιστή MySQL.... 33 1.6 Δημιουργία πίνακα στο περιβάλλον MySQL Query Browser.... 33 1.7 Δημιουργία πίνακα στο περιβάλλον MS Access... 34 1.8 Δημιουργία αυτόματης φόρμας... 35 1.9 Εισαγωγή δεδομένων με αυτόματη φόρμα της MS Access.... 36 1.10 Τοποθέτηση αναγνωριστικού (id) και επικεφαλίδων στον πίνακα των φίλων. Εδώ τον βλέπουμε σε αναπαράσταση λογιστικού φύλλου.. 39 1.11 Εφαρμογή φίλτρου με βάση την Αθήνα στο λογιστικό φύλλο.... 39 1.12 Σχηματική αναπαράσταση των φίλων μας... 40 1.13 Δημιουργία του πίνακα friends στο περιβάλλον σχεδίασης της MS Access... 41 1.14 Εισαγωγή εγγραφής σε πίνακα αυτόματης αρίθμησης μέσω μιας φόρμας.... 41 1.15 Διαγραμματική αναπαράσταση των φίλων μας με σύνθετες ιδιότητες ονόματος και διεύθυνσης.... 42 15
16 Κατάλογος Σχημάτων 1.16 Σχεδίαση του πίνακα φίλων με σύνθετα γνωρίσματα ονόματος και διεύθυνσης... 43 1.17 Σχεδίαση ενός απλού ερωτήματος στο περιβάλλον της MS Access... 44 1.18 Εναλλαγή προβολής σχεδίασης και SQL.... 44 2.3 Αριστερά η μη κανονικοποιημένη σχέση με πολλαπλές τιμές στο γνώρισμα «Παραγγελία». Δεξιά η κανονικοποιημένη σχέση με ατομικές τιμές στο γνώρισμα «Παραγγελία».... 57 2.9 Η ένωση δύο συνόλων έχει ως μέλη τα στοιχεία είτε του ενός είτε του άλλου συνόλου... 65 2.14 Η διαφορά δύο συνόλων έχει ως μέλη τα στοιχεία του πρώτου συνόλου που δεν ανήκουν στο δεύτερο σύνολο... 69 3.1 Ένα απλό παράδειγμα διαγράμματος οντοτήτων/συσχετίσεων υπάλληλοι που εργάζονται σε υποκαταστήματα μιας εταιρείας.... 92 3.2 Ένα απλό παράδειγμα μοντέλου οντοτήτων συσχετίσεων... 93 3.3 Παράδειγμα συσχέτισης 1:1.... 100 3.4 Κάθε δήμος εκλέγει ένα δήμαρχο, και κάθε δήμαρχος διοικεί ένα δήμο. Παράδειγμα συσχέτισης 1:1.... 102 3.5 Παράδειγμα συσχέτισης 1:1.... 103 3.6 Μητέρες και παιδιά, ένα παράδειγμα συσχέτισης 1:Ν... 104 3.7 Παράδειγμα συσχέτισης Ν:Ν.... 105 3.8 Το παράδειγμα μιας κάβας κρασιών.... 111 3.9 Το παράδειγμα της κάβας κρασιών: ο παραγωγός ως οντότητα... 112 3.10 Η κάβα κρασιών: ένας παραγωγός παράγει κρασί που αποτελείται από ποικιλίες. Οι ιδιότητες έχουν παραλειφθεί... 113 5.1 Υπάλληλοι μιας εταιρείας με πλειότιμη ιδιότητα των ξένων γλωσσών που μιλούν. Οι υπόλοιπες ιδιότητες έχουν απαλειφθεί για λόγους απλότητας.... 126
Κατάλογος Σχημάτων 17 6.1 Το της βάσης company... 165 7.1 Σύνδεση με το διακομιστή βάσεων δεδομένων (MySQL Database Server).... 172 7.2 Εκτέλεση ερωτημάτων στο περιβάλλον εργασίας του MySQL Query Browser... 172 8.1 Το ερώτημα και το αποτέλεσμά του με χρήση του τελεστή AND... 203 8.2 Το ερώτημα και το αποτέλεσμά του με χρήση του τελεστή OR... 203 9.1 Διάγραμμα σύνταξης των συναρτήσεων συνάθροισης.... 219 10.1 Τροποποίηση σύνδεσης πινάκων στην MS ACCESS... 256 20.1 Μερική (χωρίς ιδιότητες) διαγραμματική απεικόνιση της συσχέτισης «μητέρα γεννά παιδί»... 409 20.2 Σχηματική αναπαράσταση της συσχέτισης μητέρα (M) γεννά (B) παιδί (C) ως συσχέτισης με λόγο πληθικότητας Ν:1... 409 20.3 Μια πιο λεπτομερής έκδοση του διαγράμματος Ο/Σ.... 410 20.4 Μια βελτιωμένη έκδοση του διαγράμματος Ο/Σ, σε σύγκριση με το 20.3: τοποθέτηση πρωτεύοντος και ξένου κλειδιού στο σύνολο οντοτήτων παιδί... 411 20.5 Η τελική έκδοση του διαγράμματος Ο/Σ, με το παιδί ως ασθενές σύνολο οντοτήτων... 411 20.6 Εσφαλμένη τοποθέτηση της ημερομηνίας γέννησης ως πλειότιμης ιδιότητας στο σύνολο οντοτήτων μητέρα.... 413 20.7 Τα παιδιά ως πλειότιμη ιδιότητα της οντότητας μητέρα.... 414 20.8 Σχεδίαση του πίνακα children με το εργαλείο MySQL Query Browser.... 417
18 Κατάλογος Σχημάτων 20.9 Ερώτημα δημιουργίας πίνακα στο περιβάλλον της MS Access... 418 20.10 Δημιουργία του πίνακα mothers με τη σχεδίαση πινάκων στο περιβάλλον της MS Access.... 419 20.11 Σχεδίαση του πίνακα children στην MS Access. Προσέξτε τον ορισμό του πεδίου αυτόματης αρίθμησης... 419 20.12 Συσχέτιση πρωτεύοντος και ξένου κλειδιού για την επιβολή περιορισμού Ν:1... 420 20.13 Το παράθυρο Σχέσεις με τη συσχέτιση πρωτεύοντος/ξένου κλειδιού για την επιβολή περιορισμού Ν:1... 421 20.16 Εργασία με ερωτήματα στο περιβάλλον MySQL Query Browser, εδώ εκτέλεση του ερωτήματος «Να βρεθούν όλες οι λεπτομέρειες από τις μητέρες»... 423 20.17 Δόμηση επιλογών για το πεδίο gender του πίνακα children, στο περιβάλλον Σχεδίασης πινάκων της MS ACCESS... 430 20.18 Δήλωση περιορισμού για το πεδίο weight του πίνακα children, στο περιβάλλον σχεδίασης πινάκων της MS ACCESS... 432 20.19 Δήλωση προεπιλεγμένης (DEFAULT) τιμής για το πεδίο birthdate του πίνακα children, στο περιβάλλον σχεδίασης πινάκων της MS ACCESS.... 433 20.20 Επιλογή συναρτήσεων από την εργαλειοθήκη δόμησης εκφράσεων της MS ACCESS... 434 20.21 Προγραμματισμός του πεδίου adt του πίνακα children ώστε οι τιμές του να αναζητούνται από τη λίστα τιμών του πεδίου adt του πίνακα mothers.... 434 20.22 Προγραμματισμός αναζήτησης τιμών ξένου κλειδιού, στο παράδειγμά μας του αριθμού ταυτότητας της μητέρας, μέσα από μια δεδομένων για το ξένο κλειδί του πίνακα children... 436 20.23 Αποθήκευση ερωτήματος για τη δημιουργία μιας όψης.... 437 20.24 Αποθήκευση ερωτήματος για τη δημιουργία μιας όψης, εδώ για τα παιδιά, με αύξουσα ταξινόμηση ως προς την ημερομηνία γέννησης... 438 20.25 Σχεδίαση παραμετρικού ερωτήματος στην MS ACCESS, εδώ ενός ερωτήματος για τα παιδιά μιας μητέρας με βάση τον αριθμό ταυτότητας που πληκτρολογεί ο χρήστης.... 439
Κατάλογος Σχημάτων 19 20.26 Εκτέλεση ενός παραμετρικού ερωτήματος, εδώ για το παράδειγμα αναζήτησης παιδιών με βάση τον αριθμό ταυτότητας της μητέρας... 440 20.27 Αποτελέσματα της εκτέλεσης του ερωτήματος από το 20.25, με τιμή παραμέτρου ΕΤ749001... 440 20.28 Εσωτερική σύζευξη μητέρων και παιδιών, με σχεδίαση του ερωτήματος στο περιβάλλον της MS ACCESS.... 441 20.29 Τα αποτελέσματα του ερωτήματος από το 20.28... 442 20.30 Σχεδίαση ερωτήματος εξωτερικής σύνδεσης στο περιβάλλον της MS ACCESS... 443 20.31 Αποτέλεσμα ενός ερωτήματος εξωτερικής σύζευξης. Παρατηρήστε ότι μια εγγραφή από τον πίνακα mothers δεν έχει αντίστοιχη εγγραφή στον πίνακα children. Η εγγραφή μπαίνει στο αποτέλεσμα και τα πεδία του πίνακα children συμπληρώνονται με τιμές NULL.... 444 20.32 Πλήθος γεννήσεων ανά μητέρα... 445 20.33 Τοποθέτηση του αποτελέσματος του ερωτήματος από το 20.23 σε έκθεση της MS ACCESS.... 445 20.34 Οθόνη προβολής και επεξεργασίας δεδομένων του πίνακα children... 447 20.35 Διαχείριση όλων των δεδομένων της βάσης μέσα από τη φόρμα mothers... 448 20.37 Μετασχηματισμός του διαγράμματος από το 20.1.... 452 20.38 Το διάγραμμα Ο/Σ μετά τις αλλαγές.... 453
ΚΕΦΑΛΑΙΟ 10 Ερωτήματα επιλογής με σύζευξη πινάκων Το κεφάλαιο αυτό σας εισάγει στον πραγματικό κόσμο των σχεσιακών βάσεων δεδομένων. Τα ερωτήματα που θα συναντήσετε έχουν πολλούς πίνακες στη φράση FROM, οι οποίοι μπορούν να συνδέονται με πολλούς διαφορετικούς τρόπους. Ο βασικότερος τρόπος, βέβαια, είναι η εσωτερική ή φυσική σύζευξη. Όλες οι γνώσεις που αποκτήσατε στα προηγούμενα κεφάλαια ισχύουν πλήρως, ανεξάρτητα από το γεγονός της χρησιμοποίησης ενός ή περισσότερων πινάκων στη φράση FROM. Αν κατανοήσετε αυτό το κεφάλαιο, θα μπορείτε: Να εκτελείτε ερωτήματα ανάσυρσης (επιλογής) δεδομένων από πολλούς πίνακες. Να εφαρμόζετε κατάλληλες συνδέσεις (JOIN) στους πίνακες. Να εκτελείτε ερωτήματα που αντιστοιχούν στις σχεσιακές πράξεις καρτεσιανού γινομένου, σύζευξης, τομής, διαφοράς, και διαίρεσης. Να γνωρίζετε τις διαφορές και τις ομοιότητες ανάμεσα στους διαφορετικούς τύπους συνδέσεων. Ανοίξτε λοιπόν την καρδιά και το μυαλό σας, και διαβάστε! 233
234 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων 10.1 Καρτεσιανό γινόμενο και σύζευξη Ήρθε λοιπόν η στιγμή να μιλήσουμε για τη χρήση πολλών πινάκων στα ερωτήματα επιλογής δεδομένων. Καταρχήν, ας ξεκαθαρίσουμε κάτι πολύ βασικό: ό,τι ισχύει για τα ερωτήματα με έναν πίνακα ισχύει και για τα ερωτήματα με περισσότερους πίνακες. Το μόνο που αλλάζει είναι το γεγονός ότι η φράση FROM ακολουθείται από περισσότερους πίνακες, έτσι υπάρχουν περισσότερα διαθέσιμα πεδία στις άλλες φράσεις, π.χ. στην φράση SELECT. Επομένως, η πιο απλή εντολή SQL που μπορούμε να γράψουμε είναι να τοποθετήσουμε απλώς δύο ονόματα πινάκων μετά τη φράση FROM, τα οποία (όπως και τα πεδία μετά τη φράση SELECT) χωρίζονται με κόμματα. Για παράδειγμα, για να βρούμε όλες τις λεπτομέρειες των τμημάτων(departments) και των υπάλληλων τους (employees) χρησιμοποιούμε την εντολή: departments employees 1 SELECT * 2 FROM departments, employees; 3 4 depid depname manager empid lastname depid 5 ---------------------------------------------------------------- 6 1 Διοίκησης/Επίβλεψης 109 243 Παπαδοπούλου 2 7 2 Οικονομoλόγων/Λογιστών 153 243 Παπαδοπούλου 2 8 3 Επιστημόνων/Μηχανικών 431 243 Παπαδοπούλου 2 9 4 Εξωτερικών συνεργατών 230 243 Παπαδοπούλου 2 10 5 Γραμματείας 234 243 Παπαδοπούλου 2 11 6 Μάνατζμεντ/Πωλήσεων 189 243 Παπαδοπούλου 2 12 1 Διοίκησης/Επίβλεψης 109 234 Θεοτοκάτου 5 13 2 Οικονομoλόγων/Λογιστών 153 234 Θεοτοκάτου 5 14 3 Επιστημόνων/Μηχανικών 431 234 Θεοτοκάτου 5 15 4 Εξωτερικών συνεργατών 230 234 Θεοτοκάτου 5 16 5 Γραμματείας 234 234 Θεοτοκάτου 5 17 6 Μάνατζμεντ/Πωλήσεων 189 234 Θεοτοκάτου 5 18... Αυτό είναι ένα ερώτημα ανάκλησης δεδομένων από δύο πίνακες. Για οικονομία χώρου, δεν εμφανίζονται όλα τα πεδία από τον πίνακα employees. Επιστρέφονται όλες οι εγγραφές των δύο πινάκων, χωρίς να γίνει κανένας έλεγχος για το ταίριασμα εγγραφών. Το αποτέλεσμα είναι γνωστό ως καρτεσιανό γινόμενο των πινάκων
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 235 employees και departments, και επιστρέφει στο αποτέλεσμα όλους τους πιθανούς συνδυασμούς εγγραφών μεταξύ των δύο πινάκων: κάθε εγγραφή του ενός πίνακα εμφανίζεται τόσες φορές όσες είναι και οι εγγραφές του άλλου πίνακα. Για παράδειγμα, παρατηρήστε ότι η κ. Παπαδοπούλου εμφανίζεται 6 φορές στο αποτέλεσμα, μία για κάθε ξεχωριστό τμήμα. Το ίδιο συμβαίνει και για την κ. Θεοτοκάτου, όπως και για όλους τους άλλους υπαλλήλους: φαίνονται να εργάζονται σε όλα τα τμήματα! Επίσης, αν το δει κανείς από τη σκοπιά του τμήματος, θα διαπιστώσει κάτι αντίστοιχο: σε κάθε τμήμα φαίνεται να απασχολούνται όλοι οι υπάλληλοι! Το καρτεσιανό γινόμενο παράγει όλους τους πιθανούς συνδυασμούς. Με άλλα λόγια, αν οι δύο πίνακες έχουν N και M εγγραφές αντίστοιχα, το αποτέλεσμα του ερωτήματος έχει N*M εγγραφές. Το αποτέλεσμα αυτό, ως τελικό αποτέλεσμα και όχι ως πιθανό ενδιάμεσο αποτέλεσμα, φυσιολογικά δεν θα πρέπει να σας ικανοποιεί. Το αποτέλεσμα περιέχει τόσο το πεδίο employees.depid, όσο και το departments.depid. Παρατηρήστε ότι δεν υπάρχει αντιστοιχία, παρά μόνο σε λίγες περιπτώσεις. Αυτό συμβαίνει επειδή υπάρχουν εγγραφές όπου ο κωδικός του τμήματος των υπαλλήλων από τον πίνακα employees δεν είναι ίσος με τον κωδικό του τμήματος από τον πίνακα departments. Είναι γνωστό όμως, από τη σχεδίαση της βάσης δεδομένων, ότι κάτι τέτοιο δεν ισχύει. Αυτό που συμβαίνει είναι ότι το κάθε τμήμα έχει πολλούς υπαλλήλους, αλλά ο κάθε υπάλληλος εργάζεται σε ένα μόνο τμήμα (συσχέτιση ένα προς πολλά). Όπως μάλλον έχετε ήδη καταλάβει, τα «πραγματικά» δεδομένα αντιστοιχούν σε εκείνες τις εγγραφές όπου ο κωδικός του τμήματος των υπαλλήλων από τον πίνακα employees ταυτίζεται με τον κωδικό του τμήματος από τον πίνακα departments. Πώς μπορούμε να ζητήσουμε να μη συμπεριληφθούν οι μη συσχετιζόμενες εγγραφές στο αποτέλεσμα; Η, για να το πούμε με διαφορετικά λόγια, πως είναι δυνατόν να συμπεριλάβουμε στο αποτέλεσμα μόνο τις συσχετιζόμενες εγγραφές και να αποκλείσουμε όλες τις άλλες; Με τη φράση WHERE. Για να απαντήσουμε λοιπόν στην ερώτηση εύρεσης όλων των λεπτομερειών από τους πίνακες employees και departments, θα πρέπει να γράψουμε: σ departments.depid = employees.depid (departments employees) 1 SELECT * 2 FROM departments, employees; 3 WHERE departments.depid = employees.depid;
236 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων 4 depid depname manager empid lastname depid 5 ---------------------------------------------------------------- 6 2 Οικονομoλόγων/Λογιστών 153 243 Παπαδοπούλου 2 7 5 Γραμματείας 234 234 Θεοτοκάτου 5 8 3 Επιστημόνων/Μηχανικών 431 412 Περρής 3 9 1 Διοίκησης/Επίβλεψης 109 109 Αθανασίου 1 10 3 Επιστημόνων/Μηχανικών 431 543 Βίσκας 3 11 6 Μάνατζμεντ/Πωλήσεων 189 189 Αγγελίνας 6 12 3 Επιστημόνων/Μηχανικών 431 172 Βλάσσης 3 13 2 Οικονομoλόγων/Λογιστών 153 419 Αρβανιτάκης 2 14 3 Επιστημόνων/Μηχανικών 431 435 Παύλου 3 15 6 Μάνατζμεντ/Πωλήσεων 189 835 Πετράκης 6 16... Το οποίο αντιστοιχεί στη σχεσιακή πράξη της φυσικής σύζευξης: departments employees Αυτό είναι το πρώτο σας ερώτημα που ανασύρει δεδομένα από δύο πίνακες κάνοντας χρήση της σύζευξης θ. Έτσι λοιπόν, η τοποθέτηση δύο πινάκων στη φράση FROM, σε συνδυασμό με τη φράση WHERE όπου τοποθετείται το κριτήριο συσχέτισης εγγραφών ανάμεσα στους δύο πίνακες, κάνει δυνατή την απαλοιφή των μη συσχετιζόμενων εγγραφών από το καρτεσιανό γινόμενο: το αποτέλεσμα είναι η σύζευξη των δύο πινάκων. Παρατηρήστε ότι οι τιμές στο πεδίο depid τόσο του πίνακα departments όσο και του πίνακα employees (1 η και 6 η στήλη, αντίστοιχα) ταυτίζονται. Κατά το πρότυπο SQL1, η σύζευξη ανάμεσα σε πίνακες γίνεται με τη χρήση της φράσης WHERE: εκεί δηλώνουμε την παράσταση με βάση των οποία θα γίνει η σύζευξη. Συνήθως αυτή περιλαμβάνει μια συνθήκη ισότητας (ταύτισης) ανάμεσα σε τιμές πεδίων, και έτσι αναφέρεται ως ισοσύζευξη (equi-join). Για παράδειγμα: 1 SELECT * 2 FROM departments, employees; 3 WHERE departments.depid = employees.depid; ενώ το πρότυπο SQL2 1 χρησιμοποιεί ένα νέο τρόπο σύνταξης και η σύζευξη γράφεται ολόκληρη στη φράση FROM: 1 Αυτό είναι που κατά κύριο λόγο χρησιμοποιείται σήμερα, η ANSI-SQL92 ή SQL2.
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 237 1 SELECT * 2 FROM departments INNER JOIN employees 3 ON departments.depid = employees.depid; Αυτός ο τρόπος σύνταξης είναι πιο ευκρινής από τη μέθοδο της SQL1. Δυστυχώς όμως, κάποια εμπορικά προϊόντα (π.χ. η Oracle) δεν τον υποστηρίζουν. Μπορείτε να γράφετε τις συζεύξεις όπως θέλετε, συνιστάται όμως να ακολουθείται το στυλ της SQL2. Στις περισσότερες περιπτώσεις, όπως και σε αυτή, η σύζευξη γίνεται με τη χρήση ενός πρωτεύοντος και ενός ξένου κλειδιού. Για παράδειγμα, στο προηγούμενο ε- ρώτημα το πεδίο departments.depid είναι το πρωτεύον κλειδί του πίνακα departments, και το πεδίο employees.depid είναι το ξένο κλειδί του πίνακα employees. Ωστόσο, από την πλευρά του συντακτικού της SQL, δεν υπάρχει κανένας τέτοιος περιορισμός. Μπορείτε να γράφετε παραστάσεις συζεύξεων με όποια πεδία θέλετε. Αν το ονόματα των πεδίων είναι ίδια, όπως π.χ. depid, μπορείτε να γράψετε τη σύζευξη και ως: 1 SELECT * 2 FROM departments INNER JOIN employees using(depid) η οποία μπορεί να διαβαστεί ως «σύζευξη του πίνακα employees με τον πίνακα departments με βάση το πεδίο depid». Δηλαδή, θέλουμε να γίνει σύνδεση εκείνων των εγγραφών του πίνακα employees με εκείνες τις εγγραφές του πίνακα departments στις οποίες ταυτίζεται η τιμή του κοινού, στους δύο πίνακες, πεδίου depid. Αυτό είναι γνωστό στη σχεσιακή άλγεβρα ως εσωτερική σύζευξη. Τονίζουμε ότι αυτός ο τρόπος γραφής απαιτεί να είναι κοινό (το ίδιο) και στους δύο πίνακες το όνομα του πεδίου με βάση το οποίο γίνεται η σύζευξη. Παρόλο που το αποτέλεσμα, όσον αφορά τις εγγραφές, είναι το ίδιο και με τους τρεις τρόπους: 1. 1 FROM employees, departments 2 WHERE employees.depid = departments.depid; 2. 1 FROM employees INNER JOIN departments 2 ON employees.depid = departments.depid;
238 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων 3. 1 FROM employees INNER JOIN departments using(depid) ο τρίτος τρόπος διαφέρει από τους δύο πρώτους όσον αφορά το σχήμα του αποτελέσματος, δηλαδή τα πεδία του αποτελέσματος. Στις δύο πρώτες περιπτώσεις το κοινό πεδίο (depid) θα υπάρχει δύο φορές στο αποτέλεσμα: μία από τον πίνακα departments και μία από τον πίνακα employees. Αντιθέτως, με τον τρίτο τρόπο το πεδίο depid θα υπάρχει στο αποτέλεσμα μόνο μία φορά. 10.2 Ψευδώνυμα πινάκων Όπως με τον τελεστή AS μπορούμε να αλλάξουμε το ονόματα πεδίων στη φράση SELECT, έτσι μπορούμε να κάνουμε το ίδιο και στη φράση FROM: 1 SELECT e.empid, e.lastname, d.depname 2 FROM employees AS e, departments AS d 3 WHERE e.depid = d.depid; 4 5 empid lastname depname 6 ------------------------------------------ 7 109 Αθανασίου Διοίκησης/Επίβλεψης 8 502 Μαροπούλου Διοίκησης/Επίβλεψης 9 901 Ρούσσης Διοίκησης/Επίβλεψης 10 153 Αλεβιζάτου Οικονομoλόγων/Λογιστών 11 243 Παπαδοπούλου Οικονομoλόγων/Λογιστών 12 419 Αρβανιτάκης Οικονομoλόγων/Λογιστών 13 503 Κρέσπα Οικονομoλόγων/Λογιστών 14 172 Βλάσσης Επιστημόνων/Μηχανικών 15 205 Μακρής Επιστημόνων/Μηχανικών 16 412 Περρής Επιστημόνων/Μηχανικών 17... Στη φράση FROM το AS δεν είναι απαραίτητο και μπορούμε να το παραλείψουμε: 1 SELECT e.empid, e.lastname, d.depname 2 FROM employees e, departments d 3 WHERE e.depid = d.depid;
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 239 Προσοχή, βέβαια, στα κόμματα! Ανάμεσα στο όνομα του πίνακα και στο ψευδώνυμό του δεν υπάρχει κόμμα. Ανάμεσα στους διαφορετικούς πίνακες υπάρχουν κόμματα. Εκτός βέβαια και αν γράψουμε τη φράση με το πρότυπο ANSI-SQL: 1 SELECT e.empid, e.lastname, d.depname 2 FROM employees e INNER JOIN departments d ON e.depid = d.depid; Δεν είναι υποχρεωτικό να ακολουθείται τον έναν ή τον άλλον τρόπο. Πειραματιστείτε με τις διάφορες παραλλαγές, βρείτε το στυλ που σας ταιριάζει, και ακολουθήστε το! 10.3 Ερωτήματα σε πίνακες με συσχέτιση ένα προς πολλά Στο σχεσιακό μοντέλο, δύο πίνακες συσχετίζονται με πληθικότητα ένα προς πολλά μέσω ενός ξένο κλειδιού: στο παράδειγμά μας, ο κωδικός τμήματος από τον πίνακα departments τοποθετείται στον πίνακα employees ως ξένο κλειδί. Έτσι ξέρουμε πως, όταν λέμε ότι ο υπάλληλος με κωδικό 780 εργάζεται στο τμήμα με κωδικό 5 ο οποίος αντιστοιχεί (μέσω του πίνακα departments) στο τμήμα με όνομα «Γραμματεία», εννοούμε ότι ο υπάλληλος αυτός εργάζεται στη Γραμματεία και όχι κάπου αλλού! Αυτό προκύπτει από τη δήλωση το πεδίο depid είναι ξένο κλειδί και προέρχεται από τον πίνακα departments. Επειδή ένα τμήμα μπορεί (σύμφωνα με τη σχεδίαση της βάσης δεδομένων) να έχει πολλούς υπαλλήλους αλλά ο κάθε υπάλληλος εργάζεται σε ένα τμήμα, το σχεσιακό μοντέλο υποδεικνύει ως λύση στην παραπάνω απαίτηση την τοποθέτηση ξένου κλειδιού στον πίνακα employees, το οποίο είναι το πρωτεύον κλειδί του πίνακα departments. Το ότι καμία εγγραφή στον πίνακα employees δεν μπορεί να έχει στο πεδίο depid τιμή που δεν υπάρχει στο πεδίο id του πίνακα departments είναι γνωστό ως κανόνας ακεραιότητας των αναφορών. Τα παραπάνω μας δείχνουν ότι στη σύζευξη ανάμεσα σε δύο πίνακες πρέπει, ε- κτός από να γράφουμε τους δύο πίνακες μετά τη φράση FROM, να συμπληρώνουμε σωστά τον τρόπο σύζευξης. Αυτό που έχουμε δει μέχρι στιγμής ονομάζεται εσωτερική σύζευξη ή ισοσύζευξη, επειδή χρησιμοποιεί τις ταυτιζόμενες τιμές α- νάμεσα σε δύο πεδία δύο διαφορετικών πινάκων για να σχηματίσει το αποτέλεσμα. Αυτή είναι και η πλέον συνηθισμένη περίπτωση, αλλά βέβαια δεν είναι και η
240 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων μοναδική. Αργότερα θα μάθουμε και άλλες συζεύξεις και υπάρχουν αρκετές τέτοιες!!! Όπως έχει ήδη ειπωθεί, όλα όσα ξέρετε για τα ερωτήματα ενός πίνακα ισχύουν και εδώ. Η μόνη προσοχή που πρέπει να δώσετε είναι στην περίπτωση πεδίων με ίδιο όνομα και στους δύο πίνακες, οπότε μπορεί να προκύψει σύγχυση. Για το λόγο αυτόν, καθώς και για άλλες παρόμοιες περιπτώσεις όπου μπορεί να προκληθεί σύγχυση ως προς τα ονόματα των πεδίων, η SQL υποστηρίζει τη σύνταξη πίνακας.πεδίο. Με τον τρόπο αυτόν είναι δυνατό να δηλώσουμε με ακρίβεια και σαφήνεια το κάθε συγκεκριμένο πεδίο, οπουδήποτε και αν ανήκει. Ο τρόπος αυτός μπορεί να ακολουθείται πάντα για λόγους ευκρίνειας, ακόμα και αν δεν υπάρχει κίνδυνος να προκληθεί σύγχυση. Έτσι, για να βρούμε τον κωδικό και το επώνυμο όλων των υπαλλήλων, καθώς και το όνομα του τμήματος στο οποίο εργάζονται, θα γράψουμε: Π empid, lastname, depname (departments employees) 1 SELECT employees.empid, employees.lastname, departments.depname 2 FROM employees INNER JOIN departments 3 ON employees.depid = departments.depid; 4 empid lastname depname 5 ----------------------------------------------- 6 243 Παπαδοπούλου Οικονομoλόγων/Λογιστών 7 234 Θεοτοκάτου Γραμματείας 8 412 Περρής Επιστημόνων/Μηχανικών 9 109 Αθανασίου Διοίκησης/Επίβλεψης 10 543 Βίσκας Επιστημόνων/Μηχανικών 11 189 Αγγελίνας Μάνατζμεντ/Πωλήσεων 12 172 Βλάσσης Επιστημόνων/Μηχανικών 13 419 Αρβανιτάκης Οικονομoλόγων/Λογιστών 14 435 Παύλου Επιστημόνων/Μηχανικών 15 835 Πετράκης Μάνατζμεντ/Πωλήσεων 16... ή ισοδύναμα: Π empid, lastname, depname (σ departments.depid = employees.depid (departments employees)) 1 SELECT employees.empid, employees.lastname, departments.depname 2 FROM employees, departments 3 WHERE employees.depid = departments.depid;
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 241 Το κοινό πεδίο depid, με βάση το οποίο γίνεται η σύζευξη, δεν εμφανίζεται στο αποτέλεσμα. Μην ανησυχείτε, δεν είναι καθόλου απαραίτητο κάτι τέτοιο. Ο χρήστης έχει το δικαίωμα το τοποθετήσει όποια και όσα πεδία θέλει μετά τη φράση SELECT, αρκεί τα πεδία να είναι διαθέσιμα από τους πίνακες που υπάρχουν στη φράση FROM. Στο προηγούμενο ερώτημα, παρατηρήστε ότι το όνομα του τμήματος εμφανίζεται πολλές φορές. Το ίδιο θα συνέβαινε και με τον κωδικό του τμήματος, αν υπάρχει η ανάλογη φράση SELECT. Πολλοί ρωτούν στο σημείο αυτό γιατί συμβαίνει κάτι τέτοιο, γιατί δηλαδή πεδία που έχουν μοναδικές τιμές, όπως το depname ή ακόμα το depid του πίνακα departments, χάνουν αυτή την ιδιότητα και εμφανίζονται να παίρνουν πολλές φορές την ίδια τιμή, όπως π.χ. το πεδίο depid του πίνακα employees. Πρέπει να καταλάβετε, στο σημείο αυτό, ότι η σύζευξη του πίνακα departments (με πρωτεύον κλειδί departments.depid) με τον πίνακα employees (με ξένο κλειδί employees.depid) έχει ως αποτέλεσμα την απώλεια της ιδιότητας της μοναδικότητας για το πεδίο departments.depid. Το πεδίο αυτό έχει μοναδικές τιμές, όπως έχει σχεδιαστεί να έχει, σε όλα τα ερωτήματα όπου η φράση FROM περιέχει μόνο τον πίνακα departments. Για παράδειγμα, το ερώτημα: 1 SELECT * 2 FROM departments 3 WHERE depid = 3; 4 5 depid depname manager 6 --------------------------------------- 7 3 Επιστημόνων/Μηχανικών 431 θα επιστρέψει μόνο μία φορά το τμήμα με κωδικό 3, όπως βέβαια είναι το σωστό. Ωστόσο, το ερώτημα: 1 SELECT departments.* 2 FROM employees INNER JOIN departments 3 ON employees.depid = departments.depid 4 WHERE departments.depid = 3; 5 6 depid depname manager 7 --------------------------------------
242 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων 8 3 Επιστημόνων/Μηχανικών 431 9 3 Επιστημόνων/Μηχανικών 431 10 3 Επιστημόνων/Μηχανικών 431 11 3 Επιστημόνων/Μηχανικών 431 12 3 Επιστημόνων/Μηχανικών 431 13 3 Επιστημόνων/Μηχανικών 431 14 3 Επιστημόνων/Μηχανικών 431 θα επιστρέψει 7 εγγραφές. Αυτό συμβαίνει επειδή στον πίνακα employees υπάρχουν 7 εγγραφές με depid=3, οπότε το αποτέλεσμα μετά τη σύζευξη έχει 7 εγγραφές. Προφανώς η ιδιότητα της μοναδικότητας κάθε εγγραφής χάθηκε στο αποτέλεσμα όμως συνεχίζει βέβαια να υπάρχει στον πίνακα departments. Όμως το ερώτημα δεν ζητάει δεδομένα από τον πίνακα departments, αλλά από τον πίνακα που προκύπτει μετά τη σύζευξη του πίνακα departments με τον πίνακα employees. Αυτό είναι που κάνει τη διαφορά! Σε τέτοιες περιπτώσεις όπου ζητούνται δεδομένα στη φράση SELECT από έναν πίνακα ενώ στη φράση FROM υπάρχουν πολλοί πίνακες, τότε πιθανώς να χρειάζεται ο προσδιορισμός DISTINCT: 1 SELECT DISTINCT departments.* 2 FROM employees INNER JOIN departments 3 ON employees.depid = departments.depid 4 WHERE departments.depid = 3; 5 6 depid depname manager 7 -------------------------------------- 8 3 Επιστημόνων/Μηχανικών 431 Πότε χρειάζεται το DISTINCT; Όταν σε μια συσχέτιση ένα προς πολλά, όπως στο προηγούμενο παράδειγμα, η φράση SELECT ακολουθείται μόνο από πεδία του πίνακα που φέρει το πρωτεύον κλειδί της συσχέτισης (εδώ το πεδίο departments. depid είναι πρωτεύον κλειδί, ενώ το πεδίο employees.depid έχει το ξένο κλειδί της συσχέτισης), τότε η φράση SELECT πρέπει να συνοδεύεται από τον προσδιορισμό DISTINCT. Αν υπάρχει έστω και ένα πεδίο από τον πίνακα employees μετά τη φράση SELECT, τότε ο προσδιορισμός DISTINCT είναι περιττός. Για παράδειγμα, τα δύο επόμενα ερωτήματα έχουν ακριβώς το ίδιο αποτέλεσμα: Π lastname, depname, salary (σ salary > 1500 (departments employees))
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 243 1 SELECT DISTINCT e.lastname, d.depname, e.salary 2 FROM employees e INNER JOIN departments d ON e.depid = d.depid 3 WHERE e.salary > 1500; 4 5 lastname depname salary 6 ---------------------------------------------- 7 Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 8 Θεοτοκάτου Γραμματείας 1534.65 9 Αθανασίου Διοίκησης/Επίβλεψης 2787.69 10 Αγγελίνας Μάνατζμεντ/Πωλήσεων 1908.28 11 Μαροπούλου Διοίκησης/Επίβλεψης 1754.67 12 Ρούσσης Διοίκησης/Επίβλεψης 1852.99 Το ίδιο αποτέλεσμα θα ληφθεί και χωρίς τον προσδιορισμό DISTINCT: 1 SELECT e.lastname, d.depname, e.salary 2 FROM employees e INNER JOIN departments d ON e.depid = d.depid 3 WHERE e.salary > 1500; 4 5 lastname depname salary 6 --------------------------------------------- 7 Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 8 Θεοτοκάτου Γραμματείας 1534.65 9 Αθανασίου Διοίκησης/Επίβλεψης 2787.69 10 Αγγελίνας Μάνατζμεντ/Πωλήσεων 1908.28 11 Μαροπούλου Διοίκησης/Επίβλεψης 1754.67 12 Ρούσσης Διοίκησης/Επίβλεψης 1852.99 10.3.1 Ασκήσεις Στις επόμενες ερωτήσεις, όταν λέμε «τμήμα» εννοούμε το όνομα του τμήματος από τον πίνακα departments. Με απαντήσεις 1. Να βρεθούν τα ονόματα, το τμήμα, και ο μισθός όλων των υπαλλήλων. Π firstname, lastname, depname, salary (departments employees)
244 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων 1 SELECT e.firstname, e.lastname, d.depname, e.salary 2 FROM employees e INNER JOIN departments d ON e.depid = d.depid; 3 4 firstname lastname depname salary 5 ------------------------------------------------------- 6 Μαρία Αθανασίου Διοίκησης/Επίβλεψης 2787.69 7 Κρινιώ Μαροπούλου Διοίκησης/Επίβλεψης 1754.67 8 Κυριάκος Ρούσσης Διοίκησης/Επίβλεψης 1852.99 9 Μαρία Αλεβιζάτου Οικονομoλόγων/Λογιστών 1321.92 10 Δέσποινα Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 11 Πέτρος Αρβανιτάκης Οικονομoλόγων/Λογιστών 1323.80 12 Μαριλένα Κρέσπα Οικονομoλόγων/Λογιστών 1105.04 13 Χρήστος Βλάσσης Επιστημόνων/Μηχανικών 1101.70 14 Ηλίας Μακρής Επιστημόνων/Μηχανικών 1050.96 15 Αριστείδης Περρής Επιστημόνων/Μηχανικών 1320.83 16... 2. Να βρεθούν τα ονόματα, το τμήμα, και ο μισθός όλων των υπαλλήλων με μισθό μεταξύ 1050 και 1300. Π firstname, lastname, depname, salary (σ salary 1050 salary 1300 (departments employees)) 1 SELECT e.firstname, e.lastname, d.depname, e.salary 2 FROM employees e INNER JOIN departments d ON e.depid = d.depid 3 WHERE e.salary BETWEEN 1050 AND 1300; 4 5 firstname lastname depname salary 6 --------------------------------------------------------- 7 Χρήστος Βλάσσης Επιστημόνων/Μηχανικών 1101.70 8 Αντώνης Παύλου Επιστημόνων/Μηχανικών 1231.62 9 Μαριλένα Κρέσπα Οικονομoλόγων/Λογιστών 1105.04 10 Κώστας Παπαδόπουλος Επιστημόνων/Μηχανικών 1100.23 11 Νίκος Βλάχος Εξωτερικών συνεργατών 1102.04 12 Περικλής Κιτσάκης Μάνατζμεντ/Πωλήσεων 1100.13 13 Νικηφόρος Διαμαντίδης Μάνατζμεντ/Πωλήσεων 1212.50 14 Βασιλική Περδίκη Επιστημόνων/Μηχανικών 1053.54 3. Να βρεθεί ο κωδικός και το όνομα όλων των υπαλλήλων που απασχολούνται στο έργο με κωδικό 38, με αύξουσα ταξινόμηση ως προς το επώνυμο. Π empid, firstname, lastname (σ proid = 38 (employees workson))
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 245 1 SELECT e.empid, e.firstname, e.lastname 2 FROM employees e INNER JOIN workson w ON e.empid = w.empid 3 WHERE w.proid = 38 4 ORDER BY e.lastname ASC; 5 6 empid firstname lastname 7 --------------------------------- 8 153 Μαρία Αλεβιζάτου 9 102 Νικηφόρος Διαμαντίδης 10 234 Αδαμαντία Θεοτοκάτου 11 503 Μαριλένα Κρέσπα 12 502 Κρινιώ Μαροπούλου 13 243 Δέσποινα Παπαδοπούλου 14 835 Αθανάσιος Πετράκης 15 901 Κυριάκος Ρούσσης 16 230 Βαγγέλης Χριστόπουλος 4. Να βρεθούν τα ονόματα, το όνομα του τμήματος, και ο μισθός όλων των υ- παλλήλων που εργάζονται στα τμήματα με κωδικό 2 ή 4 και έχουν μισθό μεγαλύτερο από 1200. Π firstname, lastname, depname, salary (σ( depid = 2 depid = 4) salary > 1200 (departments employees)) 1 SELECT e.firstname, e.lastname, d.depname, e.salary 2 FROM employees e INNER JOIN departments d ON e.depid = d.depid 3 WHERE e.depid IN (2,4) 4 AND e.salary > 1200; 5 6 firstname lastname depname salary 7 ---------------------------------------------------------- 8 Δέσποινα Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 9 Πέτρος Αρβανιτάκης Οικονομoλόγων/Λογιστών 1323.80 10 Μαρία Αλεβιζάτου Οικονομoλόγων/Λογιστών 1321.92 11 Νίκος Στεργιόπουλος Εξωτερικών συνεργατών 1386.05 5. Να βρεθούν τα ονόματα, το τμήμα, και ο μισθός όλων των υπαλλήλων που εργάζονται στα τμήματα με κωδικό 2 ή 5 και έχουν μισθό μεγαλύτερο από 1200, με φθίνουσα ταξινόμηση ως προς το μισθό. Π firstname, lastname, depname, salary (σ( depid = 2 depid = 5) salary > 1200 (departments employees))
246 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων 1 SELECT e.firstname, e.lastname, d.depname, e.salary 2 FROM employees e INNER JOIN departments d ON e.depid = d.depid 3 WHERE e.depid IN (2,5) 4 AND e.salary > 1200 5 ORDER BY e.salary DESC; 6 7 firstname lastname depname salary 8 --------------------------------------------------------- 9 Δέσποινα Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 10 Αδαμαντία Θεοτοκάτου Γραμματείας 1534.65 11 Πέτρος Αρβανιτάκης Οικονομoλόγων/Λογιστών 1323.80 12 Μαρία Αλεβιζάτου Οικονομoλόγων/Λογιστών 1321.92 6. Να βρεθούν τα ονόματα των τμημάτων 2 στα οποία έγιναν προσλήψεις μέσα στο 2003. Π depname (σ hiredate '2003-01-01' hiredate '2003-12-31' (departments employees)) 1 SELECT DISTINCT d.depname 2 FROM employees e, departments d 3 WHERE e.depid=d.depid 4 AND e.hiredate BETWEEN '2003-01-01' AND '2003-12-31'; 5 6 depname 7 ------------------------ 8 Μάνατζμεντ/Πωλήσεων 9 Επιστημόνων/Μηχανικών Ή, με τη συνάρτηση YEAR(): 1 SELECT d.name 2 FROM employees e, departments d 3 WHERE e.depid = d.depid 4 AND YEAR(d.hiredate) = 2003; 2 Προσοχή, χρειάζεται το DISTINCT. Γιατί όμως; Επειδή ο πίνακας departments συμμετέχει στη συσχέτιση ένα προς πολλά, υπάρχουν πολλοί υπάλληλοι που ενδεχομένως να έχουν προσληφθεί στο ίδιο τμήμα μέσα στο 2003.
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 247 7. Να βρεθεί το όνομα και ο μισθός όλων των υπαλλήλων του τμήματος με κωδικό 6 οι οποίοι απασχολούνται στο έργο με κωδικό 14, με φθίνουσα ταξινόμηση ως προς το μισθό. Π firstname, lastname, salary (σ proid = 5 (employees workson)) 1 SELECT e.firstname, e.lastname, e.salary 2 FROM employees e INNER JOIN workson w ON e.empid = w.empid 3 WHERE w.proid = 5 4 ORDER BY e.salary DESC; 5 6 firstname lastname salary 7 ------------------------------ 8 Κυριάκος Ρούσσης 1852.99 9 Μανώλης Βίσκας 1321.77 10 Αριστείδης Περρής 1320.83 11 Χρήστος Βλάσσης 1101.70 8. Να βρεθεί ο κωδικός, η ημερομηνία έναρξης, και ο προϋπολογισμός όλων των έργων στα οποία συμμετέχουν οι υπάλληλοι με κωδικούς 419, 230, και 234, με αύξουσα ταξινόμηση ως προς την ημερομηνία έναρξης των έργων. Π proid, startdate, budget (σ empid =419 empid = 230 empid = 234 (projects workson)) 1 SELECT DISTINCT p.proid, p.startdate, p.budget 2 FROM projects p INNER JOIN workson w ON p.proid = w.proid 3 WHERE w.empid IN (419, 230, 234) 4 ORDER BY p.startdate ASC; 5 6 proid startdate budget 7 ----------------------------- 8 43 2003-04-15 175000.00 9 21 2003-06-01 50000.00 10 14 2006-04-01 383500.00 11 12 2006-06-01 124000.00 12 38 2007-08-01 65000.00
248 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων Χωρίς απαντήσεις 1. Να βρεθούν τα τμήματα (κωδικός, όνομα) στα οποία εργάζονται υπάλληλοι που το επώνυμό τους αρχίζει από Α 3. 2. Να βρεθούν το ονόματα και το τμήμα των υπαλλήλων που είτε δεν αμείβονται με περισσότερα από 1500, είτε εργάζονται στο τμήμα 5. 3. Να βρεθούν τα ονόματα και το τμήμα των υπαλλήλων που προσελήφθησαν μέσα στο πρώτο εξάμηνο του 2004 και ο μισθός τους είναι μεγαλύτερος ή ί- σος των 1450. 4. Να βρεθούν τα τμήματα στα οποία εργάζονται υπάλληλοι με μισθό μικρότερο των 1100, χωρίς να συνυπολογιστούν οι υπάλληλοι του τμήματος 3. 5. Να βρεθούν τα τμήματα στα οποία εργάζονται υπάλληλοι με μισθό μεγαλύτερο ή ίσο των 1200. 10.4 Ερωτήματα σε πίνακες με συσχέτιση πολλά προς πολλά Όπως είναι γνωστό, οι συσχετίσεις πολλά προς πολλά απαιτούν την παρουσία ενός τρίτου πίνακα, ο οποίος περιέχει (τουλάχιστον) τα κλειδιά των δύο πινάκων που συμμετέχουν στη συσχέτιση. Για ένα τέτοιο ερώτημα θα χρειαστούν (τουλάχιστον) 3 πίνακες, οπότε πρέπει να γραφτούν (τουλάχιστον) 2 συνδέσεις JOIN. Στα περισσότερα Συστήματα Διαχείρισης Βάσεων Δεδομένων, οι συζεύξεις πρέπει να περικλείονται σε παρενθέσεις. Για παράδειγμα, έστω ότι θέλουμε να βρούμε τα ονόματα των υπαλλήλων, καθώς και τον κωδικό και τον προϋπολογισμό των έργων στα οποία συμμετέχουν, για τους υπαλλήλους με μισθό μεγαλύτερο από 1600 : Π firstname, lastname, proid, title (σ salary > 1700 (employees workson projects)) 1 SELECT e.firstname, e.lastname, p.proid, p.title 2 FROM (employees e INNER JOIN workson w ON e.empid = w.empid) 3 INNER JOIN projects p ON p.proid = w.proid 4 WHERE e.salary > 1700; 5 3 Προσοχή στην πληκτρολόγηση, τα ονόματα είναι με ελληνικούς χαρακτήρες.
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 249 6 firstname lastname proid title 7 --------------------------------------------------- 8 Μαρία Αθανασίου 14 Μελέτη και επίβλεψη κατασκευής... 9 θεόδωρος Αγγελίνας 14 Μελέτη και επίβλεψη κατασκευής... 10 θεόδωρος Αγγελίνας 21 Παροχή συμβουλευτικών υπηρεσιών... 11 θεόδωρος Αγγελίνας 43 Μελέτη οικονομικής βιωσιμότητας... 12 Κρινιώ Μαροπούλου 12 Επίβλεψη κατασκευής σταθμού... 13 Κρινιώ Μαροπούλου 21 Παροχή συμβουλευτικών υπηρεσιών... 14 Κρινιώ Μαροπούλου 38 Μελέτη εναλλακτικών λύσεων για... 15 Κυριάκος Ρούσσης 5 Επίβλεψη έρευνας για την αξιοποίηση... 16 Κυριάκος Ρούσσης 12 Επίβλεψη κατασκευής σταθμού... 17 Κυριάκος Ρούσσης 14 Μελέτη και επίβλεψη κατασκευής... 18 Κυριάκος Ρούσσης 21 Παροχή συμβουλευτικών υπηρεσιών... 19 Κυριάκος Ρούσσης 38 Μελέτη εναλλακτικών λύσεων για... 20 Κυριάκος Ρούσσης 43 Μελέτη οικονομικής βιωσιμότητας... Αυτό ακριβώς είναι το πολλά προς πολλά! Σε ένα έργο μπορούν να απασχολούνται πολλοί υπάλληλοι, αλλά και κάθε υπάλληλος μπορεί να απασχολείται σε πολλά έργα. Ο ενδιάμεσος πίνακας workson περιέχει αυτή την πληροφορία, δηλαδή ποιος υπάλληλος απασχολείται σε ποιο έργο, οπότε θα πρέπει να γίνει σύζευξή του και με τους δύο άλλους πίνακες, δηλαδή τους πίνακες employees και departments. Υπενθυμίζουμε ότι στη σύζευξη ισχύει η προσεταιριστική ιδιότητα, επομένως δεν έχει σημασία η σειρά με την οποία γράφουμε τις δύο συζεύξεις. Όπως και στη σύζευξη ένα προς πολλά, έτσι και τώρα το ερώτημα μπορεί ισοδύναμα να γραφεί και ως: Π firstname, lastname, proid, title (σ employees.empid = workson.empid projects.proid = workson.proid salary > 1700 (employees workson projects)) 1 SELECT e.firstname, e.lastname, p.proid, p.title 2 FROM employees e, workson w, projects p 3 WHERE e.empid = w.empid 4 AND p.proid = w.proid 5 AND e.salary > 1700; με ακριβώς το ίδιο αποτέλεσμα. Οι συζεύξεις μπορούν να περιλαμβάνουν και ακόμα περισσότερους πίνακες, ακολουθώντας την ίδια λογική. Για παράδειγμα, έστω ότι θέλουμε να βρούμε το όνομα των υπαλλήλων και του τμήματος των υπαλλήλων για όλους τους υπαλλήλους
250 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων που προσελήφθησαν μετά τις 1/1/2005 και απασχολούνται σε έργα με προϋπολογισμό πάνω από 100000 : Π firstname, lastname, depname (σ hiredate > '2004-01-01' budget > 100000 (departments employees workson projects)) 1 SELECT DISTINCT e.firstname, e.lastname, d.depname 2 FROM ((departments d INNER JOIN employees e ON d.depid = e.depid) 3 INNER JOIN workson w ON e.empid = w.empid) 4 INNER JOIN projects p ON p.proid = w.proid 5 WHERE e.hiredate > '2004-01-01' 6 AND p.budget > 100000; 7 8 firstname lastname depname 9 -------------------------------------------------- 10 Κυριάκος Ρούσσης Διοίκησης/Επίβλεψης 11 Πέτρος Αρβανιτάκης Οικονομoλόγων/Λογιστών 12 Αντώνης Παύλου Επιστημόνων/Μηχανικών 13 Βαγγέλης Χριστόπουλος Εξωτερικών συνεργατών 14 Παύλος Περίδης Εξωτερικών συνεργατών 10.4.1 Ασκήσεις Με απαντήσεις 1. Να βρεθούν τα ονόματα των υπαλλήλων και ο τίτλος του έργου όπου συμμετέχουν για τους υπαλλήλους του τμήματος 5. Π firstname, lastname, title (σ depid = 5 (employees workson projects)) 1 SELECT e.firstname, e.lastname, p.title 2 FROM (employees e INNER JOIN workson w ON e.empid = w.empid) 3 INNER JOIN projects p ON p.proid = w.proid 4 WHERE e.depid = 5; 5 6 firstname lastname title 7 ---------------------------------------------------------- 8 Αδαμαντία Θεοτοκάτου Μελέτη και επίβλεψη κατασκευής... 9 Αδαμαντία Θεοτοκάτου Μελέτη εναλλακτικών λύσεων για...
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 251 2. Να βρεθούν οι ημερομηνίες λήξης των έργων στα οποία συμμετέχουν υπάλληλοι του τμήματος 3, κατά αύξουσα ταξινόμηση. Π enddate (σ depid = 3 (employees workson projects)) 1 SELECT DISTINCT p.enddate 2 FROM (employees e INNER JOIN workson w ON e.empid = w.empid) 3 INNER JOIN projects p ON p.proid = w.proid 4 WHERE e.depid = 3 5 ORDER BY p.enddate; 6 7 enddate 8 ----------- 9 2005-05-31 10 2006-12-31 11 2007-05-31 12 2010-05-31 3. Να βρεθεί ο μεγαλύτερος μισθός υπαλλήλου που απασχολείται στο έργο με κωδικό 21. G max(salary) (σ proid = 21 (employees workson)) 1 SELECT MAX(salary) 2 FROM employees e INNER JOIN workson w ON e.empid = w.empid 3 WHERE w.proid = 21; 4 5 MAX(salary) 6 ------------ 7 1908.28 4. Να βρεθεί η πιο παλιά ημερομηνία έναρξης έργου στο οποίο συμμετέχει τουλάχιστον ένας υπάλληλος από το τμήμα 5. G min(startdate) (σ depid = 5 (employees workson projects)) 1 SELECT MIN(p.startdate) 2 FROM (employees e INNER JOIN workson w ON e.empid = w.empid) 3 INNER JOIN projects p ON p.proid = w.proid 4 WHERE e.depid = 5; 5
252 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων 6 MIN(p.startdate) 7 ----------------- 8 2006-04-01 5. Να βρεθεί ο τίτλος των έργων με προϋπολογισμό μεγαλύτερο των 100000 και το όνομα των υπαλλήλων του τμήματος 6 που απασχολούνται σε αυτά, με αύξουσα ταξινόμηση ως προς τον προϋπολογισμό του έργου και το μισθό του υπαλλήλου. 1 SELECT p.title, e.firstname, e.lastname 2 FROM (employees e INNER JOIN workson w ON e.empid = w.empid) 3 INNER JOIN projects p ON p.proid = w.proid 4 WHERE e.depid = 6 5 AND p.budget > 100000 6 ORDER BY p.budget, e.salary; 7 8 title firstname lastname 9 ---------------------------------------------------------- 10 Επίβλεψη κατασκευής σταθμού... Περικλής Κιτσάκης 11 Μελέτη οικονομικής βιωσιμότητας... θεόδωρος Αγγελίνας 12 Μελέτη και επίβλεψη κατασκευής... Αθανάσιος Πετράκης 13 Μελέτη και επίβλεψη κατασκευής... θεόδωρος Αγγελίνας 6. Να βρεθεί σε πόσα έργα συμμετέχει ο υπάλληλος με κωδικό 109, τα οποία να έχουν ποσοστό προόδου μεγαλύτερο από 50%. 1 SELECT COUNT(*) 2 FROM projects p INNER JOIN workson w ON p.proid = w.proid 3 WHERE w.empid = 109 4 AND p.progress > 50; 5 6 COUNT(*) 7 --------- 8 0 7. Να βρεθεί το όνομα των υπαλλήλων, η ημερομηνία έναρξης, και o τίτλος ό- λων των έργων όπου συμμετέχουν υπάλληλοι από τα τμήματα 3, 4, και 6 με μισθό μεταξύ 1000 και 1300 και οι οποίοι προσλήφθηκαν κατά τα έτη 2002 και 2003.
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 253 1 SELECT e.firstname, e.lastname, p.startdate, p.title 2 FROM (employees e INNER JOIN workson w ON e.empid = w.empid) 3 INNER JOIN projects p ON p.proid = w.proid 4 WHERE e.depid IN (3,4,6) 5 AND e.salary BETWEEN 1000 AND 1300 6 AND e.hiredate BETWEEN '2002-01-01' AND '2003-12-31'; 7 8 firstname lastname startdate title 9 ---------------------------------------------------------------- 10 Κώστας Παπαδόπουλος 2006-04-01 Μελέτη και επίβλεψη κατασκευής... 11 Κώστας Παπαδόπουλος 2003-06-01 Παροχή συμβουλευτικών υπηρεσιών... 12 Νίκος Βλάχος 2006-06-01 Επίβλεψη κατασκευής σταθμού... 13 Περικλής Κιτσάκης 2006-06-01 Επίβλεψη κατασκευής σταθμού... 14 Νικηφόρος Διαμαντίδης 2007-08-01 Μελέτη εναλλακτικών λύσεων για... 8. Να βρεθεί ο κωδικός και το όνομα όλων των υπαλλήλων που απασχολούνται σε έργα με ημερομηνία έναρξης μετά την ημερομηνία πρόσληψης του υπαλλήλου. 1 SELECT DISTINCT e.empid, e.firstname, e.lastname 2 FROM (employees e INNER JOIN workson w ON e.empid = w.empid) 3 INNER JOIN projects p ON p.proid = w.proid 4 WHERE e.hiredate > p.startdate; 5 6 empid firstname lastname 7 -------------------------------- 8 419 Πέτρος Αρβανιτάκης 9 435 Αντώνης Παύλου 10 901 Κυριάκος Ρούσσης 11 230 Βαγγέλης Χριστόπουλος 12 483 Ηρακλής Μανωλάκης 13 593 Παύλος Περίδης Χωρίς απαντήσεις 1. Να βρεθούν τα ονόματα των υπαλλήλων που απασχολούνται σε έργα τα ο- ποία έχουν ημερομηνία λήξης μέσα στο 2005. 2. Να βρεθούν τα ονόματα και ο μισθός των υπαλλήλων που απασχολούνται σε έργα με προϋπολογισμό μεγαλύτερο των 80000.
254 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων 3. Να βρεθεί ο τίτλος και η ημερομηνία έναρξης όλων των έργων στα οποία α- πασχολούνται υπάλληλοι με μισθό μεγαλύτερο από 1500. 4. Να βρεθεί ο τίτλος και η ημερομηνία έναρξης όλων των έργων στα οποία α- πασχολούνται υπάλληλοι οι οποίοι, αν πάρουν αύξηση 3.5%, ο μισθός του θα μεγαλώσει μεταξύ 40 και 100. 5. Να βρεθεί πόσοι υπάλληλοι συμμετέχουν στο έργο με κωδικό 5. 6. Να βρεθεί το όνομα και η ημερομηνία πρόσληψης όλων των υπαλλήλων που απασχολούνται σε έργα με προϋπολογισμό μεγαλύτερο από 100000. Δώστε το αποτέλεσμα με φθίνουσα ταξινόμηση ως προς την ημερομηνία πρόσληψης. 7. Να βρεθεί το όνομα και ο μισθός όλων των εργαζομένων που απασχολούνται στο έργο με κωδικό 3. 10.5 Εξωτερικές συζεύξεις Η σύζευξη που εξετάσαμε μέχρι τώρα ονομάζεται φυσική (NATURAL JOIN) ή εσωτερική (INNER JOIN): εμφανίζει στο αποτέλεσμα του ερωτήματος τις εγγραφές για τις οποίες οι τιμές στα πεδία δύο πινάκων ταυτίζονται. Η εξωτερική σύζευξη (OUTER JOIN), την οποία θα εξετάσουμε τώρα, έχει την εξής διαφορά: εμφανίζει στο αποτέλεσμα τις ίδιες εγγραφές που δίνει και η εσωτερική σύζευξη, καθώς και επιπλέον εκείνες τις εγγραφές που δεν έχουν ταιριαστές τιμές στο πεδίο με βάση το οποίο γίνεται η σύζευξη, είτε από τον ένα πίνακα LEFT, RIGHT, είτε και από τους δύο πίνακες (FULL OUTER JOIN). Για παράδειγμα, η εντολή: 1 SELECT e.firstname, e.lastname, w.proid 2 FROM employees e INNER JOIN workson w ON e.empid = w.empid 3 WHERE e.depid = 4 4 ORDER BY e.lastname; 5 6 firstname lastname proid 7 ------------------------------- 8 Νίκος Βλάχος 12 9 Παύλος Περίδης 43 10 Βαγγέλης Χριστόπουλος 12 11 Βαγγέλης Χριστόπουλος 14 12 Βαγγέλης Χριστόπουλος 38
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 255 θα δώσει στο αποτέλεσμα τα ονόματα των υπαλλήλων του τμήματος 4 και τους κωδικούς των έργων που συμμετέχουν, με την προϋπόθεση ότι κάποιος υπάλληλος απασχολείται σε κάποιο έργο. Εξάλλου, αυτό ακριβώς σημαίνει «εσωτερική σύζευξη»: οι εγγραφές του ενός πίνακα πρέπει να ταιριάζουν με τις εγγραφές ενός άλλου πίνακα με βάση ταυτιζόμενες τιμές σε κάποια πεδία. Αν δεν υπάρχει ταίριασμα οι εγγραφές δεν εμφανίζονται στο αποτέλεσμα, ανεξάρτητα από το αν υ- πάρχουν στους πίνακες. Αν θέλουμε την εμφάνιση όλων των υπαλλήλων του τμήματος 4, ανεξάρτητα από το αν συμμετέχουν σε κάποιο έργο ή όχι, τότε πρέπει να αντικαταστήσουμε την εσωτερική σύζευξη με εξωτερική: 1 SELECT e.firstname, e.lastname, w.proid 2 FROM employees e LEFT JOIN workson w ON e.empid = w.empid 3 WHERE e.depid = 4 4 ORDER BY e.lastname; 5 6 firstname lastname proid 7 ------------------------------- 8 Νίκος Βλάχος 12 9 Παύλος Περίδης 43 10 Νίκος Στεργιόπουλος NULL 11 Βαγγέλης Χριστόπουλος 12 12 Βαγγέλης Χριστόπουλος 14 13 Βαγγέλης Χριστόπουλος 38 που σημαίνει: «εμφάνισε όλες οι εγγραφές του πίνακα employees, και εκείνες τις εγγραφές από τον πίνακα workson για τις οποίες οι τιμές στα πεδία id και empid ταυτίζονται». Το πεδίο empid στο αποτέλεσμα θα πάρει την τιμή NULL για εκείνους τους υπαλλήλους που δεν συμμετέχουν σε κανένα έργο. Η εξωτερική σύζευξη μπορεί να είναι αριστερή (LEFT ) ή δεξιά (RIGHT ), με μόνο στόχο να έχουμε ευελιξία στον καθορισμό του πίνακα εκείνου από τον οποίο επιθυμούμε να συμπεριληφθούν όλες οι εγγραφές στο αποτέλεσμα. Έτσι η προηγούμενη εντολή μπορεί να γραφτεί και ως: 1 SELECT e.firstname, e.lastname, w.proid 2 FROM workson w RIGHT JOIN employees e ON w.empid = e.empid;
256 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων με το ίδιο ακριβώς αποτέλεσμα. Δηλαδή «εμφάνισε όλες τις εγγραφές του δεξιού πίνακα (employees), και μόνο εκείνες του αριστερού πίνακα (workson) για τις ο- ποίες οι τιμές στα πεδία σύζευξης ταυτίζονται (w.empid = e.empid). Κατά παράδοση, οι προγραμματιστές SQL προτιμούν την αριστερή σύζευξη όταν έχουν να επιλέξουν ανάμεσα σε δύο ισοδύναμες εξωτερικές συζεύξεις. Κατά τη σχεδίαση συσχετίσεων σε περιβάλλον MS ACCESS, η δήλωση μιας εξωτερικής σύζευξης μπορεί να γίνει κατά τον καθορισμό του τύπου συνδέσμου, όπως δείχνει το σχήμα 10.1: Σχήμα 10.1 Τροποποίηση σύνδεσης πινάκων στην MS ACCESS. Ίσως εδώ είναι το κατάλληλο σημείο για να λυθεί μια παρεξήγηση που υπάρχει πολύ συχνά ανάμεσα στους αρχάριους χρήστες της MS ACCESS. Αυτό γίνεται επειδή υπάρχει η εξής σύγχυση: άλλο πράγμα είναι οι συσχετίσεις μεταξύ των πινάκων, και άλλο πράγμα είναι οι περιορισμοί ξένου κλειδιού. Ο τύπος σύνδεσης που επιλέχθηκε κατά τη φάση σχεδιασμού της βάσης δεδομένων σε MS ACCESS επηρεάζει τις πράξεις ενημέρωσης της βάσεις (εισαγωγή, διαγραφή, και τροποποίηση δεδομένων) ανάμεσα στους συσχετιζόμενους πίνακες. Καθορίζει δηλαδή τι θα συμβεί στα δεδομένα του πίνακα που φέρει το ξένο κλειδί όταν ενημερωθεί ο πίνακας που φέρει το πρωτεύον κλειδί της συσχέτισης. Αυτό δεν έχει καμία απολύτως σχέση με τον τρόπο με τον οποίο θα γραφεί ένα ερώτημα επιλογής δεδομένων από πολλούς πίνακες, είτε με εσωτερική είτε με εξωτερική σύζευξη. Τα ερωτήματα με τη φράση SELECT δεν επηρεάζουν τα δεδομένα που είναι αποθηκευμένα στους πίνακες της βάσης, και τα ερωτήματα αυτά, ό,τι και να περιέχουν στη φράση FROM, δεν επηρεάζουν το σχήμα της βάσης.
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 257 Οποιοδήποτε είδος σύζευξης και να τοποθετηθεί σε ένα ερώτημα τύπου SELECT δεν έχει καμία απολύτως επίδραση στους περιορισμούς ξένου κλειδιού που εφαρμόστηκαν κατά τη σχεδίαση της βάσης και αφορούν την ενημέρωσή της. Ακόμα και να μην υπάρχουν καθόλου τέτοιοι περιορισμοί, τα ερωτήματα που περιέχουν συζεύξεις στη φράση FROM θα έχουν ακριβώς τα ίδια αποτελέσματα. Το πλέγμα σχεδίασης ερωτημάτων στην MS ACCESS παίρνει ως προεπιλεγμένο (DEFAULT) το είδος σύζευξης που καθορίστηκε κατά τη σχεδίαση των πινάκων και συσχετίσεων. Το πλέγμα σχεδίασης απλώς βοηθά το χρήστη στη γρήγορη σύνταξη ερωτημάτων. Ο χρήστης, όμως, μπορεί να κάνει οποιαδήποτε αλλαγή και τροποποίηση επιθυμεί, χωρίς καμία συνέπεια στη σχεδίαση και στα δεδομένα της βάσης. Μια τέτοια προσαρμογή του χρήστη μπορεί να είναι, για παράδειγμα, η αλλαγή από εσωτερική σε εξωτερική σύζευξη. Για παράδειγμα, οι υπάλληλοι που δεν α- πασχολούνται σε κανένα έργο μπορούν εύκολα να βρεθούν με το ερώτημα: 1 SELECT e.* 2 FROM employees e LEFT JOIN workson w ON e.empid = w.empid 3 WHERE w.proid IS NULL; 4 5 6 empid firstname lastname depid salary hiredate 7 ------------------------------------------------------------ 8 302 Νίκος Στεργιόπουλος 4 1386.05 2002-02-01 9 811 Αρετή Βασιλακάκη 5 1323.98 2002-07-01 10 728 Βασιλική Περδίκη 3 1053.54 2004-10-05 χωρίς να μας ενδιαφέρει καθόλου ο τρόπος με τον οποίο έχουν οριστεί οι περιορισμοί ξένων κλειδιών, ή/και ακεραιότητας αναφορών. Για να γραφεί το προηγούμενο ερώτημα στο πλέγμα σχεδίασης ερωτημάτων της MS ACCESS απαιτούνται τα επόμενα βήματα. 1. Ξεκινήστε τη σχεδίαση ενός ερωτήματος και τοποθετήστε τους δύο πίνακες employees και workson στο πλέγμα σχεδίασης. 2. Παρατηρήστε ότι η MS ACCESS τοποθετηθεί αυτόματα τη γραμμή σύνδεσης ως συσχέτιση 1:Ν.
258 ΜΕΡΟΣ ΙΙ Η δομημένη γλώσσα επερωτήσεων 3. Τοποθετήστε στο πλέγμα το πεδία που σας ενδιαφέρουν και γράψτε το κριτήριο IS NULL. 4. Διπλοπατήστε στη γραμμή σύνδεσης και επιλέξτε τον τύπο σύνδεσης 2, ο ο- ποίος στην SQL αντιστοιχεί στη σύνδεση LEFT JOIN.
Κεφάλαιο 10 Ερωτήματα επιλογής με σύζευξη πινάκων 259 5. Παρατηρήστε την αλλαγή στη γραμμή σχεδίασης, και εκτελέστε το ερώτημα. Όλες αυτές οι αλλαγές αφορούν μόνο το συγκεκριμένο ερώτημα, και δεν επηρεάζουν καθόλου τα υπόλοιπα στοιχεία της βάσης δεδομένων. Η προηγούμενη συζήτηση αξίζει λίγη παραπάνω σκέψη: τι είναι καλύτερο να γνωρίζει κανείς τις απλές λογικές φράσεις της SQL, ή μια περίπλοκη διαδοχή από πατήματα με το ποντίκι;