Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

1 Η Γλώσσα SQL Δαμιανός Χατζηαντωνίου Τμ. Διοικητικής Επιστήμης & Τεχνολογίας Οικονομικό Πανεπιστήμιο Αθηνών.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "1 Η Γλώσσα SQL Δαμιανός Χατζηαντωνίου Τμ. Διοικητικής Επιστήμης & Τεχνολογίας Οικονομικό Πανεπιστήμιο Αθηνών."— Μεταγράφημα παρουσίασης:

1 1 Η Γλώσσα SQL Δαμιανός Χατζηαντωνίου Τμ. Διοικητικής Επιστήμης & Τεχνολογίας Οικονομικό Πανεπιστήμιο Αθηνών

2 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 2 Η γλώσσα SQL Η “standard” γλώσσα για σχεσιακές βάσεις δεδομένων. αρχικά Sequel στην IBM ως μέρος του System R, τώρα SQL (Stuctured Query Language) SQL--89, SQL--92, SQL-99 Είναι γλώσσα δηλωτική (declarative) – ορίζουμε το ΤΙ, όχι το ΠΩΣ

3 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 3 Η γλώσσα SQL Θέματα SQL: Γλώσσα Ορισμού Δεδομένων (Data Definition Lang) Γλώσσα Χειρισμού Δεδομένων (Data Manipulation Lang) Ορισμό Όψεων (Views) Ακεραιότητα (Integrity Constraints) Διαδικαστική SQL - Λογικοί Δρομείς (Cursors) Ενσωματωμένη Γλώσσα SQL (Embedded SQL) Stored Procedures Triggers (Εναύσματα) οι διαφάνειες αυτού του κεφαλαίου περιέχουν στοιχεία από τις αντίστοιχες διαφάνειες της κυρίας Ευαγγελίας Πιτουρά του Πανεπιστημίου Ιωαννίνων.

4 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 4 Η γλώσσα SQL SQL αποτελείται από: DDL (Data Definition Language) - ορισμός, δημιουργία, τροποποίηση και διαγραφή σχήματος. DML (Data Manipulation Language) - ορισμός, δημιουργία, τροποποίηση, διαγραφή και επιλογή δεδομένων (γλώσσα αιτημάτων – query language). Προδιαγραφές ασφάλειας - χρήστες και δικαιώματα.

5 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 5 Γλώσσα Χειρισμού Δεδομένων Θέματα: Βασική δομή (select-from-where) Συναθροιστικές συναρτήσεις (aggregation) Εμφωλευμένα υποαιτήματα (nested subqueries)

6 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 6 Βασική Δομή select Α 1, Α 2,.., Α n from R 1, R 2, … R m where P Μια χαρακτηριστική ερώτηση σε SQL έχει την εξής μορφή: Ισοδύναμο του: π A 1, A 2,.., A n (σ P (R 1 x R 2 x … R m )) ονόματα σχέσεων ονόματα γνωρισμάτων συνθήκη

7 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 7 Βασική Δομή select αντιστοιχεί στην πράξη της προβολής (projection) της σχεσιακής άλγεβρας (προσοχή: όχι στην πράξη selection). Ποια γνωρίσματα θέλουμε να υπάρχουν στο τελικό αποτέλεσμα της ερώτησης. select Α1, Α2,.., Αn from R 1, R 2, … R m where P π A 1, A 2,.., A n (σ P (R 1 x R 2 x … R m ))

8 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 8 Βασική Δομή select Α 1, Α 2,.., Α n from R1, R2, … Rm where P π A 1, A 2,.., A n (σ P (R 1 x R 2 x … R m )) from αντιστοιχεί στην πράξη του καρτεσιανού γινομένου της σχεσιακής άλγεβρας. Ποιες σχέσεις θα χρησιμοποιηθούν για τον υπολογισμό του αποτελέσματος.

9 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 9 Βασική Δομή select Α 1, Α 2,.., Α n from R1, R2, … Rm where P π A 1, A 2,.., A n (σ P (R 1 x R 2 x … R m )) where αντιστοιχεί στη συνθήκη της πράξης της επιλογής (selection) στη σχεσιακή άλγεβρα. Το κατηγόρημα (predicate) P έχει γνωρίσματα των σχέσεων που εμφανίζονται στο from.

10 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 10 Βασική Δομή Όταν δεν υπάρχει το where, το P θεωρείται ότι ισχύει (true). ΠΡΟΣΟΧΗ: Δε γίνεται απαλοιφή των διπλών εμφανίσεων. Με άλλα λόγια δεν έχει συνολοθεωρητική ερμηνεία, όπως η σχεσιακή άλγεβρα.

11 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 11 Παράδειγμα 1 ΤαινίαΤίτλος Έτος Διάρκεια Είδος Παίζει Όνομα Τίτλος Έτος Όνομα Διεύθυνση Έτος-Γέννησης Σύζυγος-Ηθοποιού Ηθοποιός

12 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 12 Παράδειγμα 2 Employee Project Department Assigned SSN Works-in Name Id Description Location Hours Code Sex Salary Name Budget MgrSSN

13 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 13 Παράδειγμα 2 Σχεσιακή σχεδίαση: Employee (SSN, Name, Salary, Sex, DeptCode) Project (Id, Description, Location) Dept (Code, Name, Budget, MgrSSN) Assigned (SSN, Id, Hours)

14 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 14 Select Παράδειγμα: δείξε όλα τα στοιχεία των υπαλλήλων Select select SSN, Name, Sex, Salary, DeptCode from Employee

15 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 15 Select Παράδειγμα: Ονόματα όλων των ηθοποιών που έχουν παίξει σε ταινίες Select select Όνομα from Παίζει

16 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 16 Select Παράδειγμα: δείξε τους μισθούς των υπαλλήλων Select select Salary from Employee Η SQL επιτρέπει πολλαπλές εμφανίσεις της ίδιας πλειάδας σε μια σχέση (π.χ. ίδιοι μισθοί). Μια σχέση στην SQL είναι ένα πολυσύνολο (multiset) ή θύλακας (bag) => δεν υπάρχει απαλοιφή διπλοτιμών. Αυτό είναι πολύ χρήσιμο στις περισσότερες περιπτώσεις (π.χ. ?)

17 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 17 Select Για να έχουμε απαλοιφή διπλοτιμών (duplicate elimination) θα πρέπει να το ζητήσουμε χρησιμοποιώντας το distinct. Απαλοιφή διπλών εμφανίσεων select distinct Salary from Employee

18 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 18 Select select * from Employee Επιλογή όλων των γνωρισμάτων select SSN, Name, Sex, Salary, DeptCode from Employee

19 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 19 Select select Τίτλος, Έτος, Διάρκεια / 60, Είδος from Ταινία Επιστρέφει μια σχέση ίδια με τη σχέση Ταινία μόνο που το γνώρισμα διάρκεια μας δίνει τις ώρες (έχει διαιρεθεί με το 60) Αριθμητικές πράξεις (+, -, *, /) ή εφαρμογή συναρτήσεων (π.χ. date ή string functions - αργότερα) ανάμεσα σε σταθερές ή γνωρίσματα πλειάδων select Name, Salary * 340.75 from Employee

20 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 20 Where Παράδειγμα: Τον τίτλο όλων των ταινιών που γυρίστηκαν μετά το 1995 και είναι ασπρόμαυρες select Τίτλος from Ταινία where Έτος > 1995 and Είδος = ''Ασπρόμαυρη''

21 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 21 Where Παράδειγμα: Το όνομα και το μισθό όλων των γυναικών στο τμήμα 23 select Name, Salary from Employee where Sex = ‘F’ and DeptCode = 23

22 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 22 Where Λογικοί τελεστές: and, or, not Τελεστές σύγκρισης:, >=, =, <>, between, not between (ανάμεσα σε αριθμητικές εκφράσεις, συμβολο- σειρές [strings], και ειδικούς τύπους). συνθήκη του where

