第十一章 数据处理之增删改.sql 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #第十一章 数据处理之增删改
  2. #0、储备工作
  3. USE atguigudb;
  4. CREATE TABLE IF NOT EXISTS emp1(
  5. id INT,
  6. `name` VARCHAR(15),
  7. hire_date DATE,
  8. salary DOUBLE(10,2)
  9. );
  10. DESC emp1;
  11. SELECT *
  12. FROM emp1;
  13. #1、添加数据
  14. #方式1:一条一条的添加数据
  15. #(1)没有指明添加的字段
  16. #正确的
  17. INSERT INTO emp1
  18. VALUES (1,'Tom','2000-12-20',3400);#注意:一定要按照声明的字段的先后顺序添加
  19. #错误的
  20. INSERT INTO emp1
  21. VALUES (2,3400,'2000-12-20','Jerry');
  22. #(2)指明要添加的字段(推荐方式)
  23. INSERT INTO emp1(id,hire_date,salary,`name`)
  24. VALUES (2,'2011-12-20',4000,'Jerry');
  25. #说明:没有进行赋值的hire_date的值为null
  26. INSERT INTO emp1(id,salary,`name`)
  27. VALUES (3,4500,'shk');
  28. #(3)同时插入多条记录
  29. INSERT INTO emp1(id,`name`,salary)
  30. VALUES
  31. (4,'Jim',5000),
  32. (5,'孙悟空',5500);
  33. #方式2:将查询结果插入到表中
  34. SELECT * FROM emp1;
  35. INSERT INTO emp1(id,`name`,salary,hire_date)
  36. #查询语句
  37. SELECT employee_id,last_name,salary,hire_date #查询的字段一定要与添加到的表的字段一一对应
  38. FROM employees
  39. WHERE department_id IN (70,60);
  40. DESC emp1;
  41. DESC employees;
  42. #说明:emp1表中要添加数据的字段的长度不能低于employees表中查询的字段的长度。
  43. #如果emp1表中要添加数据的字段的长度低于employees表中查询的字段的长度的话,
  44. #就有添加不成功的风险。
  45. #2、更新数据(或修改数据)
  46. #UPDATE ... SET ... WHERE ...
  47. #可以实现批量修改数据。(取消WHERE语句就是批量修改)
  48. UPDATE emp1
  49. SET hire_date = CURDATE()
  50. WHERE id = 5;
  51. #同时修改一条数据的多个字段
  52. UPDATE emp1
  53. SET hire_date = CURDATE(),salary = 6000
  54. WHERE id = 4;
  55. #题目:将表中姓名中包含字符a的提薪20%
  56. UPDATE emp1
  57. SET salary = salary * 1.2
  58. WHERE `name` LIKE '%a%';
  59. #修改数据时,是可能存在不成功的情况的。(可能是由于约束的影响造成的)
  60. UPDATE employees
  61. SET department_id = 10000
  62. WHERE employee_id = 102;
  63. #3、删除数据
  64. # DELETE FROM ... WHERE ...
  65. DELETE FROM emp1
  66. WHERE id = 5;
  67. SELECT * FROM emp1;
  68. #在删除数据时,也有可能因为约束的影响,导致删除失败
  69. DELETE FROM departments
  70. WHERE department_id = 50;
  71. #小结:DML操作默认情况下,执行完以后都会自动提交数据,
  72. #如果希望执行完以后不自动提交数据,则需要使用 SET autocommit = FALSE
  73. #4、MySQL8的新特性:计算列
  74. USE atguigudb;
  75. CREATE TABLE test1(
  76. a INT,
  77. b INT,
  78. c INT GENERATED ALWAYS AS (a + b) VIRTUAL #字段c即为计算列
  79. );
  80. INSERT INTO test1(a,b)
  81. VALUES(10,20);
  82. SELECT * FROM test1;
  83. UPDATE test1
  84. SET a = 100;
  85. #5、综合案例(学习笔记第11章,11.5综合案例)
  86. #1、创建数据库test01_library
  87. CREATE DATABASE IF NOT EXISTS test01_library CHARACTER SET 'utf8';
  88. USE test01_library;
  89. #2、创建表books,表结构如下:
  90. CREATE TABLE IF NOT EXISTS books(
  91. id INT,
  92. `name` VARCHAR(50),
  93. `authors` VARCHAR(100),
  94. price FLOAT,
  95. pubdate YEAR,
  96. note VARCHAR(100),
  97. num INT
  98. );
  99. DESC books;
  100. SELECT * FROM books;
  101. #3、向books中插入记录:
  102. #(1)、不指定字段名称,插入第一条记录
  103. #(2)、指定所有字段名称,插入第二条记录
  104. #(3)、同时插入多条记录(剩下的所有记录)
  105. #(1)、不指定字段名称,插入第一条记录
  106. INSERT INTO books
  107. VALUES(1,'Tal of AAA','Dickes',23,'1995','novel',11);
  108. #(2)、指定所有字段名称,插入第二条记录
  109. INSERT INTO books(id,`name`,`authors`,price,pubdate,note,num)
  110. VALUES(2,'EmmaT','Jane lura',35,'1993','joke',22);
  111. #(3)、同时插入多条记录(剩下的所有记录)
  112. INSERT INTO books(id,`name`,`authors`,price,pubdate,note,num)
  113. VALUES
  114. (3,'Story of Jane','Jane Tim',40,'2001','novel',0),
  115. (4,'Lovey Day','George Byron',20,'2005','novel',30),
  116. (5,'Old land','Honore Blade',30,'2010','law',0),
  117. (6,'The Battle','Upton Sara',30,'1999','medicine',40),
  118. (7,'Rose Hood','Richard haggard',28,'2008','cartoon',28);
  119. #4、将小说类型(novel)的书的价格都增加5。
  120. UPDATE books
  121. SET price = price + 5
  122. WHERE note = 'novel';
  123. #5、将名称为EmmaT的书的价格改为40,并将说明改为drama。
  124. UPDATE books
  125. SET price = 40,note = 'drama'
  126. WHERE `name` = 'EmmaT';
  127. SELECT * FROM books;
  128. #6、删除库存为0的记录。
  129. DELETE FROM books
  130. WHERE num = 0;
  131. #7、统计书名中包含a字母的书。
  132. SELECT name
  133. FROM books
  134. WHERE name LIKE '%a%';
  135. #8、统计书名中包含a字母的书的数量和库存总量。
  136. SELECT COUNT(*),SUM(num)
  137. FROM books
  138. WHERE name LIKE '%a%';
  139. #9、找出“novel”类型的书,按照价格降序排列。
  140. SELECT *
  141. FROM books
  142. WHERE note = 'novel'
  143. ORDER BY price DESC;
  144. #10、查询图书信息,按照库存量降序排列,如果库存量相同的按照note升序排列。
  145. SELECT *
  146. FROM books
  147. ORDER BY num DESC,note ASC;
  148. #11、按照note分类统计书的数量。
  149. SELECT note,COUNT(*)
  150. FROM books
  151. GROUP BY note;
  152. #12、按照note分类统计书的库存量,显示库存量超过30本的
  153. SELECT note,SUM(num)
  154. FROM books
  155. GROUP BY note
  156. HAVING SUM(num) > 30;
  157. #13、查询所有图书,每页显示5本,显示第二页。
  158. SELECT *
  159. FROM books
  160. LIMIT 5,5;
  161. #14、按照note分类统计书的库存量,显示库存量最多的。
  162. SELECT note,SUM(num) sum_num
  163. FROM books
  164. GROUP BY note
  165. ORDER BY sum_num DESC
  166. LIMIT 0,1;
  167. #15、查询书名达到10个字符的书,不包括里面的空格。
  168. SELECT name
  169. FROM books
  170. WHERE CHAR_LENGTH(REPLACE(name,' ','')) >= 10;
  171. #16、查询书名和类型,其中note值为novel显示小说,law显示法律,medicine显示医药,cartoon显示卡通,joke显示笑话。
  172. SELECT name "书名",note,CASE note WHEN 'novel' THEN '小说'
  173. WHEN 'law' THEN '法律'
  174. WHEN 'medicine' THEN '医药'
  175. WHEN 'cartoon' THEN '卡通'
  176. WHEN 'joke' THEN '笑话'
  177. ELSE '其他'
  178. END "类型"
  179. FROM books;
  180. #17、查询书名、库存,其中num值超过30本的,显示滞销,大于0并低于10的,显示畅销,为0的显示需要无货。
  181. SELECT name AS "书名",num AS "库存",CASE WHEN num > 30 THEN '滞销'
  182. WHEN num > 0 AND num < 10 THEN '畅销'
  183. WHEN num = 0 THEN '无货'
  184. ELSE '正常'
  185. END "显示状态"
  186. FROM books;
  187. #18、统计每一种note的库存量,并合计总量。
  188. SELECT IFNULL(note,'合计库存总量') AS note,SUM(num)
  189. FROM books
  190. GROUP BY note WITH ROLLUP;
  191. #19、统计每一种note的数量,并合计总量。
  192. SELECT IFNULL(note,'合计总量') AS note,COUNT(*)
  193. FROM books
  194. GROUP BY note WITH ROLLUP;
  195. #20、统计库存前三名的图书。
  196. SELECT *
  197. FROM books
  198. ORDER BY num DESC
  199. LIMIT 0,3;
  200. #21、找出最早出版的一本书。
  201. SELECT *
  202. FROM books
  203. ORDER BY pubdate ASC
  204. LIMIT 0,1;
  205. #22、找出novel中价格最高的一本书。
  206. SELECT *
  207. FROM books
  208. WHERE note = 'novel'
  209. ORDER BY price DESC
  210. LIMIT 0,1;
  211. #23、找出书名中字数最多的一本书,不含空格。
  212. SELECT *
  213. FROM books
  214. ORDER BY CHAR_LENGTH(REPLACE(name,' ','')) DESC
  215. LIMIT 0,1;