补鞋匠都能看明了的sql高阶语句(数据函数库(聚合函数、字符串函数、日期时间函数)、存储过程)

数据函数库+存储过程

  • 一、MySQL数据库函数
    • 1.1 数学函数
      • 1.1.1 abs(x)与rand( )
      • 1.1.2 mod(x,y)与power(x,y)
      • 1.1.3 round(x)与round(x,y)
      • 1.1.4 sqrt(x)与truncate(x,y)
      • 1.1.5 ceil(x)与floor(x)
      • 1.1.6 greatest(x1,x2)与least(x1,x2)
    • 1.2 聚合函数
      • 1.2.1 sum( )与count( )
      • 1.2.2 min( )、max( )与avg( )
    • 1.3 字符串函数
      • 1.3.1 length(x)与trim( )
      • 1.3.2 concat(x,y)
      • 1.3.3 upper(x) 与lower(x)
      • 1.3.4 left(x,y)与right(x,y)
      • 1.3.5 repeat(x,y) 与space(x)
      • 1.3.6 replace(x,y,z)与strcmp(x,y)
      • 1.3.7 substring(x,y,z) 与reverse(x)
    • 1.4 日期时间函数
      • 1.4.1 curdate( )、curtime( )与now( )
      • 1.4.2 year(x)、month(x)和week(x)
      • 1.4.3 hour(x)、minute(x)、second(x)
      • 1.4.4 dayofweek(x)、dayofmonth(x)、dayofyear(x)
  • 二、MySQL存储过程
    • 2.1 MySQL存储过程概述
    • 2.2 MySQL存储过程优点
    • 2.3 MySQL存储过程创建
      • 2.3.1 不带参数的创建MySQL存储过程
      • 2.3.2 MySQL带参数的存储过程
  • 四、总结
    • 1. MySQL数据库函数
    • 2. MySQL存储过程

一、MySQL数据库函数

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

1.1.1 abs(x)与rand( )

【返回-5514的绝对值】
mysql> select abs(-5514);
+------------+
| abs(-5514) |
+------------+
|       5514 |
+------------+

【返回0-1的随机数(0<=x<1)】
mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.8426012078696873 |
+--------------------+

【可以搭配运算符使用】
mysql> select rand()*10000000;
+-------------------+
| rand()*10000000   |
+-------------------+
| 5140734.682922005 |
+-------------------+

1.1.2 mod(x,y)与power(x,y)

【返回7除以4的余数】
mysql> select mod(7,4);
+----------+
| mod(7,4) |
+----------+
|        3 |
+----------+

【返回210次方】
mysql> select power(2,10);
+-------------+
| power(2,10) |
+-------------+
|        1024 |
+-------------+

1.1.3 round(x)与round(x,y)

【返回距离5514.49最近的整数(四舍五入)】
mysql> select round(5514.49);
+----------------+
| round(5514.49) |
+----------------+
|           5514 |
+----------------+


mysql> select round(5514.5);
+---------------+
| round(5514.5) |
+---------------+
|          5515 |
+---------------+


mysql> select round(5514.500001);
+--------------------+
| round(5514.500001) |
+--------------------+
|               5515 |
+--------------------+


【返回5.144保留小数点后3位的数(四舍五入)】
mysql> select round(5.144,2);
+----------------+
| round(5.144,2) |
+----------------+
|           5.14 |
+----------------+

mysql> select round(5.145,2);
+----------------+
| round(5.145,2) |
+----------------+
|           5.15 |
+----------------+

mysql> select round(5.1450000001,2);
+-----------------------+
| round(5.1450000001,2) |
+-----------------------+
|                  5.15 |
+-----------------------+

1.1.4 sqrt(x)与truncate(x,y)

【返回平方根】
mysql> select sqrt(9);
+---------+
| sqrt(9) |
+---------+
|       3 |
+---------+

mysql> select sqrt(8);
+--------------------+
| sqrt(8)            |
+--------------------+
| 2.8284271247461903 |
+--------------------+


【保留小数点后4位,后面直接截断(不会四舍五入)】
mysql> select truncate(2.332124,4);
+----------------------+
| truncate(2.332124,4) |
+----------------------+
|               2.3321 |
+----------------------+

mysql> select truncate(2.332199,4);
+----------------------+
| truncate(2.332199,4) |
+----------------------+
|               2.3321 |
+----------------------+

1.1.5 ceil(x)与floor(x)

