Η SQL ως γλώσσα ερωτημάτων Υπενθυμίζουμε: Σχέση = Πίνακας Πλειάδα = Εγγραφή = Γραμμή (Πίνακα) Πεδίο = Γνώρισμα (Σχέσης) = Στήλη (Πίνακα)
Η γλώσσα SQL Η SQL αποτελείται από: DDL (Data Definition Language) - ορισμός, δημιουργία, τροποποίηση και διαγραφή σχήματος. DML (Data Manipulation Language) - ορισμός, δημιουργία, τροποποίηση, διαγραφή και επιλογή δεδομένων (γλώσσα ερωτημάτων). Προδιαγραφές ασφάλειας - χρήστες και δικαιώματα.
Βασική Δομή Βασική Δομή Μια χαρακτηριστική ερώτηση σε SQL έχει την εξής μορφή: ονόματα γνωρισμάτων select Α 1, Α 2,.., Α n from R 1, R 2, R m where P ονόματα σχέσεων συνθήκη Στη Select μπαίνουν τα γνωρίσματα που θέλουμε να υπάρχουν στο αποτέλεσμα της ερώτησης.
Βασική Δομή (from) select Α 1, Α 2,.., Α n from R1, R2,...,Rn Το from αντιστοιχεί στην πράξη του καρτεσιανού γινομένου της σχεσιακής άλγεβρας. Αυτό σημαίνει ότι θα μας εμφανίσει όλους τους συνδυασμούς, κάθε πλειάδας του R1 με όλες τις πλειάδες του R2 (π.χ. αν έχουμε 2 πίνακες στο from, τον R1 με 10 εγγραφές και τον R2 με 5 εγγραφές, θα εμφανιστούν 50 εγγραφές). Συνήθως όμως θέλουμε να εμφανίζονται μόνο οι σχετιζόμενες εγγραφές, και αυτό γίνεται με χρήση της where, ώστε να συνδεθούν οι σχετιζόμενοι πίνακες μέσω των ξένων κλειδιών 4
select (where) select Α 1, Α 2,.., Α n from R1, R2, Rm where P Η συνθήκη P περιέχει γνωρίσματα των σχέσεων που εμφανίζονται στο from. Δεν είναι υποχρεωτικό τα γνωρίσματα αυτά να περιέχονται στο select. Θα εμφανιστούν μόνο όσες πλειάδες ικανοποιούν τη συνθήκη P. Όταν δεν υπάρχει το where, το P θεωρείται ότι είναι αληθές πάντα, άρα θα εμφανιστούν όλες οι πλειάδες ΠΡΟΣΟΧΗ: Δε γίνεται απαλοιφή των διπλών εμφανίσεων. 5
Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Παράδειγμα: Βασική Δομή Ονόματα ηθοποιών που παίζουν στην ταινία Gone by the Wind select Όνομα from Παίζει where Τίτλος = Gone by the Wind
Παράδειγμα: Select Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Select Παράδειγμα: Ονόματα όλων των ηθοποιών που έχουν παίξει σε ταινίες select Όνομα from Παίζει
Απαλοιφή διπλών εμφανίσεων: Distinct Select Η SQL επιτρέπει πολλαπλές εμφανίσεις της ίδιας πλειάδας σε μια σχέση. Όταν δεν θέλουμε να εμφανίζονται ίδιες γραμμές στα αποτελέσματα της select, χρησιμοποιούμε το distinct: select distinct Όνομα from Παίζει Επιλογή όλων των γνωρισμάτων: select * from Παίζει
Select Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Αριθμητικές πράξεις (+, -, *, /) ανάμεσα σε σταθερές ή γνωρίσματα πλειάδων select Τίτλος, Έτος, Διάρκεια / 60, Είδος from Ταινία Επιστρέφει μια σχέση ίδια με τη σχέση Ταινία μόνο που το γνώρισμα διάρκεια μας δίνει τις ώρες (έχει διαιρεθεί με το 60)
Εγγραφές που πληρούν κάποια Συνθήκη Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Where Παράδειγμα: Τον τίτλο όλων των ταινιών που γυρίστηκαν μετά το 1995 και είναι ασπρόμαυρες select Τίτλος from Ταινία where Έτος > 1995 and Είδος = Ασπρόμαυρη
συνθήκη - where Where Λογικοί τελεστές: and, or, not Τελεστές σύγκρισης: <, <=, >, >=, =, <>, between. and., not between. and. Εφαρμόζονται σε αριθμητικές εκφράσεις και αλφαριθμητικά.
Where Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Παράδειγμα χρήσης του between : select Τίτλος from Ταινία where Έτος between 1990 and 1995 αντί του select Τίτλος from Ταινία where Έτος >= 1990 and Έτος <= 1995
Εμφάνιση δεδομένων από σχετιζόμενους πίνακες: Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Όταν το ίδιο γνώρισμα εμφανίζεται σε περισσότερους από έναν πίνακες (από αυτούς που εμφανίζονται στο from), τότε αναφερόμαστε στο πεδίο ως εξής: <όνομα-πίνακα>.<όνομα-γνωρίσματος> Παράδειγμα: Να εμφανίζει τους ηθοποιούς που έχουν παίξει σε ασπρόμαυρες ταινίες select distinct Όνομα from Παίζει, Ταινία where Παίζει.Τίτλος = Ταινία.Τίτλος and Παίζει.Έτος = Ταινία.Έτος and Είδος = Ασπρόμαυρη
Παραδείγματα για εξάσκηση: Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Τις έγχρωμες ταινίες (τίτλο, έτος) με διάρκεια μέχρι 80 λεπτά τους ηθοποιούς που γεννήθηκαν μετά το 1935 και έπαιξαν σε ασπρόμαυρες ταινίες πριν το 1950
Αναζήτηση με χαρακτήρες μπαλαντέρ Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Χρήση του like αντί του = % οποιοαδήποτε ακολουθία χαρακτήρων _ ένας οποιοσδήποτε χαρακτήρας Παράδειγμα: Οι τίτλοι όλων των ταινιών που περιέχουν τη λέξη «planet» ή αποτελείται από 3 χαρακτήρες select distinct Τίτλος from Ταινία where Τίτλος like %planet% or Τίτλος like %planet%
Διάταξη των Πλειάδων Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Χρήση του order by ώστε οι πλειάδες στο αποτέλεσμα να είναι ταξινομημένες με βάση τo αντίστοιχο γνώρισμα select distinct Ταινία, Έτος from Παίζει where Όνομα = Robert De Niro order by Έτος
Διάταξη των Πλειάδων Default: αύξουσα διάταξη, αλλά και άμεσα χρησιμοποιώντας το asc (αύξουσα) ή το desc (φθίνουσα). Επίσης, ταξινόμηση με βάση πολλά γνωρίσματα: Όσες εγγραφές έχουν ίδια τιμή στο 1 ο κριτήριο ταξινομούνται με βάση το 2 ο, κ.ο.κ. Παράδειγμα: select * from Ταινία order by Έτος desc, Τίτλος asc Η ταξινόμηση είναι δαπανηρή λειτουργία.
Συναθροιστικές Συναρτήσεις Aggregate Functions Η SQL έχει 5 built-in συναθροιστικές συναρτήσεις: A είναι το γνώρισμα στο οποίο εφαρμόζονται Μέσος όρος: avg(a) (μόνο σε αριθμούς) Ελάχιστο: min(a) Μέγιστο: max(a) Άθροισμα: sum(a) (μόνο σε αριθμούς) Πλήθος: count(a)
Η ΒΔ «Τράπεζα» (Για τα ακόλουθα παραδείγματα εφαρμογών της SQL) Λογαριασμός Υποκατάστημα Δάνειο Όνομα_Υποκαταστήματος Αριθμός_Λογαριασμού Ποσό Όνομα_Υποκαταστήματος Πόλη Σύνολο Όνομα_Υποκαταστήματος Αριθμός_Δανείου Ποσό Δανειζόμενος Όνομα_Πελάτη Αριθμός_Δανείου Πελάτης Όνομα_Πελάτη Οδός Πόλη Καταθέτης Όνομα_Πελάτη Αριθμός_Λογαριασμού
Συναθροιστικές Συναρτήσεις Παράδειγμα: Μέσο ποσό όλων των λογαριασμών στο υποκατάστημα της Σπάρτης select avg(ποσό) from Λογαριασμός where Όνομα_Υποκαταστήματος = Σπάρτη Το αποτέλεσμα είναι μια σχέση με ένα γνώρισμα και μια γραμμή, μπορούμε να δώσουμε όνομα στο γνώρισμα χρησιμοποιώντας το as
Συναθροιστικές Συναρτήσεις Παράδειγμα: Μέγιστο ποσό όλων των λογαριασμών στο υποκατάστημα Σπάρτης και τον αριθμό του λογαριασμού!! select Αριθμός_Λογαριασμού, max(ποσό) from Λογαριασμός where Όνομα_Υποκαταστήματος = Σπάρτη Αν στο select έχουμε συναθροιστική/ές, επιτρέπονται και γνωρίσματα μόνο αν αυτά μπουν και στο group by
Συναθροιστικές Συναρτήσεις Μπορούμε να εφαρμόσουμε τις συναρτήσεις όχι μόνο σε ένα σύνολο από πλειάδες, αλλά σε ομάδες από σύνολα πλειάδων. Οι ομάδες προσδιορίζονται χρησιμοποιώντας το group by Παράδειγμα: Μέσο ποσό των λογαριασμών σε κάθε υποκατάστημα select Όνομα_Υποκαταστήματος, avg(ποσό) from Λογαριασμός group by Όνομα_Υποκαταστήματος
Συναθροιστικές Συναρτήσεις Αν θέλουμε να μην ληφθούν υπόψη οι διπλές εμφανίσεις χρησιμοποιούμε τη λέξη-κλειδί distinct στην αντίστοιχη έκφραση. Παράδειγμα: Αριθμός καταθετών σε κάθε υποκατάστημα select Όνομα_Υποκαταστήματος, count(distinct Όνομα_Πελάτη) from Καταθέτης, Λογαριασμός where group by Όνομα_Υποκαταστήματος
Συναθροιστικές Συναρτήσεις Η ομαδοποίηση μπορεί να γίνει ως προς περισσότερα του ενός πεδία. Μέσος όρος καταθέσεων ανά πελάτη και ανά υποκατάστημα SELECT Όνομα_Υποκαταστήματος, Όνομα_Πελάτη, avg(balance) FROM account GROUP BY Όνομα_Υποκαταστήματος, Όνομα_Πελάτη
Συναθροιστικές Συναρτήσεις Μπορούμε να εφαρμόσουμε μια συνθήκη σε μια συγκεκριμένη ομάδα από πλειάδες χρησιμοποιώντας το having Παράδειγμα: Ονόματα υποκαταστημάτων με μέσο ποσό καταθέσεων μεγαλύτερο των $1200 select Όνομα_Υποκαταστήματος, avg(ποσό) from Λογαριασμός group by Όνομα_Υποκαταστήματος having avg(ποσό) > 1200 Η συνθήκη του having εφαρμόζεται αφού σχηματιστούν οι ομάδες και υπολογιστούν οι συναθροιστικές συναρτήσεις.
Συναθροιστικές Συναρτήσεις 'Οταν εμφανίζονται και το where και το having: η συνθήκη του where εφαρμόζεται πρώτα, οι πλειάδες που ικανοποιούν αυτή τη συνθήκη τοποθετούνται σε ομάδες με βάση το group by και μετά αν υπάρχει συνθήκη στο having εφαρμόζεται στις ομάδες.
Συναθροιστικές Συναρτήσεις Για να μετρήσουμε πόσες εγγραφές ικανοποιούν ένα κριτήριο, π.χ. Πόσοι πελάτες είναι από τη Σπάρτη: select count(*) from Πελάτης where Πόλη = Σπάρτη Εδώ το αποτέλεσμα είναι ένας αριθμός.
Η τιμή null Η τιμή null Χρήση της λέξης κλειδί is null (is not null) σε μια συνθήκη για να ελέξουμε αν μια τιμή είναι null. select Αριθμός_Δανείου from Δάνειο where Ποσό is null
Η τιμή null Εμφάνιση null Σε αριθμητικές πράξεις: το αποτέλεσμα είναι null όταν οποιαδήποτε τιμή είναι null Σε συγκρίσεις: σύγκριση με null συνήθως δίνει αποτέλεσμα false Σε συναθροιστικές συναρτήσεις: αγνοείται, εκτός της count(*) Παράδειγμα: select sum(ποσό) from Δάνειο
Αλλαγή Ονόματος Τα ονόματα των γνωρισμάτων στο αποτέλεσμα είναι αυτά των σχέσεων στην ερώτηση. Δυνατότητα αλλαγής του ονόματος τόσο μιας σχέσης όσο και ενός γνωρίσματος: <παλιό_όνομα> as <νέο_όνομα> To as μπορεί να εμφανίζεται στο select ή στο from
Αλλαγή Ονόματος Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Για παράδειγμα: select Τίτλος, Έτος, Διάρκεια / 60 as Ώρες_Διάρκεια, Είδος from Ταινία Χρήσιμο όταν: (α) έχουμε αριθμητικές εκφράσεις στο select και δεν έχουν όνομα, (β) θέλουμε να αλλάξουμε το όνομα του γνωρίσματος στο αποτέλεσμα. (γ) δυο σχέσεις του from έχουν γνωρίσματα με το ίδιο όνομα,
Μεταβλητές Πλειάδων Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Μια μεταβλητή πλειάδας μπορεί να οριστεί στο from χρησιμοποιώντας το as: select distinct Όνομα from Παίζει as Π, Ταινία as Τ where Π.Τίτλος = Τ.Τίτλος and Π.Έτος = Τ.Έτος and Είδος = Ασπρόμαυρη
Φωλιασμένες Υπο-ερωτήσεις Φωλιασμένες Υποερωτήσεις Η SQL επιτρέπει το φώλιασμα υποερωτήσεων. Μια υποερώτηση είναι μια έκφραση selectfrom-where που χρησιμοποιείται μέσα σε μια άλλη ερώτηση.
Φωλιασμένες Υπο-ερωτήσεις Γενική δομή: select... from... where υποερώτηση? (select... from... where... );
Φωλιασμένες Υπο-ερωτήσεις Ο τελεστής in (not in) ελέγχει αν μια πλειάδα ανήκει (δεν ανήκει) σε ένα σύνολο από πλειάδες που έχουν προκύψει από μια έκφραση select-fromwhere. Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και έχουν καταθέσεις select distinct Όνομα_Πελάτη from Δανειζόμενος where Όνομα_Πελάτη in ( select Όνομα_Πελάτη from Καταθέτης)
Παραπάνω από δύο γνωρίσματα Φωλιασμένες Υπο-ερωτήσεις Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και έχουν καταθέσεις στο υποκατάστημα Νεάπολης select distinct Όνομα_Πελάτη from Δανειζόμενος, Δάνειο where Δανειζόμενος.Αριθμός_Δανείου = Δάνειο.Αριθμός.Δανείου and Όνομα_Υποκαταστήματος = Νεάπολη and ( Όνομα_Υποκαταστήματος, Όνομα_Πελάτη) in (select Όνομα_Υποκαταστήματος, Όνομα_Πελάτη from Καταθέτης, Λογαριασμός where Καταθέτης.Αριθμός_Λογαριασμού = Λογαριασμός.Αριθμός_Λογαριασμού )
Φωλιασμένες Υπο-ερωτήσεις Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Παράδειγμα: Τα ονόματα όλων των ηθοποιών που έπαιξαν σε ασπρόμαυρη ταινία select distinct Ηθοποιός.Όνομα from Παίζει where ( Παίζει.Τίτλος, Παίζει Έτος) in (select Ταινία.Τίτλος, Ταινία.Έτος from Ταινία where Είδος = Ασπρόμαυρη )
Η λέξη-κλειδί in Το in (ανήκει) μπορεί να χρησιμοποιηθεί και σε αριθμήσιμα πεπερασμένα σύνολα, τα οποία ορίζονται με παρενθέσεις. Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και δε λέγονται Παπαδόπουλος, Πέτρου ή Θωμόπουλος. select distinct Όνομα_Πελάτη from Δανειζόμενος where Όνομα_Πελάτη not in ( Παπαδόπουλος, Πέτρου, Θωμόπουλος )
Πράξεις Συνόλων Πράξεις Συνόλων Πράξεις: union (ένωση) intersection (τομή) except (αφαίρεση) Προφανώς εφαρμόζονται σε συμβατές σχέσεις. Δηλαδή ίδιου αριθμού και τύπου γνωρισμάτων
Πράξεις Συνόλων Γενική Σύνταξη: ( select from where ) union/intersection/except ( select from where)
Πράξεις Συνόλων στη ΒΔ «Τράπεζα» Λογαριασμός Υποκατάστημα Δάνειο Όνομα_Υποκαταστήματος Αριθμός_Λογαριασμού Ποσό Όνομα_Υποκαταστήματος Πόλη Σύνολο Όνομα_Υποκαταστήματος Αριθμός_Δανείου Ποσό Δανειζόμενος Όνομα_Πελάτη Αριθμός_Δανείου Πελάτης Όνομα_Πελάτη Οδός Πόλη Καταθέτης Όνομα_Πελάτη Αριθμός_Λογαριασμού
Πράξεις Συνόλων Για ένωση συνόλων: union Τα ονόματα όλων των πελατών που έχουν καταθέσεις ή/και έχουν πάρει δάνειο ( select Όνομα_Πελάτη from Καταθέτης ) union ( select Όνομα_Πελάτη from Δανειζόμενος )
Πράξεις Συνόλων Παράδειγμα intersect: Τα ονόματα όλων των πελατών που έχουν καταθέσεις και έχουν πάρει δάνειο ( select Όνομα_Πελάτη from Καταθέτης ) intersect ( select Όνομα_Πελάτη from Δανειζόμενος )
Πράξεις Συνόλων Παράδειγμα except: Τα ονόματα όλων των πελατών που έχουν καταθέσεις και δεν έχουν πάρει δάνειο ( select Όνομα_Πελάτη from Καταθέτης ) except ( select Όνομα_Πελάτη from Δανειζόμενος )