MySQL数据库--MySQL高级SQL语句三(数据库函数、存储过程、存储过程的创建、修改与删除)

一、 数据库函数

MySQL 数据库函数提供了能够实现各种功能的方法,使我们在查询记录时能够更高效 的输出。MySQL内建了很多函数,常用的包括数学函数、聚合函数、字符串函数和日期时间函数。

1.1 数学函数

MySQL 数学函数
数学函数 描述
abs(x) 返回 x 的绝对值
rand() 返回 0 到 1 的随机数
mod(x,y) 返回 x 除以 y 以后的余数
power(x,y) 返回 x 的 y 次方
round(x) 返回离 x 最近的整数
round(x,y) 保留x的y位小数四舍五入后的值
sqrt(x) 返回 x 的平方根
truncate(x,y) 返回数字 x 截断为 y 位小数的值
ceil(x) 返回大于或等于 x 的最小整数
floor(x) 返回小于或等于 x 的最大整数
greatest(x1,x2…) 返回集合中最大的值
least(x1,x2…) 返回集合中最小的值

MySQL 数学函数的使用方法

mysql> select abs(-77),rand(),mod(7,2),power(2,3);
+----------+--------------------+----------+------------+
| abs(-77) | rand()             | mod(7,2) | power(2,3) |
+----------+--------------------+----------+------------+
|       77 | 0.7469482447457949 |        1 |          8 |
+----------+--------------------+----------+------------+
1 row in set (0.00 sec)

round函数采用四舍五入的机制

mysql> select round(1.49);
+-------------+
| round(1.49) |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

mysql> select round(1.5);
+------------+
| round(1.5) |
+------------+
|          2 |
+------------+
1 row in set (0.00 sec)

mysql> select round(1);
+----------+
| round(1) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

其中,round保留四舍五入后的值;truncate是直接截断,不保留。

mysql> select round(1.345778,3),sqrt(9),truncate(1.2345,3);
+-------------------+---------+--------------------+
| round(1.345778,3) | sqrt(9) | truncate(1.2345,3) |
+-------------------+---------+--------------------+
|             1.346 |       3 |              1.234 |
+-------------------+---------+--------------------+
1 row in set (0.00 sec)

ceil和floor、greatest和least分别代表相对的意思

mysql> select ceil(1.999),floor(1.999),greatest(1,3,2,4),least(3,7,1,6);
+-------------+--------------+-------------------+----------------+
| ceil(1.999) | floor(1.999) | greatest(1,3,2,4) | least(3,7,1,6) |
+-------------+--------------+-------------------+----------------+
|           2 |            1 |                 4 |              1 |
+-------------+--------------+-------------------+----------------+
1 row in set (0.00 sec)

1.2 聚合函数

特意为库内记录求和或者对表中的数据进行集 中概括而设计的,这些函数被称作聚合函数。

MySQL 聚合函数
聚合函数 描述
avg() 返回指定列的平均值
count() 返回指定列中非 NULL 值的个数
min() 返回指定列的最小值
max() 返回指定列的最大值
sum(x) 返回指定列的所有值之和

返回info表中和score字段的所有值的和,非数值型就返回0

mysql> select * from info;
+----+----------+-------+---------+-------+
| id | name     | score | address | hobby |
+----+----------+-------+---------+-------+
|  1 | zhangsan | 80.00 | beijing |     1 |
|  2 | lisi     | 80.00 | nanjing |     1 |
|  3 | wangwu   | 70.00 | beijing |     2 |
|  4 | zhaoliu  | 60.00 | nanjing |     3 |
|  5 | tianqi   | 80.00 | beijing |     2 |
|  6 | heiba    | 70.00 | nanjing |     1 |
+----+----------+-------+---------+-------+
6 rows in set (0.00 sec)

mysql> select sum(score) from info;
+------------+
| sum(score) |
+------------+
|     440.00 |
+------------+
1 row in set (0.00 sec)

mysql> select sum(name) from info;
+-----------+
| sum(name) |
+-----------+
|         0 |
+-----------+
1 row in set, 6 warnings (0.00 sec)

返回info表中和score字段的最大值、最小值

mysql> select max(score) from info;
+------------+
| max(score) |
+------------+
|      80.00 |
+------------+
1 row in set (0.00 sec)

mysql> select min(score) from info;
+------------+
| min(score) |
+------------+
|      60.00 |
+------------+
1 row in set (0.00 sec)

聚合函数中最常用到的是 count()函数,用于统计表中的总记录数。

mysql> select count(score) from info;
+--------------+
| count(score) |
+--------------+
|            6 |
+--------------+
1 row in set (0.00 sec)

mysql> select count(*) from info;    ##count(*)号就表示统计表中的总记录数
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

1.3 字符串函数

