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

Σχετικά έγγραφα
SQL Data Manipulation Language

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

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

Βάσεις Δεδομένων Ι Ευρετήρια/Indexes. (...και επιδόσεις ΣΔΒΔ) Views (Όψεις) Φώτης Κόκκορας (MSc/PhD) Τμήμα Τεχνολογίας Πληροφορικής & Τηλεπ/νιών

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

SQL Data Manipulation Language

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

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

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

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ - ΣΧΕΣΙΑΚΗ ΑΛΓΕΒΡΑ

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

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

5. Επερώτηση XML Εγγράφων: Εισαγωγή στη Γλώσσα XQuery

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

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

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

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

Query-by-Example (QBE)

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

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

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

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

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

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

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

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

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

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

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

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

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

Λογαριασμοί & Δικαιώματα

DELETE, UPDATE, INSERT.

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

DELETE, UPDATE, INSERT

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

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

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

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

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

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

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

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

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός

ΣΧΕΔΙΑΣΜΟΣ ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ ΕΡΓΑΣΤΗΡΙΟ 3

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

1 / 87

ΠΑΡΑΔΕΙΓΜΑΤΑ ΘΕΜΑ Β. 2x 1. είναι Τότε έχουμε: » τον χρησιμοποιούμε κυρίως σε θεωρητικές ασκήσεις.

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

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

1 / 97

DISTINCT, LIKE, NULL, AND, OR, BETWEEN

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

Εργαστήριο 10o. Συγκεντρωτικά Ερωτήματα Ερωτήματα Διασταύρωσης Ερωτήματα Ενεργειών. Ευάγγελος Γ. Καραπιδάκης

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

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

Διαδικασιακός Προγραμματισμός

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

Ορισμοί Σχεσιακού Μοντέλου και Τροποποιήσεις Σχέσεων σε SQL

Πολυωνυμικές εξισώσεις και ανισώσεις Εξισώσεις και ανισώσεις που ανάγονται σε πολυωνυμικές

ΓΛΩΣΣΑ ΑΛΦΑΒΗΤΟ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΣΤΑΘΕΡΕΣ ΜΕΤΑΒΛΗΤΕΣ

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

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

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

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

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


Περιληπτικά, τα βήματα που ακολουθούμε γενικά είναι τα εξής:

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΠΑΝΕΛΛΑΔΙΚΩΝ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Ορισμοί Σχεσιακού Μοντέλου και Τροποποιήσεις Σχέσεων σε SQL

K15 Ψηφιακή Λογική Σχεδίαση 7-8: Ανάλυση και σύνθεση συνδυαστικών λογικών κυκλωμάτων

H SQL είναι η γλώσσα για όλα τα εμπορικά σχεσιακά συστήματα διαχείρισης βάσεων δεδομένων

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

Διαδικασιακός Προγραμματισμός

Transcript:

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

Ερωτήματα Πολλαπλών Σχέσεων (multi-relation queries) Θα διαπιστώσετε στην πορεία ότι τα περισσότερο ενδιαφέροντα ερωτήματα είναι αυτά που εμπλέκουν πολλές σχέσεις (πίνακες). Η εμπλοκή πολλών πινάκων σε ένα ερώτημα γίνεται παραθέτοντας τα ονόματά τους στο FROM τμήμα του ερωτήματος. Παράδειγμα: έστω οι σχέσεις: Likes(drinker, beer) και Frequents(drinker, bar) και το ερώτημα: "ποιες μπύρες αρέσουν στα άτομα που συχνάζουν στο bar A.P. Stump's"; SELECT beer FROM Frequents, Likes WHERE bar = 'A.P. Stump\'s' AND Frequents.drinker = Likes.drinker; υπενθυμίζεται ότι τα εσωτερικά μονά quotes σε αλφαριθμητικά στον MySQL Server πρέπει να μπαίνουν escaped, δηλαδή να προηγείται ο χαρακτήρας \ Προσέξτε ότι ξεχωρίζουμε τα γνωρίσματα με ίδιο όνομα (στο παράδειγμα, το drinker) βάζοντας μπροστά το όνομα της σχέσης (του πίνακα), π.χ. Likes.drinker Πώς ακριβώς υπολογίζεται η απάντηση στο παραπάνω ερώτημα; Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 2 - Βάσεις Δεδομένων Ι

