Η SQL ως γλώσσα ερωτημάτωνvclass.uop.gr/modules/document/file.php/ITCOM324/SQL...

Post on 17-Mar-2021

16 views 0 download

Transcript of Η SQL ως γλώσσα ερωτημάτωνvclass.uop.gr/modules/document/file.php/ITCOM324/SQL...

Η SQL ως γλώσσα ερωτημάτων

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

Η γλώσσα SQL

Η SQL αποτελείται από:

DDL (Data Definition Language) - ορισμός, δημιουργία, τροποποίηση και διαγραφή σχήματος.

DML (Data Manipulation Language) - ορισμός, δημιουργία, τροποποίηση, διαγραφή και επιλογή δεδομένων (γλώσσα ερωτημάτων).

Προδιαγραφές ασφάλειας - χρήστες και δικαιώματα.

Βασική Δομή

Βασική Δομή

select Α1, Α2, .., Αn from R1, R2, … Rm where P

Μια χαρακτηριστική ερώτηση σε SQL έχει την εξής μορφή:

ονόματα σχέσεων

ονόματα γνωρισμάτων

συνθήκη

Στη Select μπαίνουν τα γνωρίσματα που θέλουμε να υπάρχουν στο αποτέλεσμα της ερώτησης.

4

Βασική Δομή (from)

select Α1, Α2, .., Αn from R1, R2, ...,Rn

Το from αντιστοιχεί στην πράξη του καρτεσιανού γινομένου της σχεσιακής άλγεβρας. Αυτό σημαίνει ότι θα μας εμφανίσει όλους τους συνδυασμούς, κάθε πλειάδας του R1 με όλες τις πλειάδες του R2 (π.χ. αν έχουμε 2 πίνακες στο from, τον R1 με 10 εγγραφές και τον R2 με 5 εγγραφές, θα εμφανιστούν 50 εγγραφές). Συνήθως όμως θέλουμε να εμφανίζονται μόνο οι σχετιζόμενες εγγραφές, και αυτό γίνεται με χρήση της where, ώστε να συνδεθούν οι σχετιζόμενοι πίνακες μέσω των ξένων κλειδιών

5

select (where) select Α1, Α2, .., Αn from R1, R2, … Rm where P

• Η συνθήκη P περιέχει γνωρίσματα των σχέσεων που εμφανίζονται στο from.

• Δεν είναι υποχρεωτικό τα γνωρίσματα αυτά να περιέχονται στο select.

• Θα εμφανιστούν μόνο όσες πλειάδες ικανοποιούν τη συνθήκη P.

• Όταν δεν υπάρχει το where, το P θεωρείται ότι είναι αληθές πάντα, άρα θα εμφανιστούν όλες οι πλειάδες

• ΠΡΟΣΟΧΗ: Δε γίνεται απαλοιφή των διπλών εμφανίσεων.

Βασική Δομή

Παράδειγμα:

select Όνομα from Παίζει where Τίτλος = ‘Gone by the Wind’

Ονόματα ηθοποιών που παίζουν στην ταινία “Gone by the Wind”

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού)

Παράδειγμα: Select

Παράδειγμα: Ονόματα όλων των ηθοποιών που έχουν παίξει σε ταινίες

Select

select Όνομα from Παίζει

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού)

Select

• Η SQL επιτρέπει πολλαπλές εμφανίσεις της ίδιας πλειάδας σε μια σχέση. • Όταν δεν θέλουμε να εμφανίζονται ίδιες γραμμές στα αποτελέσματα της select, χρησιμοποιούμε το distinct:

Απαλοιφή διπλών εμφανίσεων: Distinct

select distinct Όνομα from Παίζει

select * from Παίζει

Επιλογή όλων των γνωρισμάτων:

Select

select Τίτλος, Έτος, Διάρκεια / 60, Είδος from Ταινία

Επιστρέφει μια σχέση ίδια με τη σχέση Ταινία μόνο που το γνώρισμα διάρκεια μας δίνει τις ώρες (έχει διαιρεθεί με το 60)

