├── README.md ├── examples ├── ch01 │ └── empty.txt ├── ch02 │ ├── ch02_02_查詢敘述.sql │ ├── ch02_03_條件查詢.sql │ ├── ch02_04_排序.sql │ └── ch02_05_限制查詢.sql ├── ch03 │ ├── ch03_01_值與運算式.sql │ ├── ch03_02_函式.sql │ └── ch03_03_群組查詢.sql ├── ch04 │ ├── ch04_02_Inner Join.sql │ ├── ch04_03_Outer Join.sql │ └── ch04_04_合併查詢.sql ├── ch05 │ ├── ch05_01_取得表格資訊.sql │ ├── ch05_02_新增.sql │ ├── ch05_03_修改.sql │ └── ch05_04_刪除.sql ├── ch06 │ ├── ch06_01_Character Set與Collation.sql │ └── ch06_02_資料庫.sql ├── ch07 │ └── ch07_02_欄位資料型態.sql ├── ch08 │ ├── ch08_01_建立表格.sql │ ├── ch08_02_修改表格.sql │ ├── ch08_03_刪除表格.sql │ ├── ch08_04_索引介紹.sql │ ├── ch08_05_建立索引.sql │ ├── ch08_06_索引的名稱.sql │ ├── ch08_07_刪除索引.sql │ ├── ch08_08_數值欄位型態與AUTO_INCREMENT.sql │ └── ch08_09_查詢表格與索引資訊.sql ├── ch09 │ ├── ch09_01_一個敘述中的查詢敘述.sql │ ├── ch09_02_WHERE_HAVING子句與子查詢.sql │ ├── ch09_03_SELECT子句與子查詢.sql │ ├── ch09_04_FROM子句與子查詢.sql │ ├── ch09_05_資料維護與子查詢.sql │ ├── ch09_06_關聯子查詢.sql │ └── ch09_07_子查詢與結合查詢.sql ├── ch10 │ ├── ch10_01_View的應用.sql │ ├── ch10_02_建立需要的View.sql │ ├── ch10_03_修改View.sql │ ├── ch10_04_刪除View.sql │ ├── ch10_05_資料維護與View.sql │ ├── ch10_06_View的演算法.sql │ └── ch10_07_View的維護與資訊.sql ├── ch11 │ ├── ch11_01_使用者變數.sql │ ├── ch11_02_Prepared Statements的應用.sql │ ├── ch11_03_建立_執行與移除Prepared Statements.sql │ ├── ch11_04_Prepared Statements的參數.sql │ └── ch11_05_有效範圍.sql ├── ch12 │ ├── ch12_01_Stored Routines的應用.sql │ ├── ch12_02_在MySQL Query Browser中管理Stored routines.sql │ └── ch12_03_Stored Routines的參數.sql ├── ch13 │ ├── ch13_01_宣告與使用變數.sql │ └── ch13_02_判斷.sql ├── ch14 │ ├── ch14_01_錯誤編號.sql │ ├── ch14_02_Handlers.sql │ ├── ch14_03_Conditions.sql │ ├── ch14_04_Cursors.sql │ ├── ch14_05_設定_修改與刪除Stored routines.sql │ └── ch14_06_查詢Stored routines的相關資訊.sql ├── ch15 │ ├── ch15_01_Triggers的應用.sql │ ├── ch15_02_建立Triggers.sql │ ├── ch15_04_OLD與NEW關鍵字.sql │ └── ch15_05_查詢Triggers的相關資訊.sql ├── ch16 │ ├── ch16_01_information_schema資料庫.sql │ ├── ch16_02_SHOW指令.sql │ ├── ch16_03_DESCRIBE指令.sql │ └── ch16_04_mysqlshow.sql ├── ch17 │ ├── ch17_01_錯誤的資料.sql │ ├── ch17_02_Non_Strict模式.sql │ ├── ch17_03_其它設定.sql │ └── ch17_04_查詢錯誤與警告.sql ├── ch18 │ ├── ch18_02_使用SQL敘述匯出資料.sql │ ├── ch18_03_使用SQL敘述匯入資料.sql │ ├── ch18_04_使用mysqldump程式匯出資料.sql │ └── ch18_05_使用mysqlimport程式匯入資料.sql └── ch19 │ ├── ch19_01_索引.sql │ ├── ch19_02_判斷條件的設定.sql │ ├── ch19_03_EXPLAIN與查詢敘述.sql │ ├── ch19_04_資料維護.sql │ ├── ch19_05_LIMIT子句.sql │ └── ch19_06_使用暫時表格.sql ├── resources ├── cmdev.sql └── world.sql └── solutions ├── ch01 └── empty.txt ├── ch02 ├── ch02_01.sql ├── ch02_02.sql ├── ch02_03.sql └── ch02_04.sql ├── ch03 ├── ch03_01.sql ├── ch03_02.sql ├── ch03_03.sql └── ch03_04.sql ├── ch04 ├── ch04_01.sql ├── ch04_02.sql └── ch04_03.sql ├── ch05 ├── ch05_01.sql ├── ch05_02.sql ├── ch05_03.sql └── ch05_04.sql ├── ch06 └── ch06_01.sql ├── ch07 └── empty.txt ├── ch08 ├── Lab08_all.sql ├── ch08_01.sql ├── ch08_02.sql └── ch08_03.sql ├── ch09 ├── ch09_01.sql ├── ch09_02.sql └── ch09_03.sql ├── ch10 ├── Lab10_all.sql ├── ch10_01.sql └── ch10_02.sql ├── ch11 ├── ch11_01.sql └── ch11_02.sql ├── ch12 ├── ch12_01.sql └── ch12_02.sql ├── ch13 ├── ch13_01.sql ├── ch13_02.sql ├── ch13_03.sql ├── ch13_04.sql └── ch13_05.sql ├── ch14 ├── ch14_01.sql ├── ch14_02.sql └── ch14_03.sql ├── ch15 ├── ch15_01.sql └── ch15_02.sql ├── ch16 └── empty.txt ├── ch17 └── empty.txt ├── ch18 ├── ch18_01.sql └── ch18_02.sql └── ch19 └── empty.txt /README.md: -------------------------------------------------------------------------------- 1 | MySQL超新手入門 2 | ============= 3 | 4 | 5 | * examples:範例 6 | * resources:建立範例資料庫的SQL敘述檔 7 | * solutions:練習解答 8 | -------------------------------------------------------------------------------- /examples/ch01/empty.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macdidi5/MySQLTutorial/f44207d5f441171a1c600753f694974c537210da/examples/ch01/empty.txt -------------------------------------------------------------------------------- /examples/ch02/ch02_02_查詢敘述.sql: -------------------------------------------------------------------------------- 1 | USE world 2 | 3 | 4 | SELECT 'My name is Simon Johnson', 35 * 12 5 | 6 | 7 | SELECT * FROM city 8 | 9 | 10 | SELECT * FROM cmdev.emp 11 | 12 | 13 | SELECT * FROM city 14 | 15 | 16 | SELECT ID, Name 17 | FROM city 18 | 19 | 20 | SELECT Name, ID 21 | FROM city 22 | 23 | 24 | SELECT ID, Name, District 25 | FROM city 26 | 27 | 28 | SELECT ename, salary, salary * 12, 29 | (salary * 12) + (salary DIV 2) 30 | FROM cmdev.emp 31 | 32 | 33 | SELECT ename, salary AS MonthSalary, 34 | salary * 12 AS AnnualSalary, 35 | (salary * 12) + (salary DIV 2) AnnualFullSalary 36 | FROM cmdev.emp 37 | 38 | 39 | SELECT ename, salary * 12 AS 'Annual Salary' 40 | FROM cmdev.emp 41 | 42 | 43 | SELECT ename, salary * 12 AS 'select' 44 | FROM cmdev.emp 45 | -------------------------------------------------------------------------------- /examples/ch02/ch02_03_條件查詢.sql: -------------------------------------------------------------------------------- 1 | SELECT * 2 | FROM city 3 | 4 | 5 | SELECT * 6 | FROM city 7 | WHERE CountryCode = 'TWN' 8 | 9 | 10 | SELECT * 11 | FROM city 12 | WHERE Population < 800 13 | 14 | 15 | SELECT * 16 | FROM city 17 | WHERE Population <= 800 18 | 19 | 20 | SELECT * 21 | FROM cmdev.emp 22 | WHERE hiredate = '1981-09-08' 23 | 24 | 25 | SELECT * 26 | FROM cmdev.emp 27 | WHERE hiredate > '1981-09-08' 28 | 29 | 30 | SELECT * 31 | FROM cmdev.emp 32 | WHERE hiredate < '1981-09-08' 33 | 34 | 35 | SELECT * 36 | FROM city 37 | WHERE CountryCode != 'TWN' 38 | 39 | 40 | SELECT * 41 | FROM city 42 | WHERE NOT CountryCode = 'TWN' 43 | 44 | 45 | SELECT * 46 | FROM city 47 | WHERE CountryCode = 'TWN' AND Population < 100000 48 | 49 | 50 | SELECT * 51 | FROM city 52 | WHERE CountryCode = 'TWN' OR CountryCode='USA' 53 | 54 | 55 | SELECT Name, Continent, Population 56 | FROM country 57 | WHERE Continent='Europe' OR Continent='Africa' AND Population<10000 58 | 59 | 60 | SELECT Name, Continent, Population 61 | FROM country 62 | WHERE (Continent='Europe' OR Continent='Africa') AND Population<10000 63 | 64 | 65 | SELECT * 66 | FROM city 67 | WHERE Population >= 80000 AND Population <= 90000 68 | 69 | 70 | SELECT * 71 | FROM city 72 | WHERE Population BETWEEN 80000 AND 90000 73 | 74 | 75 | SELECT * 76 | FROM city 77 | WHERE Population > 80000 AND Population < 90000 78 | 79 | 80 | SELECT * 81 | FROM city 82 | WHERE Population BETWEEN 80000 AND 90000 83 | 84 | 85 | SELECT ename, hiredate 86 | FROM cmdev.emp 87 | WHERE hiredate BETWEEN '1981-01-01' AND '1981-06-30' 88 | 89 | 90 | SELECT * 91 | FROM city 92 | WHERE CountryCode = 'TWN' OR 93 | CountryCode = 'USA' OR 94 | CountryCode = 'JPN' OR 95 | CountryCode = 'ITA' OR 96 | CountryCode = 'KOR' 97 | 98 | 99 | SELECT * 100 | FROM city 101 | WHERE CountryCode IN ('TWN','USA','JPN','ITA','KOR') 102 | 103 | 104 | SELECT Name, LifeExpectancy 105 | FROM country 106 | WHERE LifeExpectancy = NULL 107 | 108 | 109 | SELECT Name, LifeExpectancy 110 | FROM country 111 | WHERE LifeExpectancy IS NULL 112 | 113 | 114 | SELECT Name, LifeExpectancy 115 | FROM country 116 | WHERE LifeExpectancy <=> NULL 117 | 118 | 119 | SELECT Name, LifeExpectancy 120 | FROM country 121 | WHERE LifeExpectancy <> NULL 122 | 123 | 124 | SELECT Name, LifeExpectancy 125 | FROM country 126 | WHERE LifeExpectancy IS NOT NULL 127 | 128 | 129 | SELECT Name FROM city WHERE Name = 'w' 130 | 131 | 132 | SELECT Name 133 | FROM city 134 | WHERE Name LIKE 'w' 135 | 136 | 137 | SELECT Name 138 | FROM city 139 | WHERE Name LIKE 'w%' 140 | 141 | 142 | SELECT Name 143 | FROM city 144 | WHERE Name LIKE 'w%' 145 | 146 | 147 | SELECT Name 148 | FROM city 149 | WHERE Name LIKE '%w' 150 | 151 | 152 | SELECT Name 153 | FROM city 154 | WHERE Name LIKE '%w%' 155 | 156 | 157 | SELECT Name 158 | FROM city 159 | WHERE Name LIKE 'w_____' 160 | 161 | 162 | SELECT Name 163 | FROM city 164 | WHERE Name LIKE '_____w' 165 | 166 | 167 | SELECT Name 168 | FROM city 169 | WHERE Name LIKE '_____w%' 170 | 171 | 172 | SELECT Name 173 | FROM city 174 | WHERE Name LIKE '______________________________%' 175 | -------------------------------------------------------------------------------- /examples/ch02/ch02_04_排序.sql: -------------------------------------------------------------------------------- 1 | SELECT CountryCode, Name 2 | FROM city 3 | ORDER BY CountryCode ASC 4 | 5 | 6 | SELECT CountryCode, Name 7 | FROM city 8 | ORDER BY CountryCode 9 | 10 | 11 | SELECT CountryCode, Name 12 | FROM city 13 | ORDER BY CountryCode DESC 14 | 15 | 16 | SELECT CountryCode, Name 17 | FROM city 18 | ORDER BY CountryCode 19 | 20 | 21 | SELECT CountryCode, Name 22 | FROM city 23 | ORDER BY CountryCode, Name 24 | 25 | 26 | SELECT CountryCode, Name 27 | FROM city 28 | ORDER BY CountryCode DESC, Name ASC 29 | 30 | 31 | SELECT ename, salary * 12 AS AnnualSalary 32 | FROM cmdev.emp 33 | ORDER BY salary * 12 34 | 35 | 36 | SELECT ename, salary * 12 AS AnnualSalary 37 | FROM cmdev.emp 38 | ORDER BY AnnualSalary 39 | 40 | 41 | SELECT ename, salary * 12 AS AnnualSalary 42 | FROM cmdev.emp 43 | ORDER BY 2 44 | 45 | 46 | SELECT CountryCode, Name 47 | FROM city 48 | ORDER BY Population 49 | -------------------------------------------------------------------------------- /examples/ch02/ch02_05_限制查詢.sql: -------------------------------------------------------------------------------- 1 | 2 | SELECT empno, ename 3 | FROM cmdev.emp 4 | LIMIT 5 5 | 6 | 7 | SELECT empno, ename 8 | FROM cmdev.emp 9 | LIMIT 5, 5 10 | 11 | 12 | SELECT empno, ename, salary 13 | FROM cmdev.emp 14 | ORDER BY salary DESC 15 | LIMIT 3 16 | 17 | 18 | SELECT empno, ename, salary 19 | FROM cmdev.emp 20 | ORDER BY salary ASC 21 | LIMIT 3 22 | 23 | 24 | SELECT Continent FROM country 25 | 26 | 27 | SELECT ALL Continent FROM country 28 | 29 | 30 | SELECT DISTINCT Continent FROM country -------------------------------------------------------------------------------- /examples/ch03/ch03_01_值與運算式.sql: -------------------------------------------------------------------------------- 1 | SELECT Name, Continent, Population 2 | FROM country 3 | WHERE Continent='Europe' AND Population<10000 4 | 5 | 6 | SELECT Population * 10000000000, Population * 100000000000 7 | FROM world.country 8 | WHERE Code='USA' 9 | 10 | 11 | SELECT 0.098765432109876543210987654321 / 2 12 | 13 | 14 | SELECT 0.1 + 0.1 = 0.2, 0.1E0 + 0.1E0 = 0.2E0 15 | 16 | 17 | SELECT 0.1 + 0.2 = 0.3, 0.1E0 + 0.2E0 = 0.3E0 18 | 19 | 20 | SELECT 1+'2', '1'+2, '1E+2'+'2E-2' 21 | 22 | 23 | SELECT 1+'A', 'B'+2 24 | 25 | 26 | SELECT 'Hello!' || 'MySQL!' 27 | 28 | 29 | SET sql_mode = 'PIPES_AS_CONCAT' 30 | 31 | 32 | SELECT 'Hello!' || 'MySQL!' 33 | 34 | 35 | SELECT NULL = NULL, NULL < NULL, NULL != NULL, NULL + 3 36 | 37 | 38 | SELECT NULL IS NULL, NULL IS NOT NULL, NULL <=> NULL 39 | -------------------------------------------------------------------------------- /examples/ch03/ch03_02_函式.sql: -------------------------------------------------------------------------------- 1 | SET sql_mode='IGNORE_SPACE' 2 | 3 | 4 | SELECT ename,hiredate,DATEDIFF('2007-01-01',hiredate) days 5 | FROM emp 6 | 7 | 8 | SELECT LPAD(Name, 50, ' ') 9 | FROM country 10 | WHERE Continent='Antarctica' 11 | 12 | 13 | SELECT LEFT('ABCDE', 2), RIGHT('ABCDE', 2), 14 | SUBSTRING('ABCDE', 2), SUBSTRING('ABCDE', 2, 3) 15 | 16 | 17 | SELECT Name || ', ' || Continent || ', ' || Region 18 | FROM country 19 | 20 | 21 | SELECT CONCAT_WS(', ', Name, Continent, Region) 22 | FROM country 23 | 24 | 25 | SELECT Name, LENGTH(Name) length 26 | FROM country 27 | ORDER BY length DESC 28 | 29 | 30 | SELECT LEFT(Name, LOCATE(' ', Name) - 1) NameOfFirstWord 31 | FROM country 32 | WHERE LOCATE(' ', Name) <> 0 33 | 34 | 35 | SELECT ROUND(3.14159), ROUND(3.14159, 3), 36 | CEIL(3.14159), FLOOR(3.14159) 37 | 38 | 39 | SELECT Name 40 | FROM country 41 | ORDER BY RAND() 42 | LIMIT 3 43 | 44 | 45 | SELECT Name, YEAR(CURDATE()) - IndepYear years 46 | FROM country 47 | ORDER BY years DESC 48 | 49 | 50 | SELECT YEAR(hiredate) hire_year, 51 | MONTH(hiredate) hire_month, 52 | DAY(hiredate) hire_day 53 | FROM cmdev.emp 54 | 55 | 56 | SELECT EXTRACT(YEAR FROM hiredate) hire_year, 57 | EXTRACT(MONTH FROM hiredate) hire_month, 58 | EXTRACT(DAY FROM hiredate) hire_day 59 | FROM cmdev.emp 60 | 61 | 62 | SELECT ename, hiredate, 63 | ADDDATE(hiredate, 30), 64 | ADDDATE(hiredate, INTERVAL 30 DAY) 65 | FROM cmdev.emp e; 66 | 67 | 68 | SELECT ename, hiredate, 69 | IF( YEAR(hiredate) < 1985, 'Senior', 'General') grade 70 | FROM cmdev.emp 71 | ORDER BY hiredate 72 | 73 | 74 | SELECT ename, hiredate, 75 | salary * IF( YEAR(hiredate) < 1985, 2.5, 1.2) bonus 76 | FROM cmdev.emp 77 | ORDER BY hiredate 78 | 79 | 80 | SELECT ename, salary, 81 | CASE 82 | WHEN salary >= 3000 THEN 'A' 83 | WHEN salary >= 1000 AND salary <= 2999 THEN 'B' 84 | WHEN salary < 1000 THEN 'C' 85 | END SalaryGrade 86 | FROM cmdev.emp 87 | ORDER BY salary DESC 88 | 89 | 90 | SELECT ename, salary, 91 | CASE 92 | WHEN salary >= 3000 THEN 'A' 93 | WHEN salary >= 1000 AND salary <= 2999 THEN 'B' 94 | ELSE 'C' 95 | END SalaryGrade 96 | FROM cmdev.emp 97 | ORDER BY salary DESC 98 | 99 | 100 | SELECT ename, salary, salary * 101 | CASE 102 | WHEN salary >= 3000 THEN 2.5 103 | WHEN salary >= 1000 AND salary <= 2999 THEN 1.5 104 | ELSE 1.2 105 | END bonus 106 | FROM cmdev.emp 107 | ORDER BY salary DESC 108 | 109 | 110 | SELECT Name, Continent, 111 | CASE Continent 112 | WHEN 'Asia' THEN 'AS' 113 | WHEN 'Europe' THEN 'EU' 114 | WHEN 'Africa' THEN 'AF' 115 | WHEN 'Oceania' THEN 'OA' 116 | WHEN 'Antarctica' THEN 'AN' 117 | WHEN 'North America' THEN 'NA' 118 | WHEN 'South America' THEN 'SA' 119 | END ContinentCode 120 | FROM country 121 | 122 | 123 | SELECT Name, Continent, 124 | CASE 125 | WHEN Continent='Asia' THEN 'AS' 126 | WHEN Continent='Europe' THEN 'EU' 127 | WHEN Continent='Africa' THEN 'AF' 128 | WHEN Continent='Oceania' THEN 'OA' 129 | WHEN Continent='Antarctica' THEN 'AN' 130 | WHEN Continent='North America' THEN 'NA' 131 | WHEN Continent='South America' THEN 'SA' 132 | END ContinentCode 133 | FROM country 134 | 135 | 136 | SELECT ename, salary, comm, salary + comm FullSalary 137 | FROM cmdev.emp 138 | 139 | 140 | SELECT ename,salary,comm,salary + IFNULL(comm, 0) FullSalary 141 | FROM cmdev.emp 142 | -------------------------------------------------------------------------------- /examples/ch03/ch03_03_群組查詢.sql: -------------------------------------------------------------------------------- 1 | SELECT SUM(Population) PopSum, 2 | AVG(Population) PopAvg, 3 | MAX(Population) PopMax, 4 | Min(Population) PopMin, 5 | COUNT(*) Amount 6 | FROM country 7 | 8 | 9 | SELECT MIN(hiredate) FirstHireDate, MAX(hiredate) LastHireDate 10 | FROM cmdev.emp 11 | 12 | 13 | SELECT COUNT(*), COUNT(Code), COUNT(IndepYear), COUNT(LifeExpectancy) 14 | FROM country 15 | 16 | 17 | SELECT COUNT(*), COUNT(comm), COUNT(deptno) 18 | FROM cmdev.emp 19 | 20 | 21 | SELECT dname 22 | FROM cmdev.dept 23 | 24 | 25 | SELECT GROUP_CONCAT(dname) 26 | FROM cmdev.dept 27 | 28 | 29 | SELECT GROUP_CONCAT(dname ORDER BY dname) 30 | FROM cmdev.dept 31 | 32 | 33 | SELECT GROUP_CONCAT(dname ORDER BY dname SEPARATOR '|') 34 | FROM cmdev.dept 35 | 36 | 37 | SELECT Region 38 | FROM country 39 | WHERE Continent = 'Europe' 40 | 41 | 42 | SELECT DISTINCT Region 43 | FROM country 44 | WHERE Continent = 'Europe' 45 | 46 | 47 | SELECT GROUP_CONCAT(Region) 48 | FROM country 49 | WHERE Continent = 'Europe' 50 | 51 | 52 | SELECT GROUP_CONCAT(DISTINCT Region) 53 | FROM country 54 | WHERE Continent = 'Europe' 55 | 56 | 57 | SELECT Population 58 | FROM country 59 | 60 | 61 | SELECT SUM(Population) PopSum 62 | FROM country 63 | 64 | 65 | SELECT Continent, SUM(Population) PopSum 66 | FROM country 67 | GROUP BY Continent 68 | 69 | 70 | SELECT Continent, SUM(Population) PopSum 71 | FROM country 72 | GROUP BY Continent 73 | 74 | 75 | SELECT Region, SUM(Population) PopSum 76 | FROM country 77 | GROUP BY Region 78 | 79 | 80 | SELECT GovernmentForm, SUM(Population) PopSum 81 | FROM country 82 | GROUP BY GovernmentForm 83 | 84 | 85 | SELECT Continent, COUNT(*) Amount 86 | FROM country 87 | GROUP BY Continent 88 | 89 | 90 | SELECT Region, COUNT(*) Amount 91 | FROM country 92 | GROUP BY Region 93 | 94 | 95 | SELECT GovernmentForm, COUNT(*) Amount 96 | FROM country 97 | GROUP BY GovernmentForm 98 | 99 | 100 | SELECT GovernmentForm, COUNT(*) Amount, SUM(Population) PopSum, 101 | AVG(Population) PopAvg 102 | FROM country 103 | GROUP BY GovernmentForm 104 | 105 | 106 | SELECT Continent, Region, SUM(Population) PopSum 107 | FROM country 108 | GROUP BY Continent, Region 109 | 110 | 111 | SELECT GovernmentForm, COUNT(*) Amount 112 | FROM country 113 | GROUP BY GovernmentForm 114 | 115 | 116 | SELECT GovernmentForm, COUNT(*) Amount 117 | FROM country 118 | GROUP BY GovernmentForm ASC 119 | 120 | 121 | SELECT GovernmentForm, COUNT(*) Amount 122 | FROM country 123 | GROUP BY GovernmentForm DESC 124 | 125 | 126 | SELECT GovernmentForm, COUNT(*) Amount 127 | FROM country 128 | GROUP BY GovernmentForm 129 | 130 | 131 | SELECT Continent, COUNT(*) Amount 132 | FROM country 133 | GROUP BY Continent WITH ROLLUP 134 | 135 | 136 | SELECT Continent, COUNT(*) Amount, SUM(Population) PopSum 137 | FROM country 138 | GROUP BY Continent WITH ROLLUP 139 | 140 | 141 | SELECT Continent, Region, COUNT(*) Amount 142 | FROM country 143 | GROUP BY Continent, Region WITH ROLLUP 144 | 145 | 146 | SELECT Region, SUM(Population) 147 | FROM country 148 | WHERE Continent = 'Asia' 149 | GROUP BY Region 150 | 151 | 152 | SELECT Region, SUM(Population) 153 | FROM country 154 | WHERE SUM(Population) > 100000000 155 | GROUP BY Region 156 | 157 | 158 | SELECT Region, SUM(Population) 159 | FROM country 160 | GROUP BY Region 161 | HAVING SUM(Population) > 100000000 162 | 163 | 164 | SELECT Continent, Region, COUNT(*) Amount 165 | FROM country 166 | GROUP BY Continent 167 | 168 | 169 | SET sql_mode = 'ONLY_FULL_GROUP_BY' 170 | 171 | 172 | SELECT Continent, Region, COUNT(*) Amount 173 | FROM country 174 | GROUP BY Continent 175 | -------------------------------------------------------------------------------- /examples/ch04/ch04_02_Inner Join.sql: -------------------------------------------------------------------------------- 1 | SELECT country.Code, country.Capital, city.Name 2 | FROM country, city 3 | WHERE country.Capital = city.ID 4 | 5 | 6 | SELECT country.Code, country.Capital, city.Name 7 | FROM country, city 8 | WHERE country.Capital = city.ID 9 | 10 | 11 | SELECT Code, Capital, city.Name 12 | FROM country, city 13 | WHERE Capital = ID 14 | 15 | 16 | SELECT Code, Capital, Name 17 | FROM country, city 18 | WHERE Capital = ID 19 | 20 | 21 | SELECT country.name, country.Population coPop, 22 | city.Name, city.Population ciPop, 23 | city.Population / country.Population * 100 Scale 24 | FROM country, city 25 | WHERE Capital = ID 26 | 27 | 28 | SELECT country.name, country.Population coPop, 29 | city.Name, city.Population ciPop, 30 | city.Population / country.Population * 100 31 | FROM country a, city b 32 | WHERE Capital = ID 33 | 34 | 35 | SELECT a.name, a.Population coPop, 36 | b.Name, b.Population ciPop, 37 | b.Population / a.Population * 100 38 | FROM country a, city b 39 | WHERE Capital = ID 40 | 41 | 42 | SELECT Code, Capital, city.Name 43 | FROM country INNER JOIN city ON Capital = ID 44 | 45 | 46 | SELECT a.name, a.Population coPop, 47 | b.Name, b.Population ciPop, 48 | b.Population / a.Population * 100 49 | FROM country a INNER JOIN city b ON Capital = ID 50 | 51 | 52 | SELECT empno, ename, dname 53 | FROM cmdev.emp e, cmdev.dept d 54 | WHERE e.deptno = d.deptno 55 | 56 | 57 | SELECT empno, ename, dname 58 | FROM cmdev.emp e INNER JOIN cmdev.dept d 59 | ON e.deptno = d.deptno 60 | 61 | 62 | SELECT empno, ename, dname 63 | FROM cmdev.emp e INNER JOIN cmdev.dept d 64 | USING (deptno) 65 | -------------------------------------------------------------------------------- /examples/ch04/ch04_03_Outer Join.sql: -------------------------------------------------------------------------------- 1 | SELECT empno, ename, deptno 2 | FROM cmdev.emp 3 | 4 | 5 | SELECT empno, ename, e.deptno, d.dname 6 | FROM cmdev.emp e, cmdev.dept d 7 | WHERE e.deptno = d.deptno 8 | 9 | 10 | SELECT empno, ename, e.deptno, d.dname 11 | FROM cmdev.emp e LEFT OUTER JOIN cmdev.dept d 12 | ON e.deptno = d.deptno 13 | 14 | 15 | SELECT empno, ename, e.deptno, d.dname 16 | FROM cmdev.emp e LEFT OUTER JOIN cmdev.dept d 17 | ON e.deptno = d.deptno 18 | 19 | 20 | SELECT empno, ename, e.deptno, d.dname 21 | FROM cmdev.dept d RIGHT OUTER JOIN cmdev.emp e 22 | ON e.deptno = d.deptno 23 | 24 | 25 | SELECT empno, ename, e.deptno, d.dname 26 | FROM cmdev.emp e LEFT OUTER JOIN cmdev.dept d 27 | ON e.deptno = d.deptno 28 | 29 | 30 | SELECT empno, ename, e.deptno, d.dname 31 | FROM cmdev.emp e RIGHT OUTER JOIN cmdev.dept d 32 | ON e.deptno = d.deptno 33 | -------------------------------------------------------------------------------- /examples/ch04/ch04_04_合併查詢.sql: -------------------------------------------------------------------------------- 1 | SELECT Region, Name, Population 2 | FROM country 3 | WHERE Region = 'Southeast Asia' AND Population < 2000000 4 | 5 | 6 | SELECT Region, Name, Population 7 | FROM country 8 | WHERE Region = 'Eastern Asia' AND Population < 1000000 9 | 10 | 11 | SELECT Region, Name, Population 12 | FROM country 13 | WHERE Region = 'Southeast Asia' AND Population < 2000000 14 | UNION 15 | SELECT Region, Name, Population 16 | FROM country 17 | WHERE Region = 'Eastern Asia' AND Population < 1000000 18 | 19 | 20 | SELECT Region, Name, Population 21 | FROM country 22 | WHERE Region = 'Southeast Asia' AND Population < 2000000 23 | UNION 24 | SELECT Region, Name, Population 25 | FROM country 26 | WHERE Region = 'Eastern Asia' AND Population < 1000000 27 | UNION 28 | SELECT ename, job, salary 29 | FROM cmdev.emp 30 | WHERE salary < 1000 31 | 32 | 33 | SELECT Region, Name, Population 34 | FROM country 35 | WHERE Region = 'Southeast Asia' AND Population < 2000000 36 | UNION 37 | SELECT Region, Name, Population 38 | FROM country 39 | WHERE Region = 'Eastern Asia' AND Population < 1000000 40 | UNION 41 | SELECT ename, job, salary, comm 42 | FROM cmdev.emp 43 | WHERE salary < 1000 44 | 45 | 46 | SELECT Region, Name, Population 47 | FROM country 48 | WHERE (Region = 'Southeast Asia' AND Population < 2000000) OR 49 | (Region = 'Eastern Asia' AND Population < 1000000) 50 | 51 | 52 | SELECT Region, Name, Population 53 | FROM country 54 | WHERE Region = 'Southeast Asia' AND Population < 2000000 55 | UNION 56 | SELECT Region, Name, Population 57 | FROM country 58 | WHERE Region = 'Eastern Asia' AND Population < 1000000 59 | -------------------------------------------------------------------------------- /examples/ch05/ch05_01_取得表格資訊.sql: -------------------------------------------------------------------------------- 1 | DESC cmdev.dept 2 | 3 | DESC cmdev.emp 4 | -------------------------------------------------------------------------------- /examples/ch05/ch05_02_新增.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO cmdev.dept VALUES (60, 'EDU', 'NEW YORK') 2 | 3 | 4 | INSERT INTO cmdev.dept 5 | VALUES (70, 'MARKETING', DEFAULT) 6 | 7 | 8 | INSERT INTO cmdev.dept 9 | VALUES (80, 'PURCHASING') 10 | 11 | 12 | INSERT INTO cmdev.dept 13 | VALUES ('PURCHASING', 80, 'NEW YORK') 14 | 15 | 16 | INSERT INTO cmdev.dept (dname, deptno, location) 17 | VALUES ('PURCHASING', 80, 'NEW YORK') 18 | 19 | 20 | INSERT INTO cmdev.dept (deptno, dname, location) 21 | VALUES (90, 'SHIPPING') 22 | 23 | 24 | INSERT INTO cmdev.dept 25 | VALUES (90, 'SHIPPING', DEFAULT) 26 | 27 | 28 | INSERT INTO cmdev.dept (deptno, dname) 29 | VALUES (90, 'SHIPPING') 30 | 31 | 32 | INSERT INTO cmdev.dept (deptno, location) 33 | VALUES (80, 'NEW YORK') 34 | 35 | 36 | INSERT INTO cmdev.dept () VALUES () 37 | 38 | 39 | INSERT INTO cmdev.dept (deptno, dname) 40 | VALUES (90, 'SHIPPING') 41 | 42 | 43 | INSERT INTO cmdev.dept 44 | SET deptno = 90, dname = 'SHIPPING' 45 | 46 | 47 | INSERT INTO cmdev.emp VALUES 48 | (8001, 'SIMON', 'MANAGER', 7369, '2001-02-03', 3300, NULL, 50), 49 | (8002, 'JOHN', 'PROGRAMMER', 8001, '2002-01-01', 2300, NULL, 50), 50 | (8003, 'GREEN', 'ENGINEER', 8001, '2003-05-01', 2000, NULL, 50) 51 | 52 | 53 | INSERT INTO cmdev.dept 54 | VALUES (50, 'MIS', DEFAULT); 55 | 56 | 57 | INSERT IGNORE INTO cmdev.dept 58 | VALUES (50, 'MIS', DEFAULT); 59 | 60 | 61 | INSERT IGNORE INTO cmdev.dept 62 | VALUES (500, 'MIS', DEFAULT); 63 | 64 | 65 | SELECT * 66 | FROM cmdev.travel 67 | WHERE empno = 7900 AND 68 | location = 'BOSTON' 69 | 70 | 71 | INSERT INTO cmdev.travel 72 | VALUES (7900, 'BOSTON', 1); 73 | 74 | 75 | UPDATE cmdev.travel 76 | SET counter = counter + 1 77 | WHERE empno = 7900 AND 78 | location = 'BOSTON' 79 | 80 | 81 | INSERT INTO cmdev.travel 82 | VALUES (7900, 'BOSTON', 1) 83 | ON DUPLICATE KEY UPDATE counter = counter + 1 84 | 85 | 86 | INSERT INTO cmdev.dept 87 | VALUES (50, 'MIS', DEFAULT) 88 | 89 | 90 | INSERT IGNORE INTO cmdev.dept 91 | VALUES (50, 'MIS', DEFAULT) 92 | 93 | 94 | REPLACE INTO cmdev.dept 95 | VALUES (50, 'MIS', DEFAULT) 96 | -------------------------------------------------------------------------------- /examples/ch05/ch05_03_修改.sql: -------------------------------------------------------------------------------- 1 | UPDATE cmdev.emp 2 | SET salary = salary + 100 3 | 4 | 5 | UPDATE cmdev.emp 6 | SET salary = salary + 100 7 | WHERE salary < 1500 8 | 9 | 10 | UPDATE cmdev.dept 11 | SET deptno = 50 12 | WHERE deptno = 30 13 | 14 | 15 | UPDATE IGNORE cmdev.dept 16 | SET deptno = 50 17 | WHERE deptno = 30 18 | 19 | 20 | UPDATE cmdev.emp 21 | SET salary = 'HELLO', comm = 1000 22 | WHERE empno = 7369 23 | 24 | 25 | UPDATE IGNORE cmdev.emp 26 | SET salary = 'HELLO', comm = 1000 27 | WHERE empno = 7369 28 | 29 | 30 | UPDATE cmdev.emp 31 | SET salary = salary + 100 32 | ORDER BY salary 33 | 34 | 35 | UPDATE cmdev.emp 36 | SET salary = salary + 100 37 | LIMIT 3 38 | 39 | 40 | UPDATE cmdev.emp 41 | SET salary = salary + 100 42 | ORDER BY salary 43 | LIMIT 3 44 | 45 | 46 | UPDATE cmdev.emp 47 | SET salary = salary + 100 48 | ORDER BY salary DESC 49 | LIMIT 3 50 | -------------------------------------------------------------------------------- /examples/ch05/ch05_04_刪除.sql: -------------------------------------------------------------------------------- 1 | DELETE FROM cmdev.emp 2 | 3 | 4 | DELETE FROM cmdev.emp 5 | WHERE salary < 1500 6 | 7 | 8 | DELETE FROM cmdev.emp 9 | ORDER BY salary 10 | 11 | 12 | DELETE FROM cmdev.emp 13 | LIMIT 3 14 | 15 | 16 | DELETE FROM cmdev.emp 17 | ORDER BY salary 18 | LIMIT 3 19 | 20 | 21 | DELETE FROM cmdev.emp 22 | ORDER BY salary DESC 23 | LIMIT 3 24 | 25 | 26 | DELETE FROM cmdev.emp 27 | 28 | 29 | TRUNCATE TABLE cmdev.emp 30 | -------------------------------------------------------------------------------- /examples/ch06/ch06_01_Character Set與Collation.sql: -------------------------------------------------------------------------------- 1 | SHOW CHARACTER SET 2 | 3 | 4 | SHOW COLLATION 5 | 6 | 7 | SHOW COLLATION LIKE 'latin1%' 8 | -------------------------------------------------------------------------------- /examples/ch06/ch06_02_資料庫.sql: -------------------------------------------------------------------------------- 1 | SHOW VARIABLES LIKE 'datadir' 2 | 3 | 4 | CREATE DATABASE mydb 5 | 6 | 7 | CREATE DATABASE IF NOT EXISTS mydb 8 | 9 | 10 | CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_unicode_ci 11 | 12 | 13 | CREATE DATABASE mydb CHARACTER SET utf8 14 | 15 | 16 | CREATE DATABASE mydb COLLATE utf8_unicode_ci 17 | 18 | 19 | ALTER DATABASE mydb CHARACTER SET utf8 COLLATE utf8_unicode_ci 20 | 21 | 22 | ALTER DATABASE mydb CHARACTER SET utf8 23 | 24 | 25 | ALTER DATABASE mydb COLLATE utf8_unicode_ci 26 | 27 | 28 | DROP DATABASE something 29 | 30 | 31 | DROP DATABASE IF EXISTS something 32 | 33 | 34 | SHOW DATABASES 35 | 36 | 37 | 38 | SHOW SCHEMAS 39 | 40 | 41 | SHOW CREATE DATABASE mydb 42 | 43 | 44 | SELECT * FROM information_schema.SCHEMATA 45 | -------------------------------------------------------------------------------- /examples/ch07/ch07_02_欄位資料型態.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO integertable VALUES (1, 2, 3, 4, 5) 2 | 3 | 4 | INSERT INTO integertable VALUES (1, 65536, 3, 4, 5) 5 | 6 | 7 | INSERT INTO integertable VALUES (1.2, 2.3, 3.4, 4.5, 5.6) 8 | 9 | 10 | INSERT INTO numerictable (i4, f2) VALUES (1, 1),(-1, -1) 11 | 12 | 13 | INSERT INTO numerictable (i, f) VALUES (-1, -1) 14 | 15 | 16 | INSERT INTO numerictable (i, i2, i3, i4, i5) 17 | VALUES (1, 1, 1, 1, 1), 18 | (123, 123, 123, 123, 123), 19 | (123, 12345, 1234567, 1234567890, 1234567890123456789) 20 | 21 | 22 | INSERT INTO numerictable (f, f2, f3) 23 | VALUES (123.12, 123.12, 123.12), 24 | (123.123, 123.123, 123.123) 25 | 26 | 27 | INSERT INTO numerictable (f, f2, f3) VALUES (0.1, 12345.12, 0.1) 28 | 29 | 30 | INSERT INTO numerictable3 VALUES (1, 1, 1, 1, 1, 1.1, 1.1, 1.1) 31 | 32 | 33 | INSERT INTO numerictable3 (i4) VALUES (123), (1234567) 34 | 35 | 36 | INSERT INTO bittable 37 | VALUES (1, 255, 65536), 38 | (b'1', b'11111111', b'1111111111111111') 39 | 40 | 41 | INSERT INTO nonbinarytable 42 | VALUES ('', ''),('123', '123'),('1234567890', '1234567890') 43 | 44 | 45 | SELECT s, LENGTH(s), s2, LENGTH(s2), s3, LENGTH(s3) 46 | FROM nonbinarytable2 47 | 48 | 49 | SELECT s,CHAR_LENGTH(s),s2,CHAR_LENGTH(s2),s3,CHAR_LENGTH(s3) 50 | FROM nonbinarytable2 51 | 52 | 53 | SELECT * FROM nonbinarytable3 54 | 55 | 56 | SELECT * 57 | FROM nonbinarytable3 58 | ORDER BY s 59 | 60 | 61 | SELECT * 62 | FROM nonbinarytable3 63 | ORDER BY s2 64 | 65 | 66 | SELECT * 67 | FROM nonbinarytable3 68 | WHERE s = 'aaa' 69 | 70 | 71 | SELECT * 72 | FROM nonbinarytable3 73 | WHERE s2 = 'aaa' 74 | 75 | 76 | SELECT b, LENGTH(b), b2, LENGTH(b2) 77 | FROM binarytable 78 | 79 | 80 | INSERT INTO enumtable 81 | VALUES ('XS', 'XS'),('S', 'S'),('M', 'M'), 82 | ('L', 'L'),('XL', 'XL'); 83 | 84 | 85 | INSERT INTO enumtable (stringsize) VALUES ('QQ'); 86 | 87 | 88 | INSERT INTO enumtable (enumsize) VALUES ('QQ') 89 | 90 | 91 | INSERT INTO enumtable (enumsize) 92 | VALUES ('XS'),('S'),('M'),('L'),('XL') 93 | 94 | 95 | INSERT INTO enumtable (enumsize) 96 | VALUES (1),(2),(3),(4),(5) 97 | 98 | 99 | SELECT enumsize 100 | FROM enumtable 101 | ORDER BY enumsize 102 | 103 | 104 | SELECT stringsize 105 | FROM enumtable 106 | ORDER BY stringsize 107 | 108 | 109 | SELECT * FROM enumtable where enumsize = 'M' 110 | 111 | 112 | SELECT * FROM enumtable where enumsize = 3 113 | 114 | 115 | INSERT INTO settable 116 | VALUES ('MON,WED,FRI'), 117 | ('TUE,THU'), 118 | ('SAT,SUN'), 119 | ('MON,TUE,WED,THU,FRI,SAT,SUN') 120 | 121 | 122 | INSERT INTO settable VALUES ('MON,HELLO,FRI') 123 | 124 | 125 | INSERT INTO settable VALUES (0),(1),(4),(16) 126 | 127 | 128 | INSERT INTO settable VALUES (''),('MON'),('WED'),('FRI') 129 | 130 | 131 | INSERT INTO settable VALUES ('MON,WED,FRI') 132 | 133 | 134 | INSERT INTO settable VALUES (21) 135 | 136 | 137 | INSERT INTO estable 138 | VALUES (1, 1, 21, 21), 139 | ('M','M','MON','MON'), 140 | ('m','M','mon','MON') 141 | 142 | 143 | INSERT INTO estable (enumsize2, workingday2) 144 | VALUES ('m','mon') 145 | 146 | 147 | INSERT INTO dttable (d) VALUES ('9000-1-1') 148 | 149 | 150 | INSERT INTO dttable (d) VALUES ('900-1-1') 151 | 152 | 153 | INSERT INTO dttable (d) VALUES ('90-1-1') 154 | 155 | 156 | INSERT INTO dttable (d) VALUES ('9-1-1') 157 | 158 | 159 | INSERT INTO dttable (d) VALUES ('2000-1-1') 160 | 161 | 162 | INSERT INTO dttable (d) VALUES ('200-1-1') 163 | 164 | 165 | INSERT INTO dttable (d) VALUES ('20-1-1') 166 | 167 | 168 | INSERT INTO dttable (d) VALUES ('2-1-1') 169 | 170 | 171 | INSERT INTO dttable (t) VALUES ('200:30:00') 172 | 173 | 174 | INSERT INTO dttable (t) VALUES ('-1:20:30') 175 | 176 | 177 | INSERT INTO dttable (t) VALUES ('200:30:30') 178 | 179 | 180 | INSERT INTO dttable (t) VALUES ('200:30') 181 | 182 | 183 | INSERT INTO dttable (t) VALUES ('200') 184 | 185 | 186 | INSERT INTO dttable (dt) 187 | VALUES ('2000-01-01 10:10:10') 188 | 189 | 190 | INSERT INTO dttable (dt) 191 | VALUES ('2000-01-01 10:10:10') 192 | 193 | 194 | INSERT INTO dttable (dt) 195 | VALUES ('2000-01-01') 196 | 197 | 198 | INSERT INTO dttable (dt) 199 | VALUES ('2000-01-01 200:00:00') 200 | 201 | 202 | INSERT INTO dttable (y4) VALUES ('2000'),(2000) 203 | 204 | 205 | INSERT INTO dttable (y4) VALUES ('200'),(200) 206 | 207 | 208 | INSERT INTO dttable (y4) VALUES ('20'),(20) 209 | 210 | 211 | INSERT INTO dttable (y4) VALUES ('2'),(2) 212 | 213 | 214 | INSERT INTO dttable (y4) VALUES ('0000'), (0) 215 | 216 | 217 | INSERT INTO dttable (y4) VALUES ('000') 218 | 219 | 220 | INSERT INTO dttable (y4) VALUES ('00') 221 | 222 | 223 | INSERT INTO dttable (y4) VALUES ('0') 224 | 225 | 226 | INSERT INTO dttable (ts) VALUES ('1970-1-01 8:0:1') 227 | 228 | 229 | INSERT INTO dttable (ts) VALUES ('1970-1-01 0:0:1') 230 | 231 | 232 | SELECT @@GLOBAL.TIME_ZONE, @@SESSION.TIME_ZONE 233 | 234 | 235 | SET SESSION TIME_ZONE = '+00:00' 236 | 237 | 238 | SET GLOBAL TIME_ZONE = '+00:00' 239 | 240 | 241 | SELECT @@GLOBAL.TIME_ZONE, @@SESSION.TIME_ZONE 242 | 243 | 244 | INSERT INTO dttable (dt, ts) 245 | VALUES ('2000-01-01 00:00:00', '2000-01-01 00:00:00') 246 | 247 | 248 | SELECT dt,ts FROM dttable 249 | 250 | 251 | SET GLOBAL TIME_ZONE = '+08:00' 252 | 253 | 254 | SELECT dt,ts FROM dttable 255 | -------------------------------------------------------------------------------- /examples/ch08/ch08_01_建立表格.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE city ( 2 | ID int(11) NOT NULL auto_increment, 3 | Name char(35) NOT NULL default '', 4 | CountryCode char(3) NOT NULL default '', 5 | District char(20) NOT NULL default '', 6 | Population int(11) NOT NULL default '0', 7 | PRIMARY KEY (ID) 8 | ) AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1 9 | 10 | 11 | CREATE TABLE addressbook ( 12 | name VARCHAR(20), 13 | tel VARCHAR(20), 14 | address VARCHAR(80), 15 | birthdate DATE 16 | ) 17 | 18 | 19 | CREATE TABLE addressbook ( 20 | name VARCHAR(20), 21 | tel VARCHAR(20), 22 | address VARCHAR(80), 23 | birthdate DATE 24 | ) ENGINE = InnoDB 25 | CHARACTER SET = utf8 26 | COLLATE = utf8_unicode_ci 27 | 28 | 29 | SHOW ENGINES 30 | 31 | 32 | CREATE TABLE addressbook ( 33 | name VARCHAR(20) CHARACTER SET big5, 34 | tel VARCHAR(20), 35 | address VARCHAR(80), 36 | birthdate DATE 37 | ) ENGINE = InnoDB 38 | CHARACTER SET = utf8 39 | COLLATE = utf8_unicode_ci 40 | 41 | 42 | CREATE TABLE addressbook ( 43 | name VARCHAR(20) NOT NULL, 44 | tel VARCHAR(20) NULL, 45 | address VARCHAR(80), 46 | birthdate DATE 47 | ) 48 | 49 | 50 | INSERT INTO addressbook (name) VALUES ('Simon Johnson') 51 | 52 | 53 | INSERT INTO addressbook (address) VALUES ('Taipei') 54 | 55 | 56 | CREATE TABLE addressbook ( 57 | name VARCHAR(20) NOT NULL, 58 | tel VARCHAR(20) NULL, 59 | address VARCHAR(80), 60 | birthdate DATE 61 | ) 62 | 63 | 64 | CREATE TABLE addressbook ( 65 | name VARCHAR(20) NOT NULL, 66 | tel VARCHAR(20) DEFAULT NULL, 67 | address VARCHAR(80) DEFAULT NULL, 68 | birthdate DATE DEFAULT NULL 69 | ) 70 | 71 | 72 | CREATE TABLE addressbook ( 73 | name VARCHAR(20) NOT NULL, 74 | tel VARCHAR(20), 75 | address VARCHAR(80) DEFAULT 'Taipei', 76 | birthdate DATE 77 | ) 78 | 79 | 80 | INSERT INTO addressbook (name) VALUES ('Simon Johnson') 81 | 82 | 83 | UPDATE addressbook SET address = DEFAULT 84 | 85 | 86 | CREATE TABLE tstable ( 87 | ts TIMESTAMP, 88 | ts2 TIMESTAMP, 89 | area VARCHAR(20) NOT NULL, 90 | temp INT NOT NULL 91 | ) 92 | 93 | 94 | CREATE TABLE tstable ( 95 | ts timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 96 | ts2 timestamp NOT NULL default '0000-00-00 00:00:00', 97 | area varchar(20) NOT NULL, 98 | temp int(11) NOT NULL 99 | ) 100 | 101 | 102 | INSERT INTO tstable (area, temp) VALUES ('NORTH', 25) 103 | 104 | 105 | INSERT INTO tstable (area, temp) VALUES ('CENTRAL', 28) 106 | 107 | 108 | INSERT INTO tstable (area, temp) VALUES ('SOUTH', 30) 109 | 110 | 111 | UPDATE tstable SET temp = 32 WHERE area = 'South' 112 | 113 | 114 | CREATE TABLE tstable2 ( 115 | created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 116 | updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 117 | area VARCHAR(20) NOT NULL, 118 | temp INT NOT NULL 119 | ) 120 | 121 | 122 | CREATE TABLE tstable2 ( 123 | created TIMESTAMP DEFAULT 0, 124 | updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 125 | area VARCHAR(20) NOT NULL, 126 | temp INT NOT NULL 127 | ) 128 | 129 | 130 | INSERT INTO tstable2 (created, area, temp) VALUES (NULL, 'NORTH', 25) 131 | 132 | 133 | INSERT INTO tstable2 (created, area, temp) VALUES (NULL, 'CENTRAL', 28) 134 | 135 | 136 | INSERT INTO tstable2 (created, area, temp) VALUES (NULL, 'SOUTH', 30) 137 | 138 | 139 | UPDATE tstable2 SET temp = 32 WHERE area = 'South' 140 | 141 | 142 | SELECT Name, Population 143 | FROM world.city 144 | WHERE CountryCode='TWN' 145 | 146 | 147 | CREATE TABLE cityoftaiwan 148 | SELECT Name, Population 149 | FROM world.city 150 | WHERE CountryCode='TWN' 151 | 152 | 153 | CREATE TABLE cityoftaiwan2 ( 154 | Name VARCHAR(30), 155 | Population INT UNSIGNED) 156 | SELECT Name, Population 157 | FROM world.city 158 | WHERE CountryCode='TWN' 159 | 160 | 161 | CREATE TABLE cityoftaiwan3 ( 162 | Name VARCHAR(30), 163 | Population INT UNSIGNED, 164 | Description VARCHAR(50)) 165 | SELECT Name, Population 166 | FROM world.city 167 | WHERE CountryCode='TWN' 168 | -------------------------------------------------------------------------------- /examples/ch08/ch08_02_修改表格.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE mytable ADD newcolumn int 2 | 3 | 4 | ALTER TABLE mytable ADD newcolumn int FIRST 5 | 6 | 7 | ALTER TABLE mytable ADD newcolumn int AFTER two 8 | 9 | 10 | ALTER TABLE mytable 11 | ADD (newcolumn int, newcolumn2 int) 12 | 13 | 14 | ALTER TABLE mytable 15 | CHANGE one changecolumn BIGINT AFTER two 16 | 17 | 18 | ALTER TABLE mytable 19 | MODIFY one BIGINT AFTER three 20 | 21 | 22 | ALTER TABLE mytable DROP two 23 | 24 | 25 | ALTER TABLE mytable RENAME mynewtable 26 | 27 | 28 | RENAME TABLE mytable TO mynewtable 29 | -------------------------------------------------------------------------------- /examples/ch08/ch08_03_刪除表格.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE mytable ADD newcolumn int 2 | 3 | 4 | ALTER TABLE mytable ADD newcolumn int FIRST 5 | 6 | 7 | ALTER TABLE mytable ADD newcolumn int AFTER two 8 | 9 | 10 | ALTER TABLE mytable 11 | ADD (newcolumn int, newcolumn2 int) 12 | 13 | 14 | ALTER TABLE mytable 15 | CHANGE one changecolumn BIGINT AFTER two 16 | 17 | 18 | ALTER TABLE mytable 19 | MODIFY one BIGINT AFTER three 20 | 21 | 22 | ALTER TABLE mytable DROP two 23 | 24 | 25 | ALTER TABLE mytable RENAME mynewtable 26 | 27 | 28 | RENAME TABLE mytable TO mynewtable 29 | -------------------------------------------------------------------------------- /examples/ch08/ch08_04_索引介紹.sql: -------------------------------------------------------------------------------- 1 | SELECT * FROM world.city WHERE Name='Taipei' 2 | -------------------------------------------------------------------------------- /examples/ch08/ch08_05_建立索引.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE addressbook ( 2 | id INT UNSIGNED PRIMARY KEY, 3 | name VARCHAR(20), 4 | tel VARCHAR(20), 5 | address VARCHAR(80), 6 | birthdate DATE, 7 | email VARCHAR(36) UNIQUE KEY 8 | ) 9 | 10 | 11 | CREATE TABLE addressbook ( 12 | id INT UNSIGNED, 13 | name VARCHAR(20), 14 | tel VARCHAR(20), 15 | address VARCHAR(80), 16 | birthdate DATE, 17 | email VARCHAR(36), 18 | PRIMARY KEY (id), 19 | UNIQUE KEY (email) 20 | ) 21 | 22 | 23 | CREATE TABLE addressbook ( 24 | id INT UNSIGNED, 25 | name VARCHAR(20), 26 | tel VARCHAR(20), 27 | address VARCHAR(80), 28 | birthdate DATE, 29 | email VARCHAR(36), 30 | PRIMARY KEY (id), 31 | UNIQUE KEY (email), 32 | INDEX (name, tel) 33 | ) 34 | 35 | 36 | CREATE TABLE addressbook ( 37 | id INT UNSIGNED, 38 | name VARCHAR(20), 39 | tel VARCHAR(20), 40 | address VARCHAR(80), 41 | birthdate DATE, 42 | email VARCHAR(36), 43 | INDEX (address (5) DESC) 44 | ) 45 | 46 | 47 | CREATE TABLE addressbook ( 48 | id INT UNSIGNED, 49 | name VARCHAR(20), 50 | tel VARCHAR(20), 51 | address VARCHAR(80), 52 | birthdate DATE, 53 | email VARCHAR(36) 54 | ) 55 | 56 | 57 | ALTER TABLE addressbook 58 | ADD PRIMARY KEY (id) 59 | 60 | 61 | ALTER TABLE addressbook 62 | ADD UNIQUE KEY (email) 63 | 64 | 65 | ALTER TABLE addressbook 66 | ADD INDEX (name, tel) 67 | 68 | 69 | ALTER TABLE addressbook 70 | ADD INDEX (address (5) DESC) 71 | 72 | 73 | CREATE TABLE addressbook ( 74 | id INT UNSIGNED, 75 | name VARCHAR(20), 76 | tel VARCHAR(20), 77 | address VARCHAR(80), 78 | birthdate DATE, 79 | email VARCHAR(36) 80 | ) 81 | 82 | 83 | ALTER TABLE addressbook 84 | ADD PRIMARY KEY (id) 85 | 86 | 87 | CREATE UNIQUE INDEX email_index 88 | ON addressbook (email) 89 | 90 | 91 | CREATE INDEX name_tel_index 92 | ON addressbook (name, tel) 93 | 94 | 95 | CREATE INDEX address_index 96 | ON addressbook (address (5) DESC) 97 | 98 | 99 | ALTER TABLE addressbook ADD PRIMARY KEY (id) 100 | 101 | 102 | CREATE UNIQUE INDEX email_index ON addressbook (email) 103 | -------------------------------------------------------------------------------- /examples/ch08/ch08_06_索引的名稱.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macdidi5/MySQLTutorial/f44207d5f441171a1c600753f694974c537210da/examples/ch08/ch08_06_索引的名稱.sql -------------------------------------------------------------------------------- /examples/ch08/ch08_07_刪除索引.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE addressbook 2 | DROP PRIMARY KEY, 3 | DROP INDEX email, 4 | DROP INDEX name, 5 | DROP INDEX address 6 | 7 | 8 | DROP INDEX 'PRIMARY' ON addressbook 9 | 10 | 11 | DROP INDEX email ON addressbook 12 | 13 | 14 | DROP INDEX name ON addressbook 15 | 16 | 17 | DROP INDEX address ON addressbook 18 | -------------------------------------------------------------------------------- /examples/ch08/ch08_08_數值欄位型態與AUTO_INCREMENT.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE meeting ( 2 | id INT UNSIGNED NOT NULL AUTO_INCREMENT, 3 | title VARCHAR(36), 4 | PRIMARY KEY (id) 5 | ) 6 | 7 | 8 | CREATE TABLE participate ( 9 | id INT UNSIGNED NOT NULL, 10 | empno INT(11), 11 | INDEX (id) 12 | ) 13 | 14 | 15 | INSERT INTO meeting (title) VALUES ('Sales meeting') 16 | 17 | 18 | INSERT INTO participate (id, empno) 19 | VALUES (LAST_INSERT_ID(), 7499), 20 | (LAST_INSERT_ID(), 7521), 21 | (LAST_INSERT_ID(), 7654), 22 | (LAST_INSERT_ID(), 7844) 23 | 24 | 25 | SELECT m.id, m.title, p.empno, e.ename 26 | FROM meeting m, participate p, emp e 27 | WHERE m.id = p.id AND p.empno = e.empno 28 | 29 | 30 | INSERT INTO meeting (title) 31 | VALUES ('Analyst meeting') 32 | 33 | 34 | INSERT INTO meeting (id, title) 35 | VALUES (0, 'Manager meeting') 36 | 37 | 38 | INSERT INTO meeting (id, title) 39 | VALUES (NULL, 'Clerk meeting') 40 | 41 | 42 | SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO' 43 | 44 | 45 | CREATE TABLE travelautoincr ( 46 | empno INT(11) NOT NULL, 47 | location VARCHAR(16) NOT NULL, 48 | counter SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 49 | PRIMARY KEY (empno, location, counter) 50 | ) ENGINE=MyISAM 51 | 52 | 53 | INSERT INTO travelautoincr (empno, location) 54 | VALUES (7369, 'CHICAGO'), (7369, 'CHICAGO'), 55 | (7499, 'DALLAS'), (7499, 'DALLAS'), (7499, 'DALLAS'), 56 | (7566, 'BOSTON'), (7566, 'BOSTON') 57 | 58 | 59 | -------------------------------------------------------------------------------- /examples/ch08/ch08_09_查詢表格與索引資訊.sql: -------------------------------------------------------------------------------- 1 | SHOW TABLES FROM world 2 | 3 | 4 | SHOW TABLES FROM world LIKE '%y' 5 | 6 | 7 | SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, TABLE_ROWS, 8 | AUTO_INCREMENT,TABLE_COLLATION 9 | FROM information_schema.TABLES 10 | WHERE TABLE_SCHEMA = 'world' 11 | 12 | 13 | DESCRIBE world.country 14 | 15 | 16 | DESC world.country 17 | 18 | 19 | SHOW COLUMNS FROM world.country 20 | 21 | 22 | SHOW FIELDS FROM world.country 23 | 24 | 25 | SHOW CREATE TABLE world.country 26 | 27 | 28 | SHOW INDEX FROM addressbook 29 | -------------------------------------------------------------------------------- /examples/ch09/ch09_01_一個敘述中的查詢敘述.sql: -------------------------------------------------------------------------------- 1 | SELECT Population 2 | FROM country 3 | WHERE Code = 'USA' 4 | 5 | 6 | SELECT Code, Population 7 | FROM country 8 | WHERE Population > 278357000 9 | 10 | 11 | SELECT Code, Population 12 | FROM country 13 | WHERE Population > ( SELECT Population 14 | FROM country 15 | WHERE Code = 'USA' ) 16 | -------------------------------------------------------------------------------- /examples/ch09/ch09_02_WHERE_HAVING子句與子查詢.sql: -------------------------------------------------------------------------------- 1 | SELECT Name, GNP 2 | FROM country 3 | WHERE GNP = ( SELECT MAX(GNP) 4 | FROM country ) 5 | 6 | 7 | SELECT Name, GNP 8 | FROM country 9 | WHERE GNP = ( SELECT Code, MAX(GNP) 10 | FROM country ) 11 | 12 | 13 | SELECT Name, GNP 14 | FROM country 15 | WHERE GNP = ( SELECT MAX(GNP) 16 | FROM country 17 | GROUP BY Continent ) 18 | 19 | 20 | SELECT CountryCode 21 | FROM city 22 | WHERE Population > 9000000 23 | 24 | 25 | SELECT Name 26 | FROM country 27 | WHERE Code IN ('BRA','IDN','IND', 28 | 'CHN','KOR','PAK') 29 | 30 | 31 | SELECT Name 32 | FROM country 33 | WHERE Code IN ( SELECT CountryCode 34 | FROM city 35 | WHERE Population > 9000000 ) 36 | 37 | 38 | SELECT Name 39 | FROM country 40 | WHERE Code = ( SELECT CountryCode 41 | FROM city 42 | WHERE Population > 9000000 ) 43 | 44 | 45 | SELECT Name 46 | FROM country 47 | WHERE Code NOT IN ( SELECT CountryCode 48 | FROM city 49 | WHERE Population > 9000000 ) 50 | 51 | 52 | SELECT * FROM outertable 53 | 54 | 55 | SELECT * FROM innertable 56 | 57 | 58 | SELECT * 59 | FROM outertable 60 | WHERE n > ALL ( SELECT n 61 | FROM innertable ) 62 | 63 | SELECT * 64 | FROM outertable 65 | WHERE n <> ALL ( SELECT n 66 | FROM innertable ) 67 | 68 | SELECT * 69 | FROM outertable 70 | WHERE n NOT IN ( SELECT n 71 | FROM innertable ) 72 | 73 | 74 | SELECT * 75 | FROM outertable 76 | WHERE n = ANY ( SELECT n 77 | FROM innertable ) 78 | 79 | 80 | SELECT * 81 | FROM outertable 82 | WHERE n IN ( SELECT n 83 | FROM innertable ) 84 | 85 | 86 | SELECT Name, GNP 87 | FROM country 88 | WHERE Continent = 'Asia' AND GovernmentForm = 'Republic' 89 | 90 | 91 | SELECT Name, GNP 92 | FROM country 93 | WHERE ( Continent, GovernmentForm ) = ( 'Asia', 'Republic' ) 94 | 95 | 96 | SELECT Name 97 | FROM country 98 | WHERE Region = ( SELECT Region 99 | FROM country 100 | WHERE Name = 'Iraq' ) 101 | AND 102 | GovernmentForm = ( SELECT GovernmentForm 103 | FROM country 104 | WHERE Name = 'Iraq' ) 105 | 106 | 107 | SELECT Name 108 | FROM country 109 | WHERE (Region, GovernmentForm) = ( SELECT Region, GovernmentForm 110 | FROM country 111 | WHERE Name = 'Iraq' ) 112 | 113 | 114 | SELECT Continent, MAX(GNP) 115 | FROM country 116 | GROUP BY Continent 117 | 118 | 119 | SELECT Continent, Name, GNP 120 | FROM country 121 | WHERE (Continent, GNP) IN ( SELECT Continent, MAX(GNP) 122 | FROM country 123 | GROUP BY Continent ) 124 | -------------------------------------------------------------------------------- /examples/ch09/ch09_03_SELECT子句與子查詢.sql: -------------------------------------------------------------------------------- 1 | SELECT CONCAT('The GNP of Japan is ', GNP) 2 | FROM country 3 | WHERE Name = 'Japan' 4 | 5 | 6 | SELECT CONCAT('The GNP of Japan is ', 7 | ( SELECT GNP FROM country WHERE Name = 'Japan' ) ) 8 | 9 | 10 | SELECT ( SELECT Population FROM country WHERE Name = 'India' ) / 11 | ( SELECT SUM(Population) FROM country ) 12 | -------------------------------------------------------------------------------- /examples/ch09/ch09_04_FROM子句與子查詢.sql: -------------------------------------------------------------------------------- 1 | SELECT Name, GNP 2 | FROM ( SELECT * 3 | FROM country 4 | WHERE Continent = 'Asia' ) asiacountry 5 | ORDER BY GNP DESC 6 | LIMIT 10 7 | 8 | 9 | SELECT Name, Language, Population * Percentage 10 | FROM country, ( SELECT CountryCode, Language, Percentage 11 | FROM countrylanguage 12 | WHERE IsOfficial = 'T' ) officiallanguage 13 | WHERE Code = CountryCode 14 | -------------------------------------------------------------------------------- /examples/ch09/ch09_05_資料維護與子查詢.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE mycountry ( 2 | Code char(3) NOT NULL DEFAULT '', 3 | Name char(52) NOT NULL DEFAULT '', 4 | Continent enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia', 5 | Region char(26) NOT NULL DEFAULT '', 6 | Population int(11) NOT NULL DEFAULT '0', 7 | GNP float(10,2) DEFAULT NULL, 8 | PRIMARY KEY (Code) 9 | ) 10 | 11 | 12 | INSERT INTO mycountry 13 | ( SELECT Code, Name, Continent, Region, Population, GNP 14 | FROM country 15 | WHERE Continent = 'Asia' ) 16 | 17 | 18 | INSERT INTO mycountry 19 | ( SELECT * 20 | FROM country 21 | WHERE Continent = 'Africa' ) 22 | 23 | 24 | UPDATE cmdev.emp 25 | SET salary = salary * 1.05 26 | WHERE deptno = ( SELECT deptno 27 | FROM cmdev.dept 28 | WHERE dname = 'SALES' ) 29 | 30 | 31 | UPDATE cmdev.emp 32 | SET salary = salary * 1.05 33 | WHERE job = ( SELECT job 34 | FROM cmdev.emp 35 | WHERE empno = 'BLAKE' ) 36 | 37 | 38 | -------------------------------------------------------------------------------- /examples/ch09/ch09_06_關聯子查詢.sql: -------------------------------------------------------------------------------- 1 | SELECT Continent, Name, GNP 2 | FROM country 3 | WHERE (Continent, GNP) IN ( SELECT Continent, MAX(GNP) 4 | FROM country 5 | GROUP BY Continent ) 6 | 7 | 8 | SELECT Continent, Name, GNP 9 | FROM country oc 10 | WHERE GNP = ( SELECT MAX(GNP) 11 | FROM country 12 | WHERE Continent = oc.Continent ) 13 | 14 | 15 | SELECT Name 16 | FROM country c 17 | WHERE EXISTS ( SELECT * 18 | FROM city 19 | WHERE CountryCode = c.Code AND 20 | Population > 8000000 ) 21 | 22 | 23 | SELECT Name 24 | FROM country c 25 | WHERE NOT EXISTS ( SELECT * 26 | FROM city 27 | WHERE CountryCode = c.Code AND 28 | Population > 8000000 ) 29 | -------------------------------------------------------------------------------- /examples/ch09/ch09_07_子查詢與結合查詢.sql: -------------------------------------------------------------------------------- 1 | SELECT Name 2 | FROM city 3 | WHERE ID IN ( SELECT Capital 4 | FROM country 5 | WHERE Capital IS NOT NULL ) 6 | 7 | 8 | SELECT city.Name 9 | FROM city, country 10 | WHERE ID = Capital 11 | 12 | 13 | SELECT Name 14 | FROM city 15 | WHERE ID NOT IN ( SELECT Capital 16 | FROM country 17 | WHERE Capital IS NOT NULL ) 18 | 19 | 20 | SELECT city.Name, country.Capital 21 | FROM city LEFT JOIN country ON city.ID = country.Capital 22 | 23 | 24 | SELECT city.Name 25 | FROM city LEFT JOIN country ON city.ID = country.Capital 26 | WHERE country.Capital IS NULL 27 | -------------------------------------------------------------------------------- /examples/ch10/ch10_01_View的應用.sql: -------------------------------------------------------------------------------- 1 | SELECT Continent, Region, Code, Code2, Name 2 | FROM country 3 | ORDER BY Continent, Region, Code 4 | 5 | 6 | CREATE VIEW CountryView AS 7 | SELECT Continent, Region, Code, Code2, Name 8 | FROM country 9 | ORDER BY Continent, Region, Code 10 | 11 | 12 | SELECT * FROM CountryView 13 | 14 | 15 | SELECT Continent, COUNT(*) 16 | FROM CountryView 17 | GROUP BY Continent 18 | 19 | 20 | SELECT Name, Language 21 | FROM CountryView, countrylanguage 22 | WHERE Code = CountryCode 23 | -------------------------------------------------------------------------------- /examples/ch10/ch10_02_建立需要的View.sql: -------------------------------------------------------------------------------- 1 | CREATE VIEW CountryMaxGNP AS 2 | SELECT Name, GNP 3 | FROM country 4 | WHERE (Region, GNP) IN ( SELECT Region, MAX(GNP) 5 | FROM country 6 | GROUP BY Region ) 7 | 8 | 9 | CREATE VIEW CountryMaxGNP AS 10 | SELECT Code, Name, GNP 11 | FROM country 12 | WHERE (Region, GNP) IN ( SELECT Region, MAX(GNP) 13 | FROM country 14 | GROUP BY Region ) 15 | 16 | 17 | CREATE OR REPLACE VIEW CountryMaxGNP AS 18 | SELECT Code, Name, GNP 19 | FROM country 20 | WHERE (Region, GNP) IN ( SELECT Region, MAX(GNP) 21 | FROM country 22 | GROUP BY Region ) 23 | 24 | 25 | DESC CountryMaxGNP 26 | 27 | 28 | SELECT co.Name, ci.Name, co.Population, ci.Population, 29 | ROUND(ci.Population / co.Population, 2) Scale 30 | FROM country co, city ci 31 | WHERE co.Code = ci.CountryCode 32 | 33 | 34 | CREATE VIEW ScaleView AS 35 | SELECT co.Name, ci.Name, co.Population, ci.Population, 36 | ROUND(ci.Population / co.Population, 2) Scale 37 | FROM country co, city ci 38 | WHERE co.Code = ci.CountryCode 39 | 40 | 41 | CREATE VIEW ScaleView AS 42 | SELECT co.Name CountryName, ci.Name CityName, 43 | co.Population CountryPop, ci.Population CityPop, 44 | ROUND(ci.Population / co.Population, 2) Scale 45 | FROM country co, city ci 46 | WHERE co.Code = ci.CountryCode 47 | 48 | 49 | CREATE VIEW ScaleView 50 | (CountryName, CityName, CountryPop, CityPop, Scale) 51 | AS 52 | SELECT co.name, ci.Name, co.Population, ci.Population, 53 | ROUND(ci.Population / co.Population, 2) Scale 54 | FROM country co, city ci 55 | WHERE co.Code = ci.CountryCode 56 | -------------------------------------------------------------------------------- /examples/ch10/ch10_03_修改View.sql: -------------------------------------------------------------------------------- 1 | ALTER VIEW CountryMaxGNP AS 2 | SELECT Continent, Code, Name, GNP 3 | FROM country 4 | WHERE (Region, GNP) IN ( SELECT Region, MAX(GNP) 5 | FROM country 6 | GROUP BY Region ) 7 | 8 | 9 | CREATE OR REPLACE VIEW CountryMaxGNP AS 10 | SELECT Continent, Code, Name, GNP 11 | FROM country 12 | WHERE (Region, GNP) IN ( SELECT Region, MAX(GNP) 13 | FROM country 14 | GROUP BY Region ) 15 | -------------------------------------------------------------------------------- /examples/ch10/ch10_04_刪除View.sql: -------------------------------------------------------------------------------- 1 | DROP VIEW CountryMax 2 | 3 | 4 | DROP VIEW IF EXISTS CountryMax 5 | -------------------------------------------------------------------------------- /examples/ch10/ch10_05_資料維護與View.sql: -------------------------------------------------------------------------------- 1 | CREATE VIEW cmdev.EmpDept30View AS 2 | SELECT empno, ename, job, manager, hiredate, salary, comm 3 | FROM cmdev.emp 4 | WHERE deptno = 30 5 | 6 | 7 | UPDATE EmpDept30View 8 | SET comm = 600 9 | WHERE empno = 7844 10 | 11 | 12 | SELECT * FROM EmpDept30View WHERE empno = 7844 13 | 14 | 15 | SELECT * FROM emp WHERE empno = 7844 16 | 17 | 18 | INSERT INTO EmpDept30View 19 | VALUES (9001, 'SIMON', 'SALESMAN', 7698, 20 | '2000-04-01', 1000, 250) 21 | 22 | 23 | SELECT * FROM EmpDept30View WHERE empno = 9001 24 | 25 | 26 | SELECT * FROM emp WHERE empno = 9001 27 | 28 | 29 | DELETE FROM EmpDept30View WHERE empno = 9001 30 | 31 | 32 | SELECT * FROM EmpDept30View WHERE empno = 9001 33 | 34 | 35 | SELECT * FROM emp WHERE empno = 9001 36 | 37 | 38 | CREATE OR REPLACE VIEW cmdev.EmpDept30View AS 39 | SELECT empno, ename, job, manager, hiredate, salary, comm 40 | FROM cmdev.emp 41 | WHERE deptno = 30 42 | WITH CHECK OPTION 43 | 44 | 45 | INSERT INTO EmpDept30View 46 | VALUES (9002, 'MARY', 'SALESMAN', 7698, 47 | '2000-05-01', 1200, 150) 48 | 49 | 50 | UPDATE EmpDept30View 51 | SET comm = 1200 52 | WHERE empno = 7844 53 | 54 | 55 | CREATE VIEW cmdev.EmpSalaryView AS 56 | SELECT * FROM cmdev.emp WHERE salary >= 1500 57 | 58 | 59 | CREATE OR REPLACE VIEW cmdev.EmpDept20View AS 60 | SELECT * FROM cmdev.EmpSalaryView WHERE deptno = 20 61 | WITH LOCAL CHECK OPTION 62 | 63 | 64 | SELECT * FROM EmpDept20View 65 | 66 | 67 | UPDATE EmpDept20View 68 | SET deptno = 30 69 | WHERE empno = 7566 70 | 71 | 72 | UPDATE EmpDept20View 73 | SET salary = 1000 74 | WHERE empno = 7566 75 | 76 | 77 | CREATE OR REPLACE VIEW cmdev.EmpDept20View AS 78 | SELECT * FROM cmdev.EmpSalaryView WHERE deptno = 20 79 | WITH CASCADED CHECK OPTION 80 | 81 | 82 | UPDATE EmpDept20View 83 | SET salary = 1000 84 | WHERE empno = 7902 85 | -------------------------------------------------------------------------------- /examples/ch10/ch10_06_View的演算法.sql: -------------------------------------------------------------------------------- 1 | CREATE ALGORITHM = MERGE VIEW cmdev.EmpSalaryView AS 2 | SELECT * FROM cmdev.emp WHERE salary >= 1500 3 | 4 | 5 | SELECT * FROM cmdev.EmpSalaryView 6 | 7 | 8 | SELECT * FROM 9 | (SELECT * FROM cmdev.emp WHERE salary >= 1500) temp 10 | 11 | 12 | CREATE ALGORITHM = TEMPTABLE VIEW cmdev.EmpSalaryView AS 13 | SELECT * FROM cmdev.emp WHERE salary >= 1500 14 | 15 | 16 | SELECT * FROM cmdev.EmpSalaryView 17 | 18 | 19 | SELECT * FROM cmdev.TempView 20 | 21 | 22 | SELECT job, COUNT(job) CountJob, SUM(salary) SumSalary 23 | FROM emp 24 | GROUP BY job 25 | 26 | 27 | CREATE ALGORITHM = MERGE VIEW EmpJobView AS 28 | SELECT job, COUNT(job) CountJob, SUM(salary) SumSalary 29 | FROM emp 30 | GROUP BY job 31 | -------------------------------------------------------------------------------- /examples/ch10/ch10_07_View的維護與資訊.sql: -------------------------------------------------------------------------------- 1 | CREATE VIEW cmdev.EmpSalaryView AS 2 | SELECT * FROM cmdev.emp WHERE salary >= 1500 3 | 4 | 5 | CREATE OR REPLACE VIEW cmdev.EmpDept20View AS 6 | SELECT * FROM cmdev.EmpSalaryView WHERE deptno = 20 7 | WITH LOCAL CHECK OPTION 8 | 9 | 10 | DROP VIEW cmdev.EmpSalaryView 11 | 12 | 13 | SELECT * FROM cmdev.empdept20view 14 | 15 | 16 | CHECK TABLE EmpDept20View 17 | 18 | 19 | SELECT TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION, 20 | CHECK_OPTION, IS_UPDATABLE 21 | FROM information_schema.VIEWS 22 | -------------------------------------------------------------------------------- /examples/ch11/ch11_01_使用者變數.sql: -------------------------------------------------------------------------------- 1 | SET @my_continent = 'Asia' 2 | 3 | 4 | SET @my_continent2 = 'Europe' 5 | 6 | 7 | SELECT @my_continent, @my_continent2 8 | 9 | 10 | SET @my_region = 'Eastern Asia', @my_region2 = 'Middle Asia' 11 | 12 | 13 | SELECT @my_region, @my_region2 14 | 15 | 16 | SELECT @my_gnp := 30000, @my_gnp2 := 5000 17 | 18 | 19 | SELECT @my_gnp, @my_gnp2 20 | 21 | 22 | SET @my_continent = 'Asia'; 23 | 24 | 25 | SET @my_continent2 = 'Europe'; 26 | 27 | 28 | SELECT Continent, Name, GNP, Population 29 | FROM country 30 | WHERE Continent IN (@my_continent, @my_continent2) 31 | 32 | 33 | SELECT @max_gnp := MAX(GNP), 34 | @max_population := MAX(Population) 35 | FROM country 36 | 37 | 38 | SELECT Name, GNP, Population 39 | FROM country 40 | WHERE gnp = @max_gnp OR Population = @max_population 41 | 42 | 43 | SELECT Name, @max_gnp - GNP, @max_population - Population 44 | FROM country 45 | -------------------------------------------------------------------------------- /examples/ch11/ch11_02_Prepared Statements的應用.sql: -------------------------------------------------------------------------------- 1 | SELECT Code, Name, GNP 2 | FROM country 3 | WHERE Code = 'USA' 4 | 5 | 6 | SELECT Code, Name, GNP 7 | FROM country 8 | WHERE Code = 'JPN' 9 | 10 | 11 | PREPARE my_country FROM 12 | 'SELECT Code, Name, GNP FROM country WHERE Code = ?' 13 | 14 | 15 | SET @my_code = 'USA' 16 | 17 | 18 | EXECUTE my_country USING @my_code 19 | 20 | 21 | SET @my_code = 'JPN' 22 | EXECUTE my_country USING @my_code 23 | -------------------------------------------------------------------------------- /examples/ch11/ch11_03_建立_執行與移除Prepared Statements.sql: -------------------------------------------------------------------------------- 1 | PREPARE my_country FROM 2 | 'SELECT Code, Name, GNP FROM world.country WHERE Code = ?'; 3 | 4 | 5 | SET @my_code = 'USA'; 6 | 7 | 8 | EXECUTE my_country USING @my_code; 9 | 10 | 11 | SET @my_code = 'JPN'; 12 | 13 | 14 | mysql> EXECUTE my_country USING @my_code; 15 | 16 | 17 | DEALLOCATE PREPARE my_country; 18 | -------------------------------------------------------------------------------- /examples/ch11/ch11_04_Prepared Statements的參數.sql: -------------------------------------------------------------------------------- 1 | PREPARE new_dept FROM 2 | 'INSERT INTO cmdev.dept VALUES (?, ?, ?)'; 3 | 4 | 5 | SET @my_deptno=99, @my_dname='HR', @my_location='TAIPEI'; 6 | 7 | 8 | EXECUTE new_dept USING @my_deptno,@my_dname,@my_location; 9 | 10 | 11 | SET @my_deptno=101, @my_dname='IT'; 12 | 13 | 14 | EXECUTE new_dept USING @my_deptno,@my_dname; 15 | 16 | 17 | EXECUTE new_dept USING @my_deptno,@my_dname,@not_exists; 18 | -------------------------------------------------------------------------------- /examples/ch11/ch11_05_有效範圍.sql: -------------------------------------------------------------------------------- 1 | PREPARE world.my_city FROM 'SELECT * FROM city'; -------------------------------------------------------------------------------- /examples/ch12/ch12_01_Stored Routines的應用.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS mycountry 2 | 3 | 4 | SET @my_code := 'JPN' 5 | 6 | 7 | SELECT @pop_var := Population 8 | FROM country 9 | WHERE Code = @my_code 10 | 11 | 12 | CREATE TABLE mycountry 13 | SELECT Code, Name, GNP, Population 14 | FROM country 15 | WHERE Code = @my_code OR Population > @pop_var 16 | ORDER BY Population 17 | -------------------------------------------------------------------------------- /examples/ch12/ch12_02_在MySQL Query Browser中管理Stored routines.sql: -------------------------------------------------------------------------------- 1 | DELIMITER $$ 2 | CREATE PROCEDURE show_countries ( ) 3 | SELECT * FROM country; $$ 4 | DELIMITER ; 5 | 6 | 7 | DELIMITER $$ 8 | CREATE PROCEDURE my_world_count ( ) 9 | BEGIN 10 | SELECT COUNT(*) countrycount FROM country; 11 | SELECT COUNT(*) languagecount FROM countrylanguage; 12 | SELECT COUNT(*) citycount FROM city; 13 | END $$ 14 | DELIMITER ; 15 | 16 | 17 | DELIMITER $$ 18 | CREATE FUNCTION my_date ( ) 19 | RETURNS VARCHAR(64) 20 | RETURN CONCAT( DATE_FORMAT(CURDATE(), '%Y/%m/%d'), 21 | ' ', 22 | TIME_FORMAT(CURTIME(), '%H:%i:%s'), 23 | ' ', 24 | DAYNAME(CURDATE()) ); $$ 25 | DELIMITER ; 26 | 27 | 28 | DELIMITER $$ 29 | CREATE FUNCTION my_date2 ( ) 30 | RETURNS VARCHAR(64) 31 | BEGIN 32 | DECLARE d, t, w VARCHAR(24); 33 | SET d = DATE_FORMAT(CURDATE(), '%Y/%m/%d'); 34 | SET t = TIME_FORMAT(CURTIME(), '%H:%i:%s'); 35 | SET w = DAYNAME(CURDATE()); 36 | RETURN CONCAT( d, ' ', t, ' ', w ); 37 | END $$ 38 | DELIMITER ; 39 | -------------------------------------------------------------------------------- /examples/ch12/ch12_03_Stored Routines的參數.sql: -------------------------------------------------------------------------------- 1 | CREATE FUNCTION my_summary ( p_num INT, p_num2 INT ) 2 | RETURNS INT 3 | BEGIN 4 | RETURN p_num + p_num2; 5 | END 6 | 7 | 8 | SELECT my_summary( 3, 5 ) 9 | 10 | 11 | SELECT my_summary( 3 ) 12 | 13 | 14 | SELECT my_summary( 3, 5, 7 ) 15 | 16 | 17 | SELECT my_summary( '3', '5' ) 18 | 19 | 20 | SELECT my_summary( 'A', 'B' ) 21 | 22 | 23 | CREATE PROCEDURE test_param ( IN pi_in INT, 24 | OUT po_out INT, 25 | INOUT pio_inout INT ) 26 | BEGIN 27 | SELECT pi_in, po_out, pio_inout; 28 | SET pi_in = 99, po_out = 99, pio_inout = 99; 29 | END 30 | 31 | 32 | CALL test_param ( 1 ) 33 | 34 | 35 | CALL test_param ( 1, 2, 3 ) 36 | 37 | 38 | CALL test_param ( 1, @my_out, @my_inout ) 39 | 40 | 41 | SELECT @my_out, @my_inout 42 | 43 | 44 | SET @my_in = 1, @my_out = 2, @my_inout = 3 45 | 46 | 47 | CALL test_param ( @my_in, @my_out, @my_inout ) 48 | 49 | 50 | SELECT @my_in, @my_out, @my_inout 51 | 52 | 53 | CREATE PROCEDURE country_count ( IN pi_con VARCHAR(26) ) 54 | BEGIN 55 | SELECT COUNT(*) FROM country WHERE Continent = pi_con; 56 | END 57 | 58 | 59 | SET @my_con = 'Europe' 60 | 61 | 62 | CALL country_count( @my_con ) 63 | 64 | 65 | CREATE PROCEDURE country_count2 66 | ( IN pi_con VARCHAR(26), OUT po_count INT ) 67 | BEGIN 68 | SELECT COUNT(*) INTO po_count 69 | FROM country 70 | WHERE Continent = pi_con; 71 | END 72 | 73 | 74 | CALL country_count2('Asia', @my_count) 75 | 76 | 77 | SELECT @my_count 78 | -------------------------------------------------------------------------------- /examples/ch13/ch13_01_宣告與使用變數.sql: -------------------------------------------------------------------------------- 1 | CREATE FUNCTION test_variable () RETURNS INT 2 | BEGIN 3 | DECLARE v_num, v_num2, v_num3 INT; 4 | SET v_num = 3, v_num2 = 5; 5 | SET v_num3 = v_num + v_num2; 6 | RETURN v_num3; 7 | END 8 | 9 | 10 | CREATE FUNCTION world_rec_count ( ) RETURNS INT 11 | BEGIN 12 | DECLARE v_country, v_city, v_countrylanguage INT; 13 | DECLARE v_total INT DEFAULT 0; 14 | SELECT COUNT(*) INTO v_country FROM country; 15 | SELECT COUNT(*) INTO v_city FROM city; 16 | SELECT COUNT(*) INTO v_countrylanguage FROM countrylanguage; 17 | SET v_total = v_country + v_city + v_countrylanguage; 18 | RETURN v_total; 19 | END 20 | -------------------------------------------------------------------------------- /examples/ch13/ch13_02_判斷.sql: -------------------------------------------------------------------------------- 1 | CREATE PROCEDURE test_weight (IN p_weight INT) 2 | BEGIN 3 | IF p_weight > 100 THEN 4 | SELECT 'You are heavy!'; 5 | END IF; 6 | END 7 | 8 | 9 | CALL test_weight(101) 10 | 11 | 12 | CALL test_weight(80) 13 | 14 | 15 | CREATE PROCEDURE test_weight2 (IN p_weight INT) 16 | BEGIN 17 | IF p_weight > 100 THEN 18 | SELECT 'You are heavy!'; 19 | ELSEIF p_weight < 100 THEN 20 | SELECT 'Good!'; 21 | END IF; 22 | END 23 | 24 | 25 | CALL test_weight2(101) 26 | 27 | 28 | CALL test_weight2(80) 29 | 30 | 31 | CALL test_weight2(100) 32 | 33 | 34 | CREATE PROCEDURE test_weight3 (IN p_weight INT) 35 | BEGIN 36 | IF p_weight > 100 THEN 37 | SELECT 'You are heavy!'; 38 | ELSEIF p_weight < 100 THEN 39 | SELECT 'Good!'; 40 | ELSE 41 | SELECT 'Standard!'; 42 | END IF; 43 | END 44 | 45 | 46 | CALL test_weight3(101) 47 | 48 | 49 | CALL test_weight3(80) 50 | 51 | 52 | CALL test_weight3(100) 53 | 54 | 55 | CREATE FUNCTION std_weight (p_height INT, p_gender CHAR(1)) 56 | RETURNS INT 57 | BEGIN 58 | DECLARE standard INT DEFAULT 0; 59 | IF (p_height BETWEEN 160 AND 164) AND p_gender = 'M' THEN 60 | SET standard = 58; 61 | ELSEIF (p_height BETWEEN 160 AND 164) AND p_gender = 'F' THEN 62 | SET standard = 58; 63 | ELSEIF (p_height BETWEEN 165 AND 169) AND p_gender = 'M' THEN 64 | SET standard = 60; 65 | ELSEIF (p_height BETWEEN 165 AND 169) AND p_gender = 'F' THEN 66 | SET standard = 56; 67 | ELSEIF (p_height BETWEEN 170 AND 174) AND p_gender = 'M' THEN 68 | SET standard = 64; 69 | ELSEIF (p_height BETWEEN 170 AND 174) AND p_gender = 'F' THEN 70 | SET standard = 60; 71 | END IF; 72 | RETURN standard; 73 | END 74 | 75 | 76 | CREATE PROCEDURE test_weight_final (IN p_weight INT, 77 | IN p_height INT, 78 | IN p_gender CHAR(1)) 79 | BEGIN 80 | DECLARE standard INT DEFAULT std_weight(p_height, p_gender); 81 | IF p_weight > standard THEN 82 | SELECT 'You are heavy!'; 83 | ELSEIF p_weight < standard THEN 84 | SELECT 'Good!'; 85 | ELSE 86 | SELECT 'Standard!'; 87 | END IF; 88 | END 89 | 90 | 91 | CREATE PROCEDURE test_weight_case (IN p_weight INT, 92 | IN p_height INT, 93 | IN p_gender CHAR(1)) 94 | BEGIN 95 | DECLARE standard INT DEFAULT std_weight(p_height, p_gender); 96 | CASE 97 | WHEN p_weight > standard THEN 98 | SELECT 'You are heavy!'; 99 | WHEN p_weight < standard THEN 100 | SELECT 'Good!'; 101 | ELSE 102 | SELECT 'Standard!'; 103 | END CASE; 104 | END 105 | 106 | 107 | CREATE FUNCTION get_season (p_num INT) 108 | RETURNS VARCHAR(7) 109 | BEGIN 110 | DECLARE season VARCHAR(7); 111 | CASE p_num 112 | WHEN 1 THEN SET season = 'Spring'; 113 | WHEN 2 THEN SET season = 'Summer'; 114 | WHEN 3 THEN SET season = 'Autumn'; 115 | WHEN 4 THEN SET season = 'Winter'; 116 | END CASE; 117 | RETURN season; 118 | END 119 | 120 | 121 | SELECT get_season(2) 122 | 123 | 124 | SELECT get_season(3) 125 | 126 | 127 | SELECT get_season(5) 128 | 129 | 130 | CREATE FUNCTION get_season2 (p_num INT) 131 | RETURNS VARCHAR(7) 132 | BEGIN 133 | DECLARE season VARCHAR(7); 134 | CASE p_num 135 | WHEN 1 THEN SET season = 'Spring'; 136 | WHEN 2 THEN SET season = 'Summer'; 137 | WHEN 3 THEN SET season = 'Autumn'; 138 | WHEN 4 THEN SET season = 'Winter'; 139 | ELSE SET season = 'Unknown'; 140 | END CASE; 141 | RETURN season; 142 | END 143 | 144 | 145 | CREATE FUNCTION summary_while (p_num INT) RETURNS INT 146 | BEGIN 147 | DECLARE v_count INT DEFAULT 1; 148 | DECLARE v_total INT DEFAULT 0; 149 | WHILE v_count <= p_num DO 150 | SET v_total = v_total + v_count; 151 | SET v_count = v_count + 1; 152 | END WHILE; 153 | RETURN v_total; 154 | END 155 | 156 | 157 | CREATE FUNCTION summary_repeat (p_num INT) RETURNS INT 158 | BEGIN 159 | DECLARE v_count INT DEFAULT 1; 160 | DECLARE v_total INT DEFAULT 0; 161 | REPEAT 162 | SET v_total = v_total + v_count; 163 | SET v_count = v_count + 1; 164 | UNTIL v_count > p_num 165 | END REPEAT; 166 | RETURN v_total; 167 | END 168 | 169 | 170 | CREATE FUNCTION summary_loop (p_num INT) RETURNS INT 171 | BEGIN 172 | DECLARE v_count INT DEFAULT 1; 173 | DECLARE v_total INT DEFAULT 0; 174 | my_label: LOOP 175 | SET v_total = v_total + v_count; 176 | SET v_count = v_count + 1; 177 | IF v_count > p_num THEN 178 | LEAVE my_label; 179 | END IF; 180 | END LOOP my_label; 181 | RETURN v_total; 182 | END 183 | 184 | 185 | CREATE FUNCTION summary_iterate (p_num INT) RETURNS INT 186 | BEGIN 187 | DECLARE v_count INT DEFAULT 0; 188 | DECLARE v_total INT DEFAULT 0; 189 | my_label: WHILE v_count <= p_num DO 190 | SET v_count = v_count + 1; 191 | IF v_count % 2 = 0 THEN 192 | ITERATE my_label; 193 | END IF; 194 | SET v_total = v_total + v_count; 195 | END WHILE my_label; 196 | RETURN v_total; 197 | END 198 | -------------------------------------------------------------------------------- /examples/ch14/ch14_01_錯誤編號.sql: -------------------------------------------------------------------------------- 1 | SELECT * FROM hello 2 | -------------------------------------------------------------------------------- /examples/ch14/ch14_02_Handlers.sql: -------------------------------------------------------------------------------- 1 | CREATE PROCEDURE cmdev.test_handler ( p_deptno INT, 2 | p_dname VARCHAR(16), 3 | p_location VARCHAR(16) ) 4 | BEGIN 5 | INSERT INTO cmdev.dept 6 | VALUES (p_deptno, p_dname, p_location); 7 | SELECT 'Success!'; 8 | END 9 | 10 | 11 | CALL test_handler(901,'Newdept','Newloc') 12 | 13 | 14 | CALL test_handler(901,'Newdept2','Newloc2') 15 | 16 | 17 | CREATE PROCEDURE cmdev.test_handler2( p_deptno INT, 18 | p_dname VARCHAR(16), 19 | p_location VARCHAR(16) ) 20 | BEGIN 21 | DECLARE EXIT HANDLER FOR SQLSTATE '23000' 22 | BEGIN 23 | SELECT 'Error!'; 24 | END; 25 | INSERT INTO cmdev.dept 26 | VALUES (p_deptno, p_dname, p_location); 27 | SELECT 'Success!'; 28 | END 29 | 30 | 31 | CREATE PROCEDURE cmdev.test_handler3( p_deptno INT, 32 | p_dname VARCHAR(16), 33 | p_location VARCHAR(16) ) 34 | BEGIN 35 | DECLARE v_message VARCHAR(64) DEFAULT 'Success!'; 36 | DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' 37 | BEGIN 38 | SET v_message = 'Error!'; 39 | END; 40 | INSERT INTO cmdev.dept 41 | VALUES (p_deptno, p_dname, p_location); 42 | INSERT INTO cmdev.deptlog (message) VALUES (v_message); 43 | END 44 | 45 | 46 | CALL test_handler3(902,'Newdept','Newloc') 47 | 48 | 49 | CALL test_handler3(902,'Newdept','Newloc') 50 | 51 | 52 | CALL test_handler3(903, NULL,'Newloc') 53 | 54 | 55 | CREATE PROCEDURE cmdev.test_handler4( p_deptno INT, 56 | p_dname VARCHAR(16), 57 | p_location VARCHAR(16) ) 58 | BEGIN 59 | DECLARE v_messgae VARCHAR(64) DEFAULT 'Success!'; 60 | DECLARE CONTINUE HANDLER FOR 1048 61 | BEGIN 62 | SET v_messgae = 'Cannot be null!'; 63 | END; 64 | DECLARE CONTINUE HANDLER FOR 1062 65 | BEGIN 66 | SET v_messgae = 'Duplicate key!'; 67 | END; 68 | INSERT INTO cmdev.dept 69 | VALUES (p_deptno, p_dname, p_location); 70 | INSERT INTO deptlog (message) VALUES (v_messgae); 71 | END 72 | 73 | 74 | CALL test_handler4(905,'Newdept','Newloc') 75 | 76 | 77 | CALL test_handler4(905,'Newdept','Newloc') 78 | 79 | 80 | CALL test_handler4(906, NULL,'Newloc') 81 | -------------------------------------------------------------------------------- /examples/ch14/ch14_03_Conditions.sql: -------------------------------------------------------------------------------- 1 | CREATE PROCEDURE cmdev.test_handler ( p_deptno INT, 2 | p_dname VARCHAR(16), 3 | p_location VARCHAR(16) ) 4 | BEGIN 5 | INSERT INTO cmdev.dept 6 | VALUES (p_deptno, p_dname, p_location); 7 | SELECT 'Success!'; 8 | END 9 | 10 | 11 | CALL test_handler(901,'Newdept','Newloc') 12 | 13 | 14 | CALL test_handler(901,'Newdept2','Newloc2') 15 | 16 | 17 | CREATE PROCEDURE cmdev.test_handler2( p_deptno INT, 18 | p_dname VARCHAR(16), 19 | p_location VARCHAR(16) ) 20 | BEGIN 21 | DECLARE EXIT HANDLER FOR SQLSTATE '23000' 22 | BEGIN 23 | SELECT 'Error!'; 24 | END; 25 | INSERT INTO cmdev.dept 26 | VALUES (p_deptno, p_dname, p_location); 27 | SELECT 'Success!'; 28 | END 29 | 30 | 31 | CREATE PROCEDURE cmdev.test_handler3( p_deptno INT, 32 | p_dname VARCHAR(16), 33 | p_location VARCHAR(16) ) 34 | BEGIN 35 | DECLARE v_message VARCHAR(64) DEFAULT 'Success!'; 36 | DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' 37 | BEGIN 38 | SET v_message = 'Error!'; 39 | END; 40 | INSERT INTO cmdev.dept 41 | VALUES (p_deptno, p_dname, p_location); 42 | INSERT INTO cmdev.deptlog (message) VALUES (v_message); 43 | END 44 | 45 | 46 | CALL test_handler3(902,'Newdept','Newloc') 47 | 48 | 49 | CALL test_handler3(902,'Newdept','Newloc') 50 | 51 | 52 | CALL test_handler3(903, NULL,'Newloc') 53 | 54 | 55 | CREATE PROCEDURE cmdev.test_handler4( p_deptno INT, 56 | p_dname VARCHAR(16), 57 | p_location VARCHAR(16) ) 58 | BEGIN 59 | DECLARE v_messgae VARCHAR(64) DEFAULT 'Success!'; 60 | DECLARE CONTINUE HANDLER FOR 1048 61 | BEGIN 62 | SET v_messgae = 'Cannot be null!'; 63 | END; 64 | DECLARE CONTINUE HANDLER FOR 1062 65 | BEGIN 66 | SET v_messgae = 'Duplicate key!'; 67 | END; 68 | INSERT INTO cmdev.dept 69 | VALUES (p_deptno, p_dname, p_location); 70 | INSERT INTO deptlog (message) VALUES (v_messgae); 71 | END 72 | 73 | 74 | CALL test_handler4(905,'Newdept','Newloc') 75 | 76 | 77 | CALL test_handler4(905,'Newdept','Newloc') 78 | 79 | 80 | CALL test_handler4(906, NULL,'Newloc') 81 | -------------------------------------------------------------------------------- /examples/ch14/ch14_04_Cursors.sql: -------------------------------------------------------------------------------- 1 | CREATE PROCEDURE cmdev.test_cursor () 2 | BEGIN 3 | DECLARE v_dname VARCHAR(16); 4 | DECLARE cur_dept CURSOR FOR 5 | SELECT dname FROM cmdev.dept; 6 | OPEN cur_dept; 7 | BEGIN 8 | DECLARE EXIT HANDLER FOR 1329 BEGIN END; 9 | LOOP 10 | FETCH cur_dept INTO v_dname; 11 | -- 12 | END LOOP; 13 | END; 14 | CLOSE cur_dept; 15 | END 16 | 17 | 18 | CREATE PROCEDURE cmdev.test_cursor2 () 19 | BEGIN 20 | DECLARE v_dname VARCHAR(16); 21 | DECLARE v_exit INT DEFAULT 0; 22 | DECLARE cur_dept CURSOR FOR 23 | SELECT dname FROM cmdev.dept; 24 | DECLARE CONTINUE HANDLER FOR 1329 SET v_exit = 1; 25 | OPEN cur_dept; 26 | my_fetch: LOOP 27 | FETCH cur_dept INTO v_dname; 28 | IF v_exit THEN 29 | LEAVE my_fetch; 30 | END IF; 31 | -- 32 | END LOOP my_fetch; 33 | CLOSE cur_dept; 34 | END 35 | 36 | 37 | CREATE cmdev.gen_top_emp( IN p_salary FLOAT(7, 2) ) 38 | BEGIN 39 | DECLARE v_empno INT; 40 | DECLARE v_ename VARCHAR(16); 41 | DECLARE v_salary FLOAT(7, 2); 42 | DECLARE cur_emp CURSOR FOR 43 | SELECT empno, ename, salary 44 | FROM cmdev.emp 45 | WHERE salary >= p_salary 46 | ORDER BY salary DESC; 47 | BEGIN 48 | DECLARE EXIT HANDLER FOR 1146 49 | BEGIN 50 | CREATE TABLE cmdev.topemp ( 51 | empno INT, 52 | ename VARCHAR(16), 53 | salary FLOAT(7, 2) 54 | ); 55 | END; 56 | DELETE FROM cmdev.topemp; 57 | END; 58 | OPEN cur_emp; 59 | BEGIN 60 | DECLARE EXIT HANDLER FOR SQLSTATE '02000' BEGIN END; 61 | LOOP 62 | FETCH cur_emp INTO v_empno, v_ename, v_salary; 63 | INSERT INTO cmdev.topemp 64 | VALUES (v_empno, v_ename, v_salary); 65 | END LOOP; 66 | END; 67 | CLOSE cur_emp; 68 | SELECT * FROM topemp; 69 | END 70 | -------------------------------------------------------------------------------- /examples/ch14/ch14_05_設定_修改與刪除Stored routines.sql: -------------------------------------------------------------------------------- 1 | ALTER PROCEDURE cmdev.gen_top_emp 2 | SQL SECURITY INVOKER 3 | COMMENT 'This is my first stored routin' 4 | -------------------------------------------------------------------------------- /examples/ch14/ch14_06_查詢Stored routines的相關資訊.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macdidi5/MySQLTutorial/f44207d5f441171a1c600753f694974c537210da/examples/ch14/ch14_06_查詢Stored routines的相關資訊.sql -------------------------------------------------------------------------------- /examples/ch15/ch15_01_Triggers的應用.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE emplog ( 2 | logno bigint(20) unsigned NOT NULL AUTO_INCREMENT, 3 | logdt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 4 | message varchar(64) DEFAULT NULL, 5 | UNIQUE KEY logno (logno) 6 | ) 7 | -------------------------------------------------------------------------------- /examples/ch15/ch15_02_建立Triggers.sql: -------------------------------------------------------------------------------- 1 | DELIMITER $$ 2 | CREATE TRIGGER cmdev.emp_before_update BEFORE UPDATE 3 | ON cmdev.emp FOR EACH ROW 4 | BEGIN 5 | INSERT INTO emplog (message) 6 | VALUES ('BEFORE UPDATE!'); 7 | END $$ 8 | DELIMITER ; 9 | 10 | 11 | UPDATE emp SET comm = 100 WHERE empno = 7844 12 | 13 | 14 | UPDATE emp 15 | SET salary = salary + 100 16 | WHERE deptno = 10 17 | 18 | 19 | UPDATE emp SET comm = 100 WHERE empno = 9999 20 | -------------------------------------------------------------------------------- /examples/ch15/ch15_04_OLD與NEW關鍵字.sql: -------------------------------------------------------------------------------- 1 | DELIMITER $$ 2 | DROP TRIGGER IF EXISTS cmdev.emp_before_update$$ 3 | CREATE TRIGGER cmdev.emp_before_update BEFORE UPDATE 4 | ON cmdev.emp FOR EACH ROW 5 | BEGIN 6 | DECLARE v_message VARCHAR(64) DEFAULT 'BEFORE UPDATE: '; 7 | SET v_message = CONCAT( v_message, 8 | OLD.deptno, ' -> ', NEW.deptno); 9 | INSERT INTO emplog (message) VALUES (v_message); 10 | END $$ 11 | DELIMITER ; 12 | 13 | 14 | UPDATE emp SET comm = 100 WHERE empno = 7369 15 | 16 | 17 | DELIMITER $$ 18 | DROP TRIGGER IF EXISTS cmdev.emp_before_update$$ 19 | CREATE TRIGGER cmdev.emp_before_update BEFORE UPDATE 20 | ON cmdev.emp FOR EACH ROW 21 | BEGIN 22 | DECLARE v_message VARCHAR(64) DEFAULT 'BEFORE UPDATE: '; 23 | SET v_message = CONCAT( v_message, 24 | OLD.deptno, ' -> ', NEW.deptno); 25 | IF OLD.deptno <> NEW.deptno THEN 26 | INSERT INTO emplog (message) VALUES (v_message); 27 | END IF; 28 | END $$ 29 | DELIMITER ; 30 | 31 | 32 | INSERT INTO cmdev.emp 33 | VALUES (9001, 'sam', 'salesman', 7698, 34 | '2000-01-01', 1000, 100, 30) 35 | 36 | 37 | DELIMITER $$ 38 | DROP TRIGGER IF EXISTS cmdev.emp_before_insert$$ 39 | CREATE TRIGGER cmdev.emp_before_insert BEFORE INSERT 40 | ON cmdev.emp FOR EACH ROW 41 | BEGIN 42 | SET NEW.ename = UPPER(NEW.ename); 43 | SET NEW.job = UPPER(NEW.job); 44 | END $$ 45 | DELIMITER ; 46 | 47 | 48 | INSERT INTO cmdev.emp 49 | VALUES (9002, 'mary', 'salesman', 7698, 50 | '2001-01-01', 2000, 200, 30) 51 | -------------------------------------------------------------------------------- /examples/ch15/ch15_05_查詢Triggers的相關資訊.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macdidi5/MySQLTutorial/f44207d5f441171a1c600753f694974c537210da/examples/ch15/ch15_05_查詢Triggers的相關資訊.sql -------------------------------------------------------------------------------- /examples/ch16/ch16_01_information_schema資料庫.sql: -------------------------------------------------------------------------------- 1 | SELECT ROUTINE_TYPE, ROUTINE_NAME, CREATED 2 | FROM information_schema.ROUTINES 3 | 4 | 5 | SELECT TABLE_NAME, COUNT(*) column_count 6 | FROM information_schema.COLUMNS 7 | WHERE TABLE_SCHEMA = 'world' 8 | GROUP BY TABLE_NAME 9 | -------------------------------------------------------------------------------- /examples/ch16/ch16_02_SHOW指令.sql: -------------------------------------------------------------------------------- 1 | SHOW DATABASES LIKE 'w%' 2 | 3 | 4 | SHOW TABLES 5 | 6 | 7 | SHOW TABLES FROM world 8 | 9 | 10 | SHOW TABLES FROM world LIKE 'co%' 11 | 12 | 13 | SHOW TABLE STATUS FROM world LIKE 'co%' 14 | 15 | 16 | SHOW TABLE STATUS FROM world WHERE Rows > 500 17 | 18 | 19 | SHOW COLUMNS FROM country 20 | 21 | 22 | SHOW COLUMNS FROM world.country 23 | 24 | 25 | SHOW COLUMNS FROM country FROM world 26 | 27 | 28 | SHOW INDEX FROM country 29 | 30 | 31 | SHOW INDEX FROM world.country 32 | 33 | 34 | SHOW INDEX FROM country FROM world 35 | 36 | 37 | SHOW TRIGGERS 38 | 39 | 40 | SHOW TRIGGERS FROM cmdev 41 | 42 | 43 | SHOW TRIGGERS FROM cmdev WHERE Timing = 'BEFORE' 44 | 45 | 46 | SHOW CREATE TABLE world.city 47 | 48 | 49 | SHOW CHARACTER SET LIKE 'b%' 50 | 51 | 52 | SHOW CHARACTER SET WHERE Maxlen = 2 53 | 54 | 55 | SHOW STORAGE ENGINES 56 | 57 | 58 | SHOW GLOBAL VARIABLES LIKE 'character%' 59 | -------------------------------------------------------------------------------- /examples/ch16/ch16_03_DESCRIBE指令.sql: -------------------------------------------------------------------------------- 1 | DESC country 2 | 3 | 4 | DESC country Name 5 | 6 | 7 | DESC country 'GNP%' 8 | -------------------------------------------------------------------------------- /examples/ch16/ch16_04_mysqlshow.sql: -------------------------------------------------------------------------------- 1 | mysqlshow -u root 2 | 3 | 4 | mysqlshow -u root world 5 | 6 | 7 | mysqlshow -u root world country 8 | -------------------------------------------------------------------------------- /examples/ch17/ch17_01_錯誤的資料.sql: -------------------------------------------------------------------------------- 1 | SET sql_mode = '' 2 | 3 | 4 | SET sql_mode = 'STRICT_TRANS_TABLES' 5 | 6 | 7 | SET sql_mode = 'STRICT_ALL_TABLES' 8 | 9 | 10 | CREATE TABLE debug ( 11 | fint TINYINT NOT NULL, 12 | fdouble DOUBLE(5, 2), 13 | fchar VARCHAR(3), 14 | fdate DATE DEFAULT '2000-01-01', 15 | ftime TIME, 16 | fdatetime DATETIME, 17 | ftimestamp TIMESTAMP, 18 | fyear YEAR, 19 | fenum ENUM('A', 'B', 'C'), 20 | fset SET('X', 'Y', 'Z') 21 | ) 22 | -------------------------------------------------------------------------------- /examples/ch17/ch17_02_Non_Strict模式.sql: -------------------------------------------------------------------------------- 1 | SET sql_mode = '' 2 | 3 | 4 | SHOW VARIABLES LIKE 'sql_mode' 5 | 6 | 7 | SELECT @@sql_mode 8 | 9 | 10 | SET GLOBAL sql_mode = '' 11 | 12 | 13 | SHOW GLOBAL VARIABLES LIKE 'sql_mode' 14 | 15 | 16 | INSERT INTO debug 17 | VALUES (1, 'ABC', '2000-01-01', '11:22:33', 'A', 'Y') 18 | 19 | 20 | INSERT INTO debug (fint, fchar) VALUES (2, 'ABCDEF') 21 | 22 | 23 | INSERT INTO debug (fset) VALUES ('A,X,B,C,W,M') 24 | 25 | 26 | INSERT INTO debug (fint) VALUES (NULL) 27 | 28 | 29 | INSERT INTO debug (fchar) VALUES ('SAM') 30 | -------------------------------------------------------------------------------- /examples/ch17/ch17_03_其它設定.sql: -------------------------------------------------------------------------------- 1 | SET sql_mode = 'STRICT_ALL_TABLES,ALLOW_INVALID_DATES' 2 | 3 | 4 | INSERT INTO debug (fint, fdate) 5 | VALUES (0, '2000-02-31') 6 | 7 | 8 | SET sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE' 9 | 10 | 11 | SET sql_mode = 'STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO' 12 | 13 | 14 | INSERT INTO debug (fint, fdouble) VALUES (0, 1/0) 15 | -------------------------------------------------------------------------------- /examples/ch17/ch17_04_查詢錯誤與警告.sql: -------------------------------------------------------------------------------- 1 | SET sql_mode = '' 2 | 3 | 4 | INSERT INTO debug (fint, fchar, fdate) 5 | VALUES (255, 'Hello!', '99999-01-01') 6 | 7 | 8 | SHOW WARNINGS 9 | 10 | 11 | DROP TABLE IF EXISTS notexists 12 | 13 | 14 | SHOW WARNINGS 15 | 16 | 17 | SELECT notexists FROM cmdev.emp 18 | 19 | 20 | SHOW ERRORS 21 | 22 | 23 | SELECT * INTO OUTFILE 'C:/hello/mydata.sql' 24 | FROM cmdev.emp 25 | 26 | 27 | perror 2 28 | 29 | 30 | SELECT COUNT(*) WARNINGS 31 | 32 | 33 | SELECT @@warning_count 34 | 35 | 36 | SELECT COUNT(*) ERRORS 37 | 38 | 39 | SELECT @@error_count 40 | -------------------------------------------------------------------------------- /examples/ch18/ch18_02_使用SQL敘述匯出資料.sql: -------------------------------------------------------------------------------- 1 | SELECT * INTO OUTFILE 'C:/cmdev/data/out/dept.txt' 2 | FROM cmdev.dept 3 | 4 | 5 | SELECT * INTO OUTFILE 'C:/cmdev/data/out/dept2.txt' 6 | FIELDS TERMINATED BY '|' 7 | FROM cmdev.dept 8 | 9 | 10 | SELECT * INTO OUTFILE 'C:/cmdev/data/out/dept3.txt' 11 | FIELDS ENCLOSED BY '*' 12 | FROM cmdev.dept 13 | 14 | 15 | SELECT empno, ename, salary, deptno 16 | INTO OUTFILE 'C:/cmdev/data/out/emp.txt' 17 | FROM cmdev.emp 18 | WHERE salary < 1500 19 | 20 | 21 | SELECT empno, ename, salary, deptno 22 | INTO OUTFILE 'C:/cmdev/data/out/emp2.txt' 23 | FIELDS ESCAPED BY '$' 24 | FROM cmdev.emp 25 | WHERE salary < 1500 26 | 27 | 28 | SELECT empno, ename, salary, deptno 29 | INTO OUTFILE 'C:/cmdev/data/out/emp3.txt' 30 | LINES STARTING BY '>>>' TERMINATED BY '\n' 31 | FROM cmdev.emp 32 | WHERE salary < 1500 33 | 34 | 35 | SELECT * INTO OUTFILE 'C:/cmdev/data/out/deptcsv.txt' 36 | FIELDS TERMINATED BY ',' ENCLOSED BY '"' 37 | LINES TERMINATED BY '\r' 38 | FROM cmdev.dept 39 | -------------------------------------------------------------------------------- /examples/ch18/ch18_03_使用SQL敘述匯入資料.sql: -------------------------------------------------------------------------------- 1 | SHOW VARIABLES LIKE 'datadir' 2 | 3 | 4 | LOAD DATA LOCAL INFILE 'C:/cmdev/data/in/newdept.txt' 5 | INTO TABLE cmdev.dept 6 | 7 | 8 | LOAD DATA LOCAL INFILE 'C:/cmdev/data/in/newdeptcsv.txt' 9 | INTO TABLE cmdev.dept 10 | FIELDS TERMINATED BY ',' 11 | ENCLOSED BY '"' 12 | LINES TERMINATED BY '\r' 13 | 14 | 15 | LOAD DATA LOCAL INFILE 'C:/cmdev/data/in/newdept2.txt' 16 | INTO TABLE cmdev.dept 17 | 18 | 19 | LOAD DATA LOCAL INFILE 'C:/cmdev/data/in/newdept2.txt' 20 | INTO TABLE cmdev.dept 21 | IGNORE 1 LINES (deptno, dname) 22 | 23 | 24 | LOAD DATA LOCAL INFILE 'C:/cmdev/data/in/newemp.txt' 25 | INTO TABLE cmdev.emp 26 | (empno, @v_ename, @v_job) 27 | SET ename = UPPER(@v_ename), 28 | job = UPPER(@v_job) 29 | 30 | 31 | LOAD DATA INFILE 'C:/cmdev/data/in/newdept3.txt' 32 | INTO TABLE cmdev.dept 33 | 34 | 35 | LOAD DATA INFILE 'C:/cmdev/data/in/newdept3.txt' 36 | IGNORE INTO TABLE cmdev.dept 37 | 38 | 39 | LOAD DATA INFILE 'C:/cmdev/data/in/newdept4.txt' 40 | REPLACE INTO TABLE cmdev.dept 41 | -------------------------------------------------------------------------------- /examples/ch18/ch18_04_使用mysqldump程式匯出資料.sql: -------------------------------------------------------------------------------- 1 | mysqldump -u root cmdev 2 | 3 | 4 | mysqldump --user=root --result-file=cmdev.sql cmdev 5 | 6 | 7 | mysqldump -u root --tab=C:/cmdev/data/out cmdev dept 8 | -------------------------------------------------------------------------------- /examples/ch18/ch18_05_使用mysqlimport程式匯入資料.sql: -------------------------------------------------------------------------------- 1 | mysqlimport -u root cmdev C:/cmdev/data/in/dept.txt 2 | -------------------------------------------------------------------------------- /examples/ch19/ch19_01_索引.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE test ( 2 | id CHAR(10) PRIMARY KEY, 3 | name VARCHAR(20), 4 | address VARCHAR(255) 5 | ) 6 | 7 | 8 | CREATE INDEX name_index ON test (name) 9 | 10 | 11 | CREATE INDEX addr_index ON test (address) 12 | 13 | 14 | CREATE INDEX addr_index ON test ( address (6) ) 15 | 16 | 17 | SELECT COUNT(*), COUNT(DISTINCT address) 18 | FROM test 19 | 20 | 21 | SELECT COUNT(*), COUNT( DISTINCT LEFT(address, 6) ) 22 | FROM test 23 | -------------------------------------------------------------------------------- /examples/ch19/ch19_02_判斷條件的設定.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE test2 ( 2 | birthdate DATE, 3 | INDEX (birthdate) 4 | ) 5 | 6 | 7 | SELECT * 8 | FROM test2 9 | WHERE YEAR(birthdate) = 1990 10 | 11 | 12 | SELECT * 13 | FROM test2 14 | WHERE birthdate >= '1990-1-1' AND birthdate <= '1990-12-31' 15 | 16 | 17 | SELECT Name, '2000' - IndepYear 18 | FROM country 19 | WHERE GNP < '10000' 20 | 21 | 22 | SELECT Name, 2000 - IndepYear 23 | FROM country 24 | WHERE GNP < 10000 25 | 26 | 27 | SELECT country.Name, city.Name 28 | FROM country, city 29 | WHERE country.Code = city.CountryCode 30 | 31 | 32 | CREATE INDEX countrycode_index ON city ( CountryCode ) 33 | 34 | 35 | CREATE INDEX name_index ON country ( name ) 36 | 37 | 38 | SELECT * FROM country WHERE name LIKE 'ta%' 39 | 40 | 41 | SELECT * FROM country WHERE name LIKE '%ta' 42 | 43 | 44 | SELECT * FROM country WHERE name LIKE '_ta' 45 | 46 | 47 | SHOW INDEX FROM countrylanguage 48 | 49 | 50 | SELECT * 51 | FROM countrylanguage 52 | WHERE CountryCode = 'TWN' 53 | 54 | 55 | SELECT * 56 | FROM countrylanguage 57 | WHERE CountryCode = 'TWN' AND Language = 'Paiwan' 58 | 59 | 60 | SELECT * 61 | FROM countrylanguage 62 | WHERE Language = 'Paiwan' 63 | -------------------------------------------------------------------------------- /examples/ch19/ch19_03_EXPLAIN與查詢敘述.sql: -------------------------------------------------------------------------------- 1 | EXPLAIN 2 | SELECT * FROM country WHERE GNP < 10000 3 | 4 | 5 | EXPLAIN 6 | SELECT * FROM country WHERE Code = 'TWN' 7 | 8 | 9 | EXPLAIN 10 | SELECT Name 11 | FROM country 12 | WHERE Continent = ( SELECT Continent 13 | FROM country 14 | WHERE Code = 'TWN' ) 15 | 16 | EXPLAIN 17 | SELECT * 18 | FROM test2 19 | WHERE YEAR(birthdate) = 1990 20 | 21 | 22 | EXPLAIN 23 | SELECT * 24 | FROM test2 25 | WHERE birthdate >= '1990-1-1' AND birthdate <= '1990-12-31' 26 | -------------------------------------------------------------------------------- /examples/ch19/ch19_04_資料維護.sql: -------------------------------------------------------------------------------- 1 | DELETE FROM country WHERE Code = 'YES' 2 | 3 | 4 | EXPLAIN 5 | SELECT * FROM country WHERE Code = 'YES' 6 | 7 | 8 | INSERT INTO cmdev.emp VALUES 9 | (8001, 'SIMON', 'MANAGER', 7369, '2001-02-03', 3300, NULL, 50) 10 | 11 | 12 | INSERT INTO cmdev.emp VALUES 13 | (8002, 'JOHN', 'PROGRAMMER', 8001, '2002-01-01', 2300, NULL, 50) 14 | 15 | 16 | INSERT INTO cmdev.emp VALUES 17 | (8003, 'GREEN', 'ENGINEER', 8001, '2003-05-01', 2000, NULL, 50) 18 | 19 | 20 | INSERT INTO cmdev.emp VALUES 21 | (8001, 'SIMON', 'MANAGER', 7369, '2001-02-03', 3300, NULL, 50), 22 | (8002, 'JOHN', 'PROGRAMMER', 8001, '2002-01-01', 2300, NULL, 50), 23 | (8003, 'GREEN', 'ENGINEER', 8001, '2003-05-01', 2000, NULL, 50) 24 | -------------------------------------------------------------------------------- /examples/ch19/ch19_05_LIMIT子句.sql: -------------------------------------------------------------------------------- 1 | SELECT * FROM country LIMIT 100, 5 2 | 3 | 4 | SELECT * FROM country ORDER BY Code LIMIT 100, 5 5 | -------------------------------------------------------------------------------- /examples/ch19/ch19_06_使用暫時表格.sql: -------------------------------------------------------------------------------- 1 | SELECT Continent, co.Code, co.Name CountryName, 2 | ci.Name CapitalName, ci.Population CapitalPop 3 | FROM country co, city ci 4 | WHERE co.Capital = ci.ID 5 | ORDER BY Continent, CountryName 6 | 7 | 8 | SELECT Continent, co.Code, co.Name CountryName, 9 | ci.Name CapitalName, ci.Population CapitalPop 10 | FROM country co, city ci 11 | WHERE co.Capital = ci.ID AND ci.Population < 50000 12 | ORDER BY Continent, CountryName 13 | 14 | 15 | SELECT Continent, co.Code, co.Name CountryName, 16 | ci.Name CapitalName, ci.Population CapitalPop, 17 | cola.Language OfficalLanguage 18 | FROM country co, city ci, countrylanguage cola 19 | WHERE co.Capital = ci.ID AND co.Code = cola.CountryCode 20 | AND ci.Population < 50000 AND IsOfficial = 'T' 21 | ORDER BY Continent, CountryName 22 | 23 | 24 | CREATE TABLE countrycapital 25 | SELECT Continent, co.Code, co.Name CountryName, 26 | ci.Name CapitalName, ci.Population CapitalPop 27 | FROM country co, city ci 28 | WHERE co.Capital = ci.ID 29 | ORDER BY Continent, CountryName 30 | 31 | 32 | SELECT * 33 | FROM countrycapital 34 | WHERE CapitalPop < 5000 35 | 36 | 37 | SELECT cc.*, cola.Language OfficalLanguage 38 | FROM countrycapital cc, countrylanguage cola 39 | WHERE cc.Code = cola.CountryCode AND 40 | CapitalPop < 5000 AND IsOfficial = 'T' 41 | 42 | 43 | SELECT cc.*, cola.Language OfficalLanguage 44 | FROM (SELECT Continent, co.Code, co.Name CountryName, 45 | ci.Name CapitalName, ci.Population CapitalPop 46 | FROM country co, city ci 47 | WHERE co.Capital = ci.ID 48 | ORDER BY Continent, CountryName) cc, countrylanguage cola 49 | WHERE cc.Code = cola.CountryCode AND 50 | CapitalPop < 5000 AND IsOfficial = 'T' -------------------------------------------------------------------------------- /resources/cmdev.sql: -------------------------------------------------------------------------------- 1 | DROP DATABASE IF EXISTS cmdev; 2 | 3 | CREATE DATABASE cmdev CHARACTER SET big5; 4 | 5 | USE cmdev; 6 | 7 | DROP TABLE IF EXISTS emp; 8 | 9 | CREATE TABLE emp ( 10 | empno INT NOT NULL, 11 | ename VARCHAR(16) NOT NULL, 12 | job VARCHAR(16), 13 | manager INT, 14 | hiredate DATE, 15 | salary float(7, 2), 16 | comm float(7,2), 17 | deptno INT, 18 | PRIMARY KEY (empno) 19 | ); 20 | 21 | INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20); 22 | INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30); 23 | INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698,'1981-02-22',1250, 500,30); 24 | INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20); 25 | INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30); 26 | INSERT INTO emp VALUES (7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,NULL); 27 | INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); 28 | INSERT INTO emp VALUES (7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20); 29 | INSERT INTO emp VALUES (7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10); 30 | INSERT INTO emp VALUES (7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); 31 | INSERT INTO emp VALUES (7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20); 32 | INSERT INTO emp VALUES (7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,NULL); 33 | INSERT INTO emp VALUES (7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20); 34 | INSERT INTO emp VALUES (7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10); 35 | 36 | DROP TABLE IF EXISTS dept; 37 | 38 | CREATE TABLE dept ( 39 | deptno INT NOT NULL, 40 | dname VARCHAR(16) NOT NULL, 41 | location VARCHAR(16), 42 | PRIMARY KEY (deptno) 43 | ); 44 | 45 | INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK'); 46 | INSERT INTO dept VALUES (20,'RESEARCH','DALLAS'); 47 | INSERT INTO dept VALUES (30,'SALES','CHICAGO'); 48 | INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON'); 49 | INSERT INTO dept VALUES (50,'IT','NEW YORK'); 50 | 51 | DROP TABLE IF EXISTS travel; 52 | 53 | CREATE TABLE travel ( 54 | empno INT NOT NULL, 55 | location VARCHAR(16) NOT NULL, 56 | counter INT NOT NULL, 57 | PRIMARY KEY (empno, location) 58 | ); 59 | 60 | INSERT INTO travel VALUES (7369,'CHICAGO',1); 61 | INSERT INTO travel VALUES (7499,'DALLAS',1); 62 | INSERT INTO travel VALUES (7521,'DALLAS',2); 63 | INSERT INTO travel VALUES (7566,'BOSTON',1); 64 | INSERT INTO travel VALUES (7654,'NEW YORK',1); 65 | 66 | 67 | CREATE TABLE integertable ( 68 | n TINYINT, 69 | n2 SMALLINT, 70 | n3 MEDIUMINT, 71 | n4 INT, 72 | n5 BIGINT 73 | ); 74 | 75 | CREATE TABLE floatingable ( 76 | n FLOAT, 77 | n2 DOUBLE, 78 | n3 DECIMAL 79 | ); 80 | 81 | CREATE TABLE numerictable ( 82 | i TINYINT UNSIGNED, 83 | i2 SMALLINT UNSIGNED, 84 | i3 MEDIUMINT UNSIGNED, 85 | i4 INT, 86 | i5 BIGINT UNSIGNED, 87 | f FLOAT UNSIGNED, 88 | f2 DOUBLE, 89 | f3 DECIMAL UNSIGNED 90 | ); 91 | 92 | CREATE TABLE numerictable2 ( 93 | i TINYINT(3), 94 | i2 SMALLINT(3), 95 | i3 MEDIUMINT(3), 96 | i4 INT(3), 97 | i5 BIGINT(3), 98 | f FLOAT(5, 2), 99 | f2 DOUBLE(5, 2), 100 | f3 DECIMAL(5, 2) 101 | ); 102 | 103 | CREATE TABLE numerictable3 ( 104 | i TINYINT(3) UNSIGNED ZEROFILL, 105 | i2 SMALLINT(4) UNSIGNED ZEROFILL, 106 | i3 MEDIUMINT(5) UNSIGNED ZEROFILL, 107 | i4 INT(6) UNSIGNED ZEROFILL, 108 | i5 BIGINT(7) UNSIGNED ZEROFILL, 109 | f FLOAT(5, 2) UNSIGNED ZEROFILL, 110 | f2 DOUBLE(7, 3) UNSIGNED ZEROFILL, 111 | f3 DECIMAL(9, 5) UNSIGNED ZEROFILL 112 | ); 113 | 114 | CREATE TABLE bittable ( 115 | n BIT, 116 | n2 BIT(8), 117 | n3 BIT(64) 118 | ); 119 | 120 | CREATE TABLE nonbinarytable ( 121 | s CHAR(10), 122 | s2 VARCHAR(10) 123 | ); 124 | 125 | CREATE TABLE nonbinarytable2 ( 126 | s VARCHAR(6) CHARACTER SET latin1, 127 | s2 VARCHAR(6) CHARACTER SET big5, 128 | s3 VARCHAR(6) CHARACTER SET utf8 129 | ); 130 | 131 | -- INSERT INTO nonbinarytable2 VALUES ('abc', 'abc', 'abc'); 132 | -- INSERT INTO nonbinarytable2 VALUES ('abcdef', 'abcdef', 'abcdef'); 133 | -- INSERT INTO nonbinarytable2 VALUES ('abc', '一二三', '一二三'); 134 | -- INSERT INTO nonbinarytable2 VALUES ('abcdef', '一二三四五六', '一二三四五六'); 135 | -- INSERT INTO nonbinarytable2 VALUES ('abcdef', '一二三abc', '一二三abc'); 136 | INSERT INTO nonbinarytable2 VALUES ('abc', 'abc', 'abc'); 137 | INSERT INTO nonbinarytable2 VALUES ('abcdef', 'abcdef', 'abcdef'); 138 | INSERT INTO nonbinarytable2 VALUES ('abc', '@GT', '@GT'); 139 | INSERT INTO nonbinarytable2 VALUES ('abcdef', '@GTabc', '@GTabc'); 140 | INSERT INTO nonbinarytable2 VALUES ('abcdef', '@GT|', '@GT|'); 141 | 142 | CREATE TABLE nonbinarytable3 ( 143 | n int, 144 | s VARCHAR(20) CHARACTER SET latin1 COLLATE latin1_general_ci, 145 | s2 VARCHAR(20) CHARACTER SET latin1 COLLATE latin1_general_cs 146 | ); 147 | 148 | INSERT INTO nonbinarytable3 149 | VALUES (1, 'aaa', 'aaa'),(2, 'AAA', 'AAA'), 150 | (3, 'bbb', 'bbb'),(4, 'BBB', 'BBB'), 151 | (5, 'abc', 'abc'),(6, 'ABC', 'ABC'); 152 | 153 | 154 | CREATE TABLE binarytable ( 155 | b BINARY(6), 156 | b2 VARBINARY(6) 157 | ); 158 | 159 | INSERT INTO binarytable VALUES ('a', 'a'); 160 | INSERT INTO binarytable VALUES ('abc', 'abc'); 161 | INSERT INTO binarytable VALUES ('abcdef', 'abcdef'); 162 | 163 | 164 | CREATE TABLE enumtable ( 165 | enumsize ENUM('XS', 'S', 'M', 'L', 'XL'), 166 | stringsize VARCHAR(2) 167 | ); 168 | 169 | CREATE TABLE settable ( 170 | workingday SET('MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN') 171 | ); 172 | 173 | CREATE TABLE estable ( 174 | enumsize ENUM('XS', 'S', 'M', 'L', 'XL') CHARACTER SET latin1 COLLATE latin1_general_ci, 175 | enumsize2 ENUM('XS', 'S', 'M', 'L', 'XL') CHARACTER SET latin1 COLLATE latin1_general_cs, 176 | workingday SET('MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN') CHARACTER SET latin1 COLLATE latin1_general_ci, 177 | workingday2 SET('MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN') CHARACTER SET latin1 COLLATE latin1_general_cs 178 | ); 179 | 180 | INSERT INTO estable 181 | VALUES (1, 1, 21, 21), 182 | ('M','M','MON','MON'), 183 | ('M','M','mon','MON'); 184 | 185 | CREATE TABLE dttable ( 186 | y4 YEAR(4), 187 | y2 YEAR(2), 188 | d DATE, 189 | t TIME, 190 | dt DATETIME, 191 | ts TIMESTAMP 192 | ); 193 | 194 | DROP TABLE IF EXISTS deptlog; 195 | 196 | CREATE TABLE deptlog ( 197 | logno SERIAL, 198 | logdt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 199 | message VARCHAR(64) 200 | ); 201 | 202 | DROP TABLE IF EXISTS emplog; 203 | 204 | CREATE TABLE emplog ( 205 | logno bigint(20) unsigned NOT NULL AUTO_INCREMENT, 206 | logdt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 207 | message varchar(64), 208 | PRIMARY KEY logno (logno) 209 | ); 210 | 211 | CREATE TABLE debug ( 212 | fint TINYINT NOT NULL, 213 | fdouble DOUBLE(5, 2), 214 | fchar VARCHAR(3), 215 | fdate DATE DEFAULT '2000-01-01', 216 | ftime TIME, 217 | fdatetime DATETIME, 218 | ftimestamp TIMESTAMP, 219 | fyear YEAR, 220 | fenum ENUM('A', 'B', 'C'), 221 | fset SET('X', 'Y', 'Z') 222 | ); -------------------------------------------------------------------------------- /solutions/ch01/empty.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macdidi5/MySQLTutorial/f44207d5f441171a1c600753f694974c537210da/solutions/ch01/empty.txt -------------------------------------------------------------------------------- /solutions/ch02/ch02_01.sql: -------------------------------------------------------------------------------- 1 | SELECT Code2, Continent, Region, Name 2 | FROM country 3 | 4 | 5 | SELECT Code2, Name, Population DIV 1000 6 | FROM country 7 | 8 | 9 | SELECT Code2, Name, Population DIV 1000 AS 'Thousands of Pop.' 10 | FROM country 11 | -------------------------------------------------------------------------------- /solutions/ch02/ch02_02.sql: -------------------------------------------------------------------------------- 1 | SELECT CountryCode, Name, Population 2 | FROM city 3 | WHERE Population > 5000000 4 | 5 | 6 | SELECT CountryCode, Name, Population 7 | FROM city 8 | WHERE Population >= 1000000 AND 9 | Population <= 2000000 10 | 11 | 12 | SELECT CountryCode, Name, Population 13 | FROM city 14 | WHERE Population >= 1000000 AND 15 | Population <= 2000000 AND 16 | CountryCode = 'JPN' 17 | -------------------------------------------------------------------------------- /solutions/ch02/ch02_03.sql: -------------------------------------------------------------------------------- 1 | SELECT Continent, Code, Name, Population 2 | FROM country 3 | WHERE Continent = 'Asia' OR 4 | Continent = 'Europe' OR 5 | Continent = 'Africa' 6 | 7 | =================== OR ========================== 8 | 9 | SELECT Continent, Code, Name, Population 10 | FROM country 11 | WHERE Continent IN ('Asia', 'Europe', 'Africa') 12 | 13 | 14 | SELECT Continent, Code2, Name 15 | FROM country 16 | WHERE Continent = 'Africa' AND 17 | IndepYear IS NULL 18 | 19 | 20 | SELECT Code2, Name, Population 21 | FROM country 22 | WHERE Name LIKE 'Ta%' 23 | 24 | 25 | SELECT Code2, Name, Population 26 | FROM country 27 | WHERE Name LIKE 'Ta____' 28 | -------------------------------------------------------------------------------- /solutions/ch02/ch02_04.sql: -------------------------------------------------------------------------------- 1 | SELECT Code, Name, Population 2 | FROM country 3 | WHERE Region = 'Middle East' 4 | ORDER BY Population 5 | 6 | 7 | SELECT Code, Name, Population 8 | FROM country 9 | WHERE Region = 'Middle East' 10 | ORDER BY Population DESC 11 | 12 | 13 | SELECT Code, Name, Population 14 | FROM country 15 | WHERE Region = 'Middle East' 16 | ORDER BY Population DESC 17 | LIMIT 3 18 | 19 | 20 | SELECT Code, Name, Population 21 | FROM country 22 | WHERE Region = 'Middle East' 23 | ORDER BY Population DESC 24 | LIMIT 4, 6 25 | -------------------------------------------------------------------------------- /solutions/ch03/ch03_01.sql: -------------------------------------------------------------------------------- 1 | SELECT empno, ename, LPAD(salary, 12, '$') salary 2 | FROM cmdev.emp 3 | 4 | 5 | SELECT empno, ename, Length(ename) length 6 | FROM cmdev.emp 7 | 8 | 9 | SELECT ename, REPEAT('*',salary DIV 100) chart 10 | FROM cmdev.emp 11 | ORDER BY salary DESC 12 | 13 | 14 | SELECT empno, ename, salary, ROUND(salary * 1.25) newsalary 15 | FROM cmdev.emp 16 | 17 | 18 | SELECT empno, ename, salary, ROUND(salary * 1.25) newsalary, 19 | ROUND(salary * 0.25) increase 20 | FROM cmdev.emp 21 | -------------------------------------------------------------------------------- /solutions/ch03/ch03_02.sql: -------------------------------------------------------------------------------- 1 | SELECT empno, ename, hiredate, DAYNAME(hiredate) day 2 | FROM cmdev.emp 3 | 4 | 5 | SELECT empno, ename, hiredate, DAYNAME(hiredate) day 6 | FROM cmdev.emp 7 | WHERE DAYOFWEEK(hiredate) = 3 8 | 9 | 10 | SELECT empno, ename, hiredate, hiredate - INTERVAL 3 MONTH probationdate 11 | FROM cmdev.emp 12 | -------------------------------------------------------------------------------- /solutions/ch03/ch03_03.sql: -------------------------------------------------------------------------------- 1 | SELECT ename, job, salary, 2 | CASE job 3 | WHEN 'PRESIDENT' THEN salary * 2 4 | WHEN 'MANAGER' THEN salary * 1.5 5 | WHEN 'ANALYST' THEN salary * 1 6 | ELSE 0 7 | END bonus 8 | FROM cmdev.emp 9 | 10 | 11 | SELECT empno, ename, IFNULL(deptno, 'No dept no') deptno 12 | FROM cmdev.emp 13 | -------------------------------------------------------------------------------- /solutions/ch03/ch03_04.sql: -------------------------------------------------------------------------------- 1 | SELECT job, SUM(salary) Sum, AVG(salary) Average, 2 | MAX(salary) Maximum, MIN(salary) Minimum 3 | FROM cmdev.emp 4 | GROUP BY job 5 | 6 | 7 | SELECT Region, COUNT(*) 'Number of countries' 8 | FROM country 9 | GROUP BY Region 10 | 11 | 12 | SELECT Region, COUNT(*) 'Number of countries' 13 | FROM country 14 | GROUP BY Region 15 | HAVING COUNT(*) > 12 16 | 17 | 18 | SELECT job, SUM(CASE deptno WHEN 10 THEN salary ELSE 0 END) 'Dept 10', 19 | SUM(CASE deptno WHEN 20 THEN salary ELSE 0 END) 'Dept 20', 20 | SUM(CASE deptno WHEN 30 THEN salary ELSE 0 END) 'Dept 30', 21 | SUM(salary) Total 22 | FROM cmdev.emp 23 | GROUP BY job 24 | -------------------------------------------------------------------------------- /solutions/ch04/ch04_01.sql: -------------------------------------------------------------------------------- 1 | SELECT empno, ename, job, e.deptno, dname 2 | FROM cmdev.emp e, cmdev.dept d 3 | WHERE e.deptno = d.deptno 4 | 5 | 6 | SELECT empno, ename, job, e.deptno, dname 7 | FROM cmdev.emp e, cmdev.dept d 8 | WHERE e.deptno = d.deptno AND 9 | e.deptno = 20 10 | 11 | 12 | SELECT e.empno, e.ename, 13 | m.empno 'Manager empno', m.ename 'Manager ename' 14 | FROM cmdev.emp e, cmdev.emp m 15 | WHERE e.manager = m.empno 16 | 17 | 18 | -------------------------------------------------------------------------------- /solutions/ch04/ch04_02.sql: -------------------------------------------------------------------------------- 1 | SELECT empno, ename, job, e.deptno, dname 2 | FROM cmdev.emp e LEFT OUTER JOIN cmdev.dept d USING(deptno) 3 | 4 | 5 | SELECT empno, ename, job, 6 | IFNULL(e.deptno, '') deptno, IFNULL(dname, '') dname 7 | FROM cmdev.emp e LEFT OUTER JOIN cmdev.dept d USING(deptno) 8 | -------------------------------------------------------------------------------- /solutions/ch04/ch04_03.sql: -------------------------------------------------------------------------------- 1 | SELECT 'Minimum' AS 'Asia', MIN(Population) Population 2 | FROM country 3 | WHERE Continent = 'Asia' 4 | UNION 5 | SELECT 'Maximum', MAX(Population) Population 6 | FROM country 7 | WHERE Continent = 'Asia' 8 | -------------------------------------------------------------------------------- /solutions/ch05/ch05_01.sql: -------------------------------------------------------------------------------- 1 | DESC cmdev.myemp 2 | -------------------------------------------------------------------------------- /solutions/ch05/ch05_02.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO cmdev.myemp VALUES (1, 'Betty', 'Johnson', 1200, '1968-01-06') 2 | 3 | 4 | INSERT INTO cmdev.myemp VALUES (2, 'Sam', 'Johnson', 900, '1972-09-12') 5 | 6 | 7 | INSERT INTO cmdev.myemp VALUES (3, 'Rose', 'Johnson', 1100, '1971-11-6') 8 | 9 | 10 | SELECT * FROM cmdev.myemp 11 | 12 | 13 | INSERT INTO cmdev.myemp VALUES 14 | (4, 'Bruce', 'Lerry', 950, '1972-8-13'), 15 | (5, 'Jenny', 'Lerry', 850, '1972-12-1') 16 | 17 | 18 | SELECT * FROM cmdev.myemp 19 | -------------------------------------------------------------------------------- /solutions/ch05/ch05_03.sql: -------------------------------------------------------------------------------- 1 | UPDATE cmdev.myemp SET lastname = 'Newman' 2 | WHERE id IN (1, 3) 3 | 4 | 5 | UPDATE cmdev.myemp SET salary = 1000 6 | WHERE salary < 1000 7 | 8 | 9 | UPDATE cmdev.myemp 10 | SET salary = salary + 550 11 | ORDER BY birthdate 12 | LIMIT 2 13 | 14 | 15 | SELECT * FROM cmdev.myemp 16 | -------------------------------------------------------------------------------- /solutions/ch05/ch05_04.sql: -------------------------------------------------------------------------------- 1 | DELETE FROM cmdev.myemp WHERE id = 2 2 | 3 | 4 | DELETE FROM cmdev.myemp ORDER BY birthdate DESC LIMIT 1 5 | -------------------------------------------------------------------------------- /solutions/ch06/ch06_01.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE mylab 2 | 3 | 4 | SHOW DATABASES 5 | 6 | 7 | SELECT * FROM information_schema.SCHEMATA 8 | 9 | 10 | ALTER DATABASE mylab CHARACTER SET utf8 11 | 12 | 13 | SELECT * FROM information_schema.SCHEMATA 14 | -------------------------------------------------------------------------------- /solutions/ch07/empty.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macdidi5/MySQLTutorial/f44207d5f441171a1c600753f694974c537210da/solutions/ch07/empty.txt -------------------------------------------------------------------------------- /solutions/ch08/Lab08_all.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE pet ( 2 | id SERIAL, 3 | name VARCHAR(30) NOT NULL, 4 | owner VARCHAR(30), 5 | species VARCHAR(30), 6 | gender ENUM('m','f'), 7 | birth DATE 8 | ); 9 | 10 | 11 | CREATE TABLE event ( 12 | id BIGINT UNSIGNED NOT NULL, 13 | edate DATE NOT NULL, 14 | etype VARCHAR(15) NOT NULL, 15 | remark VARCHAR(255) 16 | ); 17 | 18 | INSERT INTO pet (id,name,owner,species,gender,birth) VALUES (0,'Fluffy','Harold','cat','f','1993-02-04'); 19 | INSERT INTO pet (id,name,owner,species,gender,birth) VALUES (0,'Claws','Gwen','cat','m','1994-03-17'); 20 | INSERT INTO pet (id,name,owner,species,gender,birth) VALUES (0,'Buffy','Harold','dog','f','1989-05-13'); 21 | INSERT INTO pet (id,name,owner,species,gender,birth) VALUES (0,'Fang','Benny','dog','m','1990-08-27'); 22 | INSERT INTO pet (id,name,owner,species,gender,birth) VALUES (0,'Chirpy','Gwen','bird','f','1998-09-11'); 23 | INSERT INTO pet (id,name,owner,species,gender,birth) VALUES (0,'Whistler','Gwen','bird',NULL,'1997-12-09'); 24 | INSERT INTO pet (id,name,owner,species,gender,birth) VALUES (0,'Slim','Benny','snake','m','1996-04-29'); 25 | 26 | INSERT INTO event (id,edate,etype,remark) VALUES (1,'1995-05-15','litter','4 kittens, 3 female, 1 male'); 27 | INSERT INTO event (id,edate,etype,remark) VALUES (3,'1993-06-23','litter','5 puppies, 2 female, 3 male'); 28 | INSERT INTO event (id,edate,etype,remark) VALUES (3,'1994-06-19','litter','3 puppies, 3 female'); 29 | INSERT INTO event (id,edate,etype,remark) VALUES (5,'1999-03-21','vet','needed beak straightened'); 30 | INSERT INTO event (id,edate,etype,remark) VALUES (7,'1997-08-03','vet','broken rib'); 31 | INSERT INTO event (id,edate,etype,remark) VALUES (4,'1991-10-12','kennel',NULL); 32 | INSERT INTO event (id,edate,etype,remark) VALUES (4,'1998-08-28','birthday','Gave him a new chew toy'); 33 | INSERT INTO event (id,edate,etype,remark) VALUES (2,'1998-03-17','birthday','Gave him a new flea collar'); 34 | INSERT INTO event (id,edate,etype,remark) VALUES (6,'1998-12-09','birthday','First birthday'); 35 | 36 | ALTER TABLE event 37 | MODIFY edate TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 38 | 39 | INSERT INTO event (id, etype, remark) 40 | VALUES (4, 'vet', 'Broken leg'); 41 | 42 | INSERT INTO pet 43 | VALUES (0, 'Kingkon', 'Simon', 'dog', 'm', '1990-9-13'); 44 | 45 | INSERT INTO event (id, etype) 46 | VALUES (LAST_INSERT_ID(), 'kennel'); 47 | 48 | ALTER TABLE pet ADD INDEX pet_name_index (name); 49 | 50 | CREATE INDEX pet_owner_index ON pet (owner); 51 | 52 | DROP INDEX pet_owner_index ON pet; 53 | 54 | -------------------------------------------------------------------------------- /solutions/ch08/ch08_01.sql: -------------------------------------------------------------------------------- 1 | USE mylab 2 | 3 | 4 | CREATE TABLE pet ( 5 | id SERIAL, 6 | name VARCHAR(30) NOT NULL, 7 | owner VARCHAR(30), 8 | species VARCHAR(30), 9 | gender ENUM('m','f'), 10 | birth DATE 11 | ) 12 | 13 | 14 | CREATE TABLE event ( 15 | id BIGINT UNSIGNED NOT NULL, 16 | edate DATE NOT NULL, 17 | etype VARCHAR(15) NOT NULL, 18 | remark VARCHAR(255) 19 | ) 20 | 21 | 22 | SELECT * FROM pet 23 | 24 | 25 | SELECT * FROM event 26 | 27 | 28 | SELECT p.id, name, owner, edate, etype 29 | FROM pet p, event e 30 | WHERE p.id = e.id 31 | -------------------------------------------------------------------------------- /solutions/ch08/ch08_02.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE event 2 | MODIFY edate TIMESTAMP DEFAULT CURRENT_TIMESTAMP 3 | 4 | 5 | DESC event 6 | 7 | 8 | INSERT INTO event (id, etype, remark) 9 | VALUES (4, 'vet', 'Broken leg') 10 | 11 | 12 | SELECT * FROM event WHERE id = 4 13 | 14 | 15 | INSERT INTO pet 16 | VALUES (0, 'Kingkon', 'Simon', 'dog', 'm', '1990-9-13') 17 | 18 | 19 | INSERT INTO event (id, etype) 20 | VALUES (LAST_INSERT_ID(), 'kennel') 21 | 22 | 23 | SELECT * FROM pet WHERE name = 'Kingkon' 24 | 25 | 26 | SELECT * FROM event WHERE id = 8 27 | -------------------------------------------------------------------------------- /solutions/ch08/ch08_03.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE pet ADD INDEX pet_name_index (name) 2 | 3 | 4 | CREATE INDEX pet_owner_index ON pet (owner) 5 | 6 | 7 | SHOW INDEX FROM pet 8 | 9 | 10 | DROP INDEX pet_owner_index ON pet 11 | 12 | 13 | SHOW INDEX FROM pet 14 | -------------------------------------------------------------------------------- /solutions/ch09/ch09_01.sql: -------------------------------------------------------------------------------- 1 | SELECT * 2 | FROM pet 3 | WHERE owner = ( SELECT owner 4 | FROM pet 5 | WHERE name = 'Whistler' ) 6 | 7 | 8 | SELECT * 9 | FROM pet 10 | WHERE birth < ( SELECT birth 11 | FROM pet 12 | WHERE name = 'Slim' ) 13 | 14 | 15 | SELECT * 16 | FROM pet 17 | WHERE (species, gender) = ( SELECT species, gender 18 | FROM pet 19 | WHERE name = 'Fang' ) 20 | 21 | 22 | SELECT * 23 | FROM pet 24 | WHERE id IN ( SELECT id 25 | FROM event 26 | GROUP BY id 27 | HAVING COUNT(*) > 1 ) 28 | -------------------------------------------------------------------------------- /solutions/ch09/ch09_02.sql: -------------------------------------------------------------------------------- 1 | SELECT CONCAT( 'Male: ', 2 | ( SELECT COUNT(*) FROM pet WHERE gender = 'm' GROUP BY gender), 3 | ', Female: ', 4 | ( SELECT COUNT(*) FROM pet WHERE gender = 'f' GROUP BY gender) ) 5 | AS 'Pet Statistics' 6 | -------------------------------------------------------------------------------- /solutions/ch09/ch09_03.sql: -------------------------------------------------------------------------------- 1 | SELECT * 2 | FROM pet p 3 | WHERE birth = ( SELECT MIN(birth) 4 | FROM pet 5 | WHERE species = p.species ) 6 | 7 | 8 | SELECT * 9 | FROM pet p 10 | WHERE (species, birth) IN ( SELECT species, MIN(birth) 11 | FROM pet 12 | GROUP BY species ) 13 | -------------------------------------------------------------------------------- /solutions/ch10/Lab10_all.sql: -------------------------------------------------------------------------------- 1 | CREATE VIEW PetEvent AS 2 | SELECT p.id, name, owner, species, edate, etype 3 | FROM pet p, event e 4 | WHERE p.id = e.id; 5 | 6 | CREATE OR REPLACE VIEW PetEvent AS 7 | SELECT p.id, name, owner, species, gender, birth, edate, etype 8 | FROM pet p, event e 9 | WHERE p.id = e.id; 10 | 11 | CREATE VIEW PetCatMale AS 12 | SELECT id, name, owner, birth 13 | FROM pet 14 | WHERE species = 'Cat' AND gender = 'm'; 15 | 16 | UPDATE PetCatMale SET name = 'Hello' WHERE id = 2; 17 | 18 | INSERT INTO PetCatMale VALUES (0, 'Danel', 'Sandra', '1998-12-3'); 19 | 20 | UPDATE pet SET species = 'Cat', gender = 'm' WHERE id = 9; 21 | 22 | CREATE OR REPLACE VIEW PetCatMale AS 23 | SELECT id, name, owner, birth 24 | FROM pet 25 | WHERE species = 'Cat' AND gender = 'm' 26 | WITH CHECK OPTION; 27 | 28 | INSERT INTO pet VALUES (0, 'Tiger', 'Sandra', 'Cat', 'm', '1998-12-18'); 29 | -------------------------------------------------------------------------------- /solutions/ch10/ch10_01.sql: -------------------------------------------------------------------------------- 1 | CREATE VIEW PetEvent AS 2 | SELECT p.id, name, owner, species, edate, etype 3 | FROM pet p, event e 4 | WHERE p.id = e.id 5 | 6 | 7 | SELECT * FROM PetEvent 8 | 9 | 10 | CREATE OR REPLACE VIEW PetEvent AS 11 | SELECT p.id, name, owner, species, gender, birth, edate, etype 12 | FROM pet p, event e 13 | WHERE p.id = e.id 14 | 15 | 16 | SELECT * FROM PetEvent 17 | -------------------------------------------------------------------------------- /solutions/ch10/ch10_02.sql: -------------------------------------------------------------------------------- 1 | CREATE VIEW PetCatMale AS 2 | SELECT id, name, owner, birth 3 | FROM pet 4 | WHERE species = 'Cat' AND gender = 'm' 5 | 6 | 7 | SELECT * FROM PetCatMale 8 | 9 | 10 | UPDATE PetCatMale SET name = 'Hello' WHERE id = 2 11 | 12 | 13 | SELECT * FROM PetCatMale WHERE id = 2 14 | 15 | 16 | SELECT * FROM pet WHERE id = 2 17 | 18 | 19 | INSERT INTO PetCatMale VALUES (0, 'Danel', 'Sandra', '1998-12-3') 20 | 21 | 22 | SELECT * FROM PetCatMale WHERE name = 'Danel' 23 | 24 | 25 | SELECT * FROM pet WHERE name = 'Danel' 26 | 27 | 28 | UPDATE pet SET species = 'Cat', gender = 'm' WHERE id = 9 29 | 30 | 31 | CREATE OR REPLACE VIEW PetCatMale AS 32 | SELECT id, name, owner, birth 33 | FROM pet 34 | WHERE species = 'Cat' AND gender = 'm' 35 | WITH CHECK OPTION 36 | 37 | 38 | INSERT INTO PetCatMale VALUES (0, 'Tiger', 'Sandra', '1998-12-18') 39 | 40 | 41 | INSERT INTO pet VALUES (0, 'Tiger', 'Sandra', 'Cat', 'm', '1998-12-18') 42 | 43 | 44 | SELECT * FROM PetCatMale 45 | -------------------------------------------------------------------------------- /solutions/ch11/ch11_01.sql: -------------------------------------------------------------------------------- 1 | mysql -u root 2 | 3 | 4 | USE mylab; 5 | 6 | 7 | PREPARE FindPet FROM 8 | 'SELECT * FROM pet WHERE name = ?'; 9 | 10 | 11 | SET @my_name = 'Slim'; 12 | 13 | 14 | EXECUTE FindPet USING @my_name; 15 | 16 | 17 | SET @my_name = 'Buffy'; 18 | 19 | 20 | EXECUTE FindPet USING @my_name; 21 | -------------------------------------------------------------------------------- /solutions/ch11/ch11_02.sql: -------------------------------------------------------------------------------- 1 | mysql -u root 2 | 3 | 4 | USE mylab; 5 | 6 | 7 | PREPARE NewPet FROM 8 | 'INSERT INTO pet VALUES (0, ?, ?, ?, ?, ?)'; 9 | 10 | 11 | PREPARE NewPetEvent FROM 12 | 'INSERT INTO event (id, etype, remark) VALUES (LAST_INSERT_ID(), ?, ?)'; 13 | 14 | 15 | SET @my_name='Lucky', @my_owner='John', @my_species='dog', @my_gender='m', @my_birth='1999-1-3'; 16 | 17 | 18 | EXECUTE NewPet USING @my_name, @my_owner, @my_species, @my_gender, @my_birth; 19 | 20 | 21 | SET @my_etype='kennel', @my_remark=NULL; 22 | 23 | 24 | EXECUTE NewPetEvent USING @my_etype, @my_remark; 25 | 26 | 27 | SELECT * FROM pet WHERE name='Lucky'; 28 | 29 | 30 | SELECT * FROM event WHERE id= 11; 31 | -------------------------------------------------------------------------------- /solutions/ch12/ch12_01.sql: -------------------------------------------------------------------------------- 1 | ================ Stored Function: mylab.HELLO ================ 2 | 3 | DELIMITER $$ 4 | 5 | DROP FUNCTION IF EXISTS mylab.HELLO $$ 6 | CREATE FUNCTION mylab.HELLO ( p_name VARCHAR(24) ) RETURNS VARCHAR(32) 7 | BEGIN 8 | RETURN CONCAT('Hello! ', p_name, '!'); 9 | END $$ 10 | 11 | DELIMITER ; 12 | 13 | =============================================================== 14 | 15 | 16 | SELECT HELLO('Simon') 17 | -------------------------------------------------------------------------------- /solutions/ch12/ch12_02.sql: -------------------------------------------------------------------------------- 1 | ================ Stored Procedure: mylab.HELLO ================ 2 | 3 | DELIMITER $$ 4 | 5 | DROP PROCEDURE IF EXISTS mylab.CountPetEvent $$ 6 | CREATE PROCEDURE mylab.CountPetEvent (IN p_id BIGINT, OUT p_count INT) 7 | BEGIN 8 | SELECT COUNT(*) INTO p_count 9 | FROM event 10 | WHERE id = p_id; 11 | END $$ 12 | 13 | DELIMITER ; 14 | 15 | =============================================================== 16 | 17 | 18 | CALL CountPetEvent(4, @my_count) 19 | 20 | 21 | SELECT @my_count 22 | -------------------------------------------------------------------------------- /solutions/ch13/ch13_01.sql: -------------------------------------------------------------------------------- 1 | ================ Stored Function: mylab.MYMAX ================ 2 | 3 | DELIMITER $$ 4 | 5 | DROP FUNCTION IF EXISTS mylab.MYMAX $$ 6 | CREATE FUNCTION mylab.MYMAX (p_num INT, p_num2 INT) RETURNS INT 7 | BEGIN 8 | DECLARE v_return INT; 9 | 10 | IF p_num > p_num2 THEN 11 | SET v_return = p_num; 12 | ELSE 13 | SET v_return = p_num2; 14 | END IF; 15 | 16 | RETURN v_return; 17 | END $$ 18 | 19 | DELIMITER ; 20 | 21 | =============================================================== 22 | 23 | 24 | SELECT MYMAX(3, 5) 25 | -------------------------------------------------------------------------------- /solutions/ch13/ch13_02.sql: -------------------------------------------------------------------------------- 1 | ================ Stored Function: mylab.MYBONUS ================ 2 | 3 | DELIMITER $$ 4 | 5 | DROP FUNCTION IF EXISTS mylab.MYBONUS $$ 6 | CREATE FUNCTION mylab.MYBONUS ( p_grade CHAR(1) ) RETURNS INT 7 | BEGIN 8 | DECLARE v_return INT; 9 | 10 | CASE p_grade 11 | WHEN 'A' THEN SET v_return = 5000; 12 | WHEN 'B' THEN SET v_return = 3000; 13 | WHEN 'C' THEN SET v_return = 1000; 14 | ELSE SET v_return = 500; 15 | END CASE; 16 | 17 | RETURN v_return; 18 | END $$ 19 | 20 | DELIMITER ; 21 | 22 | ================================================================= 23 | 24 | 25 | SELECT MYBONUS('C') 26 | -------------------------------------------------------------------------------- /solutions/ch13/ch13_03.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE testloop ( 2 | number INT 3 | ) 4 | 5 | 6 | ================ Stored Procedure: mylab.MYWHILE ================ 7 | 8 | DELIMITER $$ 9 | 10 | DROP PROCEDURE IF EXISTS mylab.MYWHILE $$ 11 | CREATE PROCEDURE mylab.MYWHILE () 12 | BEGIN 13 | DECLARE v_rec_count INT; 14 | DECLARE v_start INT; 15 | DECLARE v_end INT; 16 | 17 | SELECT COUNT(*) INTO v_rec_count FROM testloop; 18 | 19 | SET v_start = v_rec_count + 1; 20 | SET v_end = v_start + 3; 21 | 22 | WHILE v_start < v_end DO 23 | INSERT INTO testloop VALUES (v_start); 24 | SET v_start = v_start + 1; 25 | END WHILE; 26 | 27 | SELECT * FROM testloop; 28 | END $$ 29 | 30 | DELIMITER ; 31 | 32 | ================================================================= 33 | 34 | 35 | CALL MYWHILE() 36 | 37 | 38 | CALL MYWHILE() 39 | -------------------------------------------------------------------------------- /solutions/ch13/ch13_04.sql: -------------------------------------------------------------------------------- 1 | ================ Stored Procedure: mylab.MYREPEAT ================ 2 | 3 | DELIMITER $$ 4 | 5 | DROP PROCEDURE IF EXISTS mylab.MYREPEAT $$ 6 | CREATE PROCEDURE mylab.MYREPEAT () 7 | BEGIN 8 | DECLARE v_rec_count INT; 9 | DECLARE v_start INT; 10 | DECLARE v_end INT; 11 | 12 | SELECT COUNT(*) INTO v_rec_count FROM testloop; 13 | 14 | SET v_start = v_rec_count + 1; 15 | SET v_end = v_start + 3; 16 | 17 | REPEAT 18 | INSERT INTO testloop VALUES (v_start); 19 | SET v_start = v_start + 1; 20 | UNTIL v_start = v_end 21 | END REPEAT; 22 | 23 | SELECT * FROM testloop; 24 | END $$ 25 | 26 | DELIMITER ; 27 | 28 | ================================================================= 29 | 30 | 31 | CALL MYREPEAT() 32 | 33 | 34 | CALL MYREPEAT() 35 | -------------------------------------------------------------------------------- /solutions/ch13/ch13_05.sql: -------------------------------------------------------------------------------- 1 | ================ Stored Procedure: mylab.MYLOOP ================ 2 | 3 | DELIMITER $$ 4 | 5 | DROP PROCEDURE IF EXISTS mylab.MYLOOP $$ 6 | CREATE PROCEDURE mylab.MYLOOP () 7 | BEGIN 8 | DECLARE v_rec_count INT; 9 | DECLARE v_start INT; 10 | DECLARE v_end INT; 11 | 12 | SELECT COUNT(*) INTO v_rec_count FROM testloop; 13 | 14 | SET v_start = v_rec_count + 1; 15 | SET v_end = v_start + 3; 16 | 17 | new_rec: LOOP 18 | INSERT INTO testloop VALUES (v_start); 19 | SET v_start = v_start + 1; 20 | 21 | IF v_start = v_end THEN 22 | LEAVE new_rec; 23 | END IF; 24 | END LOOP new_rec; 25 | 26 | SELECT * FROM testloop; 27 | END $$ 28 | 29 | DELIMITER ; 30 | 31 | ================================================================= 32 | 33 | 34 | CALL MYLOOP() 35 | 36 | 37 | CALL MYLOOP() 38 | -------------------------------------------------------------------------------- /solutions/ch14/ch14_01.sql: -------------------------------------------------------------------------------- 1 | ================ Stored Procedure: mylab.MYHANDLER ================ 2 | 3 | DELIMITER $$ 4 | 5 | DROP PROCEDURE IF EXISTS mylab.MYHANDLER $$ 6 | CREATE PROCEDURE mylab.MYHANDLER ( p_name VARCHAR(30), p_owner VARCHAR(30), 7 | p_species VARCHAR(30), p_gender CHAR(1), 8 | p_birth DATE ) 9 | BEGIN 10 | DECLARE EXIT HANDLER FOR 1048 11 | BEGIN 12 | SELECT 'Cannot be null!!' AS Error; 13 | END; 14 | 15 | INSERT INTO pet VALUES (0, p_name, p_owner, p_species, p_gender, p_birth); 16 | 17 | SELECT * FROM pet WHERE id = LAST_INSERT_ID(); 18 | END $$ 19 | 20 | DELIMITER ; 21 | 22 | ================================================================= 23 | 24 | 25 | CALL MYHANDLER('Nancy', 'Bruce', 'Cat', 'm', '2000-3-12') 26 | 27 | 28 | CALL MYHANDLER(NULL, 'Simon', 'Snake', 'm', '2000-2-21') 29 | -------------------------------------------------------------------------------- /solutions/ch14/ch14_02.sql: -------------------------------------------------------------------------------- 1 | ================ Stored Procedure: mylab.MYCONDITION ================ 2 | 3 | DELIMITER $$ 4 | 5 | DROP PROCEDURE IF EXISTS mylab.MYCONDITION $$ 6 | CREATE PROCEDURE mylab.MYCONDITION ( p_name VARCHAR(30), p_owner VARCHAR(30), 7 | p_species VARCHAR(30), p_gender CHAR(1), 8 | p_birth DATE ) 9 | BEGIN 10 | DECLARE c_null CONDITION FOR 1048; 11 | 12 | DECLARE EXIT HANDLER FOR c_null 13 | BEGIN 14 | SELECT 'Cannot be null!!' AS Error; 15 | END; 16 | 17 | INSERT INTO pet VALUES (0, p_name, p_owner, p_species, p_gender, p_birth); 18 | 19 | SELECT * FROM pet WHERE id = LAST_INSERT_ID(); 20 | END $$ 21 | 22 | DELIMITER ; 23 | 24 | ================================================================= 25 | 26 | 27 | CALL MYCONDITION('Misty', 'Nicole', 'Cat', 'f', '2000-5-9') 28 | 29 | 30 | CALL MYCONDITION(NULL, 'Nicole', 'Snake', 'f', '2000-6-13') 31 | -------------------------------------------------------------------------------- /solutions/ch14/ch14_03.sql: -------------------------------------------------------------------------------- 1 | ================ Stored Procedure: mylab.MYCONDITION ================ 2 | 3 | DELIMITER $$ 4 | 5 | DROP PROCEDURE IF EXISTS mylab.MYCURSOR $$ 6 | CREATE PROCEDURE mylab.MYCURSOR ( p_species VARCHAR(30) ) 7 | BEGIN 8 | DECLARE v_spring INT DEFAULT 0; 9 | DECLARE v_summer INT DEFAULT 0; 10 | DECLARE v_autumn INT DEFAULT 0; 11 | DECLARE v_winter INT DEFAULT 0; 12 | DECLARE v_birth DATE; 13 | 14 | DECLARE cur_pet CURSOR FOR 15 | SELECT birth FROM pet WHERE species = p_species; 16 | 17 | OPEN cur_pet; 18 | 19 | BEGIN 20 | DECLARE EXIT HANDLER FOR 1329 BEGIN END; 21 | 22 | LOOP 23 | FETCH cur_pet INTO v_birth; 24 | 25 | CASE QUARTER(v_birth) 26 | WHEN 1 THEN SET v_spring = v_spring + 1; 27 | WHEN 2 THEN SET v_summer = v_summer + 1; 28 | WHEN 3 THEN SET v_autumn = v_autumn + 1; 29 | WHEN 4 THEN SET v_winter = v_winter + 1; 30 | END CASE; 31 | END LOOP; 32 | END; 33 | 34 | SELECT p_species AS Species, 35 | v_spring AS Spring, v_summer As Summer, 36 | v_autumn AS Autumn, v_winter AS Winter; 37 | END $$ 38 | 39 | DELIMITER ; 40 | 41 | ================================================================= 42 | 43 | 44 | CALL MYCURSOR('dog') 45 | 46 | 47 | CALL MYCURSOR('cat') 48 | -------------------------------------------------------------------------------- /solutions/ch15/ch15_01.sql: -------------------------------------------------------------------------------- 1 | ================ Trigger: pet_after_insert ===================== 2 | 3 | DELIMITER $$ 4 | 5 | DROP TRIGGER IF EXISTS pet_after_insert$$ 6 | 7 | CREATE TRIGGER pet_after_insert AFTER INSERT ON pet FOR EACH ROW 8 | BEGIN 9 | INSERT INTO petlog (message) VALUES ('New Pet!'); 10 | END$$ 11 | 12 | DELIMITER ; 13 | 14 | ================================================================= 15 | 16 | 17 | SELECT * FROM petlog 18 | -------------------------------------------------------------------------------- /solutions/ch15/ch15_02.sql: -------------------------------------------------------------------------------- 1 | ================ Trigger: pet_after_insert ===================== 2 | 3 | DELIMITER $$ 4 | 5 | DROP TRIGGER IF EXISTS pet_after_insert$$ 6 | 7 | CREATE TRIGGER pet_after_insert AFTER INSERT ON pet FOR EACH ROW 8 | BEGIN 9 | DECLARE v_message VARCHAR(64) DEFAULT 'New Pet! '; 10 | SET v_message = CONCAT(v_message, NEW.name); 11 | INSERT INTO petlog (message) VALUES ( v_message ); 12 | END$$ 13 | 14 | DELIMITER ; 15 | 16 | ================================================================= 17 | 18 | 19 | ================ Trigger: pet_after_update ===================== 20 | 21 | DELIMITER $$ 22 | 23 | DROP TRIGGER IF EXISTS pet_after_update$$ 24 | 25 | CREATE TRIGGER pet_after_update AFTER UPDATE ON pet FOR EACH ROW 26 | BEGIN 27 | DECLARE v_message VARCHAR(64) DEFAULT 'Update Pet! '; 28 | SET v_message = CONCAT(v_message, NEW.name); 29 | INSERT INTO petlog (message) VALUES ( v_message ); 30 | END$$ 31 | 32 | DELIMITER ; 33 | 34 | ================================================================= 35 | 36 | 37 | ================ Trigger: pet_before_delete ===================== 38 | 39 | DELIMITER $$ 40 | 41 | DROP TRIGGER IF EXISTS pet_before_delete$$ 42 | 43 | CREATE TRIGGER pet_before_delete BEFORE DELETE ON pet FOR EACH ROW 44 | BEGIN 45 | DECLARE v_message VARCHAR(64) DEFAULT 'Delete Pet! '; 46 | SET v_message = CONCAT(v_message, OLD.name); 47 | INSERT INTO petlog (message) VALUES ( v_message ); 48 | DELETE FROM event WHERE id = OLD.id; 49 | END$$ 50 | 51 | DELIMITER ; 52 | 53 | ================================================================= 54 | 55 | 56 | SELECT * FROM petlog 57 | -------------------------------------------------------------------------------- /solutions/ch16/empty.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macdidi5/MySQLTutorial/f44207d5f441171a1c600753f694974c537210da/solutions/ch16/empty.txt -------------------------------------------------------------------------------- /solutions/ch17/empty.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macdidi5/MySQLTutorial/f44207d5f441171a1c600753f694974c537210da/solutions/ch17/empty.txt -------------------------------------------------------------------------------- /solutions/ch18/ch18_01.sql: -------------------------------------------------------------------------------- 1 | SELECT * INTO OUTFILE 'C:/cmdev/data/out/pet.txt' 2 | FIELDS TERMINATED BY ',' ENCLOSED BY '"' 3 | LINES TERMINATED BY '\r' 4 | FROM pet 5 | 6 | 7 | CREATE TABLE pet2 LIKE pet 8 | 9 | 10 | DESC pet2 11 | 12 | 13 | SELECT * FROM pet2 14 | 15 | 16 | LOAD DATA LOCAL INFILE 'C:/cmdev/data/out/pet.txt' 17 | INTO TABLE pet2 18 | FIELDS TERMINATED BY ',' ENCLOSED BY '"' 19 | LINES TERMINATED BY '\r' 20 | (id, name, owner, @v_species, gender, birth) 21 | SET species = UPPER(@v_species) 22 | 23 | 24 | SELECT * FROM pet2 25 | -------------------------------------------------------------------------------- /solutions/ch18/ch18_02.sql: -------------------------------------------------------------------------------- 1 | mysqldump -u root --tab=c:/cmdev/data/out mylab event 2 | 3 | 4 | CREATE TABLE event2 LIKE event 5 | 6 | 7 | DESC event2 8 | 9 | 10 | SELECT * FROM event2 11 | 12 | 13 | copy event.txt event2.txt 14 | 15 | 16 | mysqlimport -u root mylab C:/cmdev/data/out/event2.txt 17 | 18 | 19 | SELECT * FROM event2 20 | -------------------------------------------------------------------------------- /solutions/ch19/empty.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macdidi5/MySQLTutorial/f44207d5f441171a1c600753f694974c537210da/solutions/ch19/empty.txt --------------------------------------------------------------------------------