Βάσεις Δεδομένων Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα Στέργιος Παλαμάς, Υλικό Μαθήματος «Βάσεις Δεδομένων», 2015-2016
Κεφάλαιο 6: Structured Query Language (SQL)
Μια γλώσσα Βάσεων Δεδομένων θα πρέπει να υποστηρίζει τα εξής: Δημιουργία της Βάσης Δεδομένων και των Σχεσιακών Δομών Υποστήριξη βασικών εργασιών διαχείρισης δεδομένων όπως η εισαγωγή, η τροποποίηση και η διαγραφή δεδομένων Η εκτέλεση απλών και σύνθετων ερωτήσεων στη Βάση Δεδομένων SQL Structured Query Language Data Definition Language (DDL) Για τον ορισμό της Β.Δ. και τον έλεγχο της πρόσβασης Data Manipulation Language (DML) Για την ανάκτηση και την ενημέρωση Δεδομένων
Data Manipulation
SELECT [DISTINCT ALL] {* [columnexpression [AS newname]] [,... ]} FROM TableName [alias] [,... ] [WHERE condition] [GROUP BY columnlist] [HAVING condition] [ORDER BY columnlist] SELECT καθορίζει ποιες στήλες (πεδία) θα συμπεριληφθούν στο αποτέλεσμα FROM καθορίζει του πίνακες που συμμετέχουν στο ερώτημα WHERE φιλτράρει τις εγγραφές με καθοριζόμενα κριτήρια (condition) GROUP ομαδοποιεί τις εγγραφές με βάση τα καθορισμένα πεδία (columnlist) HAVING φιλτράρει τις ομάδες με τα καθοριζόμενα κριτήρια (Condition) ORDER BY καθορίζει την ταξινόμηση του αποτελέσματος ως προς τα πεδία που καθορίζονται (columnlist)
Οι Πίνακες της Βάσης Δεδομένων που θα χρησιμοποιηθούν στα παραδείγματα SELECT
Παράδειγμα 1: Ανάκτηση όλων των πεδίων (στηλών) όλων των εγγραφών του Πίνακα Staff SELECT staffno, fname, lname, position, sex, DOB, salary, branchno FROM Staff; ή SELECT * FROM Staff; Αποτέλεσμα
Παράδειγμα 2: Ανάκτηση συγκεκριμένων στηλών από όλες τις γραμμές SELECT staffno, fname, lname, salary FROM Staff; Αποτέλεσμα
Παράδειγμα 3: Χρήστη του DISTINCT Αποτέλεσμα Εμφάνιση των κωδικών ιδιοκτησιών που τις έχουν επισκεφτεί: SELECT propertyno FROM Viewing; Εμφάνιση των κωδικών ιδιοκτησιών που τις έχουν επισκεφτεί με απαλοιφή διπλότυπων: Αποτέλεσμα SELECT DISTINCT propertyno FROM Viewing;
Παράδειγμα 4: Υπολογιζόμενα Πεδία Εμφάνιση μηνιαίου μισθού: SELECT staffno, fname, lname, salary/12 FROM Staff; Ως Col4 εμφανίζεται το salary/12 μηνιαίος μισθός δηλαδή Εμφάνιση μηνιαίου μισθού με όνομα στήλης «monthly_salary»: SELECT staffno, fname, lname, salary/12 AS monthly_salary FROM Staff;
Παράδειγμα 5: Επιλογή γραμμών με κριτήριο Εμφάνιση υπαλλήλων με ετήσιο μισθό μεγαλύτερο από 10,000: SELECT staffno, fname, lname, position, salary FROM Staff WHERE salary > 10000 Στις εκφράσεις μπορούν να χρησιμοποιούνται και οι τρεις λογικοί τελεστές AND, OR και NOT. Προτεραιότητα: Τελεστής Σημασία = Ίσο με <> ή!= Διάφορο > Μεγαλύτερο από >= Μεγαλύτερο ή ίσο από < Μικρότερο από <= Μικρότερο ή ίσο Πρώτα εκτελούνται οι παρενθέσεις Το ΝΟΤ προηγείται από τα AND Και OR To AND Προηγείται από το OR ΠΡΟΣΟΧΗ: Καλό είναι να χρησιμοποιούμε παρενθέσεις για να εξαλείφουμε κάθε πιθανότητα λάθος στην προτεραιότητα εκτέλεσης των τελεστών Παράδειγμα: (salary > 10000) AND (position = MANAGER )
Παράδειγμα 6: Επιλογή γραμμών με σύνθετο κριτήριο Εμφάνιση καταστημάτων του Λονδίνου και της Γλασκώβης: SELECT * FROM Branch WHERE (city = London ) OR (city = Glasgow )
Παράδειγμα 7: Επιλογή γραμμών με σύνολο τιμών Εμφάνιση υπαλλήλων με θέση Manager ή Supervisor SELECT staffno, fname, lname, position FROM Staff WHERE position IN ( Manager, Supervisor ) Βολεύει όταν το κριτήριο είναι η ισότητα με 2-3 τιμές και πάνω. Διαφορετικά θα έπρεπε να γράψουμε μια σύνθετη έκφραση με χρήση του OR και αντίστοιχες ισότητες με τις τιμές Π.χ. (Position = Manager OR position = Supervisor )
Παράδειγμα 8: Επιλογή εγγραφών με ταίριασμα σε πρότυπο (pattern) Εμφάνιση ιδιοκτητών με διεύθυνση στη Γλασκόβη SELECT ownerno, fname, lname, address, telno FROM PrivateOwner WHERE address LIKE %Glasgow% Σύμβολο Σημασία % Κανένας ή περισσότεροι χαρακτήρες _ Ένας χαρακτήρας LIKE H% Να ξεκινάει από H LIKE H Να ξεκινάει από H και να έχει άλλα 3 γράμματα LIKE %e Να τελειώνει σε e LIKE %Glasgow% Να περιέχει οπουδήποτε τη λέξη Glasgow
Παράδειγμα 9: Επιλογή εγγραφών με κενό (NULL) πεδίο Εμφάνιση επισκέψεων στην ιδιοκτησία με κωδικό P4 που δεν έχουν σχόλιο SELECT clientno, viewdate FROM Viewing WHERE propertyno = PG4 AND comment IS NULL;
Παράδειγμα 10: Χρήση ORDER BY για ταξινόμηση αποτελέσματος Εμφάνιση στοιχείων προσωπικού ταξινομημένων ως προς το εισόδημα με φθίνουσα σειρά SELECT staffno, fname, lname, salary FROM Staff ORDER BY salary DESC;
Χρήση συναρτήσεων υπολογισμών Συνάρτηση COUNT SUM AVG MIN MAX Σημασία Μέτρησε πλήθος Άθροισμα Μέση τιμή Ελάχιστη τιμή Μέγιστη τιμή Τις παραπάνω συναρτήσεις τις χρησιμοποιούμε στο SELECT τμήμα της ερώτησής μας
Παράδειγμα 11: Χρήση του COUNT Μέτρησε το πλήθος των ακινήτων προς ενοικίαση με ενοίκιο μεγαλύτερο από 350 SELECT COUNT(*) AS mycount FROM PropertyForRent WHERE rent > 350; Παράδειγμα 12: Χρήση του COUNT DISTINCT Μέτρησε το πλήθος των ΔΙΑΦΟΡΕΤΙΚΩΝ ακινήτων που τα είδαν πελάτες τον Μάιο SELECT COUNT(DISTINCT propertyno) AS mycount FROM Viewing WHERE viewdate BETWEEN 1-May-04 AND 31-May-04 ;
Παράδειγμα 12: Χρήση του COUNT και του SUM Μέτρησε το πλήθος των Διευθυντών και το άθροισμα των μισθών τους SELECT COUNT(staffNo) AS mycount, SUM(salary) AS mysum FROM Staff WHERE position = Manager ; Παράδειγμα 13: Χρήση των MIN, MAX, AVG Υπολόγισε τον ελάχιστο μισθό, μέγιστο μισθό και τη μέση τιμή όλων των μισθών SELECT MIN(salary) AS mymin, MAX(salary) AS mymax, AVG(salary) AS myavg FROM Staff;
ΟΜΑΔΟΠΟΙΗΣΗ ΑΠΟΤΕΛΕΣΜΑΤΩΝ ΜΕ GROUP BY Αν σε κάποια ερώτηση SQL επιθυμούμε την ομαδοποίηση των εγγραφών που θα επιστραφούν, χρησιμοποιούμε τη δήλωση GROUP BY. Οι στήλες που αναγράφονται στη δήλωση GROUP BY Ονομάζονται στήλες ομαδοποίησης. Όταν σε εάν ερώτημα SQL χρησιμοποιήσουμε GROUP BY τότε: Κάθε στήλη (πεδίο) που περιλαμβάνεται στο SELECT θα πρέπει να εμφανίζεται και στο GROUP BY εκτός κι αν συμμετέχει σε μια από τις συναρτήσεις SUM, AVG, MIN, MAX, COUNT Κάθε στήλη που περιλαμβάνεται στο GROUP BY ΔΕΝ είναι απαραίτητο να εμφανίζεται και στο SELECT Αν το ερώτημα περιέχει και WHERE, ΠΡΩΤΑ εφαρμόζεται το WHERE για να φιλτράρει τις εγγραφές και ΜΕΤΑ εφαρμόζεται η ομαδοποίηση του GROUP BY.
Παράδειγμα 14: Χρήση του COUNT και του SUM Εύρεση για κάθε υποκατάστημα, του πλήθους υπαλλήλων που δουλεύουν σε αυτό και του αθροίσματος των μισθών τους. SELECT branchno, COUNT(staffNo) AS mycount, SUM(salary) AS mysum FROM Staff GROUP BY branchno ORDER BY branchno; Το ερώτημα ομαδοποιεί τις εγγραφές του πίνακα Staff ως προς το πεδίο branchno. Μετά για κάθε ομάδα (για κάθε τιμή του branchno) μετράει πόσες εγγραφές βρήκε (mycount) και αθροίζει τους μισθούς (mysum)
Παράδειγμα 15: Θέτοντας περιορισμούς στο GROUPING με το HAVING Για κάθε υποκατάστημα με ΠΕΡΙΣΣΟΤΕΡΟΥΣ από 1 υπαλλήλους, βρες το συνολικό πλήθος των υπαλλήλων και το άθροισμα των μισθών τους. SELECT branchno, COUNT(staffNo) AS mycount, SUM(salary) AS mysum FROM Staff GROUP BY branchno HAVING COUNT(staffNo) > 1 ORDER BY branchno; Ουσιαστικά το ερώτημα είναι παρόμοιο με αυτό του Παραδείγματος 14 με τη διαφορά ότι πλέον εμφανίζουμε μόνο τα καταστήματα που έχουν πάνω από 1 υπάλληλο: HAVING COUNT(staffNo) >1. Όταν χρησιμοποιούμε HAVING, τα πεδία που εμφανίζονται στο HAVING πρέπει να εμφανίζονται και στο GROUP BY, διαφορετικά πρέπει να περιλαμβάνονται σε μια αθροιστική συνάρτηση (COUNT, SUM, MIN, MAX, AVG). Έτσι στο παράδειγμά μας, το staffno, δεν εμφανίζεται στο GROUP BY αλλά στο HAVING περιλαμβάνεται στην συνάρτηση COUNT, οπότε είναι έγκυρη η χρήση του. Το HAVING διαφέρει από το WHERE. Το WHERE φιλτράρει συγκεκριμένες εγγραφές, ενώ το HAVING δρα πάνω σε ομάδες που έχουν προκύψει με το GROUP BY.
ΥΠΟΕΡΩΤΗΜΑΤΑ - SUBQUERIES Μια ερώτηση SELECT Μπορεί να χρησιμοποιηθεί στο εσωτερικό μιας άλλης ερώτησης SELECT. Τότε λέγεται ΥΠΟΕΡΩΤΗΜΑ ή ΕΜΦΩΛΕΥΜΕΝΟ (nested) ΕΡΩΤΗΜΑ. Τα αποτελέσματα αυτού του «εσωτερικού» SELECT χρησιμοποιούνται στο «εξωτερικό» ερώτημα στο τμήμα WHERE ή στο τμήμα HAVING. Υπάρχουν ΤΡΕΙΣ τύποι υπο-ερωτημάτων: Υπο-ερώτημα τιμής (scalar subquery) - επιστρέφει ως αποτέλεσμα μια μοναδική τιμή Υπο-ερώτημα γραμμής (row subquery) επιστρέφει ως αποτέλεσμα μια μοναδική γραμμή με πεδία Υπο-ερώτημα πίνκαα (table subquery ) - επιστρέφει ως αποτέλεσμα πολλαπλές γραμμές (κάθε μια με τα πεδία της) - ένα πίνακα ουσιαστικά.
Παράδειγμα 16: Χρήση υπο-ερωτήματος τιμής (scalar subquery) Να εμφανιστούν τα στοιχεία των υπαλλήλων που εργάζονται στο κατάστημα που βρίσκεται στην οδό «163 Main St». SELECT staffno, fname, lname, position FROM Staff WHERE branchno = (SELECT branchno FROM Branch WHERE street = 163 Main St ); Υπο-ερώτημα Το υποερώτημα εδώ επιστρέφει τον κωδικό του καταστήματος που έχει διεύθυνση «163 Main St». Στη συνέχεια ο κωδικό αυτός χρησιμοποιείται στο WHERE του εξωτερικού (κύριου) ερωτήματος για να φιλτράρει μόνο τους υπάλληλους που εργάζονται στο συγκεκριμένο υποκατάστημα. Το υποερώτημα εδώ έχει σαν αποτέλεσμα την τιμή «Β003» που είναι ο κωδικό καταστήματος της 163 Main St. Έτσι το αρχικό ερώτημα ουσιαστικά γίνεται: SELECT staffno, fname, lname, position FROM Staff WHERE branchno = Β003
Παράδειγμα 17: Χρήση υπο-ερωτήματος τιμής (scalar subquery) με αθροιστική συνάρτηση Να εμφανιστούν τα στοιχεία των υπαλλήλων που έχουν μισθό πάνω από το μέσο όρο και να εμφανιστεί για τον καθένα πόσο υπερβαίνει ο μισθός του τον Μ.Ο. SELECT staffno, fname, lname, position, salary (SELECT AVG(salary) FROM Staff) AS saldiff FROM Staff WHERE salary >(SELECT AVG(salary)FROM Staff); Υπο-ερώτημα Υπο-ερώτημα Το υποερώτημα εδώ επιστρέφει και στις δύο περιπτώσεις τον μέσο μισθό που είναι 17.000. Στη συνέχεια το αποτέλεσμα αυτό χρησιμοποιείται στο WHERE για να απομονώσει τους υπαλλήλους με μισθό πάνω από το Μ.Ο. και χρησιμοποιείται και στο SELECT για να υπολογιστεί η διαφορά μισθού Μ.Ο. Το ερώτημα λοιπόν είναι σα να γράφουμε: SELECT staffno, fname, lname, position, (salary 17000) AS saldiff FROM Staff WHERE salary > 17000; ΣΗΜΕΙΩΣΗ: Όταν ένα υποερώτημα χρησιμοποιείται σε έκφραση (πχ σύγκριση) πρέπει ν εμφανίζεται στο δεξιό μέρος της : salary >(SELECT AVG(salary)FROM Staff), όχι SELECT AVG(salary)FROM Staff) < salary;
Παράδειγμα 18: Χρήση υπο-ερωτήματος που επιστρέφει σύνολο τιμών Να εμφανιστούν τα στοιχεία ακινήτων που τα χειρίζονται υπάλληλοι του καταστήματος με διεύθυνση «163 Main St» SELECT propertyno, street, city, postcode, type, rooms, rent FROM PropertyForRent WHERE staffno IN (SELECT staffno FROM Staff Υποερώτημα 1 WHERE branchno = (SELECT branchno FROM Branch WHERE street = 163 Main St )); Υποερώτημα 2 Εδώ έχουμε δύο υποερωτήματα: Το υποερώτημα 2 είναι εμφωλευμένο στο υποερώτημα 1 που είναι εμφωλευμένο στο κυρίως ερώτημα. Το υποερώτημα 2 επιστρέφει μια τιμή: τον κωδικό του καταστήματος που βρίσκεται στην «163 Main St». Το υποερώτημα 1 χρησιμοποιεί αυτή την τιμή για να επιστρέψει το σύνολο των κωδικών των υπαλλήλων που εργάζονται στο συγκεκριμένο κατάστημα. Τέλος το κυρίως ερώτημα χρησιμοποιεί το αποτέλεσμα του υποερωτήματος 1 για να εμφανίσει τα στοιχεία των ακινήτων που χειρίζονται οι συγκεκριμένοι υπάλληλοι. Η λέξη κλειδί ΙΝ που χρησιμοποιεί το κυρίως ερώτημα χρησιμοποιείται για να ελέγξουμε αν μια τιμή περιλαμβάνεται σε ένα σύνολο τιμών.
Παράδειγμα 19: Χρήση του ANY / SOME Να εμφανιστούν τα στοιχεία των υπαλλήλων που έχουν μισθό μεγαλύτερο από τουλάχιστον έναν από τους υπαλλήλους του καταστήματος με κωδικό «BOO3». SELECT staffno, fname, lname, position, salary FROM Staff WHERE salary > SOME (SELECT salary FROM Staff WHERE branchno = B003 ); Εδώ το υποερώτημα επιστρέφει τους μισθούς των υπαλλήλων του καταστήματος με κωδικό «BOO3». Στη συνέχεια το κυρίως ερώτημα χρησιμοποιεί αυτά τα αποτελέσματα για να απομονώσει τους υπαλλήλους με μισθό μεγαλύτερο από τουλάχιστον ένα από τα αποτελέσματα του υποερωτήματος.
Παράδειγμα 20: Χρήση του ALL Να εμφανιστούν τα στοιχεία των υπαλλήλων που έχουν μισθό μεγαλύτερο από όλους τους υπαλλήλους του καταστήματος με κωδικό «BOO3». SELECT staffno, fname, lname, position, salary FROM Staff WHERE salary > ALL (SELECT salary FROM Staff WHERE branchno = B003 ); Και εδώ το υποερώτημα επιστρέφει τους μισθούς των υπαλλήλων του καταστήματος με κωδικό «BOO3». Στη συνέχεια το κυρίως ερώτημα χρησιμοποιεί αυτά τα αποτελέσματα για να απομονώσει τους υπαλλήλους με μισθό μεγαλύτερο από όλα τα αποτελέσματα του υποερωτήματος.
ΕΡΩΤΗΜΑΤΑ ΠΟΛΛΑΠΛΩΝ ΠΙΝΑΚΩΝ Όλα τα παραδείγματα που είδαμε μέχρι τώρα περιλάμβαναν μόνο έναν Πίνακα. Αυτό δεν είναι πάντα εφικτό. Για να συνδυάσουμε στήλες από περισσότερους από έναν πίνακες πρέπει να χρησιμοποιήσουμε την πράξη JOIN. Η SQL Join συνδυάζει πληροφορία από δύο πίνακες σχηματίζοντας ζεύγη εγγραφών που ταιριάζουν. Τα ζευγάρια εγγραφών που αποτελούν τον νέο πίνακα είναι αυτά που στις συνδεόμενες στήλες των δύο πινάκων έχουν ίδιες τιμές. Για να κάνουμε ένα JOIN περιλαμβάνουμε δύο ή περισσότερους πίνακες στο σκέλος FROM του ερωτήματός μας χωρίζοντάς τους με κόμμα. Στο τμήμα WHERE του ερωτήματος βάζουμε τα ζεύγη πεδίων ως προς τα οποία θα γίνει το JOIN.
Παράδειγμα 21: Απλό JOIN Να εμφανιστούν τα στοιχεία των πελατών που έχουν δει κάποιο ακίνητο. Να εμφανιστεί και ο κωδικός του ακινήτου και τυχόν σχόλιο που έγινε. SELECT c.clientno, fname, lname, propertyno, comment FROM Client c, Viewing v WHERE c.clientno = v.clientno; Τα στοιχεία των επισκέψεων είναι αποθηκευμένα στον Πίνακα Viewing. Το όνομα και το επώνυμο του πελάτη όμως δεν υπάρχει στον Πίνακα Viewing αλλά στον Client. Πρέπει λοιπόν να συνδυάσουμε με JOIN τους δύο πίνακες στο κοινό τους Πεδίο ClientNo (WHERE c.clientno = v.clientno). Προσέξτε ότι στο FROM έχουμε βάλει ψευδώνυμα (ALIASES) για τους δύο πίνακες ώστε να χρησιμοποιούμε τα πιο σύντομα ονόματα (c και v, αντί για Client και Viewing) και ότι στο SELECT χρησιμοποιούμε και το όνομα του πίνακα μπροστά από το πεδίο στην περίπτωση που το πεδίο υπάρχει και στους δύο Πίνακες (c.clientno)
Παράδειγμα 22: JOIN και ταξινόμηση αποτελεσμάτων Για κάθε κατάστημα της εταιρίας εμφάνισε τον κωδικό και το ονοματεπώνυμο των υπαλλήλων που διαχειρίζονται ακίνητα, και τους κωδικούς των ακινήτων που διαχειρίζονται. Ταξινόμησε τα αποτελέσματα ως προς το κατάστημα, τον υπάλληλο και το ακίνητο. SELECT s.branchno, s.staffno, fname, lname, propertyno FROM Staff s, PropertyForRent p WHERE s.staffno = p.staffno ORDER BY s.branchno, s.staffno, propertyno;; Ο Πίνακας PropertyForRent έχει τα στοιχεία των ακινήτων και τον κωδικό του υπαλλήλου που διαχειρίζεται το καθένα. Τα στοιχεία των υπαλλήλων είναι αποθηκευμένα στον Πίνακα Staff. Πρέπει λοιπόν να κάνουμε JOIN στους δύο Πίνακες ως προς το κοινό Πεδίο staffno. Στη συνέχεια ταξινομούμε τα αποτελέσματα με ORDER BY.
Παράδειγμα 23: JOIN τριών Πινάκων Για κάθε κατάστημα της εταιρίας εμφάνισε τον κωδικό και το ονοματεπώνυμο των υπαλλήλων που διαχειρίζονται ακίνητα, συμπεριλαμβάνοντας και την πόλη του κάθε καταστήματος και τον κωδικό του ακινήτου που διαχειρίζεται κάθε υπάλληλος. SELECT b.branchno, b.city, s.staffno, fname, lname, propertyno FROM Branch b, Staff s, PropertyForRent p WHERE b.branchno = s.branchno AND s.staffno = p.staffno ORDER BY b.branchno, s.staffno, propertyno; Εδώ τα στοιχεία που θέλουμε είναι διασκορπισμένα σε τρείς Πίνακες. Στον Branch τα στοιχεία των καταστημάτων, στον Staff των υπαλλήλων και στον PropertyforRent των ακινήτων. Από τον PropertyForRent παίρνουμε τον κωδικό του υπαλλήλου που διαχειρίζεται το ακίνητο και με JOIN με τον πίνακα Staff βρίσκουμε τα στοιχεία του (κωδικό, επώνυμο, όνομα). Επίσης από τον πίνακα των υπαλλήλων έχουμε τον κωδικό του καταστήματος που δουλεύει ο καθένας οπότε με JOIN με τον πίνακα Branch παίρνουμε και την Πόλη του καταστήματος.
OUTER JOINS Όπως είδαμε το JOIN δημιουργεί ζεύγη εγγραφών δύο πινάκων με βάση κάποια κοινά πεδία. Θα επιστραφούν μόνο οι εγγραφές που το «ταίριασμα» πέτυχε. Υπάρχει περίπτωση όμως να θέλουμε να κρατήσουμε και τις εγγραφές του ενός από τους δύο Πίνακες ή και των δύο που δεν ταίριαξαν στην σύγκριση Πεδίων. Τότε χρησιμοποιούμε το OUTER JOIN.
Παράδειγμα 24: LEFT JOIN Εμφάνισε όλα τα στοιχεία των καταστημάτων και επιπλέον για κάθε κατάστημα τα στοιχεία των ακινήτων που βρίσκονται στην ίδια πόλη. SELECT b.*, p.* FROM Branch1 b LEFT JOIN PropertyForRent1 p ON b.bcity = p.pcity;; Εδώ χρειαζόμαστε ένα JOIN ανάμεσα στους πίνακες Branch και PropertyForRent. Ένα απλό JOIN όμως ΔΕ ΘΑ ΕΜΦΑΝΙΖΕ τα καταστήματα που δεν υπάρχει κανένα ακίνητο στην πόλη τους αφού δε θα έβρισκε ταιριαστή εγγραφή στον πίνακα PropertyForRent. Έτσι αντί για απλό JOIN χρησιμοποιούμε LEFT JOIN ώστε να εμφανιστούν οπωσδήποτε ΟΛΕΣ οι εγγραφές καταστημάτων και για όσες από αυτές ικανοποιείται η συνθήκη του JOIN να εμφανιστούν και τα ακίνητα της ίδιας πόλης.
Παράδειγμα 25: RIGHT JOIN Εμφάνισε όλα τα στοιχεία των ακινήτων και επιπλέον για κάθε ακίνητο τυχόν κατάστημα που βρίσκεται στην ίδια πόλη. SELECT b.*, p.* FROM Branch1 b RIGHT JOIN PropertyForRent1 p ON b.bcity = p.pcity;; Εδώ χρειαζόμαστε ένα JOIN ανάμεσα στους πίνακες Branch και PropertyForRent. Ένα απλό JOIN όμως ΔΕ ΘΑ ΕΜΦΑΝΙΖΕ τα ακίνητα που δεν υπάρχει κατάστημα στην πόλη τους αφού δε θα έβρισκε ταιριαστή εγγραφή στον πίνακα PropertyForRent. Έτσι αντί για απλό JOIN χρησιμοποιούμε RIGHT JOIN ώστε να εμφανιστούν οπωσδήποτε ΟΛΕΣ οι εγγραφές ακινήτων και για όσες από αυτές ικανοποιείται η συνθήκη του JOIN να εμφανιστούν και τα καταστήματα της ίδιας πόλης.
Παράδειγμα 26: FULL JOIN Εμφάνισε όλα τα στοιχεία των ακινήτων και καταστημάτων που βρίσκονται στην ίδια πόλη και επιπλέον τυχόν ακίνητα και καταστήματα που δεν ταιριάζει η πόλη τους. SELECT b.*, p.* FROM Branch1 b FULL JOIN PropertyForRent1 p ON b.bcity = p.pcity;; Ακίνητο χωρίς κατάστημα στην ίδια πόλη Κατάστημα χωρίς ακίνητο στην ίδια πόλη Εδώ θέλουμε να εμφανιστούν όλες οι εγγραφές και των δύο πινάκων ακόμη και αν δεν ικανοποιούν το κριτήριο του JOIN. Χρειαζόμαστε λοιπόν ένα FULL JOIN
Ασκήσεις Να γράψετε τα ερωτήματα SQL που υλοποιούν τα παρακάτω: 1. Εμφάνισε τα στοιχεία των υπαλλήλων που είναι άνδρες. 2. Εμφάνισε τα στοιχεία των γυναικών υπαλλήλων με θέση «Manager» 3. Εμφάνισε τα στοιχεία των υπαλλήλων με έτος γέννησης μεγαλύτερο ή ίσο από το 1965 4. Εμφάνισε τα στοιχεία των διαμερισμάτων που βρίσκονται στη Γλασκώβη (Glasgow). 5. Εμφάνισε τον αριθμό των ανδρών και των γυναικών που εργάζονται σε όλη την εταιρία 6. Εμφάνισε για κάθε κατάστημα της εταιρίας των αριθμό των ανδρών και των γυναικών που εργάζονται 7. Εμφάνισε τα στοιχεία των ακινήτων που είναι διαμερίσματα (τύπος = Flat) 8. Εμφάνισε τον αριθμό των διαμερισμάτων και των μονοκατοικιών που διαχειρίζεται η εταιρία 9. Εμφάνισε τις μονοκατοικίες που διαχειρίζεται η εταιρία (type = House) κατά φθίνουσα σειρά ενοικίου 10.Εμφάνισε τη μέση τιμή ενοικίου για τα διαμερίσματα 11.Εμφάνισε τη μέση τιμή ενοικίου για τα διαμερίσματα και τις μονοκατοικίες (με ένα ερώτημα) 12.Εμφάνισε τα στοιχεία των ακινήτων που ανήκουν στον ιδιοκτήτη με επώνυμο «Farrel» 13.Εμφάνισε τα στοιχεία των ακινήτων που επιβλέπει η υπάλληλος με επώνυμο «Beech» 14.Εμφάνισε τα στοιχεία των ακινήτων που ικανοποιούν τους περιορισμούς του πελάτη με επώνυμο «Kay» και όνομα «John». 15.Εμφάνισε τη διεύθυνση, την πόλη, τον τύπο και το ενοίκιο των ακινήτων που έχει δει η πελάτης Aline Stweart.
Πηγές: Database Systems: A Practical Approach to Design, Implementation, and Management Thomas Connolly Carolyn Begg Βάσεις Δεδομένων, ΤΕΕ Β Τάξη, 1 ος Κύκλος, Ινστιτούτο Τεχνολογίας Υπολογιστών και Εκδόσεων «Διόφαντος»