Γινόμενο Σχέσεων (περισσότερα όταν μιλήσουμε για Σχεσιακή Άλγεβρα) Πρώτα θα δούμε την έννοια του γινομένου (product) σχέσεων. Έστω οι σχέσεις R1 και R2. Το γινόμενο των R1 και R2 είναι μια σχέση R3 = R1xR2 με: πλειάδες που προκύπτουν αν συνδυάσουμε κάθε πλειάδα της σχέσης R1 με κάθε πλειάδα της σχέσης R2 σχήμα (schema) που προκύπτει από την συνένωση των επιμέρους σχημάτων των R1 και R2, με αυτή όμως τη σειρά Σημείωση: αν υπάρχουν γνωρίσματα με ίδιο όνομα, βάζουμε μπροστά το όνομα της σχέσης. Παράδειγμα: Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 3 - Βάσεις Δεδομένων Ι

Ερωτήματα Πολλαπλών Σχέσεων (συνέχεια) SELECT beer FROM Frequents, Likes WHERE bar = 'A.P. Stump\'s' AND Frequents.drinker = Likes.drinker; Φανταστείτε 2 πλειάδες-μεταβλητές t1 και t2 (μία για κάθε σχέση). Αυτές επισκέπτονται κάθε συνδυασμό που προκύπτει παίρνοντας μια πλειάδα από κάθε σχέση. Αν οι t1 και t2 δείχνουν σε πλειάδες που ικανοποιούν τους περιορισμούς που θέτει το WHERE τμήμα του ερωτήματος, τότε από αυτές τις πλειάδες παίρνουμε την πληροφορία που ορίζει το SELECT τμήμα του ερωτήματος. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 4 - Βάσεις Δεδομένων Ι

Ρητή Χρήση Μεταβλητών Μερικές φορές κάποιο ερώτημα πρέπει να χρησιμοποιήσει δύο φορές την ίδια σχέση! πρέπει κάπως να ξεχωρίζει σε ποια σχέση από τις δύο ανήκουν τα διάφορα πεδία Δουλεύουμε ως εξής: στα ονόματα των σχέσεων στο FROM τμήμα, ορίζουμε μεταβλητές για κάθε σχέση πρακτικά, αλλάζουμε όνομα στις σχέσεις!!! στα ονόματα των πεδίων στο SELECT τμήμα χρησιμοποιούμε αυτές τις μεταβλητές Παράδειγμα: Στη σχέση Beers(name, manf), θέλουμε να βρούμε όλα τα ζευγάρια μπύρας του ίδιου κατασκευαστή, χωρίς όμως: να παράγονται ζευγάρια ίδιας μπύρας όπως (Budweiser, Budweiser) και επιπλέον, η πρώτη μπύρα στο ζευγάρι να προηγείται αλφαβητικά της δεύτερης π.χ. δεκτό το (Budweiser, Creamy Dark) αλλά όχι το (Creamy Dark, Budweiser) SELECT b1.name, b2.name FROM Beers b1, Beers b2 WHERE b1.manf = b2.manf AND b1.name < b2.name; Σημείωση: η ανισότητα με αλφαριθμητικά πρακτικά ελέγχει αν το b1.name προηγείται αλφαβητικά έναντι του b2.name. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 5 - Βάσεις Δεδομένων Ι

Υποερωτήματα (Subqueries) Ένα ερώτημα SELECT-FROM-WHERE μπορεί να χρησιμοποιηθεί (μέσα σε παρενθέσεις) ως τιμή σε μια σειρά θέσεων (όπως στο FROM και το WHERE) μέσα σε άλλο ερώτημα. Δηλαδή, αντί να βάλουμε μια σχέση μετά από μια δήλωση FROM, μπορούμε να βάλουμε ένα υποερώτημα (σε παρενθέσεις) και πρακτικά να κάνουμε την ερώτηση πάνω στα αποτελέσματα του υποερωτήματος! Αυτό είναι και τεχνικά αποδεκτό καθώς το αποτέλεσμα ενός SELECT ερωτήματος είναι το ίδιο μια σχέση! Παράδειγμα: "Βρες τις μπύρες που αρέσουν στα άτομα που συχνάζουν στο bar Caravan". SELECT beer FROM Likes, ( SELECT drinker FROM Frequents WHERE bar = 'Caravan') CaravanDrinker WHERE Likes.drinker = CaravanDrinker.drinker; Σημείωση: Χρειάστηκε να ορίσουμε πλειάδα-μεταβλητή (CaravanDrinker) για να αναφερθούμε στα αποτελέσματα του υποερωτήματος. Άρα το υποερώτημα (σε κίτρινο φόντο παραπάνω) "μαζεύει" τους πελάτες που συχνάζουν στο bar Caravan. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 6 - Βάσεις Δεδομένων Ι