Αριθμητικές πράξεις (+, -, *, /) ανάμεσα σε σταθερές ή γνωρίσματα πλειάδων

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού)

Εγγραφές που πληρούν κάποια Συνθήκη

Where

Παράδειγμα: Τον τίτλο όλων των ταινιών που γυρίστηκαν μετά το 1995 και είναι ασπρόμαυρες

select Τίτλος from Ταινία where Έτος > 1995 and Είδος = ‘Ασπρόμαυρη’

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού)

συνθήκη - where

Λογικοί τελεστές: and, or, not Τελεστές σύγκρισης: <, <=, >, >=, =, <>, between …. and …. , not between …. and …. Εφαρμόζονται σε αριθμητικές εκφράσεις και αλφαριθμητικά.

Where

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%”

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού)

Διάταξη των Πλειάδων

select distinct Ταινία, Έτος from Παίζει where Όνομα = ‘Robert De Niro’ order by Έτος

Χρήση του order by ώστε οι πλειάδες στο αποτέλεσμα να είναι ταξινομημένες με βάση τo αντίστοιχο γνώρισμα

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού)

Διάταξη των Πλειάδων

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

Παράδειγμα: select sum(Ποσό) from Δάνειο

• Σε αριθμητικές πράξεις: το αποτέλεσμα είναι null όταν οποιαδήποτε τιμή είναι null • Σε συγκρίσεις: σύγκριση με null συνήθως δίνει αποτέλεσμα false • Σε συναθροιστικές συναρτήσεις: αγνοείται, εκτός της count(*)

Αλλαγή Ονόματος

Τα ονόματα των γνωρισμάτων στο αποτέλεσμα είναι αυτά των σχέσεων στην ερώτηση.

Δυνατότητα αλλαγής του ονόματος τόσο μιας σχέσης όσο και ενός γνωρίσματος: <παλιό_όνομα> as <νέο_όνομα>

To as μπορεί να εμφανίζεται στο select ή στο from

Αλλαγή Ονόματος

Για παράδειγμα:

select Τίτλος, Έτος, Διάρκεια / 60 as Ώρες_Διάρκεια, Είδος from Ταινία

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού)

Χρήσιμο όταν:

(γ) δυο σχέσεις του from έχουν γνωρίσματα με το ίδιο όνομα,

(α) έχουμε αριθμητικές εκφράσεις στο select και δεν έχουν όνομα,

(β) θέλουμε να αλλάξουμε το όνομα του γνωρίσματος στο αποτέλεσμα.

Μεταβλητές Πλειάδων

Μια μεταβλητή πλειάδας μπορεί να οριστεί στο from χρησιμοποιώντας το as:

select distinct Όνομα from Παίζει as Π, Ταινία as Τ where Π.Τίτλος = Τ.Τίτλος and Π.Έτος = Τ.Έτος and Είδος = ‘Ασπρόμαυρη’

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού)

Φωλιασμένες Υπο-ερωτήσεις

Φωλιασμένες Υποερωτήσεις

Η SQL επιτρέπει το φώλιασμα υποερωτήσεων. Μια υποερώτηση είναι μια έκφραση select-from-where που χρησιμοποιείται μέσα σε μια άλλη ερώτηση.

Φωλιασμένες Υπο-ερωτήσεις

Γενική δομή: select ... from ... where ? (select ... from ... where ... );

υποερώτηση

Φωλιασμένες Υπο-ερωτήσεις

Ο τελεστής in (not in)

ελέγχει αν μια πλειάδα ανήκει (δεν ανήκει) σε ένα σύνολο από πλειάδες που έχουν προκύψει από μια έκφραση select-from-where.

Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και έχουν καταθέσεις

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 Δανειζόμενος )

Τα ονόματα όλων των πελατών που έχουν καταθέσεις και δεν έχουν πάρει δάνειο