Βαςεις δεδομενων 1 Δρ. Aλεξανδροσ Βακαλουδθσ
ιμερα Και άλλα κριτθρία για επιλογι δεδομζνων Παραδείγματα Εντολζσ τροποποίθςθσ δεδομζνων
Κριτιριο LIKE Όταν κελουμε να κάνουμε αναηιτθςθ μεςα ςε αλφαρικμθτικά πεδία φνταξθ xx LIKE %YYY% ; O χαρακτιρασ % είναι αντίςτοιχοσ του * για αναηιτθςθ αρχείων Ειδικά ςτθν Access χρθςιμοποιείται και το * Παράδειγματα Δωςε μου ολουσ τουσ φοιτθτζσ των οποίων το επίκετο αρχίηει από Παπα WHERE surname LIKE Παπα% ; Δωςε μου ολουσ τουσ φοιτθτζσ των οποίων το επίκετο περιζχει τα γράμματα λλ WHERE surname LIKE %λλ% ;
IS NULL Οι Σιμζσ μζςα ςτθ βάςθ μποροφν να είναι κενζσ Για πεδία τα οποία δεν είναι υποχρεωτικά Σο κενό δεν είναι όμοιο με το 0 Σο κενό δεν είναι το όμοιο με ζνα άδειο αλφαρικμθτικό Ελεγχουμε εάν ζνα πεδίο είναι κενό με τθν εντολι IS NULL Δωϋςε τουσ φοιτθτζσ οι οποίοι ζχουν δϊςει τθλζφωνο WHERE TEL IS NOT NULL
HAVING τα κριτιρια μζςα ςτο WHERE δεν επιτρζπεται να χρθςιμοποιοφμε ςυναρτιςεισ ομαδποποίθςθσ AVG, SUM, COUNT, MAX, MIN Εάν χρειάηεται τζτοιο κριτιριο, ζχουμε τθν εντολι HAVING HAVING count(studentid)>20 Π.χ. Δϊςε μου τα τμιματα με παραπάνω από 1000 φοιτθτζσ Select count(studentid), departments.name from students, departments where Students.deptid=departments.deptid group by departments.name having count(studentid)>10000
Εμφωλευμζνα ερωτιματα Encapsulated queries Εκτζλεςθ ερωτιματοσ μζςα ςε ερωτθμα φνταξθ SELECT xx FROM yy WHERE zz in (SELECT ww FROM qq ) Σο εμφαλευμζνο ερϊτθμα εκτελείται για κάκε γραμμι του κυρίου ερωτιματοσ
Παράδειγμα Δϊςε μου όςουσ είναι ςτο ίδιο τμιμα με τον Ιωάννου Βρίςκουμε ςε ποιο τμιμα είναι ο Ιωάννου Select departments.name from departments, students where departments.deptid=students.deptid and students.name= Ιωάννου Σοποκετοφμε αυτό το ερϊτθμα ωσ εμφωλεαςμζνο ςτο γενικό μασ ερϊτθμα Select name from students where deptid in (Select departments.name from departments, students where departments.deptid=students.deptid and students.name= Ιωάννου )
Χωρίσ υποερϊτθμα? Select s1.name from students s1, s2 where s1.deptid=s2.deptid and s2.name= Ιωάννου
Κριτικι Θ ταχφτθτα εκτζλεςθσ ενόσ ερωτιματοσ είναι πολφ ςθμαντικόσ παράγοντασ ςτθ λειτουργία μίασ βάςθσ Σο εμφωλευμζνο ερϊτθμα εκτελείται πολλαπλζσ φορζσ Για κάκε γραμμι του κυρίου ερωτιματοσ Αυτό κακιςτά τθν εκτζλεςθ του ερωτιματοσ αργι Για αυτό τα εμφωλευμζνα ερωτθματα ΠΡΕΠΕΙ να αποφεφγονται Και να χρθςιμοποιοφνται μόνο όταν δεν υπάρχει εναλλακτικι λφςθ
υντομεφςεισ ςε πίνακεσ H SQL δίνει τθ δυνατότθτα χριςθσ «μεταβλθτϊν» για ονόματα πινάκων Με ςκοπό να κανει το ερϊτθμα πιο ςφντομο Π.χ. Select s.name, s.tel from students s, departments.d where s.deptid=d.deptid and d.name= ΠΛΘΡΟΦΟΡΙΚΘ ;
Άλλα κριτιρια ςε εμφωλευμζνα ερωτιματα ANY INTERSECT MINUS SET ALL Χρθςιμοποιοφνται με εμφωλευμζνα
Μορφοποίθςθ δεδομζνων Θ SQL είναι case-insensitive Δθλαδι δε τθν ενδιαφζρουν μικρά/μεγάλα γράμματα Οτιδιποτε αλφαρικμθτικό είναι μζςα ςε αποςτρόφουσ Οι θμερομθνίεσ πρζπει να είναι ςε ςυγκεκριμζνθ μορφι Θ οποία δυςτυχϊσ διαφζρει Oracle 12-10-2011 MySQL 2011-01-10 Access 23-Mar-01 (και άλλεσ)
Παραδείγματα SQL Ζςτω θ βάςθ του ΣΕΙ με πίνακεσ Departments (deptid, name) students(studentid, AEM, name deptid) Modules(moduleid, name, semester, deptid) ModulesStudents(id, moduleid, studentid) Πόςοι φοιτθτζσ είναι εγγεγραμμζνοι ςε κάκε τμιμα με αυξουςα ςειρά αρικμοφ? Select count(studentid), departments.name from students, departments where Students.deptid=departments.deptid group by departments.name order by count(studentid),
Παραδείγματα SQL Ποςοι φοιτθτζσ παρακολουκοφν τo κάκε μακιμα του 3 ου εξαμινου τμιματοσ πλθροφορικισ? Select count(studentid), modules.name from students, modules, departments, modulesstudents where Students.deptid=departments.deptid and modules.moduleid=modulesstudents.moduleid and students.studentid=modulesstudents.studentid and modules.deptdid=departments.deptid and Modules.semester=3 and Departments.name= ΠΛΘΡΟΦΟΡΙΚΘ group by modules.name
Παραδείγματα SQL Ποιο μάκθμα ζχει τουσ περςςότερουσ φοιτθτζσ? Select count(studentid), modules.name from students, modules, modulesstudents where modules.moduleid=modulesstudents.moduleid and students.studentid=modulesstudents.studentid group by modules.name Having count(studentid)=max(count(studentid))
φνοψθ SELECT WHERE κριτιρια υηευγμζνα ερωτιματα: Ηθτοφμε δεδομζνα από παραπάνω από ζνα πίνακεσ Τπάρχει κρυφό κριτιριο, θ ιςότθτα των κοινϊν πεδίων ORDER BY ταξινόμθςθ GROYP BY ομαδοποίθςθ Όμαδοποιοφμε ςφμφωνα με πεδία για να εκτζλεςουμε ζνα ςτατιςτικό ερϊτθμα HAVING τατιςτικά κριτιρια
Αλλαγθ δεδομζνων DML Data Manipulation Language UPDATE, DELETE,INSERT
Σροποποίθςθ δεδομζνων φνταξθ UPDATE <table> SET <field1>=<value1>, <fieldn>=<valuen> WHERE <criteria> Update modules Set semester=5 where id=2
Σροποποιιςεισ με κριτιρια από άλλο πίνακα Θ τροποποίθςθ πρζπει να γίνει ςε ζνα πίνακα Χρθςιμοποιϊντασ όμωσ μζςα ςτο WHERE κριτιρια άλλου πίνακα Εντολι USING Π.χ. Update modules using department set didaktikesmonades=4 where modules.deptid=departrments.deptid and departments.name= ΠΛΘΡΟΦΟΡΙΚΘϋ
Διαγραφι δεδομζνων φνταξθ DELETE FROM <tablename> WHERE <criteria> DELETE from students where AEM<100; ομοια με το UPDATE, μπορεί και εδϊ να χρθςιμοποιθκεί θ εντολι USING
Ειςαγωγι δεδομζνων φνταξθ INSERT INTO <table> (field1, field2, field3..fieldn) VALUES (value1, value2, value3) Π.χ insert into modules (semester, name, deptid) values (1, ΒΑΕΙ ΔΕΔΟΜΕΝΩΝ 1,1); Γιατί δεν ζβαλα το moduleid
Παράδειγμα Π.χ insert into modules (semester, name, deptid) values (1, ΒΑΕΙ ΔΕΔΟΜΕΝΩΝ 1,1); ωςτά δεν ζβαλα το πρωτεφον κλειδί moduleid? Σο οποίο πρζπει να είναι μοναδικό και ποτζ NULL Ναι αν εχω ορίςει το moduleid να ζχει αυτόματθ αρίκμθςθ (auto increment) ε κάκε ειςαγωγι, παίρνει τθν επόμενθ ακζραια τιμι
COMMIT (save) ςτισ βάςεισ δεδομζνων Οποιαδιποτε τροποποίθςθ ςτα δεδομζνα είναι προςωρινι και ορατι μόνο από όποιον τθν εκτελεί γίνεται μόνιμθ και ορατι ςε άλλουσ χριςτεσ μόνο όταν δϊςουμε τθν εντολι commit Θ commit είναι ουςιαςτικά το αντίςτοιχο του save Μετά το commit δεν μποροφμε να επαναφζρουμε προθγοφμενεσ τιμζσ με SQL Θ SQL δθλαδι ςβθνει τθ μνιμθ εντολϊν μετά από κάκε commit
ROLLBACK (Undo) ςτισ βάςεισ δεδομζνων Για να αναιρζςουμε οποιεςδιποτε τροποποιιςεισ Και να επανζλκουμε ςτισ τιμζσ του προθγοφμενου commit Χρθςιμοποιοφμε τθν εντολι Rollback ε ςθμαντικζσ πράξεισ όλεσ οι SQL μεταξφ δφο commit λζγονται ςυναλλαγζσ (transactions) Θ διαχείριςθ των ςυναλλαγϊν είναι επίςθσ μεγάλθ υπόκεςθ ςτισ βάςεισ δεδομζνων Θα το εξετάςουμε ςτισ Βαςεισ Δεδομζνων 2
Σρόποι επαναφοράσ Εχουν προφανϊσ υπάρξει ςτιγμζσ μεγάλων λακϊν Όπιυ το ςφάλμα δεν αποκαλφφθκε εγκαίρωσ αλλά μετά από πολλά commit ε αυτιν τθν περίπτωςθ το Rollback δεν αρκεί Επιγραμματικά Backup Log files αρχεία καταγραφισ όπουν υπάρχουν ολεσ οι εκτελεςμζνεσ εντολζσ
χεςιακι Άλγεβρα Θ SQL ζχει μακθματικό υπόβακρο Βαςίηεται ςτθ κεωρία ςυνόλων με πράξεισ όπωσ τομι, ζνωςθ κτλ Κάκε ερϊτθμα μπορεί να μεταςχθματιςκεί ςε μακθματικι ςυνάρτθςθ π name (students) π bname ([σ pname = "John" (μ P(pnr, pname, pmgr) (E))] Χ pmgr = bnr [μ B(bnr, bname, bmgr) (E)])
χεςιακι Άλγεβρα Θετικό το μακθματικό υπόβακρο? Ναι γιατι μποροφν να γίνουν αποδείξεισ ςχετικά με τθν πολυπλοκότθτα των ερωτθμάτων Οποιαδιποτε επζκταςθ ςτθν SQL ζχει ςτερει βάςθ Δυςτυχϊσ είναι μεγάλο κομμάτι Και πολλζσ φορζσ ανοφςιο ςτθν κακθμερινι χριςθ Χριςιμο μόνο αν κάποιοσ κελιςει να εμβακφνει ςτισ βάςεισ δεδομζνων από Μακθματικι άποψθ Άποψθ μοντελοποίθςθσ φνδεςθσ με άλλα πεδία όπωσ τεχνθτι νοθμοςφνθ
Επόμενθ εβδομαδα DDL Data definition Language Δθμιουργία αντικειμζνων (πινακεσ κτλ) Ειςαγωγι ςτα ευρετιρια