文章目录
一、数据库函数
1. 数学函数
数据库内存储的记录,经常要进行一系列的算术操作,所以 MySQL 支持很多数学函数。
- 常用的数学函数
数学函数 | 描述 |
---|---|
abs (x) | 返回x的绝对值;绝对值就是永远是正数,0的绝对值是0 |
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 2…) | 返回集合中最大的值 |
least (x1, x2…) | 返回集合中最小的值 |
- 案例
#返回-2的绝对值
mysql> select abs(-2);
+---------+
| abs(-2) |
+---------+
| 2 |
+---------+
1 row in set (0.00 sec)
-----------------------------------------------------------------------------------------------
#0-1的随机数(0<=x<1) 返回 0 到 1 的随机数
mysql> select rand();
+-------------------+
| rand() |
+-------------------+
| 0.937660732248482 |
+-------------------+
1 row in set (0.00 sec)
#可以搭配运算符,返回0到100的随机数
mysql> select rand()*100;
+-------------------+
| rand()*100 |
+-------------------+
| 59.43208174727119 |
+-------------------+
1 row in set (0.00 sec)
------------------------------------------------------------------------------------------------
#5除以2的余数,返回 x 除以 y 以后的余数
mysql> select mod(5,2);
+----------+
| mod(5,2) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
-----------------------------------------------------------------------------------------------
#2的3次方
mysql> select power(2,3);
+------------+
| power(2,3) |
+------------+
| 8 |
+------------+
1 row in set (0.00 sec)
-----------------------------------------------------------------------------------------------
#离1.49最近的整数,四舍五入
mysql> select round(1.49);
+-------------+
| round(1.49) |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
#离1.5最近的整数
mysql> select round(1.5);
+------------+
| round(1.5) |
+------------+
| 2 |
+------------+
1 row in set (0.00 sec)
#1.893保留小数点后2位,1.896保留小数点后2位,这里会四舍五入
mysql> select round(1.893,2);
+----------------+
| round(1.893,2) |
+----------------+
| 1.89 |
+----------------+
1 row in set (0.00 sec)
mysql> select round(1.896,2);
+----------------+
| round(1.896,2) |
+----------------+
| 1.90 |
+----------------+
1 row in set (0.00 sec)
-----------------------------------------------------------------------------------------------
#返回平方根
mysql> select sqrt(4);
+---------+
| sqrt(4) |
+---------+
| 2 |
+---------+
1 row in set (0.00 sec)
-----------------------------------------------------------------------------------------------
#保留小数点后2位,但truncate函数不会四舍五入(截断)
mysql> select truncate(1.896,2);
+-------------------+
| truncate(1.896,2) |
+-------------------+
| 1.89 |
+-------------------+
1 row in set (0.00 sec)
-------------------------------------------------------------------------------------------------
#返回大于或等于5.2的最小整数
mysql> select ceil(5.2);
+-----------+
| ceil(5.2) |
+-----------+
| 6 |
+-----------+
1 row in set (0.00 sec)
#返回小于或等于5.2的最大整数
mysql> select floor(5.2);
+------------+
| floor(5.2) |
+------------+
| 5 |
+------------+
1 row in set (0.00 sec)
#返回最大值
mysql> select greatest(1,2,3);
+-----------------+
| greatest(1,2,3) |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.00 sec)
#返回最小值
mysql> select least(1,2,3);
+--------------+
| least(1,2,3) |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
2. 聚合函数
MySQL 数据库函数中专门有一组函数是特意为库内记录求和或者对表中的数据进行集中概括而设计的,这些函数被称作聚合函数。
聚合函数 | 描述 |
---|---|
avg() | 返回指定列的平均值 |
count() | 返回指定列中非 NULL 值的个数 |
min() | 返回指定列的最小值 |
max() | 返回指定列的最大值 |
sum(x) | 返回指定列的所有值之和 |
#返回分数的总和
mysql> select sum(score) from info;
+------------+
| sum(score) |
+------------+
| 638.00 |
+------------+
1 row in set (0.00 sec)
#返回分数字段的个数
mysql> select min(score) from info;
+------------+
| min(score) |
+------------+
| 10.00 |
+------------+
1 row in set (0.00 sec)
#返回分数的最大值
mysql> select max(score) from info;
+------------+
| max(score) |
+------------+
| 100.00 |
+------------+
1 row in set (0.00 sec)
#返回分数的平均值
mysql> select avg(score) from info;
+------------+
| avg(score) |
+------------+
| 53.166667 |
+------------+
1 row in set (0.00 sec)
3. 字符串函数
- 常用的字符串函数
函数 | 描述 |
---|---|
length(x) | 返回字符串x的长度 |
trim() | 返回去除指定格式的值 |
concal (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反转 |
#返回abcd的长度,空格也算一个字符
mysql> select length('abcd');
+----------------+
| length('abcd') |
+----------------+
| 4 |
+----------------+
1 row in set (0.00 sec)
mysql> select length('ab cd');
+-----------------+
| length('ab cd') |
+-----------------+
| 5 |
+-----------------+
1 row in set (0.00 sec)
------------------------------------------------------------------------------------------------
#返回去除格式的值
mysql> select trim(' sheng');
+-----------------+
| trim(' sheng') |
+-----------------+
| sheng |
+-----------------+
1 row in set (0.00 sec)
mysql> select ' sheng';
+---------+
| sheng |
+---------+
| sheng |
+---------+
1 row in set (0.00 sec)
------------------------------------------------------------------------------------------------
#concat(x,y)将提供的参数 x 和 y 拼接成一个字符串
mysql> select concat('abc','def');
+---------------------+
| concat('abc','def') |
+---------------------+
| abcdef |
+---------------------+
1 row in set (0.00 sec)
mysql> select concat('abc',' def');
+----------------------+
| concat('abc',' def') |
+----------------------+
| abc def |
+----------------------+
1 row in set (0.00 sec)
#结合其他函数,如trim(将后面的函数删除格式)
mysql> select concat('abc',trim(' def'));
+----------------------------+
| concat('abc',trim(' def')) |
+----------------------------+
| abcdef |
+----------------------------+
1 row in set (0.00 sec)
-------------------------------------------------------------------------------------------------
#upper(x) 将字符串 x 的所有字母变成大写字母
mysql> select upper('abc');
+--------------+
| upper('abc') |
+--------------+
| ABC |
+--------------+
1 row in set (0.00 sec)
#lower(x) 将字符串 x 的所有字母变成小写字母
mysql> select lower('ABC');
+--------------+
| lower('ABC') |
+--------------+
| abc |
+--------------+
1 row in set (0.00 sec)
-------------------------------------------------------------------------------------------------
#left(x,y),返回字符串 x 的前 y 个字符
mysql> select left('abcdefg',3);
+-------------------+
| left('abcdefg',3) |
+-------------------+
| abc |
+-------------------+
1 row in set (0.00 sec)
#left(x,y),返回字符串 x 的后 y 个字符
mysql> select right('abcdefg',3);
+--------------------+
| right('abcdefg',3) |
+--------------------+
| efg |
+--------------------+
1 row in set (0.00 sec)
-----------------------------------------------------------------------------------------------
#把字符串的前3个字母和后3个字母拼接起来
mysql> select concat(left('abcdefg',3),right('abcdefg',3));
+----------------------------------------------+
| concat(left('abcdefg',3),right('abcdefg',3)) |
+----------------------------------------------+
| abcefg |
+----------------------------------------------+
1 row in set (0.00 sec)
#repeat(x,y) 将字符串 x 重复 y 次
mysql> select repeat('abc',2);
+-----------------+
| repeat('abc',2) |
+-----------------+
| abcabc |
+-----------------+
1 row in set (0.00 sec)
-------------------------------------------------------------------------------------------------
#space(x) 返回 x 个空格
mysql> select length(space(3));
+------------------+
| length(space(3)) |
+------------------+
| 3 |
+------------------+
1 row in set (0.00 sec)
-------------------------------------------------------------------------------------------------
#replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
mysql> select replace('hello','ll','aa');
+----------------------------+
| replace('hello','ll','aa') |
+----------------------------+
| heaao |
+----------------------------+
1 row in set (0.00 sec)
-------------------------------------------------------------------------------------------------
#strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1
比较17和18,小于返回-1,等于返回0,大于返回1,只会返回这3个值,它是比较第一位不同的数字
mysql> select strcmp(17,18);
+---------------+
| strcmp(17,18) |
+---------------+
| -1 |
+---------------+
1 row in set (0.00 sec)
mysql> select strcmp(18,18);
+---------------+
| strcmp(18,18) |
+---------------+
| 0 |
+---------------+
1 row in set (0.00 sec)
mysql> select strcmp(19,18);
+---------------+
| strcmp(19,18) |
+---------------+
| 1 |
+---------------+
1 row in set (0.00 sec)
-------------------------------------------------------------------------------------------------
#substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
返回从字符串中第三个字符开始的4个字符
mysql> select substring('abcdefg',3,4);
+--------------------------+
| substring('abcdefg',3,4) |
+--------------------------+
| cdef |
+--------------------------+
1 row in set (0.00 sec)
-------------------------------------------------------------------------------------------------
#reverse(x) 将字符串 x 反转
mysql> select reverse('gfedcba');
+--------------------+
| reverse('gfedcba') |
+--------------------+
| abcdefg |
+--------------------+
1 row in set (0.00 sec)
#返回字符串的前3个字符,然后反转输出
mysql> select reverse(left('gfedcba',3));
+----------------------------+
| reverse(left('gfedcba',3)) |
+----------------------------+
| efg |
+----------------------------+
1 row in set (0.00 sec)
#先将字符串反转,再输出前3个字符
mysql> select left(reverse('gfedcba'),3);
+----------------------------+
| left(reverse('gfedcba'),3) |
+----------------------------+
| abc |
+----------------------------+
1 row in set (0.00 sec)
4. 日期时间函数
字符串函数 | 描述 |
---|---|
curdate () | 返回当前时间的年月日 |
curtime () | 返回当前时间的时分秒 |
now () | 返回当前时间的口期和时间 |
month (x) | 返回日期x中的月份值 |
week (x) | 返回日期x是年度第几个星期 |
hour (x) | 返回x中的小时值 |
minute (x) | 返回x中的分钟值 |
second(x) | 返回x中的秒钟值 |
dayofweek (x) | 返回x是星期几,1星期日,2星期一 |
replace(x, y, z) | 将字符串z替代字符串x中的字符串y |
dayofmonth (x) | 计算日期x是本月的第几天 |
dayofycar (X) | 计算日期x是本年的第几天,返回年月日 |
#返回年月日
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2021-10-29 |
+------------+
1 row in set (0.00 sec)
#返回当前时间
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 19:24:25 |
+-----------+
1 row in set (0.00 sec)
#返回当前完整时间
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2021-10-29 19:27:40 |
+---------------------+
1 row in set (0.01 sec)
#返回月份
mysql> select month('2021-10-29');
+---------------------+
| month('2021-10-29') |
+---------------------+
| 10 |
+---------------------+
1 row in set (0.00 sec)
#返回当前日期是一年中的第几周
mysql> select week('2021-10-29');
+--------------------+
| week('2021-10-29') |
+--------------------+
| 43 |
+--------------------+
1 row in set (0.00 sec)
#返回当前时间的小时
mysql> select hour(curtime());
+-----------------+
| hour(curtime()) |
+-----------------+
| 19 |
+-----------------+
1 row in set (0.00 sec)
#返回当前时间的分钟
mysql> select minute(curtime());
+-------------------+
| minute(curtime()) |
+-------------------+
| 29 |
+-------------------+
1 row in set (0.00 sec)
#返回当前时间的秒
mysql> select second(curtime());
+-------------------+
| second(curtime()) |
+-------------------+
| 49 |
+-------------------+
1 row in set (0.00 sec)
#返回当前是星期几
mysql> select dayofweek(curdate());
+----------------------+
| dayofweek(curdate()) |
+----------------------+
| 6 |
+----------------------+
1 row in set (0.00 sec)
#当前日期是本月的第几天
mysql> select dayofmonth(curdate());
+-----------------------+
| dayofmonth(curdate()) |
+-----------------------+
| 29 |
+-----------------------+
1 row in set (0.00 sec)
#当前日期是今年的第几天
mysql> select dayofyear(curdate());
+----------------------+
| dayofyear(curdate()) |
+----------------------+
| 302 |
+----------------------+
1 row in set (0.00 sec)
二、存储过程
1. 概述
-
存储过程是一组为了完成特定功能的 SQL 语句集合。
-
存储过程这个功能是从 5.0 版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。
-
存储过程在使用过程中是将常用或者复杂的工作预先使用 SQL 语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。
-
操作数据库的传统 SQL 语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高
-
存储过程在数据库中创建并保存,它不仅仅是 SQL 语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。
-
存储过程的应用范围很广,例如封装特定的功能、 在不同的应用程序或平台上执行相同的函数等等。
2. 存储过程的优点
- 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
- SQL语句加上控制语句的集合,灵活性高
- 在服务器端存储,客户端调用时,降低网络负载
- 可多次重复被调用,可随时修改,不影响客户端调用
- 可完成所有的数据库操作,也可控制数据库的信息访问权限
3. 操作流程
- 语法格式
CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
<过程名>:尽量避免与内置的函数或字段重名
<过程体>:语句
[ IN | OUT | INOUT ] <参数名><类型>
- 示例(不带参数的创建)
mysql> delimiter $$ #修改结束符为$$
mysql> create procedure proc() #创建存储过程,过程名为u,不带参数
-> begin #过程提以关键字begin开始
-> create table mk (id int(10),name char(10),score int(10));
-> insert into mk values(1,'wangwu',13);
-> select * from mk; #过程体语句
-> end $$ #过程体以关键字end结束
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; #将语句的结束符号恢复为分号,分号前有空格
mysql> call pro(); #调用存储过程
ERROR 1305 (42000): PROCEDURE gl.pro does not exist
mysql> call proc();
+------+--------+-------+
| id | name | score |
+------+--------+-------+
| 1 | wangwu | 13 |
+------+--------+-------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> select * from mk;
+------+--------+-------+
| id | name | score |
+------+--------+-------+
| 1 | wangwu | 13 |
+------+--------+-------+
1 row in set (0.00 sec)
- 查看某个存储过程的具体信息
#语法格式
SHOW CREATE PROCEDURE [数据库.]存储过程名;
- 查看指定存储过程信息
mysql> show procedure status like '%proc%'\G
*************************** 1. row ***************************
Db: gl
Name: proc
Type: PROCEDURE
Definer: root@localhost
Modified: 2021-10-29 21:17:27
Created: 2021-10-29 21:17:27
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
4. 存储过程的参数
-
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
-
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
-
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值( 值只能是变量)
-
即表示调用者向过程传入值,又表示过程向调用者传出值(只能是变量)
-
案例
use info;
mysql> select * from info;
+----+-----------+--------+----------+-------+----------+
| id | name | score | address | hobby | addr |
+----+-----------+--------+----------+-------+----------+
| 1 | guyi | 99.00 | nanj | 1 | yunnan |
| 2 | lier | 60.00 | beij | 2 | yunnan |
| 3 | lisan | 100.00 | shanghai | 4 | yunnan |
| 4 | wangya | 66.00 | hangzhou | 5 | yunnan |
| 5 | goudan | 38.00 | suzhou | 7 | |
| 6 | hanmeimei | 10.00 | nanjing | 3 | NULL |
| 7 | lilei | 11.00 | nanjing | 5 | NULL |
| 8 | caicai | 16.00 | nanjing | 5 | NULL |
| 9 | shabi | 60.00 | hangzhou | 7 | yunnan |
| 10 | shidan | 88.00 | zhejiang | 4 | alashang |
| 11 | goush | 40.00 | shanghai | 6 | shangc |
| 12 | gobud | 50.00 | shanghai | 9 | nanj |
+----+-----------+--------+----------+-------+----------+
mysql> delimiter @@
mysql> create procedure proc2 (in inname varchar(50)) #行参
-> begin
-> select * from info where name=inname;
-> end @@
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call proc2('wangwu'); #实参
Empty set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call proc2('goudan');
+----+--------+-------+---------+-------+------+
| id | name | score | address | hobby | addr |
+----+--------+-------+---------+-------+------+
| 5 | goudan | 38.00 | suzhou | 7 | |
+----+--------+-------+---------+-------+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
5. 修改存储过程
alter procedure <过程名> [<特征>……]
alter procedure proc modifies sql data sql security invoker;
modifies sql data:表名子程序包含写程序的语句
security:安全等级
invoker:当定义为 invoker 时,只要执行者有执行权,就可以成功执行
6. 删除存储过程
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
DROP PROCEDURE IF EXISTS Proc;
mysql> drop procedure if exists proc;
Query OK, 0 rows affected (0.00 sec)