MySQL 数据库函数 存储过程 码字想吐…

数据库函数概述

MySQL函数,是一种控制流程函数,属于数据库用语言。
常见的数据库:
数学函数
聚合函数
字符串函数
日期时间函数

常见数学函数

abs(x) 输出括号内数据绝对值
rand() 输出的值大于等于0,小于1的随机数,不包括1
mod(x,y) x对y取余
power(x,y) x的y次方
round(x) x是个小数,输出离x最近的整数,四舍五入
round(x,y) x是个小数,保留x后y位小数四舍五入最近的值
sqrt(x) 输出x得平方根
trancate(x,y) x是个小数,输出x的y位小数,不四舍五入
ceil(x) 输出大于或者等于x的最小整数
floor(x) 输出小于或者等于的最大整数
greatest(a,b,c…) 输出这组数中最大的
least(a,b,c……) 输出这组数中最小的

来吧!展示!!

abs()

mysql> select abs(-10.123),(-10),(10);
+--------------+-------+----+
| abs(-10.123) | (-10) | 10 |
+--------------+-------+----+
|       10.123 |   -10 | 10 |
+--------------+-------+----+
1 row in set (0.00 sec)

mysql> select abs(-10.123),('-10'),(10);
+--------------+-----+----+
| abs(-10.123) | -10 | 10 |
+--------------+-----+----+
|       10.123 | -10 | 10 |
+--------------+-----+----+
1 row in set (0.00 sec)

rand()

mysql> select rand(),rand();
+--------------------+--------------------+
| rand()             | rand()             |
+--------------------+--------------------+
| 0.1160139684714507 | 0.9852741872754639 |
+--------------------+--------------------+
1 row in set (0.00 sec)

mod()

mysql> select mod(5,2),mod(10,2);
+----------+-----------+
| mod(5,2) | mod(10,2) |
+----------+-----------+
|        1 |         0 |
+----------+-----------+
1 row in set (0.00 sec)

power()

mysql> select power(2,3);
+------------+
| power(2,3) |
+------------+
|          8 |
+------------+
1 row in set (0.00 sec)

round()

mysql> select round(3.1415926),round(3.6),round('-3.2');
+------------------+------------+---------------+
| round(3.1415926) | round(3.6) | round('-3.2') |
+------------------+------------+---------------+
|                3 |          4 |            -3 |
+------------------+------------+---------------+
1 row in set (0.00 sec)

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

sqrt()

mysql> select sqrt(9),sqrt(2);
+---------+--------------------+
| sqrt(9) | sqrt(2)            |
+---------+--------------------+
|       3 | 1.4142135623730951 |
+---------+--------------------+
1 row in set (0.00 sec)

truncate() truncate不会四舍五入

mysql> select truncate(3.1415926535,3);
+--------------------------+
| truncate(3.1415926535,3) |
+--------------------------+
|                    3.141 |
+--------------------------+
1 row in set (0.00 sec)

ceil()

mysql> select ceil(3.1415),ceil(3.6),ceil(3);
+--------------+-----------+---------+
| ceil(3.1415) | ceil(3.6) | ceil(3) |
+--------------+-----------+---------+
|            4 |         4 |       3 |
+--------------+-----------+---------+
1 row in set (0.00 sec)

floor()

mysql> select floor(3.1415),floor(3.6),floor(3);
+---------------+------------+----------+
| floor(3.1415) | floor(3.6) | floor(3) |
+---------------+------------+----------+
|             3 |          3 |        3 |
+---------------+------------+----------+
1 row in set (0.00 sec)

greatest()

mysql> select greatest(1,2,3,4,5);
+---------------------+
| greatest(1,2,3,4,5) |
+---------------------+
|                   5 |
+---------------------+
1 row in set (0.00 sec)

least()

mysql> select least(5,4,3,2,1);
+------------------+
| least(5,4,3,2,1) |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)

常见聚合函数

avg() 输出指定列的平均值
count() 输出指定列中非null的个数
min() 输出指定列的最小值
max() 输出指定列的最大值
sum() 输出指定列的和

来吧!接着展示!!

创建一个纯数字的表方便展示

mysql> select * from shizhi;
+-------+
| shuzi |
+-------+
|     2 |
|     3 |
|     5 |
|     7 |
|   102 |
+-------+
5 rows in set (0.00 sec)

avg()

mysql> select avg(shuzi) from shizhi;
+------------+
| avg(shuzi) |
+------------+
|    23.8000 |
+------------+
1 row in set (0.00 sec)

count()

mysql> select count(shuzi) from shizhi;
+--------------+
| count(shuzi) |
+--------------+
|            5 |
+--------------+
1 row in set (0.00 sec)

min()

mysql> select min(shuzi) from shizhi;
+------------+
| min(shuzi) |
+------------+
|          2 |
+------------+
1 row in set (0.00 sec)

max()

mysql> select max(shuzi) from shizhi;
+------------+
| max(shuzi) |
+------------+
|        102 |
+------------+
1 row in set (0.00 sec)

sum()

