一、函数
MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。
(一)数学函数
函数 | 功能 |
---|---|
ABS(x) | 求绝对值 |
PI() | 返回圆周率 |
SQRT(x) | 平方根函数 |
MOD(x,y) | 求余函数 |
RAND()和RAND(x) | 获取随机数的函数 |
ROUND(x)、ROUND(x,y)和TRUNCATE(x,y) | 四舍五入函数 |
SIGN(x) | 符号函数 |
POW(x,y)、POWER(x,y)和EXP(x) | 幂运算函数 |
LOG(x)和LOG10(x) | 对数运算函数 |
(二)字符串函数
函数 | 功能 |
---|---|
CHAR_LENGTH(s) | 计算字符串s的字符数 |
LENGTH(s) | 计算字符串s的长度 |
CONCAT(s1,s2,...) | 将s1、s2等多个字符串合并成一个字符串 |
CONCAT_WS(x,s1,s2,...) | 将s1、s2等多个字符串合并成一个字符串,但可将各字符串直接用参数x隔开 |
UPPER(s)和UCASE(s) | 将字符串s的所有字母变成大写字母 |
LOWER(s)和LCASE(s) | 将字符串s的所有字母变成小写字母 |
REPEAT(s,n) | 将字符串s重复n次 |
STRCMP(s1,s2) | 比较字符串s1和s2。如果s1大于s2,结果返回1;如果s1等于s2,结果返回0;如果s1小于s2,结果返回-1。 |
REVERSE(s) | 将字符串s的顺序反过来 |
SUBSTRING(s,a,b) | 从字符串s中的第a个字符开始取b个字符 |
(三)日期和时间函数
函数 | 功能 |
---|---|
CURDATE()和CURRENT_DATE() | 获取当前日期 |
CURTIME()和CURRENT_TIME() | 获取当前时间 |
NOW()、CURRENT_TIMESTAMP()、LOCALTIME()和SYSDATE() | 获取当前的日期和时间 |
UNIX_TIMESTAMP() | 以UNIX时间戳的形式返回当前时间 |
UNIX_TIMESTAMP(d) | 将时间d以UNIX时间戳的形式返回 |
FROM_UNIXTIME(d) | 把UNIX时间戳的时间转换为普通格式的时间 |
MONTH(d) | 返回日期d中的月份值,其取值范围是1~12 |
MONTHNAME(d) | 返回日期d中的月份的英文名称 |
YEAR(d) | 返回日期d中的年份值 |
QUARTER(d) | 返回日期d是本年第几季度,值的范围是1~4 |
HOUR(t) | 返回时间t中的小时值 |
MINUTE(t) | 返回时间t中的分钟值 |
SECOND(t) | 返回时间t中的秒钟值 |
(四)条件判断函数
函数 | 功能 |
---|---|
IF(expr,v1,v2) | 如果表达式expr成立,返回结果v1;否则,返回结果v2。 |
IFNULL(v1,v2) | 如果v1的不为空,就显示v1的值;否则就显示v2的值。 |
(五)系统信息函数
函数 | 功能 |
---|---|
VERSION() | 返回数据库的版本号 |
CONNECTION_ID() | 返回服务器的连接数,也就是到现在为止MySQL服务的连接次数 |
DATABASE()和SCHEMA() | 返回当前数据库名 |
USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()和CURRENT_USER | 返回当前用户的名称 |
LAST_INSERT_ID() | 返回最后生成的AUTO_INCREMENT值 |
(六)加密函数
函数 | 功能 |
---|---|
PASSWORD(str) | 可以对字符串str进行加密 |
MD5(str) | 可以对字符串str进行加密 |
DECODE(crypt_str,pswd_str) | 可以使用字符串pswd_str来为crypt_str解密 |
二、自定义函数
(一)语法
Create function function_name(参数列表)returns返回值类型
(二)叙述
- 函数体、函数名,应合法的标识符,不应与系统关键字冲突。
- 一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
- 参数部分,由参数名和参数类型组成。
- 返回值类类型。注意,一定要有return返回值语句。
(三)举例
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `ZZZ1`(PARA_VAR varchar(30))
RETURNS varchar(100) CHARSET latin1
BEGIN
DECLARE NAYIBU_FIR VARCHAR(30) DEFAULT 'THIS IS MY FIRST,';
SET NAYIBU_FIR = concat(NAYIBU_FIR,PARA_VAR);
RETURN NAYIBU_FIR;
END$$
(四)查看自定函数
show function status;
三、事务
应用中的一个业务逻辑,往往由多条语句组合完成。那么我们就可以简单地将事务理解为一组SQL语句的集合,要么这个集合全部成功集合,要么这个集合就全部失败退回到第一句之前的状态。
(一)语法
- 开启事务start transaction,可以简写为 begin
- 然后记录之后需要执行的一组sql
- 提交commit
- 如果所有的sql都执行成功,则提交,将sql的执行结果持久化到数据表内。
- 回滚rollback
- 如果存在失败的sql,则需要回滚,将sql的执行结果,退回到事务开始之时。
- 无论回滚还是提交,都会关闭事务!需要再次开启,才能使用。
- 还有一点需要注意,就是事务只针对当前连接。
(二)举例
使用第一个链接A
Start transaction;
Insert into students values('qreal',5);
结果成功,数据已经变成修改之后!但此时我们没有提交。再从其他连接B来查看,发现数据没有插入。此时如果连接A选择提交,也就是commit操作。则连接B的数据也会发生变化。而如果连接A选择回滚,也就是rollback操作。则连接A再次查询则发现数据还原。
(三)基本原理
提交,就会将结果持久化,不提交就不会。如果我们不开启事务,只执行一条sql,马上就会持久化数据,可以看出,普通的执行就是立即提交。这是因为MySQL默认对sql语句的执行是自动提交的。也就是说,开启事务,实际上就是关闭了自动提交的功能,改成了commit手动提交!
我们可以通过简单的对是否自动提交加以设置,完成开启事务的目的!
自动提交的特征是保存在服务的一个autocommit的变量内。可以进行修改:
Set autocommit = 0;
还需要注意一点,就是事务类似于外键约束,只被innodb引擎支持。
(四)事务的特点
事务的特点ACID。也就是原子性、一致性、隔离性和持久性。
- 原子性:事务是不可分割的。
- 一致性:保证数据在事务的执行周期内,是一致的!
- 隔离型:多个事务之间的干扰关系!隔离级别!
- 持久性:事务一旦被提交,就不可能再被回滚!
网友评论