Υποερωτήματα που επιστρέφουν μια τιμή! Αν ένα υποερώτημα εγγυημένα επιστρέφει μία μόνο πλειάδα μιας στήλης, τότε αυτό το υποερώτημα μπορεί να χρησιμοποιηθεί ως τιμή (value) σε κάποια σχετική θέση μέσα σε άλλο ερώτημα. Αν το υποερώτημα δεν επιστρέψει ακριβώς μία πλειάδα μιας στήλης, προκύπτει σφάλμα (run-time-error). Παράδειγμα: Μέσω της σχέσης Sells(bar, beer, price), βρες τα bar που πουλάνε τη μπύρα Hefeweizen στην ίδια τιμή που το bar Blue Tattoo χρεώνει την Killian's. Τα παρακάτω δύο ερωτήματα σίγουρα δουλεύουν: Βρες πόσο χρεώνει το Blue Tattoo για την μπύρα Killian's. SELECT price FROM Sells WHERE bar='blue Tattoo' AND beer='killian\'s'; Βρες τα bar που χρεώνουν το ίδιο ποσό για την μπύρα Hefeweizen. SELECT bar FROM Sells WHERE beer='hefeweizen' AND price=6; Συνδυασμός σε μια ερώτηση με χρήση υποερωτήματος: SELECT bar FROM Sells WHERE beer='hefeweizen' AND price = ( SELECT price FROM Sells Η εξίσωση price = (υποερώτημα) είναι αποδεκτή γιατί το υποερώτημα επιστρέφει ΜΙΑ ΜΟΝΟ τιμή (στο παράδειγμα, το 6). WHERE bar='blue Tattoo' AND beer='killian\'s' ); Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 7 - Βάσεις Δεδομένων Ι

Ο Τελεστής ΙΝ (ξανά!) Με τον τελεστή ΙΝ έχουμε πει ότι μπορούμε να ορίσουμε εύκολα μια συνθήκη για τις τιμές που θέλουμε/επιτρέπουμε να πάρει ένα πεδίο: SELECT name, city FROM Bars WHERE city IN ('Chicago', 'New York'); στα αποτελέσματα, το city θα είναι είτε Chicago ή New York Στην πραγματικότητα το ('Chicago', 'New York') είναι μια σχέση με δύο πλειάδες! ΑΡΑ αυτό που ακολουθεί το IN (ή το NOT IN) είναι μια σχέση (πίνακας!). ΑΡΑ μπορούμε στη θέση του ('Chicago', 'New York') να βάλουμε ακόμη και ένα υποερώτημα! (που ως γνωστό επιστρέφει πίνακα!) Παράδειγμα: Βρες την μπύρα και τον κατασκευαστή της για όσες μπύρες αρέσουν στον John. SELECT * FROM Beers WHERE name IN ( SELECT beer FROM Likes WHERE drinker = 'John' ); Οι μπύρες που αρέσουν στον John. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 8 - Βάσεις Δεδομένων Ι

