数据库函数
- 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…)返回集合中最小的值
聚合函数
- 对表中数据记录进行集中概括而设计的一类函数
- 常用的聚合函数
- avg() 返回指定列的平均值
- count() 返回指定列中非NULL值的个数
- min() 返回指定列的最小值
- max()返回指定列的最大值
- 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速度更快、执行效率更高
- 存储过程的优点
- 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
- SQL语句加上控制语句的集合,灵活性高
- 在服务器端存储,客户端调用时,降低网络负载
- 可多次重复被调用,可随时修改,不影响客户端调用
- 可完成所有的数据库操作,也可控制数据库的信息访问权限
创建存储过程
- 使用CREATE PROCEDURE语句创建存储过程
- 创建存储过程的语法结构
尽量避免与内置的函数或字段重名
CREATE PROCEDURE<过程名>([过程参数[,……]])<过程体>
[过程参数[,…]] 格式
[ IN | OUT | INOUT ] <参数名> <类型> - 参数分为
- 输入参数: IN
- 输出参数: OUT
- 输入/输出参数: 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