4.1.1+Τύποι+δεδομένων+της+SQL

4.1.1 Τύποι Δεδομένων της SQL
**Στόχοι / Προσδοκώμενα Αποτελέσματα** Ο μαθητής/τρια πρέπει να είναι ικανός/ή:
 * να περιγράφει βασικούς τύπους δεδομένων της γλώσσας SQL και να δίνει παραδείγματα τιμών για κάθε τύπο
 * να διακρίνει τις διαφορές μεταξύ των τύπων δεδομένων της SQL και να αντιστοιχίζει χαρακτηριστικά οντοτήτων και πεδία σχέσεων με τους τύπους δεδομένων της SQL
 * να περιγράφει πεδία σχέσεων με τους αντίστοιχους SQL τύπους τους για συγκεκριμένα προβλήματα

Οι περισσότερες γλώσσες προγραμματισμού έχουν **τύπους δεδομένων**, δηλαδή συγκεκριμένους τρόπους αναπαράστασης των δεδομένων. Αυτό σημαίνει ότι δίνουν στον προγραμματιστή συγκεκριμένες επιλογές για το είδος των στοιχείων που θα επεξεργαστούν τα προγράμματά του. Για παράδειγμα, σε ένα πρόγραμμα που επεξεργάζεται βαθμούς μαθητών, ο προγραμματιστής θα ορίσει τους προφορικούς βαθμούς των τετραμήνων ως ακέραιους αριθμούς. Με άλλα λόγια, ο τύπος δεδομένων των προφορικών βαθμών θα είναι ακέραιος αριθμός.

Η SQL που είναι γλώσσα προγραμματισμού Βάσεων Δεδομένων, έχει τους δικούς της τύπους δεδομένων, οι οποίοι χρησιμοποιούνται για να καθοριστεί το είδος των στοιχείων που θα αποθηκεύονται στους σχεσιακούς πίνακες.

Για να δημιουργηθεί ένας πίνακας με SQL, πρέπει πρώτα να καθοριστούν τα πεδία από τα οποία θα αποτελείται ο πίνακας. Τα πεδία καθορίζονται από το όνομά τους και τον τύπο τους. Το όνομα κάθε πεδίου το επιλέγει ο σχεδιαστής και είναι μία λέξη, π.χ. Τίτλος, Ονοματεπώνυμο, Ημερομηνία_γέννησης, Έτος_δημιουργίας, Βαθμός, κλπ.

Ο τύπος ενός πεδίου καθορίζει το είδος των δεδομένων που μπορούν να αποθηκευτούν σε αυτό το πεδίο. Ο τύπος αυτός είναι ένας από τους τύπους δεδομένων που υποστηρίζει η γλώσσα SQL. Πριν μάθουμε επομένως πώς δημιουργούμε έναν πίνακα σε SQL, πρέπει να μάθουμε ποιοι είναι οι τύποι δεδομένων της SQL.

Η SQL υποστηρίζει διάφορους τύπους δεδομένων: αριθμητικούς, αλφαριθμητικούς, ημερομηνίας, ώρας, κλπ οι οποίοι επιλέγονται από το σχεδιαστή της βάσης ανάλογα με τις ανάγκες. Για παράδειγμα, σε μια βάση δεδομένων που αποθηκεύει στοιχεία για ταινίες κινηματογράφου, ο τίτλος της ταινίας είναι μια φράση που αποτελείται από αλφαριθμητικά στοιχεία, δηλαδή γράμματα και σύμβολα. Ο τύπος του πεδίου «Τίτλος» θα είναι επομένως αλφαριθμητικός. Το κόστος δημιουργίας μιας ταινίας όμως, είναι αριθμητικού τύπου. Στην Εικόνα 4-1 βλέπουμε τον πίνακα «Ταινία» που αποτελείται από τις στήλες «Τίτλος», «Έτος_δημιουργίας», «Σκηνοθέτης» και «Κόστος» καθώς και τιμές για την ταινία «Το κύμα (Die Welle)».

