Εργαστήριο βάσεων δεδομένων Εισαγωγή στη MySQL (2)
Παράδειγμα -ER
Παράδειγμα-Σχεσιακό
Παράδειγμα Δημιουργία Πινάκων CREATE TABLE student( name VARCHAR(25) DEFAULT 'unknown' NOT NULL, lastname VARCHAR(25) DEFAULT 'unknown' NOT NULL, AM INT(5) NOT NULL AUTO_INCREMENT, PRIMARY KEY(AM) )engine='innodb'; CREATE TABLE professor( pr_name VARCHAR(25) DEFAULT 'unknown' NOT NULL, pr_lastname VARCHAR(25) DEFAULT 'unknown' NOT NULL, email VARCHAR(255) NOT NULL, PRIMARY KEY(email) )engine='innodb';
Παράδειγμα Δημιουργία Πινάκων CREATE TABLE course( title VARCHAR(255) DEFAULT 'unknown' NOT NULL, material TEXT, course_id INT(4) NOT NULL AUTO_INCREMENT, supervisor VARCHAR(255) NOT NULL, PRIMARY KEY(course_id), UNIQUE(title), CONSTRAINT SUPERVISED FOREIGN KEY (supervisor) REFERENCES professor(email) ON DELETE CASCADE ON UPDATE CASCADE )engine='innodb'; CREATE TABLE books( title VARCHAR(128) DEFAULT 'Title' NOT NULL, course_book INT(4) NOT NULL, PRIMARY KEY(title,course_book), CONSTRAINT CRSBOOK FOREIGN KEY (course_book) REFERENCES course(course_id) ON DELETE CASCADE ON UPDATE CASCADE )engine='innodb';
Παράδειγμα Δημιουργία Πινάκων CREATE TABLE lecture( subject VARCHAR(128), num_lecture INT(2) NOT NULL, course_lecture INT(4) NOT NULL, PRIMARY KEY(num_lecture,course_lecture), CONSTRAINT CRSLECTURE FOREIGN KEY (course_lecture) REFERENCES course(course_id) ON DELETE CASCADE ON UPDATE CASCADE )engine='innodb'; CREATE TABLE registration( reg_date DATE NOT NULL, reg_student INT(5) NOT NULL, reg_course INT(4) NOT NULL, PRIMARY KEY(reg_student,reg_course) )engine='innodb'; ALTER TABLE registration ADD CONSTRAINT CRSREGISTRATION FOREIGN KEY (reg_course) REFERENCES course(course_id) ON DELETE CASCADE ON UPDATE CASCADE, ADD CONSTRAINT STDNTREGISTRATION FOREIGN KEY (reg_student) REFERENCES student(am) ON DELETE CASCADE ON UPDATE CASCADE;
Βάση Δεδομένων για τα παραδείγματα professor pr_name pr_lastname email nikos unknown nikos@ceid.upatras.gr unknown Παπαδόπουλος pap@ceid.gr unknown Γεωργίου geo@ceid.gr course title material course_id supervisor Βάσεις Προχωρηµένα θέµατα 3 geo@ceid.gr εδοµένων ΙΙ βάσεων εδοµένων Βάσεις εδοµένων Εισαγωγή σε σχεσιακές βάσεις δεδοµένων student name lastname AM Βιβή Τζέκου 2191 unknown Λαζάρου 2192 Γιώργος Νικολάου 2193 Μαρία Αναστοπούλου 1845 2 pap@ceid.gr
Βάση Δεδομένων για τα παρδείγματα #2 books title course_book Databases 1 2 Databases 1 2nd volume 2 Databases 2 3 lecture subject num_lecture course_lecture Εισαγωγή σε βάσεις 1 2 Ανάλυση απαιτήσεων 2 2 ER-Σχεσιακό 3 2 Κανονικοποίηση Βάσεων 1 3 Βελτιστοποίηση Βάσεων 2 3 registration reg_date reg_student reg_course 2005-09-25 1845 2 2005-10-02 2191 2 2004-02-17 2192 3 2004-02-13 2193 3 2004-10-24 2191 3
Εισαγωγή στοιχείων σε πίνακα Η εισαγωγή μιας εγγραφής σε πίνακα γίνεται με την εντολή insert. H εντολή insert συντάσσεται ως εξής: INSERT [INTO] όνοµα_πίνακα [(όνοµα_στήλης,...)] VALUES ((τιµή),...) Όταν συμπεριλαμβάνουμε τιμές για όλες τις στήλες δεν χρειάζεται να αναφέρουμε τη λίστα των τιμών (not recommended!). Σε όποια στήλη δεν θέλουμε να προσδιορίσουμε τιμή μπορούμε αντί για τιμή να βάλουμε NULL ή DEFAULT. Αν δωθεί η τιμή NULL σε ένα πεδίο με την ιδιότητα AUTO_INCREMENT, τότε η τιμή θα υπολογιστεί αυτόματα. Μπορούμε να εισάγουμε πολλαπλές εγγραφές με μια insert ως εξής: INSERT [INTO] table VALUES (value11,value12,, value1n), (value21,value22,, value2n), (valuen1,valuen2,, valuenn);
Insert-παραδείγματα INSERT INTO professor(pr_name,pr_lastname,email) VALUES (DEFAULT,'Παπαδόπουλος','pap@ceid.gr') ; Ή INSERT INTO professor VALUES(DEFAULT, 'Γεωργίου','geo@ceid.gr') ;
Ανάκτηση πληροφορίας από τη βάση Η ανάκτηση πληροφοριών από τη βάση γίνεται με την εντολή select. Απάντηση σε μία ερώτηση select είναι ένα σύνολο εγγραφών που πληρούν τις προϋποθέσεις. Η απλούστερη σύνταξή της είναι: SELECT <λίστα ονοµάτων στήλης> FROM <λίστα πινάκων> WHERE <συνθήκη> Σε πρίπτωση που θέλουμε να επιλέξουμε όλα τα γνωρίσματα, αντί της λίστας ονομάτων της στήλης βάζουμε *. Στην WHERE πρόταση οι τελεστές είναι =,<>,>,>=,<,<=,like (με % και _). Η σύγκριση με το NULL γίνεται με τους τελεστές is NULL και is not NULL.
Select-παραδείγματα SELECT * FROM professor WHERE pr_name='unknown ; SELECT pr_lastname,email FROM professor WHERE pr_name<>'unknown'; SELECT lastname FROM student where AM>2000; SELECT * FROM course WHERE material like '%Εισαγωγή% ; SELECT num_lecture FROM lecture WHERE subject like '%ER%' AND course_lecture=2 ;
Select-Order By ORDER BY: Ταξινόμηση σύμφωνα με το πεδίο που αναφέρεται. SELECT AM,lastname FROM student ORDER BY AM ASC; Οι τελεστές ASC και DESC σημαίνουν ταξινόμηση με αύξουσα και φθίνουσα σειρά αντίστοιχα. Επιστρέφει: AM lastname 1845 Αναστοπούλου 2191 Βιβή 2192 Λαζάρου 2193 Νικολάου
Select-Limit LIMIT: καθορίζει τον αριθμό των εγγραφών που επιστρέφονται από την select. SELECT * FROM lecture ORDER BY course_lecture LIMIT 2,3; Το πρώτο νούμερο καθορίζει τη θέση εκκίνησης (με αρίθμηση που ξεκινάει από το 0) και το δεύτερο ο αριθμός των εγγραφών που θα επιστρέψει. Επιστρέφει: subject num_lecture course_lecture ER-Σχεσιακό 3 2 Κανονικοποίηση Βάσεων 1 3 Βελτιστοποίηση Βάσεων 2 3
Select-Group By GROUP BY: Ομαδοποίηση εγγραφών σύμφωνα με το πεδίο που αναφέρεται. SELECT reg_student,count(*) FROM registration GROUP BY reg_student; Επιστρέφει: reg_student count( * ) 1845 1 2191 2 2192 1 2193 2
Ενσωματωμένες συναρτήσεις Χρησιμοποιούνται συνήθως με την group by: SUM: Άθροισμα COUNT: Μέτρηση Πλήθους ΜΑΧ: Μέγιστο MIN: Ελάχιστο AVG: Μέσος όρος
Select-Having HAVING: συνθήκη που εφαρμόζεται στην GROUP BY. SELECT reg_student,count(*) FROM registration GROUP BY reg_student HAVING count(*) >1; Επιστρέφει: reg_student count( * ) 2191 2 Ενώ για άλλη συνθήκη: SELECT reg_student,count(*) FROM registration WHERE reg_date > 2005-01-01 GROUP BY reg_student;
Δεδομένα από πολλαπλούς πίνακες- Εμφωλευμένες select SELECT name, lastname FROM student WHERE AM IN (SELECT reg_student FROM registration WHERE reg_date>'2005-01-01 ); Επιστρέφει τις εγγραφές του πίνακα student των οποίων το AM είναι μέσα στο υποσύνολο που επιστρέφεται από τη δεύτερη select. Επιστρέφει: name lastname Βιβή Τζέκου Μαρία Αναστοπούλου
Δεδομένα από πολλαπλούς πίνακες- Join JOIN: Συνένωση πινάκων για το συνδυασμό πληροφοριών, κυρίως όταν έχουμε συσχέτιση. select num_lecture,subject,title from lecture inner join course on course.course_id = lecture.course_lecture order by course.title; Επιστρέφει τις εγγραφές των διαλέξεων συνδυάζοντας τον πίνακα με τον πίνακα των μαθημάτων έτσι ώστε μέσω του ξένου κλειδιού course_lecture να αποκτήσει και το όνομα του μαθήματος: num_lecture subject title 1 Εισαγωγή σε βάσεις Βάσεις εδοµένων 2 Ανάλυση απαιτήσεων Βάσεις εδοµένων 3 ER-Σχεσιακό Βάσεις εδοµένων 1 Κανονικοποίηση Βάσεων Βάσεις εδοµένων ΙΙ 2 Βελτιστοποίηση Βάσεων Βάσεις εδοµένων ΙΙ
Δεδομένα απο πολλαπλούς πίνακεςπαράθεση πινάκων Υλοποίηση με παράθεση των πινάκων στο from κομμάτι και εξίσωση των ξένων κλειδιών με τα πρωτεύοντα στο where κομμάτι. SELECT num_lecture,subject,title FROM lecture inner join course on course.course_id=lecture.course_lecture ORDER BY course.title; Η προηγούμενη join: SELECT num_lecture,subject,title FROM lecture, course WHERE course.course_id=lecture.course_lecture ORDER BY course.title; Είναι ισοδύναμη με:
Είδη Join: INNER JOIN: μια εγγραφή συμπεριλαμβάνεται μόνο αν υπάρχει εγγραφή που της «ταιριάζει». LEFT JOIN: Οι εγγραφές του αριστερού πίνακα συμπεριλαμβάνονται πάντα, ανεξάρτητα από το αν υπάρχει εγγραφή στο δεξιό πίνακα που να τους ταιριάζει. RIGHT JOIN: Ομοίως για τον δεξιό πίνακα.
Ερώτηση σε Μ-Ν Με χρήση μόνο των JOIN: SELECT name, lastname,title FROM student INNER JOIN registration ON AM = reg_student INNER JOIN course ON course_id = reg_course; Αν χρησιμοποιούσαμε left join σε αυτή την περίπτωση κάθε φοιτητής θα συμπεριλαμβανόταν στο σύνολο ανεξάρτητα από το αν έχει εγγραφεί σε μάθημα ή όχι. name lastname title Βιβή Τζέκου Βάσεις εδοµένων Βιβή Τζέκου Βάσεις εδοµένων ΙΙ unknown Λαζάρου Βάσεις εδοµένων ΙΙ Γιώργος Νικολάου Βάσεις εδοµένων ΙΙ Μαρία Αναστοπούλου Βάσεις εδοµένων
Aliases Στην select μπορούμε να δώσουμε ένα ψευδώνυμο στους πίνακες που χρησιμοποιούμε (για λόγους ευχρηστίας, ευανάγνωστου κώδικα κλπ). Παράδειγμα: SELECT num_lecture,subject,title FROM lecture as a, course as b WHERE b.course_id=a.course_lecture ORDER BY b.title;
Χρήση aliases για join πίνακα με τον εαυτό του Χρησιμοποιείται συνήθως στις αναδρομικές σχέσεις. Για παράδειγμα αν έχουμε τον πίνακα CREATE TABLE category( cat_id INT NOT NULL AUTO_INCREMENT, cat_name VARCHAR(10) NOT NULL, cat_parent INT, PRIMARY KEY(cat_id), FOREIGN KEY (cat_parent) REFERENCES category(cat_id) ON DELETE SET NULL ON UPDATE CASCADE )engine='innodb'; Με δεδομένα: mysql> select * from category; +--------+------------+------------+ cat_id cat_name cat_parent +--------+------------+------------+ 1 sports NULL 2 football 1 3 basketball 1 4 art NULL 5 painting 4 6 dancing 4 +--------+------------+------------+ 6 rows in set (0.00 sec)
Χρήση aliases για join πίνακα με τον εαυτό του #2 Θέλουμε να επιλέξουμε όλες τις κατηγορίες και το όνομα των γονικών τους. Η select θα είναι: SELECT a.cat_name as Name, b.cat_name as Parent FROM category as a INNER JOIN category as b ON b.cat_id = a.cat_parent; Αποτέλεσμα: +------------+--------+ Name Parent +------------+--------+ football sports basketball sports painting art dancing art +------------+--------+ 4 rows in set (0.02 sec)
Χρήση aliases για join πίνακα με τον εαυτό του #2 Ή αν θέλουμε και αυτές που δεν έχουν γονική κατηγορία: SELECT a.cat_name as Name, b.cat_name as Parent FROM category as a LEFT JOIN category as b ON b.cat_id = a.cat_parent; Αποτέλεσμα: +------------+--------+ Name Parent +------------+--------+ sports NULL football sports basketball sports art NULL painting art dancing art +------------+--------+ 6 rows in set (0.00 sec) Σημειώστε πως aliases δίνονται και στις στήλες που επιστρέφονται!
Update UPDATE: Ανανέωση μιάς εγγραφής Σύνταξη: UPDATE όνοµα_πίνακα SET στήλη=τιµή,... WHERE συνθήκη Η σύνταξη της where είναι ίδια με προηγουμένως. Παράδειγμα: UPDATE Professor SET pr_name='νίκος', pr_lastname=' ασκαλάκης WHERE pr_lastname='unknown';
Εντολή Delete DELETE: Διαγραφή μιας εγγραφής Σύνταξη: DELETE FROM πίνακας [where συνθήκη] [LIMIT number]; Παραδείγματα // διαγράφει όλες τις εγγραφές DELETE FROM professor; // ιαγράφει του καθηγητές µε επίθετο που περιέχει τον όρο Γεωργίου DELETE FROM professor where pr_lastname like %Γεωργίου% ;
Εντολή ALTER Μας δίνει την δυνατότητα να αλλάζουμε την δομή ενός πίνακα. Σύνταξη ALTER TABLE όνομα-πινακα αλλαγή [,αλλαγή...]; Παραδείγματα: Alter table student modify name varchar(30) not null; Alter table professor drop pr_name, add address varchar(70) not null;