Η Γλώσσα sql

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

Upload: wood

Post on 25-Jan-2016

96 views

Category:

Documents


2 download

DESCRIPTION

Η Γλώσσα SQL. Δαμιανός Χατζηαντωνίου Τμ. Διοικητικής Επιστήμης & Τεχνολογίας Οικονομικό Πανεπιστήμιο Αθηνών. Η γλώσσα SQL. Η “ standard ” γλώσσα για σχεσιακές βάσεις δεδομένων. αρχικά Sequel στην IBM ως μέρος του System R, τώρα SQL (Stuctured Query Language) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Η Γλώσσα  SQL

1

Η Γλώσσα SQL

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

Page 2: Η Γλώσσα  SQL

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

Η γλώσσα SQL

• Η “standard” γλώσσα για σχεσιακές βάσεις δεδομένων.

• αρχικά Sequel στην IBM ως μέρος του System R, τώρα SQL (Stuctured Query Language)

• SQL--89, SQL--92, SQL-99

• Είναι γλώσσα δηλωτική (declarative) – ορίζουμε το ΤΙ, όχι το ΠΩΣ

Page 3: Η Γλώσσα  SQL

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

Η γλώσσα SQL

Θέματα SQL:

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

Page 4: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 4

Η γλώσσα SQL

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

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

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

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

Page 5: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 5

Γλώσσα Χειρισμού Δεδομένων

Θέματα:

• Βασική δομή (select-from-where)• Συναθροιστικές συναρτήσεις (aggregation)• Εμφωλευμένα υποαιτήματα (nested subqueries)

Page 6: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 6

Βασική Δομή

Βασική Δομή

select Α1, Α2, .., Αn

from R1, R2, … Rm

where P

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

Ισοδύναμο του: π A1, A2, .., An (σ P (R1 x R2 x … Rm))

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

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

συνθήκη

Page 7: Η Γλώσσα  SQL

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

Βασική Δομή

select αντιστοιχεί στην πράξη της προβολής (projection) της σχεσιακής άλγεβρας (προσοχή: όχι στην πράξη selection).Ποια γνωρίσματα θέλουμε να υπάρχουν στο τελικό αποτέλεσμα της ερώτησης.

select Α1, Α2, .., Αnfrom R1, R2, … Rm

where P

π A1, A2, .., An (σ P (R1 x R2 x …

Rm))

Page 8: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 8

Βασική Δομή

select Α1, Α2, .., Αn

from R1, R2, … Rmwhere P

π A1, A2, .., An (σ P (R1 x R2 x …

Rm))

from αντιστοιχεί στην πράξη του καρτεσιανού γινομένου της σχεσιακής άλγεβρας. Ποιες σχέσεις θα χρησιμοποιηθούν για τον υπολογισμό του αποτελέσματος.

Page 9: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 9

Βασική Δομή

select Α1, Α2, .., Αn

from R1, R2, … Rmwhere P

π A1, A2, .., An (σ P (R1 x R2 x …

Rm))

where αντιστοιχεί στη συνθήκη της πράξης της επιλογής (selection) στη σχεσιακή άλγεβρα. Το κατηγόρημα (predicate) P έχει γνωρίσματα των σχέσεων που εμφανίζονται στο from.

Page 10: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 10

Βασική Δομή

• Όταν δεν υπάρχει το where, το P θεωρείται ότι ισχύει (true).

• ΠΡΟΣΟΧΗ: Δε γίνεται απαλοιφή των διπλών εμφανίσεων. Με άλλα λόγια δεν έχει συνολοθεωρητική ερμηνεία, όπως η σχεσιακή άλγεβρα.

Page 11: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 11

Παράδειγμα 1

Ταινία

Τίτλος Έτος Διάρκεια Είδος

Παίζει Όνομα Τίτλος Έτος

Όνομα Διεύθυνση Έτος-Γέννησης Σύζυγος-Ηθοποιού

Ηθοποιός

Page 12: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 12

Παράδειγμα 2

Employee

Project

Department

Assigned

SSN

Works-in

Name

Id

Description

Location

Hours

Code

Sex

Salary

Name

BudgetMgrSSN

Page 13: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 13

Παράδειγμα 2

Σχεσιακή σχεδίαση:

Employee (SSN, Name, Salary, Sex, DeptCode)

Project (Id, Description, Location)

Dept (Code, Name, Budget, MgrSSN)

Assigned (SSN, Id, Hours)

Page 14: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 14

Select

Παράδειγμα: δείξε όλα τα στοιχεία των υπαλλήλων

Select

select SSN, Name, Sex, Salary, DeptCodefrom Employee

Page 15: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 15

Select

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

Select

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

Page 16: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 16

Select

Παράδειγμα: δείξε τους μισθούς των υπαλλήλων

Select

select Salaryfrom Employee

• Η SQL επιτρέπει πολλαπλές εμφανίσεις της ίδιας πλειάδας σε μια σχέση (π.χ. ίδιοι μισθοί). Μια σχέση στην SQL είναι ένα πολυσύνολο (multiset) ή θύλακας (bag) => δεν υπάρχει απαλοιφή διπλοτιμών. Αυτό είναι πολύ χρήσιμο στις περισσότερες περιπτώσεις (π.χ. ?)

Page 17: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 17

Select

• Για να έχουμε απαλοιφή διπλοτιμών (duplicate elimination) θα πρέπει να το ζητήσουμε χρησιμοποιώντας το distinct.

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

select distinct Salaryfrom Employee

Page 18: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 18

Select

select *from Employee

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

select SSN, Name, Sex, Salary, DeptCodefrom Employee

Page 19: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 19

Select

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

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

Αριθμητικές πράξεις (+, -, *, /) ή εφαρμογή συναρτήσεων (π.χ. date ή string functions - αργότερα) ανάμεσα σε σταθερές ή γνωρίσματα πλειάδων

select Name, Salary * 340.75from Employee

Page 20: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 20

Where

Where

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

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

Page 21: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 21

Where

Where

Παράδειγμα: Το όνομα και το μισθό όλων των γυναικών στο τμήμα 23

select Name, Salaryfrom Employeewhere Sex = ‘F’ and DeptCode = 23

Page 22: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 22

Where

Λογικοί τελεστές: and, or, not

Τελεστές σύγκρισης: <, <=, >, >=, =, <>, between, not between (ανάμεσα σε αριθμητικές εκφράσεις, συμβολο-σειρές [strings], και ειδικούς τύπους).

συνθήκη του where

Page 23: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 23

Where

Παράδειγμα χρήσης του between :

select Τίτλος from Ταινίαwhere Έτος between 1990 and 1995

select Τίτλος from Ταινίαwhere Έτος >= 1990 and Έτος <= 1995

αντί του

Page 24: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 24

From

From

Παράδειγμα: Δείξε το SSN των υπαλλήλων μαζί με το SSN του διευθυντή του τμήματος στο οποίο δουλεύει

select SSN, MgrSSNfrom Employee, Deptwhere DeptCode = Code

ΟΜΩΣ: Αν θέλαμε και το όνομα του τμήματος στο οποίο δουλεύει?

Page 25: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 25

From

From

Παράδειγμα: Δείξε το SSN των υπαλλήλων μαζί με το όνομα του τμήματος στο οποίο δουλεύει

select SSN, Namefrom Employee, Deptwhere DeptCode = Code

Ποιό Name ??? Από ποιόν πίνακα ???

Page 26: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 26

Βασική Δομή