MySQL 字符串函数
字符串函数 描述
length(x) 返回字符串 x 的长度
trim() 返回去除指定格式的值
concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
upper(x) 将字符串 x 的所有字母变成大写字母
lower(x) 将字符串 x 的所有字母变成小写字母
left(x,y) 返回字符串 x 的前 y 个字符
right(x,y) 返回字符串 x 的后 y 个字符
repeat(x,y) 将字符串 x 重复 y 次
space(x) 返回 x 个空格
replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1
substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长 度为 z 的字符串
reverse(x) 将字符串 x 反转

length中一个空格也会当一个字符长度

mysql> select length('Hello World'),trim('yellow'),concat('thi','nk'),upper('hello'),lower('HELLO');
+-----------------------+----------------+--------------------+----------------+----------------+
| length('Hello World') | trim('yellow') | concat('thi','nk') | upper('hello') | lower('HELLO') |
+-----------------------+----------------+--------------------+----------------+----------------+
|                    11 | yellow         | think              | HELLO          | hello          |
+-----------------------+----------------+--------------------+----------------+----------------+
1 row in set (0.01 sec)
mysql> select left('translation',5),right('translation',5),repeat('ha',3),replace('HEllo','E','e'),strcmp(4,5),substring('everyday',2,4),reverse('123');
+-----------------------+------------------------+----------------+--------------------------+-------------+---------------------------+----------------+
| left('translation',5) | right('translation',5) | repeat('ha',3) | replace('HEllo','E','e') | strcmp(4,5) | substring('everyday',2,4) | reverse('123') |
+-----------------------+------------------------+----------------+--------------------------+-------------+---------------------------+----------------+
| trans                 | ation                  | hahaha         | Hello                    |          -1 | very                      | 321            |
+-----------------------+------------------------+----------------+--------------------------+-------------+---------------------------+----------------+
1 row in set (0.00 sec)

1.4 日期时间函数

MySQL 也支持日期时间处理,提供了很多处理日期和时间的函数。

日期时间函数
日期时间函数 描述
curdate() 返回当前时间的年月日
curtime() 返回当前时间的时分秒
now() 返回当前时间的日期和时间
month(x) 返回日期 x 中的月份值
week(x) 返回日期 x 是年度第几个星期
hour(x) 返回 x 中的小时值
minute(x) 返回 x 中的分钟值
second(x) 返回 x 中的秒钟值
dayofweek(x) 返回 x 是星期几,1 星期日,2 星期一
dayofmonth(x) 计算日期 x 是本月的第几天
dayofyear(x) 计算日期 x 是本年的第几天

返回当前时间

