Η SQL ως γλώσσα τροποποίησης Δεδομένων Τροποποίηση Βάσης Δεδομένων: Γλώσσα Χειρισμού Δεδομένων (ΓXΔ) Τροποποιήσεις 1. Διαγραφή 2. Εισαγωγή 3. Ενημέρωση Οι εντολές αυτές ΤΡΟΠΟΠΟΙΟΥΝ το στιγμιότυπο της βάσης δεδομένων (δηλαδή, το περιεχόμενο των πινάκων)
Εισαγωγή Δεδομένων σε Πίνακα: INSERT Για να εισάγουμε δεδομένα σε μια σχέση: (α) Αν έχουμε συγκεκριμένες τιμές που θα εισαχθούν σε μια γραμμή τις προσδιορίζουμε στη values: insert into R (A 1,, A n ) values (v 1,, v n ) Όπου R o πίνακας στον οποίο θα εισάγουμε δεδομένα και Α i τα πεδία του. (β) Αν θέλουμε να εισάγουμε δεδομένα από άλλο πίνακα γράφουμε μια ερώτηση επιλογής select που το αποτέλεσμα της εισάγεται στον R. insert into R(A 1,, A n ) select-from-where 2
Εισαγωγή Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Εισαγωγή τιμών (εισάγεται 1 γραμμή): insert into Ταινία values ( The Big Blue, 1988, 132, Έγχρωμη ) Αν αλλάξει η σειρά στο values, πρέπει να προσδιορίσουμε τη σειρά στο insert into, π.χ.,: insert into Ταινία (Τίτλος, Είδος, Διάρκεια, Έτος) values ( The Big Blue, Έγχρωμη, 132, 1988) 3
Εισαγωγή τιμών: Παράδειγμα Λογαριασμός Όνομα_Υποκαταστήματος Αριθμός_Λογαριασμού Ποσό Παράδειγμα για το (α) insert into Λογαριασμός values ('Ψηλά-Αλώνια', 'A--9732, 1200) Όταν με οποιαδήποτε σειρά, π.χ.,: insert into Λογαριασμός (Αριθμός_Λογαριασμού, Όνομα_Υποκαταστήματος, Ποσό) values ('A--9732', 'Ψηλά-Αλώνια', 1200) 4
εισαγωγή null τιμών Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Αν δε γνωρίζουμε την τιμή κάποιου γνωρίσματος (τη διάρκεια της ταινίας): insert into Ταινία values ( The Big Blue, 1988, null, Έγχρωμη ) Ή, ισοδύναμα: insert into Ταινία (Τίτλος, Έτος, Είδος) values ( The Big Blue, 1988, Έγχρωμη ) 5
Παράδειγμα Τράπεζα: Εισαγωγή Δάνειο Λογαριασμός Όνομα_Υποκαταστήματος Αριθμός_Δανείου Ποσό Όνομα_Υποκαταστήματος Αριθμός_Λογαριασμού Ποσό Παράδειγμα για το (β): Για κάθε πελάτη που έχει πάρει δάνειο από το υποκατάστημα Ψηλά Αλώνια προστίθεται ως δώρο ένας λογαριασμός των $200 insert into Λογαριασμός select Όνομα_Υποκαταστήματος, Αριθμός_Δανείου, 200 from Δάνειο where Όνομα_Υποκαταστήματος = 'Ψηλά Αλώνια' Πρέπει πρώτα να υπολογιστεί το select πλήρως και μετά να γίνει η εισαγωγή. 6
Διαγραφή Πλειάδων - DELETE Μπορούμε να σβήσουμε μόνο ολόκληρες πλειάδες και όχι συγκεκριμένα γνωρίσματα. delete from R where P Σβήνει όλες τις πλειάδες της R για τις οποίες ισχύει το P. Όταν λείπει το where σβήνονται όλες οι πλειάδες μιας σχέσης. 7
Διαγραφή (παραδείγματα) Παράδειγμα: διαγραφή της ταινίας 'The Big Blue' που γυρίστηκε το 1988 delete from Ταινία where Τίτλος = The Big Blue and Έτος = 1988 Το αποτέλεσμα εξαρτάται από το είδος περιορισμού αναφοράς που έχουμε ορίσει Αν δεν έχουμε ορίσει κάποια ειδική ενέργεια on delete πρέπει πρώτα να διαγράψουμε και τις εγγραφές του πίνακα Παίζει που σχετίζονται με την ταινία The Big Blue : delete from Παίζει where Τίτλος = The Big Blue and Έτος = 1988 8
Διαγραφή (παραδείγματα) Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Παραδείγματα (1) Διαγραφή του Ηθοποιού Buster Keaton delete from Ηθοποιός where Όνομα = Buster Keaton (2) Όλες τις ταινίες που έχουν γυριστεί πριν το 1950 delete from Ταινία where Έτος < 1950
Ταινία (Τίτλος, Παίζει(Όνομα, Τίτλος, Έτος) Έτος, Διάρκεια, Είδος) Διαγραφή Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Στο from μπαίνει μόνο ένας πίνακας (απ τον οποίο θέλουμε να διαγράψουμε εγγραφές), αλλά στη συνθήκη του where μπορεί να εμφανίζονται και άλλοι Σβήνονται «ολόκληρες» πλειάδες Αν υπάρχουν παραπάνω από μια πλειάδες που ικανοποιούν τη συνθήκη, δεν υπάρχει τρόπος να διακρίνουμε τις πλειάδες, δηλαδή να σβήσουμε κάποιες Πρώτα, υπολογίζεται η συνθήκη του where και μετά διαγράφονται οι πλειάδες που ικανοποιούν τη συνθήκη delete from Παίζει where Τίτλος, Έτος in (select Τίτλος, Έτος from Ταινία where Eίδος = 'Έγχρωμη') 10
Παραδείγματα Διαγραφή (παραδείγματα) Ταινία (Τίτλος, Έτος, Διάρκεια, Είδος) Παίζει(Όνομα, Τίτλος, Έτος) Ηθοποιός(Όνομα, Διεύθυνση, Έτος_Γέννησης, Σύζυγος_Ηθοποιού) Όλους τους ηθοποιούς που έχουν παίξει σε ασπρόμαυρες ταινίες delete from Ηθοποιός where Όνομα in (select Όνομα from Ταινία, Παίζει where Ταινία.Τίτλος = Παίζει.Τίτλος and Ταινία.Έτος = Παίζει.Έτος and Eίδος = 'ασπρόμαυρη') Σημειώνεται ότι η παραπάνω εντολή, αν εκτελεστεί μόνη της, παραβιάζει την αναφορική ακεραιότητα της βάσης. Για να μη γίνει αυτό, και να επιτραπεί η εντολή από το ΣΔΒΔ, θα γίνουν αυτόματα αλλαγές στον ενδιάμεσο πίνακα Παίζει. Οι σχετιζόμενες εγγραφές είτε θα διαγραφούν (αν έχει δηλωθεί για το ξένο κλειδί του (Όνομα) on delete cascade), είτε θα τεθούν στην τιμή null (δήλωση on delete set null)
Παράδειγμα Τράπεζα: Διαγραφή Λογαριασμός Υποκατάστημα Όνομα_Υποκαταστήματος Αριθμός_Λογαριασμού Ποσό Όνομα_Υποκαταστήματος Πόλη Σύνολο Όλους τους λογαριασμούς στα υποκαταστήματα της Πάτρας delete from Λογαριασμός where Όνομα-Υποκαταστήματος in (select Όνομα-Υποκαταστήματος from Υποκατάστημα where Πόλη = 'Πάτρα') 12
Παράδειγμα Τράπεζα: Διαγραφή Λογαριασμός Όνομα_Υποκαταστήματος Αριθμός_Λογαριασμού Ποσό Αν και μπορούμε να σβήσουμε πλειάδες μόνο από μία σχέση τη φορά μπορούμε να αναφερθούμε σε περισσότερες από μια σχέσεις στην υποερώτηση του where (3) Όλους τους λογαριασμούς μιας τράπεζας με ποσό μικρότερο από το μέσο ποσό στην τράπεζα. delete from Λογαριασμός where Ποσό < (select avg(ποσό) from Λογαριασμός) Πρώτα γίνεται ο έλεγχος σε όλες τις πλειάδες και μετά αυτές που ικανοποιούν τη συνθήκη διαγράφονται. 13
Ενημερώσεις - UPDATE Ενημέρωση = Αλλαγή τιμής σε ένα πεδίο (Εδώ στο πεδίο A του πίνακα R). Γίνεται σε όσες εγγραφές ικανοποιούν τη συνθήκη P update R set A = <νέα τιμή> where P Παράδειγμα: Αύξηση τις διάρκειας κάθε ταινίας κατά 10 λεπτά για όλες τις ταινίες με διάρκεια < 100 update Ταινία set Διάρκεια = Διάρκεια + 10 where Διάρκεια < 100 14
Ενημέρωση Όπως και για τη διαγραφή: Στο update μόνο μια σχέση, αλλά στη συνθήκη του where μπορεί να εμφανίζονται και άλλες Αν υπάρχουν παραπάνω από μια πλειάδες που ικανοποιούν τη συνθήκη, δεν υπάρχει τρόπος να διακρίνουμε τις πλειάδες, δηλαδή να ενημερώσουμε κάποιες Πρώτα, υπολογίζεται η συνθήκη του where και μετά διαγράφονται οι πλειάδες που ικανοποιούν τη συνθήκη δηλαδή, η συνθήκη υπολογίζεται στο τρέχον στιγμιότυπο όχι στο τροποποιημένο 15
Παράδειγμα Τράπεζα: Ενημέρωση Λογαριασμός Όνομα_Υποκαταστήματος Αριθμός_Λογαριασμού Ποσό Παράδειγμα 1: Αύξηση όλων των καταθέσεων που είναι μεγαλύτερες των 100 κατά 5% λόγω τοκισμού update Λογαριασμός set Ποσό = Ποσό * 1.05 where Ποσό > 100 Παράδειγμα 2: Αύξηση όλων των υπολοίπων που είναι μεγαλύτερα από τον μέσο όρο κατά 5% update Λογαριασμός set Υπόλοιπο = Υπόλοιπο * 1.05 where Υπόλοιπο > select avg(υπόλοιπο) from Λογαριασμός 16
Παράδειγμα Τράπεζα: Ενημέρωση Λογαριασμός Όνομα_Υποκαταστήματος Αριθμός_Λογαριασμού Ποσό Παράδειγμα: στους πελάτες που έχουν υπόλοιπο < 1.000.000 η τράπεζα δίνει 5% και στους πελάτες που έχουν υπόλοιπο > 1.000.000 δίνει 9%: update Λογαριασμός set Ποσό = Ποσό * 1.05 where Ποσό < 1.000.000 update Λογαριασμός set Ποσό = Ποσό * 1.09 where Ποσό > 1.000.000 Ποιο update πρέπει να τρέξουμε πρώτα; 17