一、事务

  1. 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。

  2. 一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性

  3. 场景: 转账;

1、先建立表

  1. #原子操作
  2. start transaction;
  3. update user set balance=900 where name='wsb'; #买支付100元
  4. update user set balance=1010 where name='egon'; #中介拿走10元
  5. update user set balance=1090 where name='ysb'; #卖家拿到90元
  6. commit;
  7.  
  8. #出现异常,回滚到初始状态
  9. start transaction;
  10. update user set balance=900 where name='wsb'; #买支付100元
  11. update user set balance=1010 where name='egon'; #中介拿走10元
  12. uppdate user set balance=1090 where name='ysb'; #卖家拿到90元,出现异常没有拿到
  13. rollback; # 回滚到原来的状态
  14. commit; # 只有提交了,事务操作才完成

-------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------

  1. #介绍
  2. delimiter //
  3. create procedure p4(
  4. out status int
  5. )
  6. BEGIN
  7. 1. 声明如果出现异常则执行{
  8. set status = 1;
  9. rollback;
  10. }
  11.  
  12. 开始事务
  13. -- 由秦兵账户减去100
  14. -- 方少伟账户加90
  15. -- 张根账户加10
  16. commit;
  17. 结束
  18.  
  19. set status = 2;
  20.  
  21. END //
  22. delimiter ;
  23.  
  24. #实现
    出现异常执行回滚
  25. delimiter //
  26. create PROCEDURE p5(
  27. OUT p_return_code tinyint
  28. )
  29. BEGIN
  30. DECLARE exit handler for sqlexception #declare 声明一个 退出 sql异常处理
  31. BEGIN
  32. -- ERROR # error
  33. set p_return_code = 1;
  34. rollback; # 出错就回滚
  35. END;
  36.  
  37. DECLARE exit handler for sqlwarning # 遇到警告回滚
  38. BEGIN
  39. -- WARNING
  40. set p_return_code = 2;
  41. rollback;
  42. END;

  43. #正常执行
  44. START TRANSACTION;
  45. DELETE from tb1; #delete 执行失败
  46. insert into blog(name,sub_time) values('yyy',now());
  47. COMMIT; # 正常执行就commit
  48.  
  49. -- SUCCESS
  50. set p_return_code = 0; # 0 代表执行成功
  51.  
  52. END //
  53. delimiter ;
  54.  
  55. #在mysql中调用存储过程
  56. set @res=123;
  57. call p5(@res);
  58. select @res;
  59.  
  60. #在python中基于pymysql调用存储过程
  61. cursor.callproc('p5',(123,))
  62. print(cursor.fetchall()) #查询select的查询结果
  63.  
  64. cursor.execute('select @_p5_0;')
  65. print(cursor.fetchall())
  66.  
  67. 事务

二、函数与流程控制

1、函数