• Όταν το ίδιο γνώρισμα εμφανίζεται στο σχήμα περισσότερων από μια σχέσεων, τότε διάκριση βάση του συμβολισμού:

<όνομα-σχέσης>.<όνομα-γνωρίσματος>

select SSN, Dept.Namefrom Employee, Deptwhere DeptCode = Code

Page 27: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 27

From

Παράδειγμα φυσικής σύζευξης:Το ‘ονομα των ηθοποιών που παίζουν σε ασπρόμαυρες

ταινίες

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

Page 28: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 28

From

From

Παράδειγμα: Δείξε το όνομα των υπαλλήλων που δουλεύουν στο τμήμα «Marketing»

select Employee.Namefrom Employee, Deptwhere DeptCode = Code and Dept.Name = ‘Marketing’

Page 29: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 29

From

From

Παράδειγμα: Δείξε το όνομα των υπαλλήλων που δουλεύουν σε κάποιο project στο ‘Μαρούσι’

select Namefrom Employee, Assigned, Projectwhere Employee.SSN = Assigned.SSN and

Project.Id=Assigned.Id and Project.Location=‘Μαρούσι’

Page 30: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 30

From

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος)

Παίζει(Όνομα, Τίτλος, Έτος)

Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

Παραδείγματα

• Έγχρωμες ταινίες με διάρκεια μέχρι 80 λεπτά

• Οι ηθοποιοί που γεννήθηκαν μετά το 1935 και έπαιξαν σε ασπρόμαυρες ταινίες πριν το 1945

Page 31: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 31

Πράξεις με Συμβολοσειρές (Strings)

Πράξεις με Συμβολοσειρές

Η πιο συνηθισμένη πράξη είναι ταίριασμα προτύπων (pattern matching):

% ταιριάζει οποιαδήποτε συμβολοσειρά_ ταιριάζει οποιοδήποτε χαρακτήρα

Γίνεται διάκριση ανάμεσα σε κεφαλαία και μικρά

Σύγκριση χρησιμοποιώντας το like, not like

Page 32: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 32

Πράξεις με Συμβολοσειρές

Παράδειγμα: Δείξε όλα τα IDs των projects που έχουν στην περιγραφή τους το string «Αττική οδός»

select IDfrom Projectwhere Description like “%Αττική οδός%”

Πολλές ακόμα πράξεις διαθέσιμες για pattern matching – κυττάξτε στο on line help για την Transact-SQL.

Page 33: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 33

Πράξεις με Συμβολοσειρές

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

Θάλασσα

select distinct Τίτλοςfrom Ταινία where Τίτλος like “%Θάλασσα%”

Page 34: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 34

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

Διάταξη των Γραμμών του αποτελέσματος

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

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

select Name, Salary from Employeewhere DeptCode = 311order by Salary

Page 35: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 35

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

Default: αύξουσα διάταξη, αλλά και άμεσα χρησιμοποιώντας το asc (αύξουσα) ή το desc (φθήνουσα). Επίσης, ταξινόμηση με βάση πολλά γνωρίσματα.

Παράδειγμα:

select *from Ταινίαorder by Έτος desc, Τίτλος asc

Η ταξινόμηση είναι δαπανηρή λειτουργία.

Παράδειγμα:

select *from Employeeorder by DeptCode asc, Salary desc

Page 36: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 36

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

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

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

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

<παλιό-όνομα> as <νέο-όνομα>

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

Page 37: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 37

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

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

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

Page 38: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 38

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

Χρήσιμο όταν

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

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

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

(δ) όταν έχουμε self-joins

Page 39: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 39

Πράξεις Συνόλων

Πράξεις Συνόλων

Πράξεις:

• union• intersection• except

εφαρμόζονται σε συμβατές σχέσεις (same arity, domain).

Page 40: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 40

Πράξεις Συνόλων

Γενική Σύνταξη:

( select from where )union/intersection/except( selectfrom where)

Page 41: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 41

Πράξεις Συνόλων

Λογαριασμός

Υποκατάστημα

Πελάτης

Καταθέτης

Δάνειο

Όνομα-Υποκαταστήματος Αριθμός-Λογαριασμού Ποσό

Όνομα-Πελάτη Αριθμός-Λογαριασμού

Όνομα-Πελάτη Οδός Πόλη

Όνομα-Υποκαταστήματος Πόλη Σύνολο

Όνομα-Πελάτη Αριθμός-Δανείου

Όνομα-Υποκαταστήματος Αριθμός-Δανείου Ποσό

Δανειζόμενος

Page 42: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 42

Πράξεις Συνόλων

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

( select Όνομα-Πελάτηfrom Καταθέτης )union( select Όνομα-Πελάτηfrom Δανειζόμενος )

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

Page 43: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 43

Πράξεις Συνόλων

Σε αυτές τις πράξεις έχουμε απαλοιφή διπλών εμφανίσεων, εκτός αν χρησιμοποιηθεί το union all

Μέγιστος αριθμός πολλαπλών εμφανίσεων;

Page 44: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 44

Πράξεις Συνόλων

Αντίστοιχα υπάρχει το intersect all

Μέγιστος αριθμός πολλαπλών εμφανίσεων;

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

( select Όνομα-Πελάτηfrom Καταθέτης )intersect( select Όνομα-Πελάτηfrom Δανειζόμενος )

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

Page 45: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 45

Πράξεις Συνόλων

Αντίστοιχα υπάρχει το except all

Μέγιστος αριθμός πολλαπλών εμφανίσεων;

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

( select Όνομα-Πελάτηfrom Καταθέτης )except( select Όνομα-Πελάτηfrom Δανειζόμενος )

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

Page 46: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 46

Πράξεις Συνόλων

Αντίστοιχα υπάρχει το except all

Μέγιστος αριθμός πολλαπλών εμφανίσεων;

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

( select SSNfrom Employee )except( select MgrSSNfrom Dept )

Τo SSN των υπαλλήλων που δεν είναι διευθυντές τμήματος.

Page 47: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 47

Μεταβλητές Πλειάδων (tuple variables)

Μεταβλητές Πλειάδων (tuple variables)

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

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

H ιδέα είναι ότι η μεταβλητή «τρέχει» επί του πίνακα γραμμή-γραμμή

Page 48: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 48

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

• Οι μεταβλητές πλειάδων είναι ιδιαίτερα χρήσιμες όταν θέλουμε να συγκρίνουμε δυο πλειάδες της ίδιας σχέσης (self-join). Παράδειγμα: Τα ονόματα όλων των ταινιών που έχουν διάρκεια μεγαλύτερη τουλάχιστον από μία ταινία που γυρίστηκε το 1995

select distinct Τ.Τίτλοςfrom Ταινία as S, Ταινία as Twhere T.Διάρκεια > S. Διάρκεια and S.Έτος = 1995

Page 49: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 49

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

• Οι μεταβλητές πλειάδων είναι ιδιαίτερα χρήσιμες όταν θέλουμε να συγκρίνουμε δυο πλειάδες της ίδιας σχέσης (self-join). Παράδειγμα: Για κάθε τμήμα, δείξε τα τμήματα που έχουν μεγαλύτερο budget από αυτό

select D.Code, G.Codefrom Dept as D, Dept as Gwhere D.Code < G.Code

υπολογισμός?

Page 50: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 50

Η τιμή null

Η τιμή null

Χρήση της λέξης κλειδί is null (is not null) σε μια συνθήκη για να ελέγξουμε αν μια τιμή είναι null.

select Αριθμός-Δανείουfrom Δάνειο where Ποσό is null

Page 51: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 51