Ο τελεστής EXISTS (υπάρχει) Σημείωση: τα υποερωτήματα επιστρέφουν πλειάδες με μια μόνο στήλη. Η εντολή EXISTS(<υποερώτημα>) επιστρέφει TRUE αν και μόνο αν το υποερώτημα επιστρέφει τουλάχιστον ένα αποτέλεσμα. Με απλά λόγια: επιστρέφει TRUE αν υπάρχει (exists) αποτέλεσμα στο υποερώτημα. Μπορεί να χρησιμοποιηθεί και με NOT μπροστά (βλ. παράδειγμα), οπότε τότε επιστρέφει TRUE αν δεν υπάρχει (NOT EXISTS) αποτέλεσμα στο υποερώτημα. Παράδειγμα: Από τη σχέση Beers(name, manf), βρες τις μπύρες που είναι οι μοναδικές που φτιάχνει ο κατασκευαστής τους! Σημείωση: Για να πάρετε αποτέλεσμα από τη mybeersdb, καταχωρήστε στη σχέση Beers την ('Amstel','Αθηναϊκή'). (διαγράψτε την μετά το παράδειγμα) SELECT name FROM Beers b1 WHERE NOT EXISTS ( SELECT * FROM Beers WHERE manf = b1.manf AND name <> b1.name ); Μπύρες με τον ίδιο κατασκευαστή (manf) όπως η μπύρα b1.name αλλά διαφορετικές από αυτή! Αυτό το manf ανήκει στην σχέση που βρίσκεται στο πλησιέστερο υποερώτημα, δηλ. στο Beers του υποερωτήματος και όχι το Beers του εξωτερικού ερωτήματος! Για αποφυγή σύγχυσης στα name, ορίσαμε τη μεταβλητή b1 για τον εξωτερικό πίνακα Beers. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 9 - Βάσεις Δεδομένων Ι

Ο τελεστής ALL Σημείωση: τα υποερωτήματα επιστρέφουν πλειάδες με μια μόνο στήλη. Η φράση x <> ALL(<subquery>) είναι αληθής (TRUE) αν και μόνο αν, για κάθε πλειάδα t της σχέσης που ορίζει το υποερώτημα, το x είναι διάφορο του t. με απλά λόγια: το x δεν βρίσκεται μέσα στα αποτελέσματα του υποερωτήματος! Δηλαδή, το <>ALL είναι ισοδύναμο με το NOT IN Αντί για <> μπορούμε να έχουμε άλλο τελεστή σύγκρισης (με ανάλογη ερμηνεία!). Παράδειγμα: x >= ALL(<subquery>) είναι TRUE αν το x είναι μεγαλύτερο ή ίσο από όλα (ALL) τα αποτελέσματα του υποερωτήματος. Παράδειγμα: Με τον πίνακα Sells(bar,beer,price), βρες τις μπύρες με την υψηλότερη τιμή! SELECT beer FROM Sells WHERE price >= ALL( SELECT price FROM Sells ); Η τιμή από την εξωτερική σχέση Sells, πρέπει να είναι μεγαλύτερη ή ίση από κάθε άλλη τιμή! Τελικά ποια είναι η ακριβότερη μπύρα στην mybeersdb; Στο bar Hedley Club η μπύρα Hefeweizen κοστίζει 8.00 $. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 10 - Βάσεις Δεδομένων Ι

Ο τελεστής ΑΝΥ Σημείωση: τα υποερωτήματα επιστρέφουν πλειάδες με μια μόνο στήλη (πεδίο). Η φράση x = ANY(<subquery>) επιστρέφει TRUE αν και μόνο αν υπάρχει κατ'ελάχιστο μια πλειάδα στο subquery με την οποία ισούται το x. Δηλαδή, για τον τελεστή = η ερμηνεία του ANY είναι ίδια με αυτή του IN στην εκδοχή που είδαμε στο slide #8: SELECT... FROM... WHERE x = ANY (SELECT... FROM...); SELECT... FROM... WHERE x IN (SELECT... FROM...); Αντί για = μπορεί να έχουμε οποιοδήποτε τελεστή σύγκρισης! Παράδειγμα: το x >= ANY(<subquery>) σημαίνει ότι το x είναι μεγαλύτερο ή ίσο από τουλάχιστον μια εγγραφή του υποερωτήματος. Οι τελεστές ALL και ANY είναι εξειδικεύσεις του τελεστή EXISTS. Το αποτέλεσμά τους μπορεί να παραχθεί με χρήση του τελεστή EXISTS και κατάλληλη διαμόρφωση του υποερωτήματος. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 11 - Βάσεις Δεδομένων Ι

