Lecture 15: SQL DML II

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

Lecture 14: SQL DML I

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

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

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

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

Lecture 16: SQL DML III

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ342: Βάσεις Δεδομένων. Χειμερινό Εξάμηνο Φροντιστήριο 10 ΛΥΣΕΙΣ. Επερωτήσεις SQL

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

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

Lecture 15: SQL DML II

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

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

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



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

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

Διάλεξη 07: Σχεσιακό Μοντέλο II (Relational Data Model) Διδάσκων: Παναγιώτης Ανδρέου

SQL Data Manipulation Language

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

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

Department of Computer Science University of Cyprus. EPL342 Databases. Lecture 8: RM II. Relational Model. (Chapter )

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

ΣΧΕΣΙΑΚΟ ΜΟΝΤΕΛΟ Σχεσιακός Ορισµός. Μαθ. #12

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

Διδάσκων: Παναγιώτης Ανδρέου

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

ΣΧΕΣΙΑΚΟ ΜΟΝΤΕΛΟ (Relational Model) Μαθ. #10

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

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

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

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

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

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

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

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

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

Εισαγωγή στη Σχεσιακή Άλγεβρα

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

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

S Q Q L L -- SQL (Structured Query Language) select insert update delete 2.47

Διάλεξη 10: Σχεσιακή Άλγεβρα και Σχεσιακός Λογισμός (Relational Algebra/Calculus) ΙI

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

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

Lecture 21: Functional Dependencies and Normalization

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

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

Διάλεξη 16: SQL DML IV, SQL DCL, SQL TCL. Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

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

Η Γλώσσα SQL. Μέρος α. Η Γλώσσα SQL Σελίδα 1

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

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

Η αναλυτική περιγραφή της γλώσσας SQL αποτελεί αντικείµενο των σελίδων που ακολουθούν. Η ΓΛΩΣΣΑ ΟΡΙΣΜΟΥ Ε ΟΜΕΝΩΝ

Department of Computer Science University of Cyprus. EPL342 Databases. Lecture 10: RA IΙ. RA Advanced + Examples

Διάλεξη 06: Σχεσιακό Μοντέλο I (Relational Data Model) Διδάσκων: Παναγιώτης Ανδρέου

1 / 87

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

1 / 97

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

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

Εισαγωγή στις Βάσεις Δεδομζνων II

Οργάνωση Βάσεων Βιοϊατρικών Δεδομένων Εξόρυξη Γνώσης Βιοϊατρικών Δεδομένων. Σεμινάριο 5: SQL

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

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

#5. Σχεσιακό Μοντέλο

Lecture 8: RM I + RA I

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

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

