一、MySQL数据库函数
MySQL提供了实现各种功能的函数
1. 常用的函数分类
- 1.数学函数
- 2.聚合函数
- 3.字符串函数
- 4.日期时间函数
2. 数学函数
常用的数学函数:
- 1、abs(x)返回x的绝对值
- 2、rand()返回0到1的随机数
- 3、mod(x,y)返回x除以y以后的余数
- 4、power(x,y)返回x的y次方
- 5、round(x)返回离x最近的整数
- 6、round(x,y)保留x的y位小数四舍五入后的值
- 7、sqrt(x)返回x的平方根
- 8、truncate(x,y)返回数字x截断为y位小数的值
- 9、ceil(x)返回大于或等于x的最小整数
- 10、floor(x)返回小于或等于x的最大整数
- 11、greatest(x1,×2…)返回集合中最大的值
- 12、least(x1,x2…)返回集合中最小的值
2.1 abs(x)
abs(x):绝对值
mysql> select abs(-2);
+---------+
| abs(-2) |
+---------+
| 2 |
+---------+
1 row in set (0.00 sec)
2.2 rand(x)
rand(x):0-1的随机数
mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.7556996119727377 |
+--------------------+
1 row in set (0.00 sec)
0-10的随机数
mysql> select rand()*10;
+-------------------+
| rand()*10 |
+-------------------+
| 8.203479385192953 |
+-------------------+
1 row in set (0.00 sec)
2.3 mod(x,y)
mod(x,y):返回x除以y的余数
mysql> select mod(3,2);
+----------+
| mod(3,2) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
2.4 power(x,y)
power(x,y):返回x的y次方
mysql> select power(2,2);
+------------+
| power(2,2) |
+------------+
| 4 |
+------------+
1 row in set (0.00 sec)
2.5 round(x)
round(x):返回离x最近的整数,四舍五入
看小数点的第一位数决定返回值,第二位是四舍五入,进行+1或不加
mysql> select round(1.4);
+------------+
| round(1.4) |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
mysql> select round(1.6);
+------------+
| round(1.6) |
+------------+
| 2 |
+------------+
1 row in set (0.00 sec)
2.6 round(x,y)
round(x,y):保留x的y位小数四舍五入的值
1.2226 小数点后的第三位对其四舍五入
mysql> select round(1.2226,3);
+-----------------+
| round(1.2226,3) |
+-----------------+
| 1.223 |
+-----------------+
1 row in set (0.00 sec)
2.7 sqrt(x)
sqrt(x):返回x的平方根
mysql> select sqrt(4);
+---------+
| sqrt(4) |
+---------+
| 2 |
+---------+
1 row in set (0.00 sec)
2.8 truncate(x,y)
truncate(x,y):返回数字x截断为y位的小数的值
mysql> select truncate(1.226,2);
+-------------------+
| truncate(1.226,2) |
+-------------------+
| 1.22 |
+-------------------+
1 row in set (0.00 sec)
2.9 ceil(x)
ceil(x):返回大于或等于x的最小整数
mysql> select ceil(1.1);
+-----------+
| ceil(1.1) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
2.10 floor(x)
floor(x):返回小于或等于x的最大整数
mysql> select floor(1.1);
+------------+
| floor(1.1) |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
2.11 greatest (x1,y1)
greatest(x1,y1…):返回集合中最大的值
mysql> select greatest(1,2,3);
+-----------------+
| greatest(1,2,3) |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.00 sec)
有NULL值优先返回NULL
mysql> select greatest(1,2,3,null);
+----------------------+
| greatest(1,2,3,null) |
+----------------------+
| NULL |
+----------------------+
1 row in set (0.00 sec)
2.12 least(x1,y1…)
least(x1,y1…):返回集合中最小的值
mysql> select least(1,2,3);
+--------------+
| least(1,2,3) |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
有NULL值优先返回NULL
mysql> select least(1,2,3,null);
+-------------------+
| least(1,2,3,null) |
+-------------------+
| NULL |
+-------------------+
1 row in set (0.00 sec)
3. 聚合函数
对表中数据记录进行集中概括而设计的一类函数
常用的聚合函数:
- 1、avg()返回指定列的平均值
- 2、count()返回指定列中非NULL值的个数
- 3、min()返回指定列的最小值
- 4、max()返回指定列的最大值
- 5、sum()返回指定列的所有值之和
4. 字符串函数
常用的字符串函数:
- 1、length(x)返回字符串x的长度
- 2、trim()返回去除指定格式的值
- 3、concat(x,y) 将提供的参数x和y拼接成一个字符串
- 4、upper(x)将字符串x的所有字母变成大写字母
- 5、lower(x)将字符串x的所有字母变成小写字母
- 6、left(x,y)返回字符串x的前y个字符
- 7、right(x,y)返回字符串x的后y个字符
- 8、repeat(x,y) 将字符串x重复y次
- 9、space(x)返回x个空格
- 10、replace(x,y,z) 将字符串z替代字符串x中的字符串y
- 11、strcmp(x,y) 比较x和y,返回的值可以为-1,0,1
- 12、substring(x,y,z) 获取从字符串x中的第y个位置开始长度为z的字符串
- 13、reverse(x) 将字符串x反转
4.1 length(x)
length(x):返回字符串x的长度
空格也算一个长度
mysql> select length('111 ');
+----------------+
| length('111 ') |
+----------------+
| 4 |
+----------------+
1 row in set (0.00 sec)
''算空值,没有长度
mysql> select length('');
+------------+
| length('') |
+------------+
| 0 |
+------------+
1 row in set (0.00 sec)
因为’null’,加了单引号,被当作为一个字符串,所以会有长度
mysql> select length('null');
+----------------+
| length('null') |
+----------------+
| 4 |
+----------------+
1 row in set (0.00 sec)
null没加单引号,不被视为字符串,返回的就是它本身null
mysql> select length(null);
+--------------+
| length(null) |
+--------------+
| NULL |
+--------------+
1 row in set (0.00 sec)
// An highlighted block
var foo = 'bar';
4.2 trim()
trim():返回去掉指定格式的值
去掉头尾空格,中间的空格不去掉
mysql> select trim(' a c x');
+----------------+
| trim(' a c x') |
+----------------+
| a c x |
+----------------+
1 row in set (0.00 sec)
4.3 concat(x,y)
mysql> select concat('ab','fa');
+-------------------+
| concat('ab','fa') |
+-------------------+
| abfa |
+-------------------+
1 row in set (0.00 sec)
4.4 upper(x)
upper(x):将字符串x的所有字母变成大写字母
mysql> select upper('ab');
+-------------+
| upper('ab') |
+-------------+
| AB |
+-------------+
1 row in set (0.00 sec)
4.5 lower(x)
lower(x):将字符串x的所有字母变成小写字母
mysql> select lower('AB');
+-------------+
| lower('AB') |
+-------------+
| ab |
+-------------+
1 row in set (0.00 sec)
// An highlighted block
var foo = 'bar';
4.6 left(x,y)
left(x,y):返回字符串x的前y个字符
mysql> select left('abcde',4);
+-----------------+
| left('abcde',4) |
+-----------------+
| abcd |
+-----------------+
1 row in set (0.00 sec)
4.7 right(x,y)
right(x,y) :返回字符串x的后y个字符
mysql> select right('abcde',2);
+------------------+
| right('abcde',2) |
+------------------+
| de |
+------------------+
1 row in set (0.00 sec)
4.8 repeat(x,y)
repeat(x,y) 将字符串x重复y次
mysql> select repeat('abc',2);
+-----------------+
| repeat('abc',2) |
+-----------------+
| abcabc |
+-----------------+
1 row in set (0.00 sec)
4.9 space(x)
space(x):返回x个空格
mysql> select concat('abc',space(2),'abc');
+------------------------------+
| concat('abc',space(2),'abc') |
+------------------------------+
| abc abc |
+------------------------------+
1 row in set (0.00 sec)
4.10 replace(x,y,z)
replace(x,y,z) :将字符串z替代字符串x中的字符串y
mysql> select replace('abcfa','fa','123');
+-----------------------------+
| replace('abcfa','fa','123') |
+-----------------------------+
| abc123 |
+-----------------------------+
1 row in set (0.00 sec)
把z换成空值可以达到删除的效果
mysql> select replace('abcfa','fa','');
+--------------------------+
| replace('abcfa','fa','') |
+--------------------------+
| abc |
+--------------------------+
1 row in set (0.00 sec)
4.11 strcmp(x,y)
strcmp(x,y) :比较x和y,返回的值可以为-1,0,1
mysql> select strcmp(1,1);
+-------------+
| strcmp(1,1) |
+-------------+
| 0 |
+-------------+
1 row in set (0.00 sec)
mysql> select strcmp(0,1);
+-------------+
| strcmp(0,1) |
+-------------+
| -1 |
+-------------+
1 row in set (0.00 sec)
mysql> select strcmp(1,0);
+-------------+
| strcmp(1,0) |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
注:当x值的长度和y值长度不一样,选取长度最短的一个值,然后进行相同位置长度大小的比较
这边就是 50 比 49 大,返回 1
mysql> select strcmp(50,49);
+---------------+
| strcmp(50,49) |
+---------------+
| 1 |
+---------------+
1 row in set (0.00 sec)
这边就是 49 比 50小,返回 -1
mysql> select strcmp(49,50);
+---------------+
| strcmp(49,50) |
+---------------+
| -1 |
+---------------+
1 row in set (0.00 sec)
4.12 substring(x,y,z)
substring(x,y,z) :获取从字符串x中的第y个位置开始长度为z的字符串
截取字符串时,从x位置开始截取,包括x位置
mysql> select substring('abcde',2,3);
+------------------------+
| substring('abcde',2,3) |
+------------------------+
| bcd |
+------------------------+
1 row in set (0.00 sec)
4.13 reverse(x)
reverse(x) :将字符串x反转
mysql> select reverse('abc');
+----------------+
| reverse('abc') |
+----------------+
| cba |
+----------------+
1 row in set (0.01 sec)
null加入单引号,会被视为字符串,进行反转
mysql> select reverse('null');
+-----------------+
| reverse('null') |
+-----------------+
| llun |
+-----------------+
1 row in set (0.00 sec)
不加单引号,返回的就是它本身的null值
mysql> select reverse(null);
+---------------+
| reverse(null) |
+---------------+
| NULL |
+---------------+
1 row in set (0.00 sec)
5.日期函数
MySQL也支持日期时间处理,提供了很多处理日期和时间的函数。
常用的日期时间函数:
- 1、curdate() 返回当前时间的年月日
- 2、curtime() 返回当前时间的时分秒
- 3、now()返回当前时间的日期和时间
- 4、month(x) 返回日期×中的月份值
- 5、week(x) 返回日期×是年度第几个星期
- 6、hour(x) 返回x中的小时值
- 7、minute(x) 返回×中的分钟值
- 8、second(x) 返回×中的秒钟值
- 9、dayofweek(x) 返回×是星期几,1星期日,2星期一
- 10、dayofmonth(x) 计算日期×是本月的第几天
- 11、dayofyear(x) 计算日期×是本年的第几天
5.1 curdate() 、curtime()、now()
1、curdate() 返回当前时间的年月日
2、curtime() 返回当前时间的时分秒
3、now()返回当前时间的日期和时间
mysql> select curdate(),curtime(),now();
+------------+-----------+---------------------+
| curdate() | curtime() | now() |
+------------+-----------+---------------------+
| 2020-12-28 | 07:26:37 | 2020-12-28 07:26:37 |
+------------+-----------+---------------------+
1 row in set (0.00 sec)
5.2 month(x)、week(x)、hour(x)
1、month(x) 返回日期×中的月份值
2、week(x) 返回日期×是年度第几个星期
3、hour(x) 返回x中的小时值
mysql> select month('2020-12-28'),week('2020-12-28'),hour('18:28');
+---------------------+--------------------+---------------+
| month('2020-12-28') | week('2020-12-28') | hour('18:28') |
+---------------------+--------------------+---------------+
| 12 | 52 | 18 |
+---------------------+--------------------+---------------+
1 row in set (0.00 sec)
5.3、minute(x)、second(x)
返回当前时间的多少分和多少秒
mysql> select minute(now()),second(now());
+---------------+---------------+
| minute(now()) | second(now()) |
+---------------+---------------+
| 31 | 45 |
+---------------+---------------+
1 row in set (0.00 sec)
5.4、dayofweek(x)、dayofmonth(x)、dayofyear(x)
返回当前时间本周的第多少天
外国 1 是星期天,所以需要 7-1=6,礼拜6
mysql> select dayofweek(now());
+------------------+
| dayofweek(now()) |
+------------------+
| 2 |
+------------------+
1 row in set (0.00 sec)
返回当前时间本月的第多少天
mysql> select dayofmonth(now());
+-------------------+
| dayofmonth(now()) |
+-------------------+
| 28 |
+-------------------+
1 row in set (0.00 sec)
返回当前时间本年的第多少天
mysql> select dayofyear(now());
+------------------+
| dayofyear(now()) |
+------------------+
| 363 |
+------------------+
1 row in set (0.00 sec)
二、MySQL存储过程
前面学习的 MySQL 相关知识都是针对一个表或几个表的单条 SQL 语句,使用这样的SQL 语句虽然可以完成用户的需求,但在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条 SQL 语句一起去处理才能够完成,这时候就可以使用存储过程, 轻松而高效的去完成这个需求。
1.存储过程的优点
- 存储过程执行一次后,生成的二进制代码就驻留在缓冲区,之后如果再次调用的话,将直接调用二进制代码,使得存储过程的执行效率和性能得到大幅提升。
- 存储过程是 SQL语句加上控制语句的集合,有很强的灵活性,可以完成复杂的运算。
- 存储过程存储在服务器端,客户端调用时,直接在服务器端执行,客户端只是传输的调用语句,从而可以降低网络负载。
- 存储过程被创建后,可以多次重复调用,它将多条SQL封装到了一起,可随时针对SQL语句进行修改,不影响调用它的客户端。
- 存储过程可以完成所有的数据库操作,也可以通过编程的方式控制数据库的信息访问权限。
2.创建存储过程语法
使用 CREATE PROCEDURE 语句创建存储过程,其语法格式如下所示。
声明语句结束符,可以自定义
DELIMITER $$ ## 这里的 $$ 和 // 符号都是可以自定义的,但是必须要和结束 END 后面的结束符相同才可以!
或
DELIMITER //
创建存储过程
CREATE PROCEDURE demo_in_parameter(IN p_in int)
BEGIN ## 存储过程开始
中间内容是我们要创建存储过程的内容,下面我会给大家示例说明
END $$ ## 存储过程结束
变量赋值:
SET @p_in=1
变量定义:
DECLARE l_int int unsigned default 40;
创建mysql存储过程、存储函数:
create procedure 存储过程名(参数)
存储过程体:
create function 存储函数名(参数)
示例:
#这里需要注意,必须先进入你想进行操作的数据库才可以!不然会进入存储过程出不去!
mysql> use fa;
Database changed
mysql> delimiter $$
mysql> create procedure jack()
-> begin
-> select id,name,score from nb;
-> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; # 这里分号前有空格,必须加空格!
mysql> call jack(); # 调用存储过程
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 1 | zhangsan | 1 |
| 2 | wangwu | 2 |
| 3 | lisi | 3 |
| 4 | xiao | 4 |
| 5 | hu | 5 |
| 10 | gg | 10 |
| 8 | ff | 8 |
+----+----------+-------+
7 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
3.存储过程的参数
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT
格式:
- CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形…])
3.1 in 输入参数
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量
mysql> delimiter $$
mysql> create procedure in_param(in p_in int)
-> begin
-> select p_in;
-> set p_in=2;
-> select P_in;
-> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> set @p_in=1;
Query OK, 0 rows affected (0.00 sec)
mysql> call in_param(@p_in);
+------+
| p_in |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
+------+
| P_in |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> select @p_in;
+-------+
| @p_in |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
以上可以看出,p_in 在存储过程中被修改,当定义了变量并把值带入进去后,第一个查询出的是外面定义变量的值,而后在存储过程中被修改,所以值变为了2。
3.2 out输出参数
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
mysql> delimiter //
mysql> create procedure out_param(out p_out int)
-> begin
-> select p_out;
-> set p_out=2;
-> select p_out;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> set @p_out=1;
Query OK, 0 rows affected (0.00 sec)
mysql> call out_param(@p_out);
+-------+
| p_out |
+-------+
| NULL |
+-------+
1 row in set (0.00 sec)
#因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的
+-------+
| p_out |
+-------+
| 2 |
+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> select @p_out;
+--------+
| @p_out |
+--------+
| 2 |
+--------+
1 row in set (0.00 sec)
#调用了out_param存储过程,输出参数,改变了p_out变量的值
3.3 inout输入参数
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
mysql> delimiter $$
mysql> create procedure inout_param(inout p_inout int)
-> begin
-> select p_inout;
-> set p_inout=2;
-> select p_inout;
-> end
-> $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> set @p_inout=1;
Query OK, 0 rows affected (0.00 sec)
mysql> call inout_param(@p_inout);
+---------+
| p_inout |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
+---------+
| p_inout |
+---------+
| 2 |
+---------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> select @p_inout;
+----------+
| @p_inout |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
4、 MySQL存储过程的控制语句
4.1 变量作用域
内部的变量在其作用域范围内享有更高的优先权,当执行到 end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是你可以通过 out 参数或者将其值指派给会话变量来保存其值。
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc3()
-> begin
-> declare x1 varchar(5) default 'outer';
-> begin
-> declare x1 varchar(5) default 'inner';
-> select x1;
-> end;
-> select x1;
-> end;
-> //
mysql > DELIMITER ;
4.2 条件语句
4.2.1 if-then-else 语句
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc2(IN parameter int)
-> begin
-> declare var int;
-> set var=parameter+1;
-> if var=0 then
-> insert into t values(17);
-> end if;
-> if parameter=0 then
-> update t set s1=s1+1;
-> else
-> update t set s1=s1+2;
-> end if;
-> end;
-> //
mysql > DELIMITER ;
4.2.2 case语句
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc3 (in parameter int)
-> begin
-> declare var int;
-> set var=parameter+1;
-> case var
-> when 0 then
-> insert into t values(17);
-> when 1 then
-> insert into t values(18);
-> else
-> insert into t values(19);
-> end case;
-> end;
-> //
mysql > DELIMITER ;
case
when var=0 then
insert into t values(30);
when var>0 then
when var<0 then
else
end case
4.3 循环语句
4.3.1 while ···· end while
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc4()
-> begin
-> declare var int;
-> set var=0;
-> while var<6 do
-> insert into t values(var);
-> set var=var+1;
-> end while;
-> end;
-> //
mysql > DELIMITER ;
while 条件 do
--循环体
endwhile