Ένωση Τομή Διαφορά UNION INTERSECT EXCEPT H ένωση/union, η τομή/intersection και η διαφορά/difference σχέσεων εκφράζονται με τους ακόλουθους τρόπους (εννοείται με χρήση υποερωτημάτων): (<subquery>) UNION (<subquery>) (<subquery>) INTERSECT (<subquery>) (<subquery>) EXCEPT (<subquery>) Παράδειγμα με INTERSECT (δεν υποστηρίζεται σε MySQL) Μέσω των σχέσεων Likes(drinker,beer), Sells(bar,beer,price) και Frequents(drinker,bar), βρες τους πελάτες και τις μπύρες που: στον πελάτη αρέσει η μπύρα ο πελάτης συχνάζει σε τουλάχιστον ένα bar που πουλάει αυτή τη μπύρα (SELECT * FROM Likes) INTERSECT ( SELECT drinker, beer FROM Sells, Frequents WHERE Frequents.bar=Sells.bar ); Ο MySQL server υποστηρίζει μόνο την ένωση/union σχέσεων. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 12 - Βάσεις Δεδομένων Ι

Παράδειγμα UNION σε MySQL (SELECT * FROM Likes WHERE drinker='jesse') UNION (SELECT drinker, beer FROM Sells, Frequents WHERE Frequents.bar=Sells.bar AND drinker='jesse'); Το πρώτο υποερώτημα, μόνο του, επιστρέφει: Το δεύτερο υποερώτημα, μόνο του, επιστρέφει: Συνολικά το παραπάνω ερώτημα επιστρέφει: Οι πολλαπλές απαντήσεις (πλειάδες) προφανώς απαλείφονται. Αν τις θέλουμε όλες, αντί για UNION βάζουμε UNION ALL. Προσέξτε ότι τα δύο υποερωτήματα πρέπει να επιστρέφουν σχέσεις ίδιου σχήματος (drinker,beer), διαφορετικά δεν έχει νόημα το UNION (όμοια τα INTERSECT, EXCEPT) Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 13 - Βάσεις Δεδομένων Ι

Συγκεντρωτικοί Υπολογισμοί (Aggregations) Οι ακόλουθες συναρτήσεις εφαρμόζονται σε μια στήλη στο SELECT τμήμα ερωτήματος και κάνουν τον υπολογισμό πάνω σε όλα τα αποτελέσματα του ερωτήματος: COUNT (καταμέτρηση) Πόσες μπύρες είναι καταχωρημένες στον beers; (Απάντηση: 20) SELECT COUNT(*) FROM beers; Σε πόσες διαφορετικές τιμές πωλείται η Budweiser; (Απάντηση: 7) SELECT COUNT(DISTINCT price) FROM Sells WHERE beer = 'Budweiser'; SUM (άθροισμα) Πόσο κοστίζει να πιούμε όλες τις μάρκες μπύρας που σερβίρει το bar Caravan; (Απάντηση:9) SELECT sum(price) FROM sells where bar='caravan'; AVG (μέσος όρος - average) Ποια η μέση τιμή της Budweiser; (Απάντηση: 4.472222) SELECT avg(price) FROM sells WHERE beer='budweiser'; min (ελάχιστη τιμή με μικρούς χαρακτήρες σε MySQL) Ποια η τιμή της φθηνότερης μπύρας; (Απάντηση: 2.5) SELECT min(price) FROM sells; max (μέγιστη τιμή με μικρούς χαρακτήρες σε MySQL) Ποια η τιμή της ακριβότερης μπύρας; (Απάντηση: 8) SELECT max(price) FROM sells; Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 14 - Βάσεις Δεδομένων Ι

Ερμηνεία Συγκεντρωτικού Υπολογισμού με ΜΙΑ μόνο στήλη στο SELECT Έστω το ερώτημα: Ποια η μέση τιμή της Budweiser; SELECT avg(price) FROM sells WHERE beer='budweiser'; Σκεφτείτε το ίδιο ερώτημα χωρίς το συγκεντρωτικό υπολογισμό: SELECT price FROM sells WHERE beer='budweiser'; Τα αποτελέσματα φαίνονται στην αριστερή εικόνα. Όταν όμως γίνεται χρήση της συνάρτησης avg, τότε πάνω σε αυτά τα αποτελέσματα εκτελείται μέσος όρος και επιστρέφεται αυτό ως αποτέλεσμα (δεξιά εικόνα). Στην περίπτωση που στο SELECT υπάρχουν περισσότερες στήλες, τα πράγματα είναι πιο πολύπλοκα και απαιτείται η χρήση του τελεστή ομαδοποίησης GROUP BY. Θα το δούμε αναλυτικά παρακάτω. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 15 - Βάσεις Δεδομένων Ι

