14 MySQL--事务&函数与流程控制
一、事务
- 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。
一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性
场景: 转账;
1、先建立表
- #原子操作
- start transaction;
- update user set balance=900 where name='wsb'; #买支付100元
- update user set balance=1010 where name='egon'; #中介拿走10元
- update user set balance=1090 where name='ysb'; #卖家拿到90元
- commit;
- #出现异常,回滚到初始状态
- start transaction;
- update user set balance=900 where name='wsb'; #买支付100元
- update user set balance=1010 where name='egon'; #中介拿走10元
- uppdate user set balance=1090 where name='ysb'; #卖家拿到90元,出现异常没有拿到
- rollback; # 回滚到原来的状态
- commit; # 只有提交了,事务操作才完成
-------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
- #介绍
- delimiter //
- create procedure p4(
- out status int
- )
- BEGIN
- 1. 声明如果出现异常则执行{
- set status = 1;
- rollback;
- }
- 开始事务
- -- 由秦兵账户减去100
- -- 方少伟账户加90
- -- 张根账户加10
- commit;
- 结束
- set status = 2;
- END //
- delimiter ;
- #实现
出现异常执行回滚- delimiter //
- create PROCEDURE p5(
- OUT p_return_code tinyint
- )
- BEGIN
- DECLARE exit handler for sqlexception #declare 声明一个 退出 sql异常处理
- BEGIN
- -- ERROR # error
- set p_return_code = 1;
- rollback; # 出错就回滚
- END;
- DECLARE exit handler for sqlwarning # 遇到警告回滚
- BEGIN
- -- WARNING
- set p_return_code = 2;
- rollback;
- END;
#正常执行- START TRANSACTION;
- DELETE from tb1; #delete 执行失败
- insert into blog(name,sub_time) values('yyy',now());
- COMMIT; # 正常执行就commit
- -- SUCCESS
- set p_return_code = 0; # 0 代表执行成功
- END //
- delimiter ;
- #在mysql中调用存储过程
- set @res=123;
- call p5(@res);
- select @res;
- #在python中基于pymysql调用存储过程
- cursor.callproc('p5',(123,))
- print(cursor.fetchall()) #查询select的查询结果
- cursor.execute('select @_p5_0;')
- print(cursor.fetchall())
- 事务
二、函数与流程控制
1、函数
MySQL中提供了许多内置函数,例如:
- 一、数学函数
- ROUND(x,y)
- 返回参数x的四舍五入的有y位小数的值
- RAND()
- 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
- 二、聚合函数(常用于GROUP BY从句的SELECT查询中)
- AVG(col)返回指定列的平均值
- COUNT(col)返回指定列中非NULL值的个数
- MIN(col)返回指定列的最小值
- MAX(col)返回指定列的最大值
- SUM(col)返回指定列的所有值之和
- GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果
- 三、字符串函数
- CHAR_LENGTH(str)
- 返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
- CONCAT(str1,str2,...)
- 字符串拼接
- 如有任何一个参数为NULL ,则返回值为 NULL。
- CONCAT_WS(separator,str1,str2,...)
- 字符串拼接(自定义连接符)
- CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
- CONV(N,from_base,to_base)
- 进制转换
- 例如:
- SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示
- FORMAT(X,D)
- 将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。
- 例如:
- SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
- INSERT(str,pos,len,newstr)
- 在str的指定位置插入字符串
- pos:要替换位置其实位置
- len:替换的长度
- newstr:新字符串
- 特别的:
- 如果pos超过原字符串长度,则返回原字符串
- 如果len超过原字符串长度,则由新字符串完全替换
- INSTR(str,substr)
- 返回字符串 str 中子字符串的第一个出现位置。
- LEFT(str,len)
- 返回字符串str 从开始的len位置的子序列字符。
- LOWER(str)
- 变小写
- UPPER(str)
- 变大写
- REVERSE(str)
- 返回字符串 str ,顺序和字符顺序相反。
- SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
- 不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
- mysql> SELECT SUBSTRING('Quadratically',5);
- -> 'ratically'
- mysql> SELECT SUBSTRING('foobarbar' FROM 4);
- -> 'barbar'
- mysql> SELECT SUBSTRING('Quadratically',5,6);
- -> 'ratica'
- mysql> SELECT SUBSTRING('Sakila', -3);
- -> 'ila'
- mysql> SELECT SUBSTRING('Sakila', -5, 3);
- -> 'aki'
- mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
- -> 'ki'
- 四、日期和时间函数
- CURDATE()或CURRENT_DATE() 返回当前的日期
- CURTIME()或CURRENT_TIME() 返回当前的时间
- DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)
- DAYOFMONTH(date) 返回date是一个月的第几天(1~31)
- DAYOFYEAR(date) 返回date是一年的第几天(1~366)
- DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
- FROM_UNIXTIME(ts,fmt) 根据指定的fmt格式,格式化UNIX时间戳ts
- HOUR(time) 返回time的小时值(0~23)
- MINUTE(time) 返回time的分钟值(0~59)
- MONTH(date) 返回date的月份值(1~12)
- MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
- NOW() 返回当前的日期和时间
- QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
- WEEK(date) 返回日期date为一年中第几周(0~53)
- YEAR(date) 返回日期date的年份(1000~9999)
- 重点:
- DATE_FORMAT(date,format) 根据format字符串格式化date值
- mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
- -> 'Sunday October 2009'
- mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
- -> '22:23:00'
- mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00',
- -> '%D %y %a %d %m %b %j');
- -> '4th 00 Thu 04 10 Oct 277'
- mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
- -> '%H %k %I %r %T %S %w');
- -> '22 22 10 10:23:00 PM 22:23:00 00 6'
- mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
- -> '1998 52'
- mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
- -> ''
- 五、加密函数
- MD5()
- 计算字符串str的MD5校验和
- PASSWORD(str)
- 返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
- 六、控制流函数
- CASE WHEN[test1] THEN [result1]...ELSE [default] END
- 如果testN是真,则返回resultN,否则返回default
- CASE [test] WHEN[val1] THEN [result]...ELSE [default]END
- 如果test和valN相等,则返回resultN,否则返回default
- IF(test,t,f)
- 如果test是真,返回t;否则返回f
- IFNULL(arg1,arg2)
- 如果arg1不是空,返回arg1,否则返回arg2
- NULLIF(arg1,arg2)
- 如果arg1=arg2返回NULL;否则返回arg1
- 七、控制流函数小练习
- #7.1、准备表
- /*
- Navicat MySQL Data Transfer
- Source Server : localhost_3306
- Source Server Version : 50720
- Source Host : localhost:3306
- Source Database : student
- Target Server Type : MYSQL
- Target Server Version : 50720
- File Encoding : 65001
- Date: 2018-01-02 12:05:30
- */
- SET FOREIGN_KEY_CHECKS=0;
- -- ----------------------------
- -- Table structure for course
- -- ----------------------------
- DROP TABLE IF EXISTS `course`;
- CREATE TABLE `course` (
- `c_id` int(11) NOT NULL,
- `c_name` varchar(255) DEFAULT NULL,
- `t_id` int(11) DEFAULT NULL,
- PRIMARY KEY (`c_id`),
- KEY `t_id` (`t_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of course
- -- ----------------------------
- INSERT INTO `course` VALUES ('', 'python', '');
- INSERT INTO `course` VALUES ('', 'java', '');
- INSERT INTO `course` VALUES ('', 'linux', '');
- INSERT INTO `course` VALUES ('', 'web', '');
- -- ----------------------------
- -- Table structure for score
- -- ----------------------------
- DROP TABLE IF EXISTS `score`;
- CREATE TABLE `score` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `s_id` int(10) DEFAULT NULL,
- `c_id` int(11) DEFAULT NULL,
- `num` double DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of score
- -- ----------------------------
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '66.7');
- -- ----------------------------
- -- Table structure for student
- -- ----------------------------
- DROP TABLE IF EXISTS `student`;
- CREATE TABLE `student` (
- `s_id` varchar(20) NOT NULL,
- `s_name` varchar(255) DEFAULT NULL,
- `s_age` int(10) DEFAULT NULL,
- `s_sex` char(1) DEFAULT NULL,
- PRIMARY KEY (`s_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of student
- -- ----------------------------
- INSERT INTO `student` VALUES ('', '鲁班', '', '男');
- INSERT INTO `student` VALUES ('', '貂蝉', '', '女');
- INSERT INTO `student` VALUES ('', '刘备', '', '男');
- INSERT INTO `student` VALUES ('', '关羽', '', '男');
- INSERT INTO `student` VALUES ('', '张飞', '', '女');
- -- ----------------------------
- -- Table structure for teacher
- -- ----------------------------
- DROP TABLE IF EXISTS `teacher`;
- CREATE TABLE `teacher` (
- `t_id` int(10) NOT NULL,
- `t_name` varchar(50) DEFAULT NULL,
- PRIMARY KEY (`t_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of teacher
- -- ----------------------------
- INSERT INTO `teacher` VALUES ('', '大王');
- INSERT INTO `teacher` VALUES ('', 'alex');
- INSERT INTO `teacher` VALUES ('', 'egon');
- INSERT INTO `teacher` VALUES ('', 'peiqi');
- #7.2、统计各科各分数段人数.显示格式:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
- select score.c_id,
- course.c_name,
- sum(CASE WHEN num BETWEEN 85 and 100 THEN 1 ELSE 0 END) as '[100-85]',
- sum(CASE WHEN num BETWEEN 70 and 85 THEN 1 ELSE 0 END) as '[85-70]',
- sum(CASE WHEN num BETWEEN 60 and 70 THEN 1 ELSE 0 END) as '[70-60]',
- sum(CASE WHEN num < 60 THEN 1 ELSE 0 END) as '[ <60]'
- from score,course where score.c_id=course.c_id GROUP BY score.c_id;
1.1、基本使用例子
- CREATE TABLE blog (
- id INT PRIMARY KEY auto_increment,
- NAME CHAR (32),
- sub_time datetime
- );
- INSERT INTO blog (NAME, sub_time)
- VALUES
- ('第1篇','2015-03-01 11:31:21'),
- ('第2篇','2015-03-11 16:31:21'),
- ('第3篇','2016-07-01 10:21:31'),
- ('第4篇','2016-07-22 09:23:21'),
- ('第5篇','2016-07-23 10:11:11'),
- ('第6篇','2016-07-25 11:21:31'),
- ('第7篇','2017-03-01 15:33:21'),
- ('第8篇','2017-03-01 17:32:21'),
- ('第9篇','2017-03-01 18:31:21');
- select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m')
1.2、自定义函数
- #!!!注意!!!
- #函数中不要写sql语句(否则会报错),函数仅仅只是一个功能,是一个在sql中被应用的功能
- #若要想在begin...end...中写sql,请用存储过程
- delimiter //
- create function f1(
- i1 int,
- i2 int)
- returns int
- BEGIN
- declare num int;
- set num = i1 + i2;
- return(num);
- END //
- delimiter ;
- delimiter //
- create function f5(
- i int
- )
- returns int
- begin
- declare res int default 0;
- if i = 10 then
- set res=100;
- elseif i = 20 then
- set res=200;
- elseif i = 30 then
- set res=300;
- else
- set res=400;
- end if;
- return res;
- end //
- delimiter ;
删除函数:
- drop function func_name;
执行函数
- # 获取返回值
- select UPPER('egon') into @res;
- SELECT @res;
- # 在查询中使用
- select f1(11,nid) ,name from tb2;
三、流程控制
1、if 条件语句
- delimiter //
- CREATE PROCEDURE proc_if ()
- BEGIN
- declare i int default 0;
- if i = 1 THEN
- SELECT 1;
- ELSEIF i = 2 THEN
- SELECT 2;
- ELSE
- SELECT 7;
- END IF;
- END //
- delimiter ;
2、循环语句
- # 1.while循环
- delimiter //
- CREATE PROCEDURE proc_while ()
- BEGIN
- DECLARE num INT ;
- SET num = 0 ;
- WHILE num < 10 DO
- SELECT
- num ;
- SET num = num + 1 ;
- END WHILE ;
- END //
- delimiter ;
- # 2.repeat循环
- delimiter //
- CREATE PROCEDURE proc_repeat ()
- BEGIN
- DECLARE i INT ;
- SET i = 0 ;
- repeat
- select i;
- set i = i + 1;
- until i >= 5
- end repeat;
- END //
- delimiter ;
- # 3.loop循环
- BEGIN
- declare i int default 0;
- loop_label: loop
- set i=i+1;
- if i<8 then
- iterate loop_label;
- end if;
- if i>=10 then
- leave loop_label;
- end if;
- select i;
- end loop loop_label;
- END
14 MySQL--事务&函数与流程控制的更多相关文章
- mysql:视图、触发器、事务、存储、函数、流程控制
阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...
- MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...
- [MySQL数据库之Navicat.pymysql模块、视图、触发器、存储过程、函数、流程控制]
[MySQL数据库之Navicat.pymysql模块.视图.触发器.存储过程.函数.流程控制] Navicat Navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降 ...
- MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)
今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...
- MySQL事务概念与流程和索引控制
MySQL事务概念与流程和索引控制 视图 1.什么是视图 我们在执行SQL语句其实就是对表进行操作,所得到的其实也是一张表,而我们需要经常对这些表进行操作,拼接什么的都会产生一张虚拟表,我们可以基于该 ...
- 知识点:Mysql 基本用法之流程控制
流程控制 一. 条件语句 if 语句实例: delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = ...
- Generator函数在流程控制中的应用
扯蛋 做了两年的Nodejs全栈开发,不知道为什么跑来做游戏呢(大概是厦门nodejs不好找工作吧).用的是网易的pomelo的游戏框架.现接手了一个棋牌游戏:二十一点,不懂的规则的可以自行百度. 二 ...
- MySQL 之视图、 触发器、事务、存储过程、内置函数、流程控制、索引
本文内容: 视图 触发器 事务 存储过程 内置函数 流程控制 索引 ------------------------------------------------------------------ ...
- MySQL之视图、触发器、事务、存储、函数、流程控制
一.视图 视图就是一个虚拟表,我们把复杂的sql语句后看到的虚拟表封装起来,给他取个名字,当我们下次使用的时候,就不用再去写复杂的sql语句,直接调用封装后的视图名字,就可以得到我们想要的表,然后就可 ...
随机推荐
- oracle for in 学习
oracle for in 是对于进行循环的数据处理时比较方便的 因为我们平时的操作经常会碰到进行循环的数据操作 以下为建立的例子 1. begin for item in 2..10 loop d ...
- ORACLE与SQL SERVER语法区别
一.数据类型 ORACLE与SQL SERVER在数据类型的对比如下: SQL SERVER ORACLE 数字类型 DECIMAL[(P[, S])] NUMBER[(P[, S])] NUMERI ...
- Oracle 10g RAC OCR 和 VotingDisk 的备份与恢复
Oracle RAC 中OCR 和Voting Disk 备份在我的blog: Oracle RAC 常用维护工具和命令 中已经有说明,现在再次把它单独拿出做一个说明, 因为OCR 和Voting D ...
- PHP查找中文字符的解决方案
在PHP中查找中文字符,有两种方案.1.中文字符是gbk(gb2312)有两种解决方法第一种:将PHP保存为ASCII编码,然后使用strpos查找,如:strpos($curl_res, ‘哈哈’) ...
- bzoj 4772 显而易见的数论——拆分数(五边形数定理)+线性筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4772 题解:https://blog.csdn.net/Dream_Lolita/artic ...
- GitHub10岁之际HanLP自然语言处理包用户量跃居榜首
在本周,GitHub终于度过了属于它自己的十周岁生日.这个在2008年由3个来自旧金山的年轻人创建的基于Git的代码托管网站,先后超越了元老级的SourceForge和背景强大的Google Code ...
- OpenWrt的web服务器
参考: http://www.szchehang.com/news/10602.html 我们登录的路由器主界面就是通过这个软件指定了80端口来访问的.我们要添加自己额外的网站服务,那只需要重新定义一 ...
- ORACLE11g 安装中xhost: unable to open display 问题解决纪实 (go)
http://blog.csdn.net/mchdba/article/details/62235761 1,Xhosts报错 安装好vncserver,本地pc笔记本能通过vnc viewer远程连 ...
- WPF Demo4
<Window x:Class="Demo4.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/ ...
- Unity3D SerialPort处理
using UnityEngine; using System.Collections; using System; using System.Threading; using System.Coll ...