23 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 23 Where Παράδειγμα χρήσης του between : select Τίτλος from Ταινία where Έτος between 1990 and 1995 select Τίτλος from Ταινία where Έτος >= 1990 and Έτος <= 1995 αντί του

24 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 24 From Παράδειγμα: Δείξε το SSN των υπαλλήλων μαζί με το SSN του διευθυντή του τμήματος στο οποίο δουλεύει select SSN, MgrSSN from Employee, Dept where DeptCode = Code ΟΜΩΣ: Αν θέλαμε και το όνομα του τμήματος στο οποίο δουλεύει?

25 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 25 From Παράδειγμα: Δείξε το SSN των υπαλλήλων μαζί με το όνομα του τμήματος στο οποίο δουλεύει select SSN, Name from Employee, Dept where DeptCode = Code Ποιό Name ??? Από ποιόν πίνακα ???

26 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 26 Βασική Δομή Όταν το ίδιο γνώρισμα εμφανίζεται στο σχήμα περισσότερων από μια σχέσεων, τότε διάκριση βάση του συμβολισμού:. select SSN, Dept.Name from Employee, Dept where DeptCode = Code

27 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 27 From Παράδειγμα φυσικής σύζευξης: Το ‘ονομα των ηθοποιών που παίζουν σε ασπρόμαυρες ταινίες select distinct Όνομα from Παίζει, Ταινία where Παίζει.Τίτλος = Ταινία.Τίτλος and Παίζει.Έτος = Ταινία.Έτος and Είδος = “Ασπρόμαυρη”

28 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 28 From Παράδειγμα: Δείξε το όνομα των υπαλλήλων που δουλεύουν στο τμήμα «Marketing» select Employee.Name from Employee, Dept where DeptCode = Code and Dept.Name = ‘Marketing’

29 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 29 From Παράδειγμα: Δείξε το όνομα των υπαλλήλων που δουλεύουν σε κάποιο project στο ‘Μαρούσι’ select Name from Employee, Assigned, Project where Employee.SSN = Assigned.SSN and Project.Id=Assigned.Id and Project.Location=‘Μαρούσι’

30 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 30 From Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού) Παραδείγματα Έγχρωμες ταινίες με διάρκεια μέχρι 80 λεπτά Οι ηθοποιοί που γεννήθηκαν μετά το 1935 και έπαιξαν σε ασπρόμαυρες ταινίες πριν το 1945

31 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 31 Πράξεις με Συμβολοσειρές (Strings) Πράξεις με Συμβολοσειρές Η πιο συνηθισμένη πράξη είναι ταίριασμα προτύπων (pattern matching): % ταιριάζει οποιαδήποτε συμβολοσειρά _ ταιριάζει οποιοδήποτε χαρακτήρα Γίνεται διάκριση ανάμεσα σε κεφαλαία και μικρά Σύγκριση χρησιμοποιώντας το like, not like

32 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 32 Πράξεις με Συμβολοσειρές Παράδειγμα: Δείξε όλα τα IDs των projects που έχουν στην περιγραφή τους το string «Αττική οδός» select ID from Project where Description like “%Αττική οδός%” Πολλές ακόμα πράξεις διαθέσιμες για pattern matching – κυττάξτε στο on line help για την Transact-SQL.

33 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 33 Πράξεις με Συμβολοσειρές Παράδειγμα: Οι τίτλοι όλων των ταινιών που περιέχουν τη λέξη Θάλασσα select distinct Τίτλος from Ταινία where Τίτλος like “%Θάλασσα%”

34 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 34 Διάταξη των Πλειάδων Διάταξη των Γραμμών του αποτελέσματος select Ταινία, Έτος from Παίζει where Όνομα = “Robert De Niro” order by Έτος Χρήση του order by ώστε οι πλειάδες στο αποτέλεσμα να είναι ταξινομημένες με βάση τo αντίστοιχο γνώρισμα select Name, Salary from Employee where DeptCode = 311 order by Salary

35 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 35 Διάταξη των Πλειάδων Default: αύξουσα διάταξη, αλλά και άμεσα χρησιμοποιώντας το asc (αύξουσα) ή το desc (φθήνουσα). Επίσης, ταξινόμηση με βάση πολλά γνωρίσματα. Παράδειγμα: select * from Ταινία order by Έτος desc, Τίτλος asc Η ταξινόμηση είναι δαπανηρή λειτουργία. Παράδειγμα: select * from Employee order by DeptCode asc, Salary desc

36 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 36 Αλλαγή Ονόματος Τα ονόματα των γνωρισμάτων στο αποτέλεσμα είναι αυτά των σχέσεων στην ερώτηση. Δυνατότητα αλλαγής του ονόματος τόσο μιας σχέσης όσο και ενός γνωρίσματος: as To as μπορεί να εμφανίζεται στο select ή στο from (aliases)

37 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 37 Αλλαγή Ονόματος Για παράδειγμα: select Τίτλος, Έτος, Διάρκεια / 60 as Ώρες-Διάρκεια, Είδος from Ταινία

38 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 38 Αλλαγή Ονόματος Χρήσιμο όταν (γ) δυο σχέσεις του from έχουν γνωρίσματα με το ίδιο όνομα, (α) όταν έχουμε αριθμητικές εκφράσεις στο select και δεν έχουν όνομα, (β) όταν θέλουμε να αλλάξουμε το όνομα του γνωρίσματος στο αποτέλεσμα. (δ) όταν έχουμε self-joins

39 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 39 Πράξεις Συνόλων Πράξεις: union intersection except εφαρμόζονται σε συμβατές σχέσεις (same arity, domain).

40 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 40 Πράξεις Συνόλων Γενική Σύνταξη: ( select from where ) union/intersection/except ( select from where)

41 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 41 Πράξεις Συνόλων Λογαριασμός Υποκατάστημα Πελάτης Καταθέτης Δάνειο Όνομα-Υποκαταστήματος Αριθμός-Λογαριασμού Ποσό Όνομα-Πελάτη Αριθμός-Λογαριασμού Όνομα-Πελάτη Οδός Πόλη Όνομα-Υποκαταστήματος Πόλη Σύνολο Όνομα-Πελάτη Αριθμός-Δανείου Όνομα-Υποκαταστήματος Αριθμός-Δανείου Ποσό Δανειζόμενος

42 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 42 Πράξεις Συνόλων Παράδειγμα union: ( select Όνομα-Πελάτη from Καταθέτης ) union ( select Όνομα-Πελάτη from Δανειζόμενος ) Τα ονόματα όλων των πελατών που έχουν καταθέσεις ή/και έχουν πάρει δάνειο

43 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 43 Πράξεις Συνόλων Σε αυτές τις πράξεις έχουμε απαλοιφή διπλών εμφανίσεων, εκτός αν χρησιμοποιηθεί το union all Μέγιστος αριθμός πολλαπλών εμφανίσεων;

44 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 44 Πράξεις Συνόλων Αντίστοιχα υπάρχει το intersect all Μέγιστος αριθμός πολλαπλών εμφανίσεων; Παράδειγμα intersect: ( select Όνομα-Πελάτη from Καταθέτης ) intersect ( select Όνομα-Πελάτη from Δανειζόμενος ) Τα ονόματα όλων των πελατών που έχουν καταθέσεις και έχουν πάρει δάνειο

45 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 45 Πράξεις Συνόλων Αντίστοιχα υπάρχει το except all Μέγιστος αριθμός πολλαπλών εμφανίσεων; Παράδειγμα except: ( select Όνομα-Πελάτη from Καταθέτης ) except ( select Όνομα-Πελάτη from Δανειζόμενος ) Τα ονόματα όλων των πελατών που έχουν καταθέσεις και δεν έχουν πάρει δάνειο

46 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 46 Πράξεις Συνόλων Αντίστοιχα υπάρχει το except all Μέγιστος αριθμός πολλαπλών εμφανίσεων; Παράδειγμα except: ( select SSN from Employee ) except ( select MgrSSN from Dept ) Τo SSN των υπαλλήλων που δεν είναι διευθυντές τμήματος.