Συγκεντρωτικές Πράξεις και NULL Οι τιμές NULL αγνοούνται στους συγκεντρωτικούς υπολογισμούς COUNT, SUM και AVG, ενώ δεν μπορεί να είναι το min ή το max μιας στήλης! Αν όμως σε μια στήλη υπάρχουν μόνο NULL τιμές (ή δεν υπάρχουν καθόλου τιμές!) τότε το αποτέλεσμα ενός συγκεντρωτικού υπολογισμού είναι NULL, εκτός της καταμέτρησης (COUNT) που όπως είναι λογικό θα επιστρέψει μηδέν (0). Παραδείγματα: Ποια η μεγαλύτερη τιμή πώλησης της μπύρας foo; SELECT max(price) FROM sells WHERE beer='foo'; Απάντηση: null - δεν υπάρχει μπύρα foo! Πόσα bar πουλάνε την μπύρα foo; SELECT count(*) FROM sells WHERE beer='foo'; Απάντηση: 0 - κανένα μπαρ δεν πουλάει τη μπύρα foo Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 16 - Βάσεις Δεδομένων Ι

Ομαδοποίηση (Grouping) Είδαμε πιο πριν συγκεντρωτικές πράξεις σε ερώτημα με μία στήλη στο SELECT. Όταν υπάρχουν περισσότερες στήλες, όσες είναι αριστερά της στήλης του συγκεντρωτικού υπολογισμού πρέπει να ομαδοποιηθούν. Για τη μέση τιμή πώλησης της μπύρας Budweiser είχαμε γράψει: SELECT avg(price) FROM sells WHERE beer='budweiser'; Τι γίνεται αν θέλουμε τη μέση τιμή πώλησης κάθε μπύρας; Πώς θα προκύψει δηλαδή το αποτέλεσμα που απεικονίζεται δεξιά; Βήμα 1: γράφουμε το ερώτημα που φέρνει τα δεδομένα (εδώ τις μπύρες και τις τιμές τους από τον πίνακα Sells) SELECT beer, price FROM sells Βήμα 2: Βάζουμε συγκεντρωτικό υπολογισμό στη ζητούμενη στήλη και ομαδοποιούμε στις στήλες αριστερά της: SELECT beer, AVG(price) FROM Sells GROUP BY beer; Τα παραπάνω βήματα έχουν ευρύτερη εφαρμογή: Να βρείτε τη μέση τιμή μπύρας ανά πόλη Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 17 - Βάσεις Δεδομένων Ι

Ερμηνεία Συγκεντρωτικού Υπολογισμού με ΠΟΛΛΕΣ στήλες στο SELECT SELECT beer, AVG(price) FROM Sells GROUP BY beer; Οι πλειάδες-αποτέλεσμα του ερωτήματος SELECT...FROM...WHERE, ομαδοποιούνται με βάση την τιμή των πεδίων ομαδοποίησης (το beer στο παράδειγμα) και μετά σε κάθε ομάδα, εφαρμόζεται ο συγκεντρωτικός υπολογισμός που ορίζεται στο SELECT. Η εικόνα δεξιά απεικονίζει αυτό που πραγματικά γίνεται: Το τελικό αποτέλεσμα απεικονίζεται στην κάτω εικόνα. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 18 - Βάσεις Δεδομένων Ι

Ομαδοποίηση Παράδειγμα #2 Για κάθε πόλη και για κάθε μπαρ της πόλης, να υπολογιστεί πόσες μάρκες μπύρας πουλά κάθε μπαρ και σε τι μέση τιμή. SELECT city, bar, count(*) AS 'Πλήθος', avg(price) FROM Bars, Sells WHERE name=bar GROUP BY city, bar; Ο πίνακας αριστερά δίνεται βοηθητικά για να δείτε τα δεδομένα πριν την ομαδοποίηση και τους συγκεντρωτικούς υπολογισμούς. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 19 - Βάσεις Δεδομένων Ι

