MySQL Εργαστήριο #3 Structured Query Language - SQL Τν πιηθό πξνέξρεηαη από δηαθάλεηεο ηνπ Δ. Καηζίθαξνπ (http://infolab.cs.unipi.gr/people/katsikaros/) ηνλ νπνίν επραξηζηνύκε ζεξκά Νίθνο Γηαηξάθνο Δξγαζηήξην Πιεξνθνξηαθώλ Σπζηεκάηωλ, Τκήκα Πιεξνθνξηθήο, Παλεπηζηήκην Πεηξαηά (http://infolab.cs.unipi.gr)
Εισαγωγικά - Προετοιμασία Αλνίγνπκε κέζω ηνπ browser ην URL: http://dev.mysql.com/doc/ index-other.html θαη από ηηο δηαζέζηκεο βάζεηο δεδνκέλωλ θαηεβάδνπκε ηε ΒΓ: world Απνζπκπηέδνπκε ην αξρείν: shell> unzip world.sql.zip Γεκηνπξγνύκε ηε βάζε δεδνκέλωλ πνπ ζα πεξηιάβεη ηνπο πίλαθεο θαη ηα δεδνκέλα ηεο world mysql> CREATE DATABASE world_yoursn; Φνξηώλνπκε ηα δεδνκέλα θαη ηνπο πίλαθεο shell> mysql hwendy -uroot -p world1_yoursn < path\world.sql mysql> Show Databases; mysql> USE world1_yoursn ; mysql> Show Tables; 2
Μέρος Ι - SQL Επερωτήσεις
Το τμήμα Select City( ID, Name, CountryCode, District, Population) SELECT * ; (4079) SELECT Name, Population ; SELECT District, CountryCode ; (4079) SELECT DISTINCT(CountryCode) ; (232) 4
Το τμήμα Where City( ID, Name, CountryCode, District, Population) SELECT Name, Population WHERE Population < 100000; (517) SELECT Name, Population WHERE Population < 100000 AND Population > 25000; (455) SELECT Name, Population WHERE Name LIKE 'A%'; (259) 5
Το τμήμα Where City( ID, Name, CountryCode, District, Population) SELECT Name, Population WHERE Name LIKE 'A%en%'; (20) SELECT Name, Population WHERE Name LIKE 'A%' UNION SELECT Name, Population WHERE Name LIKE 'B%'; 6
Το τμήμα From City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) SELECT City.Name, Country.Name, Country WHERE City.CountryCode = Country.Code; SELECT City.Name, Country.Name, Country WHERE Country.Continent ='Asia' AND City.Population > 4000000 AND City.CountryCode = Country.Code; 7
Συναθροιστικές Συναρτήσεις City( ID, Name, CountryCode, District, Population) SELECT COUNT(DISTINCT(CountryCode)) ; (1) SELECT MAX(Population) ; (1) SELECT MAX(Population), Name ; 8
Συναθροιστικές Συναρτήσεις 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 SUM(Ci.Population) AS Total, District, Co.Name Ci, Country Co WHERE Ci.CountryCode=Co.Code GROUP BY District, Co.Code HAVING Total> 20000 9
Εμφωλευμένα Ερωτήματα City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) SELECT Name WHERE CountryCode IN ( SELECT Code FROM Country WHERE IndepYear > 1920 AND Continent='Asia'); 10
Παραγόμενες Σχέσεις City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) 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; 11
Σύνδεση Σχέσεων ( Join ) City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) 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; 12
Σύνδεση Σχέσεων ( Join ) City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) 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; 13
Σύνδεση Σχέσεων ( Join ) City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) 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; 14
Σύνδεση Σχέσεων ( Join ) City( ID, Name, CountryCode, District, Population) CountryLanguage(CountryCode, Language, IsOfficial, Percentage ) SELECT * FROM (SELECT Language, CountryCode FROM CountryLanguage WHERE Percentage > 50) AS t1 NATURAL JOIN (SELECT Name, CountryCode WHERE Population > 4000000) AS t2 ; 15
Σύνδεση Σχέσεων ( Join ) City( ID, Name, CountryCode, District, Population) Country( Code, Name, Continent, Region,... SurfaceArea, IndepYear, Population,...) 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 UNION 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; 16
Μέρος ΙΙ - Επερωτήσεις σε Φυσική Γλώσσα
Ερωτήματα 1 City( ID, Name, CountryCode, District, ( Population 1) Πνηεο είλαη νη πόιεηο; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά. 2) Πνηεο είλαη νη πόιεηο; Να εκθαλίδεηαη ην όλνκα. 3) Πνηεο είλαη νη πόιεηο; Να εκθαλίδεηαη ην όλνκα, ν πιεζπζκόο, θαη ε πεξηνρή ηεο πόιεο. 4) Πνηεο είλαη νη πόιεηο; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά ηωλ πόιεωλ (κε ξεηή δήιωζε).
Ερωτήματα 2 City( ID, Name, CountryCode, District, ( Population 1) Πνηεο είλαη νη πόιεηο; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά θαη ηαμηλνκεκέλεο θαηά όλνκα (αύμνπζα ζεηξά) 2) Πνηεο είλαη νη πόιεηο; Να εκθαλίδεηαη ην όλνκα θαη ν πιεζπζκόο θαη ηαμηλνκεκέλεο θαηά πιεζπζκό (θζίλνπζα ζεηξά) 3) Πνηεο είλαη νη πόιεηο; Να εκθαλίδεηαη ε ρώξα, ε πεξηνρή, ην όλνκα θαη ν πιεζπζκόο. Ταμηλνκεκέλεο πξώηα θαηά ρώξα (αύμνπζα ζεηξά) θαη κεηά θαηά πεξηνρή (αύμνπζα ζεηξά) 4) Πνηεο είλαη νη πόιεηο; Να εκθαλίδεηαη ε ρώξα, ην όλνκα, ν πιεζπζκόο θαη ε πεξηνρή. Ταμηλνκεκέλεο πξώηα θαηά ρώξα (αύμνπζα ζεηξά) θαη κεηά θαηά πιεζπζκό (θζίλνπζα ζεηξά)
Ερωτήματα 3 City( ID, Name, CountryCode, District, ( Population 1) Πνηεο είλαη νη πόιεηο ηωλ νπνίωλ ην όλνκα μεθηλά από ην γξάκκα άιθα; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά. 2) Πνηεο είλαη νη πόιεηο ηωλ νπνίωλ ην όλνκα πεξηέρεη ην γξάκκα άιθα; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά. 3) Πνηεο είλαη νη πόιεηο ηωλ νπνίωλ ην όλνκα πεξηέρεη δύν ζπλερόκελα γξάκκαηα άιθα; 4) Πνηεο είλαη νη πόιεηο ηωλ νπνίωλ ην όλνκα έρεη ζην 2 ν γξάκκα ην γξάκκα άιθα;
Ερωτήματα 4 City( ID, Name, CountryCode, District, ( Population 1) Πνηεο είλαη νη πόιεηο κε πιεζπζκό κεγαιύηεξν από 100 Κ; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά. 2) Πνηεο είλαη νη πόιεηο κε πιεζπζκό κηθξόηεξν από 2 Μ; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά. 3) Πνηεο είλαη νη πόιεηο κε πιεζπζκό από 1 Μ έωο 1.5 Μ; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά. 4) Πνηεο είλαη νη πόιεηο κε πιεζπζκό 45 Κ; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά. 5) Πνηεο είλαη νη πόιεηο κε πιεζπζκό 1.5 Κ; Να εκθαλίδνληαη όια ηα ραξαθηεξηζηηθά.
Ερωτήματα 5 City( ID, Name, CountryCode, District, ( Population 1) Πνηεο είλαη νη πόιεηο κε πιεζπζκό κεγαιύηεξν από 100 Κ θαη ην όλνκά ηνπο μεθηλά πεξηέρεη ην γξάκκα Β; 2) Πνηεο είλαη νη πόιεηο κε πιεζπζκό κεγαιύηεξν από 100 Κ θαη ην όλνκά ηνπο μεθηλά από ην γξάκκα Β θαη ε επαξρία μεθηλά από Q ; 3) Πνηεο είλαη νη πόιεηο νη νπνίεο έρνπλ πιεζπζκό κεγαιύηεξν από 1Μ ή ην όλνκά ηνπο μεθηλά από C; 4) Πνηεο είλαη νη πόιεηο νη νπνίεο είηε έρνπλ πιεζπζκό κεγαιύηεξν από 1Μ θαη ην όλνκά ηνπο μεθηλά από D είηε έρνπλ πιεζπζκό κηθξόηεξν από 500Κ θαη ην όλνκά ηνπο μεθηλά από F; Να ηαμηλνκεζνύλ θαηά όλνκα (αύμνπζα ζεηξά)
Ερωτήματα 6 City( ID, Name, CountryCode, District, ( Population 1) Πνηεο είλαη πεξηνρέο; 2) Πνηνη είλαη νη θωδηθνί ηωλ ρωξώλ; 3) Πνηνο είλαη ν κεγαιύηεξνο πιεζπζκόο από όιεο ηηο πόιεηο; 4) Πνηνο είλαη ν κηθξόηεξνο πιεζπζκόο από όιεο ηηο πόιεηο; 5) Πνηνο είλαη ν κέζνο πιεζπζκόο όιωλ ηωλ πόιεωλ;
Ερωτήματα 7 City( ID, Name, CountryCode, District, ( Population 1) Πνην είλαη ην άζξνηζκα ηνπ πιεζπζκνύ όιωλ ηωλ πόιεωλ; 2) Πνην είλαη ην άζξνηζκα ηνπ πιεζπζκνύ αλά πεξηνρή; Να εκθαλίδεηαη ην άζξνηζκα θαη ε πεξηνρή. 3) Πνηνο είλαη ν κέγηζηνο πιεζπζκόο αλά πεξηνρή; Να εκθαλίδεηαη ην όλνκα ηεο πόιεο, ην κέγηζην θαη ε πεξηνρή. 4) Πνην είλαη ην άζξνηζκα ηνπ πιεζπζκνύ αλά ρώξα; Να εκθαλίδεηαη ην άζξνηζκα θαη ε ρώξα.
Ερωτήματα 8 Country( Code, Name, Contintent, Population, SurfaceArea,...) CountryLanguage( CountryCode, Language, ( Percentage IsOfficial, 1) Πνηεο γιώζζεο κηινύλ ζε θάζε ρώξα; Να εκθαληζηεί ε ρώξα θαη ε γιώζζα. 2) Πνηα είλαη ε επίζεκε γιώζζα θάζε ρώξαο; Να εκθαληζηεί ε ρώξα θαη ε γιώζζα. 3) Πνηνο είλαη ν πιεζπζκόο πνπ κηιά ηελ επίζεκε γιώζζα θάζε ρώξαο; Να εκθαληζηεί ε ρώξα θαη ε γιώζζα, ν πιεζπζκόο ηεο ρώξαο θαη ν πιεζπζκόο πνπ ηελ κηιά.
Ερωτήματα 9 Country( Code, Name, Contintent, Population, SurfaceArea,...) CountryLanguage( CountryCode, Language, ( Percentage IsOfficial, 1) Πνηεο είλαη νη αλεπίζεκεο γιώζζεο ηωλ ρωξώλ; Να εκθαληζηεί ε ρώξα, ε γιώζζα θαη ην πνζνζηό ηεο γιώζζαο. 2) Πνην είλαη ην άζξνηζκα ηνπ πνζνζηνύ ηνπ πιεζπζκνύ πνπ κηιά ηηο αλεπίζεκεο γιώζζεο; Να εκθαληζηεί ε ρώξα, ε γιώζζα θαη ην πνζνζηό.
Ερωτήματα 10 Country( Code, Name, Contintent, Population, SurfaceArea,...) CountryLanguage( CountryCode, Language, ( Percentage IsOfficial, 1) Πνηεο γιώζζεο νκηινύληαη ζε θάζε πόιε (υποθέτουμε όηη ε θαηαλνκή ηνπ πνζνζηνύ ζηνλ ζπλνιηθό πιεζπζκό, ηζρύεη γηα θάζε κέξνο ηνπ πιεζπζκνύ, άξα θαη ζηνλ πιεζπζκό ηεο πόιεο). Να εκθαληζηεί ε πόιε θαη ε γιώζζα. 2) Πνηεο γιώζζεο νκηινύληαη ζε θάζε πόιε (υποθέτουμε όηη ε θαηαλνκή ηνπ πνζνζηνύ ζηνλ ζπλνιηθό πιεζπζκό, ηζρύεη γηα θάζε κέξνο ηνπ πιεζπζκνύ, άξα θαη ζηελ πιεζπζκό ηεο πόιεο). Να εκθαληζηεί ε ρώξα, ε πόιε θαη ε γιώζζα.
Πηγές περαιτέρω μελέτης http://dev.mysql.com/doc/refman/5.1/en/select.html http://dev.mysql.com/doc/refman/5.0/en/join.html http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html 28
Μέρος ΙΙ - Απαντήσεις
Ερωτήματα 1 City( ID, Name, CountryCode, District, ( Population 1 SELECT * 2 SELECT Name 3 SELECT Name, District, Population 4 SELECT ID, Name, CountryCode, District, Population
Ερωτήματα 2 City( ID, Name, CountryCode, District, ( Population 1 SELECT * ORDER BY Name ASC 2 SELECT Name, Population ORDER BY Population DESC 3 SELECT CountryCode, District, Name, Population ORDER BY CountryCode ASC, District ASC 4 SELECT CountryCode, Name, Population, District ORDER BY CountryCode ASC, Population DESC
Ερωτήματα 3 City( ID, Name, CountryCode, District, ( Population 1 SELECT * WHERE Name LIKE 'A%' 2 SELECT * WHERE Name LIKE '%A%' 3 SELECT * WHERE Name LIKE '%AA%' 4 SELECT * WHERE Name LIKE '_A%'
Ερωτήματα 4 City( ID, Name, CountryCode, District, ( Population 1 SELECT * WHERE Population > 1e5 2 SELECT * WHERE Population < 2e6 3 SELECT * WHERE Population < 1.5e6 AND Population > 1e6 4 SELECT * WHERE Population = 45e3 5 SELECT * WHERE Population = 1500
Ερωτήματα 5 City( ID, Name, CountryCode, District, ( Population 1 SELECT * WHERE Population > 1e6 AND Name LIKE '%b%' 2 SELECT * WHERE Population > 1e6 AND Name LIKE '%b%' ANDDistrictLIKE'Q% 3 SELECT * WHERE Population > 1e6 OR Name LIKE 'C%' 4 SELECT * ( 'D%' WHERE ( Population > 1e6 AND Name LIKE ( 'F%' OR ( Population < 1e5 AND Name LIKE ORDER BY Name
Ερωτήματα 6 City( ID, Name, CountryCode, District, ( Population ( DISTINCT(District 1 SELECT ( DISTINCT(CountryCode 2 SELECT ( MAX(Population 3 SELECT ( MIN(Population 4 SELECT ( AVG(Population 5 SELECT
Ερωτήματα 7 City( ID, Name, CountryCode, District, ( Population ( SUM(Population 1 SELECT 2 SELECT SUM(Population), District GROUP BY District 3 SELECT Name, MAX(Population), District GROUP BY District 4 SELECT SUM(Population), CountryCode GROUP BY CountryCode
Ερωτήματα 8 Country( Code, Name, Contintent, Population SurfaceArea,...) CountryLanguage( CountryCode, Language, ( Percentage IsOfficial, 1 SELECT Country.Name, CountryLanguage.Language FROM Country INNER JOIN CountryLanguage ON Country.Code = CountryLanguage.CountryCode 2 SELECT Country.Name, CountryLanguage.Language FROM Country INNER JOIN CountryLanguage ON Country.Code = CountryLanguage.CountryCode WHERE CountryLanguage.IsOfficial = 'T' 3 SELECT Country.Name, CountryLanguage.Language, Country.Population, Country.Population* ( CountryLanguage.Percentage/100 ) FROM Country INNER JOIN CountryLanguage ON Country.Code = CountryLanguage.CountryCode WHERE CountryLanguage.IsOfficial = 'T'
Ερωτήματα 9 Country( Code, Name, Contintent, Population SurfaceArea,...) CountryLanguage( CountryCode, Language, IsOfficial, ( Percentage 1 SELECT Country.Name, CountryLanguage.Language, CountryLanguage.Percentage FROM Country INNER JOIN CountryLanguage ON Country.Code = CountryLanguage.CountryCode WHERE CountryLanguage.IsOfficial = 'F' ORDER BY Country.Name 2 SELECT Country.Name, CountryLanguage.Language, ( SUM(CountryLanguage.Percentage FROM Country INNER JOIN CountryLanguage ON Country.Code = CountryLanguage.CountryCode WHERE CountryLanguage.IsOfficial = 'F' GROUP BY Country.Name ORDER BY Country.Name
Ερωτήματα 10 Country( Code, Name, Contintent, Population SurfaceArea,...) CountryLanguage( CountryCode, Language, IsOfficial, ( Percentage 1 SELECT City.Name, CountryLanguage.Language INNER JOIN CountryLanguage ON City.CountryCode = CountryLanguage.CountryCode ORDER BY City.CountryCode 2 SELECT Country.Name, City.Name, CountryLanguage.Language INNER JOIN CountryLanguage ON City.CountryCode = CountryLanguage.CountryCode INNER JOIN Country ON City.CountryCode = Country.Code ORDER BY City.CountryCode