9 Η Γλώσσα SQL Εισαγωγή – Βασικές Έννοιες Τύποι Δεδομένων Ορισμός Δεδομένων (data definition) Χειρισμός Δεδομένων (data manipulation)
2 Εισαγωγή Η δομημένη γλώσσα ερωτημάτων SQL (Structured Query Language ) χρησιμοποιείται από τους χρήστες του ΣΔΒΔ για τη δημιουργία, τροποποίηση και ενημέρωση δεδομένων και τη διατύπωση ερωτημάτων. Η αρχική έκδοση της γλώσσας ονομάστηκε SEQUEL (Structured English Query Language) και σχεδιάστηκε από ερευνητική ομάδα της IBM. Η εταιρεία Oracle χρησιμοποίησε για πρώτη φορά τη γλώσσα σε εμπορικό ΣΔΒΔ το 1979.
3 Εισαγωγή Πρότυπα: SQL1 (1986) SQL2 ή SQL92 (1992) SQL3 ή SQL:1999 (1999)
4 Εισαγωγή Η γλώσσα SQL χαρακτηρίζεται από σημαντικά πλεονεκτήματα, εκ των οποίων τα βασικότερα είναι: Κάθε σχεσιακό σύστημα υποστηρίζει την SQL, οπότε η διατύπωση των ερωτημάτων είναι ανεξάρτητη από το χρησιμοποιούμενο ΣΔΒΔ. Η γλώσσα χρησιμοποιείται για όλες τις λειτουργίες του ΣΔΒΔ. Πολλές γλώσσες προγραμματισμού έχουν τροποποιηθεί ώστε να υποστηρίζουν διατύπωση ερωτημάτων σε SQL. Η SQL είναι έχει απλή σύνταξη, και αποδεσμεύει το χρήστη από λεπτομέρειες υλοποίησης.
5 Εισαγωγή Η γλώσσα SQL αποτελεί υλοποίηση της σχεσιακής άλγεβρας. Υποδιαιρείται σε 2 ξεχωριστές γλώσσες: Α) τη γλώσσα ορισμού δεδομένων (DDL) Β) τη γλώσσα χειρισμού δεδομένων (DML) H SQL χρησιμοποιεί όρους όπως πίνακας, γραμμή, στήλη, οι οποίοι αντιπροσωπεύουν τις έννοιες σχέση, πλειάδα και χαρακτηριστικό.
6 Η γλώσσα SQL Πλήρης γλώσσα βάσεων δεδομένων –γλώσσα ορισμού δεδομένων –γλώσσα χειρισμού δεδομένων –γλώσσα ορισμού όψεων –δυνατότητα για εμφύτευση σε γλώσσες προγραμματισμού γενικού σκοπού (π.χ. C, Pascal) Δηλωτική γλώσσα υψηλού επιπέδου –ορίζουμε το τι θέλουμε να γίνει όχι το πώς Η επεξεργασία γίνεται σε επίπεδο συνόλου –μηχανισμοί για επεξεργασία σε επίπεδο μεμονωμένων εγγραφών για υποστήριξη διαδικαστικών γλωσσών
7 Γλώσσα Ορισμού Δεδομένων Δημιουργία νέου σχήματος: CREATE SCHEMA νέο-σχήμα AUTHORIZATION όνομα-χρήστη
8 Δημιουργία πινάκων με την SQL Μέσω της εντολής create table ορίζουμε –το όνομα του πίνακα –τα ονόματα και τους τύπους δεδομένων των γνωρισμάτων –αν τα γνωρίσματα μπορούν να δέχονται ή όχι τιμές NULL –εξ ορισμού τιμές για τα γνωρίσματα –πρωτεύοντα κλειδιά και περιορισμούς μοναδικότητας –περιορισμούς τιμών πάνω σε πεδία –περιορισμούς αναφορικής ακεραιότητας
9 Δημιουργία πινάκων με την SQL – Βασική σύνταξη CREATE TABLE student ( amCHAR(13), department_idCHAR(5), surnameVARCHAR(15), nameVARCHAR(15), id_numberCHAR(7), father_nameVARCHAR(15), birth_dateDATE, exams_rankNUMBER(3), degree_gradeNUMBER(4, 2) );
10 Δημιουργία πινάκων με την SQL – Τύποι δεδομένων CHAR(N) – συμβολοσειρά σταθερού μήκους N χαρακτήρων –αν η συμβολοσειρά είναι μικρότερη από N χαρακτήρες συμπληρώνεται με κενά στο τέλος –αν η συμβολοσειρά είναι μεγαλύτερη από Ν χαρακτήρες περικόπτεται ή σφάλμα VARCHAR(N) – συμβολοσειρά μεταβλητού μήκους 0 έως Ν χαρακτήρες NUMBER(N) – ακέραιος έως N ψηφία –κατά περίπτωση υποστηρίζονται τα INTEGER, BINGINT, SMALLINT, TINYINT NUMBER(N, M) – ακέραιος με N συνολικά ψηφία από τα οποία τα M είναι δεκαδικά –κατά περίπτωση υποστηρίζονται float, real DATE – ημερομηνία που περιέχει και ώρα –κατά περίπτωση υποστηρίζονται ξεχωριστοί τύποι DATE, TIME και συνδυαστικός DATETIME ή TIMESTAMP
11 Τύποι Δεδομένων BOOLEAN NUMERIC, DECIMAL, INT FLOAT, DOUBLE DATE, TIME CHAR, VARCHAR … Είναι ο τύπος δεδομένων κατάλληλος για το είδος δεδομένων που πρέπει να αποθηκεύσετε; Πρέπει να χρησιμοποιήσετε έναν καθορισμένου μήκους ή μεταβλητού μήκους τύπο δεδομένων;
12 Δημιουργία πινάκων με την SQL – δυνατότητα χρήσης τιμών NULL CREATE TABLE student ( amCHAR(13) NOT NULL, department_idCHAR(5) NOT NULL, surnameVARCHAR(15) NOT NULL, nameVARCHAR(15) NOT NULL, id_numberCHAR(7) NOT NULL, father_nameVARCHAR(15) NOT NULL, birth_dateDATE NULL, exams_rankNUMBER(3) NOT NULL, degree_gradeNUMBER(4, 2) NULL ); Αν παραλειφθεί ο σχετικός προσδιορισμός, το γνώρισμα δέχεται τιμές NULL
13 Δημιουργία πινάκων με την SQL – Καθορισμός εξ ορισμού τιμών CREATE TABLE student ( amCHAR(13) NOT NULL, department_idCHAR(5) NOT NULL, surnameVARCHAR(15) NOT NULL, nameVARCHAR(15) NOT NULL, id_numberCHAR(7) NOT NULL, father_nameVARCHAR(15) DEFAULT 'ΑΓΝΩΣΤΟ' NOT NULL, birth_dateDATE DEFAULT '01/01/1970' NULL, exams_rankNUMBER(3) NOT NULL, degree_gradeNUMBER(4, 2) NULL ); Η πρόταση DEFAULT παρατίθεται για να δίνονται εξ ορισμού τιμές κατά την εισαγωγή στοιχείων, όταν οι τιμές των γνωρισμάτων δεν ορίζονται ρητώς Αν δεν είναι παρούσα πρόταση DEFAULT σε ένα γνώρισμα και δεν δοθεί τιμή στην εισαγωγή γι’ αυτό, χρησιμοποιείται η τιμή NULL
14 Δημιουργία πινάκων με την SQL – Πρωτεύοντα κλειδιά CREATE TABLE student ( amCHAR(13) NOT NULL, department_idCHAR(5) NOT NULL, surnameVARCHAR(15) NOT NULL, nameVARCHAR(15) NOT NULL, id_numberCHAR(7) NOT NULL PRIMARY KEY, father_nameVARCHAR(15) DEFAULT 'ΑΓΝΩΣΤΟ' NOT NULL, birth_dateDATE DEFAULT '01/01/1970' NULL, exams_rankNUMBER(3) NOT NULL, degree_gradeNUMBER(4, 2) NULL -- PRIMARY KEY(id_number) ); Όταν το πρωτεύον κλειδί είναι ένα γνώρισμα μόνον, μπορεί να ορισθεί είτε γράφοντας PRIMARY KEY δίπλα από το γνώρισμα είτε παραθέτοντας την πρόταση PRIMARY KEY μετά το τέλος των πεδίων
15 Δημιουργία πινάκων με την SQL – Περιορισμοί μοναδικότητας Ένας πίνακας μπορεί να έχει μόνον ένα πρωτεύον κλειδί, αλλά επίσης να έχει περιορισμούς μοναδικότητας πάνω σε άλλα πεδία. Αν το πεδίο είναι ένα, δηλώνεται με τη λέξη UNIQUE δίπλα από το όνομα του CREATE TABLE student ( amCHAR(13) NOT NULL, department_idCHAR(5) NOT NULL, surnameVARCHAR(15) NOT NULL, nameVARCHAR(15) NOT NULL, id_numberCHAR(7) NOT NULL UNIQUE, father_nameVARCHAR(15) DEFAULT 'ΑΓΝΩΣΤΟ' NOT NULL, birth_dateDATE DEFAULT '01/01/1970' NULL, exams_rankNUMBER(3) NOT NULL, degree_gradeNUMBER(4, 2) NULL, PRIMARY KEY(am, department_id) );
16 Δημιουργία πινάκων με την SQL – Περιορισμοί μοναδικότητας Αν τα μοναδικά γνωρίσματα είναι δύο ή περισσότερα, δηλώνονται με ξεχωριστή πρόταση UNIQUE μετά τους ορισμούς των πεδίων CREATE TABLE student ( amCHAR(13) NOT NULL, department_idCHAR(5) NOT NULL, surnameVARCHAR(15) NOT NULL, nameVARCHAR(15) NOT NULL, id_numberCHAR(7) NOT NULL PRIMARY KEY, father_nameVARCHAR(15) DEFAULT 'ΑΓΝΩΣΤΟ' NOT NULL, birth_dateDATE DEFAULT '01/01/1970' NULL, exams_rankNUMBER(3) NOT NULL, degree_gradeNUMBER(4, 2) NULL, UNIQUE (am, department_id) );
17 Περιορισμοί τιμών πάνω σε πεδία CREATE TABLE student ( amCHAR(13) NOT NULL, department_idCHAR(5) NOT NULL, surnameVARCHAR(15) NOT NULL, nameVARCHAR(15) NOT NULL, id_numberCHAR(7) NOT NULL PRIMARY KEY, father_nameVARCHAR(15) DEFAULT 'ΑΓΝΩΣΤΟ' NOT NULL, birth_dateDATE DEFAULT '01/01/1970' NULL, exams_rankNUMBER(3) NOT NULL, degree_gradeNUMBER(4, 2) NULL, UNIQUE (am, department_id), CHECK ((degree_grade >= 5) AND (degree_grade <= 10) OR (degree_grade IS NULL)) );
18 Περιορισμοί αναφορικής ακεραιότητας CREATE TABLE department ( dept_idCHAR(5) NOT NULL PRIMARY KEY, dept_nameVARCHAR(20) NOT NULL ); CREATE TABLE student ( amCHAR(13) NOT NULL, department_idCHAR(5) NOT NULL REFERENCES department(dept_id), surnameVARCHAR(15) NOT NULL, nameVARCHAR(15) NOT NULL, id_numberCHAR(7) NOT NULL PRIMARY KEY, father_nameVARCHAR(15) DEFAULT 'ΑΓΝΩΣΤΟ' NOT NULL, birth_dateDATE DEFAULT '01/01/1970' NULL, exams_rankNUMBER(3) NOT NULL, degree_gradeNUMBER(4, 2) NULL, UNIQUE (am, department_id), CHECK ((degree_grade >= 5) AND (degree_grade <= 10) OR (degree_grade IS NULL)) );
19 Περιορισμοί αναφορικής ακεραιότητας Αν τα ονόματα των στηλών στους δύο πίνακες ταυτίζονται, μπορεί στον πίνακα που ορίζεται το ξένο κλειδί να παραληφθεί το όνομα της στήλης department_id CHAR(5) NOT NULL REFERENCES department Η στήλη προς την οποία αναφερόμαστε πρέπει να είναι μοναδική (UNIQUE) ή πρωτεύον κλειδί στον πίνακα όπου βρίσκεται Μπορούμε να ορίσουμε ότι η διαγραφή στον αναφερόμενο πίνακα, προκαλεί διαγραφή στον πίνακα όπου ορίζεται ο περιορισμός department_id CHAR(5) NOT NULL REFERENCES department ON DELETE CASCADE Αν έχουμε δύο ή περισσότερες στήλες στο ξένο κλειδί πρέπει να χρησιμοποιήσουμε την πρόταση FOREIGN KEY
20 Περιορισμοί αναφορικής ακεραιότητας CREATE TABLE student ( amCHAR(13) NOT NULL, department_idCHAR(5) NOT NULL REFERENCES department(dept_id), id_numberCHAR(7) NOT NULL PRIMARY KEY, … UNIQUE (am, department_id), CHECK ((degree_grade >= 5) AND (degree_grade <= 10) OR (degree_grade IS NULL)) ); create table grade( amCHAR(13) NOT NULL, dept_idCHAR(5) NOT NULL, teaching_idCHAR(7) NOT NULL, exam_periodCHAR(1) CHECK (exam_period in (1, 2, 3)), gradeINTEGER NOT NULL, PRIMARY KEY(am, dept_id, teaching_id, exam_period), FOREIGN KEY(am, dept_id) REFERENCES student(am, department_id));
21 Καταστροφή πινάκων Μέσω της εντολής DROP TABLE drop table grade; Ο πίνακας δεν μπορεί να καταστραφεί αν υπάρχουν περιορισμοί ακεραιότητας που τον αναφέρουν drop table student cascade constraints;
22 Μεταβολή δομής πινάκων Τροποποιείται η δομή του πίνακα με έναν από τους κάτωθι τρόπους –προσθήκη μιας στήλης ALTER TABLE student ADD (hmeromhnia_orkomosias DATE); –αλλαγή του τύπου, δυνατότητας χρήσης τιμών NULL ή εξ ορισμού τιμής μιας στήλης ALTER TABLE student MODIFY (am integer not null); –προσθήκη ή κατάργηση περιορισμών ακεραιότητας ALTER TABLE student ADD CONSTRAINT am_not_zero CHECK (am <> 0); ALTER TABLE student DROP CONSTRAINT am_not_zero;
23 Γλώσσα Ορισμού Δεδομένων Δημιουργία νέου πίνακα: CREATE TABLE νέος-πίνακας (στήλη1 τύπος-δεδομένων, στήλη2 τύπος-δεδομένων,... στήληN τύπος-δεδομένων,,...
24 Γλώσσα Ορισμού Δεδομένων Δημιουργία νέου πίνακα: CREATE TABLE Γνωστική_Περιοχή (κωδικός INTEGER NOT NULL, τίτλος CHAR(50) NOT NULL, αριθμός_συνδρομητών INTEGER DEFAULT 0, PRIMARY KEY (κωδικός), UNIQUE (τίτλος), CHECK (αριθμός_συνδρομητών >= 0))
25 Γλώσσα Ορισμού Δεδομένων Δημιουργία νέου πίνακα: CREATE TABLE Πρακτικά_Συνεδρίου (κωδικός INTEGER NOT NULL, συνέδριο VARCHAR(100) NOT NULL, ημερομηνία DATE NOT NULL, χώρα CHAR(20), κωδικός_εκδοτικού_οίκου INTEGER NOT NULL, PRIMARY KEY (κωδικός), FOREIGN KEY (κωδικός_εκδοτικού_οίκου) REFERENCES Εκδοτικός_Οίκος (κωδικός) ON DELETE CASCADE ON UPDATE CASCADE )
26 Γλώσσα Ορισμού Δεδομένων Αλλαγή δομής πίνακα: ALTER TABLE Χρησιμοποιείται για: προσθήκη νέας στήλης στον πίνακα, διαγραφή υπάρχουσας στήλης, εισαγωγή νέου περιορισμού (constraint), κατάργηση περιορισμού, αλλαγή της αρχικής τιμής στήλης (default), κατάργηση αρχικής τιμής στήλης.
27 Γλώσσα Ορισμού Δεδομένων Αλλαγή δομής πίνακα: Κατασκευή νέας στήλης ALTER TABLE Συνδρομητής ADD COLUMN ημερ/νία-γέννησης DATE NOT NULL Για την κατάργηση της στήλης ημερ/νία-γέννησης έχουμε: ALTER TABLE Συνδρομητής DROP COLUMN ημερ/νία-γέννησης
28 Γλώσσα Χειρισμού Δεδομένων Εντολές: SELECT, για διατύπωση ερωτημάτων, INSERT, για εισαγωγή νέων δεδομένων, UPDATE, για ενημέρωση δεδομένων, και DELETE, για διαγραφή δεδομένων από τη ΒΔ,
29 Γλώσσα Χειρισμού Δεδομένων SELECT: SELECT [DISTINCT] FROM [WHERE συνθήκη] [GROUP BY ] [HAVING συνθήκη] [ORDER BY [ASCENDING | DESCENDING]]
30 Γλώσσα Χειρισμού Δεδομένων Παραδείγματα SELECT ``Να επιστραφούν όλες οι γραμμές του πίνακα Γνωστική_Περιοχή.'' SELECT * FROM Γνωστική_Περιοχή ή SELECT κωδικός, τίτλος, αριθμός_συνδρομητών FROM Γνωστική_Περιοχή
31 Γλώσσα Χειρισμού Δεδομένων Παραδείγματα SELECT ``Να βρεθούν οι κωδικοί, τα ονόματα και οι αριθμοί πιστωτικών καρτών των συνδρομητών που βρίσκονται στην Ελλάδα, και τα αποτελέσματα να ταξινομηθούν αλφαβητικά ως προς το όνομα, και στη συνέχεια ως προς τον αριθμό πιστωτικής κάρτας.'' SELECT κωδικός, όνομα, ΑΠΚ FROM Συνδρομητής WHERE χώρα = `Ελλάδα' ORDER BY όνομα, ΑΠΚ
32 Γλώσσα Χειρισμού Δεδομένων Παραδείγματα SELECT ``Να βρεθούν οι κωδικοί και τα ονόματα των συνδρομητών και οι τίτλοι των γνωστικών περιοχών για τις οποίες έχουν πληρώσει συνδρομή.'' SELECT Συνδρομητής.κωδικός, Συνδρομητής.όνομα, Γνωστική_Περιοχή.τίτλος FROM Συνδρομητής, Γνωστική_Περιοχή, Συνδρομή WHERE Συνδρομητής.κωδικός = Συνδρομή.κωδικός_συνδρομητή AND Συνδρομή.κωδικός_γνωστικής_περιοχής = Γνωστική_Περιοχή.κωδικός