当前位置:   article > 正文

MySql基础汇总-DDL DML DQL DCL,存储过程,事务,触发器,函数等_mysql ddl和dml起执行,事务会失效吗

mysql ddl和dml起执行,事务会失效吗
  1. use testdb;
  2. -- /**********************************************一:数据库操作语言**********************************************/
  3. -- DDL: 数据库定义语言:create drop alter
  4. -- DML: 数据库管理语言:insert update delete
  5. -- DQL: 数据库查询t_usert_student 语言:select
  6. -- DCL: 数据库控制语言:grant revoke commit
  7. -- /**********************************************二:数据库类型**********************************************/
  8. -- 整数类型:tinyint int(11) smallint mediumint bigint
  9. -- 浮点类型: float double decimal(18,2)
  10. -- 字符类型: char(1) varchar(50) text Blob
  11. -- *TEXT和BLOB家族之间仅有的不同是BLOB类型存储的是二进制数据,没有排序规则或字符集,
  12. -- *而TEXT类型有字符集或排序规则。说白了如果要储存中文则选择TEXT。
  13. -- 日期类型: date time datetime timespan
  14. /**********************************************三:数据库DDL语言**********************************************/
  15. -- 【create table】 创建表
  16. CREATE TABLE t_user (
  17. t_id INT NOT NULL PRIMARY KEY UNIQUE KEY AUTO_INCREMENT COMMENT '用户id',
  18. t_name VARCHAR(50) NULL COMMENT '用户姓名',
  19. t_sex char(1) not null default '男' comment '性别',
  20. t_score decimal(10,2) not NULL DEFAULT '0.00' comment '分数',
  21. t_memo longtext null comment '备注',
  22. create_user varchar(50) null comment '创建人',
  23. create_time datetime null comment '创建时间',
  24. modify_time datetime null comment '最后一次修改时间',
  25. modify_user varchar(50) null comment '最后一次修改人',
  26. delete_time datetime null comment '删除时间',
  27. delete_user varchar(50) null comment '删除人',
  28. is_deleted int not null default 0 comment '是否删除(0:有效 1:已删除)'
  29. ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET= utf8;
  30. -- 【alter table add column】 新增一列
  31. alter table t_user add column t_birthday datetime null comment '用户生日';
  32. -- 【alter table modify column】 修改字段的属性
  33. alter table t_user modify column t_birthday datetime not null comment '用户生日';
  34. -- 【alter table change column newcolumn】 修改字段的属性或名字
  35. alter table t_user change t_birthday t_birth datetime not null comment '用户生日';
  36. -- 【alter table drop column】 删除字段
  37. alter table t_user drop t_birth;
  38. -- 【show create table】
  39. show create table t_user;
  40. -- 【rename table to newrtable】
  41. rename table t_user to my_user;
  42. rename table my_user to t_user;
  43. /**********************************************四:数据库DML语言**********************************************/
  44. create table t_student
  45. (
  46. t_sId int not null primary key unique key auto_increment comment '学生主键id' ,
  47. t_id int not NULL DEFAULT 0 COMMENT '用户主键id',
  48. tsg_id int not NULL DEFAULT 0 COMMENT '学生等级主键id',
  49. t_sName varchar(50) null comment '学生姓名',
  50. t_sPhone varchar(20) null comment '学生手机号',
  51. create_user varchar(50) null comment '创建人',
  52. create_time datetime null comment '创建时间',
  53. modify_time datetime null comment '最后一次修改时间',
  54. modify_user varchar(50) null comment '最后一次修改人',
  55. delete_time datetime null comment '删除时间',
  56. delete_user varchar(50) null comment '删除人',
  57. is_deleted int not null default 0 comment '是否删除(0:有效 1:已删除)'
  58. ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET= utf8;
  59. -- 【insert】 插入数据
  60. insert into t_user(t_name,t_sex,t_score,t_memo,create_user,create_time)
  61. values('kobe','男',10,'备注','sys',now()),('james','男',11,'备注','sys',now()),('harden','男',12,'备注','sys',now());
  62. insert into t_student(t_id,tsg_id,t_sName,t_sPhone,create_user,create_time)
  63. values
  64. (1,1,'学生kobe1','15824130001','sys',now()),(1,1,'学生kobe2','15824130002','sys',DATE_ADD(NOW(),INTERVAL '20' MINUTE)),(1,1,'学生kobe3','15824130003','sys',DATE_ADD(NOW(),INTERVAL '10' MINUTE)),
  65. (2,2,'学生james1','15824130001','sys',now()),(2,2,'学生james2','15824130002','sys',DATE_ADD(NOW(),INTERVAL '20' MINUTE)),(2,2,'学生james3','15824130003','sys',DATE_ADD(NOW(), INTERVAL'10' MINUTE)),
  66. (3,3,'学生harden1','15824130001','sys',now()),(3,3,'学生harden2','15824130002','sys',DATE_ADD(NOW(),INTERVAL '20' MINUTE)),(3,3,'学生harden3','15824130003','sys',DATE_ADD(NOW(), INTERVAL'10' MINUTE));
  67. -- 【update】 更新语句
  68. -- mysql直接执行where后面不是主键条件的会报错,执行前都需要把安全模式改为0
  69. SET SQL_SAFE_UPDATES = 0;
  70. update t_user set t_memo='男性备注' where t_sex='男';
  71. update t_user set t_memo= (select create_user from t_student where t_sId=1);
  72. UPDATE t_user
  73. SET
  74. t_sex = CASE
  75. WHEN t_name = 'kobe' THEN '男'
  76. ELSE '女'
  77. END;
  78. -- 【delete】 删除语句
  79. delete from t_user where t_id>2;
  80. -- /**********************************************五:数据库DQL语言**********************************************/
  81. -- 【"=" "!=" "<>" "between and" "in" "not in" ">=" "<=" "is null" "and" "or" "not"】
  82. select * from t_user where t_id between 1 and 3;
  83. select * from t_user where modify_time is null;
  84. -- 【"_" "like"】 模糊查询
  85. SELECT * from t_user where t_name like '____'; -- 表示4个字符的名称
  86. SELECT * FROM t_user WHERE t_name like '%o%';
  87. -- 【DISTINCT】 去重
  88. SELECT DISTINCT(t_sex) FROM t_user;
  89. -- 【IFNULL(expr1,expr2)】 如果为空
  90. SELECT t_name,IFNULL(modify_user,'修改者') from t_user;
  91. -- 【ORDER BY】 排序
  92. SELECT * FROM t_user ORDER BY create_time DESC,t_id ASC;
  93. -- 【GROUP BY】 分组
  94. SELECT t_sex,SUM(t_score) from t_user GROUP BY t_sex;
  95. -- 【GROUP_CONCAT(expr)】 分组后对其他字段进行逗号分隔的字符串连接
  96. SELECT t_sex,GROUP_CONCAT(t_name) as '姓名' FROM t_user GROUP BY t_sex;
  97. -- 【HAVING】 WHERE是分组前的筛选,HAVING是分组后的筛选
  98. SELECT t_sex,SUM(t_score) as sumScore from t_user GROUP BY t_sex HAVING SUM(t_score) > 1;
  99. -- 【LIMIT pageIndex,pageSize】
  100. -- 从0开始第一条,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目
  101. -- 只有一个参数时是返回前几条数据
  102. -- 选择第一条数据 是LIMIT 1,而不是LIMIT 0
  103. SELECT * FROM t_user WHERE t_sex='男' ORDER BY t_id LIMIT 0,2;
  104. -- 【UNION】
  105. -- 前提条件: 两表的列的数量和类型必须完全一致,否则报错
  106. -- 返回内容: 合并时【会】对列的【内容】做去重处理(指的是所有列的内容完全一样),
  107. -- 【UNION ALL】
  108. -- 前提条件: 两表的列的数量和类型必须完全一致,否则报错
  109. -- 返回内容: 合并时【不会】对列的【内容】做去重处理(指的是所有列的内容完全一样),
  110. -- news
  111. CREATE TABLE news(n_id int,n_title VARCHAR(100),n_content VARCHAR(500));
  112. -- news_history
  113. CREATE TABLE news_history(n_id int,n_title VARCHAR(100),n_content VARCHAR(500));
  114. INSERT INTO news VALUES(1,'标题1','标题1content');
  115. INSERT INTO news VALUES(2,'标题2','标题2content');
  116. INSERT INTO news VALUES(3,'标题3','标题3content');
  117. INSERT INTO news_history VALUES(1,'标题1','标题1content');
  118. INSERT INTO news_history VALUES(2,'标题2','标题2content');
  119. INSERT INTO news_history VALUES(3,'标题3','标题3content');
  120. SELECT * FROM news UNION select * from news_history;
  121. -- 1 标题1 标题1content
  122. -- 2 标题2 标题2content
  123. -- 3 标题3 标题3content
  124. SELECT * FROM news UNION ALL select * from news_history;
  125. -- 1 标题1 标题1content
  126. -- 2 标题2 标题2content
  127. -- 3 标题3 标题3content
  128. -- 1 标题1 标题1content
  129. -- 2 标题2 标题2content
  130. -- 3 标题3 标题3content
  131. -- 【INNER JOIN】 内连接-等值连接
  132. CREATE TABLE t_student_grade
  133. (
  134. tsg_id INT not null PRIMARY KEY UNIQUE KEY auto_increment COMMENT '主键id',
  135. tsg_name VARCHAR(50) NULL COMMENT '等级名称',
  136. create_user varchar(50) null comment '创建人',
  137. create_time datetime null comment '创建时间',
  138. modify_time datetime null comment '最后一次修改时间',
  139. modify_user varchar(50) null comment '最后一次修改人',
  140. delete_time datetime null comment '删除时间',
  141. delete_user varchar(50) null comment '删除人',
  142. is_deleted int not null default 0 comment '是否删除(0:有效 1:已删除)'
  143. ) ENGINE=INNODB auto_increment=1 DEFAULT CHARSET =utf8;
  144. INSERT INTO t_student_grade(tsg_name,create_user,create_time) VALUES('三年级','sys',NOW()),('四年级','sys',NOW()),('五年级','sys',NOW());
  145. SELECT t.t_id,t.t_name,b.t_sName,b.t_sPhone,c.tsg_name FROM t_user as a
  146. INNER JOIN t_student as b on t.t_id=b.t_id AND t.t_id<=4 -- 效果与where一样
  147. INNER JOIN t_student_grade as c on b.tsg_id=c.tsg_id
  148. -- WHERE t.t_id<=4
  149. -- 【INNER JOIN】 内连接-非等值连接
  150. SELECT t.t_id as a_tid,t.t_name,b.t_id as t_tid,b.t_sName,b.t_sPhone FROM t_user as a
  151. INNER JOIN t_student as b on t.t_id>b.t_id
  152. -- 【OUTER LEFT JOIN】 外连接-左外连接
  153. SELECT t.t_id,t.t_name,b.t_sName,b.t_sPhone,c.tsg_name FROM t_user as a
  154. LEFT JOIN t_student as b on t.t_id=b.t_id
  155. LEFT JOIN t_student_grade as c on b.tsg_id=c.tsg_id
  156. WHERE t.t_id<=4
  157. -- 【OUTER RIGHT JOIN】 外连接-右外连接
  158. SELECT t.t_id,t.t_name,b.t_sName,b.t_sPhone,c.tsg_name FROM t_user as a
  159. RIGHT JOIN t_student as b on t.t_id=b.t_id
  160. RIGHT JOIN t_student_grade as c on b.tsg_id=c.tsg_id
  161. WHERE t.t_id<=4;
  162. -- 【NATURAL JOIN】 自然连接
  163. -- 前提条件: 两表的列的数量和类型必须完全一致,否则报错
  164. -- 返回内容: 合并时【会】对列的【名称】做去重处理
  165. SELECT * from news as a NATURAL JOIN news_history as b;
  166. -- 1 标题1 标题1content
  167. -- 2 标题2 标题2content
  168. -- 3 标题3 标题3content
  169. SELECT * FROM news UNION SELECT * from news_history;
  170. -- 1 标题1 标题1content
  171. -- 2 标题2 标题2content
  172. -- 3 标题3 标题3content
  173. -- 【CROSS JOIN】 交叉连接
  174. -- 返回内容:把表A和表B的数据进行一个N*M的组合,即笛卡尔积。
  175. SELECT * FROM t_user CROSS JOIN t_student;
  176. -- 【利用Group_CONCAT和SubStringIndex来实现RowNumber(partition by)的功能】
  177. -- 根据创建时间倒序,根据性别分组,取每种性别的第一条用户信息
  178. SELECT a.t_sex,
  179. SUBSTRING_INDEX(GROUP_CONCAT(a.t_name ORDER BY b.create_time DESC),',',1) as t_name,
  180. SUBSTRING_INDEX(GROUP_CONCAT(a.t_score ORDER BY b.create_time DESC),',',1) as t_score,
  181. SUBSTRING_INDEX(GROUP_CONCAT(b.t_sName ORDER BY b.create_time DESC),',',1) as t_sName,
  182. SUBSTRING_INDEX(GROUP_CONCAT(b.t_sPhone ORDER BY b.create_time DESC),',',1) as t_sPhone,
  183. SUBSTRING_INDEX(GROUP_CONCAT(b.create_time ORDER BY b.create_time DESC),',',1) as create_time FROM
  184. t_user as a
  185. INNER JOIN t_student as b on a.t_id=b.t_id
  186. GROUP BY a.t_sex;
  187. -- 【EXISTS】 子查询
  188. SELECT * FROM t_user as a
  189. WHERE NOT EXISTS (SELECT 1 FROM t_student as b WHERE a.t_id=b.t_id);
  190. /**********************************************六:视图**********************************************/
  191. CREATE or REPLACE VIEW t_userstu_view
  192. as
  193. SELECT a.t_id as u_id,a.t_name,a.t_sex,b.t_id as s_id,b.t_sName FROM t_user as a
  194. LEFT JOIN t_student as b on a.t_id=b.t_id;
  195. -- 默认是不可修改
  196. SELECT * FROM t_userstu_view;
  197. DROP VIEW t_userstu_view;
  198. /**********************************************七:系统函数**********************************************/
  199. -- /**********************************【数学函数】*************************************/
  200. -- 【ABS】 返回绝对值
  201. SELECT ABS(-1); -- 1
  202. -- 【MOD】/ % 返回两个数的取余
  203. SELECT MOD(7,2); -- 1
  204. SELECT 7%2; -- 1
  205. -- 【FLOOR(X)】 返回比这个数小的最临近的整数
  206. SELECT FLOOR(1); -- 1
  207. SELECT FLOOR(1.6); -- 1
  208. SELECT FLOOR(-1.2); -- -2
  209. -- 【CEILING(X)】返回比这个数大的最临近的整数
  210. SELECT CEILING(1); -- 1
  211. SELECT CEILING(1.6); -- 2
  212. SELECT CEILING(-1.2); -- -1
  213. -- 【ROUND(X)】 返回这个数的四舍五入的整数,与正负无关,只对数字进行四舍五入,然后加上正负
  214. SELECT ROUND(1.49); -- 1
  215. SELECT ROUND(1.5); -- 2
  216. SELECT ROUND(-1.49); -- -1
  217. SELECT ROUND(-1.5); -- -2
  218. -- /**********************************【字符串函数】*************************************/
  219. -- 【ASCII(str)】 返回这个字符串左边第一个字符的ASCII码
  220. SELECT ASCII('ab'); -- 97
  221. -- 【CONCAT(str1,str2,...)】 返回多个字符串的拼接字符串
  222. SELECT CONCAT('h','e','llo'); -- 'hello'
  223. SELECT CONCAT_WS(',','h','e','llo'); -- 'h,e,llo'
  224. -- 【TRIM(str)】 返回去空格的字符串
  225. SELECT TRIM(' he ll o '); -- 'he ll o' 去掉左边和右边的空格(中间的不会去掉)
  226. SELECT LTRIM(' he ll o');-- 'he ll o' 去掉左边的空格
  227. SELECT RTRIM('he ll o ');-- 'he ll o' 去掉右边的空格
  228. -- 那么问题来了,如何去掉字符串' he ll o '中所有出现的空格?
  229. SELECT REPLACE(' he ll o ',' ','') -- 'hello';
  230. -- 【LENGTH(str)】 返回字符串的长度(包含空格的数量)
  231. SELECT LENGTH(' he ll o '); -- 9
  232. -- 【REPLACE(str,from_str,to_str)】 返回替换后字符串的内容
  233. SELECT REPLACE('hello','llo','llo world!'); -- hello world!
  234. -- 【LOCATE(str1,str2)】 返回字符存在改字符串中的位置(类似index of ,索引从0开始计算,不存在时返回0而不是0)
  235. SELECT LOCATE('e',' he ll o '); -- 3
  236. SELECT LOCATE('w',' he ll o '); -- 0
  237. -- 【INSERT】 返回插入指定位置,替换指定长度的字符的字符串
  238. SELECT INSERT('hello ',6,1,' world!'); -- 'hello world!'
  239. SELECT INSERT('hello',2,1,'s'); -- 'hsllo'
  240. SELECT INSERT('hello',2,2,'s'); -- 'hslo'
  241. SELECT INSERT('hello',2,1,'ss'); -- 'hssllo'
  242. SELECT INSERT('hello',2,2,'ss'); -- 'hsslo'
  243. SELECT INSERT('hello',2,3,'ss'); -- 'hsso'
  244. -- /**********************************【日期和时间函数】*************************************/
  245. -- 【NOW()/CURRENT_TIMESTAMP】 返回当前时间
  246. SELECT NOW(); -- '2019-09-06 14:48:12'
  247. SELECT CURRENT_TIMESTAMP; -- '2019-09-06 14:48:12'
  248. -- 【YEAR/MONTH/DAY/HOUR/MINUTE/SECOND...】 返回日期的年月日时分秒毫秒
  249. SELECT DATE('2000-01-02 03:04:05.006'); -- 2000-01-02
  250. SELECT TIME('2000-01-02 03:04:05.006'); -- 03:04:05
  251. SELECT YEAR('2000-01-02 03:04:05.006'); -- 2000
  252. SELECT MONTH('2000-01-02 03:04:05.006'); -- 1
  253. SELECT DAY('2000-01-02 03:04:05.006'); -- 2
  254. SELECT HOUR('2000-01-02 03:04:05.006'); -- 3
  255. SELECT MINUTE('2000-01-02 03:04:05.006'); -- 4
  256. SELECT SECOND('2000-01-02 03:04:05.006'); -- 5
  257. SELECT MICROSECOND('2000-01-02 03:04:05.006'); -- 6000 获取日期的【微秒】
  258. SELECT DAYOFWEEK('2000-01-02 03:04:05.006'); -- 1(1:星期天 2:星期一 3:星期二...)
  259. -- 【DATEDIFF(expr1,expr2)】 返回两个日期之间的天数(第一个时间-第二个参数)
  260. SELECT DATEDIFF('2000-01-02 03:04:05.006','2000-01-01 03:04:05.006'); -- 1
  261. -- 【TIMEDIFF(expr1,expr2)】 返回两个日期之间的时分秒时间戳(第一个时间-第二个参数)
  262. SELECT TIMEDIFF('2000-01-01 05:04:05.006','2000-01-01 04:05:05.006'); -- 00:59:00.000
  263. -- 【TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)】 返回两个日期之间的年/月/日/时/分/秒(第一个时间-第二个参数)
  264. SELECT TIMESTAMPDIFF(YEAR,'2000-01-02 03:04:05.006','2000-01-01 03:04:05.006'); -- 0
  265. SELECT TIMESTAMPDIFF(MONTH,'2000-01-02 03:04:05.006','2000-01-01 03:04:05.006'); -- 0
  266. SELECT TIMESTAMPDIFF(DAY,'2000-01-02 03:04:05.006','2000-01-01 03:04:05.006'); -- 0
  267. -- 【DATE_ADD(date,INTERVAL expr unit)】 返回一个日期增加的年/月/日/时/分/秒
  268. SELECT DATE_ADD('2000-01-01 05:04:05.006',INTERVAL 1 YEAR); -- 2001-01-01 05:04:05.006000
  269. SELECT DATE_ADD('2000-01-01 05:04:05.006',INTERVAL 1 MONTH); -- 2000-02-01 05:04:05.006000
  270. SELECT DATE_ADD('2000-01-01 05:04:05.006',INTERVAL 1 DAY); -- 2000-01-02 05:04:05.006000
  271. -- 【DATE_FORMAT】 日期转字符串
  272. SELECT DATE_FORMAT('2000-01-01 05:04:05','%Y%m%d%H%i%s'); -- 20000101050405
  273. -- 【STR_TO_DATE】 字符串转日期
  274. SELECT STR_TO_DATE('20000101050405','%Y%m%d%H%i%s'); -- 2000-01-01 05:04:05
  275. -- /**********************************【流程控制函数】*************************************/
  276. -- 【CASE WHEN THEN ELSE END】
  277. SELECT CASE WHEN t_sex='男' THEN '1' ELSE '2' END as t_sex FROM t_user;
  278. /**********************************************八:自定义函数**********************************************/
  279. -- 【CREATE FUNCTION】创建
  280. -- 8.0版本MySQL创建函数需要在RETURNS TYPE后面,BEGIN前面加上创建类型。 DETERMINISTIC,注意DETERMINISTIC插入位置。
  281. -- 一般有下面这几种类型:
  282. -- 1)DETERMINISTIC:不确定的
  283. -- 2)NO SQL:没有SQL语句
  284. -- 3)READS SQL DATA:读取数据,不涉及修改数据
  285. -- 4)MODIFIES SQL DATA:涉及到修改数据
  286. -- 5)CONTAINS SQL:包含了SQL语句
  287. -- 创建函数
  288. -- 【INTO】 赋值
  289. CREATE FUNCTION fun_get_user_name(xid INT) RETURNS VARCHAR(50) DETERMINISTIC
  290. BEGIN
  291. DECLARE xuname VARCHAR(50);
  292. SELECT t_name INTO xuname FROM t_user WHERE t_id=xid;
  293. RETURN xuname;
  294. END;
  295. SELECT fun_get_user_name(1);
  296. -- 【IF/ELSE IF/SET】IF判断
  297. CREATE FUNCTION fun_get_week(xweek int) RETURNS VARCHAR(50) DETERMINISTIC
  298. BEGIN
  299. -- 使用set赋值时,使用的是“=”,使用select赋值时使用的是“:="。
  300. DECLARE rweek VARCHAR(50) DEFAULT 'unknown'; -- 局部变量默认值
  301. if(xweek = 1) THEN
  302. SET rweek='星期天';
  303. ELSEIF(xweek=2) THEN
  304. SET rweek='星期一';
  305. ELSEIF(xweek=3) THEN
  306. SET rweek='星期二';
  307. ELSEIF(xweek=4) THEN
  308. SET rweek='星期三';
  309. ELSEIF(xweek=5) THEN
  310. SET rweek='星期四';
  311. ELSEIF(xweek=6) THEN
  312. SET rweek='星期五';
  313. ELSEIF(xweek=7) THEN
  314. SET rweek='星期六';
  315. ELSE
  316. SET rweek='unknown';
  317. END IF;
  318. RETURN rweek;
  319. END;
  320. SELECT fun_get_week(3);
  321. -- 【LOOP/REPEAT/WHILE】循环
  322. CREATE FUNCTION fun_get_sum(max_num int) RETURNS int DETERMINISTIC -- 表示确定的可能有查询,可能有修改
  323. BEGIN
  324. -- 需求:求1+2+3....+100
  325. -- 【WHILE...DO】
  326. DECLARE sum INT DEFAULT 0;
  327. DECLARE num INT DEFAULT 1;
  328. while_lbl:WHILE(num<=max_num) DO
  329. SET sum=sum+num;
  330. SET num=num+1;
  331. END WHILE while_lbl;
  332. RETURN sum;
  333. -- 【LOOP...LEAVE】
  334. -- DECLARE sum INT DEFAULT 0;
  335. -- DECLARE num INT DEFAULT 1;
  336. -- loop_lbl: LOOP
  337. -- if(num<=max_num) THEN
  338. -- SET sum=sum+num;
  339. -- SET num=num+1;
  340. -- ITERATE loop_lbl; -- 【ITERATE:结束当前循环,继续下一次循环】
  341. -- else
  342. -- LEAVE loop_lbl; -- 【LEAVE:退出循环】 注意在循环中使用Leave时,必须声明循环标签,不然会报错
  343. -- END IF;
  344. -- END LOOP loop_lbl;
  345. -- RETURN sum;
  346. --
  347. -- 【REPEAT...UNTIL】 类似do.. while
  348. -- DECLARE sum INT DEFAULT 0;
  349. -- DECLARE num INT DEFAULT 1;
  350. -- repeat_lbl:REPEAT
  351. -- SET sum=sum+num; -- 进来就执行一次
  352. -- SET num=num+1;
  353. -- UNTIL num=max_num+1; -- 【num】为101时跳出循环
  354. -- END REPEAT repeat_lbl ;
  355. -- RETURN sum;
  356. END;
  357. SELECT fun_get_sum(50);
  358. /**********************************************九:存储过程**********************************************/
  359. -- 【IN/OUT/INOUT】存储过程
  360. delimiter $$ -- 自定义分隔符
  361. CREATE PROCEDURE proc_validate_score(in xid int,in xscore decimal(10,2),out result int,out msg VARCHAR(2000)) -- 注意参数类型和里面查询的类型一样
  362. BEGIN
  363. if((SELECT count(1) FROM t_user WHERE t_id=xid AND t_score >xscore)>0) THEN
  364. SET result=1;
  365. SET msg='存在';
  366. ELSE
  367. SET result=0;
  368. SET msg='不存在';
  369. END IF;
  370. END;
  371. $$
  372. -- 【call】执行存储过程
  373. SET @inout_xscore=1;
  374. CALL proc_get_score(2,@out_xname,@inout_xscore);
  375. -- 查询输出参数
  376. SELECT @out_xname,@inout_xscore;
  377. -- 【drop】删除存储过程
  378. DROP PROCEDURE proc_get_score;
  379. /**********************************************十:事务**********************************************/
  380. -- 事务之间的隔离性
  381. -- 1.【READ UNCOMMITTED】(脏读)
  382. -- 例子:事务A:张三给李四转账了1000元,此时事务A还没提交,此时事务B李四去查询自己的余额,发现多了1000元,
  383. -- 当事务A回滚后,李四又发现自己余额少了1000元
  384. -- 2.【READ COMMITTED】(读可以提交, ORACLE默认)
  385. -- 例子:事务A:张三拿着工资卡(余额10000元)去购物,系统检测到卡里有足够的钱,此时事务A还没提交,测试事务B
  386. -- 张三的妻子通过卡号和密码来购买了10000元化妆品并购买成功提交事务B,张三结账时事务A发现卡里余额不足
  387. -- 3.【REPEATABLE COMMITTED】(可重复读取, MySql默认)
  388. -- 例子:事务A:张三拿着工资卡(余额10000元)去购物,系统检测到卡里有足够的钱,此时事务A还没提交,测试事务B
  389. -- 张三的妻子通过卡号和密码来购买了10000元化妆品时,系统提示无法扣卡余额,因为事务A还没有提交或者回滚
  390. -- 4.【SERIALIZABLE】
  391. -- 例子:事务A事务B必须排队来执行,效率低,一般不用
  392. SHOW VARIABLES LIKE '%ISOLATION%';
  393. /*************************************十一:事务+存储过程+输入参数+输出参数*************************************/
  394. -- 创建
  395. delimiter $$
  396. CREATE PROCEDURE proc_update_score
  397. (IN xid int,out result int,out msg VARCHAR(4000))
  398. BEGIN
  399. -- 注意MySql中所有声明的参数必须放在第一行,不然会报错
  400. -- 声明分数
  401. DECLARE d_score DECIMAL(10,2) DEFAULT 0;
  402. -- 声明监视捕捉异常
  403. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  404. BEGIN
  405. GET DIAGNOSTICS CONDITION 1 msg= MESSAGE_TEXT;-- 异常消息
  406. SET result=0; -- 异常状态
  407. END;
  408. -- 开始事务
  409. START TRANSACTION;
  410. SET result=1;-- 默认成功
  411. SET msg='操作成功!';
  412. SELECT t_score INTO d_score FROM t_user WHERE t_id=xid;
  413. -- 更新表t_user
  414. UPDATE t_user SET t_score=t_score+d_score,modify_user='proc_update_score',modify_time=NOW();
  415. -- 测试异常,正常执行时注释
  416. -- SELECT * FROM t;
  417. -- 更新表t_student
  418. UPDATE t_student set modify_user='proc_update_score',modify_time=NOW();
  419. -- 提交/回滚
  420. IF(result=0) THEN
  421. ROLLBACK;
  422. ELSE
  423. COMMIT;
  424. END IF;
  425. END
  426. $$
  427. -- 调用存储过程
  428. -- CALL proc_update_score(1,@out_result,@out_msg);
  429. SELECT @out_result,@out_msg;
  430. -- DROP PROCEDURE proc_update_score;
  431. /******************************十二:事务+存储过程+输入参数+输出参数+嵌套存储过程+多行数据/多个结果集************************/
  432. delimiter $$
  433. CREATE PROCEDURE proc_get_score(in xid int,in xscore DECIMAL(10,2),out result int,out msg VARCHAR(2000))
  434. pro_label:BEGIN -- 添加开始标签,实现mssql的reurn的效果
  435. -- 定义异常
  436. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  437. BEGIN
  438. get diagnostics CONDITION 1 msg=message_text;
  439. SET result=0;
  440. END;
  441. START TRANSACTION;
  442. -- 初始化返回参数
  443. SET result=1;
  444. SET msg='操作成功!';
  445. -- 调用子查询过程
  446. CALL proc_validate_score(xid,xscore,@son_out_result,@son_out_msg);
  447. if(@son_out_result=0) THEN
  448. SET result=@son_out_result;
  449. SET msg=@son_out_msg;
  450. ROLLBACK;
  451. LEAVE pro_label;
  452. END IF;
  453. SELECT '通过验证';
  454. -- 查询结果集
  455. UPDATE t_user SET t_score=t_score+xscore where t_id=xid;
  456. SELECT * FROM t_user where t_id=xid;
  457. SELECT * FROM t_student WHERE t_id=xid;
  458. -- 提交/回滚
  459. if(result=0) THEN
  460. ROLLBACK;
  461. ELSE
  462. COMMIT;
  463. END IF;
  464. END $$
  465. -- 调用存储过程
  466. CALL proc_get_score (1,36,@result,@msg);
  467. SELECT @result,@msg;
  468. -- 删除存储过程
  469. -- DROP PROCEDURE proc_get_score;
  470. /***************************************************十三:触发器**********************************************/
  471. -- CREATE TRIGGER 【trigger_name】 【trigger_time】 【trigger_event 】
  472. -- ON 【tb_name】 FOR EACH ROW 【trigger_stmt】
  473. -- 【trigger_name】:触发器名称
  474. -- 【tirgger_time】:触发执行事件
  475. -- BEFORE:事件之前触发
  476. -- AFTER:事件之后触发
  477. -- 【trigger_event】:触发事件
  478. -- INSERT:插入某一行时激活触发器,INSERT,LOAD DATA,REPLACE语句可以触发
  479. -- UPDATE:更改某一行时激活触发器,UPDATE语句可以触发
  480. -- DELETE:删除某一行时激活触发器,DELETE,REPLACE语句可以触发
  481. -- 【tb_name】:触发器要执行的哪张表
  482. -- 【FOR EACH ROW】:触发频率为每一行触发一次
  483. -- 【trigger_stmt】:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句
  484. -- 【创建触发器】
  485. CREATE TRIGGER tri_update_user AFTER UPDATE on t_user FOR EACH ROW
  486. BEGIN
  487. -- 查询【t_user】更新的信息
  488. DECLARE old_t_id INT;
  489. DECLARE new_update_user VARCHAR(50);
  490. SELECT new.t_id,new.create_user INTO old_t_id, new_update_user;
  491. -- 更新【t_student】
  492. UPDATE t_student SET create_user=new_update_user where t_id=old_t_id;
  493. END;
  494. -- 【触发触发器】
  495. UPDATE t_user set create_user='tri_update' where t_id=1;
  496. -- 【删除触发器】
  497. DROP TRIGGER tri_update_user;
  498. /***************************************************十五:游标**********************************************/
  499. -- 游标只能在存储过程/函数中使用
  500. delimiter $$
  501. CREATE PROCEDURE proc_cursor(out result int,out msg VARCHAR(4000))
  502. BEGIN
  503. -- 声明参数
  504. DECLARE cursor_result int DEFAULT 1; -- 游标状态
  505. DECLARE name_item VARCHAR(50);
  506. DECLARE score_item DECIMAL(10,2);
  507. DECLARE name_str VARCHAR(1000);
  508. -- 声明游标
  509. DECLARE my_cursor CURSOR FOR (SELECT t_name,t_score FROM t_user);
  510. -- 声明全部异常
  511. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  512. BEGIN
  513. get diagnostics condition 1 msg=MESSAGE_TEXT;
  514. SET result=0; -- 标记事务失败
  515. END;
  516. -- 声明游标找不到数据异常
  517. DECLARE CONTINUE HANDLER FOR NOT FOUND
  518. BEGIN
  519. SET cursor_result=0; -- 标记游标最后一行
  520. END;
  521. START TRANSACTION;
  522. SET result=1;
  523. SET msg='操作成功';
  524. -- 打开游标
  525. OPEN my_cursor;
  526. -- 循环游标
  527. my_loop_label:LOOP
  528. -- 取每一条对象
  529. FETCH my_cursor into name_item,score_item; -- 找不到下一行数据时会报错,触发SQLEXCEPTION 标记result=0
  530. if(cursor_result=0) THEN -- 条件判断放在FETCH下面,触发了异常后,标记就发生了改变
  531. LEAVE my_loop_label; -- 如果到了最后一行,就跳出循环
  532. END IF;
  533. if(score_item>65) THEN
  534. SET name_str=CONCAT_WS(',',name_str,name_item);
  535. -- SELECT name_str;
  536. END IF;
  537. END LOOP my_loop_label;
  538. -- 关闭游标
  539. CLOSE my_cursor;
  540. if(result=0) THEN
  541. ROLLBACK;
  542. ELSE
  543. SET msg=name_str;
  544. COMMIT;
  545. END IF;
  546. END $$
  547. -- 调用存储过程
  548. CALL proc_cursor(@result,@msg);
  549. SELECT @result,@msg;
  550. /********************************************十六:临时表+循环实现游标效果*******************************************/
  551. -- 前言:游标循环的时候会锁表,所以不建议用,下面是不锁表的处理方式
  552. delimiter $$
  553. CREATE PROCEDURE proc_temp_table(out result int,out msg VARCHAR(4000))
  554. BEGIN
  555. -- 临时表标记
  556. DECLARE temp_index int DEFAULT 1;
  557. DECLARE name_item VARCHAR(50);
  558. DECLARE score_item DECIMAL(10,2);
  559. DECLARE name_str VARCHAR(1000);
  560. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  561. BEGIN
  562. get diagnostics CONDITION 1 msg=message_text;
  563. SET result=0;
  564. END;
  565. START TRANSACTION;
  566. SET result=1;
  567. SET msg='操作成功';
  568. -- 如果临时表存在就删除临时表
  569. DROP TEMPORARY TABLE IF EXISTS temp_user;
  570. -- 创建临时表
  571. CREATE TEMPORARY TABLE temp_user
  572. (
  573. id INT PRIMARY KEY Auto_Increment UNIQUE KEY NOT NULL COMMENT '自增id',
  574. tu_name VARCHAR(50) NULL COMMENT '姓名',
  575. tu_score DECIMAL(10,2) NULL COMMENT '分数'
  576. ) ENGINE=INNODB Auto_Increment=1 DEFAULT CHARSET =utf8;
  577. INSERT temp_user(tu_name,tu_score) SELECT t_name,t_score FROM t_user;
  578. while_label:WHILE(TRUE) DO
  579. SELECT MIN(id) INTO temp_index FROM temp_user WHERE id=temp_index;
  580. if(temp_index is NULL) THEN
  581. LEAVE while_label;
  582. END IF;
  583. SELECT tu_name,tu_score INTO name_item,score_item FROM temp_user WHERE id=temp_index;
  584. if(score_item>65) THEN
  585. SET name_str=CONCAT_WS(',',name_str,name_item);
  586. END IF;
  587. SET temp_index=temp_index+1;
  588. END WHILE while_label;
  589. if(result=0) THEN
  590. ROLLBACK;
  591. ELSE
  592. SET msg=name_str;
  593. COMMIT;
  594. END IF;
  595. END $$
  596. -- 调用存储过程
  597. CALL proc_temp_table(@result,@msg);
  598. SELECT @result,@msg;
  599. -- DROP PROCEDURE proc_temp_table
  600. /***************************************************十七:数据库设计**********************************************/
  601. -- 数据库关系
  602. -- 1对1: 1张表
  603. -- 1:1001
  604. -- 2:1002
  605. -- 1对多:2张表
  606. -- 1 1001:1
  607. -- 2 1002:1
  608. -- 3 1003:2
  609. -- 1004:2
  610. -- 1005:2
  611. -- 多对多:3张表
  612. -- 1 1001 1:1001
  613. -- 2 1002 1:1002
  614. -- 3 1003 2:1001
  615. -- 2:1002
  616. /*********************************十八:数据库权限**********************************/
  617. use mysql;
  618. -- 新建用户
  619. CREATE USER test@127.0.0.1 IDENTIFIED by 'admin123';
  620. -- 修改用户名和连接地址
  621. RENAME USER test@127.0.0.1 to n_test@127.0.0.1;
  622. -- 修改用户密码
  623. SET PASSWORD FOR test@127.0.0.1 ='admin';
  624. -- 删除用户
  625. DROP USER n_test@127.0.0.1;
  626. -- 刷新服务,马上生效
  627. FLUSH PRIVILEGES;
  628. -- 展示目前数据库所有的权限种类
  629. SHOW PRIVILEGES;
  630. -- 展示当前用户拥有的权限
  631. -- 方法一
  632. SHOW GRANTS FOR test@127.0.0.1;
  633. -- 方法二
  634. SELECT * FROM USER where USER='test';
  635. -- 赋予权限
  636. GRANT SELECT,INSERT,UPDATE on testdb.t_user to n_test@127.0.0.1;
  637. -- 收回权限
  638. REVOKE INSERT,UPDATE on testdb.t_user FROM n_test@127.0.0.1;
  639. /****************************十九:数据库导入导出*******************************/
  640. -- 导出数据库到本地
  641. -- 1.指定数据库的所有表结构+表数据(不包含存储过程等)
  642. -- mysqldump -u root -p testdb>D:\testdb.sql;
  643. -- mysqldump -u n_test -p -h 127.0.0.1 -P 3306 testdb>d:\testdb.sql
  644. -- 2.指定数据库的指定表结构+表数据(不包含存储过程等)
  645. -- mysqldump -u root -p testdb t_user>D:\testdb.sql;
  646. -- 3.指定数据库的指定表结构【-d】(不包含存储过程等)
  647. -- mysqldump -u root -p -d testdb t_user>D:\testdb.sql;
  648. -- 4.指定数据库的指定表数据【-t】(不包含存储过程等)
  649. -- mysqldump -u root -p -t testdb t_user>D:\testdb.sql
  650. -- 5.指定存储过程和函数
  651. -- mysqldump -u n_test -p -h 127.0.0.1 -P3306 -ntd -R testdb>D:\t_proc.sql
  652. -- 【导出总结】
  653. -- -d 结构(--no-data:不导出任何数据,只导出数据库表结构)
  654. -- -t 数据(--no-create-info:只导出数据,而不添加CREATE TABLE 语句)
  655. -- -n (--no-create-db:只导出数据,而不添加CREATE DATABASE 语句)
  656. -- -R (--routines:导出存储过程以及自定义函数)
  657. -- -E (--events:导出事件)
  658. -- --triggers (默认导出触发器,使用--skip-triggers屏蔽导出)
  659. -- -B (--databases:导出数据库列表,单个库时可省略)
  660. -- --tables 表列表(单个表时可省略)
  661. -- ①同时导出结构以及数据时可同时省略-d和-t
  662. -- ②同时 不 导出结构和数据可使用-ntd
  663. -- ③只导出存储过程和函数可使用-R -ntd
  664. -- ④导出所有(结构&数据&存储过程&函数&事件&触发器)使用-R -E(相当于①,省略了-d -t;触发器默认导出)
  665. -- ⑤只导出结构&函数&事件&触发器使用 -R -E -d
  666. -- 导入本地数据到数据库
  667. -- souce D:\testdb.sql;
  668. /****************************二十:事件(执行计划)*******************************/
  669. -- 创建事件执行日志表
  670. delimiter $$
  671. CREATE TABLE t_event_log
  672. (
  673. tel_id int PRIMARY KEY UNIQUE KEY Auto_Increment NOT NULL COMMENT '主键id',
  674. tel_title varchar(200) NOT NULL COMMENT '主题',
  675. tel_content VARCHAR(4000) NOT NULL COMMENT '内容',
  676. tel_begin_time datetime NOT NULL COMMENT '开始时间',
  677. tel_end_time datetime NOT NULL COMMENT '结束时间'
  678. ) $$ delimiter
  679. -- 事件需求:每个月1日的中午12点执行
  680. -- 查询当前事件状态
  681. SHOW variables like '%sche%';
  682. -- 设置数据库启用
  683. SET GLOBAL event_scheduler=1;
  684. -- 创建事件
  685. -- 分隔符
  686. delimiter $$
  687. -- 创建
  688. CREATE EVENT even_send_log
  689. -- 每一个月
  690. -- ON SCHEDULE EVERY 1 MONTH STARTS
  691. ON SCHEDULE EVERY 1 MINUTE STARTS
  692. -- 开始时间
  693. -- DATE_ADD(
  694. -- DATE_ADD(CURRENT_DATE(),INTERVAL -(DAY(CURRENT_DATE())-1) DAY)
  695. -- ,INTERVAL 12 HOUR)
  696. CURRENT_DATE()
  697. -- 事件执行完成后不删除
  698. ON COMPLETION PRESERVE
  699. -- 启用该事件
  700. ENABLE
  701. DO
  702. BEGIN
  703. -- 执行内容
  704. INSERT INTO t_event_log(tel_title,tel_content,tel_begin_time,tel_end_time)
  705. VALUES('记录日志','记录日志内容',NOW(),NOW());
  706. END
  707. $$ delimiter
  708. SELECT * FROM t_user;
  709. SELECT * FROM t_student;

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/701201
推荐阅读
相关标签
  

闽ICP备14008679号