Η τιμή null

Εμφάνιση null

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

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

Page 52: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 52

Εμφωλιασμένa Υποερωτήματα (nested subqueries)

Εμφωλιασμένα υποερωτήματα

• Μερικά ερωτήματα απαιτούν πρώτα τον υπολογισμό κάποιων τιμών και κατόπιν τη χρησιμοποίησή τους στις συνθήκες του WHERE. • Η SQL επιτρέπει το nesting υποερωτήμάτων (δομημένα υποερωτήματα). • Μια υποερώτηση είναι μια έκφραση select-from-where που χρησιμοποιείται μέσα σε μια άλλη ερώτηση.

Page 53: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 53

Nested Subqueries

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

Υπολογισμός της υποερώτησης για κάθε γραμμή (ή πλειάδα) της εξωτερικής ερώτησης

υποερώτηση ή εσωτερικό ερώτημα (inner query)εξωτερικό

ερώτημα (οuter query)

Page 54: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 54

Εμφωλιασμένa Υποερωτήματα (nested subqueries)

Παράδειγμα: Βρες όλους τους υπαλλήλους που δουλεύουν σε κάποιο τμήμα με budget > 200000

select *from Employeewhere DeptCode in (

select Codefrom Deptwhere Budget > 200000 )

To υποερώτημα δεν εξαρτάται/συσχετίζεται (correlated) με το εξωτερικό ερώτημα. Αυτό δεν ισχύει πάντοτε (correlation).

Page 55: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 55

Εμφωλιασμένa Υποερωτήματα (nested subqueries)

• Η SQL έχει μια συνολοθεωρητική κατεύθυνση. Θα έπρεπε λοιπόν να επιτρέπει συγκρίσεις συνόλων στο WHERE κομμάτι.• Παράδειγμα: προηγουμένως το “in”

• Μπορούμε να έχουμε όσα επίπεδα εμφωλίασης επιθυμούμε• Δομή και συντακτικό?

Page 56: Η Γλώσσα  SQL

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

Page 57: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 57

Nested Subqueries

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

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

select distinct Όνομα-Πελάτηfrom Δανειζόμενος where Όνομα-Πελάτη in ( select Όνομα-Πελάτη from Καταθέτης)

Page 58: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 58

Nested Subqueries

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

select distinct Όνομα-Πελάτη from Δανειζόμενος, Δάνειο where Δανειζόμενος.Αριθμός-Δανείου = Δάνειο.Αριθμός.Δανείου and Όνομα-Υποκαταστήματος = “Ψηλά-Αλώνια” and ( Όνομα-Υποκαταστήματος, Όνομα-Πελάτη) in (select Όνομα-Υποκαταστήματος, Όνομα-Πελάτη from Καταθέτης, Λογαριασμός where Καταθέτης.Αριθμός-Λογαριασμού =

Λογαριασμός.Αριθμός-Λογαριασμού)

• Παραπάνω από δύο γνωρίσματα

Page 59: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 59

Nested Subqueries

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

select distinct Ηθοποιός.Όνομαfrom Παίζει where ( Παίζει.Τίτλος, Παίζει Έτος) in

(select Ταινία.Τίτλος, Ταινία.Έτος from Ταινία where Είδος = «Ασπρόμαυρη»)

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος)

Παίζει(Όνομα, Τίτλος, Έτος)

Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

Page 60: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 60

Nested Subqueries

Μπορεί να χρησιμοποιηθεί και με enumerated σύνολα

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

select distinct Όνομα-Πελάτηfrom Δανειζόμενοςwhere Όνομα-Πελάτη not in (“Παπαδόπουλος” , “Πέτρου”)

Page 61: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 61

Nested Subqueries

Σύγκριση Συνόλων

1. Ο τελεστής some (any) έχει τη σημασία του τουλάχιστον ένα από ένα σύνολο

Παράδειγμα: Τα ονόματα όλων των υποκαταστημάτων που έχουν καταθέσεις μεγαλύτερες από τις καταθέσεις ενός τουλάχιστον υποκαταστήματος των Ιωαννίνων.

select distinct Όνομα-Υποκαταστήματοςfrom Υποκατάστημαwhere Ποσό > some (select Ποσό

from Υποκατάστημα where Πόλη = “Ιωάννινα”)

Page 62: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 62

Εμφωλιασμένa Υποερωτήματα (nested subqueries)

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

select *from Employeewhere Salary > some (

select 0.1 * Budgetfrom Dept )and Sex = ‘M’

Page 63: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 63

Nested Subqueries

• επίσης:

< some,

<= some,

>= some,

= some (ισοδ. του in)

< > some (όχι ισοδ. του not in)

Page 64: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 64

Nested Subqueries

2. Ο τελεστής all έχει τη σημασία: “από όλα τα στοιχεία του συνόλου”

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

select distinct Όνομα-Υποκαταστήματοςfrom Υποκατάστημαwhere Ποσό > all (select Ποσό

from Υποκατάστημα where Πόλη = “Ιωάννινα”)

Page 65: Η Γλώσσα  SQL

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

Page 66: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 66

Nested Subqueries

• επίσης:

< all,

<= all,

>= all,

= all,

< > all (ισοδ. του not in)

Page 67: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 67

Nested Subqueries

3. Έλεγχος για κενή σχέση

Ο τελεστής exists: επιστρέφει true αν η υποερώτηση δεν είναι κενή

Παράδειγμα: Οι πελάτες που έχουν καταθέσεις και έχουν πάρει δάνειο.select Όνομα-Πελάτηfrom Δανειζόμενοςwhere exists (select * from Καταθέτης where Καταθέτης.Όνομα-Πελάτη = Δανειζόμενος.Όνομα-

Πελάτη)

συσχέτιση (correlation)

Page 68: Η Γλώσσα  SQL

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

Page 69: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 69

Nested Subqueries

Ο τελεστής not exists μπορεί να χρησιμοποιηθεί για έλεγχο αν η σχέση A περιέχει τη σχέση B

not exists (Β except Α)

• Ποια πράξη της σχεσιακής άλγεβρας;

Page 70: Η Γλώσσα  SQL

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

Page 71: Η Γλώσσα  SQL

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

Page 72: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 72

Nested Subqueries

4. Έλεγχος για Διπλές Εμφανίσεις

Ο τελεστής unique: επιστρέφει true αν η υποερώτηση δεν έχει επαναλήψεις (duplicates) – not unique

Page 73: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 73

Nested Subqueries

Παράδειγμα: Οι πελάτες που έχουν ακριβώς μια κατάθεση στο υποκατάστημα “Ψηλά Αλώνια”

select T.Όνομα-Πελάτηfrom Καταθέτης as Τwhere unique (select R.Όνομα-Πελάτη from Λογαριασμός, Καταθέτης as R where T.Όνομα-Πελάτη = R.Όνομα-Πελάτη and R. Αριθμός-Λογαριασμού =

Λογαριασμός. Αριθμός- Λογαριασμού and Λογαριασμός.Όνομα-Υποκαταστήματος = “Ψηλά

Αλώνια”)

Page 74: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 74

Nested Subqueries

Παράδειγμα: Οι πελάτες που έχουν τουλάχιστον δύο κατάθεσεις στο υποκατάστημα “Ψηλά Αλώνια”

select T.Όνομα-Πελάτηfrom Καταθέτης as Τwhere not unique (select R.Όνομα-Πελάτη from Λογαριασμός, Καταθέτης as R where T.Όνομα-Πελάτη = R.Όνομα-Πελάτη and R. Αριθμός-Λογαριασμού =

Λογαριασμός. Αριθμός- Λογαριασμού and Λογαριασμός.Όνομα-Υποκαταστήματος = “Ψηλά

Αλώνια”)

