Η Γλώσσα Ερωτημάτων και Χειρισμού Β.Δ. SQL

From EEYEM Pilot Wiki
Revision as of 13:33, 7 April 2016 by 192.168.200.242 (Talk) (GPE_5.18 Μεταβολή Πινάκων)

Jump to: navigation, search

Contents

ΚΕΦΑΛΑΙΟ 5

Η Γλώσσα Ερωτημάτων και Χειρισμού Β.Δ. SQL

Σκοπός

Έπειτα από την ανάλυση των σχεσιακών Β.Δ. η οποία προηγήθηκε, στο παρόν Κεφάλαιο αναλύεται η σύνταξη, η δομή και η χρησιμοποίηση της γλώσσας ερωτημάτων και χειρισμού Β.Δ. SQL. Μέσω της γλώσσας θα ορίζονται και θα μπορούν να διαχειρισθούν οι Πίνακες μιας Β.Δ., θα εισάγονται και θα μεταβάλλονται σ’ αυτούς δεδομένα και θα αξιοποιηθούν οι σχέσεις της Σχεσιακής Άλγεβρας (προηγούμενο Κεφάλαιο. Ιδιαίτερη προσοχή θα δοθεί στις μεθοδολογίες εξαγωγής δεδομένων από τους Πίνακες μιας σχεσιακής Β.Δ. μέσω Ερωτημάτων και υπο-Ερωτημάτων, την αξιοποίηση των Συναρτήσεων Συνάθροισης και τις Συνδέσεις.


Προσδοκώμενα Αποτελέσματα

Όταν ολοκληρώσετε τη μελέτη του Κεφαλαίου, θα μπορείτε να:

● συντάσσετε εντολές σε SQL, ακόμα και χρησιμοποιώντας ύφος

● κατανοήσετε τον τρόπο και την ευκολία συνεργασίας των γλωσσών Ερωτημάτων και Χειρισμού των Β.Δ. με τα Σ.Δ.Β.Δ.

● περιγράψετε τις εντολές της γλώσσας Ερωτημάτων και Χειρισμού των Β.Δ. SQL οι οποίες χρησιμοποιούνται για τη δημιουργία/εισαγωγή, μεταβολή και διαγραφή Πινάκων και των δεδομένων τους, την αναζήτηση και παρουσίαση των δεδομένων καθώς και την υλοποίηση των σχέσεων της Σχεσιακής Άλγεβρας

● χρησιμοποιήσετε τις εντολές της SQL σε εμπεριστατωμένα παραδείγματα τα οποία αφορούν στη χρήση των δεδομένων της Β.Δ. η οποία αναπτύχθηκε στα προηγούμενα Κεφάλαια

● αξιοποιήσετε τις Β.Δ. οι οποίες αναπτύχθηκαν στα Σ.Δ.Β.Δ. MS-Access και Oracle, με βάση τα προηγούμενα, και διατίθενται προς χρήση


Έννοιες Κλειδιά

● Γλώσσες Ερωτημάτων και Χειρισμού Β.Δ. (query languages)

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

● Γλώσσα Χειρισμού Δεδομένων (data manipulation language)

● Συμβολοσειρά/αλφαριθμητικός χαρακτήρας (string)

● Μετονομασία (alias)


● Τύποι Δεδομένων (data type)

● Συναρτήσεις Συνάθροισης (aggregation function)

● Ερωτήματα (query) και υπο-Ερωτήματα (sub-query)

● Όψεις (view)

● Πρότυπη Γλώσσα (standard)


Εισαγωγικές Παρατηρήσεις

{περιγραφή ενοτήτων. Σχόλια πως θα βασισθώ στην Oracle με περιστασιακές αναφορές στην MS-Access. Κεφαλαία/μικρά σε εντολές, εισαγωγικά σε ονομασίες, χαρακτήρες στοίχισης}


GPE_5.1 Αρχές των Γλωσσών Ερωτημάτων και Χειρισμού Β.Δ.

{θα αφήσω το “5.1” όπως είναι αφαιρώντας τα της QBE και προσθέτοντας λίγα λόγια για το πρότυπο της MS-Access και της Oracle. Περισσότερα θα αναφέρω γι’ αυτές σε κατάλληλα Παραρτήματα}


ΜΕΡΟΣ Α’: ΔΗΜΙΟΥΡΓΙΑ Β.Δ. κ’ ΕΙΣΑΓΩΓΗ ΔΕΔΟΜΕΝΩΝ

GPE_5.2 Τύποι Δεδομένων

Έπειτα από τη μελέτη η οποία προηγήθηκε για τον Α’ Τόμο της Θεματικής Ενότητας ΠΛΗ-11, είσθε σε θέση να εκτιμήσετε την αξία των τύπων μεταβλητών για μια οποιαδήποτε γλώσσα προγραμματισμού (ενδεχομένως να έχετε επίσης μελετήσει και τον Β’ Τόμο της Θ.Ε. ΠΛΗ-10). Παρόμοια και κατά τη χρήση της SQL χρειάζεται να ορισθούν οι τύποι για τις μεταβλητές οι οποίες θα χρησιμοποιηθούν, με άλλα λόγια το είδος των δεδομένων τα οποία θα τοποθετηθούν η θα αναζητηθούν σε μια Β.Δ. Οι πιο χρησιμοποιούμενοι τύποι δεδομένων είναι:

- VARCHAR(θ): ο πιο απλός τύπος δεδομένων, χρησιμοποιείται κυρίως για τον ορισμό μεταβλητών με περιεχόμενο χαρακτήρες κειμένου (text -κείμενο- ή character -χαρακτήρες). Οι παρενθέσεις έχουν την έννοια πως θα πρέπει να ορισθεί και ο (ακέραιος) αριθμός των θέσεων (“θ”) τις οποίες θα συμπεριλαμβάνει η μεταβλητή. Συνήθως ο αριθμός αυτός περιορίζεται από το λειτουργικό σύστημα όπου έχει εγκατασταθεί το Σ.Δ.Β.Δ. (π.χ. 256 θέσεις). Δεν υπάρχει περιορισμός στο περιεχόμενο των μεταβλητών ή στη χρησιμοποιούμενη γραμματοσειρά. Οι μεταβλητές αυτού του τύπου ονομάζονται και αλφαριθμητικές.

- NUMERIC(θα, θδ): ο κύριος αριθμητικός τύπος δεδομένων (σε δεκαδική αναπαράσταση), χρησιμοποιείται για τον ορισμό μεταβλητών με περιεχόμενο αριθμούς ακεραίους ή πραγματικούς. Οι παρενθέσεις έχουν την έννοια πως θα πρέπει να ορισθεί ο (ακέραιος) αριθμός των ακεραίων θέσεων (“θα”) και ο (ακέραιος) αριθμός των δεκαδικών θέσεων (“θδ”) τις οποίες θα συμπεριλαμβάνει η μεταβλητή. Συνήθως οι αριθμοί αυτοί περιορίζονται από το λειτουργικό σύστημα όπου έχει εγκατασταθεί το Σ.Δ.Β.Δ. Πιθανά θα συναντήσετε και αριθμητικά δεδομένα τύπου REAL (απλοί πραγματικοί αριθμοί), FLOAT (πραγματικοί αριθμοί κινητής υποδιαστολής), DOUBLE PRECISION (πραγματικοί αριθμοί διπλής ακρίβειας), οι οποίοι χρησιμοποιούνται για τη μεγαλύτερη ακρίβεια αριθμητικών πράξεων (§GPE_5.χψ).


- INT: ο αριθμητικός τύπος δεδομένων για ακεραίους αριθμούς, χρησιμοποιείται για τον ορισμό μεταβλητών με αντίστοιχο περιεχόμενο. Δεν ανήκει στο σύνολο των τύπων δεδομένων της πρότυπης SQL αλλά υποστηρίζεται και από την Oracle και από την MS-Access (στην τελευταία ως INTEGER). Το μέγεθος των ακεραίων (ψηφία) ποικίλλει ανάλογα το λειτουργικό σύστημα όπου έχει εγκατασταθεί το Σ.Δ.Β.Δ., σπάνια ξεπερνά τις οκτώ (8) θέσεις.

- DATE: ο τύπος δεδομένων ημερομηνίας και ώρας, χρησιμοποιείται για τον ορισμό μεταβλητών με αντίστοιχο περιεχόμενο. Η ώρα αναπαρίσταται στην 24ωρη βάση της και η αναπαράσταση της ημερομηνίας επιβάλλεται από το λειτουργικό σύστημα όπου έχει εγκατασταθεί το Σ.Δ.Β.Δ.

- BOOLEAN: ο πιο κλασικός δίτιμος τύπος δεδομένων, χρησιμοποιείται για τον ορισμό μεταβλητών οι οποίες μπορούν να έχουν μόνο δύο (2) τιμές: TRUE (αληθή) ή FALSE (ψευδή). Δεν ανήκει στο σύνολο των τύπων δεδομένων της πρότυπης SQL αλλά υποστηρίζεται και από την Oracle και από την MS-Access.

- NULL: δεν αποτελεί ακριβώς τύπο δεδομένων αλλά χαρακτηρισμό μιας μεταβλητής (οποιουδήποτε τύπου) ως κενής (χωρίς περιεχόμενο από το χρήστη ή από το λειτουργικό σύστημα). Παρόμοια ορίζεται και ο τύπος περιεχομένου NOT NULL για τον χαρακτηρισμό μεταβλητών με τιμή. Και οι δύο χαρακτηρισμοί χρησιμοποιούνται κατά την αναζήτηση δεδομένων σε μια Β.Δ.

Προκειμένου να ορισθούν οι μεταβλητές κατά τύπο δεδομένων, απαιτούνται και οι κατάλληλες εντολές (δείτε το §GPE_5.3).

GPE_5.3 Συναρτήσεις Αναπαράστασης Τύπων Δεδομένων

Στα επόμενα θα γίνει φανερό πως απλά με τον ορισμό των τύπων δεδομένων στις μεταβλητές δεν είναι δυνατόν να τύχουν χειρισμό όλα τα δεδομένα. Για παράδειγμα, ο τύπος δεδομένων ημερομηνία και ώρα εκφράζει μια ποσότητα πληροφορίας την οποία δεν μεταχειρίζονται με τον ίδιο τρόπο όλοι οι άνθρωποι, τα κράτη ή ακόμα και οι διεθνείς οργανισμοί. Η ημερομηνία 11 Ιανουαρίου 2004, λ.χ. μπορεί να εκφρασθεί συντετμημένη ως 11/1/04 σε ελληνική αναπαράσταση, αλλά η επίσημη συντετμημένη γραφή της είναι 11-01-2004. Ταυτόχρονα, μια τέτοια γραφή δεν έχει (το ίδιο) νόημα για τις χώρες οι οποίες ακολουθούν το αγγλοσαξωνικό σύστημα μέτρων και σταθμών (ενώ η γραφή 01-11-2004 θα αναφέρονταν στην παραπάνω ημερομηνία). Ως ένα βαθμό το ίδιο πρόβλημα ισχύει και για δεδομένα ώρας. Η γραφή της σε 24ωρη βάση λύνει το πρόβλημα αλλά, παρ’ όλ’ αυτά, υπάρχουν περιπτώσεις όπου προτιμάται η σε 12ωρη βάση για τη γραφή της.


Το πρόβλημα περιπλέκεται και λόγω των ρυθμίσεων του λειτουργικού συστήματος όπου έχει εγκατασταθεί το Σ.Δ.Β.Δ.: συνήθως το τελευταίο “δανείζεται” τις ρυθμίσεις του πρώτου και χειρίζεται τέτοια δεδομένα με “αυτόματο” τρόπο επιτείνοντας στη σύγχυση των μορφών. Είναι φανερό πως απαιτείται η ύπαρξη δομών μετατροπής της ημερομηνίας και της ώρας σε διαφορετικά συστήματα αναπαράστασής τους. Η πρότυπη μορφή της γλώσσας SQL δεν προσφέρει ιδιαίτερα “εργαλεία” για την αντιμετώπιση του προβλήματος. Η έκδοση της γλώσσας για την Oracle περιέχει τις Συναρτήσεις “TO_DATE()” και “TO_CHAR()”.


Η Συνάρτηση “TO_DATE()” του Σ.Δ.Β.Δ. Oracle:

Η Συνάρτηση συντάσσεται ως εξής:

TO_DATE('<ημερομηνία>', '<μορφή ημερομηνίας>')

Τα ορίσματά της είναι:

- <ημερομηνία>: η χρονιά ή/και ο μήνας ή/και η ημέρα (αριθμητικά) ή η ονομασία ενός Κατηγορήματος με τον αντίστοιχο τύπο δεδομένων

- η σειρά ημέρας και μήνα στην ημερομηνία δεν τίθεται στο Σ.Δ.Β.Δ.

- <μορφή ημερομηνίας>: η ακριβής μορφή η οποία ζητείται.

Για παράδειγμα, για να εισαχθεί η 11η Γενάρη 2004 (με τα στοιχεία της ημερομηνίας στοιχισμένα με αυτή τη σειρά), θα χρησιμοποιηθεί η Συνάρτηση “TO_DATE()” ως εξής (συνήθως η ώρα παραλείπεται):

TO_DATE('11/01/2004', 'dd/mm/yyyy hh24:mi:ss')

όπου:

- το πεδίο “dd” δηλώνει ημέρα παρουσιαζόμενη με δύο (2) ψηφία

- το πεδίο “mm” δηλώνει μήνα παρουσιαζόμενο με δύο (2) ψηφία

- το πεδίο “yyyy” δηλώνει έτος παρουσιαζόμενο με τέσσερα (4) ψηφία

- το πεδίο “hh24” δηλώνει ώρα σε 24ωρη βάση (το “hh12” σε 12ωρη)

- το πεδίο “mi” δηλώνει πρώτα λεπτά

- το πεδίο “ss” δηλώνει δευτερόλεπτα.

Αν τεθεί μόνο η δεκαετία, η Συνάρτηση συντάσσεται ως εξής:

TO_DATE('11/01/04', 'dd/mm/yy').

Αν τεθεί η μορφή αγγλοσαξωνικά (πλήρης χρονιά), τότε:

TO_DATE('01/11/04', 'mm/dd/yyyy') κ.ο.κ.


Αν σε πεδίο ημερομηνίας και ώρας δίνεται μόνο το έτος, σ’ αυτή την περίπτωση τα πεδία ημέρας και μήνα δε θα δηλώνονταν αλλά η Oracle αυτόματα θα τα θέσει στην πρώτη ημέρα του τρέχοντος μήνα).