47 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 47 Μεταβλητές Πλειάδων (tuple variables) Μια μεταβλητή πλειάδας μπορεί να οριστεί στο from χρησιμοποιώντας το as: select distinct Όνομα from Παίζει as Π, Ταινία as Τ where Π.Τίτλος = Τ.Τίτλος and Π.Έτος = Τ.Έτος and Είδος = “Ασπρόμαυρη” H ιδέα είναι ότι η μεταβλητή «τρέχει» επί του πίνακα γραμμή-γραμμή

48 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 48 Μεταβλητές Πλειάδων Οι μεταβλητές πλειάδων είναι ιδιαίτερα χρήσιμες όταν θέλουμε να συγκρίνουμε δυο πλειάδες της ίδιας σχέσης (self-join). Παράδειγμα: Τα ονόματα όλων των ταινιών που έχουν διάρκεια μεγαλύτερη τουλάχιστον από μία ταινία που γυρίστηκε το 1995 select distinct Τ.Τίτλος from Ταινία as S, Ταινία as T where T.Διάρκεια > S. Διάρκεια and S.Έτος = 1995

49 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 49 Μεταβλητές Πλειάδων Οι μεταβλητές πλειάδων είναι ιδιαίτερα χρήσιμες όταν θέλουμε να συγκρίνουμε δυο πλειάδες της ίδιας σχέσης (self-join). Παράδειγμα: Για κάθε τμήμα, δείξε τα τμήματα που έχουν μεγαλύτερο budget από αυτό select D.Code, G.Code from Dept as D, Dept as G where D.Code < G.Code υπολογισμός?

50 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 50 Η τιμή null Χρήση της λέξης κλειδί is null (is not null) σε μια συνθήκη για να ελέγξουμε αν μια τιμή είναι null. select Αριθμός-Δανείου from Δάνειο where Ποσό is null

51 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 51 Η τιμή null Εμφάνιση null Παράδειγμα: select sum(Ποσό) from Δάνειο Σε αριθμητικές πράξεις: το αποτέλεσμα είναι null όταν οποιαδήποτε τιμή είναι null Σε συγκρίσεις: σύγκριση με null συνήθως δίνει αποτέλεσμα false Σε συναθροιστικές συναρτήσεις: αγνοείται πλην από το count(*)

52 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 52 Εμφωλιασμένa Υποερωτήματα (nested subqueries) Εμφωλιασμένα υποερωτήματα Μερικά ερωτήματα απαιτούν πρώτα τον υπολογισμό κάποιων τιμών και κατόπιν τη χρησιμοποίησή τους στις συνθήκες του WHERE. Η SQL επιτρέπει το nesting υποερωτήμάτων (δομημένα υποερωτήματα). Μια υποερώτηση είναι μια έκφραση select-from- where που χρησιμοποιείται μέσα σε μια άλλη ερώτηση.

53 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 53 Nested Subqueries Γενική δομή: select... from... where ? (select... from... where... ); Υπολογισμός της υποερώτησης για κάθε γραμμή (ή πλειάδα) της εξωτερικής ερώτησης υποερώτηση ή εσωτερικό ερώτημα (inner query) εξωτερικό ερώτημα (οuter query)

54 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 54 Εμφωλιασμένa Υποερωτήματα (nested subqueries) Παράδειγμα: Βρες όλους τους υπαλλήλους που δουλεύουν σε κάποιο τμήμα με budget > 200000 select * from Employee where DeptCode in ( select Code from Dept where Budget > 200000 ) To υποερώτημα δεν εξαρτάται/συσχετίζεται (correlated) με το εξωτερικό ερώτημα. Αυτό δεν ισχύει πάντοτε (correlation).

55 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 55 Εμφωλιασμένa Υποερωτήματα (nested subqueries) Η SQL έχει μια συνολοθεωρητική κατεύθυνση. Θα έπρεπε λοιπόν να επιτρέπει συγκρίσεις συνόλων στο WHERE κομμάτι. Παράδειγμα: προηγουμένως το “in” Μπορούμε να έχουμε όσα επίπεδα εμφωλίασης επιθυμούμε Δομή και συντακτικό?

56 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 56 Εμφωλιασμένa Υποερωτήματα (nested subqueries) Συνδυασμοί: WHERE in / not in A WHERE some A< <= > >= = <> WHERE 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 57 Nested Subqueries Ο τελεστής in (not in) ελέγχει αν μια πλειάδα ανήκει (δεν ανήκει) σε ένα σύνολο από πλειάδες που έχουν προκύψει από μια έκφραση select-from-where. Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και έχουν καταθέσεις select distinct Όνομα-Πελάτη from Δανειζόμενος where Όνομα-Πελάτη in ( select Όνομα-Πελάτη from Καταθέτης)

58 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 58 Nested Subqueries Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και έχουν καταθέσεις στο υποκατάστημα Ψηλά-Αλώνια select distinct Όνομα-Πελάτη from Δανειζόμενος, Δάνειο where Δανειζόμενος.Αριθμός-Δανείου = Δάνειο.Αριθμός.Δανείου and Όνομα-Υποκαταστήματος = “Ψηλά-Αλώνια” and ( Όνομα-Υποκαταστήματος, Όνομα-Πελάτη) in (select Όνομα-Υποκαταστήματος, Όνομα-Πελάτη from Καταθέτης, Λογαριασμός where Καταθέτης.Αριθμός-Λογαριασμού = Λογαριασμός.Αριθμός-Λογαριασμού) Παραπάνω από δύο γνωρίσματα

59 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 59 Nested Subqueries Παράδειγμα: Τα ονόματα όλων των ηθοποιών που έπαιξαν σε ασπρόμαυρη ταινία select distinct Ηθοποιός.Όνομα from Παίζει where ( Παίζει.Τίτλος, Παίζει Έτος) in (select Ταινία.Τίτλος, Ταινία.Έτος from Ταινία where Είδος = «Ασπρόμαυρη») Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

60 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 60 Nested Subqueries Μπορεί να χρησιμοποιηθεί και με enumerated σύνολα Παράδειγμα: Τα ονόματα όλων των πελατών που έχουν πάρει δάνειο και δε λέγονται “Παπαδόπουλος” ή “Πέτρου”. select distinct Όνομα-Πελάτη from Δανειζόμενος where Όνομα-Πελάτη not in (“Παπαδόπουλος”, “Πέτρου”)

61 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 61 Nested Subqueries Σύγκριση Συνόλων 1. Ο τελεστής some (any) έχει τη σημασία του τουλάχιστον ένα από ένα σύνολο Παράδειγμα: Τα ονόματα όλων των υποκαταστημάτων που έχουν καταθέσεις μεγαλύτερες από τις καταθέσεις ενός τουλάχιστον υποκαταστήματος των Ιωαννίνων. select distinct Όνομα-Υποκαταστήματος from Υποκατάστημα where Ποσό > some (select Ποσό from Υποκατάστημα where Πόλη = “Ιωάννινα”)

62 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 62 Εμφωλιασμένa Υποερωτήματα (nested subqueries) Παράδειγμα: ??? select * from Employee where Salary > some ( select 0.1 * Budget from Dept ) and Sex = ‘M’

63 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 63 Nested Subqueries επίσης: < some, <= some, >= some, = some (ισοδ. του in) some (όχι ισοδ. του not in)

64 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 64 Nested Subqueries 2. Ο τελεστής all έχει τη σημασία: “από όλα τα στοιχεία του συνόλου” Παράδειγμα: Τα ονόματα όλων των υποκαταστημάτων που έχουν καταθέσεις μεγαλύτερες από τις καταθέσεις όλων των υποκαταστημάτων των Ιωαννίνων. select distinct Όνομα-Υποκαταστήματος from Υποκατάστημα where Ποσό > all (select Ποσό from Υποκατάστημα where Πόλη = “Ιωάννινα”)