Page 75: Η Γλώσσα  SQL

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

Page 76: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 76

Nested Subqueries

• in/not in (συμμετοχή σε σύνολο)

• (>, =, κλπ) some/any/all (σύγκριση συνόλων)

• exists/not exists (έλεγχος για κενά σύνολα)

• unique/not unique (έλεγχος για διπλότιμα)

Page 77: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 77

Συναθροιστικές Συναρτήσεις (Aggregation)

Συναθροιστικές Συναρτήσεις (Aggregate Functions)Η SQL έχει 5 built-in συναθροιστικές συναρτήσεις:

Μέσος όρος: avg(A) (μόνο σε αριθμούς) A γνώρισμαΕλάχιστο: min(A)Μέγιστο: max(A)Άθροισμα: sum(A) (μόνο σε αριθμούς)Πλήθος: count(A)

Page 78: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 78

Η γλώσσα SQL

Λογαριασμός

Υποκατάστημα

Πελάτης

Καταθέτης

Δάνειο

Όνομα-Υποκαταστήματος Αριθμός-Λογαριασμού Ποσό

Όνομα-Πελάτη Αριθμός-Λογαριασμού

Όνομα-Πελάτη Οδός Πόλη

Όνομα-Υποκαταστήματος Πόλη Σύνολο

Όνομα-Πελάτη Αριθμός-Δανείου

Όνομα-Υποκαταστήματος Αριθμός-Δανείου Ποσό

Δανειζόμενος

Page 79: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 79

Συναθροιστικές Συναρτήσεις

Παράδειγμα: Μέσο ποσό όλων των λογαριασμών στο υποκατάστημα Καλούτσανη

select avg(Ποσό)from Λογαριασμός where Όνομα-Υποκαταστήματος = “Καλούτσανη”

Το αποτέλεσμα είναι μια σχέση με ένα γνώρισμα και μια γραμμή, μπορούμε να δώσουμε όνομα στο γνώρισμα χρησιμοποιώντας το as

Page 80: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 80

Συναθροιστικές Συναρτήσεις

Παράδειγμα: Μέγιστο ποσό όλων των λογαριασμών στο υποκατάστημα Καλούτσανη και τον αριθμό του λογαριασμού!!select Αριθμός-Λογαριασμού, max(Ποσό)from Λογαριασμός where Όνομα-Υποκαταστήματος = “Καλούτσανη”

Αν στο select υπάρχει συναθροιστική συνάρτηση, τότε μπορούν να υπάρχουν μόνο συναθροιστικές. Γιατί (σκεπτικό)?

Page 81: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 81

Συναθροιστικές Συναρτήσεις

Μπορούμε να εφαρμόσουμε τις συναρτήσεις όχι μόνο επί ενός πίνακα συνολικά, αλλά και επί ομάδων, αφού πρώτα τον ομαδοποοιήσουμε βάση ενός (ή περισσοτέρων γνωρισμάτων). Οι ομάδες προσδιορίζονται χρησιμοποιώντας το group by.

Γενική μορφή:

select <group-by γνωρίσματα>, <συναθροιστικές συναρτήσεις>from Rgroup by <group by γνωρίσματα>

Page 82: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 82

Συναθροιστικές Συναρτήσεις

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

select Όνομα-Υποκαταστήματος, avg(Ποσό) from Λογαριασμόςgroup by Όνομα-Υποκαταστήματος

Όνομα-Υποκαταστήματος avg_Ποσό

Καλούτσανη 1827Ψηλά Αλώνια 1298Παπαδημητρίου 4391

Page 83: Η Γλώσσα  SQL

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

Page 84: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 84

Συναθροιστικές Συναρτήσεις

Αν θέλουμε να απαλείψουμε διπλές εμφανίσεις χρησιμοποιούμε τη λέξη-κλειδί distinct στην αντίστοιχη έκφραση.

Παράδειγμα: Αριθμός καταθετών σε κάθε υποκατάστημα

select Όνομα-Υποκαταστήματος, count(distinct Όνομα-Πελάτη) from Καταθέτης, Λογαριασμός where …group by Όνομα-Υποκαταστήματος

Page 85: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 85

Συναθροιστικές Συναρτήσεις

Η ομαδοποίηση μπορεί να γίνει ως προς περισσότερα του ενός πεδία.

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

SELECT Όνομα-Υποκαταστήματος, Όνομα-Πελάτη, avg(balance) FROM account GROUP BY Όνομα-Υποκαταστήματος, Όνομα-Πελάτη

Ομαδοποίηση γίνεται πρώτα ως προς το branch_name. Στην συνέχεια δημιουργούνται υποoμάδες ως προς το customer_name

Page 86: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 86

Συναθροιστικές Συναρτήσεις

Μπορούν να συμμετέχουν πάνω από μία σχέσεις.

Παράδειγμα: Βρές το μέσο μισθό για κάθε project

SELECT A.ID, avg(Salary) FROM Employee as E, Assigned as A WHERE E.SSN=A.SSN GROUP BY A.ID

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

Page 87: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 87

Συναθροιστικές Συναρτήσεις

Μπορούμε να εφαρμόσουμε μια συνθήκη σε μια συγκεκριμένη ομάδα από πλειάδες χρησιμοποιώντας το having (όπως το where επιδρά επί μίας γραμμής, έτσι και το having επιδρά επί μίας ομάδας.

Παράδειγμα: Ονόματα υποκαταστημάτων με μέσο ποσό καταθέσεων μεγαλύτερο των $1200

select Όνομα-Υποκαταστήματος, avg(Ποσό)from Λογαριασμός group by Όνομα-Υποκαταστήματοςhaving avg(Ποσό) > 1200

Η συνθήκη του having εφαρμόζεται αφού σχηματιστούν οι ομάδες και υπολογιστούν οι συναθροιστικές συναρτήσεις.

Page 88: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 88

Συναθροιστικές Συναρτήσεις

'Οταν εμφανίζονται και το where και το having:

• η συνθήκη του where εφαρμόζεται πρώτα, • οι πλειάδες που ικανοποιούν αυτή τη συνθήκη τοποθετούνται σε ομάδες με βάση το group by • και μετά αν υπάρχει συνθήκη στο having εφαρμόζεται στις ομάδες.

Page 89: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 89

Συναθροιστικές Συναρτήσεις

Για να μετρήσουμε πόσες πλειάδες έχει μια σχέση:

select count (*) from Πελάτης

Δε μπορούμε να χρησιμοποιήσουμε το distinct με το count (*).

Page 90: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 90

Συναθροιστικές Συναρτήσεις

Παράδειγμα: Το υποκατάστημα με το μεγαλύτερο μέσο ποσό καταθέσεων.

select distinct Όνομα-Υποκαταστήματοςfrom Λογαριασμόςgroup by Όνομα-Υποκαταστήματοςhaving avg (Ποσό) > = all (select avg(Ποσό) from Λογαριασμός

group by Όνομα-Υποκαταστήματος)

Παρατήρηση: Δεν μπορούμε να βρούμε το μεγαλύτερο μέσο ποσό καταθέσεων (όχι ακόμα). Κάτι σαν max(avg(Ποσό)) δεν επιτρέπεται!

Page 91: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 91

Συναθροιστικές Συναρτήσεις

Παράδειγμα: Οι ηθοποιοί που έχουν παίξει το πολύ σε μια ταινίαselect Όνομαfrom Παίζει ας Twhere unique (select Τ.Όνομα from Παίζει ας R

where T.Όνομα = R.Όνομα)

Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος)