【返回大于或等于5.000000001的最小整数】
mysql> select ceil(5.000000001);
+-------------------+
| ceil(5.000000001) |
+-------------------+
|                 6 |
+-------------------+

mysql> select ceil(5.000000);
+----------------+
| ceil(5.000000) |
+----------------+
|              5 |
+----------------+

【返回小于或等于8.9999999的最大整数】
mysql> select floor(8.999999);
+-----------------+
| floor(8.999999) |
+-----------------+
|               8 |
+-----------------+

mysql> select floor(8.00000);
+----------------+
| floor(8.00000) |
+----------------+
|              8 |
+----------------+

1.1.6 greatest(x1,x2)与least(x1,x2)

【返回结合中最大的值】
mysql> select greatest(5,35,44);
+-------------------+
| greatest(5,35,44) |
+-------------------+
|                44 |
+-------------------+

mysql> select greatest(0.12,-0.32,0.01);
+---------------------------+
| greatest(0.12,-0.32,0.01) |
+---------------------------+
|                      0.12 |
+---------------------------+

mysql> select greatest(0.12,0.32,0.01);
+--------------------------+
| greatest(0.12,0.32,0.01) |
+--------------------------+
|                     0.32 |
+--------------------------+


【返回集合中最小的值】
mysql> select least(0.12,0.32,0.01);
+-----------------------+
| least(0.12,0.32,0.01) |
+-----------------------+
|                  0.01 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select least(0.12,-0.32,0.01);
+------------------------+
| least(0.12,-0.32,0.01) |
+------------------------+
|                  -0.32 |
+------------------------+
1 row in set (0.00 sec)

mysql> select least(5,35,44);
+----------------+
| least(5,35,44) |
+----------------+
|              5 |
+----------------+

1.2 聚合函数

  • MySQL数据库函数中专门有一组函数是特意为库内记录求和或者对表中的数据进行集中概括而设计的,这些函数被称作聚合函数
  • 常用的聚合函数如下表
函数 说明
avg( ) 返回指定列的平均值
count( ) 返回指定列中非NULL值的个数
min( ) 返回指定列的最小值
max( ) 返回指定列的最大值
sum( ) 返回指定列的所有值之和

1.2.1 sum( )与count( )

mysql> select * from qz1;
+--------+--------------+---------+--------+--------+--------+
| 编号   | 姓名         | 得分    | 地址   | 特长   | addr   |
+--------+--------------+---------+--------+--------+--------+
|      1 | 刘一         |  80.000 | 北京   | 2      | NULL   |
|      2 | 王二         |  90.000 | 深圳   | 2      | 南京   |
|      3 | 李四         |  60.000 | 上海   | 4      | NULL   |
|      4 | 田五         |  99.000 | 南京   | 5      | 南京   |
|      5 | 教授         | 100.000 | 成都   | 3      | 南京   |
|      6 | 小明         |  10.000 | 镇江   | 3      | NULL   |
|      7 | 刘二         |  60.000 | 北京   | 2      | NULL   |
|      8 | 刘二蛋       | 112.000 | 北京   | 3      | 南京   |
|      9 | 刘小天田     | 112.000 | 北京   | 4      |        |
+--------+--------------+---------+--------+--------+--------+

【返回qz1表里得分列的总和】
mysql> select sum(得分) from qz1;
+-------------+
| sum(得分)   |
+-------------+
|     723.000 |
+-------------+


【返回qz1表里得分列的字段个数】
mysql> select count(得分) from qz1;
+---------------+
| count(得分)   |
+---------------+
|             9 |
+---------------+

1.2.2 min( )、max( )与avg( )

mysql> select * from qz1;
+--------+--------------+---------+--------+--------+--------+
| 编号   | 姓名         | 得分    | 地址   | 特长   | addr   |
+--------+--------------+---------+--------+--------+--------+
|      1 | 刘一         |  80.000 | 北京   | 2      | NULL   |
|      2 | 王二         |  90.000 | 深圳   | 2      | 南京   |
|      3 | 李四         |  60.000 | 上海   | 4      | NULL   |
|      4 | 田五         |  99.000 | 南京   | 5      | 南京   |
|      5 | 教授         | 100.000 | 成都   | 3      | 南京   |
|      6 | 小明         |  10.000 | 镇江   | 3      | NULL   |
|      7 | 刘二         |  60.000 | 北京   | 2      | NULL   |
|      8 | 刘二蛋       | 112.000 | 北京   | 3      | 南京   |
|      9 | 刘小天田     | 112.000 | 北京   | 4      |        |
+--------+--------------+---------+--------+--------+--------+