Η Συνάρτηση “TO_CHAR()” του Σ.Δ.Β.Δ. Oracle:

Η Συνάρτηση χρησιμοποιείται κυρίως για τη μετατροπή τύπων δεδομένων ημερομηνίας και ώρας σε αλφαριθμητικές για την αναζήτηση χαρακτηριστικών γνωρισμάτων μερικών τιμών. Συντάσσεται ως εξής:

TO_CHAR(<ημερομηνία>, '<μορφή ημερομηνίας>')

Τα ορίσματά της είναι:

- <ημερομηνία>: η χρονιά ή/και ο μήνας ή/και η ημέρα (αριθμητικά) ή η ονομασία ενός Κατηγορήματος με τον αντίστοιχο τύπο δεδομένων

- η σειρά ημέρας και μήνα στην ημερομηνία δεν τίθεται στο Σ.Δ.Β.Δ.

- <μορφή ημερομηνίας>: η ακριβής μορφή η οποία ζητείται.

Τα πεδία της <μορφής ημερομηνίας> είναι όπως ακριβώς αναλύθηκαν και κατά την παρουσίαση της Συνάρτησης “TO_DATE()”. Το αποτέλεσμα της Συνάρτησης “TO_CHAR” είναι η μετατροπή του τύπου δεδομένων ημερομηνίας και ώρας σε αλφαριθμητικού, με άλλα λόγια το αποτέλεσμα είναι σύμβολα και όχι γνωρίσματα χρόνου. Η Συνάρτηση χρησιμοποιείται και στη μετατροπή των άλλων τύπων δεδομένων σε αλφαριθμητικές, αλλά η παρουσίαση αυτή δεν κρίνεται σκόπιμη.

GPE_5.4 Δημιουργία Πινάκων

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


CREATE TABLE <ονομασία του Πίνακα> (<ονομασία Κατηγορήματος1> <τύπος μεταβλητής Κατηγορήματος1>, <ονομασία Κατηγορήματος2> <τύπος μεταβλητής Κατηγορήματος2>, ... <ονομασία Κατηγορήματοςx> <τύπος μεταβλητής Κατηγορήματοςx> NOT NULL, ... <ονομασία Κατηγορήματοςy> <τύπος μεταβλητής Κατηγορήματοςy> NOT NULL, ... <ονομασία Κατηγορήματοςz> <τύπος μεταβλητής Κατηγορήματοςz> NOT NULL, ... <ονομασία Κατηγορήματοςn> <τύπος μεταβλητής Κατηγορήματοςn>,

PRIMARY KEY (<ονομασία Κατηγορήματοςx>, <ονομασία Κατηγορήματοςy>, ..., <ονομασία Κατηγορήματοςz>))

Τα στοιχεία της εντολής τα οποία περικλείονται από τα σύμβολα (ανισότητας) “<” και “>” αποτελούν υποχρεωτικές ονομασίες του Πίνακα, του Κλειδιού και των Κατηγορημάτων του. Οι ονομασίες αυτές είναι αλφαριθμητικοί χαρακτήρες (συνδυασμός γραμμάτων, αριθμών και συμβόλων οποιασδήποτε γραμματοσειράς). Στις ονομασίες μπορούν να χρησιμοποιηθούν κεφαλαία ή μικρά γράμματα, τονισμένα γράμματα, ειδικοί χαρακτήρες κ.τ.λ. (το αν θα φαίνονται με κατανοητό τρόπο κατά την αναζήτηση δεδομένων δεν είναι του παρόντος καθώς η “σωστή” εμφάνισή τους εξαρτάται από το λειτουργικό σύστημα όπου έχει εγκατασταθεί το Σ.Δ.Β.Δ. και τις ρυθμίσεις αυτού). Στην παραπάνω εντολή ορίζονται 1, 2, ..., x, y, ..., z..., n Κατηγορήματα (n ≥ 1, το “x” ή/και το “y”ή/και το “z”μπορεί να είναι ίσο με το “n” ή ίδια μεταξύ τους) εκ των οποίων τα Κατηγόρημαx, Κατηγόρημαy, ..., Κατηγόρημαz έχουν ορισθεί ως το Κλειδί του Πίνακα. Οι τύποι μεταβλητών ορίζονται με βάση όσα ειπώθηκαν στο §GPE_5.2. Ειδικά τα Κατηγορήματα τα οποία αποτελούν το Κλειδί του Πίνακα κατά τον ορισμό του οφείλουν να τεθούν ως μη κενά (NOT NULL) κατά τα γνωστά (προηγούμενα Κεφάλαια). Αυτό θα “υποχρεώσει” το Σ.Δ.Β.Δ. να ελέγχει πως κατά την εισαγωγή δεδομένων στον Πίνακα αυτά θα λαμβάνουν τιμές μη κενού περιεχομένου από το χρήστη ή το λειτουργικό σύστημα. Ως μη κενού περιεχομένου μεταβλητές μπορούν να ορισθούν οποιαδήποτε άλλα Κατηγορήματα επιθυμεί ο χρήστης (και όχι μόνο τα Κλειδιά του Πίνακα). Τέλος, αν ο Πίνακας χρησιμοποιεί πάνω από ένα (1) Κατηγόρημα ως Κλειδί, αυτό δηλώνεται έπειτα από την εντολή PRIMARY KEY και τα Κατηγορήματα αυτά ξεχωρίζουν με απλά κόμματα (“,”).

Παράδειγμα GPE_5.1

Έστω πως πρέπει να ορισθεί στην SQL ο Πίνακας (προσαρμοσμένο Ερώτημα από την Εργασία Ε3 της Ακαδημαϊκής Περιόδου 2003 - ’04):

Βιβλίο

ΚωδΒΛ Τίτλος Σελ Τιμή ΗμΚυκλ ΚωδΕΟ ΚωδΚΓ




Τα Κατηγορήματα του Πίνακα περιγράφουν ένα βιβλίο. Είναι τα:

- “ΚωδΒΛ”, τύπου μεταβλητής χαρακτήρα κειμένου, Κλειδί

- “Τίτλος”, τύπου μεταβλητής χαρακτήρα κειμένου

- “Σελ”, τύπου μεταβλητής αριθμητικού (ακέραιου)

- “Τιμή”, τύπου μεταβλητής αριθμητικού (πραγματικού)

- “ΗμΚυκλ”, τύπου μεταβλητής ημερομηνίας και ώρας

- “ΚωδΕΟ”, τύπου μεταβλητής χαρακτήρα κειμένου

- “ΚωδΚΓ”, τύπου μεταβλητής χαρακτήρα κειμένου

Η εντολή θα μπορούσε να είναι η εξής:

CREATE TABLE Βιβλίο (ΚωδΒΛ VARCHAR(4) NOT NULL, Τίτλος VARCHAR(40), Σελ INT, Τιμή NUMERIC(5,2) NOT NULL, ΗμΚυκλ DATE, ΚωδΕΟ VARCHAR(4), ΚωδΚΓ VARCHAR(4), PRIMARY KEY(ΚωδΒΛ))

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

1. Η εκφώνηση του παραδείγματος (και η Εργασία) δεν αποσαφήνιζαν τον αριθμό θέσεων για τα Κατηγορήματα “ΚωδΒΛ”, “ΚωδΕΟ” και “ΚωδΚΓ”. Η επιλογή τεσσάρων (4) αριθμητικών (ακέραιων) θέσεων για τους αλφαριθμητικούς χαρακτήρες είναι αυθαίρετη.

2. Το Κατηγόρημα “Σελ” είναι φανερό πως αναφέρεται στον αριθμό των σελίδων του βιβλίου. Θα μπορούσε να έχει ορισθεί και με την εντολή NUMERIC (3,0). Σε αυτή την περίπτωση ο αριθμός των σελίδων θα ανήκε στο (ακέραιο) διάστημα [0, ..., 999] (χωρίς δεκαδικές θέσεις).

3. Το Κατηγόρημα “Τιμή” είναι φανερό πως αναφέρεται στην αγοραστική αξία του βιβλίου. Ορίσθηκε με δύο (2) δεκαδικές (το ευρώ έχει ως ελάχιστο υπο-πολλαπλάσιο το ένα λεπτό ή 0.01 της αξίας του) και πέντε (5) ακέραιες θέσεις (η τιμή του έγκειται στο διάστημα [0.00, …, 99999.99]).

4. Το Κατηγόρημα “ΗμΚυκλ” είναι φανερό πως αναφέρεται στην ημέρα κυκλοφορίας του βιβλίου. Υπενθυμίζεται πως ο αυτός ο τύπος μεταβλητής “εισάγει” και ώρα κυκλοφορίας στο Πεδίο του Πίνακα.

5. Ο Πίνακας χαρακτηρίζεται από ένα (1) Κατηγόρημα ως Κλειδί (το “ΚωδΒΛ”) το οποίο ορίσθηκε ως μη κενού περιεχομένου. Επίσης, το ίδιο συνέβει και με το Κατηγόρημα “Τιμή” το οποίο δεν αποτελεί Κλειδί.

GPE_5.5 Εισαγωγή Δεδομένων σε Πίνακες

Έπειτα από τον ορισμό των Πινάκων, των Κλειδιών και των Κατηγορημάτων σε μια Β.Δ. (για τα τελευταία έχουν ορισθεί και οι τύποι των δεδομένων τους), δημιουργήθηκε η δομή της. Σειρά έχει η συμπλήρωση των Πινάκων με δεδομένα. Διακρίνονται οι περιπτώσεις:

Εισαγωγή νέων δεδομένων (κυρίως από το χρήστη)

Είναι και η πιο απλή. Η γενική μορφή της εντολής ακολουθεί:

INSERT INTO <ονομασία Πίνακα> VALUES (<Δεδομένο Πεδίου1>, <Δεδομένο Πεδίου2>, ..., <Δεδομένο Πεδίουn>)