Εικόνα 4-1. Ο σχεσιακός πίνακας «Ταινία» με δεδομένα για ταινίες κινηματογράφου
 * ~ Τίτλος ||~ Έτος_δημιουργίας	||~ Σκηνοθέτης ||~ Κόστος ||
 * Το κύμα (Die Welle) ||2008 ||Dennis Gansel ||5.000.000  ||

Σε ένα διαφορετικό παράδειγμα, αν θέλουμε να αποθηκεύσουμε σε έναν πίνακα τιμές προϊόντων, η τιμή κάθε προϊόντος σε ευρώ πρέπει να αποθηκευτεί ως αριθμός με υποδιαστολή, π.χ. 4,25 . Στα σχολεία, για να διευκολυνθεί η λειτουργία τους, υπάρχει η ανάγκη αποθήκευσης δεδομένων για τους καθηγητές, τους μαθητές, τα τμήματα, τα μαθήματα, τις απουσίες, τους βαθμούς των μαθητών, κλπ. Τα στοιχεία των μαθητών περιλαμβάνουν το ονοματεπώνυμο και το πατρώνυμό τους. Οπότε μπορούμε να πούμε για αρχή, ότι ο πίνακας με τα στοιχεία των μαθητών θα μοιάζει με τον εξής:

Εικόνα 4-2. Σχεσιακός πίνακας με το επώνυμο, το όνομα και το πατρώνυμο των μαθητών
 * ~ Επώνυμο	||~ Όνομα	         ||~ Πατρώνυμο ||
 * Ομήρου	               || Οδύσσεια	          || Όμηρος       ||
 * Πηλείδης	       || Αχιλλέας	          || Πηλέας        ||

Αριθμητικοί τύποι δεδομένων της SQL
Δύο βασικοί αριθμητικοί τύποι δεδομένων που υποστηρίζονται από την SQL είναι οι ακέραιοι και οι πραγματικοί αριθμοί. Οι ακέραιοι αριθμοί δεν έχουν υποδιαστολή, ενώ οι πραγματικοί έχουν. Η λέξη που χρησιμοποιεί η SQL για τον ορισμό πεδίων ακέραιου τύπου είναι INTEGER, ενώ για τον ορισμό πεδίων πραγματικού τύπου είναι FLOAT. Ο Πίνακας 4-1 συνοψίζει δύο βασικούς αριθμητικούς τύπους δεδομένων της SQL για ακέραιους και πραγματικούς αριθμούς.

Πίνακας 4-1. Αριθμητικοί τύποι δεδομένων FLOAT, INTEGER της SQL
 * ~ Τύπος δεδομένων ||~ Περιγραφή ||
 * INTEGER ή ΙΝΤ	|| Ακέραιος αριθμός (χωρίς υποδιαστολή) ||
 * FLOAT	|| Αριθμός με υποδιαστολή ||

Στο παράδειγμα των ταινιών κινηματογράφου επομένως που αναφέρθηκε παραπάνω, το πεδίο «Κόστος» είναι ακέραιου τύπου, δηλαδή τύπου INTEGER. Στο παράδειγμα με τα προϊόντα, το πεδίο «Τιμή_προϊόντος» είναι πραγματικού τύπου, δηλαδή τύπου FLOAT γιατί οι τιμές έχουν και δεκαδικό μέρος. Σε μια βάση δεδομένων Μαθητολογίου για την αποθήκευση και διαχείριση των δεδομένων του σχολείου, καταγράφεται η πληροφορία για τα μαθήματα του προγράμματος σπουδών. Έτσι δημιουργείται ο πίνακας «Μάθημα» που αποτελείται από τις στήλες «Όνομα» και «Ώρες» και σε αυτόν αποθηκεύονται οι πληροφορίες για όλα τα μαθήματα που παρακολουθούν οι μαθητές του σχολείου. Οι εβδομαδιαίες ώρες διδασκαλίας των μαθημάτων που αποθηκεύονται στη στήλη «Ώρες», είναι ακέραιος αριθμός.

