第十五章、练习题.sql 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. #第十五章、练习题
  2. #存储过程练习
  3. #0、准备工作
  4. CREATE DATABASE test15_pro_func;
  5. USE test15_pro_func;
  6. #1、创建存储过程insert_user(),实现传入用户名和密码,插入到admin表中
  7. CREATE TABLE admin(
  8. id INT PRIMARY KEY AUTO_INCREMENT,
  9. user_name VARCHAR(15) NOT NULL,
  10. pwd VARCHAR(25) NOT NULL
  11. );
  12. DESC admin;
  13. #创建存储过程insert_user()
  14. DELIMITER //
  15. CREATE PROCEDURE insert_user(IN uname VARCHAR(15),IN passwd VARCHAR(25))
  16. CONTAINS SQL
  17. BEGIN
  18. INSERT INTO admin(user_name,pwd)
  19. VALUES(uname,passwd);
  20. END //
  21. DELIMITER ;
  22. #调用
  23. SET @user_name := 'Tom';
  24. SET @pwd := 'abc123';
  25. CALL insert_user(@user_name,@pwd)
  26. SELECT * FROM admin;
  27. #2、创建存储过程get_phone(),实现传入女神编号,返回女神姓名和女神电话
  28. CREATE TABLE beauty(
  29. id INT PRIMARY KEY AUTO_INCREMENT,
  30. `name` VARCHAR(15) NOT NULL,
  31. phone VARCHAR(15) UNIQUE,
  32. birth DATE
  33. );
  34. INSERT INTO beauty(name,phone,birth)
  35. VALUES
  36. ('朱茵','13201233453','1982-02-12'),
  37. ('孙燕姿','13501233653','1980-12-09'),
  38. ('田馥甄','13651238755','1983-08-21'),
  39. ('邓紫棋','17843283452','1991-11-12'),
  40. ('刘若英','18635575464','1989-05-18'),
  41. ('杨超越','13761238755','1994-05-11');
  42. SELECT * FROM beauty;
  43. #创建存储过程get_phone():我做的
  44. DELIMITER //
  45. CREATE PROCEDURE get_phone(INOUT uid INT)
  46. BEGIN
  47. SELECT name,phone FROM beauty WHERE id = uid;
  48. END //
  49. DELIMITER ;
  50. #调用
  51. SET @uid := 1;
  52. CALL get_phone(@uid);
  53. #老师讲的
  54. DELIMITER //
  55. CREATE PROCEDURE teach_get_phone(IN id INT,OUT name VARCHAR(15),OUT phone VARCHAR(15))
  56. BEGIN
  57. SELECT b.name,b.phone INTO name,phone
  58. FROM beauty b
  59. WHERE b.id = id;
  60. END //
  61. DELIMITER ;
  62. #调用
  63. CALL teach_get_phone(2,@name,@phone);
  64. SELECT @name,@phone;
  65. #3、创建存储过程date_diff(),实现传入两个女神生日,返回日期间隔大小
  66. DELIMITER //
  67. CREATE PROCEDURE date_diff(IN birth1 DATE,IN birth2 DATE,OUT result INT)
  68. BEGIN
  69. SELECT DATEDIFF(birth1,birth2) INTO result;
  70. END //
  71. DELIMITER ;
  72. #调用
  73. SET @birth1 := '1991-12-11';
  74. SET @birth2 := '1991-11-12';
  75. CALL date_diff(@birth1,@birth2,@result);
  76. SELECT @result;
  77. #4、创建存储过程format_date(),实现传入一个日期,格式化成xx年xx月xx日并返回
  78. #我做的:不对
  79. DELIMITER //
  80. CREATE PROCEDURE format_date(IN udate DATE,OUT result DATE)
  81. BEGIN
  82. SELECT DATE_FORMAT(udate,'%y%m%d') INTO result;
  83. END //
  84. DELIMITER ;
  85. #调用
  86. SET @udate := '1989-05-18';
  87. CALL format_date(@udate,@result);
  88. SELECT @result;
  89. #老师讲的
  90. DELIMITER //
  91. CREATE PROCEDURE teach_format_date(IN my_date DATE,OUT str_date VARCHAR(25))
  92. BEGIN
  93. SELECT DATE_FORMAT(my_date,'%y年%m月%d日') INTO str_date;
  94. END //
  95. DELIMITER ;
  96. #调用
  97. CALL teach_format_date(CURDATE(),@str);
  98. SELECT @str;
  99. #5、创建存储过程beauty_limit(),根据传入的起始索引和条目数,查询女神表的记录
  100. #我做的:正确
  101. DELIMITER //
  102. CREATE PROCEDURE beauty_limit(IN uid INT,IN num INT)
  103. BEGIN
  104. SELECT * FROM beauty LIMIT uid,num;
  105. END //
  106. DELIMITER ;
  107. #调用
  108. SET @uid := 1;
  109. SET @num := 3;
  110. CALL beauty_limit(@uid,@num);
  111. #老师讲的
  112. DELIMITER //
  113. CREATE PROCEDURE teach_beauty_limit(IN start_index INT,IN size INT)
  114. BEGIN
  115. SELECT * FROM beauty LIMIT start_index,size;
  116. END //
  117. DELIMITER ;
  118. #调用
  119. CALL teach_beauty_limit(1,3);
  120. #创建带inout模式参数的存储过程
  121. #6、传入a和b两个值,最终a和b都翻倍并返回
  122. #我做的
  123. DELIMITER //
  124. CREATE PROCEDURE multi(INOUT a INT,INOUT b INT)
  125. BEGIN
  126. SELECT a*2,b*2 FROM DUAL;
  127. END //
  128. DELIMITER ;
  129. #调用
  130. SET @a := 2;
  131. SET @b := 5;
  132. CALL multi(@a,@b);
  133. #老师讲的
  134. DELIMITER //
  135. CREATE PROCEDURE add_double(INOUT a INT,INOUT b INT)
  136. BEGIN
  137. SET a = a * 2;
  138. SET b = b * 2;
  139. END //
  140. DELIMITER ;
  141. #调用
  142. SET @a = 3,@b = 5;
  143. CALL add_double(@a,@b);
  144. SELECT @a,@b;
  145. #7、删除题目5的存储过程
  146. DROP PROCEDURE IF EXISTS beauty_limit;
  147. #8、查看题目6中存储过程的信息
  148. #我做的
  149. SHOW PROCEDURE STATUS LIKE 'multi';
  150. #老师讲的add_double
  151. SHOW CREATE PROCEDURE add_double;
  152. SHOW PROCEDURE STATUS LIKE 'add_double';
  153. #存储函数练习
  154. #0、准备工作
  155. USE test15_pro_func;
  156. CREATE TABLE employees
  157. AS
  158. SELECT * FROM atguigudb.employees;
  159. CREATE TABLE departments
  160. AS
  161. SELECT * FROM atguigudb.departments;
  162. #无参有返回
  163. #1、创建函数get_count(),返回公司的员工个数
  164. DELIMITER //
  165. CREATE FUNCTION get_count()
  166. RETURNS INT
  167. BEGIN
  168. RETURN (SELECT COUNT(*) FROM employees);
  169. END //
  170. DELIMITER ;
  171. #调用
  172. SELECT get_count();
  173. DESC employees;
  174. #有参有返回
  175. #2、创建函数ename_salary(),根据员工姓名,返回它的工资
  176. DELIMITER //
  177. CREATE FUNCTION ename_salary(lname VARCHAR(25))
  178. RETURNS DOUBLE
  179. BEGIN
  180. RETURN (SELECT salary FROM employees WHERE last_name = lname);
  181. END //
  182. DELIMITER ;
  183. #调用
  184. SET @lname = 'Abel';
  185. SELECT ename_salary(@lname);
  186. #3、创建函数dept_sal(),根据部门名,返回该部门的平均工资
  187. DESC departments;
  188. SELECT * FROM departments;
  189. #我做的
  190. DELIMITER //
  191. CREATE FUNCTION dept_sal(dept_name VARCHAR(30))
  192. RETURNS DOUBLE
  193. BEGIN
  194. RETURN (SELECT AVG(salary)
  195. FROM employees
  196. WHERE department_id = (SELECT department_id
  197. FROM departments
  198. WHERE department_name = dept_name)
  199. GROUP BY department_id);
  200. END //
  201. DELIMITER ;
  202. #调用
  203. SET @dept_name = 'IT';
  204. SELECT dept_sal(@dept_name);
  205. #老师讲的
  206. DELIMITER //
  207. CREATE FUNCTION teach_dept_sal(dept_name VARCHAR(30))
  208. RETURNS DOUBLE
  209. BEGIN
  210. RETURN (SELECT AVG(salary)
  211. FROM employees e JOIN departments d
  212. ON e.department_id = d.department_id
  213. WHERE d.department_name = dept_name);
  214. END //
  215. DELIMITER ;
  216. #调用
  217. SELECT dept_sal('IT');
  218. #4、创建函数add_float(),实现传入两个float,返回二者之和
  219. DELIMITER //
  220. CREATE FUNCTION add_float(value1 FLOAT,value2 FLOAT)
  221. RETURNS FLOAT
  222. BEGIN
  223. RETURN (SELECT value1 + value2);
  224. END //
  225. DELIMITER ;
  226. #调用
  227. SET @v1 = 12.2;
  228. SET @v2 = 2.3;
  229. SELECT add_float(@v1,@v2);