Παίζει(Όνομα, Τίτλος, Έτος)

Ηθοποιός(Όνομα, Διεύθυνση, Έτος-Γέννησης, Σύζυγος-Ηθοποιού)

select Όνομαfrom Παίζει group by Όνομαhaving count(*) < = 1

Page 92: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 92

Συναθροιστικές Συναρτήσεις

Περίληψη Μέσος όρος: avg (μόνο σε αριθμούς)Ελάχιστο: minΜέγιστο: maxΆθροισμα: sum (μόνο σε αριθμούς)Πλήθος: count

Αν θέλουμε να απαλείψουμε διπλές εμφανίσεις χρησιμοποιούμε τη λέξη-κλειδί distinct στην αντίστοιχη έκφραση.

Μπορούμε να εφαρμόσουμε μια συνθήκη σε μια συγκεκριμένη ομάδα από πλειάδες χρησιμοποιώντας το having. Η συνθήκη του having εφαρμόζεται αφού σχηματιστούν οι ομάδες και υπολογιστούν οι συναθροιστικές συναρτήσεις

Μπορούμε να εφαρμόσουμε τις συναρτήσεις όχι μόνο σε ένα σύνολο από πλειάδες, αλλά σε ομάδες από σύνολα πλειάδων. Οι ομάδες προσδιορίζονται χρησιμοποιώντας το group by

Page 93: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 93

Συζεύξεις Συνόλων

Συζεύξεις Συνόλων Η SQL--92 υποστηρίζει διάφορους τύπους συζεύξεων που συνήθως χρησιμοποιούνται στο for, αλλά μπορούν να χρησιμοποιηθούν οπουδήποτε μπορεί να χρησιμοποιηθεί μια σχέση.

Γενική σύνταξη:

<όνομα-σχέσης1> <τύπος-συνένωσης> <όνομα-σχέσης2> <συνθήκη-συνένωσης>

ή

<όνομα-σχέσης1> natural <τύπος-συνένωσης> <όνομα-σχέσης2>

Page 94: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 94

Συνενώσεις Συνόλων

Τύποι Συνένωσης:

inner join: εσωτερική (θήτα) συνένωσηleft outer join: αριστερή εξωτερική συνένωσηright outer joinfull outer join

Page 95: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 95

Παραγόμενες Σχέσεις

Παραγόμενες Σχέσεις

• Η SQL-92 δίνει τη δυνατότητα μια υποερώτηση να χρησιμοποιηθεί στο from

• Τότε πρέπει να τις δοθεί ένα όνομα και τα γνωρίσματα της να μετανομαστούν

• Αυτό γίνεται χρησιμοποιώντας το as

Page 96: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 96

Παραγόμενες Σχέσεις

Η SQL-92 δίνει τη δυνατότητα χρησιμοποιώντας το as να δοθεί ένα προσωρινό όνομα σε μία προσωρινή σχέση που προκύπτει από μια υποερώτηση.

Παράδειγμα: Το μέσο υπόλοιπο για όλα τα υποκαταστήματα για τα οποία το μέσο ποσό είναι μεγαλύτερο των $1200

select Όνομα-Υποκαταστήματος, Μέσο-υπόλοιποfrom (select Όνομα-Υποκαταστήματος, avg(Ποσό) from Καταθέτης group by Όνομα-Υποκαταστήματος as Αποτέλεσμα(Όνομα-Υποκαταστήματος, Μέσο-υπόλοιπο) where Μέσο-Yπόλοιπο > 1200

Page 97: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 97

Ορισμός Όψεων

Ορισμός Όψεων

Μπορούμε να ορίσουμε μια όψη χρησιμοποιώντας την εντολή:

Επίσης, μπορούν να προσδιοριστούν τα ονόματα των γνωρισμάτων άμεσα

create view <όνομα--όψης> as <select-from-where ερώτηση>

create view <όνομα--όψης> (<λίστα ονομάτων-γνωρισμάτων>) as <select-from-where ερώτηση>

view definition

Χρήση:• πίνακες που χρησιμοποιούνται συχνά και• ενδιάμεσα αποτελέσματα

Page 98: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 98

Ορισμός Όψεων

Παράδειγμα: Μια όψη που περιλαμβάνει τα ονόματα όλων των υποκαταστημάτων και το άθροισμα του ποσού των δανείων που έχουν γίνει από αυτά

create view Υποκατάστημα-Σύνολο-Δανείων (Σύνολο-Δανείων, Όνομα- Υποκαταστήματος) asselect Όνομα-Υποκαταστήματος, sum(Ποσό)from Δάνειο group by Όνομα-Υποκαταστήματος

Page 99: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 99

Ορισμός Όψεων

Παράδειγμα: Μια όψη που περιλαμβάνει πληροφορίες για τους υπαλλήλους και τα τμήματα τους.

create view EmployeeDept (SSN,Name,Salary,Sex,DeptName,MgrSSN) asselect SSN, Employee.Name, Salary,Sex, Dept.Name, MgrSSN)from Employee, Deptwhere DeptCode = Code

Page 100: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 100

Ορισμός Όψεων

• Τα ονόματα όψεων μπορεί να χρησιμοποιηθούν οπουδήποτε μπορεί να χρησιμοποιηθεί το όνομα μιας σχέσης.•Εν γένει οι όψεις δεν υλοποιούνται (materialized views) – στην ORACLE μπορεί κάποιος να ορίσει να υλοποιούνται.• Ο ορισμός της όψης παραμένει στην βάση δεδομένων, εκτός αν σβηστεί:

drop view <όνομα-όψης>

• Ενημέρωση (updating) όψεων?•στις απλές περιπτώσεις (χωρίς καρτεσιανό γινόμενο ή συναθροίσεις) μπορεί να υπάρξει ενημέρωση•joins ? Γιατί όχι ?•συνάθροιση ? Γιατί όχι ?

Page 101: Η Γλώσσα  SQL

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

Page 102: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 102

Η γλώσσα SQL

• Γλώσσα Ορισμού Δεδομένων (ΓΟΔ) – Data Definition Langauge (DDL)

Page 103: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 103

Γλώσσα Ορισμού Δεδομένων

Γλώσσα Ορισμού Δεδομένων (ΓΟΔ)

Σχετικά με το λογικό σχήμα, η ΓΟΔ SQL υποστηρίζει τους ορισμούς:

• του σχήματος κάθε σχέσης• του πεδίου τιμών κάθε γνωρίσματος• των περιορισμών ακεραιότητας

Page 104: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 104

Γλώσσα Ορισμού Δεδομένων

create table R(A1 D1, A2 D2, ..., An Dn), <περιορισμός-ακεραιότητας1>, …, <περιορισμός-ακεραιότηταςk>

όπου R είναι το όνομα της σχέσης, Ai τα ονόματα των γνωρισμάτων, και Di οι τύποι των αντίστοιχων πεδίων τιμών.

Page 105: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 105

Πεδία Τιμών

Τύποι Πεδίου ΟρισμούΓια τον ορισμό του πεδίου ορισμού, οι διαθέσιμοι built-in τύποι περιλαμβάνουν:

char(n) (σταθερού μήκους)varchar(n)intsmallintnumeric(p, d) (d από τα p ψηφία είναι στα δεξιά της υποδιαστολής)real, double precisionfloat(n)date (ημερομηνία) time (ώρα)