65 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 65 Nested Subqueries Παράδειγμα: Για κάθε τμήμα βρες το SSN του υπαλλήλου με το μεγαλύτερο μισθό. select SSN from Employee as E1 where Salary > all ( select Salary from Employee as E2 where E1.SSN <> E2.SSN and E1.DeptCode=E2.DeptCode Θα δούμε έναν άλλον τρόπο αργότερα. συσχέτιση (correlation)

66 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 66 Nested Subqueries επίσης: < all, <= all, >= all, = all, all (ισοδ. του not in)

67 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 67 Nested Subqueries 3. Έλεγχος για κενή σχέση Ο τελεστής exists: επιστρέφει true αν η υποερώτηση δεν είναι κενή Παράδειγμα: Οι πελάτες που έχουν καταθέσεις και έχουν πάρει δάνειο. select Όνομα-Πελάτη from Δανειζόμενος where exists (select * from Καταθέτης where Καταθέτης.Όνομα-Πελάτη = Δανειζόμενος.Όνομα- Πελάτη) συσχέτιση (correlation)

68 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 68 Nested Subqueries Παράδειγμα: Βρες το SSN των υπαλλήλων που συμμετέχουν σε τουλάχιστον ένα project με το διευθυντή του τμήματος τους. select SSN from Employee as E where exists ( (select Id from Project where E.SSN = Project.SSN ) intersect (select Id from Project where SSN in (select MgrSSN from Dept where E.DeptCode=Code) ) ) συσχέτιση (correlation)

69 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 69 Nested Subqueries Ο τελεστής not exists μπορεί να χρησιμοποιηθεί για έλεγχο αν η σχέση A περιέχει τη σχέση B not exists (Β except Α) Ποια πράξη της σχεσιακής άλγεβρας;

70 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 70 Nested Subqueries Παράδειγμα: Οι ηθοποιοί που έχουν παίξει σε όλες τις ταινίες της Βουγιουκλάκη select distinct S.Όνομα from Παίζει as S where not exists ((select Τίτλος, Έτος from Παίζει where Όνομα = “Βουγιουκλάκη’’) except (select Τίτλος, Έτος from Παίζει as R where R.Όνομα = S.Όνομα) not exists (Β except Α) Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού) uπολογισμός για κάθε S

71 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 71 Nested Subqueries Παράδειγμα: Οι πελάτες που έχουν καταθέσεις σε όλα τα υποκαταστήματα της Πάτρα. select distinct S.Όνομα-Πελάτη from Καταθέτης as S where not exists ((select Όνομα-Υποκαταστήματος from Υποκατάστημα where Πόλη = “Πάτρα’’) except (select R. Όνομα-Υποκαταστήματος from Καταθέτης as T, Λογαριασμός as R where T.Όνομα-Πελάτη = S. Όνομα-Πελάτη and T.Αριθμός-Λογαριασμού = R. Αριθμός-Λογαριασμού )) not exists (Β except Α)

72 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 72 Nested Subqueries 4. Έλεγχος για Διπλές Εμφανίσεις Ο τελεστής unique: επιστρέφει true αν η υποερώτηση δεν έχει επαναλήψεις (duplicates) – not unique

73 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 73 Nested Subqueries Παράδειγμα: Οι πελάτες που έχουν ακριβώς μια κατάθεση στο υποκατάστημα “Ψηλά Αλώνια” select T.Όνομα-Πελάτη from Καταθέτης as Τ where unique (select R.Όνομα-Πελάτη from Λογαριασμός, Καταθέτης as R where T.Όνομα-Πελάτη = R.Όνομα-Πελάτη and R. Αριθμός-Λογαριασμού = Λογαριασμός. Αριθμός- Λογαριασμού and Λογαριασμός.Όνομα-Υποκαταστήματος = “Ψηλά Αλώνια”)

74 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 74 Nested Subqueries Παράδειγμα: Οι πελάτες που έχουν τουλάχιστον δύο κατάθεσεις στο υποκατάστημα “Ψηλά Αλώνια” select T.Όνομα-Πελάτη from Καταθέτης as Τ where not unique (select R.Όνομα-Πελάτη from Λογαριασμός, Καταθέτης as R where T.Όνομα-Πελάτη = R.Όνομα-Πελάτη and R. Αριθμός-Λογαριασμού = Λογαριασμός. Αριθμός- Λογαριασμού and Λογαριασμός.Όνομα-Υποκαταστήματος = “Ψηλά Αλώνια”)

75 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 75 Nested Subqueries Παράδειγμα: βρες το SSN υπαλλήλων που συμμετέχουν σε όλα τα projects. select SSN from Employee as E where ( select Id from Project where E.SSN = Project ) contains contains / not contains (not standard) ( select Id from Project)

76 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 76 Nested Subqueries in/not in (συμμετοχή σε σύνολο) (>, =, κλπ) some/any/all (σύγκριση συνόλων) exists/not exists (έλεγχος για κενά σύνολα) unique/not unique (έλεγχος για διπλότιμα)

77 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 77 Συναθροιστικές Συναρτήσεις (Aggregation) Συναθροιστικές Συναρτήσεις (Aggregate Functions) Η SQL έχει 5 built-in συναθροιστικές συναρτήσεις: Μέσος όρος: avg(A) (μόνο σε αριθμούς) A γνώρισμα Ελάχιστο: min(A) Μέγιστο: max(A) Άθροισμα: sum(A) (μόνο σε αριθμούς) Πλήθος: count(A)

78 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 78 Η γλώσσα SQL Λογαριασμός Υποκατάστημα Πελάτης Καταθέτης Δάνειο Όνομα-Υποκαταστήματος Αριθμός-Λογαριασμού Ποσό Όνομα-Πελάτη Αριθμός-Λογαριασμού Όνομα-Πελάτη Οδός Πόλη Όνομα-Υποκαταστήματος Πόλη Σύνολο Όνομα-Πελάτη Αριθμός-Δανείου Όνομα-Υποκαταστήματος Αριθμός-Δανείου Ποσό Δανειζόμενος

79 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 79 Συναθροιστικές Συναρτήσεις Παράδειγμα: Μέσο ποσό όλων των λογαριασμών στο υποκατάστημα Καλούτσανη select avg(Ποσό) from Λογαριασμός where Όνομα-Υποκαταστήματος = “Καλούτσανη” Το αποτέλεσμα είναι μια σχέση με ένα γνώρισμα και μια γραμμή, μπορούμε να δώσουμε όνομα στο γνώρισμα χρησιμοποιώντας το as

80 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 80 Συναθροιστικές Συναρτήσεις Παράδειγμα: Μέγιστο ποσό όλων των λογαριασμών στο υποκατάστημα Καλούτσανη και τον αριθμό του λογαριασμού!! select Αριθμός-Λογαριασμού, max(Ποσό) from Λογαριασμός where Όνομα-Υποκαταστήματος = “Καλούτσανη” Αν στο select υπάρχει συναθροιστική συνάρτηση, τότε μπορούν να υπάρχουν μόνο συναθροιστικές. Γιατί (σκεπτικό)?

81 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 81 Συναθροιστικές Συναρτήσεις Μπορούμε να εφαρμόσουμε τις συναρτήσεις όχι μόνο επί ενός πίνακα συνολικά, αλλά και επί ομάδων, αφού πρώτα τον ομαδοποοιήσουμε βάση ενός (ή περισσοτέρων γνωρισμάτων). Οι ομάδες προσδιορίζονται χρησιμοποιώντας το group by. Γενική μορφή: select, from R group by

82 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 82 Συναθροιστικές Συναρτήσεις Παράδειγμα: Μέσο ποσό των λογαριασμών σε κάθε υποκατάστημα select Όνομα-Υποκαταστήματος, avg(Ποσό) from Λογαριασμός group by Όνομα-Υποκαταστήματος Όνομα-Υποκαταστήματοςavg_Ποσό Καλούτσανη1827 Ψηλά Αλώνια1298 Παπαδημητρίου4391

83 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 83 Συναθροιστικές Συναρτήσεις Παράδειγμα: Μικρότερος και μεγαλύτερος μισθός ανά τμήμα και φύλο select DeptCode, Sex, min(Salary), max(Salary) from Λογαριασμός group by DeptCode, Sex DeptCodeSexmin_Salarymax_Salary 312M12402640 312F11902510 231M13043102 231F14103190 412M15612540

84 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 84 Συναθροιστικές Συναρτήσεις Αν θέλουμε να απαλείψουμε διπλές εμφανίσεις χρησιμοποιούμε τη λέξη-κλειδί distinct στην αντίστοιχη έκφραση. Παράδειγμα: Αριθμός καταθετών σε κάθε υποκατάστημα select Όνομα-Υποκαταστήματος, count(distinct Όνομα-Πελάτη) from Καταθέτης, Λογαριασμός where … group by Όνομα-Υποκαταστήματος

85 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 85 Συναθροιστικές Συναρτήσεις Η ομαδοποίηση μπορεί να γίνει ως προς περισσότερα του ενός πεδία. Παράδειγμα: Μέσος όρος καταθέσεων ανά πελάτη και ανά υποκατάστημα SELECT Όνομα-Υποκαταστήματος, Όνομα-Πελάτη, avg(balance) FROM account GROUP BY Όνομα-Υποκαταστήματος, Όνομα-Πελάτη Ομαδοποίηση γίνεται πρώτα ως προς το branch_name. Στην συνέχεια δημιουργούνται υποoμάδες ως προς το customer_name

86 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 87 Συναθροιστικές Συναρτήσεις Μπορούμε να εφαρμόσουμε μια συνθήκη σε μια συγκεκριμένη ομάδα από πλειάδες χρησιμοποιώντας το having (όπως το where επιδρά επί μίας γραμμής, έτσι και το having επιδρά επί μίας ομάδας. Παράδειγμα: Ονόματα υποκαταστημάτων με μέσο ποσό καταθέσεων μεγαλύτερο των $1200 select Όνομα-Υποκαταστήματος, avg(Ποσό) from Λογαριασμός group by Όνομα-Υποκαταστήματος having avg(Ποσό) > 1200 Η συνθήκη του having εφαρμόζεται αφού σχηματιστούν οι ομάδες και υπολογιστούν οι συναθροιστικές συναρτήσεις.

88 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 88 Συναθροιστικές Συναρτήσεις 'Οταν εμφανίζονται και το where και το having: η συνθήκη του where εφαρμόζεται πρώτα, οι πλειάδες που ικανοποιούν αυτή τη συνθήκη τοποθετούνται σε ομάδες με βάση το group by και μετά αν υπάρχει συνθήκη στο having εφαρμόζεται στις ομάδες.

89 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 89 Συναθροιστικές Συναρτήσεις Για να μετρήσουμε πόσες πλειάδες έχει μια σχέση: select count (*) from Πελάτης Δε μπορούμε να χρησιμοποιήσουμε το distinct με το count (*).

90 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 90 Συναθροιστικές Συναρτήσεις Παράδειγμα: Το υποκατάστημα με το μεγαλύτερο μέσο ποσό καταθέσεων. select distinct Όνομα-Υποκαταστήματος from Λογαριασμός group by Όνομα-Υποκαταστήματος having avg (Ποσό) > = all (select avg(Ποσό) from Λογαριασμός group by Όνομα-Υποκαταστήματος) Παρατήρηση: Δεν μπορούμε να βρούμε το μεγαλύτερο μέσο ποσό καταθέσεων (όχι ακόμα). Κάτι σαν max(avg(Ποσό)) δεν επιτρέπεται!

91 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 91 Συναθροιστικές Συναρτήσεις Παράδειγμα: Οι ηθοποιοί που έχουν παίξει το πολύ σε μια ταινία select Όνομα from Παίζει ας T where unique (select Τ.Όνομα from Παίζει ας R where T.Όνομα = R.Όνομα) Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού) select Όνομα from Παίζει group by Όνομα having count(*) < = 1

92 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 92 Συναθροιστικές Συναρτήσεις Περίληψη Μέσος όρος: avg (μόνο σε αριθμούς) Ελάχιστο: min Μέγιστο: max Άθροισμα: sum (μόνο σε αριθμούς) Πλήθος: count Αν θέλουμε να απαλείψουμε διπλές εμφανίσεις χρησιμοποιούμε τη λέξη- κλειδί distinct στην αντίστοιχη έκφραση. Μπορούμε να εφαρμόσουμε μια συνθήκη σε μια συγκεκριμένη ομάδα από πλειάδες χρησιμοποιώντας το having. Η συνθήκη του having εφαρμόζεται αφού σχηματιστούν οι ομάδες και υπολογιστούν οι συναθροιστικές συναρτήσεις Μπορούμε να εφαρμόσουμε τις συναρτήσεις όχι μόνο σε ένα σύνολο από πλειάδες, αλλά σε ομάδες από σύνολα πλειάδων. Οι ομάδες προσδιορίζονται χρησιμοποιώντας το group by

93 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 93 Συζεύξεις Συνόλων Η SQL--92 υποστηρίζει διάφορους τύπους συζεύξεων που συνήθως χρησιμοποιούνται στο for, αλλά μπορούν να χρησιμοποιηθούν οπουδήποτε μπορεί να χρησιμοποιηθεί μια σχέση. Γενική σύνταξη: ή natural

94 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 94 Συνενώσεις Συνόλων Τύποι Συνένωσης: inner join: εσωτερική (θήτα) συνένωση left outer join: αριστερή εξωτερική συνένωση right outer join full outer join

95 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 95 Παραγόμενες Σχέσεις Η SQL-92 δίνει τη δυνατότητα μια υποερώτηση να χρησιμοποιηθεί στο from Τότε πρέπει να τις δοθεί ένα όνομα και τα γνωρίσματα της να μετανομαστούν Αυτό γίνεται χρησιμοποιώντας το as

96 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 96 Παραγόμενες Σχέσεις Η SQL-92 δίνει τη δυνατότητα χρησιμοποιώντας το as να δοθεί ένα προσωρινό όνομα σε μία προσωρινή σχέση που προκύπτει από μια υποερώτηση. Παράδειγμα: Το μέσο υπόλοιπο για όλα τα υποκαταστήματα για τα οποία το μέσο ποσό είναι μεγαλύτερο των $1200 select Όνομα-Υποκαταστήματος, Μέσο-υπόλοιπο from (select Όνομα-Υποκαταστήματος, avg(Ποσό) from Καταθέτης group by Όνομα-Υποκαταστήματος as Αποτέλεσμα(Όνομα-Υποκαταστήματος, Μέσο-υπόλοιπο) where Μέσο-Yπόλοιπο > 1200

97 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 97 Ορισμός Όψεων Μπορούμε να ορίσουμε μια όψη χρησιμοποιώντας την εντολή: Επίσης, μπορούν να προσδιοριστούν τα ονόματα των γνωρισμάτων άμεσα create view as create view ( ) as view definition Χρήση: πίνακες που χρησιμοποιούνται συχνά και ενδιάμεσα αποτελέσματα

98 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 98 Ορισμός Όψεων Παράδειγμα: Μια όψη που περιλαμβάνει τα ονόματα όλων των υποκαταστημάτων και το άθροισμα του ποσού των δανείων που έχουν γίνει από αυτά create view Υποκατάστημα-Σύνολο-Δανείων (Σύνολο-Δανείων, Όνομα- Υποκαταστήματος) as select Όνομα-Υποκαταστήματος, sum(Ποσό) from Δάνειο group by Όνομα-Υποκαταστήματος

99 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 99 Ορισμός Όψεων Παράδειγμα: Μια όψη που περιλαμβάνει πληροφορίες για τους υπαλλήλους και τα τμήματα τους. create view EmployeeDept (SSN,Name,Salary,Sex,DeptName,MgrSSN) as select SSN, Employee.Name, Salary,Sex, Dept.Name, MgrSSN) from Employee, Dept where DeptCode = Code

100 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 100 Ορισμός Όψεων Τα ονόματα όψεων μπορεί να χρησιμοποιηθούν οπουδήποτε μπορεί να χρησιμοποιηθεί το όνομα μιας σχέσης. Εν γένει οι όψεις δεν υλοποιούνται (materialized views) – στην ORACLE μπορεί κάποιος να ορίσει να υλοποιούνται. Ο ορισμός της όψης παραμένει στην βάση δεδομένων, εκτός αν σβηστεί: drop view Ενημέρωση (updating) όψεων? στις απλές περιπτώσεις (χωρίς καρτεσιανό γινόμενο ή συναθροίσεις) μπορεί να υπάρξει ενημέρωση joins ? Γιατί όχι ? συνάθροιση ? Γιατί όχι ?

101 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 101 SQL Functions Εκτός από τις συναρτήσεις συνάθροισης υπάρχουν και άλλες built-in συναρτήσεις (που εξαρτώνται από το σύστημα). Για παράδειγμα ή Transact-SQL έχει: o datatype conversion functions o date functions o mathematical functions o row aggregate functions o string functions o system functions o text and image functions

102 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 102 Η γλώσσα SQL Γλώσσα Ορισμού Δεδομένων (ΓΟΔ) – Data Definition Langauge (DDL)

103 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 103 Γλώσσα Ορισμού Δεδομένων Γλώσσα Ορισμού Δεδομένων (ΓΟΔ) Σχετικά με το λογικό σχήμα, η ΓΟΔ SQL υποστηρίζει τους ορισμούς: του σχήματος κάθε σχέσης του πεδίου τιμών κάθε γνωρίσματος των περιορισμών ακεραιότητας

104 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 104 Γλώσσα Ορισμού Δεδομένων create table R(A 1 D 1, A 2 D 2,..., A n D n ),, …, όπου R είναι το όνομα της σχέσης, A i τα ονόματα των γνωρισμάτων, και D i οι τύποι των αντίστοιχων πεδίων τιμών.

105 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 105 Πεδία Τιμών Τύποι Πεδίου Ορισμού Για τον ορισμό του πεδίου ορισμού, οι διαθέσιμοι built-in τύποι περιλαμβάνουν: char(n) (σταθερού μήκους) varchar(n) int smallint numeric(p, d) (d από τα p ψηφία είναι στα δεξιά της υποδιαστολής) real, double precision float(n) date (ημερομηνία) time (ώρα)

106 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 106 Πεδία Τιμών Ο ορισμός πεδίου μπορεί να περιέχει τον προσδιορισμό not null Επίσης, επιτρέπεται δημιουργία πεδίου: create domain Όνομα-Προσώπου char(20) create domain as

107 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 107 Ορισμός Σχήματος create table R(A 1 D 1, A 2 D 2,..., A n D n ),, …, όπου R είναι το όνομα της σχέσης, A i τα ονόματα των γνωρισμάτων, και D i οι τύποι των αντίστοιχων πεδίων τιμών.

108 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 108 Ορισμός Σχήματος Επιτρεπτοί περιορισμοί ακεραιότητας είναι της μορφής: primary key A j 1, A j 2,..., A j n, (δεν επιτρέπονται επαναλαμβανόμενες τιμές και NULL τιμές) unique A j 1, A j 2,..., A j n, (δεν επιτρέπονται επαναλαμβανόμενες τιμέs; NULL τιμές επιτρέπονται) check P foreign key (A i ) references A j

109 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 109 Ορισμός Σχήματος Παραδείγματα (1) create table Πελάτης (Όνομα-Πελάτη char(20) not null, Οδός char(30), Πόλη char(30), primary key (Όνομα-Πελάτη))

110 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 110 Ορισμός Σχήματος (2) create table Λογαριασμός (Αριθμός-Λογαριασμού char(10) not null, Όνομα-Υποκαταστήματος char(15), Ποσό int, primary key (Αριθμός-Λογαριασμού) check (Ποσό >= 0)

111 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 111 Ορισμός Σχήματος Επίσης, πιο περίπλοκες συνθήκες, π.χ., για ξένα κλειδιά: check (Όνομα-Υποκαταστήματος in select Όνομα-Υποκαταστήματος from Υποκατάστημα)

112 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 112 Περιορισμοί Ακεραιότητας Περιορισμοί Αναφοράς Σύνταξη: foreign key (A i ) references A j Όταν μια πράξη (π.χ. insert) παραβιάζει έναν περιορισμό αναφοράς απορρίπτεται εκτός αν έχει οριστεί: on delete cascade on update cascade

113 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 113 Περιορισμοί Ακεραιότητας Παράδειγμα create table.. foreign key (Όνομα-Υποκαταστήματος) references Υποκατάστημα on delete cascade on update cascade …

114 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 114 Περιορισμοί Ακεραιότητας Πεδίου ορισμού Χρησιμοποιώντας την εντολή check: Παραδείγματα (1) Ελάχιστος ωρομίσθιο create domain Ωρομίσθιο numeric(5, 2) constraint Έλεγχος-Ωρομισθίου check(Ποσό >= 4.00)

115 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 115 Περιορισμοί Ακεραιότητας (2) Να μην περιέχει την τιμή null create domain Πεδίο-Αριθμός-Λογαριασμού char(10) constraint Έλεγχος-Αριθμός-Λογαριασμού check(value not null) (3) Να παίρνει συγκεκριμένες τιμές create domain Τύπος-Λογαριασμού char(10) constraint Έλεγχος-Τύπος-Λογαριασμού check value in (‘ Όψεως”, ‘Ταμιευτηρίου”)

116 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 116 Διαγραφή Σχήματος Μια καινούργια σχέση είναι αρχικά άδεια. Για να σβηστεί ένα σχήμα: drop table R Διαφορετικό από το: delete from R

117 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 117 Τροποποίηση Σχήματος ALTER TABLE όνομα πίνακα  ADD - προσθέτει καινούργια στήλη  DROP - διαγράφει μια στήλη  MODIFY - τροποποιεί μια στήλη

118 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 118 Τροποποίηση Σχήματος Προσθήκη νέου γνωρίσματος: alter table R add A D προσθήκη σε μια σχέση R που ήδη υπάρχει του γνωρίσματος A με πεδίο τιμών D, η τιμή των πλειάδων της R στο καινούργιο γνώρισμα είναι null. Διαγραφή γνωρίσματος: alter table R drop A

119 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 119 Τροποποίηση Σχήματος alter table R modify (όνομα_στήλης new_datatype) modify μπορεί να τροποποιήσει μόνο τον τύπο δεδομένων, όχι το όνομα της στήλης

120 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 120 Η γλώσσα SQL Τροποποίηση Βάσης Δεδομένων Γλώσσα Χειρισμού Δεδομένων (ΓXΔ)

121 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 121 Τροποποιήσεις 1. Διαγραφή 2. Εισαγωγή 3. Ενημέρωση

122 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 122 Εισαγωγή Για να εισάγουμε δεδομένα σε μια σχέση είτε (α) προσδιορίζουμε την πλειάδα, είτε (β) γράφουμε μια ερώτηση που το αποτέλεσμα της εισάγεται στη σχέση. insert into R(A 1, …, A n ) values (v 1, …, v n ) insert into R(A 1, …, A n ) select-from-where

123 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 123 Εισαγωγή Παράδειγμα για το (α) insert into Λογαριασμός values (“Ψηλά-Αλώνια”, “A--9732’’, 1200) Όταν με οποιαδήποτε σειρά, π.χ.,: insert into Λογαριασμός (Αριθμός-Λογαριασμού, Όνομα- Υποκαταστήματος, Ποσό) values (“A--9732’’, “Ψηλά-Αλώνια”, 1200)

124 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 124 Εισαγωγή Παράδειγμα για το (β): Για κάθε πελάτη που έχει πάρει δάνειο από το υποκατάστημα Ψηλά Αλώνια προστίθεται ως δώρο ένας λογαριασμός των $200 insert into Λογαρισμός select Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, 200 from Δάνειο where Όνομα-Υποκαταστήματος = “Ψηλά Αλώνια”

125 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 125 Εισαγωγή Πρέπει πρώτα να υπολογιστεί το select πλήρως και μετά να γίνει η εισαγωγή. Τι αποτέλεσμα έχει η παρακάτω εντολή αν αυτό δε συμβαίνει; insert into Λογαριασμός select * from Λογαριασμός

126 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 126 Εισαγωγή Επίσης, εισαγωγή null τιμών: insert into Λογαριασμός values (null, “A--9732’’, 1200)

127 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 127 Διαγραφή Μπορούμε να σβήσουμε μόνο ολόκληρες πλειάδες και όχι συγκεκριμένα γνωρίσματα. Σβήνει όλες τις πλειάδες της R για τις οποίες ισχύει το P. Όταν λείπει το where σβήνονται όλες οι πλειάδες μιας σχέσης. delete from R where P

128 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 128 Διαγραφή Παραδείγματα (1) Όλους τους λογαριασμούς του Παπαδόπουλου delete from Καταθέτης where Όνομα-Πελάτη = “Παπαδόπουλος”

129 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 129 Διαγραφή (2) Όλους τους λογαριασμούς στα υποκαταστήματα της Πάτρας delete from Λογαριασμός where Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα where Πόλη = “Πάτρα’’) Παρατήρηση: δεν υπάρχει τρόπος να διαγράψουμε τη μία από δυο ίδιες πλειάδες

130 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 130 Διαγραφή Αν και μπορούμε να σβήσουμε πλειάδες μόνο από μία σχέση τη φορά μπορούμε να αναφερθούμε σε περισσότερες από μια σχέσεις στην υποερώτηση του where (3) Όλους τους λογαριασμούς μιας τράπεζας με ποσό μικρότερο από το μέσο ποσό στην τράπεζα. delete from Λογαριασμός where Ποσό > (select avg(Ποσό) from Λογαριασμός) Πρώτα γίνεται ο έλεγχος σε όλες τις πλειάδες και μετά αυτές που ικανοποιούν τη συνθήκη διαγράφονται.

131 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 131 Διαγραφή Παράδειγμα: μια τράπεζα θέλει να κλείσει όλα τα υποκαταστήματά της που βρίσκονται στην Καστοριά delete from Υποκατάστημα where Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα where Πόλη = “Kαστοριά’)