【返回qz1表里得分列最小值】
mysql> select min(得分) from qz1;
+-------------+
| min(得分)   |
+-------------+
|      10.000 |
+-------------+

【返回qz1表里得分列最大值】
mysql> select max(得分) from qz1;
+-------------+
| max(得分)   |
+-------------+
|     112.000 |
+-------------+


【返回qz1表里得分列平均值】
mysql> select avg(得分) from qz1;
+-------------+
| avg(得分)   |
+-------------+
|  80.3333333 |
+-------------+

1.3 字符串函数

  • 常用的字符串函数如下表
函数 说明
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反转

1.3.1 length(x)与trim( )

【返回字符串qwer的长度】
mysql> select length('qwer');
+----------------+
| length('qwer') |
+----------------+
|              4 |
+----------------+

【返回字符串qw e r的长度。空格也算一个字符】
mysql> select length('qw e r');
+------------------+
| length('qw e r') |
+------------------+
|                6 |
+------------------+

【去掉格式只输出字符串qz】
mysql> select trim('   qz');
+---------------+
| trim('   qz') |
+---------------+
| qz            |
+---------------+

【对比用trim函数的显示】
mysql> select '   qz';
+-------+
| qz    |
+-------+
|    qz |
+-------+

1.3.2 concat(x,y)

【将字符串qwe和字符串rty拼接起来】
mysql> select concat('qwe','rty');
+---------------------+
| concat('qwe','rty') |
+---------------------+
| qwerty              |
+---------------------+


mysql> select concat('qwe',' rty');
+----------------------+
| concat('qwe',' rty') |
+----------------------+
| qwe rty              |
+----------------------+


【也可结合其他函数一并使用】
mysql> select concat('qwe',trim(' rty'));
+----------------------------+
| concat('qwe',trim(' rty')) |
+----------------------------+
| qwerty                     |
+----------------------------+

1.3.3 upper(x) 与lower(x)

【将字符串qwe转换为大写字母】
mysql> select upper('qwe');
+--------------+
| upper('qwe') |
+--------------+
| QWE          |
+--------------+


【将字符串QwE转换成小写字母】
mysql> select lower('QwE');
+--------------+
| lower('QwE') |
+--------------+
| qwe          |
+--------------+

1.3.4 left(x,y)与right(x,y)

【返回字符串前5个字母】
mysql> select left('qwertyy',5);
+-------------------+
| left('qwertyy',5) |
+-------------------+
| qwert             |
+-------------------+


【返回字符串最后5个字母】
mysql> select right('qwertyy',5);
+--------------------+
| right('qwertyy',5) |
+--------------------+
| ertyy              |
+--------------------+


【将字符串的前5个字母和最后4个字母拼接起来】
mysql> select concat(left('qwertyy',5),right('qwertyy',4));
+----------------------------------------------+
| concat(left('qwertyy',5),right('qwertyy',4)) |
+----------------------------------------------+
| qwertrtyy                                    |
+----------------------------------------------+

1.3.5 repeat(x,y) 与space(x)

【重复字符串3次】
mysql> select repeat('qwe',3);
+-----------------+
| repeat('qwe',3) |
+-----------------+
| qweqweqwe       |
+-----------------+


【返回5个空格。因为显示无法看出具体几个空格,所以这里用length函数显示字符串长度】
mysql> select length(space(5));
+------------------+
| length(space(5)) |
+------------------+
|                5 |
+------------------+

1.3.6 replace(x,y,z)与strcmp(x,y)

【用ea替换字符take sqsy中的sq】
mysql> select replace('take sqsy','sq','ea');
+--------------------------------+
| replace('take sqsy','sq','ea') |
+--------------------------------+
| take easy                      |
+--------------------------------+


【比较1516,若小于返回-1,等于返回0,大于返回1。只会返回这3个值。比较的是第一位数字】
mysql> select strcmp(15,16);
+---------------+
| strcmp(15,16) |
+---------------+
|            -1 |
+---------------+


mysql> select strcmp(16,16);
+---------------+
| strcmp(16,16) |
+---------------+
|             0 |
+---------------+


mysql> select strcmp(17,16);
+---------------+
| strcmp(17,16) |
+---------------+
|             1 |
+---------------+