Εικόνα 4-3. Ο σχεσιακός πίνακας «Μάθημα»
 * ~ Όνομα ||~ Ώρες ||
 * Συστήματα Διαχείρισης Βάσεων Δεδομένων και εφαρμογές τους στο Web	|| 5 ||

Στην Εικόνα 4-3 βλέπουμε τον πίνακα «Μάθημα», στον οποίον έχει αποθηκευτεί η πληροφορία για το μάθημα «Συστήματα Διαχείρισης Βάσεων Δεδομένων και εφαρμογές τους στο Web».

Αλφαριθμητικοί τύποι δεδομένων της SQL
Οι αλφαριθμητικοί τύποι δεδομένων υποστηρίζουν την αποθήκευση κειμένου, δηλαδή συμβολοσειρών ή σειρών από χαρακτήρες, γι’ αυτό και συχνά ονομάζονται τύποι ‘χαρακτήρων’. Η λέξη που χρησιμοποιεί η SQL για τον ορισμό πεδίων τύπου χαρακτήρα (αλφαριθμητικού) είναι CHARACTER. Η SQL δίνει τη δυνατότητα ορισμού του μεγέθους μιας σειράς χαρακτήρων με την έκφραση CHARACTER(N), όπου στη θέση του N τοποθετείται ένας ακέραιος αριθμός που δηλώνει το μέγεθος του πεδίου, δηλαδή περιορίζει τις τιμές σε μέγεθος Ν. Ο τύπος CHARACTER VARYING(N) ή VARCHAR(N) χρησιμοποιείται για τη δημιουργία πεδίων τύπου χαρακτήρων μεταβλητού μεγέθους N. Ο Πίνακας 4-2 συνοψίζει τους τύπους CHAR και VARCHAR της SQL.

Πίνακας 4-2. Αλφαριθμητικοί τύποι δεδομένων CHAR, VARCHAR της SQL
 * ~ Τύπος δεδομένων ||~ Περιγραφή ||
 * CHARACTER(N) ή CHAR(N)	|| Σειρά χαρακτήρων (συμβόλων) σταθερού μήκους N. Το μήκος N αναφέρεται στο μέγιστος μήκος της τιμής. Οι τιμές για πεδία αυτού του τύπου πρέπει να γράφονται μέσα σε μονά εισαγωγικά ‘ ‘, π.χ. ‘Γιώργος’ ||
 * CHARACTER VARYING(N) ή VARCHAR(N)	|| Συμβολοσειρά χαρακτήρων μεταβλητού μεγέθους, μέγιστου N. ||

Στο παράδειγμα των μαθημάτων της προηγούμενης παραγράφου, το πεδίο «Όνομα_μαθήματος» είναι αλφαριθμητικού τύπου και επειδή κάθε όνομα έχει διαφορετικό πλήθος χαρακτήρων, το συγκεκριμένο πεδίο θα μπορούσε να οριστεί ως τύπου VARCHAR(100) ώστε να μπορέσει να αποθηκεύσει ονόματα μεταβλητού μεγέθους και αρκετά μεγάλα ονόματα, μέχρι 100 χαρακτήρων. Στο Μαθητολόγιο του σχολείου, ένα άλλο πεδίο που αποθηκεύεται για τους μαθητές είναι το φύλο τους. Το φύλο μπορεί να πάρει τις τιμές ‘Άρρεν’ και ‘Θήλυ’ ή σε συντομία ‘Α’ ή ‘Θ’. Σε αυτή την περίπτωση το φύλο μπορεί να οριστεί ως τύπου CHARACTER(1).