mysql> select sum(shuzi) from shizhi;
+------------+
| sum(shuzi) |
+------------+
|        119 |
+------------+
1 row in set (0.00 sec)

常见字符串函数

length(x) 输出字符串长度
trim() 输出去除指定格式的值,默认是空格
concat() 将两个字符串接在一起
upper() 将字符串内的字母变成大写
lower() 将字符串内的字符变成小写
left(x,y) 输出 x 的前 y 个字符
right(x,y) 输出 x 的后 y 个字符
repeat(x,y) 将字符串 x 输出 y 次
space(x) 输出 x 个空格
repace(x,y,z) 替代 x 中 的 y 为 z
strcmp(x,y) 对 x y 进行比较,大于输出1,等于输出0,小于输出 -1
substring(x,y,z) 输出 x 的第 y 位开始长度为 z 的字符串
reverse(x) 将 x 反转

来吧!再展示!!

length()

mysql> select length(3.14159),length(314159),length('3 14159'),length('盖伦');
+-----------------+----------------+-------------------+------------------+
| length(3.14159) | length(314159) | length('3 14159') | length('盖伦')   |
+-----------------+----------------+-------------------+------------------+
|               7 |              6 |                 7 |                6 |
+-----------------+----------------+-------------------+------------------+
1 row in set (0.00 sec)

trim() 发现在字符串中间的空格是不能被过滤的

mysql> select trim('1 3 5'),trim(' 135 ');
+---------------+---------------+
| trim('1 3 5') | trim(' 135 ') |
+---------------+---------------+
| 1 3 5         | 135           |
+---------------+---------------+
1 row in set (0.00 sec)

concat()

mysql> select concat('abc','def');
+---------------------+
| concat('abc','def') |
+---------------------+
| abcdef              |
+---------------------+
1 row in set (0.00 sec)

upper()

mysql> select upper('abc'),upper('ABC');
+--------------+--------------+
| upper('abc') | upper('ABC') |
+--------------+--------------+
| ABC          | ABC          |
+--------------+--------------+
1 row in set (0.00 sec)

lower()

mysql> select lower('abc'),lower('ABC');
+--------------+--------------+
| lower('abc') | lower('ABC') |
+--------------+--------------+
| abc          | abc          |
+--------------+--------------+
1 row in set (0.00 sec)

left()

mysql> select left(123456,3),left('abcdef',3),left(1.23456,3);
+----------------+------------------+-----------------+
| left(123456,3) | left('abcdef',3) | left(1.23456,3) |
+----------------+------------------+-----------------+
| 123            | abc              | 1.2             |
+----------------+------------------+-----------------+
1 row in set (0.00 sec)

right()

mysql> select right(123456,3),right('abcdef',3),right('1.23456',3);
+-----------------+-------------------+--------------------+
| right(123456,3) | right('abcdef',3) | right('1.23456',3) |
+-----------------+-------------------+--------------------+
| 456             | def               | 456                |
+-----------------+-------------------+--------------------+
1 row in set (0.00 sec)

repeat()

mysql> select repeat('abc',3);
+-----------------+
| repeat('abc',3) |
+-----------------+
| abcabcabc       |
+-----------------+
1 row in set (0.00 sec)

space()

mysql> select space('5'),space('15');;
+------------+-----------------+
| space('5') | space('15')     |
+------------+-----------------+
|            |                 |
+------------+-----------------+
1 row in set (0.00 sec)

replace()

mysql> select replace('abc','b','z');
+------------------------+
| replace('abc','b','z') |
+------------------------+
| azc                    |
+------------------------+
1 row in set (0.00 sec)

strcmp()

mysql> select strcmp(1,2),strcmp(1,1),strcmp(2,1);
+-------------+-------------+-------------+
| strcmp(1,2) | strcmp(1,1) | strcmp(2,1) |
+-------------+-------------+-------------+
|          -1 |           0 |           1 |
+-------------+-------------+-------------+
1 row in set (0.00 sec)

substring()

mysql> select substring('abcdefg',2,3);
+--------------------------+
| substring('abcdefg',2,3) |
+--------------------------+
| bcd                      |
+--------------------------+
1 row in set (0.00 sec)

reverse()