mysql> select strcmp(17,7);
+--------------+
| strcmp(17,7) |
+--------------+
|           -1 |
+--------------+

1.3.7 substring(x,y,z) 与reverse(x)

【返回从字符串中第2个字符开始的5个字符】
mysql> select substring('take easy',2,5);
+----------------------------+
| substring('take easy',2,5) |
+----------------------------+
| ake e                      |
+----------------------------+


【将字符串进行反转显示】
mysql> select reverse('take easy');
+----------------------+
| reverse('take easy') |
+----------------------+
| ysae ekat            |
+----------------------+

【返回字符串的前2个字符,然后进行反转显示】
mysql> select reverse(left('take easy',2));
+------------------------------+
| reverse(left('take easy',2)) |
+------------------------------+
| at                           |
+------------------------------+

【先将字符串反转,然后再输出前2个字符】
mysql> select left(reverse('take easy'),2);
+------------------------------+
| left(reverse('take easy'),2) |
+------------------------------+
| ys                           |
+------------------------------+

1.4 日期时间函数

  • 常用的日期时间函数如下表
函数 说明
curdate( ) 返回当前时间的年月日
curtime( ) 返回当前时间的时分秒
now( ) 返回当前时间的日期和时间
year(x) 返回日期x中的年份值
month(x) 返回日期x中的月份值
week(x) 返回日期x是年度第几个星期
hour(x) 返回x中的小时值
minute(x) 返回x中的分钟值
second(x) 返回x中的秒钟值
dayofweek(x) 计算日期x是本周的第几天
在MySQL数据库中返回的1是星期日
dayofmonth(x) 计算日期x是本月的第几天
dayofyear(x) 计算日期x是本年的第几天

1.4.1 curdate( )、curtime( )与now( )

【返回年月日】
mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2021-04-24 |
+------------+

【返回当前时间】
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 22:18:39  |
+-----------+

【返回当前完整时间】
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2021-04-24 22:19:30 |
+---------------------+

1.4.2 year(x)、month(x)和week(x)

【返回日期2020-8-10中年份值】
mysql> select year('2020-8-10');
+-------------------+
| year('2020-8-10') |
+-------------------+
|              2020 |
+-------------------+

【返回日期2020-8-10是年度第几个月】
mysql> select month('2020-8-10');
+--------------------+
| month('2020-8-10') |
+--------------------+
|                  8 |
+--------------------+


【返回日期2020-8-10是年度第几个星期】
mysql> select week('2020-8-10');
+-------------------+
| week('2020-8-10') |
+-------------------+
|                32 |
+-------------------+

1.4.3 hour(x)、minute(x)、second(x)

【返回当前时间的小时】
mysql> select hour(curtime());
+-----------------+
| hour(curtime()) |
+-----------------+
|              22 |
+-----------------+

【返回当前时间的分钟】
mysql> select minute(curtime());
+-------------------+
| minute(curtime()) |
+-------------------+
|                26 |
+-------------------+

【返回当前时间的秒】
mysql> select second(curtime());
+-------------------+
| second(curtime()) |
+-------------------+
|                14 |
+-------------------+

1.4.4 dayofweek(x)、dayofmonth(x)、dayofyear(x)

【计算当前日期是本年的第几天】
mysql> select dayofyear(curtime());
+----------------------+
| dayofyear(curtime()) |
+----------------------+
|                  114 |
+----------------------+

【计算当前日期是本月的第几天】
mysql> select dayofmonth(curtime());
+-----------------------+
| dayofmonth(curtime()) |
+-----------------------+
|                    24 |
+-----------------------+

【计算当前日期是本周的第几天】
mysql> select dayofweek(curtime());
+----------------------+
| dayofweek(curtime()) |
+----------------------+
|                    7 |
+----------------------+

二、MySQL存储过程

2.1 MySQL存储过程概述

  • 因为实际的数据库应用中,有些数据库操作可能会非常复杂,会需要多条SQL语句一起去处理才能够完成,这个时候就可以使用存储过程去轻松而高效的完成这个需求(有点类似于shell脚本里的函数)
  • MySQL数据库存储过程是一组为了完成特定功能的SQL语句集合。存储过程这个功能时从5.0版本才开始支持,它可以加快数据库的处理速度,从而增强数据库在实际应用中的灵活性
  • 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经过编译和优化后存储在数据库服务器中,当需要使用该存储过程时,只需要调用它即可
  • 当操作数据库的传统SQL语句在执行时需要先编译,然后再去执行,这样跟存储过程一对比,明显存储过程在执行上速度更快,效率更高
  • 存储过程在数据库中创建并保存,它不仅仅是SQL语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式