132 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 132 Διαγραφή Πρέπει να διαγράψουμε και όλους τους λογαριασμούς: delete from Λογαριασμός where Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα where Πόλη = “Kαστοριά’) ΠΡΟΣΟΧΗ: όταν θέλουμε να διαγράψουμε κάποια δεδομένα, πρέπει να διαγράψουμε όλα τα δεδομένα που συσχετίζονται μ’ αυτά. Επίσης πρέπει να προσέξουμε την σειρά με την οποία θα γίνουν οι διαγραφές.

133 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 133 Διαγραφή υποκατάστημαλογαριασμός ΠόληΌνομα_Υποκ. Όνομα_Υποκ. Όνομα-ΠελάτηΥπόλοιπο ΚαστοριάK1 K1 ΚΩΤΣΗΣ 350.000 ΚαστοριάK3 K2 ΑΠΟΣΤΟΛΙΔΗΣ 230.000 ΘεσσαλονίκηΘ1 Θ1 ΣΤΕΦΑΝΟΥ 670.000 ΘεσσαλονίκηΘ2 Θ2 ΠΑΠΑΝΙΚΟΛΑΟΥ 256.000 Αθήνα A1 K3 ΧΑΤΖΟΠΟΥΛΟΣ 410.000 αν διαγράψουμε από τον πίνακα υποκατάστημα όλα τα υποκαταστήματα της Καστοριάς, θα έχουμε πρόβλημα ορθότητας στον πίνακα account. πρώτα πρέπει να διαγράψουμε τους λογαριασμούς και μετά τα υποκαταστήματα.

