Eeyem-er.eap.gr/wiki/:gr: ΜΕΡΟΣ'Α ΔΗΜΙΟΥΡΓΙΑ Β.Δ. κ' ΕΙΣΑΓΩΓΗ ΔΕΔΟΜΕΝΩΝ

From EEYEM Pilot Wiki
Jump to: navigation, search

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

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.χψ).