( Boats)) ( Tempsids, bid. sname. Boats. Boats. Boats. (Reserves)/ > Reserves. Interlake' Sailors) ...

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

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

Lecture 23: Functional Dependencies and Normalization

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

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

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


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

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

DELETE, UPDATE, INSERT

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

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

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

DISTINCT, LIKE, NULL, AND, OR, BETWEEN

Query-by-Example (QBE)

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

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

DELETE, UPDATE, INSERT.

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

ΗΓλώσσαSQL. Εισαγωγή Βασικές Έννοιες Τύποι Δεδομένων Ορισμός Δεδομένων Χειρισμός Δεδομένων

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

Πανεπιστήµιο Ιωαννίνων Τµήµα Μαθηµατικών Μάθηµα: Βάσεις εδοµένων (741) Εργαστηριακό Τεστ Οµάδα: Α 18/11/2004

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

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

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

Transcript:

Department of Computer Science University of Cyprus EPL342 Databases Lecture 15: SQL DML II SQL Structured Query Language (Chapter 8.4-8.5, Elmasri-Navathe 5ED) ιδάσκων: Παναγιώτης Ανδρέου http://www.cs.ucy.ac.cy/courses/epl342 15-1

Περιεχόμενο ιάλεξης Κεφάλαιο 8.4-8.5.4: SQL DML I Σύγκριση Συμβολοσειρών με LIKE ιάταξη Αποτελεσμάτων με ORDER-BY Συγκρίσεις με NULLS (IS NULL), Εμφωλευμένες Επερωτήσεις με Συσχέτιση / Χωρίς Συσχέτιση (Correlated/Uncorrelated Nested Queries) Σύγκριση Συνόλων / Πολύσυνόλων σε Επερωτήσεις SQL (EXIST, IN, op-all, op-any), ιαίρεση με χρήση NOT EXISTS... EXCEPT 15-2

Σύγκριση Συμβολοσειρών με LIKE Για την σύγκριση συμβολοσειρών (substring matching) σε SQL γίνεται χρήση του LIKE. WHERE Attribute [ NOT ] LIKE Pattern Attribute: Γνώρισμα ή οποιαδήποτε έγκυρη έκφραση. Pattern: Συμβολοσειρά (υπό μορφή «Κανονικής Έκφρασης») η οποία πρέπει να αναζητηθεί στο attribute. To Pattern μπορεί να περιέχει χαρακτήρες wildcard (next slide) Το pattern μπορεί να είναι μέχρι 8,000 bytes στην TSQL Παράδειγμα SELECT FirstName, LastName, Phone FROM Person.Contact WHERE phone LIKE '415%' 15-3

Σύγκριση Συμβολοσειρών με LIKE Wildcard character Περιγραφή Παράδειγμα % Συμβολοσειρά 0 ή περισσοτέρων χαρακτήρων WHERE title LIKE '%computer%' finds all book titles with the word 'computer' anywhere in the book title. _ (underscore) Οποιοσδήποτε Χαρακτήρας WHERE name LIKE '_ean finds all four-letter first names that end with ean (Dean, Sean, and so on). [ ] Οποιοσδήποτε χαρακτήρας σε εύρος ([a-f]) ή σύνολο ([abcdef]). WHERE name LIKE '[C-P]arsen' finds author last names ending with arsen and starting with any single character between C and P, for example Carsen, Larsen, Karsen, and so on.. [^] Οποιοσδήποτε χαρακτήρας που ΕΝ είναι σε ευρος ([^af]) ή σύνολο ([^abcdef]). WHERE name LIKE 'de[^l]%' all author last names starting with de and where the following letter is not l. 15-4

Σύγκριση Συμβολοσειρών με LIKE Query 12: Βρες τους υπαλλήλους που γεννήθηκαν κατά την δεκαετία του 1950s. Θεωρήστε ότι η ημερομηνία έχει την μορφοποίηση: MMDDYYYY Συνεπώς, ψάχνουμε το BDATE με τιμή 1 9 5_', όπου το underscore υποδηλώνει ένα αυθαίρετο χαρακτήρα. Q12: SELECT FNAME, LNAME FROM EMPLOYEE WHERE BDATE LIKE 1 9 5_ 15-5

Πράξεις σε Αποτελέσματα της Select Στα πλαίσια της Σχεσιακής Άλγεβρας είχαμε δει την γενικευμένη προβολή η οποία επέτρεπε εκτέλεση πράξεων σε αποτελέσματα της SQL. π.χ., Π Ταυτότητα, Μισθός-Αποκοπές, 2000*Χρόνια_Υπηρεσίας, 0.25*Μισθός (EMPLOYEE) Κάτι τέτοιο μπορεί να γίνει και στα πλαίσια της SQL. Τέτοιες πράξεις μπορεί να είναι Συναρτήσεις Συμβολοσειρών (Substring, κτλ) Συναρτήσεις Ημερομηνιών (Datediff, Getdate, κτλ) Αριθμητικές πράξεις ('+', '-'. '*', and '/ ) Μαθηματικές και άλλες Πράξεις (sqrt, PI, κτλ.) είτε το manual της TSQL για παραδείγματα 15-6

Πράξεις σε Αποτελέσματα της Select Παραδείγματα Πράξεων στην SELECT 1. SELECT LastName,SUBSTRING(FirstName, 1, 1) AS Initial 2. SELECT FNAME, LNAME, 1.1*SALARY 3. SELECT SOUNDEX(Name) Επιστρέφει ένα κωδικό 4 χαρακτήρων που μπορεί να αξιοποιηθεί για να αποτιμηθεί εάν 2 strings ακούγονται το ίδιο Π.χ., SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe'); Επιστρέφει S530 S530 4. SELECT DIFFERENCE(Name, Surname) Βρίσκει την ομοιότητα δυο γνωρισμάτων βάσει του SOUNDEX code. Λαμβάνει υπόψη μόνο τα πρώτα 8000 bytes των char, varchar ή text Παίρνει τιμές από 0 (καμία ομοιότητα).. 4 (ίδια) 15-7

ιάταξη Αποτελεσμάτων με το ORDER BY Η όρος ORDER BY χρησιμοποιείται σε μια έκφραση SQL για να ταξινομούνται οι πλειάδες μιας επερώτησης βάσει κάποιου/ων γνωρισμάτων που δηλώνονται. ORDER BY <attribute-list> [ASC DESC] Query 15: Τύπωσε τα στοιχεία όλων των employees του department 5 ταξινομημένα ανά επίθετο και μετά ανά όνομα Q15: SELECT * FROM EMPLOYEE E WHERE Ε.Dno=5 ORDER BY Ε.LNAME, E.FNAME Επισημάνσεις εν χρησιμοποιείται για ntext, text, image, κτλ. To ORDER BY μπορεί να αναφέρεται σε γνωρίσματα που ΕΝ εμφανίζονται στο SELECT list Π.χ., SELECT E.age FROM Emp E ORDER BY E.lname OK εν ισχύει με SELECT DISTINCT ή GROUP BY σε TSQL. Π.χ., SELECT DISTINCT E.age FROM Emp E ORDER BY E.lname; WRONG default 15-8

NULLS σε Επερωτήσεις SQL Σε τυπικές γλώσσες προγραμματισμού, οι λογικές εκφράσεις αποτιμούνται σε TRUE ή FALSE. Στην SQL ωστόσο, η ύπαρξη NULL τιμών επιβάλει την χρήση της Λογικής Τριών Τιμών (Three-value logic 3VL) Συγκεκριμένα, μια λογική έκφραση μπορεί να αποτιμηθεί σε TRUE, FALSE ή UNKNOWN Π.χ., NULL AND TRUE αποτιμάται σε UNKNOWN Η αποτίμηση λογικών εκφράσεων γίνεται με βάσει των ακόλουθων πινάκων αληθείας: 15-9

NULLS σε Επερωτήσεις SQL Παράδειγμα CREATE TABLE test ( id INTEGER PRIMARY KEY, age INTEGER CHECK (age < 0 AND age = 0 AND age> 0) ); Τι θα γίνει εάν προσπαθήσουμε να εισάγουμε το age=null; Θα απαγορέψει την εισαγωγή οποιασδήποτε τιμής ωστόσο μπορεί να εισαχθεί το NULL Για να αποφύγω και τα NULL πλήρως: CREATE TABLE test (id INTEGER PRIMARY KEY, age INTEGER NOT NULL CHECK (.) ); 15-10

NULLS σε Επερωτήσεις SQL Μια έκφραση του τύπου WHERE Attribute=NULL, είναι ΛΑΝΘΑΣΜΕΝΗ στην SQL. Για σύγκριση ενός γνωρίσματος με NULL στην SQL χρησιμοποιείται η έκφραση IS NULL ή IS NOT NULL. Επισημάνσεις ANSI: υο NULL τιμές είναι ανεξάρτητες (διαφορετικές) MSSQL: ΥΟ NULL τιμές είναι οι ίδιες (εξ ορισμού). Επομένως σε UNIQUE πεδίο δεν μπορούμε να έχουμε δυο εγγραφές με τιμή NULL. Αυτό, επειδή υπάρχει η εξ ορισμού ρύθμιση ANSI_NULLS OFF (στις ρυθμίσεις μιας βάσης) Εάν ενεργοποιηθεί η εν λόγω μεταβλητή, με SET ANSI_NULLS ON, τότε δυο διακριτές NULL τιμές θα θεωρούνται διαφορετικές όπως άλλωστε προβλέπει και το ANSI πρότυπο. 15-11

NULLS σε Επερωτήσεις SQL Relation CREATE TABLE test ( id int PRIMARY KEY, age INTEGER CHECK (age < 0 AND age = 0 AND age> 0 ) ); Query SELECT CASE WHEN age IS NULL THEN 'Null Result' -- when age is NULL WHEN age < 0 THEN Less than 0' εν εκτελούνται ποτέ WHEN age > 0 THEN Greater than 0' εάν η CHECK WHEN age = 0 THEN Equal 0' συνθήκη εφαρμόστηκε από την δημιουργία END της σχέσης test. FROM test; test: 1, NULL 2, NULL. Query Returns: 1, Null Result 2, Null Result. 15-12

NULLS σε Επερωτήσεις SQL Query 14: Βρες τα ονόματα όλων των υπαλλήλων που ΕΝ έχουν προϊστάμενους (supervisors). Q14: SELECT FNAME, LNAME FROM EMPLOYEE WHERE SUPERSSN IS NULL Θυμηθείτε ότι εάν η συνθήκη μιας συνένωσης παρουσιάσει NULL τιμές τότε αυτές οι πλειάδες ΕΝ περιλαμβάνονται στο αποτέλεσμα Π.χ., (ssn=12345, dno=null) *(dno=1,dname= A ) Στο αποτέλεσμα περιλαμβάνονται μόνο πλειάδες για τις οποίες η συνθήκη συνένωσης αποτιμάται σε TRUE To πιο πάνω ΕΝ ισχύει για Εξωτερικές Συνενώσεις (LEFT/RIGHT/FULL OUTER JOIN) τις οποίες θα δούμε στην ερχόμενη διάλεξη. 15-13

Απαριθμητά Σύνολα σε SQL (Enumerated Sets) Αντί για λογική συνθήκη στο WHERE της SQL, μπορούμε να κάνουμε την σύγκριση-βάσει-προσδιορισμένουσυνόλου, π.χ., Query 13: Ανάκτησε το SSN όλων των employees που δουλεύουν στα projects 1, 2, ή 3. Q13: SELECT DISTINCT ESSN FROM WORKS_ON WHERE PNO IN (1, 2, 3) Το (1,2,3) αποτελεί ένα απαριθμητό (enumerated) σύνολο βάσει του οποίου θα γίνει η σύγκριση. Το ΙΝ έχει αντίστοιχη λογική με τον τελεστή συνόλων Θα δούμε και άλλους όρους σύγκρισης με σύνολα (ΑΝΥ, ALL, EXISTS, κτλ.). 15-14

Εμφωλευμένες Επερωτήσεις (Nested Queries) Οι επερωτήσεις που είδαμε μέχρι τώρα ήταν σε ένα (1) SELECT-FROM-WHERE μπλοκ. Στην SQL είναι δυνατό να εμφωλεύονται τα μπλοκ κατά αντίστοιχο τρόπο που εμφωλεύουμε τις επαναλήψεις σε μια γλώσσα προγραμματισμού. Query1: Βρες το όνομα και την διεύθυνση όλων των υπαλλήλων που δουλεύουν για το 'Research' department. Q1: SELECT E.FNAME, E.LNAME, E.ADDRESS FROM EMPLOYEE E WHERE E.DNO IN ( SELECT D.DNUMBER FROM DEPARTMENT D WHERE D.DNAME='Research') Outer Query Inner Query 15-15

Εμφωλευμένες Επερωτήσεις (Nested Queries) ΚΑΘΕ Εμφωλευμένη Επερώτηση μπορεί να αναπαρασταθεί από Επερώτηση 1-μπλοκ (συνδυάζοντας τα ενδεχομένως με πράξεις συνόλων (UNION, EXCEPT, κτλ) Θα δούμε παράδειγμα σε λίγο ΗΕμφώλευση μπορεί να γίνει για όσα επίπεδα κάτω επιθυμούμε (στην TSQL μέχρι 32). Ωστόσο η βάση δεδομένων δυσκολεύεται να βελτιστοποιήσει τέτοιες επερωτήσεις, για αυτό η εμφώλευση πρέπει να χρησιμοποιείται με προσοχή. Γενικά είναι καλή πρακτική να εκφράζουμε τις επερωτήσεις απλά χωρίς βαθιές εμφωλεύσεις 15-16

Εμφωλευμένες Επερωτήσεις και Εμβέλεια Γνωρισμάτων SELECT E.FNAME, E.LNAME, E.ADDRESS FROM. EMPLOYEE E WHERE E.DNO IN ( SELECT D.DNUMBER FROM DEPARTMENT D Γνώρισμα Σύγκρισης WHERE D.DNAME='Research') Εμβέλεια Γνωρισμάτων Χωρίς Πρόθεμα: Σημειώστε ότι εάν δεν κάναμε χρήση των προθεμάτων D, E τότε η αναφορά σε κάποιο γνώρισμα θα αναφερόταν στο Inner Loop. Για την εμβέλεια των μεταβλητών (scope), χρησιμοποιούνται ουσιαστικά οι ίδιοι κανόνες που χρησιμοποιούνται στις γλώσσες προγραμματισμού. Το Γνώρισμα Σύγκρισης μπορεί να είναι διατεταγμένη ν- άδα π.χ., (E.DNO, E.ESSN) εφόσον το INNER Block είναι συμβατό-ως-προς-τον-τύπο με το γνώρισμα σύγκρισης. 15-17

Εμφωλευμένες Επερωτήσεις (Χρήση op-any, op-all) Οι εντολές op-any, op-all, όπου op είναι ένας τελεστής σύγκρισης (>, <, >=, <=, <>), χρησιμοποιούνται για να επεκτείνουν την εκφραστική δύναμη της SQL. Προϋπ: Συμβατότητα προς-τύπο μεταξύ Γνωρίσματος-Inner Block Παραδείγματα ΙΝ >= ALL IN (9) (εφόσον max=9) > ΑΝΥ IN (2, 4, 5, 6, 8, 9) (εφόσον min=1) <= ALL ΙΝ (1) (εφόσον min=1) 1, 2, 4, 5, 6, 8, 9 < ΑΝΥ IN (8, 6, 5, 4, 2, 1) (εφόσον max:9) Παράδειγμα σε SQL: Βρες τους υπαλλήλους που έχουν ψηλότερο μισθό από κάθε υπάλληλο στο τμήμα 5 SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE E.Salary > ALL ( SELECT E.Salary FROM EMPLOYEE E WHERE E.Dno=5) Προσέξτε ότι μπορούμε να χρησιμοποιούμε δυο φορές την δήλωση E (overriding). Στον inner βροχο χρησιμοποιείται το inner-e στο outer βρόχο το outer-e 15-18

Εμφωλευμένες Επερωτήσεις (Χρήση op-any, op-all) Παράδειγμα σε SQL: Βρες τους υπάλληλους που έχουν τον ψηλότερο μισθό από το τμήμα 5 με χρήση των τελεστών op-any, op-all SELECT E.FNAME, E.LNAME FROM WHERE EMPLOYEE E E.Dno=5 AND E.Salary >= ALL ( SELECT E.Salary FROM EMPLOYEE E WHERE E.Dno=5) Αργότερα θα δούμε την ίδια Επερώτηση με συναρθροιστική συνάρτηση. SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE E.Dno=5 AND E.Salary = ( SELECT MAX(E.Salary) FROM EMPLOYEE E WHERE E.Dno=5) Εάν INNER=(1000, 3000, 2000, 3000) τότε το >=ALL query επιστρέφει 2 employees Εάν το query ήταν > ALL με βάσει το πιο πάνω INNER θα επέστρεφε 0 employees Εάν το query ήταν = ALL με βάσει το πιο πάνω INNER θα επέστρεφε 0 employees 15-19

Συσχετιζόμενες Εμφωλευμένες Επερωτήσεις (Correlated Nested Queries) Όταν μια συνθήκη στο WHERE του Outer-block αναφέρεται σε κάποιο γνώρισμα του Inner-block τότε οι δυο επερωτήσεις λέγεται ότι είναι Συσχετιζόμενες (Correlated) Σημείωση: Η προηγούμενη επερώτηση δεν ήταν συσχετιζόμενη Query 12: Βρες το όνομα κάθε employee που έχει ένα dependent με το ίδιο όνομα με τον employee. Q12: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E Outer block WHERE E.SSN IN (SELECT D.ESSN FROM DEPENDENT D WHERE D.ESSN=E.SSN AND Inner block E.FNAME=D.DEPENDENT_NAME) 15-20

Εμφωλευμένες Επερωτήσεις vs. Επερωτήσεις 1 Μπλοκ ΚΑΘΕ Εμφωλευμένη Επερώτηση μπορεί να αναπαρασταθεί από Επερώτηση 1-μπλοκ (συνδυάζοντας τα ενδεχ. με πράξεις συνόλων (UNION, EXCEPT, κτλ) Κάποτε η εμφώλευση είναι πιο βολική (δεν ισχύει πιο κάτω) Ας δούμε πως αναπαριστάται η προηγούμενη επερώτηση Query 12: Βρες το όνομα κάθε employee που έχει ένα dependent με το ίδιο όνομα με τον employee. Χωρίς Εμφώλευση Q12A: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E, DEPENDENT D WHERE E.SSN=D.ESSN AND E.FNAME=D.DEPENDENT_NAME Με Εμφώλευση Q12: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE E.SSN IN (SELECT D.ESSN FROM DEPENDENT D WHERE D.ESSN=E.SSN AND 15-21 E.FNAME = D.DEPENDENT_NAME)

Εμφωλευμένες Επερωτήσεις και η Εντολή EXISTS Η εντολή EXISTS επιστρέφει TRUE εάν το αποτέλεσμα μιας εμφωλευμένης επερώτησης υπάρχει ( ΕΝ είναι κενό) WHERE [ΝΟΤ] EXISTS subquery Μια επερώτηση με EXISTS μπορεί να διατυπώνεται και με άλλους τρόπους (π.χ., με IN, Ενός-block, κτλ). Query 12b: Βρες το όνομα κάθε employee που έχει ένα dependent με το ίδιο όνομα με τον employee. Q12B: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE EXISTS (SELECT * FROM DEPENDENT D WHERE E.SSN=D.ESSN AND E.NAME = D.DEPENDENT_NAME) Το EXISTS έχει αντίστοιχη λογική με τον υπαρξιακό ποσοδείκτη x: P(x) που χρησιμοποιείται στον ορισμό συνόλων { x } 15-22

Εμφωλευμένες Επερωτήσεις και η Εντολή ΝΟΤ EXISTS Query 6 (Παράδειγμα NOT EXISTS): Βρες τα ονόματα των employees που ΕΝ έχουν dependents. Q6: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE NOT EXISTS (SELECT * FROM DEPENDENT D WHERE E.SSN=D.ESSN) Επισημάνσεις: Προσέξτε ότι η EXISTS αναφέρεται συνήθως σε συσχετιζόμενες εμφωλευμένες επερωτήσεις. Εναλλακτικά η συνθήκη αποτίμησης θα ήταν κάτι σταθερό. 15-23

Εμφωλευμένες Επερωτήσεις και η Εντολή EXISTS Query 6: Βρες τo SSN των employees χωρίς dependents. Q6a: Με 1-block Queries και Except (SELECT E.SSN FROM EMPLOYEE E) // ALL EXCEPT (SELECT DISTINCT D.ESSN FROM Dependent D) // WITH DEPENDENT Q6b: Με Χρήση του IN SELECT E.SSN FROM EMPLOYEE E WHERE E.SSN NOT IN ( SELECT DISTINCT D.ESSN FROM DEPENDENT D) Q6c: Με Χρήση EXISTS SELECT E.SSN FROM EMPLOYEE E WHERE NOT EXISTS ( SELECT * FROM DEPENDENT D WHERE D.ESSN=E.SSN) Το DISTINCT (πάνω σε nonkey) μειώνει τον αριθμό των ενδιάμεσων αποτελεσμάτων Μπορεί να διατυπωθεί το Query σε 1 block χωρίς πράξη συνόλων; 15-24

ιαίρεση σε SQL Παρόλο που οι αρχικές εκδόσεις της SQL όριζαν εξειδικευμένη εντολή διαίρεσης, την CONTAINS, μια τέτοια δυνατότητα ΕΝ υπάρχει στα νεότερα πρότυπα και υλοποιήσεις: Ενδεχόμενοι Λόγοι Εγκατάλειψης του CONTAINS: υσκολία Αποδοτικής Υλοποίησης Μειωμένη Χρήση της εν λόγω εντολής Στα πλαίσια αυτού του μαθήματος θεωρήστε ότι ΕΝ υπάρχει η εντολή διαίρεσης CONTAINS Για να διαιρέσουμε δυο σχέσεις θα χρησιμοποιήσουμε την λογική του NOT EXISTS. EXCEPT που ακολουθεί. Σημειώστε ότι σε TSQL, η εντολή CONTAINS χρησιμοποιείται για κάτι διαφορετικό την αναζήτηση σε πεδία κειμένου (όπως η LIKE) 15-25

Παράδειγμα ιαίρεσης σε SQL Query 3: Βρες το όνομα κάθε employee που δουλεύει σε ΚΑΘΕ project που ελέγχεται από το department number 5. 5 Q3: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE NOT EXISTS (( (SELECT P.Pnumber FROM PROJECT P WHERE P.Dnum=5) EXCEPT (SELECT W.PNO FROM WORKS_ON W WHERE E.SSN=W.ESSN) ) ALL Projects by Department 5 ALL Projects of Current Employee (outer block) 15-26

Παράδειγμα ιαίρεσης Suppliers(sid, sname, address) Parts(pid, pname, color) Catalog(sid, pid, cost) sid sname Address pid pname color sid pid cost s1 Supplier 1 Address 1 p1 Part 1 red s1 p1 100 s2 Supplier 2 Address 2 p2 Part 2 red s1 p2 150 s3 Supplier 3 Address 3 p3 Part 3 green s1 p3 100 s4 Supplier 4 Address 4 p4 Part 4 blue s1 p4 200 s2 p1 100 Query 4: Βρες τoυς suppliers που πουλάνε τα parts p2 και p4 s2 p2 150 s3 p2 100 Query 4 : Βρες τoυς suppliers που δεν υπάρχει part (μέσα στη λίστα με τα parts p2 και p4) που να μην παρέχουν s4 p2 200 s4 p4 250 ιπλή Άρνηση ιπλό NOT EXISTS 15-27

Παράδειγμα ιαίρεσης Q4a: SELECT s.sid FROM suppliers s WHERE NOT EXISTS ( SELECT p.pid FROM parts p WHERE pid IN ('p2', 'p4') AND NOT EXISTS ( SELECT c.pid from catalog c WHERE s.sid = c.sid AND p.pid=c.pid) ) Q4b: SELECT s.sid FROM suppliers s WHERE NOT EXISTS ( SELECT p.pid FROM parts p WHERE p.pid IN ('p2', 'p4') EXCEPT SELECT c.pid FROM catalog c WHERE s.sid=c.sid) Q4c: SELECT s.sid FROM suppliers s WHERE NOT EXISTS ( SELECT p.pid FROM parts p WHERE pid IN ('p2', 'p4') AND pid NOT IN ( SELECT pid FROM catalog c WHERE s.sid=c.sid) ) 15-28

υαδικοί Σχεσιακοί Τελεστές ιαίρεση (Division) A/ B= π x (Α) π x ((π x (Α) B) A) = all_results disqualifying_results all_results: Όλες οι δυνατές πλειάδες του αποτελέσματος π.χ., όλοι οι suppliers π x (Α) = { s 1, s 2, s 3, s 4 } Από το all_results πρέπει να αφαιρέσουμε τους ακατάλληλους suppliers (disqualifying_results) π χ αυτούς που ΕΝ προσφέρουν ΟΛΑ τα parts y Β. (δηλ., s 2, s 3 ) disqualifying_results συμβολίζεται με [ π x ((π x (Α) B) A)] Η επεξήγηση του πιο πάνω ακολουθεί διαγραμματικά x s1 s2 s3 x s1 s1 y p2 p4 y s2 p2 p2 s2 p4 p4 = s3 p2 s3 p4 s4 B s4 p2 π s4 p4 x (Α) (π x (Α) B) Όλοι οι υνατοί Συνδυασμοί x s1 s1 s1 s1 s2 s2 s3 y p1 p2 p3 p4 p1 p2 p2 s4 p2 A s4 p4 Πραγματικοί Συνδυασμοί x s1 s1 s1 s1 s2 s2 s3 s4 s4 Α Β y p2 p4 sno s2 s3 y p1 p2 p3 p4 p1 p2 p2 p2 p4 Disqualifying_ results = Τέλος, Α/Β = {s1,s2,s3,s4} {s2,s3} = {s1, 15-29 s4}

Παράδειγμα ιαίρεσης Suppliers(sid, sname, address) Parts(pid, pname, color) Catalog(sid, pid, cost) Q4d: SELECT sid FROM catalog EXCEPT (π x (Α) B) -A ) Q2 SELECT sid FROM ( SELECT DISTINCT sid, Q1.pid FROM catalog, π x (Α) EXCEPT (SELECT pid FROM parts B WHERE pid IN ('p2', 'p4')) Q1 π x (Α) π x ((π x (Α) B) A) SELECT sid, pid FROM catalog A (π x (Α) B) A B= π x (Α) π x ((π x (Α) B) A) 15-30

Παρατηρήσεις Η διαίρεση μπορεί να επιλυθεί και με JOINS σε συνδυασμό με συναθροιστικές συναρτήσεις (δες επόμενη διάλεξη) Απλό παράδειγμα με JOIN και COUNT Q4e: SELECT sid FROM catalog c JOIN ( SELECT pid FROM parts WHERE pid IN ('p2', 'p4') ) q ON c.pid=q.pid GROUP BY sid HAVING COUNT(c.pid)=( ) SELECT COUNT(*) FROM parts WHERE pid IN ('p2','p4') 15-31