ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Βάσεις Δεδομένων (4 ο εξάμηνο) Εργαστήριο MySQL #3 Διδάσκων: Γιάννης Θεοδωρίδης Συντάκτης Κειμένου: Βαγγέλης Κατσικάρος Φεβρουάριος 2008
Περιεχόμενα ξένα κλειδιά INSERT SELECT
shell> mysql -uroot -p (προηγούμενο εργαστήριο) σύνδεση με τον server
Foreign Keys Τα ξένα κλειδιά ορίζονται κατά την δημιουργία του πίνακα. Φυσικά μπορούν να προστεθούν και αργότερα. CREATE TABLE Πάμε στο manual να δούμε για αυτήν την εντολή...
(προηγούμενο εργαστήριο) Δημιουργία πινάκων CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_option]... create_definition: col_name column_definition [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) column_definition: data_type [NOT NULL NULL] [DEFAULT default_value] table_option: {ENGINE TYPE} [=] engine_name AUTO_INCREMENT [=] value http://dev.mysql.com/doc/refman/5.0/en/create-table.html
Foreign Keys Ποιό τμήμα της εντολής είναι υπεύθυνο για την δημιουργία των ξένων κλειδιών; Βρείτε το, στην σύνταξη της CREATE TABLE...
Foreign Keys Δημιουργία πινάκων για δοκιμή Το ER της βάσης πάνω στην οποία θα κάνουμε τις δοκιμές: http://dev.mysql.com/doc/refman/5.0/en/create-table.html
Δημιουργία πινάκων CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_option]... create_definition: col_name column_definition [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition reference_definition: REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL MATCH PARTIAL MATCH SIMPLE] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT CASCADE SET NULL NO ACTION
Foreign Keys Δημιουργία πινάκων για δοκιμή mysql> CREATE DATABASE dokimi1; mysql> USE dokimi1; mysql> CREATE TABLE people( id INT, name VARCHAR(30), surname VARCHAR(30), PRIMARY KEY (id) ) ENGINE=InnoDB; mysql> CREATE TABLE addresses( id INT, street VARCHAR(30), number INT, PRIMARY KEY (id) ) ENGINE=InnoDB;
Foreign Keys Δημιουργία πινάκων για δοκιμή mysql> CREATE TABLE p2a( people_id INT, address_id INT, PRIMARY KEY (people_id, address_id), FOREIGN KEY (people_id) REFERENCES people (id), FOREIGN KEY (address_id) REFERENCES addresses (id) ) ENGINE=InnoDB;
INSERT εισαγωγή δεδομένων Για την εισαγωγή των δεδομένων χρησιμοποιούμε την εντολή INSERT Πάμε στο manual να δούμε για αυτήν την εντολή...
INSERT εισαγωγή δεδομένων Το ER της βάσης πάνω στην οποία θα κάνουμε τις δοκιμές: INSERT [LOW_PRIORITY DELAYED HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr DEFAULT},...),(...),... Aν θέλω να εισάγω στον πίνακα people τις τιμές nikos papadopoulos (με id =1) πώς θα συντάξω την εντολή; http://dev.mysql.com/doc/refman/5.0/en/insert.html
INSERT εισαγωγή δεδομένων INSERT INTO people (id, name, surname) VALUES (1, 'nikos', 'papadopoulos'); Aν θέλω να εισάγω στον πίνακα people τις τιμές maria papadopoulou dimitra papadopoulou (με id =2, 4) http://dev.mysql.com/doc/refman/5.0/en/insert.html
INSERT εισαγωγή δεδομένων INSERT INTO people (id, name, surname) VALUES (2, 'maria', 'papadopoulou'), (4, 'dimitra', 'papadopoulou'); Aν θέλω να εισάγω στον πίνακα addresses τις τιμές labraki 50 labraki 45 akadimias 104 (με id =1, 2, 15) http://dev.mysql.com/doc/refman/5.0/en/insert.html
INSERT εισαγωγή δεδομένων INSERT INTO addresses (id, street, number) VALUES (1, 'labraki', 50), (2, 'akadimias', 45), (15, 'labraki', 104); http://dev.mysql.com/doc/refman/5.0/en/insert.html
INSERT εισαγωγή δεδομένων Ο nikos μένει στην διέθυνση 1 Η maria μένει στην διέθυνση 2 H dimitra μένει στην διέθυνση 15 και 1 INSERT INTO p2a (people_id, address_id) VALUES (1, 1), (2,2), (4, 15), (4, 1);
INSERT σφάλματα INSERT INTO people (id, name, surname) VALUES (1, 'aa', 'bb'); INSERT INTO p2a (people_id, address_id) VALUES (1, 40);
Example Database `world` Στην διεύθυνση http://dev.mysql.com/doc/ υπάρχουν υποδείγματα βάσεων δεδομένων (example databases). Κατεβάστε την βάση δεδομένων world στο home σας. Για να αποσυμπιέσετε το αρχείο: shell> unzip world.sql.zip Για να φορτώσουμε το backup της βάσης στον server: mysql> CREATE DATABASE world1; shell> mysql -uroot -p world1 < world.sql
SELECT City( ID, Name, CountryCode, District, Population) SELECT * ; (4079) SELECT Name, Population ; (4079) SELECT Name, Population WHERE Population < 100000; (517) SELECT Name, Population WHERE Population < 100000 AND Population > 25000; (455)
SELECT City( ID, Name, CountryCode, District, Population) SELECT Name, Population WHERE Name LIKE 'A%'; (259) SELECT Name, Population WHERE Name LIKE 'A%en%'; (20) SELECT Name, Population WHERE Name LIKE 'A%' UNION SELECT Name, Population WHERE Name LIKE 'B%';
SELECT aggregate functions City( ID, Name, CountryCode, District, Population) SELECT District, CountryCode ; (4079) SELECT DISTINCT(CountryCode) ; (232) SELECT COUNT(DISTINCT(CountryCode)) ; (1) SELECT MAX(Population) ; (1) SELECT MAX(Population), Name ; (???)
SELECT SELECT aggregate functions City( ID, Name, CountryCode, District, Population) SELECT MAX(Population), Name GROUP BY Name; SELECT MAX(Population), Name GROUP BY Name ORDER BY Population; SELECT SUM(Population) AS Total, District GROUP BY District ORDER BY Total;
SELECT SELECT aggregate functions City( ID, Name, CountryCode, District, Population) SELECT SUM(Population) AS Total, District GROUP BY District ORDER BY Total DESC; SELECT SUM(Population) AS Total, District GROUP BY District ORDER BY Total DESC LIMIT 5; /* LIMIT : MySQL Specific */
SELECT nested SELECTs City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) SELECT Code, Name FROM Country WHERE IndepYear > 1920 AND Continent='Asia'; SELECT Name WHERE CountryCode IN ( SELECT Code FROM Country WHERE IndepYear > 1920 AND Continent='Asia');
SELECT JOINs City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) SELECT City.Name, Country.Name, Country; City: 4000 rows Country: 200 rows City x Country: 800000 rows Πατήστε Ctrl+C για να σταματήσει το αίτημα (o client)
SELECT Name FROM Country WHERE Continent ='Asia'; (51) SELECT JOINs SELECT Name WHERE Population > 4000000; (33) 51x33~1600 SELECT City.Name, Country.Name, Country WHERE Country.Continent ='Asia' AND City.Population > 4000000; (κάθε πόλη εμφανίζεται με τις 33 χώρες)
SELECT JOINs City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) SELECT City.Name, City.CountryCode, Country.Name, Country.Code, Country WHERE Country.Continent ='Asia' AND City.Population > 4000000; SELECT City.Name, Country.Name, Country WHERE Country.Continent ='Asia' AND City.Population > 4000000 AND City.CountryCode = Country.Code;
SELECT JOINs City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,...) SELECT City.Name, Country.Name, Country WHERE City.CountryCode = Country.Code; SELECT City.Name, Country.Name, Country WHERE City.CountryCode = Country.Code; SELECT City.Name, Country.Name JOIN Country; Ας δούμε την σύνταξη του join (03-SQL.pdf σελ 16 )
SELECT JOINs City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,...) SELECT City.Name, Country.Name INNER JOIN Country ON City.CountryCode = Country.Code; SELECT City.Name, Country.Name INNER JOIN Country ON City.CountryCode = Country.Code WHERE Country.Continent ='Asia' AND City.Population > 4000000;
City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,...) SELECT JOINs SELECT t1.name, t2.name FROM (SELECT Name, Code FROM Country WHERE Continent ='Asia') AS t1, (SELECT Name, CountryCode WHERE Population > 4000000) AS t2 WHERE t2.countrycode = t1.code; SELECT t1.name, t2.name FROM (SELECT Name, Code FROM Country WHERE Continent ='Asia') AS t1 INNER JOIN (SELECT Name, CountryCode WHERE Population > 4000000) AS t2 ON t2.countrycode = t1.code;
City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,...) SELECT JOINs SELECT t1.name, t2.name FROM (SELECT Name, Code FROM Country WHERE Continent ='Asia') AS t1 RIGHT OUTER JOIN (SELECT Name, CountryCode WHERE Population > 4000000) AS t2 ON t2.countrycode = t1.code;
City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,...) SELECT JOINs SELECT t1.name, t2.name FROM (SELECT Name, Code FROM Country WHERE Continent ='Asia') AS t1 LEFT OUTER JOIN (SELECT Name, CountryCode WHERE Population > 4000000) AS t2 ON t2.countrycode = t1.code;