mysql> select curdate(),curtime(),now();
+------------+-----------+---------------------+
| curdate()  | curtime() | now()               |
+------------+-----------+---------------------+
| 2020-09-03 | 09:45:38  | 2020-09-03 09:45:38 |
+------------+-----------+---------------------+
1 row in set (0.00 sec

返回特定时间点

mysql> select  month('2020-01-01'), week('2020-05-01'), hour('17:59:59'),minute('17:59:59'),second('17:59:59');
+---------------------+--------------------+------------------+--------------------+--------------------+
| month('2020-01-01') | week('2020-05-01') | hour('17:59:59') | minute('17:59:59') | second('17:59:59') |
+---------------------+--------------------+------------------+--------------------+--------------------+
|                   1 |                 17 |               17 |                 59 |                 59 |
+---------------------+--------------------+------------------+--------------------+--------------------+
1 row in set (0.00 sec)

计算日期值

mysql> select dayofweek('2020-01-01'),dayofmonth('2020-10-01'),dayofyear('2020-11-11');
+-------------------------+--------------------------+-------------------------+
| dayofweek('2020-01-01') | dayofmonth('2020-10-01') | dayofyear('2020-11-11') |
+-------------------------+--------------------------+-------------------------+
|                       4 |                        1 |                     316 |
+-------------------------+--------------------------+-------------------------+
1 row in set (0.00 sec)

二、 存储过程

针对一个表或几个表的单条 SQL 语句,使用这样的 SQL 语句虽然可以完成用户的需求,但在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条 SQL 语句一起去处理才能够完成,使用存储过程可以轻松而高效的去完成这个需求。

2.1 存储过程简介

MySQL 数据库存储过程是一组为了完成特定功能的 SQL 语句的集合。存储过程这个 功能是从 5.0 版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中 的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用 SQL 语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存 储过程时,只需要调用它即可。操作数据库的传统 SQL 语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。

存储过程在数据库中创建并保存,它不仅仅是 SQL 语句的集合,还可以加入一些特殊
的控制结构,也可以控制数据的访问方式。

2.2 存储过程的优点

  • 存储过程执行一次后,生成的二进制代码就驻留在缓冲区,之后如果再次调用的话,将
    直接调用二进制代码,使得存储过程的执行效率和性能得到大幅提升。
  • 存储过程是 SQL 语句加上控制语句的集合,有很强的灵活性,可以完成复杂的运算。
  • 存储过程存储在服务器端,客户端调用时,直接在服务器端执行,客户端只是传输的调
    用语句,从而可以降低网络负载。
  • 存储过程被创建后,可以多次重复调用,它将多条 SQL 封装到了一起,可随时针对 SQL语句进行修改,不影响调用它的客户端。
  • 存储过程可以完成所有的数据库操作,也可以通过编程的方式控制数据库的信息访问权
    限。

三、 创建存储过程

3.1. 语法格式

CREATE PROCEDURE <过程名>( [过程参数[,…]] ) <过程体> [过程参数[,…] ] 格式 [ IN| OUT | INOUT ] <参数名><类型>
  • 存储过程的名称应该尽量避免选取与 MySQL 内置的函数或者字段相同的名称,否则会
    发生错误。
  • 存储过程可以添加参数,具有自己的参数列表。参数包括参数名和其对应的类型。
  • 存在多个参数时,参数列表之间用逗号进行分隔。创建存储过程的时候可以不使用参数,但是括号要存在,也可以有一个或多个参数。

MySQL 的参数分为:输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT
三个关键字表示。其中,输入参数可以传递给一个存储过程;输出参数用于存储过程需要返 回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。

3.2 过程体

存储过程的主体部分,被称为过程体,包含了在调用时必须执行的 SQL 语句。 这个部分以关键字 BEGIN 开始,以关键字 END 结束。若过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。

在存储过程的创建过程中,会用到 DELIMITER 命令。因为在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的,过程体中由多条 SQL 语句构成,每条 SQL 后面都是分号结尾,那么 MySQL 服务器在处理时遇到第一条 SQL 语句就会结束整个过程, 不再去处理后面的 SQL 语句。

解决以上问题的办法

mysql>DELIMITER $$ //省略存储过程其他步骤 mysql>DELIMITER ; //分号前有空格

要创建存储过程,必须要具有 CREATE ROUTINE 权限。
使用 SHOW PROCEDURE STATUS 命令查看数据库中存在哪些存储过程。如果要查 看某个存储过程的具体信息,则可以使用SHOWCREATEPROCEDURE<存储过程名称>。

3.3 创建存储过程

##定义存储过程
delimiter $$
create procedure 存储过程名(in 参数名 参数类型)
begin
##定义变量
set 变量名 变量类型
##变量赋值
set 变量名 = 
  sql 语句1;
  sql 语句2;
  ...
  sql 语句n;
end$$
delimiter ;

##调用存储过程名
call 存储过程名(实际参数)

##查询存储过程
show procedure status where db='数据库'

##删除存储过程
drop procedure 存储过程名

创建过程

mysql> delimiter $$
mysql> create procedure MyRole()
    -> begin
    -> select name,score from info;
    -> end$$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

查看创建的存储过程

mysql> show procedure status where db='home';
+------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db   | Name   | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| home | MyRole | PROCEDURE | root@localhost | 2020-09-03 10:54:30 | 2020-09-03 10:54:30 | DEFINER       |         | utf8                 | utf8_general_ci      | utf8_general_ci    |
+------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)

调用存储过程

mysql> call MyRole()
+----------+-------+
| name     | score |
+----------+-------+
| zhangsan | 80.00 |
| lisi     | 80.00 |
| wangwu   | 70.00 |
| zhaoliu  | 60.00 |
| tianqi   | 80.00 |
| heiba    | 70.00 |
+----------+-------+
6 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

3.4 修改存储过程

存储过程在创建之后,随着开发业务的不断推进,业务需求难免有所调整,相应的存储
过程也会发生变动,这个时候就需要修改存储过程。存储过程的修改分为特征的修改和业务 内容的修改。特征的修改可以使用 ALTER PROCEDURE 来实现。

ALTER PROCEDURE <过程名> [<特征> … ]

存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储
过程。

3.5 删除存储过程

存储过程创建之时是存储到 MySQL 数据库中的,当程序不在调用这个存储过程时,也 就意味这个存储过程被废弃了,废弃的存储过程需要从数据库中将其删除。使用 DROP PROCEDURE 语句即可删除存储过程。

DROP { PROCEDURE | FUNCTION } [ IFEXISTS ]<过程名>

需要注意的是:存储过程名称后面没有参数列表,也没有括号。在删除之前,必须确认
该存储过程没有任何依赖关系,否则会导致与之关联的存储过程无法运行。

mysql> drop procedure MyRole;
Query OK, 0 rows affected (0.00 sec)

mysql> show procedure status where db='home';
Empty set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/kimowinter/article/details/108368550