2.2 MySQL存储过程优点

  • 1.执行一次后,会将生成的二进制代码驻留缓冲区,从而提供执行效率
  • 2.SQL语句加控制语句的集合,灵活性更高
  • 3.在服务器端存储,客户端调用时,降低网络负载
  • 4.可多次重复被调用,可随时修改,不影响客户端调用
  • 5.可完成所有的数据库操作,也可控制数据库的信息访问权限

2.3 MySQL存储过程创建

  • 使用create procedure语句创建存储过程(与shell函数差不多,都是代码的复用)
  • 语法:create procedure <过程名> ([过程参数…]]) <过程体>
  • [过程参数…]]:格式
  • <过程名>:尽量避免与内置的函数或字段重命
  • <过程体>:语句
  • [in|out|inout]<参数名><类型>

2.3.1 不带参数的创建MySQL存储过程

mysql> delimiter $$                           【定义结束符】                   
mysql> create procedure qq()                  【创建存储过程(过程名)】
    -> begin                                  【开启存储过程】
    -> create table qz3(id int(8),name char(10),score int(15));
    -> insert into qz3 values(1,'lisi',11);   
    -> select * from qz3;                     【过程体】
    -> end $$                                 【结束存储过程】

mysql> delimiter ;                            【分号前有空格】
mysql> call qq();                             【调用存储过程】
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    1 | lisi |    11 |
+------+------+-------+

2.3.2 MySQL带参数的存储过程

  • 1. 存储过程的主体部分被称为过程体
  • 2. 以begin开始,以end结束,若只有一条SQL语句,则可以省略begin-end
  • 3. 以delimiter开始和结束
  • 带参数的存储过程
    • 输入参数:in 表示调用者向过程传入值(传入值可以是字面量或变量)
    • 输出参数:out 表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
    • 输入/输出参数:inout 即表示调用者向过程传入值,又表示过程向调用者传出值(只能是变量)
mysql> delimiter @@
mysql> create procedure qz4(in in_name varchar(14))  【行参】
    -> begin
    -> select q_id,q_name,q_level from qz1 where q_name=in_name;
    -> end @@


mysql> delimiter ;
mysql> call qz4('aaa');
+------+--------+---------+
| q_id | q_name | q_level |
+------+--------+---------+
|    1 | aaa    |      15 |
+------+--------+---------+


mysql> call qz4('bbb');                               【实参】
+------+--------+---------+
| q_id | q_name | q_level |
+------+--------+---------+
|    2 | bbb    |      25 |
+------+--------+---------+


mysql> show procedure status\G;                                       【查看存储过程】
mysql> show create procedure qq\G;                                    【查看qq存储过程】
mysql> alter procedure qz4 modifies sql data sql security invoker;    【修改存储过程】
【modifies sql data:表明子程序包含写数据的语句】
【security:安全等级】
【invoker:定义为invoker时表示只要执行者有执行权限,就可以成功执行】


mysql> drop procedure if exists qz4;                                  【删除存储过程】
Query OK, 0 rows affected (0.06 sec)

mysql> show create procedure qz4\G;
ERROR 1305 (42000): PROCEDURE qz4 does not exist
ERROR: 
No query specified

四、总结

1. MySQL数据库函数

  • MySQL数据库函数作用:提供了能够实现各种功能的方法,使我们在查询记录时能够更高效的输出
  • 常用的包括数学函数、聚合函数、字符串函数和日期时间函数
  • 日期时间函数中dayofweek(x)是计算日期x是本周的第几天,但是在MySQL数据库中星期日对应的返回值是1

2. MySQL存储过程

  • 存储过程这个功能时从5.0版本才开始支持
  • MySQL存储过程工作原理:将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经过编译和优化后存储在数据库服务器中,当需要使用该存储过程时,只需要调用它即可
  • MySQL存储过程优点
    • 1.执行一次后,会将生成的二进制代码驻留缓冲区,从而提供执行效率
    • 2.SQL语句加控制语句的集合,灵活性更高
    • 3.在服务器端存储,客户端调用时,降低网络负载
    • 4.可多次重复被调用,可随时修改,不影响客户端调用
    • 5.可完成所有的数据库操作,也可控制数据库的信息访问权限

你可能感兴趣的:(sql,mysql,经验分享)