Page 106: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 106

Πεδία Τιμών

Ο ορισμός πεδίου μπορεί να περιέχει τον προσδιορισμό not null

Επίσης, επιτρέπεται δημιουργία πεδίου:

create domain Όνομα-Προσώπου char(20)

create domain <name> as <type-description>

Page 107: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 107

Ορισμός Σχήματος

Ορισμός Σχήματος

create table R(A1 D1, A2 D2, ..., An Dn), <περιορισμός-ακεραιότητας1>,

…, <περιορισμός-ακεραιότηταςk>

όπου R είναι το όνομα της σχέσης, Ai τα ονόματα των

γνωρισμάτων, και Di οι τύποι των αντίστοιχων πεδίων τιμών.

Page 108: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 108

Ορισμός Σχήματος

Επιτρεπτοί περιορισμοί ακεραιότητας είναι της μορφής:

• primary key Aj1, Aj2, ..., Ajn, (δεν επιτρέπονται

επαναλαμβανόμενες τιμές και NULL τιμές)

• unique Aj1, Aj2, ..., Ajn, (δεν επιτρέπονται

επαναλαμβανόμενες τιμέs; NULL τιμές επιτρέπονται)

• check P• •foreign key (Ai) references Aj

Page 109: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 109

Ορισμός Σχήματος

Παραδείγματα

(1) create table Πελάτης

(Όνομα-Πελάτη char(20) not null, Οδός char(30), Πόλη char(30), primary key (Όνομα-Πελάτη))

Page 110: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 110

Ορισμός Σχήματος

(2) create table Λογαριασμός

(Αριθμός-Λογαριασμού char(10) not null, Όνομα-Υποκαταστήματος char(15), Ποσό int,primary key (Αριθμός-Λογαριασμού) check (Ποσό >= 0)

Page 111: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 111

Ορισμός Σχήματος

Επίσης, πιο περίπλοκες συνθήκες, π.χ., για ξένα κλειδιά:

check (Όνομα-Υποκαταστήματος in select Όνομα-Υποκαταστήματος

from Υποκατάστημα)

Page 112: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 112

Περιορισμοί Ακεραιότητας

Περιορισμοί Αναφοράς

Σύνταξη:

foreign key (Ai) references Aj

Όταν μια πράξη (π.χ. insert) παραβιάζει έναν περιορισμό αναφοράς απορρίπτεται εκτός αν έχει οριστεί:

on delete cascadeon update cascade

Page 113: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 113

Περιορισμοί Ακεραιότητας

Παράδειγμα

create table..foreign key (Όνομα-Υποκαταστήματος) references Υποκατάστημαon delete cascadeon update cascade…

Page 114: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 114

Περιορισμοί Ακεραιότητας

Περιορισμοί Ακεραιότητας

Πεδίου ορισμού

Χρησιμοποιώντας την εντολή check:

Παραδείγματα

(1) Ελάχιστος ωρομίσθιο

create domain Ωρομίσθιο numeric(5, 2) constraint Έλεγχος-Ωρομισθίου check(Ποσό >= 4.00)

Page 115: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 115

Περιορισμοί Ακεραιότητας

(2) Να μην περιέχει την τιμή null

create domain Πεδίο-Αριθμός-Λογαριασμού char(10) constraint Έλεγχος-Αριθμός-Λογαριασμού check(value not null)

(3) Να παίρνει συγκεκριμένες τιμές

create domain Τύπος-Λογαριασμού char(10) constraint Έλεγχος-Τύπος-Λογαριασμού check value in (‘ Όψεως”, ‘Ταμιευτηρίου”)

Page 116: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 116

Διαγραφή Σχήματος

Διαγραφή Σχήματος

Μια καινούργια σχέση είναι αρχικά άδεια.

Για να σβηστεί ένα σχήμα:

drop table R

Διαφορετικό από το:

delete from R

Page 117: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 117

Τροποποίηση Σχήματος

Τροποποίηση Σχήματος

ALTER TABLE όνομα πίνακα ADD - προσθέτει καινούργια στήλη DROP - διαγράφει μια στήλη MODIFY - τροποποιεί μια στήλη

Page 118: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 118

Τροποποίηση Σχήματος

Προσθήκη νέου γνωρίσματος:

alter table R add A D

προσθήκη σε μια σχέση R που ήδη υπάρχει του γνωρίσματος A με πεδίο τιμών D, η τιμή των πλειάδων της R στο καινούργιο γνώρισμα είναι null.

Διαγραφή γνωρίσματος:

alter table R drop A

Page 119: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 119

Τροποποίηση Σχήματος

alter table R modify (όνομα_στήλης new_datatype)

modify μπορεί να τροποποιήσει μόνο τον τύπο δεδομένων, όχι το όνομα της στήλης

Page 120: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 120

Η γλώσσα SQL

• Τροποποίηση Βάσης Δεδομένων Γλώσσα Χειρισμού Δεδομένων (ΓXΔ)

Page 121: Η Γλώσσα  SQL

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

Τροποποιήσεις

Τροποποιήσεις

1. Διαγραφή

2. Εισαγωγή

3. Ενημέρωση

Page 122: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 122

Εισαγωγή

Εισαγωγή

Για να εισάγουμε δεδομένα σε μια σχέση είτε

(α) προσδιορίζουμε την πλειάδα, είτε

(β) γράφουμε μια ερώτηση που το αποτέλεσμα της εισάγεται στη σχέση.

insert into R(A1, …, An) values (v1, …, vn)

insert into R(A1, …, An) select-from-where

Page 123: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 123

Εισαγωγή

Παράδειγμα για το (α)

insert into Λογαριασμός values (“Ψηλά-Αλώνια”, “A--9732’’, 1200)

Όταν με οποιαδήποτε σειρά, π.χ.,:

insert into Λογαριασμός (Αριθμός-Λογαριασμού, Όνομα-Υποκαταστήματος, Ποσό)values (“A--9732’’, “Ψηλά-Αλώνια”, 1200)

Page 124: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 124

Εισαγωγή

Παράδειγμα για το (β):

Για κάθε πελάτη που έχει πάρει δάνειο από το υποκατάστημα Ψηλά Αλώνια προστίθεται ως δώρο ένας λογαριασμός των $200

insert into Λογαρισμός select Όνομα-Υποκαταστήματος, Αριθμός-Δανείου, 200 from Δάνειο where Όνομα-Υποκαταστήματος = “Ψηλά Αλώνια”

Page 125: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 125

Εισαγωγή

Πρέπει πρώτα να υπολογιστεί το select πλήρως και μετά να γίνει η εισαγωγή.Τι αποτέλεσμα έχει η παρακάτω εντολή αν αυτό δε συμβαίνει;

insert into Λογαριασμός select * from Λογαριασμός

Page 126: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 126

Εισαγωγή

Επίσης, εισαγωγή null τιμών:

insert into Λογαριασμός values (null, “A--9732’’, 1200)

Page 127: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 127

Διαγραφή

Διαγραφή

Μπορούμε να σβήσουμε μόνο ολόκληρες πλειάδες και όχι συγκεκριμένα γνωρίσματα.

Σβήνει όλες τις πλειάδες της R για τις οποίες ισχύει το P.

Όταν λείπει το where σβήνονται όλες οι πλειάδες μιας σχέσης.

delete from R where P

Page 128: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 128

Διαγραφή

Παραδείγματα

(1) Όλους τους λογαριασμούς του Παπαδόπουλου

delete from Καταθέτηςwhere Όνομα-Πελάτη = “Παπαδόπουλος”

Page 129: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 129

Διαγραφή

(2) Όλους τους λογαριασμούς στα υποκαταστήματα της Πάτραςdelete from Λογαριασμόςwhere Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα

where Πόλη = “Πάτρα’’)

