Η Γλώσσα sql
DESCRIPTION
Η Γλώσσα SQL. Δαμιανός Χατζηαντωνίου Τμ. Διοικητικής Επιστήμης & Τεχνολογίας Οικονομικό Πανεπιστήμιο Αθηνών. Η γλώσσα SQL. Η “ standard ” γλώσσα για σχεσιακές βάσεις δεδομένων. αρχικά Sequel στην IBM ως μέρος του System R, τώρα SQL (Stuctured Query Language) - PowerPoint PPT PresentationTRANSCRIPT
1
Η Γλώσσα SQL
Δαμιανός ΧατζηαντωνίουΤμ. Διοικητικής Επιστήμης & ΤεχνολογίαςΟικονομικό Πανεπιστήμιο Αθηνών
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 2
Η γλώσσα SQL
• Η “standard” γλώσσα για σχεσιακές βάσεις δεδομένων.
• αρχικά Sequel στην IBM ως μέρος του System R, τώρα SQL (Stuctured Query Language)
• SQL--89, SQL--92, SQL-99
• Είναι γλώσσα δηλωτική (declarative) – ορίζουμε το ΤΙ, όχι το ΠΩΣ
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 3
Η γλώσσα SQL
Θέματα SQL:
• Γλώσσα Ορισμού Δεδομένων (Data Definition Lang)• Γλώσσα Χειρισμού Δεδομένων (Data Manipulation Lang)• Ορισμό Όψεων (Views)• Ακεραιότητα (Integrity Constraints)• Διαδικαστική SQL - Λογικοί Δρομείς (Cursors)• Ενσωματωμένη Γλώσσα SQL (Embedded SQL)• Stored Procedures• Triggers (Εναύσματα)• οι διαφάνειες αυτού του κεφαλαίου περιέχουν στοιχεία από τις αντίστοιχες διαφάνειες της κυρίας Ευαγγελίας Πιτουρά του Πανεπιστημίου Ιωαννίνων.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 4
Η γλώσσα SQL
SQL αποτελείται από:
DDL (Data Definition Language) - ορισμός, δημιουργία, τροποποίηση και διαγραφή σχήματος.
DML (Data Manipulation Language) - ορισμός, δημιουργία, τροποποίηση, διαγραφή και επιλογή δεδομένων (γλώσσα αιτημάτων – query language) .
Προδιαγραφές ασφάλειας - χρήστες και δικαιώματα.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 5
Γλώσσα Χειρισμού Δεδομένων
Θέματα:
• Βασική δομή (select-from-where)• Συναθροιστικές συναρτήσεις (aggregation)• Εμφωλευμένα υποαιτήματα (nested subqueries)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 6
Βασική Δομή
Βασική Δομή
select Α1, Α2, .., Αn
from R1, R2, … Rm
where P
Μια χαρακτηριστική ερώτηση σε SQL έχει την εξής μορφή:
Ισοδύναμο του: π A1, A2, .., An (σ P (R1 x R2 x … Rm))
ονόματα σχέσεων
ονόματα γνωρισμάτων
συνθήκη
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 7
Βασική Δομή
select αντιστοιχεί στην πράξη της προβολής (projection) της σχεσιακής άλγεβρας (προσοχή: όχι στην πράξη selection).Ποια γνωρίσματα θέλουμε να υπάρχουν στο τελικό αποτέλεσμα της ερώτησης.
select Α1, Α2, .., Αnfrom R1, R2, … Rm
where P
π A1, A2, .., An (σ P (R1 x R2 x …
Rm))
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 8
Βασική Δομή
select Α1, Α2, .., Αn
from R1, R2, … Rmwhere P
π A1, A2, .., An (σ P (R1 x R2 x …
Rm))
from αντιστοιχεί στην πράξη του καρτεσιανού γινομένου της σχεσιακής άλγεβρας. Ποιες σχέσεις θα χρησιμοποιηθούν για τον υπολογισμό του αποτελέσματος.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 9
Βασική Δομή
select Α1, Α2, .., Αn
from R1, R2, … Rmwhere P
π A1, A2, .., An (σ P (R1 x R2 x …
Rm))
where αντιστοιχεί στη συνθήκη της πράξης της επιλογής (selection) στη σχεσιακή άλγεβρα. Το κατηγόρημα (predicate) P έχει γνωρίσματα των σχέσεων που εμφανίζονται στο from.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 10
Βασική Δομή
• Όταν δεν υπάρχει το where, το P θεωρείται ότι ισχύει (true).
• ΠΡΟΣΟΧΗ: Δε γίνεται απαλοιφή των διπλών εμφανίσεων. Με άλλα λόγια δεν έχει συνολοθεωρητική ερμηνεία, όπως η σχεσιακή άλγεβρα.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 11
Παράδειγμα 1
Ταινία
Τίτλος Έτος Διάρκεια Είδος
Παίζει Όνομα Τίτλος Έτος
Όνομα Διεύθυνση Έτος-Γέννησης Σύζυγος-Ηθοποιού
Ηθοποιός
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 12
Παράδειγμα 2
Employee
Project
Department
Assigned
SSN
Works-in
Name
Id
Description
Location
Hours
Code
Sex
Salary
Name
BudgetMgrSSN
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 13
Παράδειγμα 2
Σχεσιακή σχεδίαση:
Employee (SSN, Name, Salary, Sex, DeptCode)
Project (Id, Description, Location)
Dept (Code, Name, Budget, MgrSSN)
Assigned (SSN, Id, Hours)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 14
Select
Παράδειγμα: δείξε όλα τα στοιχεία των υπαλλήλων
Select
select SSN, Name, Sex, Salary, DeptCodefrom Employee
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 15
Select
Παράδειγμα: Ονόματα όλων των ηθοποιών που έχουν παίξει σε ταινίες
Select
select Όνομαfrom Παίζει
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 16
Select
Παράδειγμα: δείξε τους μισθούς των υπαλλήλων
Select
select Salaryfrom Employee
• Η SQL επιτρέπει πολλαπλές εμφανίσεις της ίδιας πλειάδας σε μια σχέση (π.χ. ίδιοι μισθοί). Μια σχέση στην SQL είναι ένα πολυσύνολο (multiset) ή θύλακας (bag) => δεν υπάρχει απαλοιφή διπλοτιμών. Αυτό είναι πολύ χρήσιμο στις περισσότερες περιπτώσεις (π.χ. ?)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 17
Select
• Για να έχουμε απαλοιφή διπλοτιμών (duplicate elimination) θα πρέπει να το ζητήσουμε χρησιμοποιώντας το distinct.
Απαλοιφή διπλών εμφανίσεων
select distinct Salaryfrom Employee
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 18
Select
select *from Employee
Επιλογή όλων των γνωρισμάτων
select SSN, Name, Sex, Salary, DeptCodefrom Employee
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 19
Select
select Τίτλος, Έτος, Διάρκεια / 60, Είδοςfrom Ταινία
Επιστρέφει μια σχέση ίδια με τη σχέση Ταινία μόνο που το γνώρισμα διάρκεια μας δίνει τις ώρες (έχει διαιρεθεί με το 60)
Αριθμητικές πράξεις (+, -, *, /) ή εφαρμογή συναρτήσεων (π.χ. date ή string functions - αργότερα) ανάμεσα σε σταθερές ή γνωρίσματα πλειάδων
select Name, Salary * 340.75from Employee
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 20
Where
Where
Παράδειγμα: Τον τίτλο όλων των ταινιών που γυρίστηκαν μετά το 1995 και είναι ασπρόμαυρες
select Τίτλος from Ταινίαwhere Έτος > 1995 and Είδος = ''Ασπρόμαυρη''
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 21
Where
Where
Παράδειγμα: Το όνομα και το μισθό όλων των γυναικών στο τμήμα 23
select Name, Salaryfrom Employeewhere Sex = ‘F’ and DeptCode = 23
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 22
Where
Λογικοί τελεστές: and, or, not
Τελεστές σύγκρισης: <, <=, >, >=, =, <>, between, not between (ανάμεσα σε αριθμητικές εκφράσεις, συμβολο-σειρές [strings], και ειδικούς τύπους).
συνθήκη του where
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 23
Where
Παράδειγμα χρήσης του between :
select Τίτλος from Ταινίαwhere Έτος between 1990 and 1995
select Τίτλος from Ταινίαwhere Έτος >= 1990 and Έτος <= 1995
αντί του
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 24
From
From
Παράδειγμα: Δείξε το SSN των υπαλλήλων μαζί με το SSN του διευθυντή του τμήματος στο οποίο δουλεύει
select SSN, MgrSSNfrom Employee, Deptwhere DeptCode = Code
ΟΜΩΣ: Αν θέλαμε και το όνομα του τμήματος στο οποίο δουλεύει?
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 25
From
From
Παράδειγμα: Δείξε το SSN των υπαλλήλων μαζί με το όνομα του τμήματος στο οποίο δουλεύει
select SSN, Namefrom Employee, Deptwhere DeptCode = Code
Ποιό Name ??? Από ποιόν πίνακα ???
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 26
Βασική Δομή
• Όταν το ίδιο γνώρισμα εμφανίζεται στο σχήμα περισσότερων από μια σχέσεων, τότε διάκριση βάση του συμβολισμού:
<όνομα-σχέσης>.<όνομα-γνωρίσματος>
select SSN, Dept.Namefrom Employee, Deptwhere DeptCode = Code
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 27
From
Παράδειγμα φυσικής σύζευξης:Το ‘ονομα των ηθοποιών που παίζουν σε ασπρόμαυρες
ταινίες
select distinct Όνομαfrom Παίζει, Ταινίαwhere Παίζει.Τίτλος = Ταινία.Τίτλος and Παίζει.Έτος = Ταινία.Έτος and Είδος = “Ασπρόμαυρη”
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 28
From
From
Παράδειγμα: Δείξε το όνομα των υπαλλήλων που δουλεύουν στο τμήμα «Marketing»
select Employee.Namefrom Employee, Deptwhere DeptCode = Code and Dept.Name = ‘Marketing’
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 29
From
From
Παράδειγμα: Δείξε το όνομα των υπαλλήλων που δουλεύουν σε κάποιο project στο ‘Μαρούσι’
select Namefrom Employee, Assigned, Projectwhere Employee.SSN = Assigned.SSN and
Project.Id=Assigned.Id and Project.Location=‘Μαρούσι’
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 30
From
Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος)
Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
Παραδείγματα
• Έγχρωμες ταινίες με διάρκεια μέχρι 80 λεπτά
• Οι ηθοποιοί που γεννήθηκαν μετά το 1935 και έπαιξαν σε ασπρόμαυρες ταινίες πριν το 1945
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 31
Πράξεις με Συμβολοσειρές (Strings)
Πράξεις με Συμβολοσειρές
Η πιο συνηθισμένη πράξη είναι ταίριασμα προτύπων (pattern matching):
% ταιριάζει οποιαδήποτε συμβολοσειρά_ ταιριάζει οποιοδήποτε χαρακτήρα
Γίνεται διάκριση ανάμεσα σε κεφαλαία και μικρά
Σύγκριση χρησιμοποιώντας το like, not like
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 32
Πράξεις με Συμβολοσειρές
Παράδειγμα: Δείξε όλα τα IDs των projects που έχουν στην περιγραφή τους το string «Αττική οδός»
select IDfrom Projectwhere Description like “%Αττική οδός%”
Πολλές ακόμα πράξεις διαθέσιμες για pattern matching – κυττάξτε στο on line help για την Transact-SQL.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 33
Πράξεις με Συμβολοσειρές
Παράδειγμα: Οι τίτλοι όλων των ταινιών που περιέχουν τη λέξη
Θάλασσα
select distinct Τίτλοςfrom Ταινία where Τίτλος like “%Θάλασσα%”
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 34
Διάταξη των Πλειάδων
Διάταξη των Γραμμών του αποτελέσματος
select Ταινία, Έτος from Παίζειwhere Όνομα = “Robert De Niro”order by Έτος
Χρήση του order by ώστε οι πλειάδες στο αποτέλεσμα να είναι ταξινομημένες με βάση τo αντίστοιχο γνώρισμα
select Name, Salary from Employeewhere DeptCode = 311order by Salary
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 35
Διάταξη των Πλειάδων
Default: αύξουσα διάταξη, αλλά και άμεσα χρησιμοποιώντας το asc (αύξουσα) ή το desc (φθήνουσα). Επίσης, ταξινόμηση με βάση πολλά γνωρίσματα.
Παράδειγμα:
select *from Ταινίαorder by Έτος desc, Τίτλος asc
Η ταξινόμηση είναι δαπανηρή λειτουργία.
Παράδειγμα:
select *from Employeeorder by DeptCode asc, Salary desc
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 36
Αλλαγή Ονόματος
Αλλαγή Ονόματος
Τα ονόματα των γνωρισμάτων στο αποτέλεσμα είναι αυτά των σχέσεων στην ερώτηση.
Δυνατότητα αλλαγής του ονόματος τόσο μιας σχέσης όσο και ενός γνωρίσματος:
<παλιό-όνομα> as <νέο-όνομα>
To as μπορεί να εμφανίζεται στο select ή στο from (aliases)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 37
Αλλαγή Ονόματος
Για παράδειγμα:
select Τίτλος, Έτος, Διάρκεια / 60 as Ώρες-Διάρκεια, Είδοςfrom Ταινία
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 38
Αλλαγή Ονόματος
Χρήσιμο όταν
(γ) δυο σχέσεις του from έχουν γνωρίσματα με το ίδιο όνομα,
(α) όταν έχουμε αριθμητικές εκφράσεις στο select και δεν έχουν όνομα,
(β) όταν θέλουμε να αλλάξουμε το όνομα του γνωρίσματος στο αποτέλεσμα.
(δ) όταν έχουμε self-joins
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 39
Πράξεις Συνόλων
Πράξεις Συνόλων
Πράξεις:
• union• intersection• except
εφαρμόζονται σε συμβατές σχέσεις (same arity, domain).
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 40
Πράξεις Συνόλων
Γενική Σύνταξη:
( select from where )union/intersection/except( selectfrom where)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 41
Πράξεις Συνόλων
Λογαριασμός
Υποκατάστημα
Πελάτης
Καταθέτης
Δάνειο
Όνομα-Υποκαταστήματος Αριθμός-Λογαριασμού Ποσό
Όνομα-Πελάτη Αριθμός-Λογαριασμού
Όνομα-Πελάτη Οδός Πόλη
Όνομα-Υποκαταστήματος Πόλη Σύνολο
Όνομα-Πελάτη Αριθμός-Δανείου
Όνομα-Υποκαταστήματος Αριθμός-Δανείου Ποσό
Δανειζόμενος
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 42
Πράξεις Συνόλων
Παράδειγμα union:
( select Όνομα-Πελάτηfrom Καταθέτης )union( select Όνομα-Πελάτηfrom Δανειζόμενος )
Τα ονόματα όλων των πελατών που έχουν καταθέσεις ή/και έχουν πάρει δάνειο
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 43
Πράξεις Συνόλων
Σε αυτές τις πράξεις έχουμε απαλοιφή διπλών εμφανίσεων, εκτός αν χρησιμοποιηθεί το union all
Μέγιστος αριθμός πολλαπλών εμφανίσεων;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 44
Πράξεις Συνόλων
Αντίστοιχα υπάρχει το intersect all
Μέγιστος αριθμός πολλαπλών εμφανίσεων;
Παράδειγμα intersect:
( select Όνομα-Πελάτηfrom Καταθέτης )intersect( select Όνομα-Πελάτηfrom Δανειζόμενος )
Τα ονόματα όλων των πελατών που έχουν καταθέσεις και έχουν πάρει δάνειο
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 45
Πράξεις Συνόλων
Αντίστοιχα υπάρχει το except all
Μέγιστος αριθμός πολλαπλών εμφανίσεων;
Παράδειγμα except:
( select Όνομα-Πελάτηfrom Καταθέτης )except( select Όνομα-Πελάτηfrom Δανειζόμενος )
Τα ονόματα όλων των πελατών που έχουν καταθέσεις και δεν έχουν πάρει δάνειο
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 46
Πράξεις Συνόλων
Αντίστοιχα υπάρχει το except all
Μέγιστος αριθμός πολλαπλών εμφανίσεων;
Παράδειγμα except:
( select SSNfrom Employee )except( select MgrSSNfrom Dept )
Τo SSN των υπαλλήλων που δεν είναι διευθυντές τμήματος.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 47
Μεταβλητές Πλειάδων (tuple variables)
Μεταβλητές Πλειάδων (tuple variables)
Μια μεταβλητή πλειάδας μπορεί να οριστεί στο from χρησιμοποιώντας το as:
select distinct Όνομαfrom Παίζει as Π, Ταινία as Τwhere Π.Τίτλος = Τ.Τίτλος and Π.Έτος = Τ.Έτος and Είδος = “Ασπρόμαυρη”
H ιδέα είναι ότι η μεταβλητή «τρέχει» επί του πίνακα γραμμή-γραμμή
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 48
Μεταβλητές Πλειάδων
• Οι μεταβλητές πλειάδων είναι ιδιαίτερα χρήσιμες όταν θέλουμε να συγκρίνουμε δυο πλειάδες της ίδιας σχέσης (self-join). Παράδειγμα: Τα ονόματα όλων των ταινιών που έχουν διάρκεια μεγαλύτερη τουλάχιστον από μία ταινία που γυρίστηκε το 1995
select distinct Τ.Τίτλοςfrom Ταινία as S, Ταινία as Twhere T.Διάρκεια > S. Διάρκεια and S.Έτος = 1995
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 49
Μεταβλητές Πλειάδων
• Οι μεταβλητές πλειάδων είναι ιδιαίτερα χρήσιμες όταν θέλουμε να συγκρίνουμε δυο πλειάδες της ίδιας σχέσης (self-join). Παράδειγμα: Για κάθε τμήμα, δείξε τα τμήματα που έχουν μεγαλύτερο budget από αυτό
select D.Code, G.Codefrom Dept as D, Dept as Gwhere D.Code < G.Code
υπολογισμός?
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 50
Η τιμή null
Η τιμή null
Χρήση της λέξης κλειδί is null (is not null) σε μια συνθήκη για να ελέγξουμε αν μια τιμή είναι null.
select Αριθμός-Δανείουfrom Δάνειο where Ποσό is null
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 51
Η τιμή null
Εμφάνιση null
Παράδειγμα: select sum(Ποσό)from Δάνειο
• Σε αριθμητικές πράξεις: το αποτέλεσμα είναι null όταν οποιαδήποτε τιμή είναι null• Σε συγκρίσεις: σύγκριση με null συνήθως δίνει αποτέλεσμα false• Σε συναθροιστικές συναρτήσεις: αγνοείται πλην από το count(*)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 52
Εμφωλιασμένa Υποερωτήματα (nested subqueries)
Εμφωλιασμένα υποερωτήματα
• Μερικά ερωτήματα απαιτούν πρώτα τον υπολογισμό κάποιων τιμών και κατόπιν τη χρησιμοποίησή τους στις συνθήκες του WHERE. • Η SQL επιτρέπει το nesting υποερωτήμάτων (δομημένα υποερωτήματα). • Μια υποερώτηση είναι μια έκφραση select-from-where που χρησιμοποιείται μέσα σε μια άλλη ερώτηση.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 53
Nested Subqueries
Γενική δομή: select ... from ... where ? (select ... from ... where ... );
Υπολογισμός της υποερώτησης για κάθε γραμμή (ή πλειάδα) της εξωτερικής ερώτησης
υποερώτηση ή εσωτερικό ερώτημα (inner query)εξωτερικό
ερώτημα (οuter query)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 54
Εμφωλιασμένa Υποερωτήματα (nested subqueries)
Παράδειγμα: Βρες όλους τους υπαλλήλους που δουλεύουν σε κάποιο τμήμα με budget > 200000
select *from Employeewhere DeptCode in (
select Codefrom Deptwhere Budget > 200000 )
To υποερώτημα δεν εξαρτάται/συσχετίζεται (correlated) με το εξωτερικό ερώτημα. Αυτό δεν ισχύει πάντοτε (correlation).
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 55
Εμφωλιασμένa Υποερωτήματα (nested subqueries)
• Η SQL έχει μια συνολοθεωρητική κατεύθυνση. Θα έπρεπε λοιπόν να επιτρέπει συγκρίσεις συνόλων στο WHERE κομμάτι.• Παράδειγμα: προηγουμένως το “in”
• Μπορούμε να έχουμε όσα επίπεδα εμφωλίασης επιθυμούμε• Δομή και συντακτικό?
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 56
Εμφωλιασμένa Υποερωτήματα (nested subqueries)
Συνδυασμοί:
• WHERE <value> in / not in A
• WHERE <value> some A< <=> >== <>
• WHERE <value> all A< <=> >== <>
• WHERE A contains/ not contains B *
• WHERE exists/ not exists A
•A, Β είναι υποερωτήματα της μορφής select-from-where. •Μπορεί να είναι συσχετισμένα (correlated), μπορεί και όχι. [exists?] Σε αυτές τις περιπτώσεις, τα Α και Β είναι διαφορετικά για κάθε γραμμή.
• WHERE unique/ not unique A * not standard
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 57
Nested Subqueries
Ο τελεστής in (not in)
ελέγχει αν μια πλειάδα ανήκει (δεν ανήκει) σε ένα σύνολο από πλειάδες που έχουν προκύψει από μια έκφραση select-from-where. Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και έχουν καταθέσεις
select distinct Όνομα-Πελάτηfrom Δανειζόμενος where Όνομα-Πελάτη in ( select Όνομα-Πελάτη from Καταθέτης)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 58
Nested Subqueries
Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και έχουν καταθέσεις στο υποκατάστημα Ψηλά-Αλώνια
select distinct Όνομα-Πελάτη from Δανειζόμενος, Δάνειο where Δανειζόμενος.Αριθμός-Δανείου = Δάνειο.Αριθμός.Δανείου and Όνομα-Υποκαταστήματος = “Ψηλά-Αλώνια” and ( Όνομα-Υποκαταστήματος, Όνομα-Πελάτη) in (select Όνομα-Υποκαταστήματος, Όνομα-Πελάτη from Καταθέτης, Λογαριασμός where Καταθέτης.Αριθμός-Λογαριασμού =
Λογαριασμός.Αριθμός-Λογαριασμού)
• Παραπάνω από δύο γνωρίσματα
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 59
Nested Subqueries
Παράδειγμα: Τα ονόματα όλων των ηθοποιών που έπαιξαν σε ασπρόμαυρη ταινία
select distinct Ηθοποιός.Όνομαfrom Παίζει where ( Παίζει.Τίτλος, Παίζει Έτος) in
(select Ταινία.Τίτλος, Ταινία.Έτος from Ταινία where Είδος = «Ασπρόμαυρη»)
Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος)
Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 60
Nested Subqueries
Μπορεί να χρησιμοποιηθεί και με enumerated σύνολα
Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και δε λέγονται “Παπαδόπουλος” ή “Πέτρου”.
select distinct Όνομα-Πελάτηfrom Δανειζόμενοςwhere Όνομα-Πελάτη not in (“Παπαδόπουλος” , “Πέτρου”)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 61
Nested Subqueries
Σύγκριση Συνόλων
1. Ο τελεστής some (any) έχει τη σημασία του τουλάχιστον ένα από ένα σύνολο
Παράδειγμα: Τα ονόματα όλων των υποκαταστημάτων που έχουν καταθέσεις μεγαλύτερες από τις καταθέσεις ενός τουλάχιστον υποκαταστήματος των Ιωαννίνων.
select distinct Όνομα-Υποκαταστήματοςfrom Υποκατάστημαwhere Ποσό > some (select Ποσό
from Υποκατάστημα where Πόλη = “Ιωάννινα”)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 62
Εμφωλιασμένa Υποερωτήματα (nested subqueries)
Παράδειγμα: ???
select *from Employeewhere Salary > some (
select 0.1 * Budgetfrom Dept )and Sex = ‘M’
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 63
Nested Subqueries
• επίσης:
< some,
<= some,
>= some,
= some (ισοδ. του in)
< > some (όχι ισοδ. του not in)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 64
Nested Subqueries
2. Ο τελεστής all έχει τη σημασία: “από όλα τα στοιχεία του συνόλου”
Παράδειγμα: Τα ονόματα όλων των υποκαταστημάτων που έχουν καταθέσεις μεγαλύτερες από τις καταθέσεις όλων των υποκαταστημάτων των Ιωαννίνων.
select distinct Όνομα-Υποκαταστήματοςfrom Υποκατάστημαwhere Ποσό > all (select Ποσό
from Υποκατάστημα where Πόλη = “Ιωάννινα”)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 65
Nested Subqueries
Παράδειγμα: Για κάθε τμήμα βρες το SSN του υπαλλήλου με το μεγαλύτερο μισθό.
select SSNfrom Employee as E1where Salary > all (
select Salaryfrom Employee as E2where E1.SSN <> E2.SSN and
E1.DeptCode=E2.DeptCodeΘα δούμε έναν άλλον τρόπο αργότερα.
συσχέτιση (correlation)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 66
Nested Subqueries
• επίσης:
< all,
<= all,
>= all,
= all,
< > all (ισοδ. του not in)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 67
Nested Subqueries
3. Έλεγχος για κενή σχέση
Ο τελεστής exists: επιστρέφει true αν η υποερώτηση δεν είναι κενή
Παράδειγμα: Οι πελάτες που έχουν καταθέσεις και έχουν πάρει δάνειο.select Όνομα-Πελάτηfrom Δανειζόμενοςwhere exists (select * from Καταθέτης where Καταθέτης.Όνομα-Πελάτη = Δανειζόμενος.Όνομα-
Πελάτη)
συσχέτιση (correlation)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 68
Nested Subqueries
Παράδειγμα: Βρες το SSN των υπαλλήλων που συμμετέχουν σε τουλάχιστον ένα project με το διευθυντή του τμήματος τους.
select SSNfrom Employee as Ewhere exists ((select Id
from Projectwhere E.SSN = Project.SSN )intersect(select Idfrom Projectwhere SSN in (select MgrSSN
from Dept where
E.DeptCode=Code) ) )
συσχέτιση (correlation)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 69
Nested Subqueries
Ο τελεστής not exists μπορεί να χρησιμοποιηθεί για έλεγχο αν η σχέση A περιέχει τη σχέση B
not exists (Β except Α)
• Ποια πράξη της σχεσιακής άλγεβρας;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 70
Nested Subqueries
Παράδειγμα: Οι ηθοποιοί που έχουν παίξει σε όλες τις ταινίες της Βουγιουκλάκη
select distinct S.Όνομαfrom Παίζει as Swhere not exists ((select Τίτλος, Έτος from Παίζει where Όνομα = “Βουγιουκλάκη’’) except (select Τίτλος, Έτος from Παίζει as R where R.Όνομα = S.Όνομα)
not exists (Β except Α)
Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος)
Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
uπολογισμός για κάθε S
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 71
Nested Subqueries
Παράδειγμα: Οι πελάτες που έχουν καταθέσεις σε όλα τα υποκαταστήματα της Πάτρα.
select distinct S.Όνομα-Πελάτηfrom Καταθέτης as Swhere not exists ((select Όνομα-Υποκαταστήματος from Υποκατάστημα where Πόλη = “Πάτρα’’) except (select R. Όνομα-Υποκαταστήματος from Καταθέτης as T, Λογαριασμός as R where T.Όνομα-Πελάτη = S. Όνομα-Πελάτη and
T.Αριθμός-Λογαριασμού = R. Αριθμός-Λογαριασμού ))
not exists (Β except Α)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 72
Nested Subqueries
4. Έλεγχος για Διπλές Εμφανίσεις
Ο τελεστής unique: επιστρέφει true αν η υποερώτηση δεν έχει επαναλήψεις (duplicates) – not unique
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 73
Nested Subqueries
Παράδειγμα: Οι πελάτες που έχουν ακριβώς μια κατάθεση στο υποκατάστημα “Ψηλά Αλώνια”
select T.Όνομα-Πελάτηfrom Καταθέτης as Τwhere unique (select R.Όνομα-Πελάτη from Λογαριασμός, Καταθέτης as R where T.Όνομα-Πελάτη = R.Όνομα-Πελάτη and R. Αριθμός-Λογαριασμού =
Λογαριασμός. Αριθμός- Λογαριασμού and Λογαριασμός.Όνομα-Υποκαταστήματος = “Ψηλά
Αλώνια”)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 74
Nested Subqueries
Παράδειγμα: Οι πελάτες που έχουν τουλάχιστον δύο κατάθεσεις στο υποκατάστημα “Ψηλά Αλώνια”
select T.Όνομα-Πελάτηfrom Καταθέτης as Τwhere not unique (select R.Όνομα-Πελάτη from Λογαριασμός, Καταθέτης as R where T.Όνομα-Πελάτη = R.Όνομα-Πελάτη and R. Αριθμός-Λογαριασμού =
Λογαριασμός. Αριθμός- Λογαριασμού and Λογαριασμός.Όνομα-Υποκαταστήματος = “Ψηλά
Αλώνια”)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 75
Nested Subqueries
Παράδειγμα: βρες το SSN υπαλλήλων που συμμετέχουν σε όλα τα projects.
select SSNfrom Employee as Ewhere (select Id
from Projectwhere E.SSN = Project )contains
contains / not contains (not standard)
( select Id from Project)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 76
Nested Subqueries
• in/not in (συμμετοχή σε σύνολο)
• (>, =, κλπ) some/any/all (σύγκριση συνόλων)
• exists/not exists (έλεγχος για κενά σύνολα)
• unique/not unique (έλεγχος για διπλότιμα)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 77
Συναθροιστικές Συναρτήσεις (Aggregation)
Συναθροιστικές Συναρτήσεις (Aggregate Functions)Η SQL έχει 5 built-in συναθροιστικές συναρτήσεις:
Μέσος όρος: avg(A) (μόνο σε αριθμούς) A γνώρισμαΕλάχιστο: min(A)Μέγιστο: max(A)Άθροισμα: sum(A) (μόνο σε αριθμούς)Πλήθος: count(A)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 78
Η γλώσσα SQL
Λογαριασμός
Υποκατάστημα
Πελάτης
Καταθέτης
Δάνειο
Όνομα-Υποκαταστήματος Αριθμός-Λογαριασμού Ποσό
Όνομα-Πελάτη Αριθμός-Λογαριασμού
Όνομα-Πελάτη Οδός Πόλη
Όνομα-Υποκαταστήματος Πόλη Σύνολο
Όνομα-Πελάτη Αριθμός-Δανείου
Όνομα-Υποκαταστήματος Αριθμός-Δανείου Ποσό
Δανειζόμενος
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 79
Συναθροιστικές Συναρτήσεις
Παράδειγμα: Μέσο ποσό όλων των λογαριασμών στο υποκατάστημα Καλούτσανη
select avg(Ποσό)from Λογαριασμός where Όνομα-Υποκαταστήματος = “Καλούτσανη”
Το αποτέλεσμα είναι μια σχέση με ένα γνώρισμα και μια γραμμή, μπορούμε να δώσουμε όνομα στο γνώρισμα χρησιμοποιώντας το as
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 80
Συναθροιστικές Συναρτήσεις
Παράδειγμα: Μέγιστο ποσό όλων των λογαριασμών στο υποκατάστημα Καλούτσανη και τον αριθμό του λογαριασμού!!select Αριθμός-Λογαριασμού, max(Ποσό)from Λογαριασμός where Όνομα-Υποκαταστήματος = “Καλούτσανη”
Αν στο select υπάρχει συναθροιστική συνάρτηση, τότε μπορούν να υπάρχουν μόνο συναθροιστικές. Γιατί (σκεπτικό)?
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 81
Συναθροιστικές Συναρτήσεις
Μπορούμε να εφαρμόσουμε τις συναρτήσεις όχι μόνο επί ενός πίνακα συνολικά, αλλά και επί ομάδων, αφού πρώτα τον ομαδοποοιήσουμε βάση ενός (ή περισσοτέρων γνωρισμάτων). Οι ομάδες προσδιορίζονται χρησιμοποιώντας το group by.
Γενική μορφή:
select <group-by γνωρίσματα>, <συναθροιστικές συναρτήσεις>from Rgroup by <group by γνωρίσματα>
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 82
Συναθροιστικές Συναρτήσεις
Παράδειγμα: Μέσο ποσό των λογαριασμών σε κάθε υποκατάστημα
select Όνομα-Υποκαταστήματος, avg(Ποσό) from Λογαριασμόςgroup by Όνομα-Υποκαταστήματος
Όνομα-Υποκαταστήματος avg_Ποσό
Καλούτσανη 1827Ψηλά Αλώνια 1298Παπαδημητρίου 4391
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 83
Συναθροιστικές Συναρτήσεις
Παράδειγμα: Μικρότερος και μεγαλύτερος μισθός ανά τμήμα και φύλο
select DeptCode, Sex, min(Salary), max(Salary)from Λογαριασμόςgroup by DeptCode, Sex
DeptCode Sex min_Salary max_Salary
312 M 1240 2640312 F 1190 2510231 M 1304 3102231 F 1410 3190412 M 1561 2540
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 84
Συναθροιστικές Συναρτήσεις
Αν θέλουμε να απαλείψουμε διπλές εμφανίσεις χρησιμοποιούμε τη λέξη-κλειδί distinct στην αντίστοιχη έκφραση.
Παράδειγμα: Αριθμός καταθετών σε κάθε υποκατάστημα
select Όνομα-Υποκαταστήματος, count(distinct Όνομα-Πελάτη) from Καταθέτης, Λογαριασμός where …group by Όνομα-Υποκαταστήματος
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 85
Συναθροιστικές Συναρτήσεις
Η ομαδοποίηση μπορεί να γίνει ως προς περισσότερα του ενός πεδία.
Παράδειγμα: Μέσος όρος καταθέσεων ανά πελάτη και ανά υποκατάστημα
SELECT Όνομα-Υποκαταστήματος, Όνομα-Πελάτη, avg(balance) FROM account GROUP BY Όνομα-Υποκαταστήματος, Όνομα-Πελάτη
Ομαδοποίηση γίνεται πρώτα ως προς το branch_name. Στην συνέχεια δημιουργούνται υποoμάδες ως προς το customer_name
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 86
Συναθροιστικές Συναρτήσεις
Μπορούν να συμμετέχουν πάνω από μία σχέσεις.
Παράδειγμα: Βρές το μέσο μισθό για κάθε project
SELECT A.ID, avg(Salary) FROM Employee as E, Assigned as A WHERE E.SSN=A.SSN GROUP BY A.ID
Παράδειγμα: Βρές το συνόλο ωρών που απασχολείται κάθε υπάλληλος στα projects.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 87
Συναθροιστικές Συναρτήσεις
Μπορούμε να εφαρμόσουμε μια συνθήκη σε μια συγκεκριμένη ομάδα από πλειάδες χρησιμοποιώντας το having (όπως το where επιδρά επί μίας γραμμής, έτσι και το having επιδρά επί μίας ομάδας.
Παράδειγμα: Ονόματα υποκαταστημάτων με μέσο ποσό καταθέσεων μεγαλύτερο των $1200
select Όνομα-Υποκαταστήματος, avg(Ποσό)from Λογαριασμός group by Όνομα-Υποκαταστήματοςhaving avg(Ποσό) > 1200
Η συνθήκη του having εφαρμόζεται αφού σχηματιστούν οι ομάδες και υπολογιστούν οι συναθροιστικές συναρτήσεις.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 88
Συναθροιστικές Συναρτήσεις
'Οταν εμφανίζονται και το where και το having:
• η συνθήκη του where εφαρμόζεται πρώτα, • οι πλειάδες που ικανοποιούν αυτή τη συνθήκη τοποθετούνται σε ομάδες με βάση το group by • και μετά αν υπάρχει συνθήκη στο having εφαρμόζεται στις ομάδες.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 89
Συναθροιστικές Συναρτήσεις
Για να μετρήσουμε πόσες πλειάδες έχει μια σχέση:
select count (*) from Πελάτης
Δε μπορούμε να χρησιμοποιήσουμε το distinct με το count (*).
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 90
Συναθροιστικές Συναρτήσεις
Παράδειγμα: Το υποκατάστημα με το μεγαλύτερο μέσο ποσό καταθέσεων.
select distinct Όνομα-Υποκαταστήματοςfrom Λογαριασμόςgroup by Όνομα-Υποκαταστήματοςhaving avg (Ποσό) > = all (select avg(Ποσό) from Λογαριασμός
group by Όνομα-Υποκαταστήματος)
Παρατήρηση: Δεν μπορούμε να βρούμε το μεγαλύτερο μέσο ποσό καταθέσεων (όχι ακόμα). Κάτι σαν max(avg(Ποσό)) δεν επιτρέπεται!
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 91
Συναθροιστικές Συναρτήσεις
Παράδειγμα: Οι ηθοποιοί που έχουν παίξει το πολύ σε μια ταινίαselect Όνομαfrom Παίζει ας Twhere unique (select Τ.Όνομα from Παίζει ας R
where T.Όνομα = R.Όνομα)
Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος)
Παίζει(Όνομα, Τίτλος, Έτος)
Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)
select Όνομαfrom Παίζει group by Όνομαhaving count(*) < = 1
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 92
Συναθροιστικές Συναρτήσεις
Περίληψη Μέσος όρος: avg (μόνο σε αριθμούς)Ελάχιστο: minΜέγιστο: maxΆθροισμα: sum (μόνο σε αριθμούς)Πλήθος: count
Αν θέλουμε να απαλείψουμε διπλές εμφανίσεις χρησιμοποιούμε τη λέξη-κλειδί distinct στην αντίστοιχη έκφραση.
Μπορούμε να εφαρμόσουμε μια συνθήκη σε μια συγκεκριμένη ομάδα από πλειάδες χρησιμοποιώντας το having. Η συνθήκη του having εφαρμόζεται αφού σχηματιστούν οι ομάδες και υπολογιστούν οι συναθροιστικές συναρτήσεις
Μπορούμε να εφαρμόσουμε τις συναρτήσεις όχι μόνο σε ένα σύνολο από πλειάδες, αλλά σε ομάδες από σύνολα πλειάδων. Οι ομάδες προσδιορίζονται χρησιμοποιώντας το group by
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 93
Συζεύξεις Συνόλων
Συζεύξεις Συνόλων Η SQL--92 υποστηρίζει διάφορους τύπους συζεύξεων που συνήθως χρησιμοποιούνται στο for, αλλά μπορούν να χρησιμοποιηθούν οπουδήποτε μπορεί να χρησιμοποιηθεί μια σχέση.
Γενική σύνταξη:
<όνομα-σχέσης1> <τύπος-συνένωσης> <όνομα-σχέσης2> <συνθήκη-συνένωσης>
ή
<όνομα-σχέσης1> natural <τύπος-συνένωσης> <όνομα-σχέσης2>
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 94
Συνενώσεις Συνόλων
Τύποι Συνένωσης:
inner join: εσωτερική (θήτα) συνένωσηleft outer join: αριστερή εξωτερική συνένωσηright outer joinfull outer join
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 95
Παραγόμενες Σχέσεις
Παραγόμενες Σχέσεις
• Η SQL-92 δίνει τη δυνατότητα μια υποερώτηση να χρησιμοποιηθεί στο from
• Τότε πρέπει να τις δοθεί ένα όνομα και τα γνωρίσματα της να μετανομαστούν
• Αυτό γίνεται χρησιμοποιώντας το as
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 96
Παραγόμενες Σχέσεις
Η SQL-92 δίνει τη δυνατότητα χρησιμοποιώντας το as να δοθεί ένα προσωρινό όνομα σε μία προσωρινή σχέση που προκύπτει από μια υποερώτηση.
Παράδειγμα: Το μέσο υπόλοιπο για όλα τα υποκαταστήματα για τα οποία το μέσο ποσό είναι μεγαλύτερο των $1200
select Όνομα-Υποκαταστήματος, Μέσο-υπόλοιποfrom (select Όνομα-Υποκαταστήματος, avg(Ποσό) from Καταθέτης group by Όνομα-Υποκαταστήματος as Αποτέλεσμα(Όνομα-Υποκαταστήματος, Μέσο-υπόλοιπο) where Μέσο-Yπόλοιπο > 1200
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 97
Ορισμός Όψεων
Ορισμός Όψεων
Μπορούμε να ορίσουμε μια όψη χρησιμοποιώντας την εντολή:
Επίσης, μπορούν να προσδιοριστούν τα ονόματα των γνωρισμάτων άμεσα
create view <όνομα--όψης> as <select-from-where ερώτηση>
create view <όνομα--όψης> (<λίστα ονομάτων-γνωρισμάτων>) as <select-from-where ερώτηση>
view definition
Χρήση:• πίνακες που χρησιμοποιούνται συχνά και• ενδιάμεσα αποτελέσματα
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 98
Ορισμός Όψεων
Παράδειγμα: Μια όψη που περιλαμβάνει τα ονόματα όλων των υποκαταστημάτων και το άθροισμα του ποσού των δανείων που έχουν γίνει από αυτά
create view Υποκατάστημα-Σύνολο-Δανείων (Σύνολο-Δανείων, Όνομα- Υποκαταστήματος) asselect Όνομα-Υποκαταστήματος, sum(Ποσό)from Δάνειο group by Όνομα-Υποκαταστήματος
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 99
Ορισμός Όψεων
Παράδειγμα: Μια όψη που περιλαμβάνει πληροφορίες για τους υπαλλήλους και τα τμήματα τους.
create view EmployeeDept (SSN,Name,Salary,Sex,DeptName,MgrSSN) asselect SSN, Employee.Name, Salary,Sex, Dept.Name, MgrSSN)from Employee, Deptwhere DeptCode = Code
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 100
Ορισμός Όψεων
• Τα ονόματα όψεων μπορεί να χρησιμοποιηθούν οπουδήποτε μπορεί να χρησιμοποιηθεί το όνομα μιας σχέσης.•Εν γένει οι όψεις δεν υλοποιούνται (materialized views) – στην ORACLE μπορεί κάποιος να ορίσει να υλοποιούνται.• Ο ορισμός της όψης παραμένει στην βάση δεδομένων, εκτός αν σβηστεί:
drop view <όνομα-όψης>
• Ενημέρωση (updating) όψεων?•στις απλές περιπτώσεις (χωρίς καρτεσιανό γινόμενο ή συναθροίσεις) μπορεί να υπάρξει ενημέρωση•joins ? Γιατί όχι ?•συνάθροιση ? Γιατί όχι ?
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 101
SQL Functions
• Εκτός από τις συναρτήσεις συνάθροισης υπάρχουν και άλλες built-in συναρτήσεις (που εξαρτώνται από το σύστημα). Για παράδειγμα ή Transact-SQL έχει:
o datatype conversion functionso date functionso mathematical functionso row aggregate functionso string functionso system functionso text and image functions
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 102
Η γλώσσα SQL
• Γλώσσα Ορισμού Δεδομένων (ΓΟΔ) – Data Definition Langauge (DDL)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 103
Γλώσσα Ορισμού Δεδομένων
Γλώσσα Ορισμού Δεδομένων (ΓΟΔ)
Σχετικά με το λογικό σχήμα, η ΓΟΔ SQL υποστηρίζει τους ορισμούς:
• του σχήματος κάθε σχέσης• του πεδίου τιμών κάθε γνωρίσματος• των περιορισμών ακεραιότητας
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 104
Γλώσσα Ορισμού Δεδομένων
create table R(A1 D1, A2 D2, ..., An Dn), <περιορισμός-ακεραιότητας1>, …, <περιορισμός-ακεραιότηταςk>
όπου R είναι το όνομα της σχέσης, Ai τα ονόματα των γνωρισμάτων, και Di οι τύποι των αντίστοιχων πεδίων τιμών.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 105
Πεδία Τιμών
Τύποι Πεδίου ΟρισμούΓια τον ορισμό του πεδίου ορισμού, οι διαθέσιμοι built-in τύποι περιλαμβάνουν:
char(n) (σταθερού μήκους)varchar(n)intsmallintnumeric(p, d) (d από τα p ψηφία είναι στα δεξιά της υποδιαστολής)real, double precisionfloat(n)date (ημερομηνία) time (ώρα)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 106
Πεδία Τιμών
Ο ορισμός πεδίου μπορεί να περιέχει τον προσδιορισμό not null
Επίσης, επιτρέπεται δημιουργία πεδίου:
create domain Όνομα-Προσώπου char(20)
create domain <name> as <type-description>
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 107
Ορισμός Σχήματος
Ορισμός Σχήματος
create table R(A1 D1, A2 D2, ..., An Dn), <περιορισμός-ακεραιότητας1>,
…, <περιορισμός-ακεραιότηταςk>
όπου R είναι το όνομα της σχέσης, Ai τα ονόματα των
γνωρισμάτων, και Di οι τύποι των αντίστοιχων πεδίων τιμών.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 108
Ορισμός Σχήματος
Επιτρεπτοί περιορισμοί ακεραιότητας είναι της μορφής:
• primary key Aj1, Aj2, ..., Ajn, (δεν επιτρέπονται
επαναλαμβανόμενες τιμές και NULL τιμές)
• unique Aj1, Aj2, ..., Ajn, (δεν επιτρέπονται
επαναλαμβανόμενες τιμέs; NULL τιμές επιτρέπονται)
• check P• •foreign key (Ai) references Aj
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 109
Ορισμός Σχήματος
Παραδείγματα
(1) create table Πελάτης
(Όνομα-Πελάτη char(20) not null, Οδός char(30), Πόλη char(30), primary key (Όνομα-Πελάτη))
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 110
Ορισμός Σχήματος
(2) create table Λογαριασμός
(Αριθμός-Λογαριασμού char(10) not null, Όνομα-Υποκαταστήματος char(15), Ποσό int,primary key (Αριθμός-Λογαριασμού) check (Ποσό >= 0)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 111
Ορισμός Σχήματος
Επίσης, πιο περίπλοκες συνθήκες, π.χ., για ξένα κλειδιά:
check (Όνομα-Υποκαταστήματος in select Όνομα-Υποκαταστήματος
from Υποκατάστημα)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 112
Περιορισμοί Ακεραιότητας
Περιορισμοί Αναφοράς
Σύνταξη:
foreign key (Ai) references Aj
Όταν μια πράξη (π.χ. insert) παραβιάζει έναν περιορισμό αναφοράς απορρίπτεται εκτός αν έχει οριστεί:
on delete cascadeon update cascade
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 113
Περιορισμοί Ακεραιότητας
Παράδειγμα
create table..foreign key (Όνομα-Υποκαταστήματος) references Υποκατάστημαon delete cascadeon update cascade…
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 114
Περιορισμοί Ακεραιότητας
Περιορισμοί Ακεραιότητας
Πεδίου ορισμού
Χρησιμοποιώντας την εντολή check:
Παραδείγματα
(1) Ελάχιστος ωρομίσθιο
create domain Ωρομίσθιο numeric(5, 2) constraint Έλεγχος-Ωρομισθίου check(Ποσό >= 4.00)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 115
Περιορισμοί Ακεραιότητας
(2) Να μην περιέχει την τιμή null
create domain Πεδίο-Αριθμός-Λογαριασμού char(10) constraint Έλεγχος-Αριθμός-Λογαριασμού check(value not null)
(3) Να παίρνει συγκεκριμένες τιμές
create domain Τύπος-Λογαριασμού char(10) constraint Έλεγχος-Τύπος-Λογαριασμού check value in (‘ Όψεως”, ‘Ταμιευτηρίου”)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 116
Διαγραφή Σχήματος
Διαγραφή Σχήματος
Μια καινούργια σχέση είναι αρχικά άδεια.
Για να σβηστεί ένα σχήμα:
drop table R
Διαφορετικό από το:
delete from R
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 117
Τροποποίηση Σχήματος
Τροποποίηση Σχήματος
ALTER TABLE όνομα πίνακα ADD - προσθέτει καινούργια στήλη DROP - διαγράφει μια στήλη MODIFY - τροποποιεί μια στήλη
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 118
Τροποποίηση Σχήματος
Προσθήκη νέου γνωρίσματος:
alter table R add A D
προσθήκη σε μια σχέση R που ήδη υπάρχει του γνωρίσματος A με πεδίο τιμών D, η τιμή των πλειάδων της R στο καινούργιο γνώρισμα είναι null.
Διαγραφή γνωρίσματος:
alter table R drop A
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 119
Τροποποίηση Σχήματος
alter table R modify (όνομα_στήλης new_datatype)
modify μπορεί να τροποποιήσει μόνο τον τύπο δεδομένων, όχι το όνομα της στήλης
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 120
Η γλώσσα SQL
• Τροποποίηση Βάσης Δεδομένων Γλώσσα Χειρισμού Δεδομένων (ΓXΔ)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 121
Τροποποιήσεις
Τροποποιήσεις
1. Διαγραφή
2. Εισαγωγή
3. Ενημέρωση
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 122
Εισαγωγή
Εισαγωγή
Για να εισάγουμε δεδομένα σε μια σχέση είτε
(α) προσδιορίζουμε την πλειάδα, είτε
(β) γράφουμε μια ερώτηση που το αποτέλεσμα της εισάγεται στη σχέση.
insert into R(A1, …, An) values (v1, …, vn)
insert into R(A1, …, An) select-from-where
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 123
Εισαγωγή
Παράδειγμα για το (α)
insert into Λογαριασμός values (“Ψηλά-Αλώνια”, “A--9732’’, 1200)
Όταν με οποιαδήποτε σειρά, π.χ.,:
insert into Λογαριασμός (Αριθμός-Λογαριασμού, Όνομα-Υποκαταστήματος, Ποσό)values (“A--9732’’, “Ψηλά-Αλώνια”, 1200)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 124
Εισαγωγή
Παράδειγμα για το (β):
Για κάθε πελάτη που έχει πάρει δάνειο από το υποκατάστημα Ψηλά Αλώνια προστίθεται ως δώρο ένας λογαριασμός των $200
insert into Λογαρισμός select Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, 200 from Δάνειο where Όνομα-Υποκαταστήματος = “Ψηλά Αλώνια”
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 125
Εισαγωγή
Πρέπει πρώτα να υπολογιστεί το select πλήρως και μετά να γίνει η εισαγωγή.Τι αποτέλεσμα έχει η παρακάτω εντολή αν αυτό δε συμβαίνει;
insert into Λογαριασμός select * from Λογαριασμός
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 126
Εισαγωγή
Επίσης, εισαγωγή null τιμών:
insert into Λογαριασμός values (null, “A--9732’’, 1200)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 127
Διαγραφή
Διαγραφή
Μπορούμε να σβήσουμε μόνο ολόκληρες πλειάδες και όχι συγκεκριμένα γνωρίσματα.
Σβήνει όλες τις πλειάδες της R για τις οποίες ισχύει το P.
Όταν λείπει το where σβήνονται όλες οι πλειάδες μιας σχέσης.
delete from R where P
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 128
Διαγραφή
Παραδείγματα
(1) Όλους τους λογαριασμούς του Παπαδόπουλου
delete from Καταθέτηςwhere Όνομα-Πελάτη = “Παπαδόπουλος”
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 129
Διαγραφή
(2) Όλους τους λογαριασμούς στα υποκαταστήματα της Πάτραςdelete from Λογαριασμόςwhere Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα
where Πόλη = “Πάτρα’’)
Παρατήρηση: δεν υπάρχει τρόπος να διαγράψουμε τη μία από δυο ίδιες πλειάδες
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 130
Διαγραφή
Αν και μπορούμε να σβήσουμε πλειάδες μόνο από μία σχέση τη φορά μπορούμε να αναφερθούμε σε περισσότερες από μια σχέσεις στην υποερώτηση του where
(3) Όλους τους λογαριασμούς μιας τράπεζας με ποσό μικρότερο από το μέσο ποσό στην τράπεζα.
delete from Λογαριασμόςwhere Ποσό > (select avg(Ποσό) from Λογαριασμός)
Πρώτα γίνεται ο έλεγχος σε όλες τις πλειάδες και μετά αυτές που ικανοποιούν τη συνθήκη διαγράφονται.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 131
Διαγραφή
Παράδειγμα: μια τράπεζα θέλει να κλείσει όλα τα υποκαταστήματά της που βρίσκονται στην Καστοριά
delete from Υποκατάστημα
where Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα
where Πόλη = “Kαστοριά’)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 132
Διαγραφή
Πρέπει να διαγράψουμε και όλους τους λογαριασμούς: delete from Λογαριασμόςwhere Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα
where Πόλη = “Kαστοριά’)
ΠΡΟΣΟΧΗ: όταν θέλουμε να διαγράψουμε κάποια δεδομένα, πρέπει να διαγράψουμε όλα τα δεδομένα που συσχετίζονται μ’ αυτά. Επίσης πρέπει να προσέξουμε την σειρά με την οποία θα γίνουν οι διαγραφές.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 133
Διαγραφή
υποκατάστημα λογαριασμός
Πόλη Όνομα_Υποκ. Όνομα_Υποκ. Όνομα-ΠελάτηΥπόλοιπο
Καστοριά K1 K1 ΚΩΤΣΗΣ 350.000
Καστοριά K3 K2 ΑΠΟΣΤΟΛΙΔΗΣ 230.000
Θεσσαλονίκη Θ1 Θ1 ΣΤΕΦΑΝΟΥ 670.000
Θεσσαλονίκη Θ2 Θ2 ΠΑΠΑΝΙΚΟΛΑΟΥ 256.000
Αθήνα A1 K3 ΧΑΤΖΟΠΟΥΛΟΣ 410.000
• αν διαγράψουμε από τον πίνακα υποκατάστημα όλα τα υποκαταστήματα της Καστοριάς, θα έχουμε πρόβλημα ορθότητας στον πίνακα account.
• πρώτα πρέπει να διαγράψουμε τους λογαριασμούς και μετά τα υποκαταστήματα.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 134
Ενημερώσεις
Ενημερώσεις
Παράδειγμα: Αύξηση όλων των καταθέσεων που είναι μεγαλύτερες των $100 κατά 5% λόγω τοκισμού
update Λογαριασμόςset Ποσό = Ποσό * 1.05 where Ποσό > 100
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 135
Ενημερώσεις
Παράδειγμα:στους πελάτες που έχουν υπόλοιπο < 1.000.000 η τράπεζα δίνει 5% και στους πελάτες που έχουν υπόλοιπο > 1.000.000 δίνει 9%:
update Λογαριασμόςset Ποσό = Ποσό * 1.05 where Ποσό < 1.000.000
update Λογαριασμόςset Ποσό = Ποσό * 1.09 where Ποσό > 1.000.000
Ποιο update πρέπει να τρέξουμε πρώτα;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 136
Ενημερώσεις
Παράδειγμα: Αύξηση όλων των υπολοίπων που είναι μεγαλύτερα από τον μέσο όρο κατά 5%
update Λογαριασμόςset Υπόλοιπο = Υπόλοιπο * 1.05 where Υπόλοιπο > select avg(Υπόλοιπο) from Λογαριασμός
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 137
• Διαδικαστική (procedural) SQL (Transact-SQL, PL/SQL)
• Ενσωματωμένη (embedded) SQL
• ODBC / JDBC Interface
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 138
SQL και προγράμματα
Πολλές φορές η SQL δεν είναι ικανή να εκφράσει τα ερωτήματα που θέλουμε, για λόγους:
Σε αυτές τις περιπτώσεις πρέπει να παντρέψουμε τη SQL με δομές κλασσικού προγραμματισμού. Υπάρχουν 3 τρόποι για αυτό:
1. Επεκτείνουμε τη SQL με τέτοιες δομές2. Εμφωλιάζουμε SQL εντολές μέσα σε μια γλώσσα
προγραμματισμού3. Δημιουργούμε μία «γέφυρα» (interface) μεταξύ της SQL και
της γλώσσας προγραμματισμού (API)
• ειδικού χειρισμού ερωτημάτων.• αποδοτικότητας συστήματος (optimization).• ανάγκες για μία Turing-complete γλώσσα (σαν τη Java / C).
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 139
Procedural (Διαδικαστική) SQL
H SQL επεκτείνεται με δομές (μεταβλητές, βρόγχοι, blocks κ.λ.π.) ώστε να «θυμίζει» μία γλώσσα προγραμματισμού, με τις ανάλογες δυνατότητες.
• Μιcrosoft SQL Server: Transact-SQL• Oracle: PL/SQL
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 140
Case Study: Oracle’s PL/SQL
Στην PL/SQL μπορούμε να ορίσουμε:
•Blocks εντολών•Μεταβλητές και τύπους (built-in και user-defined)•Εντολές ελέγχου ροής, όπως if-then-else και loops•Procedures και functions•Αντικείμενα και μεθόδους
Μέσα σε ένα πρόγραμμα PL/SQL συνήθως έχουμε κλασσικά ερωτήματα SQL.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 141
Case Study: Oracle’s PL/SQL
Παράδειγμα:
DECLARE /* Declare variables which will be used in SQL statements */ v_NewMajor VARCHAR2(10) := 'History'; v_FirstName VARCHAR2(10) := 'Scott'; v_LastName VARCHAR2(10) := 'Urman';BEGIN /* Update the students table. */ UPDATE students SET major = v_NewMajor WHERE first_name = v_FirstName AND last_name = v_LastName; /* Check to see if the record was found. If not, then we need to insert this record. */ IF SQL%NOTFOUND THEN INSERT INTO students (ID, first_name, last_name, major) VALUES (student_sequence.NEXTVAL, v_FirstName, v_LastName, v_NewMajor); END IF;END;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 142
Case Study: Oracle’s PL/SQL, Βlocks
Το βασικό κομμάτι ενός PL/SQL είναι ένα block. Μπορούμε να έχουμε nesting.
DECLARE /* declaration of variables go here */BEGIN /* executanle section – procedural and SQL go here */EXCEPTION /* error-handling statements when something goes wrong */END;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 143
Case Study: Oracle’s PL/SQL, Μεταβλητές και τύποι
Η επικοινωνία με τη ΒΔ γίνεται με τη μορφή μεταβλητών. Κάθε μεταβλητή έχει έναν τύπο. Ο χρήστης μπορεί να ορίσει τους δικούς του τύπους σαν table και record.
DECLARE v_StudentName VARCHAR2(20); v_CurrentDate DATE;TYPE t_StudentRecord IS RECORD ( FirstName VARCHAR2(10); LastName VARCHAR2(10););v_Student t_StudentRecord;
BEGIN ...
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 144
Case Study: Oracle’s PL/SQL, Βρόγχοι
Μπορούμε να έχουμε επαναληπτικές δομές σε ένα πρόγραμμα PL/SQLDECLARE v_LoopCounter BINARY_INTEGER := 1;BEGIN LOOP INSERT INTO temp_table (num_col) VALUES (v_LoopCounter); v_LoopCounter := v_LoopCounter + 1; EXIT WHEN v_LoopCounter > 50; END LOOP;END;
BEGIN FOR v_LoopCounter IN 1..50 LOOP INSERT INTO temp_table (num_col) VALUES (v_LoopCounter); END LOOP;END;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 145
Case Study: Oracle’s PL/SQL, Λογικοί Δρομείς
Ένας λογικός δρομέας (ή κέρσορας ) (cursor) χρησιμοποιείται για το χειρισμό των γραμμών που έχουν «τραβηχτεί» από τη ΒΔ με κάποιο select…from...where. Στην ουσία δημιουργείται ένας λογικός πίνακας των αποτελεσμάτων στον οποίο μπορούμε να προχωρήσουμε γραμμή-γραμμή. Η ιδέα των cursors υπάρχει σε όλες τις γλώσσες.
Νίκος Παπαδοπουλος 35 Δημητρας 25
Μαρία Τσίαπα 28 Παπαδημητρίου 31
Γιώργος Λακιός 38 Χαλανδρίου 78
ΕΟF
κέρσορας
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 146
Case Study: Oracle’s PL/SQL, Λογικοί Δρομείς
Παράδειγμα (τυπικό πρόγραμμα λογικών δρομέων):
DECLARE v_FirstName VARCHAR2(20); v_LastName VARCHAR2(20); -- Cursor declaration. This defines the SQL statement to -- return the rows. CURSOR c_Students IS SELECT first_name, last_name FROM students;BEGIN -- Begin cursor processing. OPEN c_Students; LOOP -- Retreive one row. FETCH c_Students INTO v_FirstName, v_LastName; -- Exit the loop after all rows have been retreived. EXIT WHEN c_Students%NOTFOUND; /* Process data here */ END LOOP; -- End processing. CLOSE c_Students;END;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 147
Case Study: Oracle’s PL/SQL, Λογικοί Δρομείς
Θέματα λογικών δρομέων:
• Explicit Cursors• Declaring, Opening, Fetching, Closing, Cursor Variables
• Implicit Cursors (used by normal SQL)• Cursor Fetching
•Simple loops, While loops, For loops• Cursors for Update
CURSOR c_LargeClasses IS SELECT department, course FROM classes WHERE max_students > 50 FOR UPDATE;
• Cursor Variables – dynamic cursors – SQL at runtime vs. static
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 148
Case Study: Oracle’s PL/SQL, Built-in συναρτήσεις
Κατηγορίες:
• Character (e.g. chr, concat,lower, replace, rtrim, substr)• Numeric (e.g. abs, cos, power, mod, round, sin)• Date (e.g. last_day, next_day, sysdate, trunc)• Conversion (e.g. to_char, to_date, to_number)• Aggregate (e.g. avg, count, stddev, sum, variance)• Other
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 149
Case Study: Oracle’s PL/SQL, Παράδειγμα PL/SQL
Με το πρόγραμμα αυτό εισάγουμε πολλές γραμμές στον πίνακα Sales_D (code,product,category,day,month,year,state,amount) που μπορoύν να χρησιμοποιηθούν για testing.declare i binary_integer;begin for i in 1..25000 loop insert into Sales_D values(i,'X','C1',12,1,1997,'NY',60); insert into Sales_D values(i,'Y','C2',12,7,1997,'NY',80); insert into Sales_D values(i,'Z','C1',22,8,1997,'NJ',10); insert into Sales_D values(i,'W','C2',15,6,1996,'NJ',90); insert into Sales_D values(i,'X','C1',12,3,1997,'CA',40); insert into Sales_D values(i,'Y','C2',12,9,1997,'CA',70); end loop;end;
Με έναν παρόμοιο τρόπο, αλλά χρησιμοποιώντας Transact-SQL θα κάνετε μέρος του τρίτου παραδοτέου.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 150
Case Study: Oracle’s PL/SQL, stored procedures
Στην PL/SQL μπορούμε να ορίσουμε διαδικασίες (procedures) και να τις αποθηκεύσουμε για μελλοντική χρήση. Αυτές μπορούν να έχουν παραμέτρους και τρέχουν με την εντολή execute. Είναι εξαιρετικά χρήσιμες και χρησιμοποιούνται ευρέως. CREATE PROCEDURE AddNewStudent ( p_FirstName students.first_name%TYPE, p_LastName students.last_name%TYPE, p_Major students.major%TYPE) ASBEGIN -- Insert a new row in the students table. Use -- student_sequence to generate the new student ID, and -- 0 for current_credits. INSERT INTO students (ID, first_name, last_name, major, current_credits) VALUES (student_sequence.nextval, p_FirstName, p_LastName, p_Major, 0);
COMMIT;END AddNewStudent;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 151
Case Study: Oracle’s PL/SQL, stored procedures
Μόλις οριστεί η παραπάνω διαδικασία μπορούμε να τη χρησιμοποιήσουμε για τη δημιουργία καινούργιων εγγραφών.
BEGIN AddNewStudent(‘David’, ‘Grossman’, ‘Music’);END
• Όταν η procedure δημιουργείται, πρώτα μεταφράζεται και κατόπιν αποθηκεύεται – αυτό σημαίνει ότι είναι έτοιμη για χρήση.• Μπορεί να έχει παραμέτρους, π.χ. (‘David’, ‘Grossman’,
‘Music’) • Μία procedure είναι ένα PL/SQL block με BEGIN…END και EXCEPTION μέρος (το DECLARE αντικαθίστανται από το ΑS).
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 152
Case Study: Oracle’s PL/SQL, stored procedures
Η γενική μορφή είναι η εξής:
CREATE [OR REPLACE] PROCEDURE procedure_name [(argument [{IN | OUT | IN OUT}] type, argument [{IN | OUT | IN OUT}] type, ... argument [{IN | OUT | IN OUT}] type)] {IS|AS} procedure body
Για να διαγράψεται μία αποθηκευμένη procedure:
DROP PROCEDURE procedure_name
Οι stored procedures γίνονται κομμάτι του data dictionary – π.χ. όπως οι πίνακες.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 153
Case Study: Transact SQL, Μεταβλητές και τύποι
Mία μεταβλητή του χρήστη έχει πάντα την εξής μορφή:
@<όνομα μεταβλητής> π.χ. @student_name
και δηλώνεται ως:
Declare <variable_name> data type
όπου data type μπορεί να είναι predefined / user-defined τύπος
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 154
Case Study: Transact SQL, Έλεγχος Ροής
Υπάρχουν οι εξής δομές:
• begin ... end• if ... else• while, break, continue• /* ... */ comments• Goto <label>
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 155
Case Study: Transact SQL, Cursors
Η γενική μορφή δήλωσης είναι η εξής:
declare cursor_name cursorfor select…from…where statement[for {read only | update [of column_name_list]}]
Παράδειγμα:
declare authors_crsc cursorfor select au_id, au_name, au_fnamefrom authorswhere state <> ‘CA’
Παράδειγμα:
declare authors_crsc cursorfor select au_id, au_name, au_fnamefrom authorswhere state <> ‘CA’for update of au_name, au_fname
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 156
Case Study: Transact SQL, Cursors
Άνοιγμα και κλείσιμο λογικού δρομέα:
open cursor_nameclose cursor_name
Π.χ. open authors_crsc
Fetching μιας γραμμής:
fetch cursor_name [into fetch_target_list]
π.χ. fetch authors_crsc into @id, @lname, @fname
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 157
Case Study: Transact SQL, stored procedures
Η γενική μορφή είναι η εξής:
CREATE PROC[EDURE] procedure_name [;number][
{@parameter data_type} [VARYING] [= default] [OUTPUT]][,...n]
[WITH {
RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION
}][FOR REPLICATION]AS
sql_statement [...n]
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 158
Case Study: Transact SQL, stored procedures
Παράδειγμα:
Πλήρης οδηγός υπάρχει στο Query Analyzer -> Help -> Transact SQL Help
CREATE PROCEDURE au_info @lastname varchar(40), @firstname varchar(20)
AS SELECT au_lname, au_fname, title, pub_name FROM authors WHERE au_fname = @firstname AND au_lname = @lastnameGO The au_info stored procedure can be executed in these ways:
EXECUTE au_info 'Dull', 'Ann'EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'EXEC au_info 'Dull', 'Ann'EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 159
Case Study: Transact SQL, Εναύσματα (triggers)
Μια διαδικασία η οποία ενεργοποιείται αυτόματα από το ΣΔΒΔ κάθε φορά που συμβαίνουν μεταβολές ορισμένου τύπου στα δεδομένα λέγεται trigger (έναυσμα). Μία ΒΔ με δηλωμένα triggers ονομάζεται active database (ενεργή ΒΔ).
Παράδειγμα: Ένας πελάτης θέλει να κάνει χρέωση στην πιστωτική του κάρτα και με αυτή την συναλλαγή θα ξεπεράσει το πιστωτικό του όριο. Το ΣΔΒΔ θα πρέπει να ελέγχει σε κάθε συναλλαγή αν ο κανόνας του πιστωτικού ορίου τηρείται.Χαρακτηριστικά ενός trigger:
• γεγονός (π.χ. [before | after] insert/delete/update <πίνακα>)• συνθήκη (π.χ. Salary > 10000, Area = “Μαρούσι”)• ενέργεια (κώδικας SQL – π.χ. PL/SQL πρόγραμμα)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 160
Case Study: Transact SQL, Εναύσματα (triggers)
Παράδειγμα (σε PL/SQL):
CREATE TRIGGER incr_count AFTER INSERT ON Students WHEN (new.age < 18)FOR EACH ROW BEGIN count:=count+1; END
Για να καταργήσουμε ένα έναυσμα:
DROP TRIGGER <trigger-name>
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 161
Case Study: Transact SQL, Εναύσματα (triggers)
Γενική μορφή σύνταξης (περισσότερες περιπτώσεις) σε Transact SQL:
CREATE TRIGGER trigger_nameON table[WITH ENCRYPTION]
FOR { [DELETE] [,] [INSERT] [,] [UPDATE] } [WITH APPEND] [NOT FOR REPLICATION] AS
sql_statement
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 162
Case Study: Transact SQL, Εναύσματα (triggers)
CREATE TRIGGER check_balanceON transactionsFOR INSERTASDECLARE @balance money, @credit_line moneySELECT @balance = balance, @credit_line = credit_lineFROM customer c INNER JOIN inserted i ON c.account = i.account
IF (@balance + i.amount > @credit_line)BEGIN EXEC sp_over_limit i.account ROLLBACK TRANSACTIONEND
Παράδειγμα: Ένας πελάτης θέλει να κάνει χρέωση στην πιστωτική του κάρτα και με αυτή την συναλλαγή θα ξεπεράσει το πιστωτικό του όριο.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 163
Ενσωματωμένη SQL
Ενσωματωμένη SQLΠροσπέλαση μιας ΒΔ μέσω μια γλώσσας προγραμματισμού (π.χ. C, Java) γενικού σκοπού απαιτείται τουλάχιστον γιατί:
• υπάρχουν ερωτήσεις που δε μπορούν να διατυπωθούν σε SQL,γιατί η SQL δεν έχει όλες τις δυνατότητες μιας γλώσσας προγραμματισμού γενικού σκοπού• μη-δηλωτικές εντολές (π.χ., εκτύπωση, επικοινωνία με το χρήστη) δε μπορούν να γίνουν μέσω της SQL
Ενσωμάτωση της SQL σε μια γλώσσα που καλείται φιλόξενη (host)
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 164
Ενσωματωμένη SQL
Σε αυτήν την περίπτωση, η επεξεργασία των ερωτήσεων γίνεται από τη ΒΔ, και το αποτέλεσμα γίνεται διαθέσιμο στο πρόγραμμα μια γραμμή τη φορά
Ένας ειδικός προ-επεξεργαστής (preprocessor) αντικαθιστά τον ενσωματωμένο κώδικα της SQL με δηλώσεις και κλήσεις συναρτήσεων στη host γλώσσα (δηλαδή π.χ. C) και μεταφράζεται το πρόγραμμα
Τα ερωτήματα SQL «ενσωματώνονται» με την εξής σύνταξη:EXEC SQL < embedded SQL statement > END-EXEC
Η ακριβής σύνταξη εξαρτάται από τη host γλώσσα
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 165
Ενσωματωμένη SQL
Χρησιμοποιούμε την εντολή: SQL INCLUDE, για να δηλώσουμε στον προ-επεξεργαστή που πρέπει να εισάγει τις δηλώσεις των μεταβλητών της SQL
Μεταβλητές της γλώσσας μπορεί να χρησιμοποιηθούν στην εντολή της SQL αν το σύμβολο ‘:’ προηγείται του ονόματός τους
Για να γράψουμε μια ερώτηση σε SQL:
EXEC SQL declare c cursor for select Όνομα-Πελάτη, Πόλη from Κατάθεση, Πελάτης where Κατάθεση.Όνομα-Πελάτη = Πελάτης.Όνομα-Πελάτη and Κατάθεση.Ποσό > :amount
END-EXEC
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 166
Ενσωματωμένη SQL
Η παραπάνω εντολή δεν προκαλεί την εκτέλεση της ερώτησης. Για να εκτελεστεί πρέπει να ανοίξουμε τον cursor:
EXEC SQL open c END-EXEC
Το αποτέλεσμα σώζεται σε μια προσωρινή σχέση, αν υπάρχει λάθος το διαγνωστικό μήνυμα σώζεται σε μια ειδική μεταβλητή (SQLCA)
Οι γραμμές του αποτελέσματος γίνονται διαθέσιμες στο πρόγραμμα μέσω μιας σειράς από fetch εντολές. To αποτέλεσμα του fetch αποθηκεύεται σε μεταβλητή/ες της host γλώσσας για κάθε γνώρισμα
EXEQ SQL fetch c into :cn$, :cc END-EXEC
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 167
Ενσωματωμένη SQL
Για να κλείσουμε τον cursor:
EXEC SQL close c END-EXEC
Επίσης:
EXEC SQL < update, insert ή delete έκφραση> END-EXEC
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 168
Ενσωματωμένη SQL: Παράδειγμα
/* * sample2.pc * * This program connects to ORACLE, declares and opens a cursor, * fetches the names, salaries, and commissions of all * salespeople, displays the results, then closes the cursor. */
#include <stdio.h>#include <string.h>#include <sqlca.h>
#define UNAME_LEN 20 #define PWD_LEN 40 /* * Use the precompiler typedef'ing capability to create * null-terminated strings for the authentication host * variables. (This isn't really necessary--plain char *'s * would work as well. This is just for illustration.) */typedef char asciiz[PWD_LEN];
EXEC SQL TYPE asciiz IS STRING(40) REFERENCE; asciiz username; asciiz password;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 169
Ενσωματωμένη SQL: Παράδειγμα
struct sale_info { int cust; char prod[6]; char prodcateg[6]; int day; int month; int year; char state[3]; int quant;};
/* Declare function to handle unrecoverable errors. */ void sql_error();
main() { struct sale_info *sale_rec_ptr;
/* Allocate memory for emp_info struct. */ if ((sale_rec_ptr = (struct sale_info *) malloc(sizeof(struct sale_info))) == 0) { fprintf(stderr, "Memory allocation error.\n"); exit(1); }
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 170
Ενσωματωμένη SQL: Παράδειγμα
/* Connect to ORACLE. */ strcpy(username, "SCOTT"); strcpy(password, "TIGER"); EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--"); EXEC SQL CONNECT :username IDENTIFIED BY :password; printf("\nConnected to ORACLE as user: %s\n", username); /* Declare the cursor. All static SQL explicit cursors * contain SELECT commands. 'salespeople' is a SQL identifier, * not a (C) host variable. */ EXEC SQL DECLARE sales CURSOR FOR SELECT cust, prod, prodcateg, day, month, year, state, quant FROM Sales_D; /* Open the cursor. */ EXEC SQL OPEN sales; /* Loop, fetching all salesperson's statistics. * Cause the program to break the loop when no more * data can be retrieved on the cursor. */ EXEC SQL WHENEVER NOT FOUND DO break;
for (;;) { EXEC SQL FETCH sales INTO :sale_rec_ptr; }
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 171
Ενσωματωμένη SQL: Παράδειγμα
/* Close the cursor. */ EXEC SQL CLOSE sales; printf("\nArrivederci.\n\n"); EXEC SQL COMMIT WORK RELEASE; exit(0); }
void sql_error(msg) char *msg;{ char err_msg[512]; size_t buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\n%s\n", msg);
/* Call sqlglm() to get the complete text of the * error message. */ buf_len = sizeof (err_msg); sqlglm(err_msg, &buf_len, &msg_len); printf("%.*s\n", msg_len, err_msg);
EXEC SQL ROLLBACK RELEASE; exit(1);}
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 172
Ενσωματωμένη SQL
Δυναμική SQL
Τα προγράμματα μπορούν να δημιουργούν ερωτήσεις σε SQL ως συμβολοσειρές δυναμικά κατά την εκτέλεση και είτε να τα εκτελούν αμέσως είτε να τα προετοιμάζουν (τα μεταφράζουν) για να χρησιμοποιηθούν αργότερα
Παράδειγμα:
char * sqlprog = “update Λογαριασμός set Ποσό = Ποσό * 1.05 where Αριθμός-Λογαριασμού = ?’’
EXEC SQL prepare dynprog from :sqlprog; char account[10] = “A-101’’; EXEC SQL execute dynprog using :account;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 173
Eπικοινωνία με διεπαφή JDBC/ODBC - Γενικά
• Σε αυτή την περίπτωση εισάγουμε ένα επίπεδο μεταξύ γλώσσας προγραμματισμού και Β.Δ., μέσω του οποίου γίνεται η επικοινωνία τους. Υπάρχει το ODBC (γενικής εφαρμογής) και το JDBC (για γλώσσα Java).• Ποια είναι η διαφορά με την ενσωματωμένη SQL ???
• Η επικοινωνία με τη ΒΔ γίνεται με system calls της host γλώσσας προγραμματισμού. Συνεπώς, για κάθε διαφορετικό ΣΔΒΔ πρέπει να δημιουργείται και διαφορετικό σύνολο system calls. Αυτό συνεπάγεται ότι για ν ΣΔΒΔ θα υπάρχουν ν implementations. Αντίθετα, με ένα ενδιάμεσο επίπεδο, αρκεί η γλώσσα να «μιλάει» με αυτό (DB-independent.)• Νο free lunch: κόστος -> αποδοτικότητα
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 174
Eπικοινωνία με διεπαφή JDBC/ODBC - ODBC
• Open Database Connectivity- Αναπτύχθηκε από τη Microsoft Corp.
• Το ODBC είναι ένα ευρέως διαδεδομένο API (application programming interface) για πρόσβαση και χειρισμό βάσεων δεδομένων.
• Ο στόχος είναι κάθε εφαρμογή να έχει πρόσβαση σε οποιαδήποτε δεδομένα, ανεξαρτήτου συστήματος.
•Το ODBC δημιουργεί ένα middle layer (database driver) - μεταξύ της εφαρμογής (στην περίπτωση μας Java) και της Β.Δ. H Java στέλνει SQL στο ODBC και περιμένει την απάντηση.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 175
Eπικοινωνία με διεπαφή JDBC/ODBC - ODBC
• Αυτό το layer μεταφράζει τα ερωτήματα της εφαρμογής σε εντολές που καταλαβαίνει η Β.Δ
• Η SQL χρησιμοποιείται σαν η γλώσσα πρόσβασης στη Β.Δ.
ODBC Driver for Oracle
ODBC Driver for IBM DB2
ODBC Driver for SQL Server
Application A
Application B
Application C
Application D
Oracle
DB2
SQL Server
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 176
Eπικοινωνία με διεπαφή JDBC/ODBC - ODBC
• To open Data Sources (ODBC), click Start, point to Settings, and then click Control Panel. Double-click Administrative Tools, and then double-click Data Sources (ODBC). • For information about using Data Sources (ODBC), click Help in the ODBC Data Source Administrator dialog box.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 177
Eπικοινωνία με διεπαφή JDBC/ODBC - JDBC
•Type 1: JDBC-ODBC bridge; Μεταφράζει standard JDBC calls σε ένα αντίστοιχο ODBC call και το στέλνει στο ΣΔΒΔ.•Type 2: απευθείας μετάφραση σε API άμεσης συγγένειας με το ΣΔΒΔ. Τα JDBC calls μεταφράζονται σε κάτο που το ΑΡΙ καταλαβαίνει.•Type 3: middle-tiers•Type 4: all-Java driver που στέλνει αιτήματα απευθείας στο ΣΔΒΔ. Όλα τα μεγάλα συστήματα ΔΒΔ έχουν τύπου-4 JDBC drivers.
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 178
Eπικοινωνία με διεπαφή JDBC/ODBC – Java
• Σύνδεση με τη ΒΔ• Εκτέλεση ενός SQL αιτήματος. Μπορεί να είναι δύο ειδών:
• select...from...where• insert/update/delete
•Αποσύνδεση με τη ΒΔ
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 179
Eπικοινωνία με διεπαφή JDBC/ODBC – Σύνδεση με ΒΔ
Connecting to database:
Connection dbcon;Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");dbcon = DriverManager.getConnection(“jdbc:odbc:employeedb”);
• Χρειάζεται να δηλώσουμε μία μεταβλητή τύπου Connection• Πρέπει να δηλώσουμε τι είδους JDBC driver θα χρησιμοποιήσουμε• Εάν είναι JDBC-ODBC bridge, πρέπει να δηλώσουμε το όνομα του ODBC
Πρέπει να εισάγουμε τα κατάλληλα packages στο πρόγραμμα μας:
import java.sql.*;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 180
Eπικοινωνία με διεπαφή JDBC/ODBC – Εκτέλεση SQL
Πρέπει να δηλώσουμε ένα SQL statement (όχι insert /delete/update), να το εκτελέσουμε και να πάρουμε το αποτέλεσμα. Statement stmt = dbcon.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM Employee ORDER BY Salary"); while (rs.next()) { out.println(rs.getString(“SSN")); out.println(rs.getString(“Name")); out.println(rs.getString(“Salary")); } rs.close(); stmt.close();
όνομα γνωρίσματος
λογικός δρομέας
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 181
Eπικοινωνία με διεπαφή JDBC/ODBC – Εκτέλεση SQL
Πρέπει να δηλώσουμε ένα SQL statement (insert/delete/update) και να το εκτελέσουμε.
Statement stmt = dbcon.createStatement(); stmt.executeUpdate("UPDATE Employee SET Salary = Salary * 1.05”); stmt.close();
Τέλος πρέπει να κλείσουμε τη σύνδεση με τη ΒΔ:
dbcon.close();
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 182
Eπικοινωνία με διεπαφή JDBC/ODBC – Java Παράδειγμα
Το επόμενο παράδειγμα εισάγει έναν υπάλληλο, αφού πρώτα ελέγξει αν υπάρχει άλλος με το ίδιο SSN.
import java.io.*;import java.text.*;import java.util.*;import java.sql.*;
public class example {
public static void main(String args[]) {
Connection dbcon; String url = "jdbc:odbc:employeedb"; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); dbcon = DriverManager.getConnection(url,"", ""); Statement stmt; ResultSet rs; int rec_counter; String SSN = “230102211”; String Name = “John Johnson”; int Salary = 4301; int DeptCode = 312;
Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 183
Eπικοινωνία με διεπαφή JDBC/ODBC – Java Παράδειγμα
• Το επόμενο παράδειγμα εισάγει έναν υπάλληλο, αφού πρώτα ελέγξει αν υπάρχει άλλος με το ίδιο SSN (συνέχεια). stmt = dbcon.createStatement(); rs = stmt.executeQuery("SELECT * FROM Employee WHERE SSN=‘"+SSN+”’”); rec_counter=0; while (rs.next()) { rec_counter++; if (rec_counter==1) break; } rs.close(); if (rec_counter!=0) // SSN already exists System.out.println("Code already exists. Try again."); else // create new item stmt.executeUpdate("INSERT INTO Employee VALUES (‘“ + SSN + “’,’” + Name + ”’,” + Salary+”,” + DeptCode + ”)”); stmt.close(); dbcon.close();}}