MySQL Εργαστήριο #2 Γλώσσα Ορισμού Δεδομένων Ακεραιότητα Δεδομένων Νίθνο Γηαηξάθνο Δξγαζηήξην Πιεξνθνξηαθώλ Σπζηεκάησλ, Τκήκα Πιεξνθνξηθήο, Παλεπηζηήκην Πεηξαηά (http://infolab.cs.unipi.gr)
Περιεχόμενα Σύλδεζε κε ηα πξνεγνύκελα Πεξηγξαθή Σελαξίνπ Δθαξκνγήο Γεκηνπξγία Πηλάθσλ Οξηζκόο Τύπσλ Γεδνκέλσλ Δπηβνιή Καλόλσλ Αθεξαηόηεηαο Δηζαγσγή Τξνπνπνίεζε ΒΓ Γεκηνπξγία Όςεσλ 2
Περιεχόμενα Σύλδεζε κε ηα πξνεγνύκελα Πεξηγξαθή Σελαξίνπ Δθαξκνγήο Γεκηνπξγία Πηλάθσλ Οξηζκόο Τύπσλ Γεδνκέλσλ Δπηβνιή Καλόλσλ Αθεξαηόηεηαο Δηζαγσγή Τξνπνπνίεζε ΒΓ Γεκηνπξγία Όςεσλ 3
Δημιουργία ΒΔ CREATE {DATABASE SCHEMA} [IF NOT EXISTS] db_name [create_specification...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name Τη ζεκαίλνπλ: CAPITAL SQL keywords small substituted (for example database & table names) [ ] optional words or clauses seperation of alternatives { } necessaraly pick one of the words of set... repetetion or omission small: further analysis 4
Δημιουργία ΒΔ Δληνιή Γεκηνπξγίαο mysql>create database if not exists your_sn -> character set=utf8; mysql> show databases; 5
Περιεχόμενα Σύλδεζε κε ηα πξνεγνύκελα Πεξηγξαθή Σελαξίνπ Δθαξκνγήο Γεκηνπξγία Πηλάθσλ Οξηζκόο Τύπσλ Γεδνκέλσλ Δπηβνιή Καλόλσλ Αθεξαηόηεηαο Δηζαγσγή Τξνπνπνίεζε ΒΓ Γεκηνπξγία Όςεσλ 6
Περιγραφή Σεναρίου Εφαρμογής Γηάγξακκα Οληνηήησλ - Σπζρεηίζεσλ 7
Περιγραφή Σεναρίου Εφαρμογής Σρεζηαθό Σρήκα Stars(StarID, StarName, StarAddress) Studios(StudioID, StudioName, StudioAddress) Movies(MovieID, MovieTitle, MovieLength, MovieWebsite, FilmType, StudioID) Stars_In(StarID, MovieID, StarringSequence) 8
Περιεχόμενα Σύλδεζε κε ηα πξνεγνύκελα Πεξηγξαθή Σελαξίνπ Δθαξκνγήο Γεκηνπξγία Πηλάθσλ Οξηζκόο Τύπσλ Γεδνκέλσλ Δπηβνιή Καλόλσλ Αθεξαηόηεηαο Δηζαγσγή Τξνπνπνίεζε ΒΓ Γεκηνπξγία Όςεσλ 9
Εντολή Δημιουργίας CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_option] create_definition col_name column_definition [CONSTRAINT [symbol]] PRIMARY KEY [CONSTRAINT [symbol]] FOREIGN KEY ref_definition CHECK (expr) table_option {ENGINE TYPE} [=] engine_name ref_definition: REFERENCES tbl_name (col_name,...) [ON DELETE CASCADE] [ON UPDATE CASCADE] Όηαν ο πίνακας οριζηεί ως TEMPORARY είναι οραηός και τρηζιμοποιήζιμος ζηην σπάρτοσζα ζύνδεζη, ενώ γίνεηαι DROP ασηόμαηα μόλις η ζύνδεζη ηερμαηιζηεί 10
Εντολή Δημιουργίας CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_option] create_definition col_name column_definition [CONSTRAINT [symbol]] PRIMARY KEY [CONSTRAINT [symbol]] FOREIGN KEY ref_definition CHECK (expr) table_option {ENGINE TYPE} [=] engine_name ref_definition: REFERENCES tbl_name (col_name,...) Επιβολή απλών περιοριζμών ακεραιόηηηας [ON DELETE CASCADE] [ON UPDATE CASCADE] Περιλαμβάνει: -Τον ηύπο δεδομένων ηης ζηήλης -Απλούς περιοριζμούς ακεραιόηηηας 11
Εντολή Δημιουργίας CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_option] create_definition col_name column_definition [CONSTRAINT [symbol]] PRIMARY KEY [CONSTRAINT [symbol]] FOREIGN KEY ref_definition CHECK (expr) table_option {ENGINE TYPE} [=] engine_name ref_definition: REFERENCES tbl_name (col_name,...) [ON DELETE CASCADE] [ON UPDATE CASCADE] Αναθορική Ακεραιόηηηα Σσμπαραζσρόμενες Ενέργειες 12
Περιεχόμενα Σύλδεζε κε ηα πξνεγνύκελα Πεξηγξαθή Σελαξίνπ Δθαξκνγήο Γεκηνπξγία Πηλάθσλ Οξηζκόο Τύπσλ Γεδνκέλσλ Δπηβνιή Καλόλσλ Αθεξαηόηεηαο Δηζαγσγή Τξνπνπνίεζε ΒΓ Γεκηνπξγία Όςεσλ 13
Γλώσσα Ορισμού Δεδομένων H SQL σο Γιώζζα Οξηζκνύ Γεδνκέλσλ ζηελ MySQL Βαζηθνί ηύπνη δεδνκέλσλ SMALLINT [(length)] Μηθξόο αθέξαηνο, θαηαιακβάλεη 2 bytes INTEGER[(length)] Αθέξαηνο, θαηαιακβάλεη 4 bytes REAL[(Μ,d)] Μ ςεθία από τα οποία d δεθαδηθά NUMERIC[(Μ[,d])] Όκνηα κε πξηλ αιιά κε απμεκέλε αθξίβεηα π.ρ ρξήζε ζε ζηήιεο κε ρξεκαηηθά πνζά DATE Ηκεξνκελίεο, πνπ πεξηέρνπλ ηεηξαςήθην έηνο, κήλα θαη εκέξα TIME Ώξα εκέξαο κε παξαιιαγέο αθξίβεηαο πνπ αθνξνύλ ελζσκάησζε εκέξαο, αθξίβεηαο δεθαδηθνύ δεπηεξνιέπησλ θηι TIMESTAMP Date + Time CHAR[(length)] [CHARACTER SET charset_name] Σπκβνινζεηξά πξνθαζνξηζκέλνπ, ζηαζεξνύ κήθνπο (length) VARCHAR(length) [CHARACTER SET charset_name] Σπκβνινζεηξά κε κεηαβιεηό κήθνο έσο (length) 14
Γλώσσα Ορισμού Δεδομένων - Εφαρμογή Αο εθθηλήζνπκε ηε δεκηνπξγία ησλ πηλάθσλ ηνπ ζελαξίνπ εθαξκνγήο κε ηνλ νξηζκό ηνπ ηύπνπ δεδνκέλσλ θάζε ζηήιεο CREATE TABLE STARS ( StarID INTEGER..., StarName VARCHAR(50)..., StarAddress VARCHAR(100)...... ); CREATE TABLE Stars_In ( StarID INTEGER..., MovieID INTEGER..., StarringSequence SMALLINT...,... ); CREATE TABLE STUDIOS ( StudioID INTEGER..., StudioName VARCHAR(50)..., StudioAddress VARCHAR(100)...... ); CREATE TABLE MOVIES ( MovieID INTEGER..., MovieTitle VARCHAR(80)..., MovieWebsite VARCHAR(100)..., MovieLength REAL, FilmType VARCHAR(50) StudioID INTEGER...,... ); 15
Περιεχόμενα Σύλδεζε κε ηα πξνεγνύκελα Πεξηγξαθή Σελαξίνπ Δθαξκνγήο Γεκηνπξγία Πηλάθσλ Οξηζκόο Τύπσλ Γεδνκέλσλ Δπηβνιή Καλόλσλ Αθεξαηόηεηαο Δηζαγσγή Τξνπνπνίεζε ΒΓ Γεκηνπξγία Όςεσλ 16
Απλοί Περιορισμοί Ακεραιότητας Σε ζπλέρεηα ηνπ Column definition [NOT NULL NULL] [UNIQUE [KEY]] Δπηπιένλ [DEFAULT default_value] [AUTO_INCREMENT] Αιιά θαη CHECK (expression) ** Σηελ MySQL 5.1, ε εληνιή check πξνζπειάδεηαη θαλνληθά, αιιά αγλνείηαη 17
Απλοί Περιορισμοί Ακεραιότητας Εφαρμογή Θεσξνύκε ηνπο αθόινπζνπο, ελδεηθηηθνύο πεξηνξηζκνύο ζην ζελάξην εθαξκνγήο Η ζεηξά θαηαρώξεζεο πξσηαγσληζηώλ (Stars), ηαηληώλ (Movies), Studios είλαη θαζνξηζηηθή γηα ηνλ θσδηθό πνπ ζα απνδνζεί ζε απηά Τα πεδία StarName, MovieTitle, StudioName δελ επηηξέπεηαη λα ιακβάλνπλ θελέο ηηκέο θαζώο δπζρεξαίλεηαη ζεκαληηθά ε δηαδηθαζία αλαδήηεζήο ηνπο Τν website πνπ αληηζηνηρεί ζε θάζε ηαηλία πξέπεη λα είλαη κνλαδηθό Οη ηηκέο πνπ θαηαρσξνύληαη ζην πεδίν website ζα πξέπεη λα ιακβάλνπλ κνξθή παξόκνηα κε ηελ αθόινπζε: www..gr Σε πεξίπησζε πνπ δελ νξηζηεί δηαθνξεηηθά, ε δηάξθεηα κηαο ηαηλίαο θαηαρσξείηαη ίζε κε 60 ιεπηά 18
Απλοί Περιορισμοί Ακεραιότητας Εφαρμογή CREATE TABLE STARS ( StarID INTEGER AUTO_INCREMENT, StarName VARCHAR(50) NOT NULL, StarAddress VARCHAR(100),... ); CREATE TABLE Stars_In ( StarID INTEGER, MovieID INTEGER, StarringSequence SMALLINT,... ); CREATE TABLE STUDIOS ( StudioID INTEGER AUTO_INCREMENT, StudioName VARCHAR(50) NOT NULL, StudioAddress VARCHAR(100),... ); CREATE TABLE MOVIES ( MovieID INTEGER AUTO_INCREMENT, MovieTitle VARCHAR(80) NOT NULL, MovieWebsite VARCHAR(100) UNIQUE KEY, MovieLength REAL DEFAULT 60, FilmType VARCHAR(50) StudioID INTEGER, CHECK (MovieWebsite LIKE "www.%.gr") ); 19
Αναφορική Ακεραιότητα Τν πξσηεύνλ θιεηδί θαη ηα μέλα θιεηδηά κπνξνύλ λα νξηζηνύλ σο κέξνο ηεο SQL δήισζεο create table: Ο όξνο primary key ηεο δήισζεο create table πεξηιακβάλεη ηε ιίζηα ησλ γλσξηζκάησλ πνπ ζπλζέηνπλ ην πξσηεύνλ θιεηδί O όξνο foreign key ηεο δήισζεο create table πεξηιακβάλεη θαη κηα ιίζηα κε ηα γλσξίζκαηα πνπ ζπλζέηνπλ ην μέλν θιεηδί θαη ην όλνκα ηεο ζρέζεο ζηελ νπνία αλαθέξεηαη ην μέλν θιεηδί 20
Αναφορική Ακεραιότητα Εφαρμογή CREATE TABLE STARS ( StarID INTEGER AUTO_INCREMENT, StarName VARCHAR(50) NOT NULL, StarAddress VARCHAR(100), PRIMARY KEY (StarID) ); CREATE TABLE STUDIOS ( StudioID INTEGER AUTO_INCREMENT, StudioName VARCHAR(50) NOT NULL, StudioAddress VARCHAR(100), PRIMARY KEY (StudioID) ); 21
Αναφορική Ακεραιότητα Σπκπαξαζπξόκελεο ελέξγεηεο [CONSTRAINT [symbol]] FOREIGN KEY REFERENCES tbl_name (col_name,...) [ON DELETE CASCADE] [ON UPDATE CASCADE] Λόγσ ηνπ όξνπ on delete cascade, ε δηαγξαθή κηαο πιεηάδαο ζηνλ βαζηθό πίλαθα (parent table) νδεγεί ζε παξαβίαζε ηνπ πεξηνξηζκνύ αλαθνξηθήο αθεξαηόηεηαο ζηνλ πίλαθα πνπ πεξηιακβάλεη ην μέλν θιεηδί (child table). Η δηαγξαθή ζα κεηαθεξζεί δηαδνρηθά, δηαγξάθνληαο ηηο αληίζηνηρεο πιεηάδεο ηνπ child table Παξόκνηα ζηελ πεξίπησζε ηνπ on update cascade γηα ηελ πεξίπησζε ελεκέξσζεο ηνπ parent table 22
Απλοί Περιορισμοί Ακεραιότητας Εφαρμογή CREATE TABLE MOVIES ( MovieID INTEGER AUTO_INCREMENT, MovieTitle VARCHAR(80) NOT NULL, MovieWebsite VARCHAR(100) UNIQUE KEY, MovieLength REAL DEFAULT 60, FilmType VARCHAR(50), StudioID INTEGER, CHECK (MovieWebsite LIKE "www.%.gr ), PRIMARY KEY (MovieID), FOREIGN KEY (StudioID) REFERENCES STUDIOS(StudioID) ON UPDATE CASCADE ΟΝ DELETE CASCADE ); 23
Απλοί Περιορισμοί Ακεραιότητας Εφαρμογή CREATE TABLE STARS_IN ( MovieID INTEGER, StarID INTEGER, StarringSequence SMALLINT, PRIMARY KEY (MovieID,StarID), FOREIGN KEY (StarID) REFERENCES STARS(StarID) ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (MovieID) REFERENCES MOVIES(MovieID) ON UPDATE CASCADE ON DELETE CASCADE ); 24
Interview Question Πνηα ε δηαθνξά κεηαμύ Primary θαη Unique key; Primary Key Γελ δέρεηαη θελέο ηηκέο (NOT NULL by default) Υπάξρεη κόλν έλα primary key γηα θάζε πίλαθα Τν πξσηεύνλ θιεηδί επηηξέπεη θάζε πιεηάδα ελόο πίλαθα λα πξνζδηνξίδεηαη κνλαδηθά θαη δηαζθαιίδεη ηε κε ύπαξμε ηαπηόζεκσλ πιεηάδσλ Δπί ηνπ πξσηεύνληνο θιεηδηνύ δεκηνπξγείηαη clustered index* Unique Key Γέρεηαη θελέο ηηκέο Μπνξεί λα ππάξρνπλ πεξηζζόηεξα ηνπ ελόο Unique keys ζε έλαλ πίλαθα Έλαο πεξηνξηζκόο unique key ρξεζηκνπνηείηαη γηα λα απνηξέςεη δηπιόηηκεο εγγξαθέο γηα ηε ζηήιε ηνπ θιεηδηνύ εληόο ησλ πιεηάδσλ ελόο πίλαθα Δπί ελόο Unique keys δεκηνπξγείηαη Non clustered index* (* ζα εμεηαζηνύλ ζε επόκελν εμάκελν) 25
Σύνθετοι Περιορισμοί Ακεραιότητας Υπνζέηνπκε ηνπο αθόινπζνπο πεξηνξηζκνύο ζην ζελάξην εθαξκνγήο γηα ηε ζηήιε StarringSequence Τν πεδίν StarringSequence ζα πξέπεη λα ιακβάλεη ηηκέο >0 Γελ επηηξέπεηαη δύν πξσηαγσληζηέο ζηελ ίδηα ηαηλία λα έρνπλ ηελ ίδηα ηηκή ζην πεδίν απηό Γελ επηηξέπεηαη λα ππάξρεη εγγξαθή κε ηηκή k ζην πεδίν, όηαλ νη πξσηαγσληζηέο ηεο ηαηλίαο είλαη ιηγόηεξνη από θ ζα εμεηαζηνύλ ζην ηειεπηαίν εξγαζηήξην όπνπ ζα πινπνηεζνύλ κε ηε ρξήζε triggers 26
Παραλλαγές Εντολών Δημιουργίας Πινάκων CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_option] select_statement Παξάδεηγκα CREATE TABLE Studios_clone SELECT * FROM Studios; CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name (LIKE old_tbl_name) } Παξάδεηγκα CREATE TABLE Studios_clone2 LIKE Studios; 27
Περιεχόμενα Σύλδεζε κε ηα πξνεγνύκελα Πεξηγξαθή Σελαξίνπ Δθαξκνγήο Γεκηνπξγία Πηλάθσλ Οξηζκόο Τύπσλ Γεδνκέλσλ Δπηβνιή Καλόλσλ Αθεξαηόηεηαο Δηζαγσγή Τξνπνπνίεζε ΒΓ Γεκηνπξγία Όςεσλ 28
Εισαγωγή Δεδομένων INSERT [LOW_PRIORITY DELAYED HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr DEFAULT},...),(...),... LOW PRIORITY: ε εθηέιεζε ηεο εηζαγσγήο ζα θαζπζηεξήζεη έσο όηνπ θαλείο client δε δηαβάδεη από ηνλ πίλαθα. Η επηινγή απηή κπνξεί λα «παξνπιίζεη» ηνλ client πνπ εξγαδόκαζηε γηα κεγάιν ρξνληθό δηάζηεκα (κόλν γηα ηηο MyISAM, Memory, Merge storage engines) DELAYED: O server ηνπνζεηεί ηηο πξνο εηζαγσγή πιεηάδεο ζε θάπνηνλ εληακηεπηή (buffer) θαη ν client πνπ ππέβαιε ηελ εληνιή κπνξεί ακέζσο κεηά λα ζπλερίζεη κε επόκελεο εληνιέο HIGH PRIOTIRY: Παξαθάκπηεη ηελ επηινγή low-priority- updates ηνπ server (κόλν γηα ηηο MyISAM, Memory, Merge storage engines) IGNORE: ηα ιάζε πνπ ελδερνκέλσο λα εκθαληζηνύλ θαηά ηελ εθηέιεζε ηεο εηζαγσγήο αληηκεησπίδνληαη σο πξνεηδνπνηήζεηο (warnings) 29
Εισαγωγή Δεδομένων - Εφαρμογή Παξαδείγκαηα εηζαγσγώλ INSERT INTO STUDIOS (StudioName,StudioAddress)VALUES ("UNIVERSAL", "135 AV. Street C."); INSERT INTO STUDIOS (StudioName,StudioAddress)VALUES ("WARNER BROS.", "100 AZ. Street U."); INSERT INTO STUDIOS (StudioName,StudioAddress) VALUES ("COLUMBIA PICTURES", "102 AQ.Street F."); INSERT INTO MOVIES (MovieTitle,MovieWebsite,MovieLength,Film Type,StudioID) VALUES ("ROCKYI","www.rockyI.gr",125.3,"ACTION MOVIE", 1); INSERT INTO MOVIES (MovieTitle,MovieWebsite,MovieLength,Film Type,StudioID) VALUES ("ROCKYII","www.rockyII.gr",132.5,"ACTION MOVIE", 1); INSERT INTO MOVIES (MovieTitle,MovieWebsite,MovieLength,Film Type,StudioID) VALUES ("ROCKYIII","www.rockyIII.gr",122.5,"ACTI ON MOVIE", 1); 30
Ενημέρωση - Διαγραφή Δεδομένων UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1...} [, col_name2={expr2...}]... [WHERE where_condition] DELETE [LOW_PRIORITY] [IGNORE] tbl_name, tbl_name... FROM table_references [WHERE where_condition] Παξαδείγκαηα UPDATE MOVIES SET MovieLength=MovieLength*2 WHERE FilmType LIKE "%HORROR%"; DELETE FROM STUDIOS WHERE StudioName = "UNIVERSAL"; 31
Τροποποίηση - Διαγραφή Πίνακα ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification]... alter_specification: table_option... ADD DROP DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name Παξαδείγκαηα Σηε ζρέζε Stars πξνζζέηνπκε κηα ζηήιε (αληινύκελε) κε ηνλ αξηζκό ησλ ηαηληώλ πνπ έρεη ιάβεη κέξνο θάζε πξσηαγσληζηήο ALTER TABLE MOVIES ADD COLUMN (NoOfMovies SMALLINT); Γηαγξάθνπκε ηνπο θιώλνπο DROP TABLE IF EXISTS STUDIOS_CLONE, STUDIOS_CLONE2; 32
Περιεχόμενα Σύλδεζε κε ηα πξνεγνύκελα Πεξηγξαθή Σελαξίνπ Δθαξκνγήο Γεκηνπξγία Πηλάθσλ Οξηζκόο Τύπσλ Γεδνκέλσλ Δπηβνιή Καλόλσλ Αθεξαηόηεηαο Δηζαγσγή Τξνπνπνίεζε ΒΓ Γεκηνπξγία Όςεσλ 33
Δημιουργία - Διαγραφή Όψης CREATE [OR REPLACE] VIEW view_name [(column_list...)] AS select_statement DROP VIEW [IF EXISTS] view_name Παξάδεηγκα Αο ππνζέζνπκε πσο ζέινπκε λα ζπκπεξηιάβνπκε ζε έλα view ηηο ηαηλίεο καδί κε ην όλνκα ηνπ Studio παξαγσγήο ηνπο CREATE OR REPLACE VIEW Movies_Studio AS SELECT MovieID, MovieTitle, MovieWebsite, MovieLength, FilmType, StudioName FROM Movies M, Studios S WHERE M.StudioID=S.StudioID; DROP VIEW IF EXISTS Movies_Studio ; 34
Πηγές περαιτέρω μελέτης http://dev.mysql.com/doc/refman/5.1/en/create-table.html http://dev.mysql.com/doc/refman/4.1/en/data-types.html http://dev.mysql.com/doc/refman/5.1/en/insert.html http://dev.mysql.com/doc/refman/5.0/en/update.html http://dev.mysql.com/doc/refman/5.0/en/delete.html http://dev.mysql.com/doc/refman/5.1/en/alter-table.html http://dev.mysql.com/doc/refman/5.1/en/drop-table.html http://dev.mysql.com/doc/refman/5.0/en/create-view.html http://dev.mysql.com/doc/refman/5.0/en/drop-view.html 35