Τύποι δεδομένων για την ημερομηνία και την ώρα
Πεδία που αποθηκεύουν ημερομηνία ή ώρα μπορούν να οριστούν ως τύπου DATE, TIME ή TIMESTAMP. Ο τύπος DATE μπορεί να αποθηκεύσει δεδομένα που αποτελούνται από το έτος (YEAR) με τιμές από 0001 ως 9999, το μήνα (MONTH) και την ημέρα (DAY). Ο τύπος TIME μπορεί να αποθηκεύσει τιμές που αποτελούνται από την ώρα (HOUR), τα λεπτά (MINUTE) και τα δευτερόλεπτα (SECOND). Ο τύπος TIMESTAMP μπορεί να αποθηκεύσει τιμές που αποτελούνται από το έτος, το μήνα, την ημέρα, την ώρα, τα λεπτά και τα δευτερόλεπτα. Ο Πίνακας 4-3 συνοψίζει τους τύπους DATE, TIME και TIMESTAP.

Πίνακας 4-3. Τύποι δεδομένων DATE, TIME και TIMESTAMP της SQL
 * ~ Τύπος δεδομένων ||~ Περιγραφή ||
 * DATE, TIME, TIMESTAMP	|| Τύποι δεδομένων για την ημερομηνία και την ώρα. Αποτελούνται από ακέραιους αριθμούς (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND) και παριστάνουν απόλυτες χρονικές στιγμές. ||

Επομένως, τιμές όπως ‘24-06-2015’ μπορούν να αποθηκευτούν σε πεδία τύπου DATE, τιμές όπως ‘15:02:34’ μπορούν να αποθηκευτούν σε πεδία τύπου TIME, ενώ τιμές όπως ‘24-06-2015 15:02:34’. Στο παράδειγμα του Μαθητολογίου, η ημερομηνία γέννησης ενός μαθητή μπορεί να αποθηκευτεί σε πεδίο τύπου DATE. Στον Πίνακα 4-3 μπορούμε να δούμε μια εγγραφή στον πίνακα «Μαθητής» με το πεδία το «Επώνυμο», το «Όνομα», το «Πατρώνυμο» και την «Ημερομηνία_γέννησης» του μαθητή/της μαθήτριας.

Εικόνα 4-4. Ο σχεσιακός πίνακας «Μαθητής» (Επώνυμο. Όνομα, Πατρώνυμο, Ημερομηνία_Γέννησης)
 * ~ Επώνυμο	||~ Όνομα	||~ Πατρώνυμο 	||~ Ημερομηνία_Γέννησης ||
 * Ομήρου	|| Οδύσσεια	||Όμηρος	|| 01-05-1999 ||
 * Πηλείδης	|| Αχιλλέας	|| Πρίαμος	|| 24-06-1999 ||

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

Στο **ΠΑΡΑΡΤΗΜΑ 4.1: Οι Τύποι Δεδομένων της SQL** γίνεται απαρίθμηση όλων των τύπων δεδομένων που υποστηρίζει η SQL.

**Ερωτήσεις / Δραστηριότητες** 1)	Σε βάση δεδομένων ταινιών κινηματογράφου, τι είδους δεδομένα αποθηκεύονται: α) στο έτος δημιουργίας της ταινίας, β) στο ονοματεπώνυμο του σκηνοθέτη και γ) στο κόστος δημιουργίας της ταινίας; 2)	Περιγράψτε τον τύπο των δεδομένων για έναν πίνακα «Βιβλίο» που θα αποτελείται από τα εξής πεδία : Τίτλος, Συγγραφέας, Εκδοτικός Οίκος, Τιμή.

1)	Δίνεται ο παρακάτω πίνακας με δεδομένα που αφορούν σε βιβλία:
 * Δραστηριότητα**


 * Ιλιάδα	||Όμηρος	||2003	||18,37||
 * Ερωτόκριτος	||Κορνάρος, Βιτσέντζος	||1985	||12,75||

α) Αποδώστε ονόματα στα πεδία του πίνακα. β) Διακρίνετε τα πεδία του πίνακα σε αριθμητικού, αλφαριθμητικού τύπου και τύπου ημερομηνίας-ώρας. γ) Αποδώστε τύπους δεδομένων της SQL σε καθένα από τα πεδία του πίνακα.