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

Σχετικά έγγραφα
1 / 150

1 / 105


Ηλεκτρονικοί Υπολογιστές II

Πρόλογος Μέρος Ι Μια βόλτα στις βάσεις δεδομένων Μια βόλτα στις βάσεις δεδομένων...25


1 / 97

1 / 87


DISTINCT, LIKE, NULL, AND, OR, BETWEEN

Ηλεκτρονικοί Υπολογιστές II

GROUP BY, HAVING, COUNT, MIN, MAX, SUM, AVG, ROLLUP.

DELETE, UPDATE, INSERT.

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά) ΤΕΙ ΔυτικήςΜακεδονίας

Οι εντολές CREATE TABLE, ALTER TABLE, CREATE KEY, ALTER KEY.

DELETE, UPDATE, INSERT

Οι εντολές CREATE TABLE, ALTER TABLE, CREATE KEY, ALTER KEY.


1 / 106

Ηλεκτρονικοί Υπολογιστές II

Ηλεκτρονικοί Υπολογιστές II

Ηλεκτρονικοί Υπολογιστές II

Ηλεκτρονικοί Υπολογιστές II

Ηλεκτρονικοί Υπολογιστές II


Σχεσιακή Άλγεβρα και Σχεσιακός Λογισμός. Σχεσιακή Άλγεβρα Σχεσιακός Λογισμός

Σχεδίαση Βάσεων Δεδομένων

1 / 106


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

ΘΕΜΑΤΑ. Θέμα 1 ο Σύμφωνα με τους παραπάνω πίνακες και τη θέση που έχουν τα ξένα κλειδιά βρείτε τους


Τμήμα Πληροφορικής ΑΠΘ

Πρόλογος Μέρος Ι Εισαγωγή στα συστήματα βάσεων δεδομένων Μια βόλτα στις βάσεις δεδομένων...25

Ηλεκτρονικοί Υπολογιστές II

Βάσεις Δεδομένων Σύνθετα SQL queries. Ψευδώνυμα (Aliases) (2) Ψευδώνυμα (Aliases) (1) Ασάφεια και Πλήρη Ονόματα. Ερώτημα χωρίς τον όρο WHERE (1)

Βάσεις Δεδομένων Σύνθετα SQL queries

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΤΜΗΜΑ ΠΟΛΙΤΙΣΜΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΣ. Επιλέγει όλες τις πλειάδες, από μια σχέση R, που ικανοποιούν τη συνθήκη επιλογής.

Η SQL ως γλώσσα ερωτημάτων. Υπενθυμίζουμε: Σχέση = Πίνακας Πλειάδα = Εγγραφή = Γραμμή (Πίνακα) Πεδίο = Γνώρισμα (Σχέσης) = Στήλη (Πίνακα)

Σχεσιακή Άλγεβρα. Παύλος Εφραιμίδης. Βάσεις Δεδομένων Σχεσιακή Άλγεβρα 1

Ηλεκτρονικοί Υπολογιστές ΙI. Βάσεις Δεδομένων. Ακαδημαϊκό Έτος Εργαστήριο 2. Διαφάνεια 1. Κάπαρης Αναστάσιος

Εργαστήριο 6 ο 7 ο / Ερωτήματα Ι

ΟΝΟΜΑΤΕΠΩΝΥΜΟ : Αντικείμενα: Βάσεις δεδομένων, σχέσεις μεταξύ πινάκων, ερωτήματα, φόρμες και αναφορές.

Εισαγωγή στην Επεξεργασία Ερωτήσεων. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

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

Εισαγωγή στην Επεξεργασία Ερωτήσεων. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Βάσεις εδοµένων. Συνολοθεωρητικές Πράξεις. Ειδικές Πράξεις. Εκφράσεις. Θεµελίωση της Σχεσιακού Μοντέλου εδοµένων. Σχεσιακή Άλγεβρα Σχεσιακός Λογισµός


Kεφ.2: Σχεσιακό Μοντέλο (επανάληψη) Κεφ.6.1: Σχεσιακή Άλγεβρα

Σχεσιακή Άλγεβρα. Συνολοθεωρητικές Πράξεις. Εκφράσεις. Ειδικές Πράξεις. Θεμελίωση της Σχεσιακού Μοντέλου Δεδομένων. Σχεσιακός Λογισμός

Βάσεις δεδομένων. (8 ο μάθημα) Ηρακλής Βαρλάμης

Τμήμα Διοίκησης Επιχειρήσεων

A ΕΠΑ.Λ ΕΦΑΡΜΟΓΕΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 5 η ΕΝΟΤΗΤΑ: ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Εκπαιδευτικοί: ΓΑΛΑΝΟΣ ΓΕΩΡΓΙΟΣ ΜΠΟΥΣΟΥΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

Σχεδίαση Βάσεων Δεδομένων

Επεξεργασία Ερωτήσεων

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ. Ε. Χρήσιμοι Σύνδεσμοι

Ηλεκτρονικοί Υπολογιστές II

Εργαστήριο 8o. Ερωτήματα επιλογής Παραμετρικά ερωτήματα Ερωτήματα δημιουργίας πεδίων. Ευάγγελος Γ. Καραπιδάκης

Η SQL αποτελείται από δύο υποσύνολα, τη DDL και τη DML.

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ.Ε.

Βάσεις Δεδομένων Ευαγγελία Πιτουρά 2. Εννοιολογικός Σχεδιασμός Βάσεων εδομένων (με χρήση του Μοντέλου Οντοτήτων/Συσχετίσεων)

Λίγα λόγια από το συγγραφέα...7

ΕΣΔ 232: ΟΡΓΑΝΩΣΗ ΔΕΔΟΜΕΝΩΝ ΣΤΗ ΚΟΙΝΩΝΙΑ ΤΗΣ ΠΛΗΡΟΦΟΡΙΑΣ. Ακαδημαϊκό Έτος , Εαρινό Εξάμηνο. Εργαστηριακή Άσκηση 4 7/02/2012

Βάσεις Δεδομένων. Εργαστήριο ΙV. Τμήμα Πληροφορικής ΑΠΘ

Επεξεργασία Ερωτήσεων

Επεξεργασία Ερωτήσεων

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ.Ε.

Σχεσιακή Άλγεβρα Σχεδιασμός Βάσεων Δεδομένων

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ - ΤΜΗΥΠ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι

Εισαγωγή στις βάσεις δεδομένων - Η ανατομία μιας βάσης δεδομένων

Σχεσιακή Άλγεβρα. Βάσεις Δεδομένων : Σχεσιακή Άλγεβρα 1

ΦΡΟΝΤΙΣΤΗΡΙΟ ΣΤΗ ΓΛΩΣΣΑ SQL

Αντώνης Χρυσόπουλος Στέλιος Μόσχογλου Θεοδόσης Σουργκούνης MYSQL PHP ADVANCED. Χέρι χέρι με τον Καρατζαφέρη

2 ο Σύνολο Ασκήσεων. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Εισαγωγή στην. Εισαγωγή Σ Β. Αρχεία ευρετηρίου Κατάλογος. συστήματος. Αρχεία δεδομένων

ΕΝΗΜΕΡΩΣΗ ΔΕΔΟΜΕΝΩΝ. UPDATE products SET prod_fpa=19 WHERE prod_fpa=23; SELECT prod_descr,purchase,purchase_date FROM products WHERE prod_fpa=9;

Βάσεις Δεδομένων και Ευφυή Πληροφοριακά Συστήματα Επιχειρηματικότητας. 2 ο Μάθημα: Βασικά Θέματα Βάσεων Δεδομένων. Δρ. Κωνσταντίνος Χ.

ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ MYSQL

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ - ΤΜΗΥΠ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι

BΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΕΞΕΤΑΣΗ ΦΕΒΡΟΥΑΡΙΟΥ 2005

ΗΥ-360 Αρχεία και Βάσεις Δεδομένων Διδάσκων: Δ. Πλεξουσάκης. Φροντιστήριο SQL Examples ΙΙ Ξένου Ρουμπίνη

Βάσεις δεδομένων. (7 ο μάθημα) Ηρακλής Βαρλάμης

Βάσεις Δεδομένων Προχωρημένα Ερωτήματα SQL

Μετατροπή Σχήματος Ο/Σ σεσχεσιακό

Περιεχόμενα. Μέρος Ι Εισαγωγή στα συστήματα βάσεων δεδομένων Πρόλογος... 33

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ. Ε. Χρήσιμοι Σύνδεσμοι

Εργαστήριο «Τεχνολογία Πολιτισμικού Λογισμικού» Ενότητα. Επεξεργασία πινάκων

Τίτλος Πακέτου Certified Computer Expert-ACTA

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) MASTER IN OFFICE microsoft access ΕΚΔΟΣΗ 1.0. Σόλωνος 108,Τηλ Φαξ