Παρατήρηση: δεν υπάρχει τρόπος να διαγράψουμε τη μία από δυο ίδιες πλειάδες

Page 130: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 130

Διαγραφή

Αν και μπορούμε να σβήσουμε πλειάδες μόνο από μία σχέση τη φορά μπορούμε να αναφερθούμε σε περισσότερες από μια σχέσεις στην υποερώτηση του where

(3) Όλους τους λογαριασμούς μιας τράπεζας με ποσό μικρότερο από το μέσο ποσό στην τράπεζα.

delete from Λογαριασμόςwhere Ποσό > (select avg(Ποσό) from Λογαριασμός)

Πρώτα γίνεται ο έλεγχος σε όλες τις πλειάδες και μετά αυτές που ικανοποιούν τη συνθήκη διαγράφονται.

Page 131: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 131

Διαγραφή

Παράδειγμα: μια τράπεζα θέλει να κλείσει όλα τα υποκαταστήματά της που βρίσκονται στην Καστοριά

delete from Υποκατάστημα

where Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα

where Πόλη = “Kαστοριά’)

Page 132: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 132

Διαγραφή

Πρέπει να διαγράψουμε και όλους τους λογαριασμούς: delete from Λογαριασμόςwhere Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα

where Πόλη = “Kαστοριά’)

ΠΡΟΣΟΧΗ: όταν θέλουμε να διαγράψουμε κάποια δεδομένα, πρέπει να διαγράψουμε όλα τα δεδομένα που συσχετίζονται μ’ αυτά. Επίσης πρέπει να προσέξουμε την σειρά με την οποία θα γίνουν οι διαγραφές.

Page 133: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 133

Διαγραφή

υποκατάστημα λογαριασμός

Πόλη Όνομα_Υποκ. Όνομα_Υποκ. Όνομα-ΠελάτηΥπόλοιπο

Καστοριά K1 K1 ΚΩΤΣΗΣ 350.000

Καστοριά K3 K2 ΑΠΟΣΤΟΛΙΔΗΣ 230.000

Θεσσαλονίκη Θ1 Θ1 ΣΤΕΦΑΝΟΥ 670.000

Θεσσαλονίκη Θ2 Θ2 ΠΑΠΑΝΙΚΟΛΑΟΥ 256.000

Αθήνα A1 K3 ΧΑΤΖΟΠΟΥΛΟΣ 410.000

• αν διαγράψουμε από τον πίνακα υποκατάστημα όλα τα υποκαταστήματα της Καστοριάς, θα έχουμε πρόβλημα ορθότητας στον πίνακα account.

• πρώτα πρέπει να διαγράψουμε τους λογαριασμούς και μετά τα υποκαταστήματα.

Page 134: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 134

Ενημερώσεις

Ενημερώσεις

Παράδειγμα: Αύξηση όλων των καταθέσεων που είναι μεγαλύτερες των $100 κατά 5% λόγω τοκισμού

update Λογαριασμόςset Ποσό = Ποσό * 1.05 where Ποσό > 100

Page 135: Η Γλώσσα  SQL

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

Page 136: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 136

Ενημερώσεις

Παράδειγμα: Αύξηση όλων των υπολοίπων που είναι μεγαλύτερα από τον μέσο όρο κατά 5%

update Λογαριασμόςset Υπόλοιπο = Υπόλοιπο * 1.05 where Υπόλοιπο > select avg(Υπόλοιπο) from Λογαριασμός

Page 137: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 137

• Διαδικαστική (procedural) SQL (Transact-SQL, PL/SQL)

• Ενσωματωμένη (embedded) SQL

• ODBC / JDBC Interface

Page 138: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 138

SQL και προγράμματα

Πολλές φορές η SQL δεν είναι ικανή να εκφράσει τα ερωτήματα που θέλουμε, για λόγους:

Σε αυτές τις περιπτώσεις πρέπει να παντρέψουμε τη SQL με δομές κλασσικού προγραμματισμού. Υπάρχουν 3 τρόποι για αυτό:

1. Επεκτείνουμε τη SQL με τέτοιες δομές2. Εμφωλιάζουμε SQL εντολές μέσα σε μια γλώσσα

προγραμματισμού3. Δημιουργούμε μία «γέφυρα» (interface) μεταξύ της SQL και

της γλώσσας προγραμματισμού (API)

• ειδικού χειρισμού ερωτημάτων.• αποδοτικότητας συστήματος (optimization).• ανάγκες για μία Turing-complete γλώσσα (σαν τη Java / C).

Page 139: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 139

Procedural (Διαδικαστική) SQL

H SQL επεκτείνεται με δομές (μεταβλητές, βρόγχοι, blocks κ.λ.π.) ώστε να «θυμίζει» μία γλώσσα προγραμματισμού, με τις ανάλογες δυνατότητες.

• Μιcrosoft SQL Server: Transact-SQL• Oracle: PL/SQL

Page 140: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 140

Case Study: Oracle’s PL/SQL

Στην PL/SQL μπορούμε να ορίσουμε:

•Blocks εντολών•Μεταβλητές και τύπους (built-in και user-defined)•Εντολές ελέγχου ροής, όπως if-then-else και loops•Procedures και functions•Αντικείμενα και μεθόδους

Μέσα σε ένα πρόγραμμα PL/SQL συνήθως έχουμε κλασσικά ερωτήματα SQL.

Page 141: Η Γλώσσα  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;

Page 142: Η Γλώσσα  SQL

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

Page 143: Η Γλώσσα  SQL

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

Page 144: Η Γλώσσα  SQL

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

Page 145: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 145

Case Study: Oracle’s PL/SQL, Λογικοί Δρομείς

Ένας λογικός δρομέας (ή κέρσορας ) (cursor) χρησιμοποιείται για το χειρισμό των γραμμών που έχουν «τραβηχτεί» από τη ΒΔ με κάποιο select…from...where. Στην ουσία δημιουργείται ένας λογικός πίνακας των αποτελεσμάτων στον οποίο μπορούμε να προχωρήσουμε γραμμή-γραμμή. Η ιδέα των cursors υπάρχει σε όλες τις γλώσσες.

Νίκος Παπαδοπουλος 35 Δημητρας 25

Μαρία Τσίαπα 28 Παπαδημητρίου 31

Γιώργος Λακιός 38 Χαλανδρίου 78

ΕΟF

κέρσορας

Page 146: Η Γλώσσα  SQL

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

Page 147: Η Γλώσσα  SQL

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

Page 148: Η Γλώσσα  SQL

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

Page 149: Η Γλώσσα  SQL

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

Page 150: Η Γλώσσα  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;

Page 151: Η Γλώσσα  SQL

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

Page 152: Η Γλώσσα  SQL

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

Page 153: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 153

Case Study: Transact SQL, Μεταβλητές και τύποι

Mία μεταβλητή του χρήστη έχει πάντα την εξής μορφή:

@<όνομα μεταβλητής> π.χ. @student_name

και δηλώνεται ως:

Declare <variable_name> data type

όπου data type μπορεί να είναι predefined / user-defined τύπος

Page 154: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 154

Case Study: Transact SQL, Έλεγχος Ροής

Υπάρχουν οι εξής δομές:

• begin ... end• if ... else• while, break, continue• /* ... */ comments• Goto <label>

Page 155: Η Γλώσσα  SQL

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

Page 156: Η Γλώσσα  SQL

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

Page 157: Η Γλώσσα  SQL

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

Page 158: Η Γλώσσα  SQL

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

Page 159: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 159

Case Study: Transact SQL, Εναύσματα (triggers)

Μια διαδικασία η οποία ενεργοποιείται αυτόματα από το ΣΔΒΔ κάθε φορά που συμβαίνουν μεταβολές ορισμένου τύπου στα δεδομένα λέγεται trigger (έναυσμα). Μία ΒΔ με δηλωμένα triggers ονομάζεται active database (ενεργή ΒΔ).

Παράδειγμα: Ένας πελάτης θέλει να κάνει χρέωση στην πιστωτική του κάρτα και με αυτή την συναλλαγή θα ξεπεράσει το πιστωτικό του όριο. Το ΣΔΒΔ θα πρέπει να ελέγχει σε κάθε συναλλαγή αν ο κανόνας του πιστωτικού ορίου τηρείται.Χαρακτηριστικά ενός trigger:

• γεγονός (π.χ. [before | after] insert/delete/update <πίνακα>)• συνθήκη (π.χ. Salary > 10000, Area = “Μαρούσι”)• ενέργεια (κώδικας SQL – π.χ. PL/SQL πρόγραμμα)

Page 160: Η Γλώσσα  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>

Page 161: Η Γλώσσα  SQL

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

Page 162: Η Γλώσσα  SQL

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

Παράδειγμα: Ένας πελάτης θέλει να κάνει χρέωση στην πιστωτική του κάρτα και με αυτή την συναλλαγή θα ξεπεράσει το πιστωτικό του όριο.

Page 163: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 163

Ενσωματωμένη SQL

Ενσωματωμένη SQLΠροσπέλαση μιας ΒΔ μέσω μια γλώσσας προγραμματισμού (π.χ. C, Java) γενικού σκοπού απαιτείται τουλάχιστον γιατί:

• υπάρχουν ερωτήσεις που δε μπορούν να διατυπωθούν σε SQL,γιατί η SQL δεν έχει όλες τις δυνατότητες μιας γλώσσας προγραμματισμού γενικού σκοπού• μη-δηλωτικές εντολές (π.χ., εκτύπωση, επικοινωνία με το χρήστη) δε μπορούν να γίνουν μέσω της SQL

Ενσωμάτωση της SQL σε μια γλώσσα που καλείται φιλόξενη (host)

Page 164: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 164

Ενσωματωμένη SQL

Σε αυτήν την περίπτωση, η επεξεργασία των ερωτήσεων γίνεται από τη ΒΔ, και το αποτέλεσμα γίνεται διαθέσιμο στο πρόγραμμα μια γραμμή τη φορά

Ένας ειδικός προ-επεξεργαστής (preprocessor) αντικαθιστά τον ενσωματωμένο κώδικα της SQL με δηλώσεις και κλήσεις συναρτήσεων στη host γλώσσα (δηλαδή π.χ. C) και μεταφράζεται το πρόγραμμα

Τα ερωτήματα SQL «ενσωματώνονται» με την εξής σύνταξη:EXEC SQL < embedded SQL statement > END-EXEC

Η ακριβής σύνταξη εξαρτάται από τη host γλώσσα

Page 165: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 165

Ενσωματωμένη SQL

Χρησιμοποιούμε την εντολή: SQL INCLUDE, για να δηλώσουμε στον προ-επεξεργαστή που πρέπει να εισάγει τις δηλώσεις των μεταβλητών της SQL

Μεταβλητές της γλώσσας μπορεί να χρησιμοποιηθούν στην εντολή της SQL αν το σύμβολο ‘:’ προηγείται του ονόματός τους

Για να γράψουμε μια ερώτηση σε SQL:

EXEC SQL declare c cursor for select Όνομα-Πελάτη, Πόλη from Κατάθεση, Πελάτης where Κατάθεση.Όνομα-Πελάτη = Πελάτης.Όνομα-Πελάτη and Κατάθεση.Ποσό > :amount

END-EXEC

Page 166: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 166

Ενσωματωμένη SQL

Η παραπάνω εντολή δεν προκαλεί την εκτέλεση της ερώτησης. Για να εκτελεστεί πρέπει να ανοίξουμε τον cursor:

EXEC SQL open c END-EXEC

Το αποτέλεσμα σώζεται σε μια προσωρινή σχέση, αν υπάρχει λάθος το διαγνωστικό μήνυμα σώζεται σε μια ειδική μεταβλητή (SQLCA)

Οι γραμμές του αποτελέσματος γίνονται διαθέσιμες στο πρόγραμμα μέσω μιας σειράς από fetch εντολές. To αποτέλεσμα του fetch αποθηκεύεται σε μεταβλητή/ες της host γλώσσας για κάθε γνώρισμα

EXEQ SQL fetch c into :cn$, :cc END-EXEC

Page 167: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 167

Ενσωματωμένη SQL

Για να κλείσουμε τον cursor:

EXEC SQL close c END-EXEC

Επίσης:

EXEC SQL < update, insert ή delete έκφραση> END-EXEC

Page 168: Η Γλώσσα  SQL

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

Page 169: Η Γλώσσα  SQL

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

Page 170: Η Γλώσσα  SQL

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

Page 171: Η Γλώσσα  SQL

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

Page 172: Η Γλώσσα  SQL

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

Page 173: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 173

Eπικοινωνία με διεπαφή JDBC/ODBC - Γενικά

• Σε αυτή την περίπτωση εισάγουμε ένα επίπεδο μεταξύ γλώσσας προγραμματισμού και Β.Δ., μέσω του οποίου γίνεται η επικοινωνία τους. Υπάρχει το ODBC (γενικής εφαρμογής) και το JDBC (για γλώσσα Java).• Ποια είναι η διαφορά με την ενσωματωμένη SQL ???

• Η επικοινωνία με τη ΒΔ γίνεται με system calls της host γλώσσας προγραμματισμού. Συνεπώς, για κάθε διαφορετικό ΣΔΒΔ πρέπει να δημιουργείται και διαφορετικό σύνολο system calls. Αυτό συνεπάγεται ότι για ν ΣΔΒΔ θα υπάρχουν ν implementations. Αντίθετα, με ένα ενδιάμεσο επίπεδο, αρκεί η γλώσσα να «μιλάει» με αυτό (DB-independent.)• Νο free lunch: κόστος -> αποδοτικότητα

Page 174: Η Γλώσσα  SQL

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

Page 175: Η Γλώσσα  SQL

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

Page 176: Η Γλώσσα  SQL

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

Page 177: Η Γλώσσα  SQL

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

Page 178: Η Γλώσσα  SQL

Πληροφοριακά Συστήματα & Βάσεις Δεδομένων - ΔΕΤ 178

Eπικοινωνία με διεπαφή JDBC/ODBC – Java

• Σύνδεση με τη ΒΔ• Εκτέλεση ενός SQL αιτήματος. Μπορεί να είναι δύο ειδών:

• select...from...where• insert/update/delete

•Αποσύνδεση με τη ΒΔ

Page 179: Η Γλώσσα  SQL

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

Page 180: Η Γλώσσα  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();

όνομα γνωρίσματος

λογικός δρομέας

Page 181: Η Γλώσσα  SQL

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

Page 182: Η Γλώσσα  SQL

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

Page 183: Η Γλώσσα  SQL

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