134 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 134 Ενημερώσεις Παράδειγμα: Αύξηση όλων των καταθέσεων που είναι μεγαλύτερες των $100 κατά 5% λόγω τοκισμού update Λογαριασμός set Ποσό = Ποσό * 1.05 where Ποσό > 100

135 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 135 Ενημερώσεις Παράδειγμα: στους πελάτες που έχουν υπόλοιπο 1.000.000 δίνει 9%: update Λογαριασμός set Ποσό = Ποσό * 1.05 where Ποσό < 1.000.000 update Λογαριασμός set Ποσό = Ποσό * 1.09 where Ποσό > 1.000.000 Ποιο update πρέπει να τρέξουμε πρώτα;

136 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 136 Ενημερώσεις Παράδειγμα: Αύξηση όλων των υπολοίπων που είναι μεγαλύτερα από τον μέσο όρο κατά 5% update Λογαριασμός set Υπόλοιπο = Υπόλοιπο * 1.05 where Υπόλοιπο > select avg(Υπόλοιπο) from Λογαριασμός

137 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 137 Διαδικαστική (procedural) SQL (Transact-SQL, PL/SQL) Ενσωματωμένη (embedded) SQL ODBC / JDBC Interface

138 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 138 SQL και προγράμματα Πολλές φορές η SQL δεν είναι ικανή να εκφράσει τα ερωτήματα που θέλουμε, για λόγους: Σε αυτές τις περιπτώσεις πρέπει να παντρέψουμε τη SQL με δομές κλασσικού προγραμματισμού. Υπάρχουν 3 τρόποι για αυτό: 1.Επεκτείνουμε τη SQL με τέτοιες δομές 2.Εμφωλιάζουμε SQL εντολές μέσα σε μια γλώσσα προγραμματισμού 3.Δημιουργούμε μία «γέφυρα» (interface) μεταξύ της SQL και της γλώσσας προγραμματισμού (API) ειδικού χειρισμού ερωτημάτων. αποδοτικότητας συστήματος (optimization). ανάγκες για μία Turing-complete γλώσσα (σαν τη Java / C).