Βασικός Κανόνας Ομαδοποίησης (για να κάνετε γρήγορα σωστές εκφράσεις) Σε χρήση ομαδοποίησης, αν επιπλέον χρησιμοποιείται και κάποια συγκεντρωτική συνάρτηση, τότε όλα τα πεδία που αναφέρονται στο SELECT, πρέπει: είτε να βρίσκονται μέσα σε κάποια συνάρτηση συγκεντρωτικού υπολογισμού ή να αναφέρονται στη λίστα πεδίων του GROUP BY Στο παράδειγμα του προηγούμενου slide: SELECT city, bar, count(*) AS 'Πλήθος', avg(price) FROM Bars, Sells WHERE name=bar GROUP BY city, bar; Παρατηρήσεις: στο SELECT παραπάνω υπάρχουν 4 στήλες (city, bar, πλήθος, μέση τιμή) οι στήλες city, bar που είναι πριν από τις στήλες συγκεντρωτικού υπολογισμού ομαδοποιούνται στο GROUP BY με την ίδια σειρά επιτρέπεται η ταυτόχρονη χρήση περισσοτέρων συναρτήσεων ομαδοποίησης στο τμήμα SELECT, εφόσον είναι επιθυμητό, αρκεί να μην παραβιάζεται ο παραπάνω κανόνας. Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 20 - Βάσεις Δεδομένων Ι

Δήλωση HAVING Η δήλωση HAVING <condition> επιτρέπει να βάλουμε περιορισμούς στο αποτέλεσμα συγκεντρωτικών πράξεων. Μπαίνει μετά τη δήλωση GROUP BY. Παράδειγμα #1: στο ερώτημα του slide #18 έστω ότι θέλουμε να κρατήσουμε μόνο τις μπύρες με μέση τιμή >5: SELECT beer, AVG(price) AS avgprice FROM Sells GROUP BY beer HAVING avgprice > 5; ορίσαμε νέο όνομα στο μέσο όρο με χρήση του AS - αλλιώς γράφουμε AVG(price)>5 ΠΡΟΣΟΧΗ: η συνθήκη εφαρμόζεται σε κάθε ομάδα που προκύπτει από την ομαδοποίηση και όσες ομάδες δεν ικανοποιούν την συνθήκη απορρίπτονται! Παράδειγμα #2: Να βρεθεί η μέση τιμή για τις μπύρες που είτε πωλούνται σε τουλάχιστον 4 μπαρ ή κατασκευάζονται από την εταιρία Anheuser-Busch. SELECT beer, AVG(price) FROM Sells GROUP BY beer HAVING COUNT(bar) >= 4 OR beer IN ( SELECT name FROM Beers WHERE manf = 'Anheuser-Busch' ); Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 21 - Βάσεις Δεδομένων Ι

Δήλωση HAVING (συνέχεια) Δείτε δύο διαφορετικές εκδοχές του παραδείγματος 2 (προηγούμενο slide), με ή χωρίς φωλιασμένο ερώτημα. Τα ερωτήματα έχουν στοιχηθεί για εποπτικούς λόγους. SELECT beer, AVG(price) FROM Sells, Beers WHERE beer=name GROUP BY beer, manf HAVING COUNT(bar) >= 4 OR manf='anheuser-busch'; SELECT beer, AVG(price) FROM Sells GROUP BY beer HAVING COUNT(bar) >= 4 OR beer IN (SELECT name FROM Beers WHERE manf='anheuser-busch'); Σχόλια: Όπως έχουμε ξαναδεί, η μή-χρήση φωλιασμένου ερωτήματος (αριστερά) εισάγει επιπλέον πίνακα στο FROM και συνθήκη στο WHERE. Μέσα στο HAVING (δεξιά) δεν μπορούμε να χρησιμοποιήσουμε το manf (όπως κάνουμε αριστερά) διότι δεν υφίσταται τέτοια στήλη μετά τον συγκεντρωτικό υπολογισμό! Έτσι, η χρήση φωλιασμένου ερωτήματος είναι μονόδρομος στη δεξιά προσέγγιση, πλην όμως η αριστερή εκδοχή είναι απλούστερη και προκύπτει εντελώς μηχανικά, εφόσον έχει γίνει κατανοητός ο μηχανισμός! Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 22 - Βάσεις Δεδομένων Ι

Να δοκιμάσετε όλες τις εντολές στην database mybeersdb που σας δίνεται.... Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 23 - Βάσεις Δεδομένων Ι