ΦΡΟΝΤΙΣΤΗΡΙΟ ΣΤΗ ΓΛΩΣΣΑ SQL

Περιεχόμενα. Βάσεις Δεδομένων Προχωρημένα Ερωτήματα SQL. Συνένωση Σχέσεων στην SQL2 (3) Συνένωση Σχέσεων στην SQL2. (Join Relations Feature in SQL)

SQL: Αιτήματα. Κεφάλαιο 5. Database Management Systems, R. Ramakrishnan and J. Gehrke

Εργαστηριακός Οδηγός. Βάσεις Δεδομένων της Γ' Τάξης ΕΠΑΛ

Τ.Ε.Ι ΘΕΣΣΑΛΟΝΙΚΗΣ, ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΣΔΒΔ (ΕΡΓΑΣΤΗΡΙΟ 4) Τελευταία ενημέρωση: 11/2011. Μετασχηματισμός διαγράμματος ER σε σχεσιακό σχήμα ΒΔ

PROJECT ΕΡΓΑΣΤΗΡΙΩΝ ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ Ι. Τμήμα Μηχανικών Πληροφορικής Τ.Ε.

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

Κεφάλαιο 10 Άλλες Πράξεις Θεωρίας Συνόλων

Σχεσιακό Μοντέλο Δεδομένων

Τελεστής Προβολής - Παράδειγμα. Π Πόλη, Εξάμηνο (Φοιτητές)

Transcript:

ΚΕΦΑΛΑΙΟ 13 Ερωτήματα επιλογής με σύζευξη πινάκων Το κεφάλαιο αυτό σας εισάγει στον πραγματικό κόσμο των σχεσιακών βάσεων δεδομένων. Τα ερωτήματα που θα συναντήσετε έχουν πολλούς πίνακες στον όρο FROM, οι οποίοι μπορούν να συνδέονται με πολλούς διαφορετικούς τρόπους. Ο βασικότερος τρόπος, βέβαια, είναι η εσωτερική ή φυσική σύζευξη. Όλες οι γνώσεις που αποκτήσατε στα προηγούμενα κεφάλαια ισχύουν πλήρως, ανεξάρτητα από το γεγονός της χρησιμοποίησης ενός ή περισσότερων πινάκων στον όρο FROM. Αν κατανοήσετε αυτό το κεφάλαιο, θα μπορείτε: Να εκτελείτε ερωτήματα ανάκτησης (επιλογής) δεδομένων από πολλούς πίνακες. Να διακρίνετε τους τύπους συζεύξεων, όπως φυσική, εσωτερική, εξωτερική, ή θ σύζευξη. Να εφαρμόζετε κατάλληλες συνδέσεις (JOIN) στους πίνακες ανάλογα με το ερώτημα που τίθεται κάθε φορά. Να εκτελείτε ερωτήματα που αντιστοιχούν στις σχεσιακές πράξεις καρτεσιανού γινομένου, σύζευξης, τομής, διαφοράς, και διαίρεσης. Να γνωρίζετε τις διαφορές και τις ομοιότητες ανάμεσα στους διαφορετικούς τύπους συνδέσεων. 13.1 Καρτεσιανό γινόμενο και σύζευξη Ήρθε λοιπόν η στιγμή να μιλήσουμε για τη χρήση πολλών πινάκων στα ερωτήματα επιλογής δεδομένων. Καταρχάς, ας ξεκαθαρίσουμε κάτι πολύ βασικό: ό,τι ισχύει για τα ε- ρωτήματα με έναν πίνακα, ισχύει και για τα ερωτήματα με περισσότερους πίνακες. Το μόνο που αλλάζει είναι το γεγονός ότι ο όρος FROM ακολουθείται από περισσότερους πίνακες, έτσι υπάρχουν περισσότερα διαθέσιμα πεδία στις άλλες φράσεις, π.χ. στον όρο 365

366 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων SELECT. Επομένως, η πιο απλή εντολή SQL που μπορούμε να γράψουμε είναι να τοποθετήσουμε απλώς δύο ονόματα πινάκων μετά τον όρο FROM, τα οποία (όπως και τα πεδία μετά τη φράση SELECT) χωρίζονται με κόμματα. Για παράδειγμα, για να βρούμε όλες τις λεπτομέρειες των τμημάτων (departments) και των υπάλληλων τους (employees) χρησιμοποιούμε την εντολή SQL: departments employees 2 FROM departments, employees; 3 depid depname manager empid firstname lastname depid salary hiredate 5 ------------------------------------------------------------------------------- 6 1 Διοίκ./Επιβ. 109 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02 7 2 Οικον./Λογ. 153 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02 8 3 Επιστημ./Μηχ. 31 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02 9 Εξωτ. συνερ. 230 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02 10 5 Γραμματείας 23 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02 11 6 Μάνατζ./Πωλ. 189 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02 12 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 13 2 Οικον./Λογ. 153 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 1 3 Επιστημ./Μηχ. 31 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 15 Εξωτ. συνερ. 230 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 16 5 Γραμματείας 23 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 17 6 Μάνατζ./Πωλ. 189 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 18 1 Διοίκ./Επιβ. 109 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15 19 2 Οικον./Λογ. 153 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15 20... 21 180 rows in set (0.00 sec) Αυτό είναι ένα ερώτημα ανάκτησης δεδομένων από τους δύο πίνακες departments και employees. Επιστρέφονται όλες οι εγγραφές των δύο πινάκων, χωρίς να γίνει κανένας έλεγχος για το ταίριασμα εγγραφών. Το αποτέλεσμα είναι γνωστό ως καρτεσιανό γινόμενο των πινάκων employees και departments, και επιστρέφει στο αποτέλεσμα όλους τους πιθανούς συνδυασμούς εγγραφών μεταξύ των δύο πινάκων: κάθε εγγραφή του ενός πίνακα εμφανίζεται τόσες φορές όσες είναι και οι εγγραφές του άλλου πίνακα. Για παράδειγμα, παρατηρήστε ότι ο κ. Διαμαντίδης εμφανίζεται 6 φορές στο αποτέλεσμα, μία για κάθε ξεχωριστό τμήμα. Το ίδιο συμβαίνει και για την κ. Αθανασίου, όπως και για όλους τους άλλους υπαλλήλους: φαίνονται να εργάζονται σε όλα τα τμήματα! Επίσης, αν το δει κανείς από τη σκοπιά του τμήματος, θα διαπιστώσει κάτι αντίστοιχο: σε κάθε τμήμα φαίνεται να απασχολούνται όλοι οι υπάλληλοι!

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 367 Το καρτεσιανό γινόμενο παράγει όλους τους πιθανούς συνδυασμούς. Με άλλα λόγια, αν οι δύο πίνακες έχουν N και M εγγραφές αντίστοιχα, το αποτέλεσμα του ερωτήματος έχει N M εγγραφές. Για παράδειγμα, ο πίνακας departments έχει 6 εγγραφές, ο πίνακας employees έχει 30 εγγραφές, επομένως το αποτέλεσμα του καρτεσιανού γινομένου έχει 180 εγγραφές. Το αποτέλεσμα αυτό, ως τελικό αποτέλεσμα και όχι ως πιθανό ενδιάμεσο αποτέλεσμα, φυσιολογικά δεν θα πρέπει να σας ικανοποιεί. Το αποτέλεσμα περιέχει τόσο το πεδίο employees.depid, όσο και το πεδίο departments. depid. Παρατηρήστε ότι δεν υπάρχει αντιστοιχία, παρά μόνο σε λίγες περιπτώσεις. Αυτό συμβαίνει επειδή υπάρχουν εγγραφές όπου ο κωδικός του τμήματος των υπαλλήλων από τον πίνακα employees δεν είναι ίσος με τον κωδικό του τμήματος από τον πίνακα departments. Είναι γνωστό όμως, από τη σχεδίαση της βάσης δεδομένων, ότι κάτι τέτοιο δεν ισχύει. Αυτό που συμβαίνει είναι ότι το κάθε τμήμα έχει πολλούς υπαλλήλους, αλλά ο κάθε υπάλληλος εργάζεται σε ένα μόνο τμήμα (συσχέτιση ένα προς πολλά). Όπως μάλλον έχετε ήδη καταλάβει, η «πραγματική» πληροφορία αντιστοιχεί σε εκείνες τις εγγραφές όπου ο κωδικός του τμήματος των υπαλλήλων από τον πίνακα employees ταυτίζεται με τον κωδικό του τμήματος από τον πίνακα departments. Πώς μπορούμε να ζητήσουμε να μη συμπεριληφθούν οι μη συσχετιζόμενες εγγραφές στο αποτέλεσμα; Ή, για να το πούμε με διαφορετικά λόγια, πώς είναι δυνατό να συμπεριλάβουμε στο αποτέλεσμα μόνο τις συσχετιζόμενες εγγραφές, και να αποκλείσουμε όλες τις άλλες; Η απάντηση είναι η χρήση του όρου WHERE. Για να απαντήσουμε λοιπόν στην ερώτηση εύρεσης όλων των λεπτομερειών από τους πίνακες employees και departments, σ departments.depid=employees.depid (departments employees) θα πρέπει να γράψουμε την εντολή SQL: 2 FROM departments, employees 3 WHERE departments.depid = employees.depid; 5 depid depname manager empid firstname lastname depid salary hiredate 6 ------------------------------------------------------------------------------- 7 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 8 1 Διοίκ./Επιβ. 109 502 Κρινιώ Μαροπούλου 1 175.67 2001-03-07 9 1 Διοίκ./Επιβ. 109 901 Κυριάκος Ρούσσης 1 1852.99 2001-11-01 10 2 Οικον./Λογ. 153 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15 11 2 Οικον./Λογ. 153 23 Δέσποινα Παπαδοπούλου 2 1609.52 1999-03-05 12... 13 30 rows in set (0.00 sec)