mysql> select reverse('abcdef'),reverse(123456);
+-------------------+-----------------+
| reverse('abcdef') | reverse(123456) |
+-------------------+-----------------+
| fedcba            | 654321          |
+-------------------+-----------------+
1 row in set (0.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 是本年的第几天

来吧!展示不动了……

curdate()

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2020-08-25 |
+------------+
1 row in set (0.01 sec)

curtime()

mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 20:13:05  |
+-----------+
1 row in set (0.00 sec)

now()

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2020-08-25 20:13:25 |
+---------------------+
1 row in set (0.00 sec)

month()

mysql> select month('2020-8-25'),month(now());
+--------------------+--------------+
| month('2020-8-25') | month(now()) |
+--------------------+--------------+
|                  8 |            8 |
+--------------------+--------------+
1 row in set (0.00 sec)

week()

mysql> select week('2020-8-25'),week(now());
+-------------------+-------------+
| week('2020-8-25') | week(now()) |
+-------------------+-------------+
|                34 |          34 |
+-------------------+-------------+
1 row in set (0.00 sec)

hour()

mysql> select hour('20:15'),hour(now());
+---------------+-------------+
| hour('20:15') | hour(now()) |
+---------------+-------------+
|            20 |          20 |
+---------------+-------------+
1 row in set (0.00 sec)

minute()

mysql> select minute('20:17'),minute(now());
+-----------------+---------------+
| minute('20:17') | minute(now()) |
+-----------------+---------------+
|              17 |            17 |
+-----------------+---------------+
1 row in set (0.00 sec)

second()

mysql> select second('20:17:9'),second(now());
+-------------------+---------------+
| second('20:17:9') | second(now()) |
+-------------------+---------------+
|                 9 |            11 |
+-------------------+---------------+
1 row in set (0.00 sec)

dayofweek()

mysql> select dayofweek('2020-8-25'),dayofweek(now());
+------------------------+------------------+
| dayofweek('2020-8-25') | dayofweek(now()) |
+------------------------+------------------+
|                      3 |                3 |
+------------------------+------------------+
1 row in set (0.00 sec)

dayofmonth()

mysql> select dayofmonth('2020-8-25'),dayofmonth(now());
+-------------------------+-------------------+
| dayofmonth('2020-8-25') | dayofmonth(now()) |
+-------------------------+-------------------+
|                      25 |                25 |
+-------------------------+-------------------+
1 row in set (0.00 sec)

dayofyear()

mysql> select dayofyear('2020-8-25'),dayofyear(now());
+------------------------+------------------+
| dayofyear('2020-8-25') | dayofyear(now()) |
+------------------------+------------------+
|                    238 |              238 |
+------------------------+------------------+
1 row in set (0.00 sec)

数据库存储

SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。

存储过程的优点:

(1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2).标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
(3).较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
(4).减少网络流量:针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织进存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载。
(5).作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

MySQL的存储过程

存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。

MySQL 的参数分为:输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字表示。其中,输入参数可以传递给一个存储过程;输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。
此外,存储过程的主体部分,被称为过程体,包含了在调用时必须执行的 SQL 语句。这个部分以关键字 BEGIN 开始,以关键字 END 结束。若过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。

来吧!再一次展示!!

创建存储

mysql> delimiter $$   ##开始存储语句
mysql> create procedure cjt()  ##创建存储过程 名字叫 cjt
    -> begin  ##开始
    -> create table blog(id int(3) primary key,mingzi varchar(10));
    -> desc blog;
    -> end$$  ##结束
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;  ##结束存储语句
mysql> call cjt;   ##调用语句
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(3)      | NO   | PRI | NULL    |       |
| mingzi | varchar(10) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

Query OK, 0 rows affected (0.02 sec)


mysql> select * from chengji;
+----+------+--------+
| id | fs   | dengji |
+----+------+--------+
|  1 |   60 | 优秀   |
+----+------+--------+
1 row in set (0.00 sec)

mysql> delimiter $$
mysql> create procedure gz(in z int(3))
    -> begin
    -> declare ddj varchar(10);
    -> if z >= 90;
    -> ^C
mysql> delimiter ;
mysql> delimiter $$
mysql> create procedure gz(in z int(3))   ##(in 参数名  类型 ##相当于位置变量吧)
    -> begin
    -> declare djj varchar(12);   ##设置变量 djj
    -> if z >= 90 then    ## if判断
    -> set djj = 'good';  ##赋值
    -> else
    -> set djj = 'haixing';
    -> end if;
    -> update chengji set fs=z,dengji=djj where id=1;
    -> end$$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> call gz(90);    ##(输入“位置变量”)
Query OK, 1 row affected (0.01 sec)

mysql> select * from chengji;
+----+------+--------+
| id | fs   | dengji |
+----+------+--------+
|  1 |   90 | good   |
+----+------+--------+
1 row in set (0.00 sec)

mysql> call gz(80);
Query OK, 1 row affected (0.00 sec)

mysql> select * from chengji;
+----+------+---------+
| id | fs   | dengji  |
+----+------+---------+
|  1 |   80 | haixing |
+----+------+---------+
1 row in set (0.01 sec)

查看存储

mysql> mysql> show procedure status where db='sannianji';
+-----------+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db        | Name | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-----------+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| sannianji | cjt  | PROCEDURE | root@localhost | 2020-08-25 22:53:23 | 2020-08-25 22:53:23 | DEFINER       |         | utf8                 | utf8_general_ci      | utf8_general_ci    |
| sannianji | gz   | PROCEDURE | root@localhost | 2020-08-25 23:38:53 | 2020-08-25 23:38:53 | DEFINER       |         | utf8                 | utf8_general_ci      | utf8_general_ci    |
+-----------+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
2 rows in set (0.00 sec)

删除存储

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

猜你喜欢

转载自blog.csdn.net/Ora_G/article/details/108226796