Ειδικά Θζματα Βάςεων Δεδομζνων Ενότητα 4: Οι όψεισ ςτην SQL Δρ. Σςιμπίρθσ Αλκιβιάδθσ Σμιμα Μθχανικϊν Πλθροφορικισ ΣΕ
Άδειεσ Χρήςησ Σο παρόν εκπαιδευτικό υλικό υπόκειται ςε άδειεσ χριςθσ Creative Commons. Για εκπαιδευτικό υλικό, όπωσ εικόνεσ, που υπόκειται ςε άλλου τφπου άδειασ χριςθσ, θ άδεια χριςθσ αναφζρεται ρθτϊσ.
Χρηματοδότηςη Σο παρόν εκπαιδευτικό υλικό ζχει αναπτυχκεί ςτα πλαίςια του εκπαιδευτικοφ ζργου του διδάςκοντα. Σο ζργο «Ανοικτά Ακαδθμαϊκά Μακιματα ςτο ΣΕΙ Κεντρικισ Μακεδονίασ» ζχει χρθματοδοτιςει μόνο τθ αναδιαμόρφωςθ του εκπαιδευτικοφ υλικοφ. Σο ζργο υλοποιείται ςτο πλαίςιο του Επιχειρθςιακοφ Προγράμματοσ «Εκπαίδευςθ και Δια Βίου Μάκθςθ» και ςυγχρθματοδοτείται από τθν Ευρωπαϊκι Ζνωςθ (Ευρωπαϊκό Κοινωνικό Σαμείο) και από εκνικοφσ πόρουσ.
Ενότητα 4 Οι όψεισ ςτην SQL Δρ. Σςιμπίρθσ Αλκιβιάδθσ
Περιεχόμενα ενότητασ Βαςικι Δομι υμβολοςειρζσ διάταξθ Πράξεισ ςυνόλων υνακροίςτθκεσ υναρτιςεισ Φωλιαςμζνεσ Τπο-ερωτιςεισ υνενϊςεισ ςυνόλων Παραγόμενεσ χζςεισ Κανόνασ ερωτθμάτων 80-20 Όψεισ (Views)
Σκοποί ενότητασ το κεφάλαιο κα γίνει αναφορά ςτθν γλϊςςα SQL και ςυγκεκριμζνα ςτα εμφωλευμζνα ερωτιματα, περιοριςμοφσ ακεραιότθτασ, ςτθ δθμιουργία όψεων, ςτισ ςυνενϊςεισ ςυνόλων και τζλοσ ςτισ παραγόμενεσ ςχζςεισ.
Βαςική Δομή Μια χαρακτθριςτικι ερϊτθςθ ςε SQL ζχει τθν εξισ μορφι: ομόματα γμφρισμάτφμ select Α 1, Α 2,.., Α n from R1, R2, Rm where P ομόματα στέσεφμ σσμθήκη Ιςοδφναμο του: π A1, A 2,.., A n (ς P (R 1 x R 2 x R m ))
Βαςική Δομή Select Αρικμθτικζσ πράξεισ (+, -, *, /) ανάμεςα ςε ςτακερζσ ι γνωρίςματα πλειάδων Διαγραφι διπλότιμων: select distinct Συνθήκη του where Λογικοί τελεςτζσ: and, or, not Σελεςτζσ ςφγκριςθσ: <, <=, >, >=, =, <>, between, not between ανάμεςα ςε αρικμθτικζσ εκφράςεισ,ςυμβολοςειρζσ (strings), και ειδικοφσ τφπουσ.
Βαςική Δομή Όταν το ίδιο γνϊριςμα εμφανίηεται ςτο ςχιμα περιςςότερων από μια ςχζςεων, τότε γίνετε διάκριςθ βάςθ του ςυμβολιςμοφ: <όνομα-ςχζςθσ>.<όνομα-γνωρίςματοσ> Δυνατότθτα αλλαγήσ του ονόματοσ τόςο μιασ ςχζςθσ όςο και ενόσ γνωρίςματοσ: <παλιό-όνομα> as <νζο-όνομα> To as μπορεί να εμφανίηεται ςτο select ι ςτο from. Οι μεταβλητζσ πλειάδων είναι ιδιαίτερα χριςιμεσ όταν κζλουμε να ςυγκρίνουμε δυο πλειάδεσ τισ ίδιασ ςχζςθσ.
Συμβολοςειρζσ - διάταξη Πράξεισ με Συμβολοςειρζσ Θ πιο ςυνθκιςμζνθ πράξθ είναι ταίριαςμα προτφπων: % (* ςτην access) ταιριάηει οποιαδιποτε ςυμβολοςειρά _ ταιριάηει οποιοδιποτε χαρακτιρα φγκριςθ χρθςιμοποιϊντασ το like, not like Διάταξη των Πλειάδων Χριςθ του order by ϊςτε οι πλειάδεσ ςτο αποτζλεςμα να είναι ταξινομθμζνεσ με βάςθ το αντίςτοιχο γνϊριςμα. Default: αφξουςα διάταξθ, αλλά και άμεςα χρθςιμοποιϊντασ το asc (αφξουςα) ι το desc (φκινουςα).
Πράξεισ Συνόλων Πράξεισ: union intersection except Σφνταξη: (select-from-where) union (select-from-where) Απαλοιφι διπλϊν εμφανίςεων, εκτόσ αν χρθςιμοποιθκεί το union all. Τιμή null Χριςθ τθσ λζξθσ κλειδί is null (is not null) ςε μια ςυνκικθ για να ελζξουμε αν μια τιμι είναι null.
Συναθροίςτηκεσ Συναρτήςεισ Μζςοσ όροσ: avg(a) (μόνο ςε αρικμοφσ) Αν κζλουμε να απαλείψουμε Ελάχιςτο: min(a) διπλζσ εμφανίςεισ Μζγιςτο: max(a) χρθςιμοποιοφμε τθ λζξθ-κλειδί Άκροιςμα: sum(a) (μόνο ςε αρικμοφσ) distinct ςτθν αντίςτοιχθ ζκφραςθ Πλικοσ: count(a), όπου Α γνϊριςμα. group by: για να εφαρμόςουμε τισ ςυναρτιςεισ όχι μόνο ςε ζνα ςφνολο από πλειάδεσ, αλλά ςε ομάδεσ από ςφνολα πλειάδων. having: για να εφαρμόςουμε μια ςυνκικθ ςε μια ςυγκεκριμζνθ ομάδα από πλειάδεσ. Θ ςυνκικθ του having εφαρμόηεται αφοφ ςχθματιςτοφν οι ομάδεσ και υπολογιςτοφν οι ςυνακροιςτικζσ ςυναρτιςεισ.
Φωλιαςμζνεσ Υπο-ερωτήςεισ Γενικι δομι: select... from... υποερϊτηςη where? (select... from... where... ); Τπολογιςμόσ τθσ υποερϊτθςθσ για κάκε γραμμι (πλειάδα) τθσ εξωτερικισ ερϊτθςθσ.
Φωλιαςμζνεσ Υπο-ερωτήςεισ in/not in (ςυμμετοχι ςε ςφνολο) (>, =, κλπ) some/any/all (ςφγκριςθ ςυνόλων) exists/not exists (ζλεγχοσ για κενά ςφνολα) unique/not unique (ζλεγχοσ για διπλότιμα)
Συνενϊςεισ Συνόλων Θ SQL υποςτθρίηει διάφορουσ τφπουσ ςυνενϊςεων που ςυνικωσ χρθςιμοποιοφνται ςτο from, αλλά μποροφν να χρθςιμοποιθκοφν οπουδιποτε μπορεί να χρθςιμοποιθκεί μια ςχζςθ. Γενική ςφνταξη: <όνομα-ςχζςθσ1><τφποσ-ςυνζνωςθσ><όνομα-ςχζςθσ2><ςυνκικθ-ςυνζνωςθσ> ι <όνομα-ςχζςθσ1> natural <τφποσ-ςυνζνωςθσ> <όνομα-ςχζςθσ2>
Συνενϊςεισ Συνόλων Τφποι Συνζνωςησ: inner join: εςωτερικι (κιτα) ςυνζνωςθ left outer join: αριςτερι εξωτερικι ςυνζνωςθ right outer join : δεξιά εξωτερικι ςυνζνωςθ full outer join : ολικι εξωτερικι ςυνζνωςθ
Συνενϊςεισ Συνόλων Συνθήκεσ Συνζνωςησ: on P using (A 1, A 2,..., A n ): γνωρίςματα που πρζπει να ταιριάηουν ςτθ ςυνζνωςθ είναι τα A i. Είναι γνωρίςματα κοινά και ςτισ δυο ςχζςεισ και εμφανίηονται ςτο αποτζλεςμα μόνο μια φορά. Για τθν εςωτερικι ςυνζνωςθ θ ςυνκικθ δεν είναι υποχρεωτικι, όταν λείπει ιςοδυναμεί με καρτεςιανό γινόμενο.
Συνενϊςεισ Συνόλων Οι λζξεισ κλειδιά inner και outer είναι προαιρετικζσ. natural: φυςικι ςυνζνωςθ, τα γνωρίςματα εμφανίηονται ςτο αποτζλεςμα με τθν εξισ διάταξθ: πρϊτα αυτά με τα οποία ζγινε θ ςυνζνωςθ (δθλ., αυτά που είναι κοινά και ςτισ δφο ςχζςεισ), μετά τα υπόλοιπα τθσ πρϊτθσ ςχζςθσ, και τζλοσ τα υπόλοιπα τθσ δεφτερθσ ςχζςθσ. Παράδειγμα: Τα ονόματα των πελατϊν που είτε ζχουν καταθζςεισ είτε ζχουν πάρει δάνεια (αλλά όχι και τα δυο). select ΟΝΟΜΑ_ΠΕΛΑΣΘ from ΚΑΣΑΘΕΣΘ inner join ΔΑΝΕΙΗΟΜΕΝΟ where ΑΡ_ΛΟΓΑΡΙΑΜΟΤ is null or ΑΡ_ΔΑΝΕΙΟΤ is null
Παραγόμενεσ Σχζςεισ Θ SQL δίνει τθ δυνατότθτα μια υποερϊτθςθ να χρθςιμοποιθκεί ςτο from. Σότε πρζπει να τισ δοκεί ζνα όνομα και τα γνωρίςματα τθσ να μετανομαςτοφν Αυτό γίνεται χρθςιμοποιϊντασ το as Θ SQL δίνει τθ δυνατότθτα χρθςιμοποιϊντασ το as να δοκεί ζνα προςωρινό όνομα ςε μία προςωρινι ςχζςθ που προκφπτει από μια υποερϊτθςθ.
Παραγόμενεσ Σχζςεισ Παράδειγμα: Το μζςο υπόλοιπο για όλα τα υποκαταςτήματα για τα οποία το μζςο ποςό είναι μεγαλφτερο των $1200. select ΟΝΟΜΑ_ΤΠΟΚΑΣΑΣΘΜΑΣΟ, ΜΕΟ_ΤΠΟΛΟΙΠΟ from (select ΟΝΟΜΑ_ΤΠΟΚΑΣΑΣΘΜΑΣΟ, avg(ποο) from ΚΑΣΑΘΕΣΘ group by ΟΝΟΜΑ_ΤΠΟΚΑΣΑΣΘΜΑΣΟ) as ΑΠΟΣΕΛΕΜΑ (ΟΝΟΜΑ_ΤΠΟΚΑΣΑΣΘΜΑΣΟ, ΜΕΟ_ΤΠΟΛΟΙΠΟ) where ΜΕΟ_ΤΠΟΛΟΙΠΟ> 1200
Κανόνασ ερωτημάτων 80-20 ε ζνα ςφςτθμα ςτο οποίο χρθςιμοποιείται βάςθ δεδομζνων (δθλαδι ςε όλα τα ςυςτιματα) εκτελοφνται πολλά ερωτιματα Ζχει παρατθρθκεί ζνασ εμπειρικόσ κανόνασ ότι οριςμζνα ερωτιματα εκτελοφνται πιο ςυχνά Παράδειγμα: Select * from customers where id=x Όπου Χ ζνασ ακζραιοσ αρικμόσ. Ο κανόνασ ορίηει ότι το 20% των ερωτθμάτων εκτελοφνται το 80% των φορϊν. Και το 80% των ερωτθμάτων ςυνολικά καταλαμβάνουν το υπόλοιπο 20%.
Κανόνασ ερωτημάτων 80-20 υνεπϊσ οριςμζνα ερωτιματα είναι πιο ςθμαντικά από τα υπόλοιπα, υπό τθν ζννοια ότι εκτελοφνται ςυχνότερα. Αυτό ςθμαίνει: Γρθγορότερθ εκτζλεςθ. Απλοποίθςθ. Αντί δθλαδι να χρειάηεται να γράψουμε κάκε φορά πολλοφσ χαρακτιρεσ. Επαναχρθςιμοποίθςθ.
Όψεισ (Views) Μποροφμε να ορίςουμε μια όψθ χρθςιμοποιϊντασ τθν εντολι: create view <όμομα--όυης> as <select-from-where ερώτηση> Σο αποτζλεςμα ενόσ ερωτιματοσ SELECT ζχει τθ μορφι πίνακα. Μποροφμε ζνα ερϊτθμα να το ονοματίςουμε και ζπειτα να το μεταχειριςτοφμε ωσ πίνακα. Επίςθσ, μποροφν να προςδιοριςτοφν τα ονόματα των γνωριςμάτων άμεςα create view <όμομα--όυης> (<λίστα ομομάτφμ-γμφρισμάτφμ>) as <select-from-where ερώτηση>
Όψεισ (Views) Κάκε φορά που εκτελοφμε ζνα ερϊτθμα ςε μία όψθ, αυτι επαναχπολογίςετε. Δθλαδι, τρζχει το ερϊτθμα το οποίο τθ δθμιουργεί. Ανάλογα με τα πεδία τα οποία περιζχουν και τουσ πίνακεσ, μπορεί να επιτρζπονται και λειτουργίεσ ενθμζρωςθσ, ειςαγωγισ και διαγραφισ. Σζτοιεσ όψεισ ονομάηονται updatable views ζναντι των Read-only vs. Θ βάςθ δεδομζνων αποφαςίηει ςε ποια κατθγορία μία όψθ ανικει.
Όψεισ (Views) Παράδειγμα : Μια όψη που περιλαμβάνει τα ονόματα όλων των υποκαταςτημάτων και το άθροιςμα του ποςοφ των δανείων που ζχουν γίνει από αυτά create view ΤΠΟΚΑΣΑΣΘΜΑ_ΤΝΟΛΟ_ΔΑΝΕΙΩΝ(ΤΝΟΛΟ_ΔΑΝΕΙΩΝ, ΟΝΟΜΑ_ΤΠΟΚΑΣΑΣΘΜΑ) as select ΟΝΟΜΑ_ΤΠΟΚΑΣΑΣΘΜΑ, sum(ποο) from ΔΑΝΕΙΑ group by ΟΝΟΜΑ_ΤΠΟΚΑΣΑΣΘΜΑ
Όψεισ (Views) Σα ονόματα όψεων μπορεί να χρθςιμοποιθκοφν οπουδιποτε μπορεί να χρθςιμοποιθκεί το όνομα μιασ ςχζςθσ. Ο οριςμόσ τθσ όψθσ παραμζνει ςτθν βάςθ δεδομζνων, εκτόσ αν ςβθςτεί: drop view <όνομα-όψθσ>