368 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων Το οποίο αντιστοιχεί στη σχεσιακή πράξη της σύζευξης: departments departments.depid = employees.depid employees Αυτό είναι το πρώτο σας ερώτημα που ανακτά δεδομένα από δύο πίνακες κάνοντας χρήση της σύζευξης θ. Έτσι λοιπόν, η τοποθέτηση δύο πινάκων στον όρο FROM, σε συνδυασμό με τον όρο WHERE, όπου τοποθετείται το κριτήριο συσχέτισης εγγραφών ανάμεσα στους δύο πίνακες, κάνει δυνατή την απαλοιφή των μη συσχετιζόμενων εγγραφών από το καρτεσιανό γινόμενο: το αποτέλεσμα είναι η σύζευξη των δύο πινάκων. Παρατηρήστε ότι οι τιμές στο πεδίο depid του πίνακα departments και του πίνακα employees (1 η και 7 η στήλη αντίστοιχα) ταυτίζονται. Στο προηγούμενο παράδειγμα βρήκαμε το τμήμα στο οποίο απασχολείται κάθε υπάλληλος με τη σύζευξη του πρωτεύοντος κλειδιού depid του πίνακα departments και του ξένου κλειδιού depid του πίνακα employees. Ο τρόπος αυτός, δηλαδή η σύζευξη ανάμεσα σε πρωτεύον και ξένο κλειδί, δεν είναι ο μοναδικός. Μπορούμε να κάνουμε σύζευξη με χρήση δύο ξένων κλειδιών, για παράδειγμα ανάμεσα στο πεδίο manager του πίνακα departments και το πεδίο empid του πίνακα employees 1 : σ departments.manager = employees.empid (departments employees) 2 FROM departments, employees 3 WHERE departments.manager = employees.empid; 5 depid depname manager empid firstname lastname depid salary hiredate 6 ------------------------------------------------------------------------------- 7 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 8 2 Οικον./Λογ. 153 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15 9 3 Επιστημ./Μηχ. 31 31 Κώστας Παπαδόπουλος 3 1100.23 2002-09-16 10 Εξωτ. συνερ. 230 230 Βαγγέλης Χριστόπουλος NULL 2002-12-03 11 5 Γραμματείας 23 23 Αδαμαντία Θεοτοκάτου 5 153.65 1999-10-01 12 6 Μάνατζ./Πωλ. 189 189 Θεόδωρος Αγγελίνας 6 1908.28 2000-06-19 Παρατηρήστε τώρα πως το αποτέλεσμα έχει μόνο 6 εγγραφές, και πως οι τιμές των πεδίων departments.manager και employees.empid ταυτίζονται. 1 Το πεδίο departments.manager είναι ξένο κλειδί στον πίνακα departments, και αναφέρεται στο πεδίο employees.empid, δηλαδή δηλώνει τον κωδικό του υπαλλήλου που διευθύνει το τμήμα. Κάθε τμήμα έχει ένα μόνο διευθυντή, και κάθε υπάλληλος μπορεί να διευθύνει ένα (το πολύ) τμήμα. Επομένως πρόκειται για μια συσχέτιση με λόγο πληθικότητας 1:1.

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 369 Η σύζευξη αυτή μπορεί να γραφεί και ως εσωτερική σύζευξη: departments departments.manager=employees.empid employees με την εντολή SQL: 2 FROM departments INNER JOIN employees 3 ON departments.manager = employees.empid; 5 depid depname manager empid firstname lastname depid salary hiredate 6 ------------------------------------------------------------------------------- 7 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 8 2 Οικον./Λογ. 153 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15 9 3 Επιστημ./Μηχ. 31 31 Κώστας Παπαδόπουλος 3 1100.23 2002-09-16 10 Εξωτ. συνερ. 230 230 Βαγγέλης Χριστόπουλος NULL 2002-12-03 11 5 Γραμματείας 23 23 Αδαμαντία Θεοτοκάτου 5 153.65 1999-10-01 12 6 Μάνατζ./Πωλ. 189 189 Θεόδωρος Αγγελίνας 6 1908.28 2000-06-19 13.1.1 Ψευδώνυμα πινάκων στον όρο FROM Όπως με τον τελεστή 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; 5 empid lastname depname 6 ------------------------------------------ 7 109 Αθανασίου Διοίκησης/Επίβλεψης 8 502 Μαροπούλου Διοίκησης/Επίβλεψης 9 901 Ρούσσης Διοίκησης/Επίβλεψης 10 153 Αλεβιζάτου Οικονομoλόγων/Λογιστών 11 23 Παπαδοπούλου Οικονομoλόγων/Λογιστών 12 19 Αρβανιτάκης Οικονομoλόγων/Λογιστών 13 503 Κρέσπα Οικονομoλόγων/Λογιστών 1 172 Βλάσσης Επιστημόνων/Μηχανικών 15 205 Μακρής Επιστημόνων/Μηχανικών 16 12 Περρής Επιστημόνων/Μηχανικών 17... Στον όρο FROM, σε αντίθεση με τον όρο SELECT, ή χρήση του τελεστή AS δεν είναι απαραίτητη (μπορεί να παραλειφθεί, οπότε υπονοείται):