MySQL中提供了许多内置函数,例如:

  1. 一、数学函数
  2. ROUND(x,y)
  3. 返回参数x的四舍五入的有y位小数的值
  4.  
  5. RAND()
  6. 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
  7.  
  8. 二、聚合函数(常用于GROUP BY从句的SELECT查询中)
  9. AVG(col)返回指定列的平均值
  10. COUNT(col)返回指定列中非NULL值的个数
  11. MIN(col)返回指定列的最小值
  12. MAX(col)返回指定列的最大值
  13. SUM(col)返回指定列的所有值之和
  14. GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果
  15.  
  16. 三、字符串函数
  17.  
  18. CHAR_LENGTH(str)
  19. 返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
  20. CONCAT(str1,str2,...)
  21. 字符串拼接
  22. 如有任何一个参数为NULL ,则返回值为 NULL
  23. CONCAT_WS(separator,str1,str2,...)
  24. 字符串拼接(自定义连接符)
  25. CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
  26.  
  27. CONV(N,from_base,to_base)
  28. 进制转换
  29. 例如:
  30. SELECT CONV('a',16,2); 表示将 a 16进制转换为2进制字符串表示
  31.  
  32. FORMAT(X,D)
  33. 将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 0, 则返回结果不带有小数点,或不含小数部分。
  34. 例如:
  35. SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
  36. INSERT(str,pos,len,newstr)
  37. str的指定位置插入字符串
  38. pos:要替换位置其实位置
  39. len:替换的长度
  40. newstr:新字符串
  41. 特别的:
  42. 如果pos超过原字符串长度,则返回原字符串
  43. 如果len超过原字符串长度,则由新字符串完全替换
  44. INSTR(str,substr)
  45. 返回字符串 str 中子字符串的第一个出现位置。
  46.  
  47. LEFT(str,len)
  48. 返回字符串str 从开始的len位置的子序列字符。
  49.  
  50. LOWER(str)
  51. 变小写
  52.  
  53. UPPER(str)
  54. 变大写
  55.  
  56. REVERSE(str)
  57. 返回字符串 str ,顺序和字符顺序相反。
  58.  
  59. SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
  60. 不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
  61.  
  62. mysql> SELECT SUBSTRING('Quadratically',5);
  63. -> 'ratically'
  64.  
  65. mysql> SELECT SUBSTRING('foobarbar' FROM 4);
  66. -> 'barbar'
  67.  
  68. mysql> SELECT SUBSTRING('Quadratically',5,6);
  69. -> 'ratica'
  70.  
  71. mysql> SELECT SUBSTRING('Sakila', -3);
  72. -> 'ila'
  73.  
  74. mysql> SELECT SUBSTRING('Sakila', -5, 3);
  75. -> 'aki'
  76.  
  77. mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
  78. -> 'ki'
  79.  
  80. 四、日期和时间函数
  81. CURDATE()或CURRENT_DATE() 返回当前的日期
  82. CURTIME()或CURRENT_TIME() 返回当前的时间
  83. DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)
  84. DAYOFMONTH(date) 返回date是一个月的第几天(1~31)
  85. DAYOFYEAR(date) 返回date是一年的第几天(1~366)
  86. DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
  87. FROM_UNIXTIME(ts,fmt) 根据指定的fmt格式,格式化UNIX时间戳ts
  88. HOUR(time) 返回time的小时值(0~23)
  89. MINUTE(time) 返回time的分钟值(0~59)
  90. MONTH(date) 返回date的月份值(1~12)
  91. MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
  92. NOW() 返回当前的日期和时间
  93. QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
  94. WEEK(date) 返回日期date为一年中第几周(0~53)
  95. YEAR(date) 返回日期date的年份(1000~9999)
  96.  
  97. 重点:
  98. DATE_FORMAT(date,format) 根据format字符串格式化date
  99.  
  100. mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
  101. -> 'Sunday October 2009'
  102. mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
  103. -> '22:23:00'
  104. mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00',
  105. -> '%D %y %a %d %m %b %j');
  106. -> '4th 00 Thu 04 10 Oct 277'
  107. mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
  108. -> '%H %k %I %r %T %S %w');
  109. -> '22 22 10 10:23:00 PM 22:23:00 00 6'
  110. mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
  111. -> '1998 52'
  112. mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
  113. -> ''
  114.  
  115. 五、加密函数
  116. MD5()
  117. 计算字符串strMD5校验和
  118. PASSWORD(str)
  119. 返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
  120.  
  121. 六、控制流函数
  122. CASE WHEN[test1] THEN [result1]...ELSE [default] END
  123. 如果testN是真,则返回resultN,否则返回default
  124. CASE [test] WHEN[val1] THEN [result]...ELSE [default]END
  125. 如果testvalN相等,则返回resultN,否则返回default
  126.  
  127. IF(test,t,f)
  128. 如果test是真,返回t;否则返回f
  129.  
  130. IFNULL(arg1,arg2)
  131. 如果arg1不是空,返回arg1,否则返回arg2
  132.  
  133. NULLIF(arg1,arg2)
  134. 如果arg1=arg2返回NULL;否则返回arg1
  135.  
  136. 七、控制流函数小练习
  137. #7.1、准备表
  138. /*
  139. Navicat MySQL Data Transfer
  140.  
  141. Source Server : localhost_3306
  142. Source Server Version : 50720
  143. Source Host : localhost:3306
  144. Source Database : student
  145.  
  146. Target Server Type : MYSQL
  147. Target Server Version : 50720
  148. File Encoding : 65001
  149.  
  150. Date: 2018-01-02 12:05:30
  151. */
  152.  
  153. SET FOREIGN_KEY_CHECKS=0;
  154.  
  155. -- ----------------------------
  156. -- Table structure for course
  157. -- ----------------------------
  158. DROP TABLE IF EXISTS `course`;
  159. CREATE TABLE `course` (
  160. `c_id` int(11) NOT NULL,
  161. `c_name` varchar(255) DEFAULT NULL,
  162. `t_id` int(11) DEFAULT NULL,
  163. PRIMARY KEY (`c_id`),
  164. KEY `t_id` (`t_id`)
  165. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  166.  
  167. -- ----------------------------
  168. -- Records of course
  169. -- ----------------------------
  170. INSERT INTO `course` VALUES ('', 'python', '');
  171. INSERT INTO `course` VALUES ('', 'java', '');
  172. INSERT INTO `course` VALUES ('', 'linux', '');
  173. INSERT INTO `course` VALUES ('', 'web', '');
  174.  
  175. -- ----------------------------
  176. -- Table structure for score
  177. -- ----------------------------
  178. DROP TABLE IF EXISTS `score`;
  179. CREATE TABLE `score` (
  180. `id` int(11) NOT NULL AUTO_INCREMENT,
  181. `s_id` int(10) DEFAULT NULL,
  182. `c_id` int(11) DEFAULT NULL,
  183. `num` double DEFAULT NULL,
  184. PRIMARY KEY (`id`)
  185. ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
  186.  
  187. -- ----------------------------
  188. -- Records of score
  189. -- ----------------------------
  190. INSERT INTO `score` VALUES ('', '', '', '');
  191. INSERT INTO `score` VALUES ('', '', '', '');
  192. INSERT INTO `score` VALUES ('', '', '', '');
  193. INSERT INTO `score` VALUES ('', '', '', '');
  194. INSERT INTO `score` VALUES ('', '', '', '');
  195. INSERT INTO `score` VALUES ('', '', '', '');
  196. INSERT INTO `score` VALUES ('', '', '', '');
  197. INSERT INTO `score` VALUES ('', '', '', '');
  198. INSERT INTO `score` VALUES ('', '', '', '');
  199. INSERT INTO `score` VALUES ('', '', '', '');
  200. INSERT INTO `score` VALUES ('', '', '', '66.7');
  201.  
  202. -- ----------------------------
  203. -- Table structure for student
  204. -- ----------------------------
  205. DROP TABLE IF EXISTS `student`;
  206. CREATE TABLE `student` (
  207. `s_id` varchar(20) NOT NULL,
  208. `s_name` varchar(255) DEFAULT NULL,
  209. `s_age` int(10) DEFAULT NULL,
  210. `s_sex` char(1) DEFAULT NULL,
  211. PRIMARY KEY (`s_id`)
  212. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  213.  
  214. -- ----------------------------
  215. -- Records of student
  216. -- ----------------------------
  217. INSERT INTO `student` VALUES ('', '鲁班', '', '男');
  218. INSERT INTO `student` VALUES ('', '貂蝉', '', '女');
  219. INSERT INTO `student` VALUES ('', '刘备', '', '男');
  220. INSERT INTO `student` VALUES ('', '关羽', '', '男');
  221. INSERT INTO `student` VALUES ('', '张飞', '', '女');
  222.  
  223. -- ----------------------------
  224. -- Table structure for teacher
  225. -- ----------------------------
  226. DROP TABLE IF EXISTS `teacher`;
  227. CREATE TABLE `teacher` (
  228. `t_id` int(10) NOT NULL,
  229. `t_name` varchar(50) DEFAULT NULL,
  230. PRIMARY KEY (`t_id`)
  231. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  232.  
  233. -- ----------------------------
  234. -- Records of teacher
  235. -- ----------------------------
  236. INSERT INTO `teacher` VALUES ('', '大王');
  237. INSERT INTO `teacher` VALUES ('', 'alex');
  238. INSERT INTO `teacher` VALUES ('', 'egon');
  239. INSERT INTO `teacher` VALUES ('', 'peiqi');
  240.  
  241. #7.2、统计各科各分数段人数.显示格式:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
  242.  
  243. select score.c_id,
  244. course.c_name,
  245. sum(CASE WHEN num BETWEEN 85 and 100 THEN 1 ELSE 0 END) as '[100-85]',
  246. sum(CASE WHEN num BETWEEN 70 and 85 THEN 1 ELSE 0 END) as '[85-70]',
  247. sum(CASE WHEN num BETWEEN 60 and 70 THEN 1 ELSE 0 END) as '[70-60]',
  248. sum(CASE WHEN num < 60 THEN 1 ELSE 0 END) as '[ <60]'
  249. from score,course where score.c_id=course.c_id GROUP BY score.c_id;

1.1、基本使用例子

  1. CREATE TABLE blog (
  2. id INT PRIMARY KEY auto_increment,
  3. NAME CHAR (32),
  4. sub_time datetime
  5. );
  6.  
  7. INSERT INTO blog (NAME, sub_time)
  8. VALUES
  9. ('第1篇','2015-03-01 11:31:21'),
  10. ('第2篇','2015-03-11 16:31:21'),
  11. ('第3篇','2016-07-01 10:21:31'),
  12. ('第4篇','2016-07-22 09:23:21'),
  13. ('第5篇','2016-07-23 10:11:11'),
  14. ('第6篇','2016-07-25 11:21:31'),
  15. ('第7篇','2017-03-01 15:33:21'),
  16. ('第8篇','2017-03-01 17:32:21'),
  17. ('第9篇','2017-03-01 18:31:21');
  18.  
  19. select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m')

更多函数:中文猛击这里 OR 官方猛击这里

1.2、自定义函数

  1. #!!!注意!!!
  2. #函数中不要写sql语句(否则会报错),函数仅仅只是一个功能,是一个在sql中被应用的功能
  3. #若要想在begin...end...中写sql,请用存储过程
  1. delimiter //
  2. create function f1(
  3. i1 int,
  4. i2 int)
  5. returns int
  6. BEGIN
  7. declare num int;
  8. set num = i1 + i2;
  9. return(num);
  10. END //
  11. delimiter ;
  12. delimiter //
  13. create function f5(
  14. i int
  15. )
  16. returns int
  17. begin
  18. declare res int default 0;
  19. if i = 10 then
  20. set res=100;
  21. elseif i = 20 then
  22. set res=200;
  23. elseif i = 30 then
  24. set res=300;
  25. else
  26. set res=400;
  27. end if;
  28. return res;
  29. end //
  30. delimiter ;

删除函数:

  1. drop function func_name;

执行函数

  1. # 获取返回值
  2. select UPPER('egon') into @res;
  3. SELECT @res;
  4.  
  5. # 在查询中使用
  6. select f1(11,nid) ,name from tb2;

三、流程控制

1、if 条件语句

  1. delimiter //
  2. CREATE PROCEDURE proc_if ()
  3. BEGIN
  4.  
  5. declare i int default 0;
  6. if i = 1 THEN
  7. SELECT 1;
  8. ELSEIF i = 2 THEN
  9. SELECT 2;
  10. ELSE
  11. SELECT 7;
  12. END IF;
  13.  
  14. END //
  15. delimiter ;

2、循环语句

  1. # 1.while循环
  2. delimiter //
  3. CREATE PROCEDURE proc_while ()
  4. BEGIN
  5.  
  6. DECLARE num INT ;
  7. SET num = 0 ;
  8. WHILE num < 10 DO
  9. SELECT
  10. num ;
  11. SET num = num + 1 ;
  12. END WHILE ;
  13.  
  14. END //
  15. delimiter ;
  16. # 2.repeat循环
  17. delimiter //
  18. CREATE PROCEDURE proc_repeat ()
  19. BEGIN
  20.  
  21. DECLARE i INT ;
  22. SET i = 0 ;
  23. repeat
  24. select i;
  25. set i = i + 1;
  26. until i >= 5
  27. end repeat;
  28.  
  29. END //
  30. delimiter ;
  31. # 3.loop循环
  32. BEGIN
  33. declare i int default 0;
  34. loop_label: loop
  35.  
  36. set i=i+1;
  37. if i<8 then
  38. iterate loop_label;
  39. end if;
  40. if i>=10 then
  41. leave loop_label;
  42. end if;
  43. select i;
  44. end loop loop_label;
  45.  
  46. END

14 MySQL--事务&函数与流程控制的更多相关文章

  1. mysql:视图、触发器、事务、存储、函数、流程控制

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...

  2. MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)

    mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...

  3. [MySQL数据库之Navicat.pymysql模块、视图、触发器、存储过程、函数、流程控制]

    [MySQL数据库之Navicat.pymysql模块.视图.触发器.存储过程.函数.流程控制] Navicat Navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降 ...

  4. MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)

    今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...

  5. MySQL事务概念与流程和索引控制

    MySQL事务概念与流程和索引控制 视图 1.什么是视图 我们在执行SQL语句其实就是对表进行操作,所得到的其实也是一张表,而我们需要经常对这些表进行操作,拼接什么的都会产生一张虚拟表,我们可以基于该 ...

  6. 知识点:Mysql 基本用法之流程控制

    流程控制 一. 条件语句 if 语句实例: delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = ...

  7. Generator函数在流程控制中的应用

    扯蛋 做了两年的Nodejs全栈开发,不知道为什么跑来做游戏呢(大概是厦门nodejs不好找工作吧).用的是网易的pomelo的游戏框架.现接手了一个棋牌游戏:二十一点,不懂的规则的可以自行百度. 二 ...

  8. MySQL 之视图、 触发器、事务、存储过程、内置函数、流程控制、索引

    本文内容: 视图 触发器 事务 存储过程 内置函数 流程控制 索引 ------------------------------------------------------------------ ...

  9. MySQL之视图、触发器、事务、存储、函数、流程控制

    一.视图 视图就是一个虚拟表,我们把复杂的sql语句后看到的虚拟表封装起来,给他取个名字,当我们下次使用的时候,就不用再去写复杂的sql语句,直接调用封装后的视图名字,就可以得到我们想要的表,然后就可 ...

随机推荐

  1. oracle for in 学习

    oracle for  in 是对于进行循环的数据处理时比较方便的 因为我们平时的操作经常会碰到进行循环的数据操作 以下为建立的例子 1. begin for item in 2..10 loop d ...

  2. ORACLE与SQL SERVER语法区别

    一.数据类型 ORACLE与SQL SERVER在数据类型的对比如下: SQL SERVER ORACLE 数字类型 DECIMAL[(P[, S])] NUMBER[(P[, S])] NUMERI ...

  3. Oracle 10g RAC OCR 和 VotingDisk 的备份与恢复

    Oracle RAC 中OCR 和Voting Disk 备份在我的blog: Oracle RAC 常用维护工具和命令 中已经有说明,现在再次把它单独拿出做一个说明, 因为OCR 和Voting D ...

  4. PHP查找中文字符的解决方案

    在PHP中查找中文字符,有两种方案.1.中文字符是gbk(gb2312)有两种解决方法第一种:将PHP保存为ASCII编码,然后使用strpos查找,如:strpos($curl_res, ‘哈哈’) ...

  5. bzoj 4772 显而易见的数论——拆分数(五边形数定理)+线性筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4772 题解:https://blog.csdn.net/Dream_Lolita/artic ...

  6. GitHub10岁之际HanLP自然语言处理包用户量跃居榜首

    在本周,GitHub终于度过了属于它自己的十周岁生日.这个在2008年由3个来自旧金山的年轻人创建的基于Git的代码托管网站,先后超越了元老级的SourceForge和背景强大的Google Code ...

  7. OpenWrt的web服务器

    参考: http://www.szchehang.com/news/10602.html 我们登录的路由器主界面就是通过这个软件指定了80端口来访问的.我们要添加自己额外的网站服务,那只需要重新定义一 ...

  8. ORACLE11g 安装中xhost: unable to open display 问题解决纪实 (go)

    http://blog.csdn.net/mchdba/article/details/62235761 1,Xhosts报错 安装好vncserver,本地pc笔记本能通过vnc viewer远程连 ...

  9. WPF Demo4

    <Window x:Class="Demo4.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/ ...

  10. Unity3D SerialPort处理

    using UnityEngine; using System.Collections; using System; using System.Threading; using System.Coll ...