ΠΡΟΣΟΧΗ: Τα δεδομένα αλφαριθμητικού τύπου οφείλουν να εισάγονται εντός απλών (και όχι καλλιγραφικών), μονών (και όχι διπλών) εισαγωγικών (π.χ. 'Βόλος' και όχι Βόλος)

Για την περίπτωση ταυτόχρονης εισαγωγής πολλών γραμμών σε Πίνακα, μπορεί να χρησιμοποιηθεί η γενική μορφή της εντολής:

INSERT INTO <ονομασία Πίνακα> VALUES (<Δεδομένο1 Πεδίου1>, <Δεδομένο1 Πεδίου2>, ..., <Δεδομένο1 Πεδίουn>; <Δεδομένο2 Πεδίου1>, <Δεδομένο2 Πεδίου2>, ..., <Δεδομένο2 Πεδίουn>; ... (<Δεδομένοm Πεδίου1>, <Δεδομένοm Πεδίου2>, ..., <Δεδομένοm Πεδίουn>)

Γενικά ισχύει πως n ≠ m.

ΠΡΟΣΟΧΗ: Η παραπάνω εντολή δεν υποστηρίζεται από τα Σ.Δ.Β.Δ. Oracle και MS-Access. Ειδικά για το πρώτο, όμως, υποστηρίζεται η χρήση αρχείων κειμένου

Τέλος, ανάλογα με το λειτουργικό σύστημα όπου έχει εγκατασταθεί το Σ.Δ.Β.Δ., ακόμα και οι μεταβλητές τύπου ημερομηνίας και ώρας οφείλουν να συνταχθούν με συγκεκριμένο τρόπο. Περισσότερα παραδείγματα στα επόμενα, αφού αναλυθούν οι κατάλληλες δομές (§GPE_5.χψ).


Εισαγωγή δεδομένων τα οποία έχουν ήδη εισαχθεί σε άλλους Πίνακες (έπειτα από κατάλληλη αναζήτησή τους)

Δεν αποτελεί απλή περίπτωση καθώς πρέπει να προηγηθεί η αναζήτηση δεδομένων στους άλλους Πίνακες της Β.Δ. Θα συζητηθεί (§GPE_5.χψ) έπειτα από την ανάλυση των εντολών αναζήτησης δεδομένων.


Εισαγωγή νέων και ήδη εισαχθέντων δεδομένων

Εφ’ όσον αναλυθεί η προηγούμενη μέθοδος, η κατάλληλη εντολή αποτελεί εξέλιξή της. Θα αναλυθεί και αυτή στη συνέχεια (§GPE_5.χψ).

ΜΕΡΟΣ Β’: ΑΝΑΖΗΤΗΣΗ ΔΕΔΟΜΕΝΩΝ

GPE_5.6 Αναζήτηση Δεδομένων σε Πίνακες

Η αναζήτηση δεδομένων σε Πίνακες με τη χρήση της SQL βασίζεται στη χρήση μιας εντολής. Η γενική μορφή της είναι:

SELECT <Κατηγόρημα1>, <Κατηγόρημα2>, <Κατηγόρημαn>

FROM <Πίνακας1>, <Πίνακας2>, ..., <Πίνακαςm>

WHERE (<Κριτήριο1>, <Κριτήριο2>, ..., <Κριτήριοk>)

Είναι φανερό πως η εντολή αναζήτησης αποτελείται κύρια από τρία (3) τμήματα, την επιλογή Κατηγορημάτων, την υπόδειξη των Πινάκων στους οποίους θα αναζητηθούν τα δεδομένα και τη σύνταξη των Κριτηρίων της αναζήτησης (γενικά, n ≠ m, n ≠ k και m ≠ k). Τα αποτελέσματα της εντολής αναζήτησης τοποθετούνται σε Πίνακα στη μνήμη την οποία διαχειρίζεται το Σ.Δ.Β.Δ. όπου στήλες του είναι τα επιλεγέντα Κατηγορήματα και γραμμές τα δεδομένα των Πινάκων της Β.Δ. τα οποία “υπακούουν” στα λογής Κριτήρια.


Εντολή αναζήτησης δεδομένων - Τμήμα επιλογής Κατηγορημάτων

Στο τμήμα αυτό επιλέγονται Κατηγόρημα(τα) από το(α) οποίο(α) το(α) Πεδίο(α) ο χρήστης θέλει να “τραβήξει” τιμές της Β.Δ. Η σύνταξη:

SELECT <Κατηγόρημα1>, <Κατηγόρημα2>, <Κατηγόρημαn>

(απλή) προτιμάται όταν τα Κατηγορήματα προέρχονται από τον ίδιο Πίνακα.

Σε αντίθετη περίπτωση είναι καλό να χρησιμοποιείται η ακόλουθη σύνταξη:

SELECT <ονομασία Πίνακαx>.<Κατηγόρημαy>, ...

(σύνθετη) για κάθε Κατηγόρημα χωριστά (η εντολή θα λειτουργήσει και πιο γρήγορα). Οπωσδήποτε ξεχωρίζουν μεταξύ τους με κόμματα (“,”). Στην περίπτωση όπου ο χρήστης θέλει να “τραβήξει” τιμές από όλα τα Κατηγορήματα ενός (1) Πίνακα, η σύνταξη αυτού του τμήματος γίνεται:

SELECT *


Εντολή αναζήτησης δεδομένων - Τμήμα επιλογής Πινάκων

Στο τμήμα αυτό ο χρήστης επιλέγει τον(ους) Πίνακα(κες) από τα Πεδία του(ων) οποίου(ων) θέλει να “τραβήξει” τιμές της Β.Δ. Η σύνταξη:

FROM <ονομασία Πίνακα1>, ...


Εντολή αναζήτησης δεδομένων - Τμήμα σύνταξης Κριτηρίων

Είναι και το πιο σημαντικό τμήμα της εντολής αναζήτησης. Τα Κριτήρια βασίζονται στις κάτωθι έξι (6) λογικές πράξεις (συγκρίσεις):


- ισότητα (“=”) ενός Πεδίου με μία (1) <συγκεκριμένη τιμή>

- το μικρότερο (“<”) ενός Πεδίου με μία (1) <συγκεκριμένη τιμή>

- το μεγαλύτερο (“>”) ενός Πεδίου με μία (1) <συγκεκριμένη τιμή>

- το μικρότερο/ίσο (“≤”) ενός Πεδίου με μία (1) <συγκεκριμένη τιμή>

- το μεγαλύτερο/ίσο (“≥”) ενός Πεδίου με μία (1) <συγκεκριμένη τιμή>

- ανισότητα (“!=”) ενός Πεδίου με μία (1) <συγκεκριμένη τιμή> (το Σ.Δ.Β.Δ. MS-Access υποστηρίζει το σύμβολο “<>”).

όπου η <συγκεκριμένη τιμή> μπορεί να τεθεί από το χρήστη (τιμή) ή να προέρχεται από άλλο Πεδίο ενός Πίνακα της Β.Δ. (ονομασία Κατηγορήματος η οποία αναφέρεται με απλή ή σύνθετη σύνταξη). Κατά τα γνωστά, διαφορετικά Κριτήρια μπορούν να συνδυασθούν με τη χρήση των λογικών τελεστών AND, OR και NOT:


- AND: Κριτήρια τα οποία συζεύγονται οφείλουν να ισχύουν όλα μαζί (η λογική πράξη να είναι αληθής) ώστε το σύνολό τους να είναι αληθές

- OR: Σε Κριτήρια τα οποία διαζεύγονται αρκεί το ένα (1) να ισχύει (η λογική πράξη να είναι αληθής) ώστε το σύνολό τους να είναι αληθές

- NOT: Παρ’ ότι δεν συνδυάζει διαφορετικά Κριτήρια (εφαρμόζεται μόνο σε ένα -1), χρησιμοποιείται για την άρνηση μιας λογικής πράξης (στην ουσία η σύγκριση γίνεται με το αντίθετο του Κριτηρίου το οποίο συντάσσεται). Κατά τη χρήση του τελεστή NOT απαιτείται και η χρήση του συνδέσμου “IN”, οπότε και η σύνταξη του τελεστή γίνεται NOT IN.

ΚωδΒΛ Τίτλος Σελ Τιμή ΗμΚυκλ ΚωδΕΟ ΚωδΚΓ

Παράδειγμα 5.2

Έστω ο Πίνακας (προσαρμοσμένο Ερώτημα από την Εργασία Ε3 της Ακαδημαϊκής Περιόδου 2003 - ’04):

Βιβλίο

ΚωδΒΛ Τίτλος Σελ Τιμή ΗμΚυκλ ΚωδΕΟ ΚωδΚΓ
ΒΛ01 Η Ιστορία του Βυζαντίου 300 40 31-Δεκ-60 ΕΟ01 ΚΓ01
ΒΛ02 Διαφορικός Λογισμός 400 60 12-Μαΐ-70 ΕΟ02 ΚΓ03
ΒΛ03 Κβαντική Φυσική 400 70 11-Νοε-71 ΕΟ02 ΚΓ04
ΒΛ04 Γενετική 600 100 13-Οκτ-90 ΕΟ03 ΚΓ06
ΒΛ05 Αρχαία Ελλάδα 500 80 30-Σεπ-90 ΕΟ04 ΚΓ01
ΒΛ06 Βάσεις Δεδομένων 250 40 02-Φεβ-90 ΕΟ05 ΚΓ05
ΒΛ07 Δίκτυα Υπολογιστών 400 90 06-Ιουλ-91 ΕΟ05 ΚΓ05
ΒΛ08 Τα Σπήλαια της Ελλάδας 350 80 09-Σεπ-92 ΕΟ04 ΚΓ02



Ζητούνται τα εξής:

1. Ποια είναι τα περιεχόμενα του Πίνακα;

2. Ποια είναι τα βιβλία με περισσότερες από 400 σελίδες;

3. Ποια είναι τα βιβλία με περισσότερες από 300 σελίδες τα οποία στοιχίζουν λιγότερο από 70€; Εμφανίσατε μόνο τίτλο, σελίδες και τιμή.

Οι εντολές σε SQL είναι:

1. SELECT * FROM Βιβλίο Το αποτέλεσμα είναι ο ίδιος ο Πίνακας {Βιβλίο}


2. SELECT * FROM Βιβλίο WHERE (Σελ > 400) Το αποτέλεσμα είναι ο ακόλουθος Πίνακας του Σ.Δ.Β.Δ.:

ΚωδΒΛ Τίτλος Σελ Τιμή ΗμΚυκλ ΚωδΕΟ ΚωδΚΓ
ΒΛ04 Γενετική 600 100.00 13-Οκτ-90 ΕΟ03 ΚΓ06
ΒΛ05 Αρχαία Ελλάδα 500 80.00 30-Σεπ-90 ΕΟ04 ΚΓ01



3. SELECT Τίτλος, Σελ, τιμή

FROM Βιβλίο

WHERE ((Σελ > 400) AND (Τιμή < 70))

Το αποτέλεσμα είναι ο ακόλουθος Πίνακας του Σ.Δ.Β.Δ.:

Τίτλος Σελ Τιμή
Διαφορικός Λογισμός 400 60.00

GPE_5.7 Πράξεις σε Πίνακες

Όπως είδατε και στο προηγούμενα, ορίζονται πράξεις σε Πίνακες (όπως η Ένωση, η Τομή, η Διαφορά, το Καρτεσιανό γινόμενο και οι λογής Συνδέσεις). Ορίζονται και μεταξύ των Κατηγορημάτων στον ίδιο ή σε διαφορετικούς Πίνακες, πάλι, ανάλογα με τον τύπο των δεδομένων τους.


Πράξεις Πινάκων:


Η βασική εντολή μέσω της οποία πραγματοποιούνται οι πράξεις είναι, πάντα, η εντολή αναζήτησης (“SELECT”), με κατάλληλη σύνταξη. Η πράξη εφαρμόζεται σε μία (1) στήλη του κάθε Πίνακα ή στα αποτελέσματα δύο (2) διαφορετικών εντολών αναζήτησης (τα οποία, και πάλι, οφείλουν να είναι μία (1) στήλη). Η γενική μορφή της εντολής, είναι:

SELECT <εντολή αναζήτησης1>

<Πράξη Πίνακα>

SELECT <εντολή αναζήτησης2>


Η <Πράξη Πίνακα> μπορεί να είναι:

- Ένωση: Η <Πράξη Πίνακα> γίνεται UNION

- Τομή: Η <Πράξη Πίνακα> γίνεται INTERSECT (δεν υποστηρίζεται από την MS-Access)

- Διαφορά: Η <Πράξη Πίνακα> γίνεται EXCEPT (δεν υποστηρίζεται από την MS-Access)

- Καρτεσιανό γινόμενο: Δίνεται από την εντολή:

SELECT <Κατηγόρημα(τα) ή και όλον τον Πίνακα1>, < Κατηγόρημα(τα) ή και όλον τον Πίνακα2> FROM Πίνακα1, Πίνακα2

- Καρτεσιανό γινόμενο: Θα καλυφθούν στα επόμενα (§GPE_5.χψ).


Αριθμητικές Πράξεις σε Πεδία Πινάκων:

Η βασική εντολή μέσω της οποία πραγματοποιούνται αυτές οι πράξεις είναι, φυσικά, η εντολή αναζήτησης (“SELECT”), με κατάλληλη σύνταξη. Η πράξη εφαρμόζεται σε μία (1) στήλη του κάθε Πίνακα ή στα αποτελέσματα δύο (2) διαφορετικών εντολών αναζήτησης (τα οποία, και πάλι, οφείλουν να είναι μία (1) στήλη). Η γενική μορφή της εντολής, είναι:

SELECT (<ονομασία Πίνακα1>.<Κατηγόρημα > <Αριθμητική Πράξη> <ονομασία Πίνακα2>.<Κατηγόρημα1>) FROM < ονομασία Πίνακα1>, < ονομασία Πίνακα2>

Στα παραπάνω να σημειωθεί πως δεν υπάρχει περιορισμός το <ονομασία Πίνακα2>.<Κατηγόρημα 2> να μην είναι το ίδιο με το <ονομασία Πίνακα1>.< Κατηγόρημα 1> (είναι χωρίς νόημα, όμως). Κατά τον υπολογισμό των πράξεων θα πρέπει να τηρούνται τα:

1. Τα εμπλεκόμενα Κατηγορήματα πρέπει να έχουν τον ίδιο Τύπο Δεδομένων. Επιτρέπονται πράξεις μεταξύ αριθμών άλλων τύπων (λ.χ. ακεραίων και πραγματικών αριθμών) αλλά η ακρίβεια είναι υπολογισμού αβέβαιη και εξαρτάται τόσο από το λειτουργικό σύστημα όπου έχει εγκατασταθεί το Σ.Δ.Β.Δ. όσο και τους εμπλεκόμενους τύπους δεδομένων.

2. Οι πράξεις υπολογίζονται με τα Πεδία να θεωρούνται συμμιγείς αριθμοί. Π.χ. η πράξη 13/02/2004 - 13/12/2003 έχει ως αποτέλεσμα 31 (ημέρες). Να σημειωθεί πως τα δίσεκτα έτη υπολογίζονται σωστά.

3. Στις πράξεις μπορούν να εμπλακούν τα αριθμητικά αποτελέσματα Συναρτήσεων Συνάθροισης (§GPE_5.8) και η όλη εντολή αναζήτησης να συμπεριλαμβάνει και πολύπλοκα κριτήρια αναζήτησης ή Συνδέσεις.

Η <Αριθμητική Πράξη > μπορεί να είναι:


- Πρόσθεση: “+”

- Αφαίρεση: “-”

- Πολλαπλασιασμός: “*”

- Διαίρεση: “/”

- Ύψωση σε Δύναμη: Δεν υπάρχει στην πρότυπη SQL. Το Σ.Δ.Β.Δ. Oracle διαθέτει ειδική αριθμητική συνάρτηση για την υλοποίηση της πράξης (“POWER(m, n) όπου “m” είναι η βάση και “n” ο εκθέτης”), ενώ το Σ.Δ.Β.Δ. MS-Access υποστηρίζει τη χρήση του συμβόλου“^”.

Παράδειγμα 5.3

Έστω ο Πίνακας (προσαρμοσμένο Ερώτημα από την Εργασία Ε3 της Ακαδημαϊκής Περιόδου 2003 - ’04):


Βιβλίο

ΚωδΒΛ Τίτλος Σελ Τιμή ΗμΚυκλ ΚωδΕΟ ΚωδΚΓ
ΒΛ01 Η Ιστορία του Βυζαντίου 300 40 31-Δεκ-60 ΕΟ01 ΚΓ01
ΒΛ02 Διαφορικός Λογισμός 400 60 12-Μαΐ-70 ΕΟ02 ΚΓ03
ΒΛ03 Κβαντική Φυσική 400 70 11-Νοε-71 ΕΟ02 ΚΓ04
ΒΛ04 Γενετική 600 100 13-Οκτ-90 ΕΟ03 ΚΓ06
ΒΛ05 Αρχαία Ελλάδα 500 80 30-Σεπ-90 ΕΟ04 ΚΓ01
ΒΛ06 Βάσεις Δεδομένων 250 40 02-Φεβ-90 ΕΟ05 ΚΓ05
ΒΛ07 Δίκτυα Υπολογιστών 400 90 06-Ιουλ-91 ΕΟ05 ΚΓ05
ΒΛ08 Τα Σπήλαια της Ελλάδας 350 80 09-Σεπ-92 ΕΟ04 ΚΓ02




Έστω ότι ο Πίνακας αντιγράφεται σε έναν ίδιο Πίνακα με την ονομασία {Βιβλίο1}. Μελετείσθε τα αποτελέσματα του παρακάτω κώδικα:

1. SELECT Βιβλίο.Τιμή - Βιβλίο.Τιμή FROM Βιβλίο Τα αποτελέσματα είναι:

Βιβλίο.Τιμή - Βιβλίο.Τιμή

0

0

0

0

0

0

0



2. SELECT Βιβλίο.Τιμή - Βιβλίο1.Τιμή FROM Βιβλίο, Βιβλίο1 Τα αποτελέσματα είναι:

Βιβλίο.Τιμή - Βιβλίο1.Τιμή

0

20

30

60

40

0

50

40

-20

0

10


Βιβλίο.Τιμή - Βιβλίο1.Τιμή

40

20

-20

30

20

-30

-10

0

30

10

-30


Βιβλίο.Τιμή - Βιβλίο1.Τιμή

20

10

-60

-40

-30

0

-20

-60

-10

-20

-40


Βιβλίο.Τιμή - Βιβλίο1.Τιμή

-20

-10

20

0

-40

10

0

0

20

30

60


Βιβλίο.Τιμή - Βιβλίο1.Τιμή

40

0

50

40

-50

-30

-20

10

-10

-50

0


Βιβλίο.Τιμή - Βιβλίο1.Τιμή

-10

-40

-20

-10

20

0

-40

10

0

Εξηγήσατε τη διαφορά των αποτελεσμάτων του κώδικα (1) και (2);

3. SELECT Τιμή / AVG(Τιμή) FROM Βιβλίο GROUP BY Τιμή Τα αποτελέσματα είναι:

Τιμή / AVG(Τιμή)

1

1

1

1

1

1


Για τη λειτουργία της Συνάρτησης Συνάθροισης “AVG()” και του τελεστή “GROUP BY” δείτε στα επόμενα (§GPE_5.8), απλά υπολογίζει το μέσο όρο των τιμών του πεδίου. Μπορείτε να εξηγήσετε το αποτέλεσμα;

GPE_5.8 Συναρτήσεις Συνάθροισης

Κατά την αναζήτηση δεδομένων σε μια Β.Δ. είναι πολύ πιθανό να χρειασθεί να χρησιμοποιηθούν μερικές δομές οι οποίες προσδιορίζουν μέγιστες, ελάχιστες και μέσες τιμές δεδομένων, αθροίζουν ή/και καταμετρούν δεδομένα. Οι δομές αυτές υλοποιούνται με τη χρήση Συναρτήσεων Συνάθροισης στο πρώτο ή στο τελευταίο τμήμα της εντολής αναζήτησης. Οι πιο χρησιμοποιούμενες Συναρτήσεις είναι:

- MAX(): προσδιορίζει τη μέγιστη τιμή ενός πεδίου τιμών

- MIN(): προσδιορίζει την ελάχιστη τιμή ενός πεδίου τιμών


- AVG(): προσδιορίζει τη μέση τιμή ενός πεδίου τιμών

- SUM(): αθροίζει τις (αριθμητικές) τιμές ενός πεδίου τιμών

- COUNT(): καταμετρά το πλήθος τιμών ενός πεδίου τιμών

Κατά τη χρήση τους θα πρέπει να τηρούνται οι εξής κανόνες:

1. Όταν αναζητείται αποτέλεσμα με τη χρήση μιας Συνάρτησης συνάθροισης ΚΑΙ οποιοδήποτε άλλο δεδομένο από τους Πίνακες της Β.Δ., τότε έπειτα από το πεδίο Κριτηρίων της εντολής αναζήτησης πρέπει να τοποθετείται ο τελεστής GROUP BY και, ακολούθως, το(α) δεδομένο(α) στο(α) οποίο(α) δεν επιδρά η Συνάρτηση Συνάθροισης.

2. Γενικά δεν επιτρέπεται ο εμφωλιασμός των Συναρτήσεων Συνάθροισης παρά μόνο σε ελάχιστες περιπτώσεις (με άλλα λόγια δεν μπορεί πάντα να αποτελέσει όρισμα μιας Συνάρτησης Συνάθροισης μια άλλη παρόμοια Συνάρτηση). Αν απαιτείται μια τέτοια χρήση θα επιλύεται με το χωρισμό των ερωτημάτων SQL σε μια Όψη και σε συμπληρωματικό ερώτημα, όπως θα φανεί στα επόμενα (δείτε το §GPE_5.χψ). Κάτι παρόμοιο συνέβει και στο παράδειγμα (5.3): όπου καλείται η συνάρτηση “AVG()” δεν έχει υπολογισθεί, ακόμα, ο μέσος όρος των τιμών του Κατηγορήματος...

3. Κατά τη χρήση Συναρτήσεων Συνάθροισης, συνήθως απαιτείται η αναζήτηση (εξεύρεση) του αποτελέσματος της Συνάρτησης ΚΑΙ, συμπληρωματικά, δεδομένα των υπόλοιπων στηλών στην ΙΔΙΑ γραμμή του Πεδίου (στον ίδιο Πίνακα). Προκειμένου να βρεθούν τα Πεδία της ίδιας γραμμής κυρίως απαιτείται η χρήση υπο-Ερωτήματος SQL και προς αυτή την κατεύθυνση θα κινηθούν οι εντολές στα επόμενα.

Παράδειγμα 5.4

Έστω ο Πίνακας (προσαρμοσμένο Ερώτημα από την Εργασία Ε3 της Ακαδημαϊκής Περιόδου 2003 - ’04):


Βιβλίο

ΚωδΒΛ Τίτλος Σελ Τιμή ΗμΚυκλ ΚωδΕΟ ΚωδΚΓ
ΒΛ01 Η Ιστορία του Βυζαντίου 300 40 31-Δεκ-60 ΕΟ01 ΚΓ01
ΒΛ02 Διαφορικός Λογισμός 400 60 12-Μαΐ-70 ΕΟ02 ΚΓ03
ΒΛ03 Κβαντική Φυσική 400 70 11-Νοε-71 ΕΟ02 ΚΓ04
ΒΛ04 Γενετική 600 100 13-Οκτ-90 ΕΟ03 ΚΓ06
ΒΛ05 Αρχαία Ελλάδα 500 80 30-Σεπ-90 ΕΟ04 ΚΓ01
ΒΛ06 Βάσεις Δεδομένων 250 40 02-Φεβ-90 ΕΟ05 ΚΓ05
ΒΛ07 Δίκτυα Υπολογιστών 400 90 06-Ιουλ-91 ΕΟ05 ΚΓ05
ΒΛ08 Τα Σπήλαια της Ελλάδας 350 80 09-Σεπ-92 ΕΟ04 ΚΓ02



Ζητούνται τα εξής:

1. Ποιος είναι ο μέσος όρος της τιμής πώλησης των βιβλίων; Αν πωλήθηκε ένα αντίτυπο από κάθε βιβλίο, ποιο είναι το συνολικό έσοδο;

2. Πόσες σελίδες έχει το βιβλίο με τις λιγότερες σελίδες; Ποια είναι η ακριβότερη τιμή; Ποια η μικρότερη/μεγαλύτερη ημερομηνία έκδοσης;

3. Πόσα βιβλία εκδόθηκαν μετά τις 2 Φεβρουαρίου 1990;

Οι εντολές σε SQL είναι:

1α. SELECT AVG(Τιμή) FROM Βιβλίο Το αποτέλεσμα είναι:

AVG(Τιμή)

70.00

1β. SELECT SUM(Τιμή)

FROM Βιβλίο Το αποτέλεσμα είναι:

SUM(Τιμή)

560.00


2α. SELECT MIN(Σελίδες)

FROM Βιβλίο

Το αποτέλεσμα είναι ο ακόλουθος Πίνακας του Σ.Δ.Β.Δ.:

MIN(Σελίδες)

250

2β. SELECT MAX(Τιμή)

FROM Βιβλίο

Το αποτέλεσμα είναι ο ακόλουθος Πίνακας του Σ.Δ.Β.Δ.:

MAX(Τιμή)

100.00

2γ. SELECT MIN(ΗμΚυκλ)

FROM Βιβλίο

Το αποτέλεσμα είναι ο ακόλουθος Πίνακας του Σ.Δ.Β.Δ.:

MIN(ΗμΚυκλ)

31/12/1960

2δ. SELECT MAX(ΗμΚυκλ)

FROM Βιβλίο

Το αποτέλεσμα είναι ο ακόλουθος Πίνακας του Σ.Δ.Β.Δ.:

MAX(ΗμΚυκλ)

09/09/1992


3. SELECT COUNT(ΗμΚυκλ)

FROM Βιβλίο

WHERE (ΗμΚυκλ > TO_DATE('02/02/1990', 'dd/mm/yyyy'))

Το αποτέλεσμα είναι ο ακόλουθος Πίνακας του Σ.Δ.Β.Δ.:

COUNT(ΗμΚυκλ)

4

GPE_5.9 Υπο-Κριτήρια σε SQL

Κατά τη σύνταξη Κριτηρίων προκύπτει συχνά το πρόβλημα να πρέπει να εφαρμοσθούν και νέα στα αποτελέσματα τα οποία θα προκύψουν έπειτα από τη χρήση του τελεστή GROUP BY. Τα Κριτήρια αυτά τοποθετούνται έπειτα από τον τελεστή αυτό και εισάγονται μέσω του τελεστή HAVING. Κατά τα άλλα ισχύουν οι ίδιοι κανόνες.

Παράδειγμα 5.5

Έστω ο Πίνακας (προσαρμοσμένο Ερώτημα από την Εργασία Ε3 της Ακαδημαϊκής Περιόδου 2003 - ’04):

Βιβλίο

ΚωδΒΛ Τίτλος Σελ Τιμή ΗμΚυκλ ΚωδΕΟ ΚωδΚΓ
ΒΛ01 Η Ιστορία του Βυζαντίου 300 40 31-Δεκ-60 ΕΟ01 ΚΓ01
ΒΛ02 Διαφορικός Λογισμός 400 60 12-Μαΐ-70 ΕΟ02 ΚΓ03
ΒΛ03 Κβαντική Φυσική 400 70 11-Νοε-71 ΕΟ02 ΚΓ04
ΒΛ04 Γενετική 600 100 13-Οκτ-90 ΕΟ03 ΚΓ06
ΒΛ05 Αρχαία Ελλάδα 500 80 30-Σεπ-90 ΕΟ04 ΚΓ01
ΒΛ06 Βάσεις Δεδομένων 250 40 02-Φεβ-90 ΕΟ05 ΚΓ05
ΒΛ07 Δίκτυα Υπολογιστών 400 90 06-Ιουλ-91 ΕΟ05 ΚΓ05
ΒΛ08 Τα Σπήλαια της Ελλάδας 350 80 09-Σεπ-92 ΕΟ04 ΚΓ02



Είναι άνω των δύο (2) βιβλία εκδοθέντα μετά τις 1 Ιουλίου 1991;

Η εντολή σε SQL είναι:

SELECT COUNT(Τίτλος)

FROM Βιβλίο

WHERE (ΗμΚυκλ > TO_DATE('01/07/1991', 'dd/mm/yyyy'))

HAVING (COUNT(Τίτλος) > 2)

Το αποτέλεσμα είναι:

COUNT(Τίτλος)

GPE_5.10 Υπο-ερωτήματα σε SQL

Τα υπο-Ερωτήματα είναι “δευτερεύοντα” Ερωτήματα αναζήτησης τα οποία εξαρτώνται από τα “κυρίως” Ερωτήματα και χρησιμοποιούνται στη σύνταξη εντολών αναζήτησης δεδομένων σε SQL κυρίως για τον καλύτερο προσδιορισμό του τμήματος των Κριτηρίων. Με άλλα λόγια, η σύνταξη εντολής αναζήτησης SQL η οποία περιλαμβάνει δύο (2) -ή παραπάνω- εντολές “SELECT”. Τα υπο-Ερωτήματα μπορούν να χρησιμοποιηθούν και σε άλλες εκφράσεις και εντολές (και όχι μόνο σε Κριτήρια). Τα υπο-Ερωτήματα δρουν αποτελεσματικά κατά την αναζήτηση γραμμών σε Πίνακα οι οποίες πρέπει να πληρούν ένα Κριτήριο το οποίο εξαρτάται από τα δεδομένα του ίδιου του Πίνακα (δείτε τον Κανόνα (3) του §GPE_5.7). Τα αποτελέσματά τους, τέλος, μπορεί να είναι περισσότερα από ένα (1) δεδομένα οπότε και θα πρέπει το Κριτήριο (του “κυρίως” Ερωτήματος) να διαμορφωθεί κατάλληλα (θα φανεί παρακάτω).

Παράδειγμα 5.6

Έστω ο Πίνακας (προσαρμοσμένο Ερώτημα από την Εργασία Ε3 της Ακαδημαϊκής Περιόδου 2003 - ’04):

Βιβλίο

ΚωδΒΛ Τίτλος Σελ Τιμή ΗμΚυκλ ΚωδΕΟ ΚωδΚΓ
ΒΛ01 Η Ιστορία του Βυζαντίου 300 40 31-Δεκ-60 ΕΟ01 ΚΓ01
ΒΛ02 Διαφορικός Λογισμός 400 60 12-Μαΐ-70 ΕΟ02 ΚΓ03
ΒΛ03 Κβαντική Φυσική 400 70 11-Νοε-71 ΕΟ02 ΚΓ04
ΒΛ04 Γενετική 600 100 13-Οκτ-90 ΕΟ03 ΚΓ06
ΒΛ05 Αρχαία Ελλάδα 500 80 30-Σεπ-90 ΕΟ04 ΚΓ01
ΒΛ06 Βάσεις Δεδομένων 250 40 02-Φεβ-90 ΕΟ05 ΚΓ05
ΒΛ07 Δίκτυα Υπολογιστών 400 90 06-Ιουλ-91 ΕΟ05 ΚΓ05
ΒΛ08 Τα Σπήλαια της Ελλάδας 350 80 09-Σεπ-92 ΕΟ04 ΚΓ02



Ζητούνται τα εξής:

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

2. Ποιο βιβλίο έχει τις λιγότερες σελίδες; Τις περισσότερες;

3. Ποιο βιβλίο είναι το παλαιότερο και έχει την πιο φθηνή τιμή;


Οι εντολές σε SQL είναι:

1α. SELECT Τίτλος, Τιμή FROM Βιβλίο WHERE (Τιμή = (SELECT AVG(Τιμή) FROM Βιβλίο)) Το αποτέλεσμα είναι:

Τίτλος Τιμή
Κβαντική Φυσική 70



1β.

SELECT Τίτλος, Τιμή

FROM Βιβλίο WHERE (Τιμή = (SELECT MAX(Τιμή) FROM Βιβλίο)) Το αποτέλεσμα είναι:

Τίτλος Τιμή
Γενετική 100.00



2α.

SELECT Τίτλος, Σελίδες


FROM Βιβλίο

WHERE (Σελίδες = (SELECT MIN(Σελίδες) FROM Βιβλίο))

Το αποτέλεσμα είναι:

Τίτλος Σελίδες
Βάσεις Δεδομένων 250


2β.

SELECT Τίτλος, Σελίδες

FROM Βιβλίο

WHERE (Σελίδες = (SELECT MAX(Σελίδες) FROM Βιβλίο))

Το αποτέλεσμα είναι:

Τίτλος Σελίδες
Γενετική 600



3.

SELECT Τίτλος, Τιμή, ΗμΚυκλ

FROM Βιβλίο

WHERE ((ΗμΚυκλ = (SELECT MIN(ΗμΚυκλ) FROM Βιβλίο)) AND (Τιμή = (SELECT MIN(Τιμή) FROM Βιβλίο)))

Το αποτέλεσμα είναι:

Τίτλος Τιμή ΗμΚυκλ
Η Ιστορία του Βυζαντίου 40.00 31/12/1960

GPE_5.11 Συνδέσεις

Όπως ήδη γνωρίζετε, οι Συνδέσεις μπορεί να είναι Φυσικές και Μη. Η Φυσική Σύνδεση μπορεί να είναι Εσωτερική (inner) ή Εξωτερική (outer).


Εσωτερική Φυσική Σύνδεση:



Η Εσωτερική Φυσική Σύνδεση έχει ως αποτέλεσμα έναν (1) Πίνακα του οποίου οι στήλες προκύπτουν από τους εμπλεκόμενους Πίνακες με βάση τα ίδια Κατηγορήματα (και τις ίδιες τιμές). Η γενική μορφή της είναι:

SELECT <ονομασία Πίνακα1>.<ονομασία Κατηγορήματος1>, <ονομασία Πίνακα1>.<ονομασία Κατηγορήματος2>, ..., <ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςn>, <ονομασία Πίνακα2>.<ονομασία Κατηγορήματος1>, <ονομασία Πίνακα2>.<ονομασία Κατηγορήματος2>, ..., <ονομασία Πίνακα2>.<ονομασία Κατηγορήματοςm>

FROM <ονομασία Πίνακα1>

NATURAL JOIN <ονομασία Πίνακα2> ON <ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςx> = <ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςy>

Γενικά, όλοι οι δείκτες “n”, “m”, “x” και “y” είναι διαφορετικοί μεταξύ τους.

ΠΡΟΣΟΧΗ: Το Σ.Δ.Β.Δ. Oracle δέχεται τον τελεστή INNER JOIN ή JOIN και το Σ.Δ.Β.Δ. MS-Access δέχεται το INNER JOIN για την Εσωτερική Φυσική Σύνδεση

Κατά τη Σύνδεση, ο Πίνακας2 μπορεί να είναι το αποτέλεσμα άλλης Σύνδεσης (η οποία πραγματοποιείται εκείνη τη στιγμή), σχηματίζοντας μια “δενδρική δομή” από Συνδέσεις. Η Εσωτερική Φυσική Σύνδεση μπορεί να αντικατασταθεί από μια απλή εντολή αναζήτησης με Κριτήριο το οποίο αφορά στα Κατηγορήματα όπου πραγματοποιείται. Η γενική μορφή είναι:

SELECT <ονομασία Πίνακα1>.<ονομασία Κατηγορήματος1>, <ονομασία Πίνακα1>.<ονομασία Κατηγορήματος2>, ..., <ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςn>, <ονομασία Πίνακα2>.<ονομασία Κατηγορήματος1>, <ονομασία Πίνακα2>.<ονομασία Κατηγορήματος2>, ..., <ονομασία Πίνακα2>.<ονομασία Κατηγορήματοςm>

FROM <ονομασία Πίνακα1>, <ονομασία Πίνακα2>

WHERE <ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςx> = <ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςy>


Εξωτερική Φυσική Σύνδεση:

Η Εξωτερική Φυσική Σύνδεση, πάλι, χωρίζεται σε Αριστερή (left) και Δεξιά (right) και έχει ως αποτέλεσμα έναν (1) Πίνακα του οποίου οι στήλες προκύπτουν από τους εμπλεκόμενους Πίνακες με βάση τα ίδια Κατηγορήματα (και τις ίδιες τιμές) ΣΥΝ όλες τις γραμμές του ενός ή του άλλου Πίνακα (ανάλογα με την αριστερή ή δεξιά “διεύθυνσή” της, οπότε επιλέγονται όλες οι στήλες του αριστερά ή δεξιά εμπλεκομένου Πίνακα).


Επίσης, η Πλήρης (full) Εξωτερική Φυσική Σύνδεση έχει ως αποτέλεσμα έναν (1) Πίνακα του οποίου οι στήλες προκύπτουν από τους εμπλεκόμενους Πίνακες με βάση τα ίδια Κατηγορήματα (και τις ίδιες τιμές) ΣΥΝ όλες τις στήλες των εμπλεκομένων Πινάκων αλλά με τιμή “NULL” στα Πεδία του όπου η Σύνδεση δεν μπορεί να πραγματοποιηθεί (δεν υπάρχουν ίδια Κατηγορήματα ή Πεδία). Η γενική μορφή της είναι:

SELECT <ονομασία Πίνακα1>.<ονομασία Κατηγορήματος1>, <ονομασία Πίνακα1>.<ονομασία Κατηγορήματος2>, ..., <ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςn>, <ονομασία Πίνακα2>.<ονομασία Κατηγορήματος1>, <ονομασία Πίνακα2>.<ονομασία Κατηγορήματος2>, ..., <ονομασία Πίνακα2>.<ονομασία Κατηγορήματοςm>

FROM <ονομασία Πίνακα1>

LEFT/RIGHT/FULL OUTER JOIN <ονομασία Πίνακα2>

ON <ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςx> = <ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςy>

Γενικά, όλοι οι δείκτες “n”, “m”, “x” και “y” είναι διαφορετικοί μεταξύ τους.

Παράδειγμα 5.7

Έστω οι Πίνακες (προσαρμοσμένο Ερώτημα από την Εργασία Ε3 της Ακαδημαϊκής Περιόδου 2003 - ’04):

Πελάτης

ΚωδΠΛ Όνομα Επώνυμο Τηλέφωνο eMAIL
ΠΛ01 Γεώργιος Γεωργίου 2310123456 gg@yahoo.gr
ΠΛ02 Δημήτριος Βασιλείου 2510111111 db@mail.gr
ΠΛ03 Ιωάννης Δέλλιος 2610222222 id@in.gr
ΠΛ04 Μαρία Θωμά 2810654321 mt@cosmos.gr
ΠΛ05 Δέσποινα Αποστόλου 2410123123 da@mailbox.gr
ΠΛ06 Αθηνά Παπαδοπούλου 2310456456 ap@google.gr
ΠΛ07 Δήμητρα Αντωνίου 2610789987 da@yahoo.gr
ΠΛ08 Αναστάσιος Αναστασιάδης 2810555666 aa@hotmail.gr
ΠΛ09 Γεώργιος Μακρής 2610223344 gm@yahoo.gr
ΠΛ10 Ευάγγελος Μποζάνης 2610554433 eb@hotmail.gr

Αγορά

ΚωδΠΛ ΚωδΒΛ Ημερομηνία
ΠΛ01 ΒΛ01 21-Σεπ-71
ΠΛ01 ΒΛ02 21-Σεπ-71
ΠΛ01 ΒΛ03 22-Μαΐ-00
ΠΛ02 ΒΛ02 25-Οκτ-01
ΠΛ03 ΒΛ05 10-Δεκ-98
ΠΛ04 ΒΛ08 30-Ιαν-95
ΠΛ05 ΒΛ06 12-Νοε-96
ΠΛ06 ΒΛ06 10-Οκτ-93
ΠΛ07 ΒΛ06 31-Δεκ-99
ΠΛ08 ΒΛ06 31-Δεκ-99



Βιβλίο

ΚωδΒΛ Τίτλος Σελ Τιμή ΗμΚυκλ ΚωδΕΟ ΚωδΚΓ
ΒΛ01 Η Ιστορία του Βυζαντίου 300 40 31-Δεκ-60 ΕΟ01 ΚΓ01
ΒΛ02 Διαφορικός Λογισμός 400 60 12-Μαΐ-70 ΕΟ02 ΚΓ03
ΒΛ03 Κβαντική Φυσική 400 70 11-Νοε-71 ΕΟ02 ΚΓ04
ΒΛ04 Γενετική 600 100 13-Οκτ-90 ΕΟ03 ΚΓ06
ΒΛ05 Αρχαία Ελλάδα 500 80 30-Σεπ-90 ΕΟ04 ΚΓ01
ΒΛ06 Βάσεις Δεδομένων 250 40 02-Φεβ-90 ΕΟ05 ΚΓ05
ΒΛ07 Δίκτυα Υπολογιστών 400 90 06-Ιουλ-91 ΕΟ05 ΚΓ05
ΒΛ08 Τα Σπήλαια της Ελλάδας 350 80 09-Σεπ-92 ΕΟ04 ΚΓ02


Ζητούνται τα εξής:


Οι εντολές σε SQL είναι:

1. Πόσα βιβλία έχει αγοράσει κάθε πελάτης (όνομα και επώνυμό του);

2. Εφαρμόσατε στο παραπάνω ερώτημα τις Εξωτερικές Συνδέσεις


1. Είναι φανερό πως απαιτείται Φυσική Σύνδεση από τον Πίνακα {Πελάτης} στον {Αγορά} και από τον {Αγορά} στον {Βιβλίο}. Ο τελεστής “GROUP BY” επιβάλλεται από την ύπαρξη στο τμήμα αναζήτησης Κατηγορημάτων και Συνάρτησης Συνάθροισης. Η εντολή σε SQL είναι:

SELECT Πελάτης.Όνομα, Πελάτης.Επώνυμο, COUNT(Βιβλίο.Τίτλος) FROM (Πελάτης INNER JOIN Αγορά ON Πελάτης.ΚωδικόςΠΛ = Αγορά.ΚωδικόςΠΛ) INNER JOIN Βιβλίο ON Αγορά.ΚωδικόςΒΛ = Βιβλίο.ΚωδικόςΒΛ GROUP BY Πελάτης.Όνομα, Πελάτης.Επώνυμο; Τα αποτελέσματα είναι:


Όνομα Επώνυμο COUNT(Βιβλίο.Τίτλος)
Αθηνά Παπαδοπούλου 1
Αναστάσιος Αναστασιάδης 1
Γεώργιος Γεωργίου 3
Γεώργιος Μακρής 1
Δέσποινα Αποστόλου 1
Δήμητρα Αντωνίου 1
Δημήτριος Βασιλείου 1
Ευάγγελος Μποζάνης 1
Ιωάννης Δέλλιος 1
Μαρία Θωμά 1

2α. Η εντολή σε SQL για την Εξωτερική Αριστερή Φυσική Σύνδεση είναι:

SELECT Πελάτης.Όνομα, Πελάτης.Επώνυμο, COUNT(Βιβλίο.Τίτλος) FROM (Πελάτης LEFT OUTER JOIN Αγορά ON Πελάτης.ΚωδικόςΠΛ = Αγορά.ΚωδικόςΠΛ) LEFT OUTER JOIN Βιβλίο ON Αγορά.ΚωδικόςΒΛ = Βιβλίο.ΚωδικόςΒΛ

GROUP BY Πελάτης.Όνομα, Πελάτης.Επώνυμο; Τα αποτελέσματα είναι:

Όνομα Επώνυμο COUNT(Βιβλίο.Τίτλος)
Αθηνά Παπαδοπούλου 1
Αναστάσιος Αναστασιάδης 1
Γεώργιος Γεωργίου 3
Γεώργιος Μακρής 1
Δέσποινα Αποστόλου 1
Δήμητρα Αντωνίου 1
Δημήτριος Βασιλείου 1
Ευάγγελος Μποζάνης 1
Ιωάννης Δέλλιος 1
Μαρία Θωμά 1

Τα αποτελέσματα δεν διαφέρουν σε σχέση με τα (2α) λόγω της πλήρους χρησιμοποίησης των Πινάκων {Πελάτης} και {Αγορά}.


2β. Η εντολή σε SQL για την Εξωτερική Δεξιά Φυσική Σύνδεση είναι:

SELECT Πελάτης.Όνομα, Πελάτης.Επώνυμο, COUNT(Βιβλίο.Τίτλος) FROM (Πελάτης RIGHT OUTER JOIN Αγορά ON Πελάτης.ΚωδικόςΠΛ = Αγορά.ΚωδικόςΠΛ) RIGHT OUTER JOIN Βιβλίο ON Αγορά.ΚωδικόςΒΛ = Βιβλίο.ΚωδικόςΒΛ

GROUP BY Πελάτης.Όνομα, Πελάτης.Επώνυμο; Τα αποτελέσματα είναι:

Όνομα Επώνυμο COUNT(Βιβλίο.Τίτλος)
Αθηνά Παπαδοπούλου 1
Αναστάσιος Αναστασιάδης 1
Γεώργιος Γεωργίου 3
Γεώργιος Μακρής 1
Δέσποινα Αποστόλου 1
Δήμητρα Αντωνίου 1
Δημήτριος Βασιλείου 1
Ευάγγελος Μποζάνης 1
Ιωάννης Δέλλιος 1
Μαρία Θωμά 1
2


Τα αποτελέσματα αυτή τη φορά διαφέρουν. Μπορείτε να δείτε αν αυτό οφείλετε στον Πίνακα {Αγορά} ή στον Πίνακα {Βιβλίο};

2γ. Η εντολή σε SQL για την Πλήρη Εξωτερική Φυσική Σύνδεση είναι:

SELECT Πελάτης.Όνομα, Πελάτης.Επώνυμο, COUNT(Βιβλίο.Τίτλος) FROM (Πελάτης FULL OUTER JOIN Αγορά ON Πελάτης.ΚωδικόςΠΛ = Αγορά.ΚωδικόςΠΛ) FULL OUTER JOIN Βιβλίο ON Αγορά.ΚωδικόςΒΛ = Βιβλίο.ΚωδικόςΒΛ GROUP BY Πελάτης.Όνομα, Πελάτης.Επώνυμο; Τα αποτελέσματα είναι:

Όνομα Επώνυμο COUNT(Βιβλίο.Τίτλος)
Αθηνά Παπαδοπούλου 1
Αναστάσιος Αναστασιάδης 1
Γεώργιος Γεωργίου 3
Γεώργιος Μακρής 1
Δέσποινα Αποστόλου 1
Δήμητρα Αντωνίου 1
Δημήτριος Βασιλείου 1
Ευάγγελος Μποζάνης 1
Ιωάννης Δέλλιος 1
Μαρία Θωμά 1
2



Τα αποτελέσματα δεν διαφέρουν σε σχέση με τα (2β). Γιατί;

GPE_5.12 Εισαγωγή δεδομένων τα οποία έχουν ήδη εισαχθεί σε άλλους Πίνακες (έπειτα από κατάλληλη αναζήτησή τους)

Έπειτα από την ανάλυση της εντολής αναζήτησης μπορεί να καλυφθεί και αυτό το θέμα. Η γενική μορφή της εντολής είναι:

INSERT INTO <ονομασία Πίνακα όπου εισάγονται τα στοιχεία> (SELECT <ονομασία Πίνακα1>, <ονομασία Κατηγορήματος1>,

<ονομασία Πίνακα1>, <ονομασία Κατηγορήματος2>,

...

<ονομασία Πίνακα1>, <ονομασία Κατηγορήματοςn1>,

<ονομασία Πίνακα2>, <ονομασία Κατηγορήματος1>,

<ονομασία Πίνακα2>, <ονομασία Κατηγορήματος2>, ...

<ονομασία Πίνακα2>, <ονομασία Κατηγορήματοςn2>,

...

<ονομασία Πίνακαm>, <ονομασία Κατηγορήματος1>,

<ονομασία Πίνακαm>, <ονομασία Κατηγορήματος2>,

...

<ονομασία Πίνακαm>, <ονομασία Κατηγορήματοςnm>

FROM <ονομασία Πίνακα1>, <ονομασία Πίνακα2>, <ονομασία Πίνακαm>

WHERE (<Κριτήριο1>, <Κριτήριο2>, ..., <Κριτήριοk>))

Τα παραπάνω Κριτήρια έχουν σχέση με τα Κατηγορήματα τα οποία επιλέγονται με την εντολή “SELECT”, η δε όλη εντολή αφορά στη συμπλήρωση μίας (1) γραμμής του υπό πλήρωση Πίνακα. Επίσης, γενικά n1, n2, ..., nm, m και k έχουν όλα διαφορετικές τιμές. Τέλος, αν τα Κριτήρια “αστοχήσουν” ο Πίνακας δεν συμπληρώνεται με δεδομένα (το ίδιο συμβαίνει αν οι τύποι δεδομένων των Πινάκων δεν συμπίπτουν).

GPE_5.13 Εισαγωγή νέων και ήδη εισαχθέντων δεδομένων

Έπειτα από την ανάλυση της εντολής αναζήτησης μπορεί να καλυφθεί και αυτό το θέμα. Η γενική μορφή της εντολής είναι:

INSERT INTO <ονομασία Πίνακα όπου εισάγονται τα στοιχεία>

(SELECT <ονομασία Πίνακα1>, <ονομασία Κατηγορήματος1>, <ονομασία Πίνακα1>, <ονομασία Κατηγορήματος2>,

...

<ονομασία Πίνακα1>, <ονομασία Κατηγορήματοςn1>,

<ονομασία Πίνακα2>, <ονομασία Κατηγορήματος1>,

<ονομασία Πίνακα2>, <ονομασία Κατηγορήματος2>,

...

<ονομασία Πίνακα2>, <ονομασία Κατηγορήματοςn2>,

...

<ονομασία Πίνακαm>, <ονομασία Κατηγορήματος1>,

<ονομασία Πίνακαm>, <ονομασία Κατηγορήματος2>,

...

<ονομασία Πίνακαm>, <ονομασία Κατηγορήματοςnm>,

<Δεδομένο Πεδίου1>, <Δεδομένο Πεδίου2>, ..., <Δεδομένο Πεδίουn>

FROM <ονομασία Πίνακα1>, <ονομασία Πίνακα2>, <ονομασία Πίνακαm>

WHERE (<Κριτήριο1>, <Κριτήριο2>, ..., <Κριτήριοk>))


Τα παραπάνω Κριτήρια έχουν σχέση με τα Κατηγορήματα τα οποία επιλέγονται με την εντολή “SELECT”, η δε όλη εντολή αφορά στη συμπλήρωση μίας (1) γραμμής του υπό πλήρωση Πίνακα. Επίσης, γενικά n, n1, n2, ..., nm, m και k έχουν όλα διαφορετικές τιμές. Αν τα Κριτήρια “αστοχήσουν” ο Πίνακας δεν συμπληρώνεται με δεδομένα (το ίδιο συμβαίνει αν οι τύποι δεδομένων των Πινάκων δεν συμπίπτουν). Τέλος, η σειρά τοποθέτησης δεδομένων τα οποία υπάρχουν σε άλλους Πίνακες της Β.Δ. και νέων είναι τυχαία (εξαρτάται από τη σειρά ορισμού των Κατηγορημάτων).

GPE_5.14 Υπόλοιποι Τελεστές και Χαρακτήρες της SQL

“DISTINCT” Ο τελεστής μοναδικότητας εγγραφών χρησιμοποιείται για να αποτραπεί η εμφάνιση διπλών ή πολλαπλών γραμμών (εγγραφών) σαν αποτέλεσμα ενός Ερωτήματος σε SQL. Για τη χρήση του θα πρέπει μετά την εντολή “SELECT” να προστεθεί ο τελεστής “DISTINCT”. Ο τελεστής λειτουργεί και σαν όρισμα Συνάρτησης Συνάθροισης.

“IN” Ο τελεστής “IN” επιτρέπει την επιλογή γραμμών (εγγραφών) των οποίων μια στήλη περιέχει τιμή η οποία εμπεριέχεται σε ένα σύνολο τιμών (οι οποίες και αποτελούν το κριτήριο σύγκρισης και καθορίζονται από το χρήστη). Η χρήση του τελεστή “IN” ισοδυναμεί με τη χρήση πολλών λογικών εκφράσεων σύγκρισης με αποτέλεσμα να απλοποιεί τα Ερωτήματα.

“IS”

“ALL”

Ο τελεστής “ALL” χρησιμοποιείται κατά τη σύνταξη Κριτηρίων και αντί του τελεστή ισότητας και σημαίνει “όλα από όλα”. Συνεπώς, για να υπάρξουν αποτελέσματα στην εφαρμογή του θα πρέπει να ικανοποιηθούν όλα τα τμήματα ενός (1) Κριτηρίου ή όλα τα υπο-Κριτήριά του.

“ANY” Ο τελεστής “ANY” χρησιμοποιείται κατά τη σύνταξη Κριτηρίων και αντί του τελεστή ισότητας και σημαίνει “οποιοδήποτε από” (έστω και ένα (1) δηλαδή) από τα συγκρινόμενα. Συνεπώς, έστω και μία (1) εγγραφή να υπάρχει η οποία καλύπτει ένα (ή περισσότερα από ένα (1)) κριτήριο σύγκρισης, το “ANY” θα έχει σαν αποτέλεσμα αυτή την εγγραφή.

“LIKE”

Χρησιμοποιείται μετά το σύνδεσμο “WHERE” για την υλοποίηση κριτηρίων ανεύρεσης συγκεκριμένων τμημάτων εγγραφών σε πίνακες και είναι πιο “ισχυρός” από τον τελεστή ισότητας. Η αναζήτηση μέσω του τελεστή μπορεί να επιστρέψει και Πεδία τα οποία δεν ταιριάζουν επακριβώς με το οριζόμενο Κριτήριο αλλά μοιάζουν σε αυτό. Ο τελεστής μπορεί να συνταχθεί και με το χαρακτήρα “*” το οποίο σημαίνει “οτιδήποτε” και μπορεί να καθορίσει πλήθος, θέση, ή τον όποιο χαρακτήρα υπάρχει σε μια (ή περισσότερες) θέσεις σε μια (ή περισσότερες από μία (1)) εγγραφή.


“%” Πρόκειται για ειδικό σύμβολο το οποίο χρησιμοποιείται κατά τη σύνταξη Κριτηρίων όπου συμμετέχουν Δεδομένα Τύπου χαρακτήρα, αντικαθιστώντας “αδιάφορους” χαρακτήρες. Μπορεί να αντικαταστήσει ένα (1) ή παραπάνω συνεχόμενους χαρακτήρες και να γενικεύσει την αναζήτηση Πεδίων τα οποία θα περιέχουν και χαρακτήρες οι οποίοι δεν αναζητώνται. Ενέχει, δε, τη θέση του χαρακτήρα “*” όπως αυτός χρησιμοποιείται κατά την αναζήτηση ονομασιών αρχείων κ.τ.λ. στα MS-Windows. Η χρήση του επιτρέπει να “συμμετέχει” πάνω από μία (1) φορές σε διαφορετικά σημεία του υπό σύγκριση Τύπου Δεδομένου ώστε να το καθιστά πιο γενικό.

“_” Πρόκειται για ειδικό σύμβολο το οποίο χρησιμοποιείται κατά τη σύνταξη Κριτηρίων όπου συμμετέχουν Δεδομένα Τύπου χαρακτήρα, αντικαθιστώντας ένα (1) “αδιάφορο” χαρακτήρα. Γενικεύει, δε, την αναζήτηση Πεδίων τα οποία θα περιέχουν και ένα (1) χαρακτήρα ο οποίος δεν αναζητείται. Ενέχει, δε, τη θέση του χαρακτήρα “?” όπως αυτός χρησιμοποιείται κατά την αναζήτηση ονομασιών αρχείων κ.τ.λ. στα MS-Windows. Η χρήση του επιτρέπει να “συμμετέχει” πάνω από μία (1) φορές σε συνεχόμενα ή διαφορετικά σημεία του υπό σύγκριση Τύπου Δεδομένου.

“EXISTS” - “NOT EXISTS” Όταν κατά τη Σύνταξη Κριτηρίων απαιτηθεί η απλή διαπίστωση ύπαρξης ή μη εγγραφών κατά την εφαρμογή κριτηρίων αναζήτησης, και όχι μόνο η εμφάνιση αποτελεσμάτων, τότε τα Ερωτήματα σε SQL συμπληρώνονται με τους τελεστές “EXISTS” και “ NOT EXISTS”. Τοποθετούνται μετά το σύνδεσμο “WHERE” και χρησιμοποιούνται στη συνδυασμό χρήσης δομημένου προγραμματισμού και SQL.

“CONTAINS” Χρησιμοποιείται μετά το σύνδεσμο “WHERE” για την υλοποίηση Κριτηρίων αναζήτησης συγκεκριμένων τμημάτων εγγραφών σε Πίνακες. Σε αντίθεση με τον τελεστή “LIKE”, του οποίου αποτελεί υποπερίπτωση, δεν υποστηρίζει πλήρως τη χρήση του “*” παρά μόνο σε ειδικές περιπτώσεις. Δεν υποστηρίζεται από τα Σ.Δ.Β.Δ. Oracle και MS-Access.

“UNIQUE”

GPE_5.15 Μετονομασία Πινάκων και Πεδίων

“ALIAS” Οι μετονομασίες πινάκων χρησιμοποιούνται κατά τη σύνθεση Ερωτημάτων σε SQL για την απλοποίηση της μορφής τους. Μια μετονομασία Πίνακα υλοποιείται στο τμήμα υπόδειξης Πινάκων της εντολής αναζήτησης, όπου έπειτα από την ονομασία του Πίνακα απλά ακολουθεί η μετονομασία αυτού. Έπειτα, η συγκεκριμένη μετονομασία Πίνακα μπορεί να χρησιμοποιηθεί σε όλο το Ερώτημα (όχι, όμως, και σε υπο-Ερώτημα). Παρόμοια μπορεί να μετονομασθεί αναζητούμενο Κατηγόρημα ή Πεδίο. Σε αυτή την περίπτωση η μετονομασία υλοποιείται στο τμήμα επιλογής Κατηγορημάτων της εντολής αναζήτησης, όπου έπειτα από την ονομασία αυτού απλά ακολουθεί η μετονομασία του. Μετονομασία μπορεί να συμβεί και κατά τη χρήση Συναρτήσεων Συνάθροισης. Έπειτα, η συγκεκριμένη μετονομασία μπορεί να χρησιμοποιηθεί σε όλη το Ερώτημα.

GPE_5.16 Εμφάνιση Αποτελεσμάτων

“ORDER BY”

“ASC”

“DESC”


GPE_5.17 Όψεις

Οι Όψεις είναι Πίνακες οι οποίοι μπορούν να ορισθούν με κατάλληλη εντολή της SQL και έχουν ως βάση άλλους Πίνακες οι οποίοι έχουν ήδη ορισθεί στη Β.Δ. Κατά κανόνα τα δεδομένα τους αποτελούνται από υποσύνολα των Πινάκων στους οποίους αναφέρονται ή συνδυασμούς των δεδομένων αυτών. Χρησιμοποιούνται, δε, είτε για πιο εύκολη αναφορά σε συγκεκριμένα δεδομένα των Πινάκων ή κατά ορισμένη χρήση των Συναρτήσεων Συνάθροισης (§GPE_5.χψ). Τέλος, τα αποτελέσματα των ερωτημάτων αναζήτησης δεδομένων σε μια Β.Δ. μπορούν να ορισθούν ως Όψεις και να χρησιμοποιούνται όπως και οι υπόλοιποι Πίνακές της, καθώς ήδη τυγχάνουν χειρισμού ως δεδομένα Πίνακα της Β.Δ. από το Σ.Δ.Β.Δ. Έπειτα από την ανάλυση της εντολής αναζήτησης μπορεί να καλυφθεί και αυτό το θέμα. Η γενική μορφή της εντολής είναι:

CREATE VIEW <ονομασία της Όψης>

AS SELECT <ονομασία Πίνακα1>.<ονομασία Κατηγορήματος1 του Πίνακα1>, <ονομασία Πίνακα1>.<ονομασία Κατηγορήματος2 του Πίνακα1>, ...

<ονομασία Πίνακα1>.<ονομασία Κατηγορήματοςn1 του Πίνακα1>,

<ονομασία Πίνακα2>.<ονομασία Κατηγορήματος1 του Πίνακα2>,

<ονομασία Πίνακα2>.<ονομασία Κατηγορήματος2 του Πίνακα2>, ... <ονομασία Πίνακα2>.<ονομασία Κατηγορήματοςn2 του Πίνακα2>,

...

<ονομασία Πίνακαm>.<ονομασία Κατηγορήματος1 του Πίνακαm>,

<ονομασία Πίνακαm>.<ονομασία Κατηγορήματος2 του Πίνακαm>,

...

<ονομασία Πίνακαm>.<ονομασία Κατηγορήματοςmn του Πίνακαm>

FROM <ονομασία Πίνακα1>, <ονομασία Πίνακα2>, ..., <ονομασία Πίνακαm>

WHERE (<κριτήρια>)

τα στοιχεία της εντολής τα οποία περικλείονται από τα σύμβολα (ανισότητας) “<” και “>” αποτελούν υποχρεωτικές ονομασίες του Πίνακα, του Κλειδιού και των Κατηγορημάτων του. Εκτός από την ονομασία της ίδιας της Όψης, οφείλουν να αναφέρονται σε υπαρκτά δεδομένα της Β.Δ. Οι ονομασίες αυτές είναι αλφαριθμητικοί χαρακτήρες (συνδυασμός γραμμάτων, αριθμών και συμβόλων οποιασδήποτε γραμματοσειράς). Στις ονομασίες μπορούν να χρησιμοποιηθούν κεφαλαία ή μικρά γράμματα, τονισμένα γράμματα, ειδικοί χαρακτήρες κ.τ.λ. (το αν θα φαίνονται με κατανοητό τρόπο κατά την αναζήτηση δεδομένων δεν είναι του παρόντος καθώς η “σωστή” εμφάνισή τους εξαρτάται από το λειτουργικό σύστημα όπου έχει εγκατασταθεί το Σ.Δ.Β.Δ. και τις ρυθμίσεις αυτού).

Με το συμβολισμό <κριτήρια> χαρακτηρίζονται οι περιορισμοί οι οποίοι πρέπει να ισχύουν για τα δεδομένα των Πινάκων όπου αναφέρεται μια Όψη ώστε να αποτελέσουν και δικά της δεδομένα (§GPE_5.χψ). Στα επόμενα θα δοθούν αναλυτικά παραδείγματα για τη σύνταξη των κριτηρίων.

Το Σ.Δ.Β.Δ. Oracle υποστηρίζει τις Όψεις με τη χρήση της παραπάνω εντολής. Ανάλογα με τις ρυθμίσεις του θα πρέπει έπειτα από την εισαγωγή της εντολής να δίνεται και η εντολή “COMMIT” ώστε να “παγιώνεται” η Όψη στη μνήμη του Σ.Δ.Β.Δ. ή όχι.


Το Σ.Δ.Β.Δ. MS-Access δεν υποστηρίζει Όψεις με τη χρήση της παραπάνω εντολής, Σε αντιδιαστολή, τα αποτελέσματα οποιουδήποτε ερωτήματος σε SQL αυτόματα χαρακτηρίζονται ως Όψη και ο χρήστης μπορεί να αναφερθεί σε αυτή κατά τη σύνταξη ερωτημάτων σε SQL.

ΜΕΡΟΣ Γ’: ΜΕΤΑΒΟΛΗ Β.Δ.

GPE_5.18 Μεταβολή Πινάκων

Πέρα από τον ορισμό Πινάκων, είναι πιθανό να χρειασθεί η μεταβολή τους έπειτα από τον ορισμό τους. Ο γράφων συμβουλεύει είτε την καταστροφή και τον επανα-ορισμό τους (οπότε, βέβαια, και “χάνονται” τα δεδομένα τους) είτε τη δημιουργία ενός άλλου Πίνακα όπως απαιτείται, τη μεταφορά σε αυτόν των χρήσιμων δεδομένων αυτού ο οποίος δεν πληροί, πια, τις προϋποθέσεις και, τέλος, την καταστροφή αυτού. Τα παραπάνω μπορούν συνδυασθούν εύκολα με χειρισμό του Σ.Δ.Β.Δ. μέσω αρχείων κειμένου (text files ή scripts) όπως θα φανεί στα επόμενα (§GPE_5χψ). Η γενική μορφή της εντολής προσθήκης Κατηγορημάτων είναι:

ALTER TABLE <ονομασία του Πίνακα>

ADD <ονομασία νέου Κατηγορήματος1> <τύπος μεταβλητής νέου Κατηγορήματος1>,

<ονομασία νέου Κατηγορήματος2> <τύπος μεταβλητής νέου Κατηγορήματος2>,

...

<ονομασία νέου Κατηγορήματοςn> <τύπος μεταβλητής νέου Κατηγορήματοςn>

Ισχύουν όσα ειπώθηκαν και για τον ορισμό Πινάκων αναφορικά σε ονομασίες, τύπους μεταβλητών κ.τ.λ. Θεωρείται καλή πρακτική η μη αλλαγή (ή συμπλήρωση) του Κλειδιού του Πίνακα (αλλά υποστηρίζεται). Τα νέα Πεδία, όπως είναι φυσικό, θα περιέχουν κενές τιμές. Η γενική μορφή της εντολής αφαίρεσης Κατηγορήματος είναι:

ALTER TABLE <ονομασία του Πίνακα>

DROP <ονομασία Κατηγορήματος>

Θεωρείται καλή πρακτική η μη αφαίρεση του Κλειδιού του Πίνακα (αλλά υποστηρίζεται από ορισμένα λειτουργικά συστήματα).

Τέλος, γενική μορφή της εντολής καταστροφής Πίνακα ακολουθεί:

DROP TABLE <ονομασία του Πίνακα>

GPE_5.19 Μεταβολή Δεδομένων σε Πίνακες

{γενικά, ό,τι ζητάμε κάθε φορά στην κατάλληλη Εργασία (Ε3) και τα περιεχόμενα του “5.3”. Θα τα παρουσιάσω με αναλυτικά παραδείγματα και παραπομπές σε MS-Access και Oracle (αναφορές στα Παραρτήματα)}


GPE_5.20 Διαγραφή Δεδομένων σε Πίνακες

{γενικά, ό,τι ζητάμε κάθε φορά στην κατάλληλη Εργασία (Ε3) και τα περιεχόμενα του “5.3”. Θα τα παρουσιάσω με αναλυτικά παραδείγματα και παραπομπές σε MS-Access και Oracle (αναφορές στα Παραρτήματα)}


GPE_5.21 Χειρισμός των Έτοιμων Β.Δ. σε MS-Access και της Oracle

{λίγα λόγια για το τι θα βρίσκουν στο CD -εναλλακτικά: δίκτυο)}


