MySQL函数和存储过程

数据库函数

  • MySQL提供了实现各种功能的函数
  • 常用的函数分类
  1. 数学函数
  2. 聚合函数
  3. 字符串函数
  4. 日期时间函数

数学函数

常用的数学函数

  • 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…)返回集合中最小的值

聚合函数

  • 对表中数据记录进行集中概括而设计的一类函数
  • 常用的聚合函数
  1. avg() 返回指定列的平均值
  2. count() 返回指定列中非NULL值的个数
  3. min() 返回指定列的最小值
  4. max()返回指定列的最大值
  5. sum() 返回指定列的所有值之和

字符串函数

常用的字符串函数

  • 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中的字符串
  • ystrcmp(x,y) 比较x和y,返回的值可以为-1,0,1
  • substring(x,y,z) 获取从字符串x中的第y个位置开始长度为z的字符串
  • reverse(x) 将字符串x反转

常用字符串函数用法

mysq> select length("bdqn'), trim(' yellow '), concat("bd', 'qn'), upper('abc') right('hello',3);
+----------------+------------------+--------------------+--------------+-------------------+
| length("bdqn') | trim(' yellow ') | concat('bd', 'qn') | upper('abc') | right('hello', 3) |
+----------------+------------------+--------------------+--------------+-------------------+
4 | yellow | bdqn | ABC | llo |
+----------------+------------------+--------------------+--------------+-------------------+
1 row in set (0.00 sec)
mysql> select repeat('kgc', 2), replace('hello','ll', 'kgc'), strcmp(4,5), substring(bjbdqn',4,2),reverse('hello');
+------------------+----------------------------+-------------+------------------------+-----------------+
l repeat('kgc', 2) | replace('hello';"", 'kgc') | strcmp(4,5) | substring(bjbdqn',4,2) | reverse('hello') |
+------------------+----------------------------+-------------+------------------------+-----------------+
| kgckgc | hekgco | -1 | dq | olleh |
+------------------+----------------------------+-------------+------------------------+-----------------+
1 row in set (o.00 sec)

日期时间函数

  • 常用的日期时间函数
  • 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(), month(2020-02-09'), week(2020-02-09' ), hour(21:13:53');
+-----------+-----------+-------+---------------------+--------------------+-----------------+
| curdate() | curtime() | now() | month(”2020-02-09') | week(2020-02-09'") | hour(21:13:53') |
+-----------+-----------+-------+---------------------+--------------------+-----------------+
| 2020-02-09 | 21:14:34 | 2020-02-09 21:14:34 | 2 | 6 | 21 |
+-----------+-----------+-------+---------------------+--------------------+-----------------+
1 row in set (0.00 sec)
mysql>select minute(21:13:53'), second(21:13:53'), dayofweek(2020-02-09'), dayofmonth(2020-02-09'), dayofyear('2020-02-09");
+-------------------+-------------------+------------------------+-------------------------+-------------------------+
| minute("21:13:53')| second(21:13:53') | dayofweek(2020-02-09') | dayofmonth(2020-02-09') | dayofyear('2020-02-09') |
+-------------------+-------------------+------------------------+-------------------------+-------------------------+
| 13 | 53 | 1 | 9 | 40 |
+-------------------+-------------------+------------------------+-------------------------+-------------------------+
1 row in set (0.00 sec)

存储过程简介

  • 是一组为了完成特定功能的SQL语句集合
  • 比传统SQL速度更快、执行效率更高
  • 存储过程的优点
  1. 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
  2. SQL语句加上控制语句的集合,灵活性高
  3. 在服务器端存储,客户端调用时,降低网络负载
  4. 可多次重复被调用,可随时修改,不影响客户端调用
  5. 可完成所有的数据库操作,也可控制数据库的信息访问权限

创建存储过程

  • 使用CREATE PROCEDURE语句创建存储过程
  • 创建存储过程的语法结构
    尽量避免与内置的函数或字段重名
    CREATE PROCEDURE<过程名>([过程参数[,……]])<过程体>
    [过程参数[,…]] 格式
    [ IN | OUT | INOUT ] <参数名> <类型>
  • 参数分为
  1. 输入参数: IN
  2. 输出参数: OUT
  3. 输入/输出参数: INOUT

创建存储过程

  • 存储过程的主体部分,被称为过程体
  • 以BEGIN开始,以END结束,若只有一条SQL语句,则可以省略BEGIN-END
  • 以DELIMITER开始和结束
mysql> DELIMITER $$ //$$是用户自定义的结束符
//省略存储过程其他步骤
mysql> DELIMITER; //分号前有空格

不带参数的存储过程

mysql> DELIMITER $$
mysql> CREATE PROCEDURE PlayerRole()
 ->BEGIN
 ->SELECT id,name,level from player limit 3;
 -> END $$
Query OK, 0 rows affected (0.01 sec)
mysql> DELIMITER;
mysql> call PlayerRole();
+----+------+-------+
| id | name | level |
+----+------+-------+
| 1 | aaa | 10 |
| 2 | bbb | 10 |
| 3 | ccc | 15 |
+----+------+-------+
3 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

或者

mysql> DELIMITER $$
mysql CREATE PROCEDURE GetRole(IN inname VARCHAR(16))
 -> BEGIN
 -> SELECT id,name,level from player where name=inname;
 -> END $$
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER;
mysql> call GetRole('shirley');
+----+------+-------+
| id | name | level |
+----+------+-------+
|2460 | shirley | 1 |
+----+------+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

带参数的存储过程

mysql> DELIMITER $$
mysql> CREATE PROCEDURE GetRole(IN inname VARCHAR(16))
-> BEGIN
-> SELECT id,name,level from player where name=inname;
-> END $$
Query OK, O rows affected (o.00 sec)
mysql> DELIMITER;
mysql> call GetRole('shirley');
+----+------+-------+
| id | name | level |
+----+------+-------+
|2460 | shirley | 1 |
+----+------+-------+
1 row in set (0.00 sec)
Query Ok, 0 rows affected (0.00 sec)

或者

mysql> DELIMITER $$
mysql CREATE PROCEDURE GetRole(IN inname VARCHAR(16))
-> BEGIN
-> SELECT id,name,level from player where name=inname;
->  END $$
Query OK, O rows affected (0.00 sec)
mysql> DELIMITER;
mysql> call GetRole('shirley');
+----+------+-------+
| id | name | level |
+----+------+-------+
|2460 | shirley | 1 |
+----+------+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

修改存储过程

  • 存储过程的修改分为特征修改和内容修改
  • 特征修改的方法
  • ALTER PROCEDURE <过程名> [<特征> …]
  • 内容修改可先删除原有存储过程,之后再创建的方法

删除存储过程

删除存储过程的语法
注:防止因删除不存在的存储过程而引发的错误
DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <过程名>
删除的具体用法
注:删除之前确认有无依赖关系

mysql> DROP PROCEDURE PlayerRole;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL PlayerRole;
ERROR 1305 (42000): PROCEDURE test.PlayerRole does not exist
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值