139 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 139 Procedural (Διαδικαστική) SQL H SQL επεκτείνεται με δομές (μεταβλητές, βρόγχοι, blocks κ.λ.π.) ώστε να «θυμίζει» μία γλώσσα προγραμματισμού, με τις ανάλογες δυνατότητες. Μιcrosoft SQL Server: Transact-SQL Oracle: PL/SQL

140 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 140 Case Study: Oracle’s PL/SQL Στην PL/SQL μπορούμε να ορίσουμε: Blocks εντολών Μεταβλητές και τύπους (built-in και user-defined) Εντολές ελέγχου ροής, όπως if-then-else και loops Procedures και functions Αντικείμενα και μεθόδους Μέσα σε ένα πρόγραμμα PL/SQL συνήθως έχουμε κλασσικά ερωτήματα SQL.

141 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 144 Case Study: Oracle’s PL/SQL, Βρόγχοι Μπορούμε να έχουμε επαναληπτικές δομές σε ένα πρόγραμμα PL/SQL DECLARE 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 145 Case Study: Oracle’s PL/SQL, Λογικοί Δρομείς Ένας λογικός δρομέας (ή κέρσορας ) (cursor) χρησιμοποιείται για το χειρισμό των γραμμών που έχουν «τραβηχτεί» από τη ΒΔ με κάποιο select…from...where. Στην ουσία δημιουργείται ένας λογικός πίνακας των αποτελεσμάτων στον οποίο μπορούμε να προχωρήσουμε γραμμή- γραμμή. Η ιδέα των cursors υπάρχει σε όλες τις γλώσσες. Νίκος Παπαδοπουλος 35 Δημητρας 25 Μαρία Τσίαπα28 Παπαδημητρίου 31 ΓιώργοςΛακιός38Χαλανδρίου 78 ΕΟF κέρσορας

146 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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) AS BEGIN -- 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 153 Case Study: Transact SQL, Μεταβλητές και τύποι Mία μεταβλητή του χρήστη έχει πάντα την εξής μορφή: @ π.χ. @student_name και δηλώνεται ως: Declare data type όπου data type μπορεί να είναι predefined / user-defined τύπος