370 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων 1 SELECT e.empid, e.lastname, d.depname 2 FROM employees e, departments d 3 WHERE e.depid = d.depid; Προσοχή, βέβαια, στα κόμματα! Ανάμεσα στο όνομα του πίνακα και στο ψευδώνυμό του δεν υπάρχει κόμμα. Ανάμεσα στους διαφορετικούς πίνακες που ακολουθούν τον όρο FROM υπάρχουν κόμματα. Υπενθυμίζουμε ότι ο τελεστής αλλαγής ονόματος της σχεσιακής άλγεβρας είναι ο ρ. Έ- τσι η προηγούμενη εντολή της SQL αντιστοιχεί στην παράσταση: Π e.firstname, e.lastname, d.depname (σ e.depid = d.depid (ρ e (employees) ρ d (departments))) 13.1.2 Σύζευξη κατά το πρότυπο SQL1 ή SQL2 Κατά το πρότυπο SQL1, η σύζευξη ανάμεσα σε πίνακες γίνεται με τη χρήση του όρου WHERE: εκεί δηλώνουμε την παράσταση με βάση την οποία θα γίνει η σύζευξη. Συνήθως αυτή περιλαμβάνει μια συνθήκη ισότητας (ταύτισης) ανάμεσα σε τιμές πεδίων, οπότε και λέγεται ισοσύζευξη (equijoin). Για παράδειγμα, έστω η σύζευξη: σ departments.depid = employees.depid (departments employees η οποία στη SQL (πρότυπο SQL1) μπορεί να γραφτεί ως: 2 FROM departments, employees 3 WHERE departments.depid = employees.depid; και λέγεται σύζευξη θ. Κατά το πρότυπο SQL2 2 χρησιμοποιείται διαφορετικός τρόπος σύνταξης και η (εσωτερική) σύζευξη γράφεται ολόκληρη στον όρο FROM: 2 FROM departments INNER JOIN employees 3 ON departments.depid = employees.depid; που αντιστοιχεί βέβαια στην παράσταση: departments departments.depid = employees.depid employees Αυτό ονομάζεται εσωτερική σύζευξη και χρησιμοποιεί την ταύτιση (ισότητα) τιμών ανάμεσα στο πρωτεύον και το ξένο κλειδί. Γενικά, ο τρόπος σύνταξης με το πρότυπο SQL2 (εσωτερική σύζευξη) είναι πιο ευκρινής από το πρότυπο SQL1 (σύζευξη θ). Μπορείτε βέβαια να γράφετε τις συζεύξεις όπως θέλετε, συνιστάται όμως να ακολουθείτε το πρότυπο SQL2 με την εσωτερική σύζευξη. 2 Αυτό είναι που κατά κύριο λόγο χρησιμοποιείται σήμερα, η ANSI-SQL92 ή SQL2.

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 371 Στις περισσότερες περιπτώσεις, όπως και σε αυτή, η σύζευξη γίνεται με τη χρήση ενός πρωτεύοντος και ενός ξένου κλειδιού. Για παράδειγμα, στο προηγούμενο ερώτημα το πεδίο departments.depid είναι το πρωτεύον κλειδί του πίνακα departments, και το πεδίο employees.depid είναι το ξένο κλειδί του πίνακα employees. Ωστόσο, από την άποψη του συντακτικού της SQL, δεν υπάρχει κανένας τέτοιος περιορισμός. Μπορείτε να γράφετε παραστάσεις συζεύξεων με όποια πεδία θέλετε. Αν τα ονόματα των πεδίων είναι ίδια, όπως π.χ. depid, μπορείτε να γράψετε τη σύζευξη και ως: 2 FROM departments INNER JOIN employees using(depid); η οποία μπορεί να διαβαστεί ως «σύζευξη του πίνακα employees με τον πίνακα departments, με βάση το πεδίο depid». Με άλλα λόγια, θέλουμε να γίνει σύνδεση εκείνων των εγγραφών του πίνακα employees με εκείνες τις εγγραφές του πίνακα departments στις οποίες ταυτίζεται η τιμή του κοινού, στους δύο πίνακες, πεδίου depid. Αυτό είναι γνωστό στη σχεσιακή άλγεβρα ως εσωτερική σύζευξη. Τονίζουμε ότι αυτός ο τρόπος γραφής απαιτεί να είναι κοινό (το ίδιο) και στους δύο πίνακες το όνομα του πεδίου με βάση το οποίο γίνεται η σύζευξη. Παρόλο που το αποτέλεσμα, όσον αφορά τις εγγραφές, είναι το ίδιο και με τους τρεις τρόπους: 1. 2 FROM departments, employees 3 WHERE departments.depid = employees.depid; 2. 2 FROM departments INNER JOIN employees 3 ON departments.depid = employees.depid; 3. 2 FROM departments 3 INNER JOIN using(depid) ο τρίτος τρόπος διαφέρει από τους δύο πρώτους όσον αφορά το σχήμα του αποτελέσματος, δηλαδή τα πεδία που υπάρχουν στο αποτέλεσμα. Στις δύο πρώτες περιπτώσεις το κοινό πεδίο (depid) θα υπάρχει δύο φορές στο αποτέλεσμα: μία από τον πίνακα departments και μία από τον πίνακα employees. Αντιθέτως, με τον τρίτο τρόπο το πεδίο depid θα υπάρχει στο αποτέλεσμα μόνο μία φορά. Αυτό μας θυμίζει τη φυσική σύζευξη: departments employees

372 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων η οποία στη SQL μπορεί να γραφτεί ως: 2 FROM departments NATURAL JOIN employees; 13.1.3 ιαφορές και ομοιότητες στη SQL ανάμεσα στην εσωτερική και τη φυσική σύζευξη Υπάρχει μια βασική διαφορά ανάμεσα στην εσωτερική σύζευξη: departments departments.depid = employees.depid employees 2 FROM departments, employees 3 WHERE departments.depid = employees.depid; 5 depid depname manager empid firstname lastname depid salary hiredate 6 ------------------------------------------------------------------------------- 7 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 8 1 Διοίκ./Επιβ. 109 502 Κρινιώ Μαροπούλου 1 175.67 2001-03-07 9 1 Διοίκ./Επιβ. 109 901 Κυριάκος Ρούσσης 1 1852.99 2001-11-01 10 2 Οικον./Λογ. 153 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15 11 2 Οικον./Λογ. 153 23 Δέσποινα Παπαδοπούλου 2 1609.52 1999-03-05 12... 13 30 rows in set (0.00 sec) και τη φυσική σύζευξη: departments employees 2 FROM departments NATURAL JOIN employees; 3 depid depname manager empid firstname lastname salary hiredate 5 ----------------------------------------------------------------------------- 6 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 2787.69 2000-01-26 7 1 Διοίκ./Επιβ. 109 502 Κρινιώ Μαροπούλου 175.67 2001-03-07 8 1 Διοίκ./Επιβ. 109 901 Κυριάκος Ρούσσης 1852.99 2001-11-01 9 2 Οικον./Λογ. 153 153 Μαρία Αλεβιζάτου 1321.92 2001-05-15 10 2 Οικον./Λογ. 153 23 Δέσποινα Παπαδοπούλου 1609.52 1999-03-05 11... 12 30 rows in set (0.00 sec)

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 373 πέρα βέβαια από το γεγονός πως στη φυσική σύζευξη υπονοείται και δεν χρειάζεται να δηλωθεί το πεδίο που χρησιμοποιείται για τη σύζευξη. Η βασική διαφορά συνίσταται στο γεγονός ότι, στο αποτέλεσμα της φυσικής σύζευξης, το κοινό πεδίο που χρησιμοποιείται για τη σύζευξη (εδώ το depid) εμφανίζεται στο αποτέλεσμα μόνο μία φορά, και όχι δύο όπως στην εσωτερική σύζευξη. Το κοινό πεδίο, εδώ το depid, με βάση το οποίο γίνεται η σύζευξη δύο πινάκων, εδώ των πινάκων departments και employees, εμφανίζεται στο αποτέλεσμα μόνο μία φορά όταν το ερώτημα γράφεται με τη φυσική σύζευξη. Υπενθυμίζουμε ότι, για να υπάρξει φυσική σύζευξη ανάμεσα σε δύο πίνακες, θα πρέπει να υπάρχει κοινό πεδίο ανάμεσα στους δύο πίνακες, δηλαδή ένα πεδίο με το ίδιο όνομα. Για παράδειγμα, αν το πεδίο depid του πίνακα departments ονομαζόταν κάπως αλλιώς, πχ depnu, τότε η φυσική σύζευξη: departments employees που αντιστοιχεί στην εντολή SQL: 2 FROM departments NATURAL JOIN employees; 3 depnu depname manager empid firstname lastname depid salary hiredate 5 ------------------------------------------------------------------------------- 6 1 Διοίκ./Επιβ. 109 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02 7 2 Οικον./Λογ. 153 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02 8 3 Επιστημ./Μηχ. 31 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-02 9 Εξωτ. συνερ. 230 102 Νικηφόρος Διαμαντίδης 6 1212.50 102003-06-02 10 11 5 Γραμματείας 23 102 Νικηφόρος Διαμαντίδης 6 1212.50 200312-06-02 11 6 13 Μάνατζ./Πωλ. 189 102 Νικηφόρος Διαμαντίδης 6 1212.50 2003-06-102 12 1 Διο15ίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-2616 13 2 Οικον17./Λογ. 153 109 Μαρία Αθανασίου 1 2787.69 2000-01-2618 1 3 Επιστ19ημ./Μηχ. 31 109 Μαρία Αθανασίου 1 2787.69 2000-01-2620 15 Εξωτ.21 συνερ. 230 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 16 5 Γραμματείας 23 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 17 6 Μάνατζ./Πωλ. 189 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 18 1 Διοίκ./Επιβ. 109 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15 19 2 Οικον./Λογ. 153 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15 20... 21 180 rows in set (0.00 sec) δεν μπορεί να πραγματοποιηθεί. Η SQL θα επιστρέψει το καρτεσιανό γινόμενο, αντί για τη σύζευξη των πινάκων departments και employees. Το κοινό όνομα στα αντίστοιχα

37 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων πεδία των δύο πινάκων που συμμετέχουν στη σύζευξη είναι υποχρεωτική συνθήκη για να είναι δυνατή η φυσική σύζευξη. Βέβαια, αυτό που μπορεί να πραγματοποιηθεί, ανεξάρτητα από το όνομα των πεδίων, είναι η εσωτερική σύζευξη. Έτσι, αν ο πίνακας departments είχε το σχήμα departments (depnu, depname, manager), τότε η εσωτερική σύζευξη: departments departments.depnu = employees.depid employees που αντιστοιχεί στην εντολή SQL: 1 2 SELECT * 3 FROM departments, employees WHERE departments.depnum = employees.depid; 5 6 depnu depname manager empid firstname lastname depid salary hiredate 7 ------------------------------------------------------------------------------- 8 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 9 1 Διοίκ./Επιβ. 109 502 Κρινιώ Μαροπούλου 1 175.67 2001-03-07 10 1 Διοίκ./Επιβ. 109 901 Κυριάκος Ρούσσης 1 1852.99 2001-11-01 11 2 Οικον./Λογ. 153 153 Μαρία Αλεβιζάτου 2 1321.92 2001-05-15 12 2 Οικον./Λογ. 153 23 Δέσποινα Παπαδοπούλου 2 1609.52 1999-03-05 13... 1 30 rows in set (0.00 sec) λειτουργεί ακριβώς όπως πρέπει και επιστρέφει το σωστό αποτέλεσμα. Αυτή η δυνατότητα, δηλαδή η ευελιξία στη χρήση ονομάτων για τα πεδία που χρησιμοποιούνται στις συζεύξεις, έχει κάνει την εσωτερική σύζευξη πολύ δημοφιλή στους προγραμματιστές της SQL. Στην πράξη, χρησιμοποιείται σπάνια η φυσική σύζευξη σε εντολές SQL. Τόσο στη φυσική, όσο και στην εσωτερική σύζευξη, το πεδίο της σύζευξης μπορεί να προβληθεί στο αποτέλεσμα είτε από τον έναν πίνακα είτε από τον άλλον, με τα ίδια αποτελέσματα. Κάτι τέτοιο δεν ισχύει στις εξωτερικές συζεύξεις, όπως θα δούμε στην ενότητα 13.. Για παράδειγμα, το ερώτημα φυσικής σύζευξης: Π depid departments employees το οποίο αντιστοιχεί στην εντολή SQL: 1 SELECT depid 2 FROM departments NATURAL JOIN employees; 3 depid 5 ------ 6 1 7 1

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 375 8 1 9 2 10 2 11... 12 30 rows in set (0.00 sec) και το ερώτημα εσωτερικής σύζευξης: Π departments.depid departments departments.depid = employees.depid employees το οποίο αντιστοιχεί στην εντολή SQL: 1 SELECT departments.depid 2 FROM departments INNER JOIN employees 3 ON departments.depid = employees.depid; 5 depid 6 ------ 7 1 8 1 9 1 10 2 11 2 12... 13 30 rows in set (0.00 sec) θα δώσουν ακριβώς το ίδιο αποτέλεσμα. Θα πρέπει να σημειωθεί ότι, στη σχεσιακή άλγεβρα, οι δύο παραστάσεις: Π departments.depid departments departments.depid = employees.depid employees Π employees.depid departments departments.depid = employees.depid employees είναι ισοδύναμες και θα έχουν το ίδιο αποτέλεσμα. Αυτό ισχύει και για την SQL, αφού η εντολή: 1 SELECT employees.depid 2 FROM departments INNER JOIN employees 3 ON departments.depid = employees.depid; 5 depid 6 ------ 7 1 8 1 9 1 10 2

376 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων 11 2 12... 13 30 rows in set (0.00 sec) θα επιστρέψει το ίδιο αποτέλεσμα με πριν. Με άλλα λόγια, στο ερώτημα εσωτερικής σύζευξης δεν έχει σημασία ποιο από τα δύο πεδία θα επιλέξουμε: είτε το ένα είτε το άλλο θα δώσουν το ίδιο αποτέλεσμα. Υπάρχει επίσης διαφοροποίηση στα ερωτήματα περιορισμού. Για παράδειγμα, το ερώτημα φυσικής σύζευξης «να βρεθούν οι λεπτομέρειες τμημάτων και υπάλληλων για το τμήμα με κωδικό 1»: σ depid=1 (departments employees) το οποίο αντιστοιχεί στην εντολή SQL: 2 FROM departments NATURAL JOIN employees 3 WHERE depid = 1; 5 depid depname manager empid firstname lastname depid salary hiredate 6 ------------------------------------------------------------------------------- 7 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 8 1 Διοίκ./Επιβ. 109 502 Κρινιώ Μαροπούλου 1 175.67 2001-03-07 9 1 Διοίκ./Επιβ. 109 901 Κυριάκος Ρούσσης 1 1852.99 2001-11-01 μπορεί να διατυπωθεί στη SQL χωρίς να χρειάζεται να προσδιοριστεί ο πίνακας στον οποίο ανήκει το πεδίο empid. Κάτι τέτοιο δεν μπορεί να γίνει στην εσωτερική σύζευξη: σ depid=1 (departments departments.depid=employees.depid employees) η οποία είναι ορθότερο να γραφτεί ως: σ departments.depid=1 (departments departments.depid=employees.depid employees) που αντιστοιχεί στην εντολή SQL: 2 FROM departments INNER JOIN employees 3 ON departments.depid = employees.depid WHERE departments.depid = 1; 5 6 depid depname manager empid firstname lastname depid salary hiredate 7 ------------------------------------------------------------------------------- 8 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 9 1 Διοίκ./Επιβ. 109 502 Κρινιώ Μαροπούλου 1 175.67 2001-03-07 10 1 Διοίκ./Επιβ. 109 901 Κυριάκος Ρούσσης 1 1852.99 2001-11-01

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 377 είτε να γραφτεί ως: σ employees. depid=1 (departments departments.depid=employees.depid employees) που αντιστοιχεί στην εντολή SQL: 2 FROM departments INNER JOIN employees 3 ON departments.depid = employees.depid WHERE employees.depid = 1; 5 6 depid depname manager empid firstname lastname depid salary hiredate 7 ------------------------------------------------------------------------------- 8 1 Διοίκ./Επιβ. 109 109 Μαρία Αθανασίου 1 2787.69 2000-01-26 9 1 Διοίκ./Επιβ. 109 502 Κρινιώ Μαροπούλου 1 175.67 2001-03-07 10 1 Διοίκ./Επιβ. 109 901 Κυριάκος Ρούσσης 1 1852.99 2001-11-01 Είναι εύκολο να γίνει αντιληπτό πως οι δύο τρόποι εσωτερικής σύζευξης είναι ισοδύναμοι και οι αντίστοιχες εντολές SQL θα επιστρέψουν ακριβώς το ίδιο αποτέλεσμα. 13.2 Ερωτήματα σε πίνακες με συσχέτιση ένα προς πολλά Στο σχεσιακό μοντέλο, δύο πίνακες συσχετίζονται με πληθικότητα ένα προς πολλά μέσω ενός ξένου κλειδιού: στο παράδειγμά μας, ο κωδικός τμήματος από τον πίνακα departments τοποθετείται στον πίνακα employees ως ξένο κλειδί. Έτσι ξέρουμε πως, ό- ταν λέμε ότι ο υπάλληλος με κωδικό 780 εργάζεται στο τμήμα με κωδικό 5 ο οποίος α- ντιστοιχεί (μέσω του πίνακα departments) στο τμήμα με όνομα «Γραμματεία», εννοούμε ότι ο υπάλληλος αυτός εργάζεται στη Γραμματεία και όχι κάπου αλλού! Αυτό προκύπτει από τη δήλωση του πεδίου depid ως ξένου κλειδιού που προέρχεται από τον πίνακα departments. Επειδή ένα τμήμα μπορεί (σύμφωνα με τη σχεδίαση της βάσης δεδομένων) να έχει πολλούς υπαλλήλους αλλά ο κάθε υπάλληλος εργάζεται σε ένα μόνο τμήμα, το σχεσιακό μοντέλο υποδεικνύει ως λύση στην παραπάνω απαίτηση την τοποθέτηση ξένου κλειδιού στον πίνακα employees, το οποίο είναι το πρωτεύον κλειδί του πίνακα departments. Το ότι καμία εγγραφή στον πίνακα employees δεν μπορεί να έχει στο πεδίο depid τιμή που δεν υπάρχει στο πεδίο depid του πίνακα departments είναι γνωστό ως κανόνας ακεραιότητας των αναφορών. Τα παραπάνω μας δείχνουν ότι στη σύζευξη ανάμεσα σε δύο πίνακες πρέπει, εκτός από το να γράφουμε τους δύο πίνακες μετά τον όρο FROM, να συμπληρώνουμε σωστά τον τρόπο σύζευξης. Αυτό που έχουμε δει μέχρι στιγμής ονομάζεται εσωτερική σύζευξη ή ισοσύζευξη, επειδή χρησιμοποιεί τις ταυτιζόμενες τιμές ανάμεσα σε δύο πεδία δύο δια-

378 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων φορετικών πινάκων για να σχηματίσει το αποτέλεσμα. Αυτή είναι και η πλέον συνηθισμένη περίπτωση, αλλά βέβαια δεν είναι και η μοναδική. Αργότερα θα μάθουμε και άλλες συζεύξεις και υπάρχουν αρκετές τέτοιες! Όπως έχει ήδη αναφερθεί, όλα όσα ξέρετε για τα ερωτήματα με έναν πίνακα ισχύουν και εδώ. Η μόνη προσοχή που πρέπει να δώσετε είναι στην περίπτωση πεδίων με ίδιο όνομα και στους δύο πίνακες, οπότε μπορεί να προκύψει σύγχυση. Για το λόγο αυτόν, καθώς και για άλλες παρόμοιες περιπτώσεις όπου μπορεί να προκληθεί σύγχυση ως προς τα ονόματα των πεδίων, η SQL υποστηρίζει τη σύνταξη πίνακας.πεδίο. Με τον τρόπο αυτόν είναι δυνατό να δηλώσουμε με ακρίβεια και σαφήνεια το κάθε συγκεκριμένο πεδίο, σε οποιονδήποτε πίνακα και αν ανήκει το συγκεκριμένο πεδίο. Ο τρόπος αυτός μπορεί να ακολουθείται πάντα για λόγους ευκρίνειας, ακόμα και αν δεν υπάρχει κίνδυνος να προκληθεί σύγχυση. Έτσι, για να βρούμε τον κωδικό και το επώνυμο όλων των υπαλλήλων, καθώς και το όνομα του τμήματος στο οποίο εργάζονται, Π empid, lastname, depname (departments departments.depid=employees.depid employees) θα γράψουμε την εντολή SQL: 1 SELECT employees.empid, employees.lastname, departments.depname 2 FROM employees INNER JOIN departments 3 ON employees.depid = departments.depid; 5 empid lastname depname 6 ----------------------------------------------- 7 109 Αθανασίου Διοίκησης/Επίβλεψης 8 502 Μαροπούλου Διοίκησης/Επίβλεψης 9 901 Ρούσσης Διοίκησης/Επίβλεψης 10 153 Αλεβιζάτου Οικονομoλόγων/Λογιστών 11 23 Παπαδοπούλου Οικονομoλόγων/Λογιστών 12... 13 30 rows in set (0.00 sec) ή ισοδύναμα: Π 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; 5 empid lastname depname 6 ----------------------------------------------- 7 109 Αθανασίου Διοίκησης/Επίβλεψης

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 379 8 502 Μαροπούλου Διοίκησης/Επίβλεψης 9 901 Ρούσσης Διοίκησης/Επίβλεψης 10 153 Αλεβιζάτου Οικονομoλόγων/Λογιστών 11 23 Παπαδοπούλου Οικονομoλόγων/Λογιστών 12... 13 30 rows in set (0.00 sec) Το κοινό πεδίο depid, με βάση το οποίο γίνεται η σύζευξη, δεν εμφανίζεται στο αποτέλεσμα, καθώς δεν υπάρχει στη λίστα πεδίων που ακολουθεί τον όρο SELECT. Δεν είναι καθόλου απαραίτητο να συμβαίνει κάτι τέτοιο. Ο χρήστης έχει το δικαίωμα το τοποθετήσει όποια και όσα πεδία θέλει μετά τον όρο SELECT, αρκεί τα πεδία να είναι διαθέσιμα από τους πίνακες που υπάρχουν στον όρο FROM. 13.2.1 Πολλαπλότητα εγγραφών του γονικού πίνακα σε ερώτημα σύζευξης 1:Ν Στο προηγούμενο ερώτημα, παρατηρήστε ότι το όνομα του τμήματος εμφανίζεται πολλές φορές. Το ίδιο θα συνέβαινε και με τον κωδικό του τμήματος, αν υπάρχει η ανάλογη επιλογή στον όρο SELECT. Πολλοί ρωτούν στο σημείο αυτό γιατί συμβαίνει κάτι τέτοιο, γιατί δηλαδή πεδία που έχουν μοναδικές τιμές, όπως το depname ή ακόμα το depid του πίνακα departments, χάνουν αυτή την ιδιότητα και εμφανίζονται να παίρνουν πολλές φορές την ίδια τιμή, όπως π.χ. το πεδίο depid του πίνακα employees. Στο σημείο αυτό, θα πρέπει να γίνει κατανοητό, ότι η σύζευξη του πίνακα departments (με πρωτεύον κλειδί departments.depid) με τον πίνακα employees (με ξένο κλειδί employees.depid) έχει αποτέλεσμα την απώλεια της ιδιότητας της μοναδικότητας για το πεδίο departments.depid. Το πεδίο αυτό έχει μοναδικές τιμές, όπως έχει σχεδιαστεί να έχει, σε όλα τα ερωτήματα όπου ο όρος FROM περιέχει μόνο τον πίνακα departments. Για παράδειγμα, το ερώτημα: Π empid, lastname, depname (σ depid = 1 (departments)) που αντιστοιχεί στην εντολή SQL: 2 FROM departments 3 WHERE depid = 1; 5 depid depname manager 6 --------------------------------------- 7 1 Διοίκησης/Επίβλεψης 109 θα επιστρέψει μόνο μία φορά το τμήμα με κωδικό 1, όπως βέβαια είναι το σωστό.

380 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων Ωστόσο, το ερώτημα: Π d.* (σ d.depid = 1 (ρ d (departments) d.depid=e.depid ρ e (employees))) που αντιστοιχεί στην εντολή SQL: 1 SELECT d.* 2 FROM departments d INNER JOIN employees e ON d.depid = e.depid 3 WHERE d.depid = 1; 5 depid depname manager 6 -------------------------------------- 7 1 Διοίκησης/Επίβλεψης 109 8 1 Διοίκησης/Επίβλεψης 109 9 1 Διοίκησης/Επίβλεψης 109 θα επιστρέψει 3 εγγραφές για το τμήμα με κωδικό 1. Αυτό συμβαίνει επειδή στον πίνακα employees υπάρχουν 3 εγγραφές με depid = 1, οπότε το αποτέλεσμα μετά τη σύζευξη θα έχει 3 εγγραφές. Προφανώς η ιδιότητα της μοναδικότητας κάθε εγγραφής του πίνακα departments χάθηκε στο αποτέλεσμα του τελευταίου ερωτήματος SQL. Συνεχίζει βέβαια να υπάρχει στον πίνακα departments όμως το ερώτημα δεν ζητάει δεδομένα από τον πίνακα departments, αλλά από τον πίνακα που προκύπτει μετά τη σύζευξη του πίνακα departments με τον πίνακα employees. Αυτό είναι που κάνει τη διαφορά! Σε τέτοιες περιπτώσεις, όταν δηλαδή ζητούνται δεδομένα στη φράση SELECT από έναν πίνακα ενώ στη φράση FROM υπάρχουν πολλοί πίνακες, τότε πιθανώς να χρειάζεται o προσδιορισμός DISTINCT: 1 SELECT DISTINCT d.* 2 FROM departments d INNER JOIN employees e ON d.depid = e.depid 3 WHERE d.depid = 1; 5 depid depname manager 6 -------------------------------------- 7 1 Διοίκησης/Επίβλεψης 109 Πότε χρειάζεται η προσθήκη του όρου DISTINCT; Όταν σε μια συσχέτιση ένα προς πολλά, όπως στο προηγούμενο παράδειγμα, ο όρος SELECT ακολουθείται μόνο από πεδία του πίνακα που φέρει το πρωτεύον κλειδί της συσχέτισης (εδώ το πεδίο departments.depid είναι πρωτεύον κλειδί, ενώ το πεδίο employees.depid έχει το ξένο κλειδί της συσχέτισης), τότε ο όρος SELECT πρέπει να συνοδεύεται από τον προσδιορισμό DISTINCT. Αν υπάρχει έστω και ένα πεδίο από τον πίνακα employees μετά τον όρο SELECT, τότε ο προσδιορισμός DISTINCT είναι περιττός. Για παράδειγμα, το επόμενο ερώτημα:

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 381 Π e.lastname, e.depname, e.salary (σ e.salary > 1500 (ρ d (departments) d.depid = e.depid ρ e (employees))) που αντιστοιχεί στην εντολή SQL: 1 SELECT DISTINCT e.lastname, d.depname, e.salary 2 FROM departments d INNER JOIN employees e ON d.depid = e.depid 3 WHERE e.salary > 1500; 5 lastname depname salary 6 ---------------------------------------------- 7 Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 8 Θεοτοκάτου Γραμματείας 153.65 9 Αθανασίου Διοίκησης/Επίβλεψης 2787.69 10 Αγγελίνας Μάνατζμεντ/Πωλήσεων 1908.28 11 Μαροπούλου Διοίκησης/Επίβλεψης 175.67 12 Ρούσσης Διοίκησης/Επίβλεψης 1852.99 θα επιστρέψει το ίδιο αποτέλεσμα και χωρίς τον όρο DISTINCT: 1 SELECT e.lastname, d.depname, e.salary 2 FROM departments d INNER JOIN employees e ON d.depid = e.depid 3 WHERE e.salary > 1500; 5 lastname depname salary 6 ---------------------------------------------- 7 Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 8 Θεοτοκάτου Γραμματείας 153.65 9 Αθανασίου Διοίκησης/Επίβλεψης 2787.69 10 Αγγελίνας Μάνατζμεντ/Πωλήσεων 1908.28 11 Μαροπούλου Διοίκησης/Επίβλεψης 175.67 12 Ρούσσης Διοίκησης/Επίβλεψης 1852.99 Το δενδροδιάγραμμα του σχήματος 13.1 απεικονίζει με συνοπτικό τρόπο την εσωτερική σύζευξη ανάμεσα στους πίνακες departments και employees. Για οικονομία χώρου απεικονίζεται μόνο η συμμετοχή των τμημάτων 1 και 2, και επίσης δίνονται μόνο τα πρωτεύοντα κλειδιά των δύο πινάκων, depid και empid αντίστοιχα. Το τμήμα με κωδικό 1 του πίνακα departments συνδέεται με τους υπαλλήλους του πίνακα employees για τους οποίους ισχύει employees.depid = 1. Αντίστοιχα, το τμήμα με κωδικό 2 του πίνακα departments συνδέεται με τους υπαλλήλους του πίνακα employees για τους οποίους ι- σχύει employees.depid = 2 Το ίδιο επαναλαμβάνεται με όλα τα υπόλοιπα τμήματα, που για οικονομία χώρου δεν απεικονίζονται στο σχήμα 13.1.

382 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων departments employees depid,empid 1 2 109 (1, 109) 502 (1, 502) 901 (1, 901) 153 (2, 153) 23 (2, 23) 19 (2, 19) 503 (2, 503) Σχήμα 13.1 ενδροδιάγραμμα της εσωτερικής σύζευξης ανάμεσα στον πίνακα departments και τον πίνακα employees. Τα στοιχεία του πίνακα departments θα εμφανιστούν περισσότερες από μία φορά στο αποτέλεσμα του ερωτήματος σύζευξης ανάμεσα στους πίνακες departments και employees εφόσον σε κάθε τμήμα απασχολούνται πολλοί υπάλληλοι. Για παράδειγμα, όπως φαίνεται στο σχήμα 13.1, ο κωδικός του τμήματος 1 εμφανίζεται τρεις φορές, επειδή υπάρχουν 3 υπάλληλοι που απασχολούνται στο τμήμα 1. Ακριβώς όπως ο κωδικός του τμήματος εμφανίζεται πολλές φορές στον πίνακα employees (employees.depid ξένο κλειδί που αναπαριστά τη συσχέτιση με λόγο πληθικότητας 1:Ν), έτσι και ο κωδικός του τμήματος (πρωτεύον κλειδί departments.depid) θα εμφανίζεται πολλές φορές στο αποτέλεσμα του ερωτήματος εσωτερικής σύζευξης ανάμεσα στους πίνακες departments και employees. Μαζί με τον κωδικό του τμήματος θα εμφανίζονται βέβαια στο αποτέλεσμα όλα τα υπόλοιπα πεδία του πίνακα departments. Η πολλαπλή εμφάνιση των στοιχείων του πίνακα departments στο αποτέλεσμα του ερωτήματος εσωτερικής σύζευξης ανάμεσα στους πίνακες departments και employees δεν σημαίνει πως υπάρχουν πολλά τμήματα με τον ίδιο κωδικό, το ίδιο όνομα, και τον ίδιο διευθυντή. Όλα αυτά τα στοιχεία αποθηκεύονται μία μόνο φορά στη βάση δεδομένων, σε μία εγγραφή του πίνακα departments για κάθε ξεχωριστό τμήμα. Μετά (όχι πριν) την εσωτερική σύζευξη ανάμεσα στους πίνακες departments και employees κάθε εγγραφή του πίνακα departments υπάρχει στο αποτέλεσμα τόσες φορές, όσες φορές ταυτίζεται η τιμή του ξένου κλειδιού employees.depid με εκείνη του departments.depid. 13.2.2 Προβολή πρωτεύοντος και ξένου κλειδιού σε ερώτημα εσωτερική σύζευξης Ας επεκτείνουμε λίγο την συζήτηση της προηγούμενης ενότητας. Θα εξετάσουμε την περίπτωση προβολής των πεδίων των πινάκων (γνωρίσματα σχέσεων) που χρησιμοποιούνται σε εσωτερική σύζευξη μιας συσχέτισης 1:Ν.

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 383 Για παράδειγμα, να βρεθεί ο κωδικός του τμήματος μετά από τη σύζευξη τμημάτων και υπαλλήλων: Π d.depid (ρ d (departments) d.depid = e.depid ρ e (employees)) που αντιστοιχεί στην εντολή SQL: 1 SELECT d.depid 2 FROM departments d INNER JOIN employees e ON d.depid = e.depid; 3 depid 5 ------ 6 1 7 1 8 1 9 2 10 2 11 2 12... 13 30 rows in set (0.00 sec) Παρατηρήστε πως ο κωδικός τμήματος, που αντιστοιχεί στο πεδίο departments.depid, εμφανίζεται με πολλαπλές τιμές, όπως ακριβώς και το ξένο κλειδί employees.depid: Π depid (employees) που αντιστοιχεί στην εντολή SQL: 1 SELECT depid 2 FROM employees; 3 depid ------ 5 1 6 1 7 1 8 2 9 2 10 2 11... 12 30 rows in set (0.00 sec) όπως έχουμε δει ήδη. Δηλαδή, λόγω της σύζευξης, το πρωτεύον κλειδί του πίνακα departments χάνει τη μοναδικότητά του, και κάθε εγγραφή εμφανίζεται τόσες φορές στο αποτέλεσμα του ερωτήματος όσες φορές υπάρχει η αντιστοίχιση ανάμεσα στα πεδία της σύζευξης departments.depid = employees.depid. Αυτό συμβαίνει διότι στο αποτέλεσμα

38 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων του ερωτήματος της σύζευξης ανάμεσα στους πίνακες departments και employees το πεδίο departments.depid δεν είναι πρωτεύον κλειδί, και αυτό ισχύει κάθε φορά που μέσω μιας συσχέτισης 1:Ν έχουμε σύζευξη ανάμεσα σε δύο πίνακες με τη χρήση του ξένου κλειδιού. Όπως ακριβώς έχουμε δει να συμβαίνει με το ξένο κλειδί employees.depid στην ενότητα 13.2.1, έτσι και εδώ η χρήση το όρου DISTINCT αποκαθιστά την εμφάνιση του κωδικού των τμημάτων μόνο μία φορά για κάθε ξεχωριστή τιμή: 1 SELECT DISTINCT d.depid 2 FROM departments d INNER JOIN employees e ON d.depid = e.depid; 3 depid 5 ------ 6 1 7 2 8 6 9 10 5 11 3 Ακριβώς το ίδιο αποτέλεσμα θα παίρναμε με το ερώτημα: Π e.depid (ρ d (departments) d.depid = e.depid ρe (employees)) που αντιστοιχεί στην εντολή SQL: 1 SELECT DISTINCT e.depid 2 FROM departments d INNER JOIN employees e 3 ON d.depid = e.depid; 5 depid 6 ------ 7 1 8 2 9 6 10 11 5 12 3 Ας δούμε τώρα την προβολή του πεδίου empid, που είναι πρωτεύον κλειδί του πίνακα employees: Π employees.empid (departments departments.depid = employees.depid employees))

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 385 το ερώτημα αυτό αντιστοιχεί στην εντολή SQL: 1 SELECT e.empid 2 FROM departments d INNER JOIN employees e ON d.depid = e.depid; 3 empid 5 ------ 6 109 7 502 8 901 9 153 10 23 11... 12 30 rows in set (0.00 sec) Εδώ δεν παρατηρούνται διπλοεγγραφές, όπως στην προηγούμενη περίπτωση προβολής του πεδίου departments.depid, πρωτεύοντος κλειδιού του πίνακα departments. Φυσικά, η προσθήκη του όρο DISTINCT δεν θα έχει καμία απολύτως επίδραση στο αποτέλεσμα: 1 SELECT DISTINCT e.empid 2 FROM departments d INNER JOIN employees e ON d.depid = e.depid; 3 empid ------ 5 109 6 502 7 901 8 153 9 23 10... 11 30 rows in set (0.00 sec) Με άλλα λόγια, το πρωτεύον κλειδί του πίνακα employees, που συμμετέχει στη συσχέτιση 1:Ν από την πλευρά του «πολλά», διατηρεί τη μοναδικότητά μετά τη σύζευξη, σε α- ντίθεση με το πρωτεύον κλειδί του πίνακα departments. Ο συνδυασμός των δύο κλειδιών σε ένα ερώτημα προβολής των πρωτεύοντων κλειδιών των πινάκων που συμμετέχουν σε συσχέτιση 1:Ν: Π d.depid, e.depid (ρ d (departments) d.depid = e.depid ρ e (employees)) δίνει επίσης μοναδικές εγγραφές, από τη στιγμή που το πεδίο employees.empid έχει μοναδικές τιμές, όπως φαίνεται στο αποτέλεσμα της εντολής SQL:

