MySQL数据库函数、存储过程

一、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 小数点后的第三位对其四舍五入

扫描二维码关注公众号,回复: 12164619 查看本文章
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

猜你喜欢

转载自blog.csdn.net/F2001523/article/details/111876046