GPE_5.22 Συμπεράσματα και Βιβλιογραφία

{ό,τι έχω συγκεντρώσει}


Παράρτημα GPE_5.1

{Χρήση αρχείων κειμένου}


Οι παραπάνω εντολές εκτελούνται στο περιβάλλον “SQL PLUS” της Oracle. Για την πρόσβαση σε αυτό θα χρειασθεί να δώσετε “Όνομα χρήστη” και “Κωδικό” ως εξής:

- στο “Όνομα χρήστη:”/“User Name:” δώσατε <scott> (χωρίς τα σύμβολα “<” και “>”)

- στο “Κωδικός πρόσβασης:”/“Password” δώσατε <tiger> (χωρίς τα σύμβολα “<” και “>”)

- στο “Αλφαριθμητικό”/“Host String:” μη δώσετε τίποτα

Τις εντολές θα τις βρείτε και στα παρακάτω αρχεία κειμένου. Για να τις εκτελέστε, απλά, μετά την πληκτρολόγηση του “@<όνομα αρχείου.sql>” θα εισάγετε την εντολή του περιβάλλοντος <RUN> (εκτός και αν οι εντολές εντός του αρχείου τερματίζουν με το ελληνικό ερωτηματικό -“;”). Την πρώτη φορά, για να “μάθει” το περιβάλλον το μονοπάτι (path) των αρχείων, ας γίνει “Αρχείο”/“File” > “Άνοιγμα”/“Open” και ας επιλεγεί το μονοπάτι όπου θα έχουν τοποθετηθεί τα παρακάτω κείμενα αρχείου (π.χ. “δείχνοντας” ένα (1) από τα παρακάτω αρχεία). Οι εντολές, βέβαια, μπορούν να εκτελεσθούν μία-μία ΧΩΡΙΣ το σύμβολο “;” στο τέλος, μόνες τους ή σε χωριστά αρχεία (δείτε και την ανάλυση των επί μέρους ερωτημάτων), Επίσης, για την καλύτερη αξιοποίηση περιβάλλοντος, μπορείτε να αλλάξετε μερικές παραμέτρους. Επιλέξτε “Επιλογές”/“Options” > “Περιβάλλον”/“Environment” και αλλάξετε τα εξής:

- <arraysize> κάνετε το πεδίο του <Value> από “Προκαθορισμός”/“Default” σε “Προσαρμοσμένο”/“Custom” με τιμή 20

- <pagesize> κάνετε το πεδίο του <Value> από “Προκαθορισμός”/“Default” σε “Προσαρμοσμένο”/“Custom” με τιμή 30

- <wrap> κάνετε το πεδίο του <Value> από “Ενεργοποιημένο”/“On” σε “Απενεργοποιημένο”/“Off”

επιτελώντας μία (1) μόνο αλλαγή τη φορά (ώστε να ενεργοποιούνται).


Παράρτημα GPE_5.2

{Διαφορές και ομοιότητες Σ.Δ.Β.Δ. Oracle και MS-Access}

- Οι τύποι χαρακτήρων ορίζονται με την ίδια εντολή (“VARCHAR”) αλλά οι τιμές τους στην MS-Access πρέπει να τίθενται εντός απλών διπλών εισαγωγικών (“"”)

- Οι αριθμητικοί τύποι δεδομένων διαφέρουν αρκετά. Στην MS-Access θυμίζουν γλώσσα προγραμματισμού (λ.χ. “BOOLEAN”, “INT”, “REAL” κ.τ.λ.) και λιγότερο SQL (λ.χ. δεν υποστηρίζεται ο τύπος “NUMERIC”). Μόνο η πρακτική εξάσκηση θα σας αποκαλύψει τα πλεονεκτήματά/μειονεκτήματά τους

- Ο τύπος δεδομένων “DATE” στην MS-Access παίρνει τη μορφή του από τις ρυθμίσεις των MS-Windows (και όχι από τη χρήση μιας συνάρτησης χειρισμού τιμών “ημερομηνίας” όπως στην Oracle

- Η συνάρτηση TO_DATE() δεν υποστηρίζεται στην MS-Access. Οι τιμές “ημερομηνίας”, όμως, οφείλουν να τίθενται μέσα στα σύμβολα της αγγλικής λίρας (#”)

- Οι Όψεις δεν ορίζονται στην MS-Access αλλά υποστηρίζονται! Ο χρήστης μπορεί να καλέσει ερώτημα (query) το οποίο περιέχει κώδικα σε SQL σαν να ήταν Πίνακας της Β.Δ. (δείτε το αρχείο “e3.mdb”). Τα δε επιλεγμένα πεδία στο ερώτημα γίνονται τα Κατηγορήματα αυτού του “Πίνακα”

- Οι πράξεις Τομή και Διαφορά Πινάκων δεν υποστηρίζονται στην MS-Access (υποστηρίζεται η Ένωση)

- Συχνά στην MS-Access απαιτείται η χρήση της Μετονομασίας σε επιλεγόμενα πεδία

- Συχνά η ίδια η MS-Access προσθέτει αγκύλες (“[”,“]”) οι οποίες περικλείουν τις ονομασίες Πινάκων και Παραδειγμάτων (προκειμένου να μπορέσει να επεξεργασθεί τον κώδικα σε SQL)

- Η MS-Access υποστηρίζει ένα είδος “προσωπικής” QBE. Για απλά ερωτήματα (query) αυτή η QBE ακολουθεί το πρότυπο αλλά για πολύπλοκα ερωτήματα (λ.χ. υλοποίηση Συνδέσεων, χρήση συναρτήσεων), όχι

- Η MS-Access δεν υποστηρίζει τη χρησιμοποίηση εντολών εντός αρχείων κειμένου

Παράρτημα GPE_5.3

{Συμβουλές για τον προγραμματισμό σε SQL}