386 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων 1 SELECT DISTINCT d.depid, e.empid 2 FROM departments d INNER JOIN employees e ON d.depid = e.depid; 3 depid empid 5 ------------- 6 1 109 7 1 502 8 1 901 9 2 153 10 2 23 11... 12 30 rows in set (0.00 sec) επιστρέφει ένα αποτέλεσμα στο οποίο κάθε εγγραφή είναι μοναδική. Για παράδειγμα, ο συνδυασμός {1, 109} υπάρχει μόνο μία φορά στο αποτέλεσμα. Οι παρατηρήσεις και τα συμπεράσματα αυτής της ενότητας ισχύουν για συσχετίσεις με λόγο πληθικότητας 1:Ν. Μην τα γενικεύετε για άλλες περιπτώσεις. 13.2.3 Ασκήσεις Στις επόμενες ερωτήσεις, όταν λέμε «τμήμα» εννοούμε το όνομα του τμήματος από τον πίνακα departments. Με απαντήσεις 1 Να βρεθούν τα ονόματα, το τμήμα και ο μισθός όλων των υπαλλήλων. Π e.firstname, e.lastname, d.depname, e.salary (ρ d (departments) d.depid = e.depid ρ e (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 firstname lastname depname salary 5 ------------------------------------------------------- 6 Μαρία Αθανασίου Διοίκησης/Επίβλεψης 2787.69 7 Κρινιώ Μαροπούλου Διοίκησης/Επίβλεψης 175.67 8 Κυριάκος Ρούσσης Διοίκησης/Επίβλεψης 1852.99 9 Μαρία Αλεβιζάτου Οικονομoλόγων/Λογιστών 1321.92 10 Δέσποινα Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 11 Πέτρος Αρβανιτάκης Οικονομoλόγων/Λογιστών 1323.80 12 Μαριλένα Κρέσπα Οικονομoλόγων/Λογιστών 1105.0 13 Χρήστος Βλάσσης Επιστημόνων/Μηχανικών 1101.70

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 387 1 Ηλίας Μακρής Επιστημόνων/Μηχανικών 1050.96 15 Αριστείδης Περρής Επιστημόνων/Μηχανικών 1320.83 16... 17 30 rows in set (0.00 sec) 2 Να βρεθούν τα ονόματα, το τμήμα, και ο μισθός όλων των υπαλλήλων με μισθό μεταξύ 1150 και 1300. Π e.firstname, e.lastname, d.depname, e.salary (σ salary 1150 salary 1300 (ρ d (departments) d.depid = e.depid ρ e (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 1150 AND 1300; 5 firstname lastname depname salary 6 --------------------------------------------------------- 7 Αντώνης Παύλου Επιστημόνων/Μηχανικών 1231.62 8 Νικηφόρος Διαμαντίδης Μάνατζμεντ/Πωλήσεων 1212.50 3 Να βρεθεί ο κωδικός και το όνομα όλων των υπαλλήλων που απασχολούνται στο έργο με κωδικό 38, με αύξουσα ταξινόμηση ως προς το επώνυμο. Π e.empid, e.firstname, e.lastname (σ w.proid = 38 (ρ e (employees) e.empid = w.empid ρ w (workson))) 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 ORDER BY e.lastname ASC; 5 empid firstname lastname 6 --------------------------------- 7 153 Μαρία Αλεβιζάτου 8 102 Νικηφόρος Διαμαντίδης 9 23 Αδαμαντία Θεοτοκάτου 10 503 Μαριλένα Κρέσπα 11 502 Κρινιώ Μαροπούλου 12 23 Δέσποινα Παπαδοπούλου 13 835 Αθανάσιος Πετράκης 1 901 Κυριάκος Ρούσσης 15 230 Βαγγέλης Χριστόπουλος Το αποτέλεσμα της εσωτερικής σύζευξης είναι ισοδύναμο με αυτό της φυσικής σύζευξης: Π empid, firstname, lastname (σ proid = 38 (employees workson))

388 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων 1 SELECT empid, firstname, lastname 2 FROM employees e NATURAL JOIN workson 3 WHERE proid = 38 ORDER BY lastname ASC; 5 empid firstname lastname 6 --------------------------------- 7 153 Μαρία Αλεβιζάτου 8 102 Νικηφόρος Διαμαντίδης 9 23 Αδαμαντία Θεοτοκάτου 10 503 Μαριλένα Κρέσπα 11 502 Κρινιώ Μαροπούλου 12 23 Δέσποινα Παπαδοπούλου 13 835 Αθανάσιος Πετράκης 1 901 Κυριάκος Ρούσσης 15 230 Βαγγέλης Χριστόπουλος Να βρεθούν τα ονόματα, το όνομα του τμήματος, και ο μισθός όλων των υπαλλήλων που εργάζονται στα τμήματα με κωδικό 2 ή, και έχουν μισθό μεγαλύτερο από 1200. Π e.firstname, e.lastname, d.depname, e.salary (σ ( depid = 2 depid=) salary > 1200 (ρ d (departments) d.depid = e.depid ρ e (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, ) 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 ή, με τη φυσική σύζευξη: Π firstname, lastname, depname, salary (σ ( depid = 2 depid = ) salary > 1200 (departments employees)) 1 SELECT firstname, lastname, depname, salary 2 FROM employees NATURAL JOIN departments 3 WHERE depid IN (2, ) AND salary > 1200; 5

Κεφάλαιο 13 Ερωτήματα επιλογής με σύζευξη πινάκων 389 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 ρ d (departments) d.depid=e.depid ρ e (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, 5) AND e.salary > 1200 5 ORDER BY e.salary DESC; 6 7 firstname lastname depname salary 8 --------------------------------------------------------- 9 Δέσποινα Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 10 Αδαμαντία Θεοτοκάτου Γραμματείας 153.65 11 Πέτρος Αρβανιτάκης Οικονομoλόγων/Λογιστών 1323.80 12 Μαρία Αλεβιζάτου Οικονομoλόγων/Λογιστών 1321.92 ή, με τη φυσική σύζευξη: Π firstname, lastname, depname, salary (σ (depid=2 depid=5) salary>1200 (departments employees))) 1 SELECT firstname, lastname, depname, salary 2 FROM employees NATURAL JOIN departments 3 WHERE depid IN (2, 5) AND salary > 1200 5 ORDER BY salary DESC; 6 7 firstname lastname depname salary 8 --------------------------------------------------------- 9 Δέσποινα Παπαδοπούλου Οικονομoλόγων/Λογιστών 1609.52 10 Αδαμαντία Θεοτοκάτου Γραμματείας 153.65 11 Πέτρος Αρβανιτάκης Οικονομoλόγων/Λογιστών 1323.80 12 Μαρία Αλεβιζάτου Οικονομoλόγων/Λογιστών 1321.92

390 ΜΕΡΟΣ ΙI Η δομημένη γλώσσα επερωτήσεων 6 Να βρεθούν τα ονόματα των τμημάτων 3 στα οποία έγιναν προσλήψεις μέσα στο 2003. Π d.depname (σ hiredate '2003-01-01' hiredate '2003-12-31' (ρ d (departments) d.depid = e.depid ρ e (employees))) 1 SELECT DISTINCT d.depname 2 FROM employees e INNER JOIN departments d ON e.depid = d.depid 3 WHERE e.hiredate BETWEEN '2003-01-01' AND '2003-12-31'; 5 depname 6 ------------------------ 7 Μάνατζμεντ/Πωλήσεων 8 Επιστημόνων/Μηχανικών Ή, με τη συνάρτηση { YEAR()}: 1 SELECT DISTINCT d.depname 2 FROM employees e INNER JOIN departments d ON e.depid = d.depid 3 WHERE YEAR(e.hiredate) = 2003; Απάντηση με τη χρήση της φυσικής σύζευξης: Π depname (σ hiredate '2003-01-01' hiredate '2003-12-31' (departments employees) 1 SELECT DISTINCT depname 2 FROM employees NATURAL JOIN departments 3 WHERE hiredate BETWEEN '2003-01-01' AND '2003-12-31'; 5 depname 6 ------------------------ 7 Μάνατζμεντ/Πωλήσεων 8 Επιστημόνων/Μηχανικών 7 Να βρεθεί το ονοματεπώνυμο και ο μισθός όλων των υπαλλήλων του τμήματος με κωδικό 6 που εργάζονται στο έργο με κωδικό 1, με φθίνουσα ταξινόμηση ως προς το μισθό. Π e.firstname, e.lastname, e.salary (σ w.proid = 5 (ρ e (employees) e.empid = w.empid ρ w (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 3 Προσοχή, χρειάζεται DISTINCT. Γιατί όμως; Επειδή ο πίνακας departments συμμετέχει στη συσχέτιση ένα προς πολλά, υπάρχουν πολλοί υπάλληλοι που ενδεχομένως έχουν προσληφθεί στο ίδιο τμήμα μέσα στο 2003.