Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Σχετικά έγγραφα
Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

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

Βάσεις Δεδομένων. Ενότητα 7.1: Structured Query Language - 1 ο Μέρος. Αθανάσιος Σπυριδάκος Τμήμα Διοίκησης Επιχειρήσεων


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

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

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

Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα


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

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

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

Βάσεις Δεδομένων (Databases)

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ.

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

ΣΧΕΣΙΑΚΟ ΜΟΝΤΕΛΟ Relational Model. SQL Μαθ. #11

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

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

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

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

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

Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

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

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

Κεφάλαιο 9 Συναθροίσεις

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

SQL Data Manipulation Language

DISTINCT, LIKE, NULL, AND, OR, BETWEEN

Βάσεις Δεδομένων Ι SQL Μέρος 2 ο. Φώτης Κόκκορας (MSc/PhD) Τμήμα Μηχανικών Πληροφορικής ΤΕ

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

Βάσεις εδοµένων Ευαγγελία Πιτουρά 2

Σχεδιασμός Βάσεων Δεδομένων

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

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

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

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

Certified Data Base Designer (CDBD)

DELETE, UPDATE, INSERT.

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

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

DELETE, UPDATE, INSERT

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

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

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

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

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

Βάσεις Δεδομένων Ι 8. Ερωτήματα (B) Τμήμα Διοίκησης Επιχειρήσεων (Μεσολόγγι) ΤΕΙ Δυτικής Ελλάδας

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

Βάσεις Περιβαλλοντικών Δεδομένων

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


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

Τεχνολογία Πολιτισμικού Λογισμικού

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

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

Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

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

Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

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

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

Lecture 16: SQL DML III

Βάσεις Δεδομένων. Βασίλειος Βεσκούκης Εισαγωγή στη γλώσσα SQL (Structured Query Language) Η γλώσσα SQL

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

Κεφάλαιο 3. Ερωτήματα SQL

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

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

Βάσεις Δεδομένων (Databases)

Βάσεις Δεδομένων (Ε) Εισαγωγή στην υλοποίηση σχεσιακών βάσεων δεδομένων


1 / 87

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

Παράδειγμα Select Introduction Group By Join Aliases.. Εργαστήριο Βάσεων Δεδομένων. Εισαγωγή στη MySQL (3)

Διάλεξη 13: Γλώσσα Επεξεργασίας Δεδομένων/ Data Manipulation Language (SQL DML) I. Διδάσκων: Παναγιώτης Ανδρέου

Βάσεις Δεδομένων ΗγλώσσαSQL (Structured Query Language)

Βάσεις Δεδομένων. Ενότητα 7.2: Structured Query Language - 2 ο Μέρος. Αθανάσιος Σπυριδάκος Τμήμα Διοίκησης Επιχειρήσεων

Τεχνολογία Πολιτισμικού Λογισμικού

1 / 97

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

Βάσεις Δεδομένων Η γλώσσα SQL (Structured Query Language) Εισαγωγή στην SQL (2) Ιστορικά Στοιχεία. SQL - Structured Query Language (1)

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) Ενότητα Advanced Βάσεις Δεδομένων, Προχωρημένο Επίπεδο. Copyright 2013 ECDL Foundation Ref: SL_AM3_Syl2.

1 / 150

ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ

Διάλεξη 14: Γλώσσα Επεξεργασίας Δεδομένων/ Data Manipulation Language (SQL DML) II. Διδάσκων: Παναγιώτης Ανδρέου

Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

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

Lecture 14: SQL DML I

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

1 / 105

Βάσεις Δεδομένων (Databases)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

Σύβακας Σταύρος ΠΕ19,MSc. IT ΣΥΒΑΚΑΣ ΣΤΑΥΡΟΣ ΕΡΩΤΗΜΑΤΑ

Εργαστήριο βάσεων δεδομένων. Εισαγωγή στη MySQL (2)

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

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

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

Βάσεις Δεδομένων (Databases)

Transcript:

Βάσεις Δεδομένων Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα Στέργιος Παλαμάς, Υλικό Μαθήματος «Βάσεις Δεδομένων», 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 ος Κύκλος, Ινστιτούτο Τεχνολογίας Υπολογιστών και Εκδόσεων «Διόφαντος»