3. SQL. 3. Structured Query Language (SQL) 1

Σχετικά έγγραφα
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

Η SQL αποτελείται από δύο υποσύνολα, τη DDL και τη DML.

Ορισµοί Σχεσιακού Μοντέλου και Τροποποιήσεις Σχέσεων σε SQL

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

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

Ορισμοί Σχεσιακού Μοντέλου και Τροποποιήσεις Σχέσεων σε SQL

Τμήμα Διοίκησης Επιχειρήσεων

Βάσεις Δεδομένων και Ευφυή Πληροφοριακά Συστήματα Επιχειρηματικότητας. 3ο Μάθημα: Εισαγωγή στην SQL. Δρ. Κωνσταντίνος Χ.

Ορισμοί Σχεσιακού Μοντέλου και Τροποποιήσεις Σχέσεων σε SQL

Ορισμοί Σχεσιακού Μοντέλου και (απλές)τροποποιήσεις Σχέσεων στην SQL. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

(Μέρος 3:Γλώσσα Ορισµού, Γλώσσα Τροποποίησης, Ενσωµατωµένη SQL) Βάσεις εδοµένων Ευαγγελία Πιτουρά 2

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΤΜΗΜΑ ΠΟΛΙΤΙΣΜΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΣ. Επιλέγει όλες τις πλειάδες, από μια σχέση R, που ικανοποιούν τη συνθήκη επιλογής.

ΣΧΕΣΙΑΚΟ ΜΟΝΤΕΛΟ Relational Model. SQL Μαθ. #11

Σχεδίαση Βάσεων Δεδομένων

SQL Data Manipulation Language

ΤΑΞΙΝΟΜΗΣΗ ΑΠΟΤΕΛΕΣΜΑΤΩΝ ΕΡΩΤΗΜΑΤΟΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ


Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ.Ε.

Τμήμα Πληροφορικής ΑΠΘ

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ - SQL

Σχεδιασμός Βάσεων Δεδομένων

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ. Ε. Χρήσιμοι Σύνδεσμοι

Βάσεις Δεδομένων. Βασίλειος Βεσκούκης Εισαγωγή στη γλώσσα SQL (Structured Query Language) Η γλώσσα SQL

ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ

Σχεδίαση και λειτουργία βάσης δεδομένων Το παράδειγμα της μαιευτικής κλινικής Ευάγγελος Καρβούνης

2 ο Σύνολο Ασκήσεων. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Εισαγωγή στην πληροφορική

Διαχείριση Πολιτισμικών Δεδομένων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

Τμήμα Πληροφορικής ΑΠΘ

Βάσεις εδοµένων Ευαγγελία Πιτουρά 2

Βάσεις Δεδομένων (Ε) Εισαγωγή στην υλοποίηση σχεσιακών βάσεων δεδομένων

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι Ενότητα 3:

Βάσεις Δεδομένων. Ενότητα 6: Γλώσσα Structured Query Language -SQL. Πασχαλίδης Δημοσθένης Τμήμα Ιερατικών σπουδών

Βάσεις δεδομένων. (7 ο μάθημα) Ηρακλής Βαρλάμης

ΗΓλώσσαSQL. Εισαγωγή Βασικές Έννοιες Τύποι Δεδομένων Ορισμός Δεδομένων Χειρισμός Δεδομένων

Βάσεις Δεδομένων Ι [Σημειώσεις Εργαστηρίου]

Αρχεία και Βάσεις Δεδομένων

ΣΧΕΔΙΑΣΜΟΣ ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ ΕΡΓΑΣΤΗΡΙΟ 3

Βάσεις Δεδομένων Ι [Σημειώσεις Εργαστηρίου]

Certified Data Base Designer (CDBD)

Postgress ΣΤΟΧΟΣ ΣΧΕΤΙΚΟ ΕΚΠΑΙ ΕΥΤΙΚΟ ΥΛΙΚΟ. ΠΕΡΙΒΑΛΛΟΝ ΓΙΑ ΕΞΑΣΚΗΣΗ pgadmin ΥΠΟΒΑΘΡΟ. Συναρτήσεις στην PostgreSQL. 1. Γενικά

Βάσεις Δεδομένων (Databases)

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

Εισαγωγή Mια από τις βασικές λειτουργίες ενός σχεσιακού συστήµατος διαχείρισης βάσεων δεδοµένων είναι η διαχείριση του πληροφοριακού περιεχοµένου που

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

ΚΕΦΑΛΑΙΟ ΤΡΙΤΟ ΕΝΤΟΛΕΣ SQL

Πανεπιστήµιο Ιωαννίνων Τµήµα Μαθηµατικών Μάθηµα: Βάσεις εδοµένων (741) Εργαστηριακό Τεστ Οµάδα: Α 18/11/2004

Η αναλυτική περιγραφή της γλώσσας SQL αποτελεί αντικείµενο των σελίδων που ακολουθούν. Η ΓΛΩΣΣΑ ΟΡΙΣΜΟΥ Ε ΟΜΕΝΩΝ

επιµέλεια Θοδωρής Πιερράτος

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι. Ενότητα 6: SQL (Συζεύξεις, Εμφώλευση, Ομαδοποίηση) Ευαγγελίδης Γεώργιος. Τμήμα Εφαρμοσμένης Πληροφορικής ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι

Εργαστήριο βάσεων δεδομένων. Εισαγωγή στη MySQL (2)

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

SQL Τύποι Δεδομένων Δημιουργία Πίνακα Παράδειγμα.. Εργαστήριο Βάσεων Δεδομένων. Εισαγωγή στη MySQL (1)

Βάσεις Δεδομένων. Σχεσιακό Μοντέλο Δεδομένων. Βασίλειος Βεσκούκης Ορισμός Βάσης Δεδομένων Δομή Περιορισμοί

Οι εντολές CREATE TABLE, ALTER TABLE, CREATE KEY, ALTER KEY.


Τεχνολογία Πολιτισμικού Λογισμικού

Ορισµοί Σχεσιακού Μοντέλου και Τροποποιήσεις Σχέσεων σε SQL

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. 1 ο ΣΧΟΛΕΙΟ ΚΩΔΙΚΑ «Βασικά Θέματα Προγραμματισμού στην Ανάπτυξη Δυναμικών Διαδικτυακών Εφαρμογών» (Part 3) Ουρανία Σμυρνάκη

Εργαστήριο βάσεων δεδομένων. Εισαγωγή στη MySQL (2)

ΗΥ-360 Αρχεία και Βάσεις Δεδομένων Διδάσκων: Δ. Πλεξουσάκης. Φροντιστήριο SQL Examples Ξένου Ρουμπίνη

Βάσεις Δεδομένων Ι SQL Μέρος 3 ο. (Constraints & Joins) Φώτης Κόκκορας (MSc/PhD) Τμήμα Μηχανικών Πληροφορικής ΤΕ

Βάσεις Δεδομένων ΗγλώσσαSQL (Structured Query Language)


ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ.

1 / 97

Βάσεις Δεδομένων Η γλώσσα SQL (Structured Query Language) Εισαγωγή στην SQL (2) Ιστορικά Στοιχεία. SQL - Structured Query Language (1)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ - ΤΜΗΥΠ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι

ΗΥ-360 Αρχεία και Βάσεις Δεδομένων Διδάσκων: Δ. Πλεξουσάκης. Φροντιστήριο SQL Examples ΙΙ Ξένου Ρουμπίνη

Οι εντολές CREATE TABLE, ALTER TABLE, CREATE KEY, ALTER KEY.

1 / 87

Βάσεις Δεδομένων Σύνθετα SQL queries

Βάσεις Δεδομένων. Ενότητα 7.2: Structured Query Language - 2 ο Μέρος. Αθανάσιος Σπυριδάκος Τμήμα Διοίκησης Επιχειρήσεων

2.1. Εντολές Σχόλια Τύποι Δεδομένων

GROUP BY, HAVING, COUNT, MIN, MAX, SUM, AVG, ROLLUP.

char name[5]; /* define a string of characters */

Βασικά στοιχεία της Java

Βάσεις Δεδομένων Σύνθετα SQL queries. Ψευδώνυμα (Aliases) (2) Ψευδώνυμα (Aliases) (1) Ασάφεια και Πλήρη Ονόματα. Ερώτημα χωρίς τον όρο WHERE (1)

Κεφάλαιο 9 Συσχετίσεις

3. Σηµειώσεις Access. # Εισαγωγή ψηφίου ή κενού διαστήµατος. Επιτρέπονται τα ση-

ΕΣΔ 232: ΟΡΓΑΝΩΣΗ ΔΕΔΟΜΕΝΩΝ ΣΤΗ ΚΟΙΝΩΝΙΑ ΤΗΣ ΠΛΗΡΟΦΟΡΙΑΣ. Ακαδημαϊκό Έτος , Εαρινό Εξάμηνο. Εργαστηριακή Άσκηση 4 7/02/2012

Σχήµα 3.1: Εισαγωγή shift register σε βρόγχο for-loop.

Ηλεκτρονικοί Υπολογιστές II

Ηλεκτρονικοί Υπολογιστές II

Βάσεις Δεδομένων. Ενότητα 7.1: Structured Query Language - 1 ο Μέρος. Αθανάσιος Σπυριδάκος Τμήμα Διοίκησης Επιχειρήσεων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ - ΤΜΗΥΠ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι

Εισαγωγή. Γενική Εικόνα του Μαθήµατος. Το εσωτερικό ενός Σ Β. Εισαγωγή. Εισαγωγή Σ Β Σ Β. Αρχεία ευρετηρίου Κατάλογος συστήµατος Αρχεία δεδοµένων

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

ΦΡΟΝΤΙΣΤΗΡΙΟ ΣΤΗ ΓΛΩΣΣΑ SQL

Κεφάλαιο 5ο: Εντολές Επανάληψης

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ.Ε.

Εργαστήριο Βάσεων Δεδομένων. Εισαγωγή στη MySQL (1)

Το Μοντέλο των Οντοτήτων Συσχετίσεων Entity Relationship Model. Νικόλαος Ζ. Ζάχαρης

Transcript:

3. Structured Query Language (SQL 1 3. SQL Η SQL (Structured Query Language είναι µία από τις γλώσσες διαχείρισης σχεσιακών βάσεων δεδοµένων. Ανήκει στην κατηγορία των µη διαδικαστικών γλωσσών τέταρτης γενιάς. Στις µη διαδικαστικές γλώσσες ο χρήστης δε χρειάζεται να ορίσει τη διαδικασία πρόσβασης στη βάση δεδοµένων και τον τρόπο ανάκτησης των δεδοµένων. ιατυπώνει απλώς τις απαιτήσεις του και ο ίδιος ο µηχανισµός υλοποίησης της γλώσσας αναλαµβάνει να επιλέξει το βέλτιστο τρόπο ικανοποίησης αυτών των απαιτήσεων. Οι απαιτήσεις του χρήστη εκφράζονται υπό τύπο πράξεων µεταξύ των πινάκων της βάσης δεδοµένων. Το Σ Β µεταφράζει τις απαιτήσεις του χρήστη και χρησιµοποιώντας πληροφορίες σχετικά µε το περιεχόµενο της βάσης δεδοµένων και το λεξικό δεδοµένων προσπαθεί να προσδιορίσει τη βέλτιστη διαδικασία ανάκτησης των δεδοµένων που ζητούνται. Η SQL έχει ένα µικρό, σχετικά, σύνολο εντολών και ορισµάτων, πράγµα που την κάνει εύκολη στη χρήση και την εκµάθηση της, χωρίς όµως να περιορίζει τις δυνατότητες και την ευελιξία της. Η ανάπτυξη της έγινε από την IBM στη δεκαετία του '70 στα πλαίσια της ανάπτυξης του προτύπου σχεσιακού Σ Β R. Αποτελεί διεθνές πρότυπο, το ANSI/SQL, από το 1986 και σχεδόν όλα τα προϊόντα των Σχεσιακών Σ Β συνοδεύονται από µια διάλεκτο της SQL. Τελευταίο διεθνές πρότυπο της SQL είναι το SQL2 το οποίο δηµοσιεύθηκε το 1992. εν ακολουθείται πάντοτε πιστά το διεθνές πρότυπο από τους διάφορους κατασκευαστές. Σε άλλα σηµεία µπορεί να υπάρχουν περιορισµοί σχετικά µε το διεθνές πρότυπο και σε άλλα σηµεία επεκτάσεις, αλλά ο βασικός κορµός όλων των διαλέκτων της SQL παραµένει ίδιος. Η SQL επιτρέπει τη διατύπωση της ίδιας ερώτησης στη βάση δεδοµένων µε πολλούς διαφορετικούς τρόπους. Το αποτέλεσµα είναι πάντοτε το ίδιο. Η επιλογή της συγκεκριµένης διατύπωσης γίνεται ώστε να αναδειχθεί κάθε φορά αυτό που θέλουµε να παρουσιάσουµε. Θεωρητικά οι ερµηνευτές της SQL θα πρέπει να µεταφράζουν τις διαφορετικές διατυπώσεις µε τον ίδιο τρόπο και να τις εκτελούν µε την ίδια ταχύτητα, πράγµα που δεν συµβαίνει στην πράξη. Στο κεφάλαιο αυτό και στο επόµενο, θα ασχοληθούµε µε τη σύνταξη και τον τρόπο χρησιµοποίησης της SQL. Θα ακολουθήσουµε το διεθνές πρότυπο µε παράλληλες αναφορές στην υλοποίηση της SQL από τα συστήµατα ORACLE και INGRES στα σηµεία όπου υπάρχουν σηµαντικές διαφοροποιήσεις. Για τις εντολές της SQL που συναντούµε µόνο στο ORACLE ή το INGRES θα αναφερθούµε στα αντίστοιχα κεφάλαια. Η παρουσίαση µας αναφέρεται τη διαλογική (interactive χρήση της SQL, πράγµα που συµβαδίζει µε το γενικότερο προσανατολισµό του βιβλίου. Να σηµειώσουµε ότι η SQL µπορεί να χρησιµοποιηθεί και ενσωµατωµένη (embedded SQL σε κάποια γλώσσα προγραµµατισµού τρίτης γενιάς, όπως η Visual Basic, η C++, ή η Java. Η ενσωµατωµένη SQL παρουσιάζει κάποιες διαφοροποιήσεις από τη διαλογική SQL, αλλά δεν θα µας απασχολήσει περισσότερο, αφού το βιβλίο είναι προσανατολισµένο προς τη διαλογική SQL η οποία χρησιµοποιείται και στα περιβάλλοντα ανάπτυξης εφαρµογών. εν θα περιοριστούµε στην απλή παρουσίαση της σύνταξης της SQL, αλλά θα προχωρήσουµε και στην περιγραφή των πραγµατικών λειτουργιών διαχείρισης της βάσης δεδοµένων µέσω της SQL και του τρόπου επίλυσης των προβληµάτων που προκύπτουν. Η SQL υλοποιεί και αντανακλά όλες τις δυνατότητες του ΣΣ Β, απέχει, όµως, πολύ από το να υλοποιεί πλήρως το σχεσιακό Μ, όπως το ορίζει ο Codd και το παρουσιάσαµε στο πρώτο κεφάλαιο του βιβλίου. Η SQL µπορεί να χωριστεί σε δύο τµήµατα, όπως είδαµε για τις γλώσσες δεδοµένων στο πρώτο κεφάλαιο. Στο τµήµα που αντιστοιχεί στη γλώσσα ορισµού δεδοµένων (ΓΟ και στο τµήµα που αντιστοιχεί στη γλώσσα χειρισµού δεδοµένων (ΓΧ. Μπορούµε, επίσης, να διακρίνουµε και ένα τρίτο σύνολο εντολών της SQL, τις εντολές ελέγχου των δεδοµένων, στις οποίες και αναφερόµαστε στο επόµενο κεφάλαιο. Για τη κατανόηση του τρόπου σύνταξης και χρησιµοποίησης της SQL χρησιµοποιούµε διάφορα παραδείγµατα που προέρχονται κυρίως από τη βάση δεδοµένων διαχείρισης παραγγελιών που αναλύεται στο προηγούµενο κεφάλαιο του βιβλίου. Πιο κάτω φαίνονται οι πίνακες που αποτελούν τη βάση δεδοµένων µαζί µε το περιεχόµενο που χρησιµοποιείται στα παραδείγµατα.

3. Structured Query Language (SQL 2 customer custcode lname fname street city 1 ΑΘΑΝΑΣΙΟΥ ΕΛΕΥΘΕΡΙΟΣ ΠΑΛΑΙΟΛΟΓΟΥ 33 ΑΘΗΝΑ 2 ΠΑΠΑΕΜΑΝΟΥΗΛ ΚΩΣΤΑΣ Β.ΟΛΓΑΣ 55 ΘΕΣ/ΝΙΚΗ 3 ΚΟΥΚΑ ΠΗΝΕΛΟΠΗ ΟΜΑΛΟΥ 53 ΧΑΝΙΑ 4 ΟΡΑΤΙΟΥ ΘΕΑΝΩ ΣΑΜΑΡΙΑΣ 25 ΧΑΝΙΑ 5 ΤΕΛΑΚΟΥ ΕΛΕΝΗ ΑΓΙΟΥ ΠΑΥΛΟΥ 12 ΑΘΗΝΑ 6 ΣΤΑΘΟΥΛΗΣ ΝΙΚΟΛΑΟΣ ΑΡΙΣΤΟΤΕΛΟΥΣ 3 ΑΘΗΝΑ orders ordernum orderdate custcode 1 15/09/94 1 2 11/09/94 1 3 16/09/94 2 4 11/08/94 4 orderlines parts ordernum partcode qty partcode name price totalqty 1 1 4 1 ΚΑΛΤΣΕΣ Β123 780 278 1 3 1 2 ΚΑΛΤΣΕΣ Α123 1400 345 2 1 1 3 ΠΟΥΚΑΜΙΣΟ 7000 100 2 2 1 4 ΠΟΥΛΟΒΕΡ Α11 12000 56 2 3 2 5 ΠΟΥΛΟΒΕΡ Α22 12500 37 2 4 4 6 ΖΩΝΗ ΑΝ ΡΙΚΗ 2340 77 2 5 3 7 ΖΩΝΗ ΑΝ ΡΙΚΗ Α34 2000 45 3 1 4 3 2 8 3 3 4 3 4 5 3 5 7 4 4 4 4 5 7 Επίσης χρησιµοποιούνται και παραδείγµατα που αφορούν τον πίνακα stud ο οποίος έχει περιεχόµενο : studid lname fname sex birthdate 1 ΠΕΛΟΠΑ ΙΩΑΝΝΑ Θ 11/12/75 2 ΘΕΟ ΟΣΙΟΥ ΜΙΧΑΛΗΣ Α 10/01/74 3 ΠΑΝΑΡΑ ΕΛΕΝΗ Θ 15/06/74 4 ΙΩΑΝΝΟΥ ΣΤΕΛΙΟΣ Α 03/01/74 5 ΝΙΚΑΝ ΡΟΥ ΕΛΕΝΗ Θ 20/07/73

3. Structured Query Language (SQL 3 Τρόπος Παρουσίασης της SQL Στον τρόπο παρουσίασης της σύνταξης της SQL και των παραδειγµάτων χρησιµοποιούµε τις εξής συµβάσεις: 1. Όλες οι δεσµευµένες λέξεις που αφορούν τη σύνταξη της SQL γράφονται µε κεφαλαία. Π.χ. CREATE TABLE 2. Στα παραδείγµατα, τα ονόµατα πινάκων, στηλών κλπ που δεν αποτελούν δεσµευµένες λέξεις και καθορίζονται από το χρήστη, γράφονται µε πεζά γράµµατα. SELECT onoma FROM employee WHERE code = 2 3. Στη σύνταξη των εντολών οι αγκύλες [ ] δηλώνουν κάποιο προαιρετικό τµήµα της σύνταξης. SELECT [DISTINCT] * FROM A οι µύστακες σε συνδυασµό µε τη κάθετη γραµµή δηλώνουν επιλογή κάποιας από τις τιµές που περικλείονται σ' αυτούς. οι συνεχόµενες τελείες... δηλώνουν επανάληψη του προηγούµενου τµήµατος της σύνταξης. οι χαρακτήρες < > δηλώνουν τµήµατα της σύνταξης που πρέπει να οριστούν από το χρήστη. Μια εντολή της SQL µπορεί να γραφεί σε µια ή περισσότερες γραµµές χωρίς να απαιτείται διαφορετική σύνταξη. ιαδοχικές εντολές χωρίζονται µεταξύ τους από το χαρακτήρα ';'. Ο χαρακτήρας ';' δεν περιλαµβάνεται στη σύνταξη των εντολών της SQL, αλλά το χρειάζονται τα προγράµµατα ερµηνείας της SQL ώστε να διακρίνουν τις εντολές µεταξύ τους. Σε αυτό το βιβλίο γράφουµε συνήθως τις εντολές σε περισσότερες από µία γραµµές, ανάλογα βέβαια και µε τη σύνταξη τους για λόγους εµφάνισης και κατανόησης του περιεχοµένου τους. Να σηµειώσουµε, µε την ευκαιρία, ότι, για τη διαλογική χρήση της SQL, στο INGRES χρησιµοποιούµε το πρόγραµµα ISQL, ενώ στο ORACLE το SQL*PLUS. 3.1 Τύποι εδοµένων Οι τύποι δεδοµένων που υποστηρίζει η SQL χωρίζονται σε δύο µεγάλες κατηγορίες. Στους τύπους που αναφέρονται στα αριθµητικά δεδοµένα και στους τύπους που αναφέρονται στα αλφαριθµητικά δεδοµένα. Υπάρχει και µια τρίτη κατηγορία οι ειδικοί τύποι δεδοµένων. Με τη σειρά τους οι αριθµητικοί τύποι δεδοµένων χωρίζονται στους τύπους που εκφράζουν ακέραιες ποσότητες και σε αυτούς που εκφράζουν πραγµατικές ποσότητες µε υποδιαιρέσεις δεκαδικών. Ακέραιοι αριθµητικοί τύποι δεδοµένων του προτύπου της SQL είναι INTEGER ή INT SMALLINT Η διαφορά τους βρίσκεται στο πλήθος των ψηφιολέξεων (bytes που χρησιµοποιούν για την αναπαράσταση των αριθµών. Το INGRES υποστηρίζει και τους ακέραιους τύπους INTEGER1, INTEGER2 και INTEGER4, όπου ο αριθµός δηλώνει το πλήθος των ψηφιολέξεων που χρησιµοποιούνται για την αποθήκευση του ακεραίου. Στο ORACLE έχουµε µόνο τον τύπο INTEGER, ο οποίος πρέπει να σηµειώσουµε δεν υλοποιείται εσωτερικά ως ακέραιος, αλλά ως πραγµατικός. Οι τύποι δεδοµένων για πραγµατικούς αριθµούς του προτύπου της SQL είναι DECIMAL[(<µήκος>, <δεκαδικά>] NUMBER[(<µήκος>, <δεκαδικά>] FLOAT[(<µήκος>] DOUBLE PRECISION REAL Στο INGRES οι τύποι που αναφέρονται στους πραγµατικούς αριθµούς είναι οι FLOAT, FLOAT4 και FLOAT8. Οι διαφορές τους βρίσκονται στο πλήθος των ψηφιολέξεων που χρησιµοποιούν για την

3. Structured Query Language (SQL 4 υλοποίηση των αριθµών. Το ORACLE έχει µόνο τον τύπο NUMBER και υποστηρίζει συντακτικά και τους τύπους DECIMAL και FLOAT, τους οποίους και αντιστοιχεί στον τύπο NUMBER. Οι αλφαριθµητικοί τύποι δεδοµένων που υποστηρίζει το πρότυπο της SQL είναι: CHARACTER[(<µήκος>] ή CHAR[(<µήκος>] CHARACTER VARYING[(<µήκος>] Στο INGRES συναντούµε επίσης τους τύπους VCHAR, VARCHAR και C, ενώ στο ORACLE τον τύπο VARCHAR µε µέγιστο µήκος τους 255 χαρακτήρες. Στο ORACLE υπάρχει επίσης ο τύπος LONG που µπορεί να περιλάβει µέχρι 65532 χαρακτήρες και έχει τον περιορισµό ότι δεν µπορεί να δηλωθεί παρά µόνο για µία στήλη ενός πίνακα. Στη σύνταξη όλων των αλφαριθµητικών τύπων πρέπει να δηλωθεί το πλήθος των χαρακτήρων που µπορεί να περιλάβει η συµβολοσειρά. Ο µόνος ειδικός τύπος δεδοµένων που συναντούµε, τόσο στο INGRES, όσο και στο ORACLE είναι ο τύπος ηµεροµηνίας DATE. Στο INGRES υπάρχει επιπλέον ο τύπος MONEY για χρηµατικές ποσότητες και η πολύ σηµαντική δυνατότητα ορισµού δεδοµένων από τον ίδιο το χρήστη. Στο ORACLE υπάρχουν οι τύποι RAW και LONGRAW, αντίστοιχοι στο µέγεθος των τύπων CHAR και LONGCHAR µε τη διαφορά ότι µπορούν να δεχθούν σύνολα οποιωνδήποτε ψηφιολέξεων. Μπορούν να χρησιµοποιηθούν για την αποθήκευση δυαδικών δεδοµένων ή δεδοµένων που παριστούν εικόνες ή οποιαδήποτε άλλα δεδοµένα. 3.2 Υπογλώσσα Ορισµού εδοµένων Στο τµήµα της ΓΟ µπορούµε να περιλάβουµε όλες εκείνες τις εντολές που έχουν να κάνουν µε τη δηµιουργία της βάσης δεδοµένων και την τροποποίηση της. Η δηµιουργία της ίδιας της βάσης δεδοµένων µπορεί να γίνει είτε µε εξωτερική εντολή στο επίπεδο του λειτουργικού συστήµατος, όπως στο INGRES, είτε µε εντολή της SQL, όπως στο ORACLE. Γενικά, όµως, η δηµιουργία της βάσης δεδοµένων έχει κάποια ιδιαίτερα χαρακτηριστικά ανάλογα µε το Σ Β. Περισσότερες λεπτοµέρειες δίνονται στα αντίστοιχα κεφάλαια των INGRES και ORACLE. 3.2.1 ηµιουργία Πίνακα Η εντολή της SQL που δηµιουργεί ένα πίνακα είναι η CREATE TABLE και έχει την εξής σύνταξη: CREATE TABLE <όνοµα_πίνακα> (<όνοµα_στήλης> <τύπος_δεδοµένων> [(µέγεθος] [NOT NULL] [DEFAULT <τιµή>] [,<όνοµα_στήλης> <τύπος_δεδοµένων> [(µέγεθος] [NOT NULL] [DEFAULT <τιµή>] [CONSTRAINT <περιορισµός> [PRIMARY KEY (<όνοµα_στήλης> [,<όνοµα_στήλης>... ] [FOREIGN KEY (<όνοµα_στήλης> REFERENCES <όνοµα_πίνακα>] [UNIQUE (<όνοµα_στήλης> [,<όνοµα_στήλης>... ]]] Όπως παρατηρούµε από τη σύνταξη της εντολής, για τη δηµιουργία ενός πίνακα χρειάζεται να ορίσουµε : το όνοµα του πίνακα, το οποίο πρέπει να είναι µοναδικό ανάµεσα στους πίνακες της βάσης δεδοµένων. τις στήλες που θα περιλαµβάνει ο πίνακας. Για τη κάθε στήλη, πάλι, θα πρέπει να ορίσουµε το όνοµα της και τον τύπο των δεδοµένων της. Ως τύπο δεδοµένων µπορούµε να ορίσουµε κάποιο από τους επιτρεπτούς τύπους δεδοµένων, που αναφέρθηκαν στην εισαγωγή αυτής της ενότητας και αναγνωρίζει η συγκεκριµένη διάλεκτος της SQL. Οι στήλες του ίδιου πίνακα πρέπει να έχουν διαφορετικά ονόµατα, ενώ διαφορετικοί πίνακες µπορούν να έχουν στήλες µε το ίδιο όνοµα.

3. Structured Query Language (SQL 5 Ο προσδιορισµός NOT NULL δηλώνει ότι η στήλη δεν µπορεί να έχει απροσδιόριστες τιµές. Οι απροσδιόριστες τιµές αντιπροσωπεύονται από την ειδική τιµή NULL. Εξ ορισµού µια στήλη έχει τη δυνατότητα να περιλαµβάνει απροσδιόριστες τιµές. Ο προσδιορισµός DEFAULT δίνει τη δυνατότητα στο Σ Β, στην περίπτωση που δεν καθοριστεί τιµή για µία στήλη, να της αποδώσει µια προκαθορισµένη τιµή. Στη σύνταξη του προτύπου της SQL υπάρχει η δυνατότητα να δηλωθεί η προκαθορισµένη τιµή ξεχωριστά για κάθε στήλη. Στις διάφορες υλοποιήσεις όµως της SQL οι προκαθορισµένες τιµές είναι δεδοµένες και εξαρτώνται από το τύπο της κάθε στήλης. Η προκαθορισµένη τιµή για µια αριθµητική στήλη είναι το 0 και για µια αλφαριθµητική είναι η κενή συµβολοσειρά. Να σηµειώσουµε ότι είναι εντελώς ξεχωριστές οι τιµές NULL από την κενή συµβολοσειρά που συµβολίζεται µε ''. Αν δεν δοθεί ο προσδιορισµός NOT NULL δεν έχει νόηµα ο προσδιορισµός DEFAULT. Στη περίπτωση που για µια στήλη οι προσδιορισµοί είναι NOT NULL και NOT DEFAULT σε κάθε εισαγωγή δεδοµένων στον πίνακα θα πρέπει για τη συγκεκριµένη στήλη να προσδιορίζεται τιµή. Αυτός ο προσδιορισµός χρησιµοποιείται οπωσδήποτε για τις στήλες που συµµετέχουν στο σχηµατισµό του κλειδιού του πίνακα. Ο προσδιορισµός [NOT/WITH DEFAULT] υποστηρίζεται µόνο από το INGRES αντί του προσδιορισµού [DEFAULT <τιµή>], αλλά όχι και από το ORACLE. Ο προσδιορισµός CONSTRAINT επιτρέπει τον ορισµό του πρωτεύοντος κλειδιού, τις σχέσεις µε άλλους πίνακες και τον ορισµό ειδικών ευρετηρίων. Για τον ορισµό του πρωτεύοντος κλειδιού χρησιµοποιείται ο προσδιορισµός PRIMARY KEY και ο προσδιορισµός FOREIGN KEY επιτρέπει τον ορισµό των αλληλεξαρτήσεων µεταξύ πινάκων. Μια διαφορετική µορφή της εντολής CREATE TABLE επιτρέπει τη δηµιουργία ενός πίνακα σύµφωνα µε τη δοµή και το περιεχόµενο κάποιου άλλου πίνακα. CREATE TABLE <όνοµα_πίνακα> [(<όνοµα_στήλης> [,<όνοµα_στήλης>...]] AS <υποερώτηση> Η υποερώτηση δοµείται µε τη βοήθεια και τη σύνταξη της εντολής SELECT και επιστρέφει ένα σύνολο στηλών και γραµµών από τον πίνακα ή τους πίνακες που προσδιορίζονται. Τα ονόµατα στηλών µπορούν να χρησιµοποιηθούν ώστε να διαφοροποιήσουµε τα ονόµατα των στηλών από αυτά που ορίζει η υποερώτηση. Αν δεν προσδιοριστούν ονόµατα στηλών χρησιµοποιούνται αυτά που καθορίζει η υποερώτηση. εν υπάρχει η δυνατότητα να οριστεί διαφορετικό µήκος ή τύπος δεδοµένων. Τόσο το ORACLE, όσο και το INGRES, µέσω της εντολής CREATE TABLE, καθορίζουν και ορισµένα χαρακτηριστικά που αφορούν τη µορφή της εσωτερικής αποθήκευσης του πίνακα, πράγµα βέβαια που δεν θα µας απασχολήσει εδώ. Η εντολή CREATE TABLE µε την εκτέλεση της τοποθετεί τον ορισµό του πίνακα στο λεξικό δεδοµένων και δηµιουργεί ένα πίνακα ο οποίος δεν περιέχει καθόλου στοιχεία. Τα στοιχεία µπορούµε να τα τοποθετήσουµε αργότερα µε την κατάλληλη εντολή. Παράδειγµα Με την εντολή CREATE TABLE stud ( studid INTEGER NOT NULL, lname CHAR(20 NOT NULL, fname CHAR(10 NOT NULL, sex CHAR(1 NOT NULL, birthdate DATE CONSTRAINT pkey PRIMARY KEY (studid ; δηµιουργείται ο πίνακας stud µε πέντε στήλες. και πρωτεύον κλειδί τη στήλη studid. Οι τέσσερις πρώτες στήλες δηλώνονται µε τον προσδιορισµό NOT NULL, πράγµα που καθιστά υποχρεωτική την καταχώριση τιµών στις στήλες, ενώ η τελευταία δέχεται προκαθορισµένες τιµές σε περίπτωση που δεν καταχωρηθεί συγκεκριµένη ηµεροµηνία.

3. Structured Query Language (SQL 6 Για τη δηµιουργία των πινάκων customer, orders, orderlines και parts, που αποτελούν τη βάση δεδοµένων του παραδείγµατος µας, δίνουµε τις εντολές CREATE TABLE customer ( custcode INTEGER NOT NULL, lname CHAR(15 NOT NULL, fname CHAR(15 NOT NULL, street CHAR(20, city CHAR(10 NOT NULL CONSTRAINT pkey1 PRIMARY KEY (custcode ; CREATE TABLE orderlines ( ordernum INTEGER NOT NULL, partcode INTEGER NOT NULL, qty INTEGER NOT NULL CONSTRAINT pkey2 PRIMARY KEY (ordernum, partcode ; CREATE TABLE orders ( ordernum INTEGER NOT NULL, orderdate DATE NOT NULL, custcode INTEGER NOT NULL CONSTRAINT pkey3 PRIMARY KEY (ordernum, orderdate ; CREATE TABLE parts ( partcode INTEGER NOT NULL, name CHAR(20 NOT NULL, price FLOAT NOT NULL, totalqty INTEGER CONSTRAINT pkey4 PRIMARY KEY (partcode ; 3.2.2 Τροποποίηση Πίνακα Προσθήκη Στήλης Η προσθήκη µιας καινούργιας στήλης στην ήδη υπάρχουσα δοµή ενός πίνακα γίνεται µέσω της εντολής ALTER TABLE. Η σύνταξη της εντολής είναι η εξής: ALTER TABLE <όνοµα_πίνακα> ADD [COLUMN]( <όνοµα_στήλης> <τύπος_δεδοµένων> [,<όνοµα_στήλης> <τύπος_δεδοµένων>]... Ο προσδιορισµός NOT NULL δεν µπορεί να χρησιµοποιηθεί σε ένα πίνακα που περιέχει ήδη στοιχεία αφού αυτόµατα παραβιάζεται ο κανόνας ακεραιότητας που ορίζει ο προσδιορισµός. Παράδειγµα Για να προσθέσουµε στον πίνακα stud τη στήλη address, που αναφέρεται στη διεύθυνση του σπουδαστή, δίνουµε την εντολή ALTER TABLE stud ADD COLUMN( address CHAR(25 ; Για όλες τις γραµµές του πίνακα η καινούργια στήλη παίρνει τη τιµή NULL. εν υπάρχει η δυνατότητα να δοθεί ο προσδιορισµός NOT NULL (γιατί;. Μεταβολή Στήλης Ένα είδος µεταβολής υλοποιείται µέσω της εντολής ALTER TABLE. Η µεταβολή αναφέρεται στο µήκος µιας στήλης και µπορεί να γίνει µόνο εφόσον ο πίνακας δεν περιέχει στοιχεία για την συγκεκριµένη στήλη.

3. Structured Query Language (SQL 7 Η σύνταξη της εντολής είναι: ALTER TABLE <όνοµα_πίνακα> ALTER COLUMN ( <όνοµα_στήλης> <τύπος_δεδοµένων> [,<όνοµα_στήλης> <τύπος_δεδοµένων>]... Για µεταβολές που αφορούν άλλα χαρακτηριστικά της στήλης, όπως το όνοµα, ο τύπος δεδοµένων ή άλλοι προσδιορισµοί, θα πρέπει να ακολουθηθεί κάποιος έµµεσος τρόπος, είτε µε τη δηµιουργία ενός καινούργιου πίνακα µε τις επιθυµητές προδιαγραφές και η αντιγραφή σε αυτόν των στοιχείων του αρχικού πίνακα, είτε µε τη δηµιουργία κάποιας όψης που θα παρουσιάζει τα δεδοµένα µε τον επιθυµητό τρόπο. Το INGRES δεν διαθέτει τη σχετική εντολή. Η τροποποίηση µπορεί να γίνει µόνο µε έµµεσο τρόπο. Παράδειγµα Για να τροποποιήσουµε τη στήλη fname ώστε να δέχεται περισσότερους χαρακτήρες δίνουµε την εντολή ALTER TABLE stud ALTER COLUMN(fname CHAR(20 Αποµάκρυνση Στήλης Η αναδιοργάνωση ενός πίνακα και η τροποποίηση της δοµής του µε την αποµάκρυνση κάποιας στήλης πραγµατοποιείται µε την βοήθεια της εντολής ALTER TABLE. Η σύνταξη της εντολής είναι: ALTER TABLE <όνοµα_πίνακα> DROP <όνοµα_στήλης> CASCADE RESTRICT Ένας άλλος τρόπος αντιµετώπισης είναι η δηµιουργία µιας όψης του πίνακα η οποία να µην περιλαµβάνει τις στήλες που δεν µας χρειάζονται. Σχετικά µε τις όψεις θα µιλήσουµε σε επόµενη ενότητα του κεφαλαίου. Με τον πρώτο τρόπο έχουµε οριστική αποµάκρυνση των στοιχείων που περιελάµβαναν οι ανεπιθύµητες στήλες, ενώ µε τον δεύτερο τα στοιχεία παραµένουν αλλά δεν φαίνονται στο χρήστη. Ποιο από τους δύο τρόπους θα ακολουθήσουµε µας το υπαγορεύει η φύση της βάσης δεδοµένων, ο όγκος των στοιχείων του πίνακα και ο λόγος της αποµάκρυνσης των στηλών. Παράδειγµα Για τη φυσική αποµάκρυνση της στήλης address από τον πίνακα stud µπορούµε να χρησιµοποιήσουµε την εντολή ALTER TABLE temp DROP address RESTRICT Μέσω όψης έχουµε το ίδιο αποτέλεσµα, για τους χρήστες της βάσης δεδοµένων, µε την εντολή CREATE VIEW stud1 AS SELECT studid, lname, fname, sex, birthdate ; Παρατηρούµε ότι αναγκαζόµαστε να αλλάξουµε το όνοµα της όψης που βλέπουν οι χρήστες, αφού δεν επιτρέπεται η όψη και ο πίνακας να έχουν το ίδιο όνοµα. Περισσότερα για τις όψεις παρουσιάζουµε σε επόµενη ενότητα. 3.2.3 ιαγραφή Πίνακα Η διαγραφή ενός πίνακα συνεπάγεται τόσο τη διαγραφή των στοιχείων που περιλαµβάνει, όσο και τη διαγραφή του ορισµού του. Μετά τη διαγραφή ενός πίνακα η επανάκτηση των στοιχείων του δεν είναι απλή

3. Structured Query Language (SQL 8 υπόθεση και αρκετές φορές είναι και αδύνατη. Το τι µπορεί να επανακτηθεί εξαρτάται από τις δυνατότητες επαναφοράς που προσφέρει το σύστηµα. Περισσότερα στοιχεία αναφέρουµε στην αντίστοιχη ενότητα αυτού του κεφαλαίου. Η εντολή DROP TABLE µέσω της οποίας διαγράφεται ένας πίνακας έχει την εξής σύνταξη: DROP TABLE <όνοµα_πίνακα> Η διαγραφή ενός πίνακα συνεπάγεται και τη διαγραφή όλων των όψεων, των ευρετηρίων, των κανόνων ακεραιότητας και των δικαιωµάτων που αναφέρονται στον πίνακα. Παράδειγµα Η εντολή για τη διαγραφή του πίνακα stud είναι τόσο απλή όσο και επικίνδυνη DROP TABLE stud 3.2.4 Ευρετήρια Τα ευρετήρια σε µια βάση δεδοµένων έχουν ως πρωταρχικό σκοπό την επιτάχυνση των αναζητήσεων που αναφέρονται στα δεδοµένα των πινάκων. Σε ένα δεύτερο επίπεδο και ως παρενέργεια προσφέρουν τη δυνατότητα υλοποίησης των κλειδιών στους πίνακες που αναφέρονται. Πέρα από τα πλεονεκτήµατα τους, όµως, τα ευρετήρια παρουσιάζουν και ορισµένα µειονεκτήµατα. Πρώτα απ' όλα δεσµεύουν χώρο και δεύτερο καθυστερούν τις ενηµερώσεις, αφού απαιτούν και τα ίδια ενηµέρωση παράλληλα µε τους πίνακες. Χρειάζεται, λοιπόν, προσοχή στο σχεδιασµό µιας βάσης δεδοµένων και στον ορισµό των ευρετηρίων ώστε να µεγιστοποιηθούν τα πλεονεκτήµατα και να ελαχιστοποιηθούν τα µειονεκτήµατα. Από τη στιγµή που θα δηµιουργηθεί ένα ευρετήριο ο χρήστης δεν χρειάζεται να νοιάζεται πια γι' αυτό. Το ίδιο το Σ Β και η SQL αναλαµβάνουν να το χρησιµοποιήσουν µε τον καλύτερο δυνατό τρόπο ώστε να ικανοποιηθούν οι ερωτήσεις που απευθύνει ο χρήστης στη βάση δεδοµένων. Στην πράξη, βέβαια, ο τρόπος που διατυπώνεται µια ερώτηση έχει σηµασία στο αν θα χρησιµοποιηθεί ή όχι κάποιο ευρετήριο. Ο ορισµός και η δηµιουργία ευρετηρίων (index γίνεται µέσω της εντολής CREATE [UNIQUE] INDEX <ευρετήριο> ON <πίνακας> ( στήλη [ASC DEC] [, στήλη [ASC DEC]... ] Ο προσδιορισµός UNIQUE υποχρεώνει τον πίνακα να διαθέτει µια µοναδική τιµή σε κάθε γραµµή στην αντίστοιχη στήλη. Οι προσδιορισµοί ASC και DEC καθορίζουν την ταξινόµηση της στήλης, αύξουσα και φθίνουσα αντίστοιχα. Αν το ευρετήριο δηµιουργηθεί ενώ ο πίνακας περιέχει δεδοµένα και οριστεί ο προσδιορισµός UNIQUE θα πρέπει τα δεδοµένα του πίνακα να ανταποκρίνονται στη δέσµευση του προσδιορισµού, διαφορετικά η εντολή απορρίπτεται. Να σηµειώσουµε ότι στο ORACLE η δηµιουργία ευρετηρίων ελέγχεται από ξεχωριστό δικαίωµα που ονοµάζεται INDEX. Οπότε ένας χρήστης για να µπορεί να δηµιουργεί ευρετήρια θα πρέπει προηγουµένως να του έχει παραχωρηθεί το σχετικό δικαίωµα από το Β. Στο INGRES δεν υπάρχει τέτοιος περιορισµός. Οι χρήστες που έχουν δικαίωµα δηµιουργίας πινάκων µπορούν να ορίζουν και ευρετήρια. Από τον ορισµό ενός ευρετηρίου φαίνεται ότι το ευρετήριο µπορεί να αναφέρεται σε µία ή περισσότερες στήλες, του ίδιου πάντοτε πίνακα. DROP INDEX <ευρετήριο> Να σηµειώσουµε ότι η εντολή DROP TABLE, η οποία διαγράφει ένα πίνακα, ταυτόχρονα διαγράφει και όλα τα ευρετήρια που αναφέρονται σ' αυτόν. Με την εντολή CREATE UNIQUE INDEX studndx ON stud (studid; δηµιουργούµε το ευρετήριο studndx για τη στήλη studid και παράλληλα απαγορεύεται δύο γραµµές του πίνακα να έχουν την ίδια τιµή στη στήλη studid. Με αυτό τον τρόπο επιβάλλουµε τη µοναδικότητα στις τιµές της στήλης studid, που αποτελεί και το πρωτεύον κλειδί του πίνακα stud.

3. Structured Query Language (SQL 9 3.3 Γλώσσα Χειρισµού εδοµένων - Ανάκτηση και Παρουσίαση εδοµένων Η ανάκτηση του περιεχοµένου µιας βάσης δεδοµένων πραγµατοποιείται αποκλειστικά µέσω της εντολής SELECT, η οποία αποτελεί και την πιο ισχυρή και πολύπλοκη εντολή της SQL. Εκτός από την ανάκτηση δεδοµένων η εντολή SELECT έχει και κάποιες απλές δυνατότητες παρουσίασης των δεδοµένων που ανακτά. Τη σύνταξη και τις δυνατότητες της εντολής θα τις παρουσιάσουµε τµηµατικά, αρχίζοντας από τις πιο απλές µορφές της και προχωρώντας στις πιο σύνθετες. Μέσω της εντολής SELECT η SQL υλοποιεί όλες τις εντολές της σχεσιακής άλγεβρας που έχουµε αναφέρει στο κεφάλαιο για τις γλώσσες δεδοµένων του σχεσιακού Μ. Η εντολή SELECT µπορεί να χρησιµοποιηθεί µε τον ίδιο τρόπο για την ανάκτηση στοιχείων τόσο από πίνακες, όσο και από όψεις. Στην περιγραφή της εντολής όταν χρησιµοποιούµε τη λέξη 'πίνακας', εννοούµε τόσο τον πίνακα όσο και την όψη. Στις περιπτώσεις που κάτι ισχύει µόνο για πίνακες ή µόνο για όψεις το διευκρινίζουµε ρητά. 3.3.1 Απλή αναζήτηση και παρουσίαση δεδοµένων Η πιο απλή µορφή της εντολής SELECT, που θα παρουσιάσουµε σ' αυτή την ενότητα, µπορεί να χρησιµοποιηθεί για την αναζήτηση και παρουσίαση δεδοµένων από ένα πίνακα ή όψη, σύµφωνα µε κάποια ταξινόµηση και τα οποία να πληρούν κάποια συνθήκη. Να σηµειώσουµε ότι δεν µπορούµε να ανατρέψουµε τη σειρά που παρουσιάζονται τα διάφορα τµήµατα της εντολής. Η απλή σύνταξη της εντολής είναι η εξής: SELECT [DISTINCT] {* <προσδιορισµός_δεδοµένων>} FROM <πίνακας> [WHERE <συνθήκη>] [ORDER BY <στήλη> [{ASC DEC}] [,<στήλη> [{ASC DEC}... ] Παρατηρούµε ότι τα µόνα απαραίτητα µέρη της σύνταξης της εντολής είναι το τµήµα που προσδιορίζει τις στήλες που θέλουµε να εµφανίσουµε και τον πίνακα στον οποίο ανήκουν οι στήλες. Στην πιο απλή ακόµη περίπτωση η σύνταξη περιορίζεται στη µορφή SELECT * FROM <πίνακας> όπου µε το σύµβολο '*' δηλώνουµε ότι θέλουµε να ανακτήσουµε και να εµφανίσουµε τα στοιχεία όλων των στηλών του πίνακα. Για παράδειγµα η εντολή SELECT * εµφανίζει όλα τα περιεχόµενα του πίνακα stud. Studid lname fname sex birthdate ------------------------------------------------ 1 ΠΕΛΟΠΑ ΙΩΑΝΝΑ Θ 11/12/75 2 ΘΕΟ ΟΣΙΟΥ ΜΙΧΑΛΗΣ Α 10/01/74 3 ΠΑΝΑΡΑ ΕΛΕΝΗ Θ 15/06/74 4 ΙΩΑΝΝΟΥ ΣΤΕΛΙΟΣ Α 03/01/74

3. Structured Query Language (SQL 10 5 ΝΙΚΑΝ ΡΟΥ ΕΛΕΝΗ Θ 20/07/73 Βέβαια στις περισσότερες περιπτώσεις δεν µας ενδιαφέρουν όλες οι στήλες που περιέχονται σε ένα πίνακα, αλλά µόνο ορισµένες από αυτές. Για να πάρουµε τα στοιχεία που περιέχονται µόνο σε ορισµένες στήλες του πίνακα αρκεί να δηλώσουµε τα ονόµατα των στηλών που µας ενδιαφέρουν στη θέση που στη σύνταξη της εντολής αναφέρεται ως 'προσδιορισµός δεδοµένων'. Για να εµφανίσουµε µόνο τα δεδοµένα των στηλών studid, lname και fname δίνουµε την εντολή SELECT studid, lname, fname και έχουµε ως αποτέλεσµα Studid lname fname ---------------------------- 1 ΠΕΛΟΠΑ ΙΩΑΝΝΑ 2 ΘΕΟ ΟΣΙΟΥ ΜΙΧΑΛΗΣ 3 ΠΑΝΑΡΑ ΕΛΕΝΗ 4 ΙΩΑΝΝΟΥ ΣΤΕΛΙΟΣ 5 ΝΙΚΑΝ ΡΟΥ ΕΛΕΝΗ Να παρατηρήσουµε ότι, στη σύνταξη της εντολής, τα ονόµατα των στηλών χωρίζονται µεταξύ τους µε κόµµατα. Ξέρουµε από τη θεωρία ότι οι γραµµές ενός πίνακα είναι διαφορετικές µεταξύ τους, οπότε µε τον προσδιορισµό '*' παίρνουµε σίγουρα διαφορετικά στοιχεία σε κάθε γραµµή. Στην περίπτωση όµως που επιλέγουµε να παρουσιάσουµε τα δεδοµένα συγκεκριµένων στηλών υπάρχει περίπτωση τα δεδοµένα που παίρνουµε να είναι τα ίδια σε διαφορετικές γραµµές. Με την εντολή SELECT fname εµφανίζονται τα µικρά ονόµατα όλων των σπουδαστών που περιέχονται στον πίνακα stud. fname ------- ΙΩΑΝΝΑ ΜΙΧΑΛΗΣ ΕΛΕΝΗ ΣΤΕΛΙΟΣ ΕΛΕΝΗ Είναι λογικό διάφοροι σπουδαστές να έχουν τα ίδια µικρά ονόµατα οπότε στα αποτελέσµατα της εντολής θα περιέχονται τα ίδια ονόµατα πολλές φορές (στο παράδειγµα µας το όνοµα ΕΛΕΝΗ παρουσιάζεται δύο φορές. Αν τώρα επιθυµία µας είναι να δούµε ποια διαφορετικά µικρά ονόµατα έχουν οι σπουδαστές του πίνακα µας αρκεί να προσθέσουµε στην εντολή τον προσδιορισµό DISTINCT. ηλαδή µε την εντολή SELECT DISTINCT fname απαλείφονται από την παρουσίαση οι διπλές εµφανίσεις των ονοµάτων. fname ------- ΙΩΑΝΝΑ ΜΙΧΑΛΗΣ ΣΤΕΛΙΟΣ ΕΛΕΝΗ Ο προσδιορισµός DISTINCT, λοιπόν, απαλείφει από την παρουσίαση των αποτελεσµάτων τις διπλές εµφανίσεις γραµµών.

3. Structured Query Language (SQL 11 Αλλαγή ονόµατος στήλης Στη παρουσίαση των αποτελεσµάτων της εντολής SELECT παρατηρούµε ότι ως τίτλος στην κάθε στήλη εµφανίζεται το όνοµα της στήλης. Έχουµε τη δυνατότητα να αλλάξουµε το όνοµα της στήλης, κατά την εµφάνιση των δεδοµένων, µε την εντολή SELECT <προσδιορισµός_δεδοµένων> AS <όνοµα> FROM <πίνακας> Για παράδειγµα SELECT studid AS κωδικός, lname AS επώνυµο, fname AS όνοµα Στο ORACLE το ίδιο αποτέλεσµα έχουµε και µε την εντολή SELECT studid "κωδικός", lname "επώνυµο", fname "όνοµα" κωδικός επώνυµο όνοµα ------------------------------ 1 ΠΕΛΟΠΑ ΙΩΑΝΝΑ 2 ΘΕΟ ΟΣΙΟΥ ΜΙΧΑΛΗΣ 3 ΠΑΝΑΡΑ ΕΛΕΝΗ 4 ΙΩΑΝΝΟΥ ΣΤΕΛΙΟΣ 5 ΝΙΚΑΝ ΡΟΥ ΕΛΕΝΗ Προσδιορισµός εδοµένων Στη σύνταξη της εντολής SELECT χρησιµοποιούµε τον όρο 'προσδιορισµός δεδοµένων', πράγµα που σηµαίνει ότι εκτός από τα ονόµατα των στηλών του πίνακα µπορούµε να προσδιορίσουµε τα δεδοµένα που θα εµφανιστούν και µε άλλους τρόπους. Μπορούµε να διακρίνουµε τρεις επιπλέον κατηγορίες προσδιορισµού των δεδοµένων. Προσδιορισµός κειµένου : Έχουµε τη δυνατότητα να ορίσουµε κάποιο κείµενο το οποίο θα εµφανίζεται σε κάθε γραµµή των δεδοµένων. Για παράδειγµα µε την εντολή SELECT 'Ο σπουδαστής µε κωδικό ',studid, ' έχει επώνυµο ',lname έχουµε το αποτέλεσµα studid lname ------------------------------------------------ Ο σπουδαστής µε κωδικό 1 έχει επώνυµο ΠΕΛΟΠΑ Ο σπουδαστής µε κωδικό 2 έχει επώνυµο ΘΕΟ ΟΣΙΟΥ Ο σπουδαστής µε κωδικό 3 έχει επώνυµο ΠΑΝΑΡΑ Ο σπουδαστής µε κωδικό 4 έχει επώνυµο ΙΩΑΝΝΟΥ Ο σπουδαστής µε κωδικό 5 έχει επώνυµο ΝΙΚΑΝ ΡΟΥ Μπορούµε να ορίσουµε οποιοδήποτε κείµενο, το οποίο θα επαναλαµβάνετε σε κάθε γραµµή, φτάνει να το τοποθετήσουµε σε απλά εισαγωγικά. Προσδιορισµός αριθµητικών εκφράσεων : Μπορούµε να χρησιµοποιήσουµε οποιαδήποτε αριθµητική έκφραση. Οι αριθµητικοί τελεστές είναι οι γνωστοί +, -, *, / για τις πράξεις της πρόσθεσης της αφαίρεσης, του πολλαπλασιασµού και της διαίρεσης. Με την εντολή SELECT partcode, name, 0.35*qty AS ' έσµευση' FROM parts

3. Structured Query Language (SQL 12 προσδιορίζουµε το 35% της ποσότητας του προϊόντος και το εµφανίζουµε υπό τον τίτλο 'δέσµευση'. Προσδιορισµός απλών συναρτήσεων : Ο προσδιορισµός των δεδοµένων µπορεί να περιλαµβάνει και συναρτήσεις. Υπάρχουν διάφορες κατηγορίες συναρτήσεων, όπως µαθηµατικές, χειρισµού συµβολοσειρών και ηµεροµηνιών ή µετατροπής δεδοµένων από τον ένα τύπο δεδοµένων στον άλλο. Η κάθε διάλεκτος της SQL έχει τις δικές της συναρτήσεις που κατά κανόνα είναι διαφορετικές από αυτές των άλλων διαλέκτων. Για παράδειγµα, τόσο στο INGRES, όσο και στο ORACLE, συναντούµε τη συνάρτηση length (<συµβολοσειρά> που δίνει το µήκος µιας συµβολοσειράς σε χαρακτήρες. Με την εντολή SELECT studid, lname, length(lname AS µήκος έχουµε ως αποτέλεσµα τον πίνακα studid lname µήκος ---------------------- 1 ΠΕΛΟΠΑ 6 2 ΘΕΟ ΟΣΙΟΥ 9 3 ΠΑΝΑΡΑ 6 4 ΙΩΑΝΝΟΥ 7 5 ΝΙΚΑΝ ΡΟΥ 9 Είναι προφανές ότι µπορούµε να συνδυάσουµε όλους τους τρόπους προσδιορισµού των δεδοµένων, αναµειγνύοντας ονόµατα στηλών, κείµενο, συναρτήσεις και αριθµητικές πράξεις. Ταξινόµηση Η ταξινόµηση που παρουσιάζουν τα αποτελέσµατα της εντολής SELECT εξαρτάται από το κλειδί του πίνακα, που, όπως έχουµε αναφέρει και σε προηγούµενη ενότητα, υλοποιείται έµµεσα µέσω της εσωτερικής οργάνωσης του πίνακα. Οπότε τα αποτελέσµατα µας συνήθως εµφανίζονται ταξινοµηµένα σύµφωνα µε το κλειδί του πίνακα. Μπορούµε πάντοτε να ορίσουµε τη δική µας ταξινόµηση των αποτελεσµάτων µέσω του προσδιορισµού ORDER BY της εντολής SELECT. Είναι βέβαια προφανές ότι η εντολή επηρεάζει µόνο την εµφάνιση των αποτελεσµάτων και όχι την εσωτερική οργάνωση των δεδοµένων. Αν θέλουµε τα στοιχεία των σπουδαστών που στην αρχική εκτέλεση της εντολής εµφανίσαµε ταξινοµηµένα σύµφωνα µε τη στήλη studid να εµφανιστούν ταξινοµηµένα σύµφωνα µε το επώνυµο και το όνοµα των σπουδαστών αρκεί να δώσουµε την εντολή SELECT studid, lname, fname ORDER BY lname, fname και το αποτέλεσµα είναι ο πίνακας studid lname fname ------------------------- 2 ΘΕΟ ΟΣΙΟΥ ΜΙΧΑΛΗΣ 4 ΙΩΑΝΝΟΥ ΣΤΕΛΙΟΣ 5 ΝΙΚΑΝ ΡΟΥ ΕΛΕΝΗ 3 ΠΑΝΑΡΑ ΕΛΕΝΗ 1 ΠΕΛΟΠΑ ΙΩΑΝΝΑ Να παρατηρήσουµε ότι οι στήλες που εµφανίζονται µετά το ORDER BY και καθορίζουν την ταξινόµηση δεν χρειάζεται να εµφανίζονται και µετά το SELECT αρκεί να είναι στήλες του πίνακα που προσδιορίζεται µετά το FROM. Όπως βλέπουµε στη σύνταξη της εντολής µετά το ORDER BY υπάρχουν και δύο προαιρετικοί προσδιορισµοί από τους οποίους µπορεί να επιλεγεί ένας για κάθε στήλη. Οι προσδιορισµοί αυτοί ορίζουν το τρόπο που θα γίνει η ταξινόµηση. Ο προσδιορισµός ASC δηλώνει ότι η ταξινόµηση θα γίνει κατά αύξουσα σειρά και ο προσδιορισµός DESC κατά φθίνουσα, σύµφωνα πάντα µε τη κωδικοποίηση ASCII που υποστηρίζει το σύστηµα. Όταν σε µία στήλη δεν προσδιορίζεται ο τρόπος ταξινόµησης επιλέγεται από την SQL η αύξουσα ταξινόµηση.

3. Structured Query Language (SQL 13 Ο προσδιορισµός ORDER BY γράφεται πάντοτε τελευταίος, οποιαδήποτε µορφή και να έχει η εντολή SELECT. Πρώτα συγκεντρώνονται τα δεδοµένα που ικανοποιούν όλους τους άλλους προσδιορισµούς της εντολής SELECT και στο τελικό αποτέλεσµα εφαρµόζεται η ταξινόµηση που ορίζει ο προσδιορισµός ORDER BY. Ο τρόπος της ταξινόµησης εξαρτάται και από τον τύπο των στηλών που ορίζουν την ταξινόµηση. Αν µια στήλη είναι αριθµητική η ταξινόµηση είναι αριθµητική, ενώ αν η στήλη είναι αλφαριθµητική τότε η ταξινόµηση γίνεται σύµφωνα µε τον κώδικα χαρακτήρων που υποστηρίζει το σύστηµα (συνήθως πρόκειται για τον κώδικα ASCII. Σε οποιαδήποτε µορφή ταξινόµησης, αύξουσα ή φθίνουσα, αριθµητική ή αλφαριθµητική, οι απροσδιόριστες τιµές εµφανίζονται πάντοτε πρώτες. Ανάκτηση δεδοµένων υπό συνθήκη Η ανάκτηση δεδοµένων υπό συνθήκη καθορίζεται από τον προσδιορισµό WHERE και την συνθήκη που ακολουθεί. Η συνθήκη είναι µια έκφραση που δίνει ένα λογικό αποτέλεσµα, αληθές ή ψευδές. Στην απλή της µορφή, µια συνθήκη περιλαµβάνει ονόµατα στηλών, τελεστές σύγκρισης, λογικούς τελεστές, συναρτήσεις και σταθερές. Η συνθήκη εξετάζεται για κάθε γραµµή του πίνακα και εµφανίζονται τα δεδοµένα από τις γραµµές που επαληθεύουν την συνθήκη. Για παράδειγµα η εντολή SELECT studid, lname, ftname WHERE studid = 2 εµφανίζει τη γραµµή του πίνακα για την οποία ο κωδικός του σπουδαστή είναι ίσος µε 2, δηλαδή studid lname fname ------------------------ 2 ΘΕΟ ΟΣΙΟΥ ΜΙΧΑΛΗΣ Στη κατηγορία των τελεστών διακρίνουµε τους συνήθεις τελεστές σύγκρισης ( =, <>, >, <, >=, <=, όπως επίσης και τους λογικούς τελεστές AND, OR και NOT. Εκτός από τους προηγούµενους τελεστές στην SQL υπάρχουν και οι ειδικοί τελεστές IN, BETWEEN, LIKE, ANY, EXIST, MINUS, INTERSECT και UNION. Στη συνέχεια αναφερόµαστε στους τελεστές IN, BETWEEN και LIKE. Τους τελεστές ANY και EXIST θα τους περιγράψουµε στη ενότητα που αναφέρεται στις υποερωτήσεις, ενώ οι τελεστές UNION, MINUS και INTERSECT περιγράφονται στην ενότητα που αναφέρεται στη υλοποίηση των πράξεων της σχεσιακής άλγεβρας. Ο προσδιορισµός WHERE χρησιµοποιείται µε τον ίδιο τρόπο και στις εντολές UPDATE και DELETE. Περισσότερες πληροφορίες για τις δύο εντολές δίνουµε σε επόµενες παραγράφους. Τελεστής IN Μέσω του τελεστή IN ελέγχουµε αν µια τιµή βρίσκεται σε ένα σύνολο τιµών. Το σύνολο τιµών µπορεί να αποτελείται από σταθερές ή να προκύπτει ως αποτέλεσµα µιας εντολής SELECT σε υποερώτηση. Η σύνταξη του τελεστή IN έχει τη µορφή IN (<σύνολο τιµών> Για παράδειγµα η εντολή SELECT studid, lname, fname WHERE studid ΙΝ ( 2, 4, 5 εµφανίζει τα στοιχεία των σπουδαστών µε κωδικούς 2, 4 και 5. Το ίδιο αποτέλεσµα έχουµε µε την εντολή SELECT studid, lname, fname WHERE studid = 2 OR studid = 4 OR studid = 5

3. Structured Query Language (SQL 14 Τελεστής BETWEEN Ο τελεστής BETWEEN ελέγχει αν µια τιµή βρίσκεται στο διάστηµα που ορίζεται, συµπεριλαµβανοµένων και των τιµών που αναφέρονται. Η σύνταξη του τελεστή έχει τη µορφή BETWEEN <σταθερά> AND <σταθερά> Για παράδειγµα η εντολή SELECT studid, lname, fname WHERE studid BETWEEN 1 AND 3 εµφανίζει τα στοιχεία των σπουδαστών µε κωδικούς µεταξύ του 1 και του 3. Το ίδιο αποτέλεσµα επιτυγχάνουµε µε την εντολή SELECT studid, lname, fname WHERE studid >= 1 AND studid <= 3 Ο τελεστής BETWEEN µας δίνει τη δυνατότητα να απλοποιήσουµε τη συνθήκη και να την κάνουµε πιο κατανοητή. Τελεστής LIKE Μέσω του τελεστή LIKE µπορούµε να ταυτοποιήσουµε µερικά τη τιµή µιας στήλης µε αλφαριθµητικό περιεχόµενο. Ο τελεστής LIKE µας παρέχει τη δυνατότητα να αναζητήσουµε δεδοµένα που δεν γνωρίζουµε επακριβώς. Για το σκοπό αυτό χρησιµοποιείται σε συνδυασµό µε τους δύο χαρακτήρες πασπαρτού, % και _. Ο χαρακτήρας % ταυτοποιεί ένα σύνολο χαρακτήρων ενώ ο χαρακτήρας _ µόνο ένα. Για την εµφάνιση των πελατών που τα ονόµατα τους αρχίζουν µε τους χαρακτήρες ΠΑΠΑ, χρησιµοποιούµε την εντολή SELECT custcode, lname, fname FROM customer WHERE lname LIKE 'ΠΑΠΑ%' και έχουµε ως αποτέλεσµα τον πίνακα custcode lname fname ---------------------------- 2 ΠΑΠΑΕΜΑΝΟΥΗΛ ΚΩΣΤΑΣ Μπορούν να δηµιουργηθούν πιο σύνθετες λογικές εκφράσεις µε τη χρησιµοποίηση των λογικών τελεστών NOT, AND και OR. Η εντολή SELECT custcode, lname, fname, city FROM customer WHERE lname LIKE 'ΠΑΠΑ%' OR city = 'ΧΑΝΙΑ' εµφανίζει όλους τους πελάτες που το επώνυµο τους αρχίζει από ΠΑΠΑ ή βρίσκονται στα Χανιά. custcode lname fname city ---------------------------------------- 2 ΠΑΠΑΕΜΑΝΟΥΗΛ ΚΩΣΤΑΣ ΘΕΣ/ΝΙΚΗ 3 ΚΟΥΚΑ ΠΗΝΕΛΟΠΗ ΧΑΝΙΑ 4 ΟΡΑΤΙΟΥ ΘΕΑΝΩ ΧΑΝΙΑ Απροσδιόριστες Τιµές Ο έλεγχος για τις στήλες που παίρνουν απροσδιόριστες τιµές έχει κάποια ιδιαιτερότητα. Η απροσδιόριστη τιµή συµβολίζεται µεν µε NULL αλλά δεν µπορούµε να τη χρησιµοποιήσουµε όπως τις άλλες σταθερές, π.χ. η έκφραση birthdate = NULL είναι λάθος. Για τον έλεγχο της τιµής NULL χρησιµοποιούµε τη σχέση IS [NOT] NULL Για παράδειγµα η εντολή

3. Structured Query Language (SQL 15 SELECT studid, lname, fname WHERE birthdate IS NOT NULL εµφανίζει όλες τις γραµµές του πίνακα stud για τις οποίες η στήλη birthdate δεν έχει απροσδιόριστη τιµή. Για το χειρισµό των απροσδιόριστων τιµών υπάρχουν και κάποιες ειδικές συναρτήσεις που επιτρέπουν, κατά την εµφάνιση των δεδοµένων, τη µετατροπή τους σε προκαθορισµένες τιµές. Το ORACLE διαθέτει τη συνάρτηση NVL και το INGRES τη IFNULL. Η σύνταξη και των δύο είναι παρόµοια, όπως και η λειτουργία τους. IFNULL(<στήλη>, <σταθερά> NVL(<στήλη>, <σταθερά> Αν η τιµή που περιέχει η στήλη είναι NULL εµφανίζει τη σταθερά που καθορίζουµε, διαφορετικά την ίδια την τιµή. Για παράδειγµα η εντολή SELECT studid, lname, fname, IFNULL(birthdate, 'Άγνωστη' εµφανίζει τη λέξη 'Άγνωστη' όταν η ηµεροµηνία γέννησης σε µια γραµµή είναι απροσδιόριστη. 3.3.2 Οµαδοποίηση Γραµµών Μέχρι τώρα χρησιµοποιήσαµε την εντολή SELECT για την ανάκτηση λεπτοµερών στοιχείων από κάποιο πίνακα. Με τον προσδιορισµό GROUP BY έχουµε την δυνατότητα να εµφανίζουµε οµαδοποιηµένα στοιχεία, σύµφωνα µε τις τιµές µιας ή περισσοτέρων στηλών. Ο τρόπος που λειτουργεί η εντολή είναι ο εξής. Επιλέγονται πρώτα όλες οι γραµµές του πίνακα που ικανοποιούν την συνθήκη του προσδιορισµού WHERE, στη συνέχεια ταξινοµούνται σύµφωνα µε τις στήλες που έχουµε ορίσει στο GROUP BY και από αυτές παραµένουν όσες ικανοποιούν την συνθήκη του προσδιορισµού HAVING. Τελικά η εντολή µας παρουσιάζει κάθε διαφορετικό συνδυασµό τιµών για τα δεδοµένα που ζητήσαµε στον προσδιορισµό δεδοµένων του SELECT. Οι στήλες που ορίζονται στον προσδιορισµό δεδοµένων θα πρέπει να εµφανίζονται και στον προσδιορισµό GROUP BY. Επίσης οι εκφράσεις που χρησιµοποιούνται στον προσδιορισµό δεδοµένων πρέπει να δίνουν µία µοναδικά τιµή για κάθε συνδυασµό τιµών των στηλών που ορίζονται στο GROUP BY. Η γενική σύνταξη της εντολής SELECT, για την οµαδοποίηση γραµµών, είναι: SELECT <προσδιορισµός_δεδοµένων> FROM <πίνακας> [WHERE <συνθήκη>] [GROUP BY <στήλες>] [HAVING <συνθήκη>] [ORDER BY <στήλη> [{ASC DEC}] [,<στήλη> [{ASC DEC}... ] Στο προσδιορισµό δεδοµένων µπορούµε να έχουµε αναφορά σε στήλες ή συναρτήσεις οµάδων, όπως και αριθµητικών εκφράσεων, φτάνει να έχουµε µια τιµή για κάθε οµάδα δεδοµένων. Στη συνθήκη που ακολουθεί το HAVING µπορούν να συγκριθούν ιδιότητες των οµάδων µε κάποια σταθερά ή ιδιότητες διαφορετικών οµάδων µέσω υποερωτήσεων. Οι Συναρτήσεις οµάδων χρησιµοποιούνται για να δώσουν συγκεντρωτικά αποτελέσµατα για οµάδες δεδοµένων. Μπορούν να χρησιµοποιηθούν τα δεδοµένα ενός πίνακα σαν µια οµάδα ή σε συνδυασµό µε τις οµάδες δεδοµένων που δηµιουργούνται µέσω του προσδιορισµού GROUP BY. COUNT([DISTINCT] <στήλη> *> SUM([DISTINCT] <έκφραση> AVG([DISTINCT] <έκφραση> MAX(<έκφραση> MIN(<έκφραση>

3. Structured Query Language (SQL 16 Η συνάρτηση COUNT µας δίνει το πλήθος των γραµµών που περικλείονται σε µια οµάδα, η SUM το άθροισµα τους και η AVG τον αριθµητικό µέσο όρο τους. Με τον προσδιορισµό DISTINCT και οι τρεις συναρτήσεις λαµβάνουν υπόψη στους υπολογισµούς τους µόνο τις διαφορετικές τιµές της στήλης που έχει προσδιοριστεί. Οι συναρτήσεις MIN και MAX υπολογίζουν την ελάχιστη και µέγιστη τιµή της έκφρασης σε κάθε οµάδα δεδοµένων. Το ORACLE υποστηρίζει ακόµη δύο συναρτήσεις, τις STDDEV και VARIANCE, που δίνουν την τυπική απόκλιση και τη διακύµανση, αντίστοιχα, του συνόλου των δεδοµένων που προσδιορίζονται. Η εντολή SELECT custcode, COUNT(* AS παραγγελίες FROM orders GROUP BY custcode µας δίνει το πλήθος των παραγγελιών ανά πελάτη. custcode παραγγελίες --------------------- 1 2 2 1 4 1 Επίσης η εντολή SELECT partcode, SUM(qty AS ποσότητα FROM orderlines GROUP BY partcode HAVING SUM(qty > 10 µας δίνει τη συνολική ποσότητα που έχει παραγγελθεί για κάθε προϊόν, ανεξάρτητα από τις παραγγελίες, αλλά µε τον περιορισµό τα κοµµάτια που έχουν παραγγελθεί να ξεπερνούν τα 10. partcode ποσότητα ------------------ 4 13 5 17 Να σηµειώσουµε ότι ο προσδιορισµός GROUP BY σε συνδυασµό µε τις συναρτήσεις οµάδων αποτελούν ένα εύκολο και απλό τρόπο να αντλήσουµε στατιστικά στοιχεία από τη βάση δεδοµένων. 3.3.3 Υποερωτήσεις Η υποερώτηση είναι µια ερώτηση η οποία βρίσκεται ενκυβωτισµένη µέσα σε µια άλλη και περικλείεται από παρενθέσεις. ηµιουργείται µε την εντολή SELECT και επαναλαµβάνει τη σύνταξη της. Υποερωτήσεις µπορούµε να χρησιµοποιήσουµε στις περισσότερες από τις εντολές της SQL, όπως η INSERT, η UPDATE, η DELETE και η CREATE. Στην εντολή SELECT οι υποερωτήσεις µπορούν να χρησιµοποιηθούν ως τµήµατα των συνθηκών στους προσδιορισµούς WHERE και HAVING. Μπορούµε να διακρίνουµε δύο ειδών υποερωτήσεις. Το ένα είδος είναι οι απλές υποερωτήσεις οι οποίες επιστρέφουν µόνο µία τιµή για κάθε γραµµή που εξετάζεται ή ένα σύνολο γραµµών και είναι ανεξάρτητες από την εξωτερική ερώτηση. Το δεύτερο είδος είναι οι συσχετιζόµενες υποερωτήσεις. Οι συσχετιζόµενες υποερωτήσεις εξαρτώνται από κάποια τιµή κάποιας στήλης της εξωτερικής ερώτησης. Οι απλές υποερωτήσεις υπολογίζονται µία φορά για όλη την εντολή SELECT, ενώ στις συσχετιζόµενες υποερωτήσεις έχουµε καινούριο υπολογισµό για κάθε γραµµή της εξωτερικής ερώτησης. Υπάρχει, δηλαδή, στις συσχετιζόµενες υποερωτήσεις ένα σύνολο υποψηφίων γραµµών οι οποίες εξαρτώνται από την τιµή κάποιας στήλης της εξεταζόµενης γραµµής. Στις υποερωτήσεις µπορούµε να χρησιµοποιήσουµε τους τελεστές >, <, = αν το αποτέλεσµα της είναι µια µοναδική τιµή. Για τις υποερωτήσεις που επιστρέφουν κάποιο σύνολο τιµών χρησιµοποιούµε τους τελεστές IN, ANY, ALL ή EXIST στους οποίους αναφερόµαστε στη συνέχεια. Για παράδειγµα η εντολή

3. Structured Query Language (SQL 17 δίνει τον πίνακα SELECT DISTINCT ordernum FROM orderlines WHERE partcode IN (SELECT partcode FROM parts WHERE price > 10000 ordernum -------- 2 3 4 που παρουσιάζει τους αριθµούς των παραγγελιών που περιλαµβάνουν προϊόντα που έχουν τιµή πάνω από 10000. Η υποερώτηση του παραδείγµατος ανήκει στις απλές υποερωτήσεις. Οι κωδικοί των προϊόντων µε τιµή µεγαλύτερη από 10000 µπορούν να αποµονωθούν από το αρχείο parts ανεξάρτητα από την υπόλοιπη ερώτηση. Να παρατηρήσουµε ότι κάθε σύνδεση µπορεί να γραφεί και ως µια σειρά ενκυβωτισµένων ερωτήσεων, όχι όµως και το αντίθετο. Η σύνδεση, επίσης, είναι πιο γρήγορη από άποψη εκτέλεσης. Βέβαια, το ποιος τρόπος θα χρησιµοποιηθεί, τελικά, εξαρτάται από τη φύση της ερώτησης και το πως µπορεί να διατυπωθεί µε µεγαλύτερη σαφήνεια η ερώτηση. Τελεστές ALL και ANY Η χρήση των τελεστών ALL και ANY γίνεται µε παρόµοιο τρόπο. Ο τελεστής ALL δίνει αληθή τιµή όταν για το σύνολο των τιµών στις οποίες εφαρµόζεται ισχύει η συνθήκη που εξετάζεται. Αντίθετα ο τελεστής ANY δίνει αληθή τιµή όταν για µία τουλάχιστον από τις τιµές του συνόλου στο οποίο εφαρµόζεται ισχύει η συνθήκη που εξετάζεται. Μπορούν να χρησιµοποιηθούν και οι δύο τελεστές σε συνδυασµό µε τους τελεστές σύγκρισης =, <>, >, <, >=, <=. Για παράδειγµα η προηγούµενη εντολή που έδωσε τους αριθµούς των παραγγελιών που περιλαµβάνουν προϊόντα µε τιµή µεγαλύτερη από 10000, µπορεί να διατυπωθεί µε τη χρήση του τελεστή ANY ως SELECT DISTINCT ordernum FROM orderlines WHERE partcode =ΑΝΥ (SELECT partcode FROM parts WHERE price > 10000 Με την εντολή SELECT ordernum, p.partcode, price FROM orderlines o, parts p WHERE p.partcode = o.partcode AND price >= ALL ( SELECT price FROM parts µπορούµε να εντοπίσουµε σε ποιες παραγγελίες περιλαµβάνεται το προϊόν µε τη µεγαλύτερη τιµή. Τελεστής EXISTS Ο τελεστής EXISTS επιστρέφει πάντοτε αληθή ή ψευδή τιµή. Συντάσσεται πάντοτε µε υποερώτηση και επιστρέφει αληθή τιµή αν το αποτέλεσµα της υποερώτησης είναι ένα µη κενό σύνολο τιµών. Τη λειτουργία του τελεστή επηρεάζει το συνολικό αποτέλεσµα της υποερώτησης, αν επιστρέφει ή όχι τιµές,

3. Structured Query Language (SQL 18 παρά οι συγκεκριµένες τιµές. Για το λόγο αυτό, ο τελεστής EXISTS είναι ο µόνος στον οποίο επιτρέπεται η υποερώτηση να περιλαµβάνει το SELECT *. Για παράδειγµα για να εντοπίσουµε τους πελάτες που έχουν παραγγείλει το προϊόν 4 δίνουµε την εντολή SELECT DISTINCT custcode FROM orders o WHERE EXISTS ( SELECT * FROM orderlines ol WHERE ol.partcode = 4 AND o.ordernum = ol.ordernum Άλλη µία χρήση του τελεστή EXISTS παρουσιάζουµε στην παράγραφο 3.6 στην υλοποίηση της πράξης της ιαίρεσης της σχεσιακής άλγεβρας. 3.3.4 Σύνδεση Πινάκων Εσωτερική Σύνδεση ύο Πινάκων Η πράξη της σύνδεσης, όπως αναφέραµε και στο κεφάλαιο για τη σχεσιακή άλγεβρα, παρουσιάζει τα περιεχόµενα δύο πινάκων συνδεδεµένα µέσω κάποιας κοινής στήλης.. Η πιο συνηθισµένη µορφή σύνδεσης είναι η ισοσύνδεση, η οποία καθορίζεται µέσω της ισότητας δύο στηλών. Η υλοποίηση της πράξης στη SQL γίνεται µέσω της εντολής SELECT και του INNER JOIN. SELECT <προσδιορισµός_δεδοµένωων> FROM <πίνακας1> [<ψευδώνυµο>] INNER JOIN <πίνακας2> [<ψευδώνυµο>] ON <πίνακας1> <ψευδώνυµο> <τελεστής> <πίνακας2> <ψευδώνυµο> Είναι δυνατόν οι δύο πίνακες να περιέχουν στήλες µε τα ίδια ονόµατα. Για να προσδιορίσουµε τον πίνακα από τον οποίο προέρχονται οι στήλες που αναφέρουµε, τόσο στον <προσδιορισµό_δεδοµένων>, όσο και στη συνθήκη της εντολής, χρησιµοποιούµε το όνοµα του, πριν από το όνοµα της στήλης και τα χωρίζουµε µε µία τελεία. Για παράδειγµα ο προσδιορισµός cust.lname αναφέρεται στη στήλη lname του πίνακα cust. Στην περίπτωση που τα ονόµατα των πινάκων είναι µακροσκελή η πλήρης παράθεση τους δηµιουργεί προβλήµατα και κουράζει το χρήστη. Σ' αυτή την περίπτωση έχουµε την δυνατότητα αντί για το πραγµατικό όνοµα του πίνακα να χρησιµοποιήσουµε κάποιο ψευδώνυµο του. Η δήλωση του ψευδωνύµου γίνεται δίπλα στο όνοµα του πίνακα. Για παράδειγµα η εντολή SELECT orders.ordernum, orderdate, orders.custcode, lname, fname FROM orders INNER JOIN customer ON orders.custcode = customer.ordernum εµφανίζει τον πίνακα ordernum orderdate custcode lname fname ---------------------------------------------------- 1 15/09/94 1 ΑΘΑΝΑΣΙΟΥ ΕΛΕΥΘΕΡΙΟΣ 2 11/09/94 1 ΑΘΑΝΑΣΙΟΥ ΕΛΕΥΘΕΡΙΟΣ 3 16/09/94 2 ΠΑΠΑΕΜΑΝΟΥΗΛ ΚΩΣΤΑΣ 4 11/08/94 4 ΟΡΑΤΙΟΥ ΘΕΑΝΩ στον οποίο κάθε γραµµή του πίνακα orders συνδυάζεται µε τις γραµµές του πίνακα customer, που έχουν την ίδια τιµή στη στήλη custcode. Η διαφοροποίηση των δύο στηλών γίνεται µε την τοποθέτηση του ονόµατος του πίνακα πριν από το όνοµα της στήλης. Η ίδια εντολή µε τη χρήση ψευδωνύµων έχει τη µορφή SELECT o.ordernum, orderdate, o.custcode, lname, fname FROM orders o INNER JOIN customer c ON o.custcode = c.ordernum

3. Structured Query Language (SQL 19 Πέρα από τη διευκόλυνση στη γραφή της εντολής τα ψευδώνυµα εξυπηρετούν και µια πιο ουσιαστική ανάγκη. Υπάρχουν περιπτώσεις όπου χρειαζόµαστε να συνθέσουµε το περιεχόµενο ενός πίνακα µε τον εαυτό του. Όπως στην περίπτωση που θέλουµε να συνδυάσουµε ζευγάρια τιµών από την ίδια στήλη. Π.χ. ποιοι πελάτες, ανά δύο, εδρεύουν στην ίδια πόλη. Θα πρέπει, τότε, να υπάρχει κάποιος τρόπος ώστε να ξεχωρίζουν οι διαφορετικές αναφορές στον ίδιο πίνακα. Τη λύση σ' αυτό το πρόβληµα την δίνουν τα ψευδώνυµα. Με την εντολή SELECT o.custcode, o.lname, c.custcode, c.lname, c.city FROM customer o INNER JOIN customer c ON o.city = c.city παίρνουµε τον πίνακα custcode lname custcode lname city -------------------------------------------- 1 ΑΘΑΝΑΣΙΟΥ 1 ΑΘΑΝΑΣΙΟΥ ΑΘΗΝΑ 1 ΑΘΑΝΑΣΙΟΥ 5 ΤΕΛΑΚΟΥ ΑΘΗΝΑ 1 ΑΘΑΝΑΣΙΟΥ 6 ΣΤΑΘΟΥΛΗΣ ΑΘΗΝΑ 3 ΚΟΥΚΑ 3 ΚΟΥΚΑ ΧΑΝΙΑ 3 ΚΟΥΚΑ 4 ΟΡΑΤΙΟΥ ΧΑΝΙΑ 4 ΟΡΑΤΙΟΥ 3 ΚΟΥΚΑ ΧΑΝΙΑ 4 ΟΡΑΤΙΟΥ 4 ΟΡΑΤΙΟΥ ΧΑΝΙΑ 5 ΤΕΛΑΚΟΥ 1 ΑΘΑΝΑΣΙΟΥ ΑΘΗΝΑ 5 ΤΕΛΑΚΟΥ 5 ΤΕΛΑΚΟΥ ΑΘΗΝΑ 5 ΤΕΛΑΚΟΥ 6 ΣΤΑΘΟΥΛΗΣ ΑΘΗΝΑ 6 ΣΤΑΘΟΥΛΗΣ 1 ΑΘΑΝΑΣΙΟΥ ΑΘΗΝΑ 6 ΣΤΑΘΟΥΛΗΣ 5 ΤΕΛΑΚΟΥ ΑΘΗΝΑ 6 ΣΤΑΘΟΥΛΗΣ 6 ΣΤΑΘΟΥΛΗΣ ΑΘΗΝΑ Παρατηρούµε ότι η κάθε εγγραφή συνδυάζεται και µε τον εαυτό της. Για να εξαλείψουµε αυτό το φαινόµενο η εντολή γίνεται SELECT o.custcode, o.lname, c.custcode, c.lname, c.city FROM customer o INNER JOIN customer c ON o.city = c.city AND o.custcode <> c.custcode και το αποτέλεσµα περιορίζεται στον πίνακα custcode lname custcode lname city --------------------------------------------- 1 ΑΘΑΝΑΣΙΟΥ 5 ΤΕΛΑΚΟΥ ΑΘΗΝΑ 1 ΑΘΑΝΑΣΙΟΥ 6 ΣΤΑΘΟΥΛΗΣ ΑΘΗΝΑ 3 ΚΟΥΚΑ 4 ΟΡΑΤΙΟΥ ΧΑΝΙΑ 4 ΟΡΑΤΙΟΥ 4 ΚΟΥΚΑ ΧΑΝΙΑ 5 ΤΕΛΑΚΟΥ 1 ΑΘΑΝΑΣΙΟΥ ΑΘΗΝΑ 5 ΤΕΛΑΚΟΥ 6 ΣΤΑΘΟΥΛΗΣ ΑΘΗΝΑ 6 ΣΤΑΘΟΥΛΗΣ 1 ΑΘΑΝΑΣΙΟΥ ΑΘΗΝΑ 6 ΣΤΑΘΟΥΛΗΣ 5 ΤΕΛΑΚΟΥ ΑΘΗΝΑ όπου πάλι παρατηρούµε ότι το κάθε ζευγάρι παρουσιάζεται δύο φορές. Με την τελική µορφή της εντολής SELECT SELECT o.custcode, o.lname, c.custcode, c.lname, c.city FROM customer o INNER JOIN customer c ON o.city = c.city AND o.custcode < c.custcode παίρνουµε την τελική µορφή του πίνακα µε τα εντελώς απαραίτητα δεδοµένα. custcode lname custcode lname city --------------------------------------------- 1 ΑΘΑΝΑΣΙΟΥ 5 ΤΕΛΑΚΟΥ ΑΘΗΝΑ 1 ΑΘΑΝΑΣΙΟΥ 6 ΣΤΑΘΟΥΛΗΣ ΑΘΗΝΑ 3 ΚΟΥΚΑ 4 ΟΡΑΤΙΟΥ ΧΑΝΙΑ 5 ΤΕΛΑΚΟΥ 6 ΣΤΑΘΟΥΛΗΣ ΑΘΗΝΑ

3. Structured Query Language (SQL 20 Εξωτερική Σύνδεση Θα πρέπει να παρατηρήσουµε ότι στη σύνδεση δύο πινάκων εµφανίζονται µόνο οι γραµµές για τις οποίες υπάρχει αντιστοιχία ανάµεσα στους δύο πίνακες. Αν για κάποια γραµµή του ενός πίνακα δεν αντιστοιχεί κάποια γραµµή στον άλλο πίνακα αυτή δεν εµφανίζεται στο αποτέλεσµα της σύνδεσης. Υπάρχουν περιπτώσεις που θέλουµε όλες τις γραµµές ενός πίνακα συνδεδεµένες µε όσα στοιχεία υπάρχουν σε κάποιο άλλο πίνακα. Αυτή η µορφή σύνδεσης ονοµάζεται εξωτερική σύνδεση (outer join. SELECT <προσδιορισµός_δεδοµένωων> FROM <πίνακας1> [<ψευδώνυµο>] LEFT RIGHT [OUTER] JOIN <πίνακας2> [<ψευδώνυµο>] ON <πίνακας1> <ψευδώνυµο> <τελεστής> <πίνακας2> <ψευδώνυµο> Για παράδειγµα έστω ότι θέλουµε ένα κατάλογο µε όλα τα προϊόντα που διαθέτει η επιχείρηση µαζί µε τη συνολική ποσότητα που έχει παραγγελθεί για το καθένα. Η εντολή SELECT p.partcode, p.name, SUM(ol.qty AS totalqty FROM orderlines ol INNER JOIN parts p ON ol.partcode = p.partcode GROUP BY p.partcode, p.name θα µας εµφανίσει τον πίνακα partcode name totalqty ------------------------------ 1 ΚΑΛΤΣΕΣ Β123 9 2 ΚΑΛΤΣΕΣ Α123 9 3 ΠΟΥΚΑΜΙΣΟ 7 4 ΠΟΥΛΟΒΕΡ Α11 13 5 ΠΟΥΛΟΒΕΡ Α22 17 στον οποίο δεν περιλαµβάνονται τα προϊόντα για τα οποία δε υπάρχουν παραγγελίες. Για να περιληφθούν όλα τα προϊόντα στον κατάλογο η εντολή θα πρέπει να γίνει SELECT p.partcode, p.name, SUM(ol.qty AS totalqty FROM orderlines ol INNER JOIN parts p ON ol.partcode = p.partcode GROUP BY p.partcode, p.name UNION SELECT p.partcode, p.name, NULL FROM parts p WHERE NOT EXISTS (SELECT * FROM orderlines ol WHERE ol.partcode = p.partcode Χρησιµοποιώντας την ειδική µορφή της SELECT, η εξωτερική σύνδεση των πινάκων parts και orderlines πραγµατοποιείται µε την εντολή SELECT p.partcode, p.name, SUM(ol.qty AS totalqty FROM orderlines ol LEFT OUTER JOIN parts p ON ol.partcode = p.partcode GROUP BY p.partcode, p.name Ο τελικός πίνακας µε το αποτέλεσµα της εξωτερικής σύνδεσης είναι ο εξής: partcode name totalqty ------------------------------ 1 ΚΑΛΤΣΕΣ Β123 9 2 ΚΑΛΤΣΕΣ Α123 9 3 ΠΟΥΚΑΜΙΣΟ 7 4 ΠΟΥΛΟΒΕΡ Α11 13 5 ΠΟΥΛΟΒΕΡ Α22 17 6 ΖΩΝΗ ΑΝ ΡΙΚΗ 7 ΖΩΝΗ ΑΝ ΡΙΚΗ Α34 3.4 Ενέργειες Μεταβολής του Περιεχοµένου της Βάσης εδοµένων