154 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 154 Case Study: Transact SQL, Έλεγχος Ροής Υπάρχουν οι εξής δομές: begin... end if... else while, break, continue /*... */ comments Goto

155 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 155 Case Study: Transact SQL, Cursors Η γενική μορφή δήλωσης είναι η εξής: declare cursor_name cursor for select…from…where statement [for {read only | update [of column_name_list]}] Παράδειγμα: declare authors_crsc cursor for select au_id, au_name, au_fname from authors where state <> ‘CA’ Παράδειγμα: declare authors_crsc cursor for select au_id, au_name, au_fname from authors where state <> ‘CA’ for update of au_name, au_fname

156 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 156 Case Study: Transact SQL, Cursors Άνοιγμα και κλείσιμο λογικού δρομέα: open cursor_name close cursor_name Π.χ. open authors_crsc Fetching μιας γραμμής: fetch cursor_name [into fetch_target_list] π.χ. fetch authors_crsc into @id, @lname, @fname

157 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 = @lastname GO 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 159 Case Study: Transact SQL, Εναύσματα (triggers) Μια διαδικασία η οποία ενεργοποιείται αυτόματα από το ΣΔΒΔ κάθε φορά που συμβαίνουν μεταβολές ορισμένου τύπου στα δεδομένα λέγεται trigger (έναυσμα). Μία ΒΔ με δηλωμένα triggers ονομάζεται active database (ενεργή ΒΔ). Παράδειγμα: Ένας πελάτης θέλει να κάνει χρέωση στην πιστωτική του κάρτα και με αυτή την συναλλαγή θα ξεπεράσει το πιστωτικό του όριο. Το ΣΔΒΔ θα πρέπει να ελέγχει σε κάθε συναλλαγή αν ο κανόνας του πιστωτικού ορίου τηρείται. Χαρακτηριστικά ενός trigger: γεγονός (π.χ. [before | after] insert/delete/update ) συνθήκη (π.χ. Salary > 10000, Area = “Μαρούσι”) ενέργεια (κώδικας SQL – π.χ. PL/SQL πρόγραμμα)

160 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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

161 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 161 Case Study: Transact SQL, Εναύσματα (triggers) Γενική μορφή σύνταξης (περισσότερες περιπτώσεις) σε Transact SQL: CREATE TRIGGER trigger_name ON table [WITH ENCRYPTION] FOR { [DELETE] [,] [INSERT] [,] [UPDATE] } [WITH APPEND] [NOT FOR REPLICATION] AS sql_statement

162 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 162 Case Study: Transact SQL, Εναύσματα (triggers) CREATE TRIGGER check_balance ON transactions FOR INSERT AS DECLARE @balance money, @credit_line money SELECT @balance = balance, @credit_line = credit_line FROM 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 TRANSACTION END Παράδειγμα: Ένας πελάτης θέλει να κάνει χρέωση στην πιστωτική του κάρτα και με αυτή την συναλλαγή θα ξεπεράσει το πιστωτικό του όριο.

163 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 163 Ενσωματωμένη SQL Προσπέλαση μιας ΒΔ μέσω μια γλώσσας προγραμματισμού (π.χ. C, Java) γενικού σκοπού απαιτείται τουλάχιστον γιατί: υπάρχουν ερωτήσεις που δε μπορούν να διατυπωθούν σε SQL, γιατί η SQL δεν έχει όλες τις δυνατότητες μιας γλώσσας προγραμματισμού γενικού σκοπού μη-δηλωτικές εντολές (π.χ., εκτύπωση, επικοινωνία με το χρήστη) δε μπορούν να γίνουν μέσω της SQL Ενσωμάτωση της SQL σε μια γλώσσα που καλείται φιλόξενη (host)

164 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 164 Ενσωματωμένη SQL Σε αυτήν την περίπτωση, η επεξεργασία των ερωτήσεων γίνεται από τη ΒΔ, και το αποτέλεσμα γίνεται διαθέσιμο στο πρόγραμμα μια γραμμή τη φορά Ένας ειδικός προ-επεξεργαστής (preprocessor) αντικαθιστά τον ενσωματωμένο κώδικα της SQL με δηλώσεις και κλήσεις συναρτήσεων στη host γλώσσα (δηλαδή π.χ. C) και μεταφράζεται το πρόγραμμα Τα ερωτήματα SQL «ενσωματώνονται» με την εξής σύνταξη: EXEC SQL END-EXEC Η ακριβής σύνταξη εξαρτάται από τη host γλώσσα

165 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 165 Ενσωματωμένη SQL Χρησιμοποιούμε την εντολή: SQL INCLUDE, για να δηλώσουμε στον προ-επεξεργαστή που πρέπει να εισάγει τις δηλώσεις των μεταβλητών της SQL Μεταβλητές της γλώσσας μπορεί να χρησιμοποιηθούν στην εντολή της SQL αν το σύμβολο ‘:’ προηγείται του ονόματός τους Για να γράψουμε μια ερώτηση σε SQL: EXEC SQL declare c cursor for select Όνομα-Πελάτη, Πόλη from Κατάθεση, Πελάτης where Κατάθεση.Όνομα-Πελάτη = Πελάτης.Όνομα-Πελάτη and Κατάθεση.Ποσό > :amount END-EXEC

166 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 166 Ενσωματωμένη SQL Η παραπάνω εντολή δεν προκαλεί την εκτέλεση της ερώτησης. Για να εκτελεστεί πρέπει να ανοίξουμε τον cursor: EXEC SQL open c END-EXEC Το αποτέλεσμα σώζεται σε μια προσωρινή σχέση, αν υπάρχει λάθος το διαγνωστικό μήνυμα σώζεται σε μια ειδική μεταβλητή (SQLCA) Οι γραμμές του αποτελέσματος γίνονται διαθέσιμες στο πρόγραμμα μέσω μιας σειράς από fetch εντολές. To αποτέλεσμα του fetch αποθηκεύεται σε μεταβλητή/ες της host γλώσσας για κάθε γνώρισμα EXEQ SQL fetch c into :cn$, :cc END-EXEC

167 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 167 Ενσωματωμένη SQL Για να κλείσουμε τον cursor: EXEC SQL close c END-EXEC Επίσης: EXEC SQL END-EXEC

168 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 #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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 173 Eπικοινωνία με διεπαφή JDBC/ODBC - Γενικά Σε αυτή την περίπτωση εισάγουμε ένα επίπεδο μεταξύ γλώσσας προγραμματισμού και Β.Δ., μέσω του οποίου γίνεται η επικοινωνία τους. Υπάρχει το ODBC (γενικής εφαρμογής) και το JDBC (για γλώσσα Java). Ποια είναι η διαφορά με την ενσωματωμένη SQL ??? Η επικοινωνία με τη ΒΔ γίνεται με system calls της host γλώσσας προγραμματισμού. Συνεπώς, για κάθε διαφορετικό ΣΔΒΔ πρέπει να δημιουργείται και διαφορετικό σύνολο system calls. Αυτό συνεπάγεται ότι για ν ΣΔΒΔ θα υπάρχουν ν implementations. Αντίθετα, με ένα ενδιάμεσο επίπεδο, αρκεί η γλώσσα να «μιλάει» με αυτό (DB-independent.) Νο free lunch: κόστος -> αποδοτικότητα

174 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 178 Eπικοινωνία με διεπαφή JDBC/ODBC – Java Σύνδεση με τη ΒΔ Εκτέλεση ενός SQL αιτήματος. Μπορεί να είναι δύο ειδών: select...from...where insert/update/delete Αποσύνδεση με τη ΒΔ

179 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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 Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 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(); }


Κατέβασμα ppt "1 Η Γλώσσα SQL Δαμιανός Χατζηαντωνίου Τμ. Διοικητικής Επιστήμης & Τεχνολογίας Οικονομικό Πανεπιστήμιο Αθηνών."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google