MYSQL学习笔记12:函数[内置函数,自定义函数,函数综合应用实例],变量作用域

函数

在mysql中,函数分为两类:系统函数(内置函数)和自定义函数.

函数使用形式为: select 函数名(函数列表);

内置函数-系统函数

字符串函数

  • char_length():判断字符串字符个数
  • length():判断字符串的字节数(与字符集有关)

  • concat(字符串1,字符串2):连接字符串
  • instr(目标字符串,子字符串):判断子字符串是否在目标字符串中:存在返回位置(注:第一个位置为1),不存在返回0

  • lcase():全部转化为小写.
  • left(字符串,长度):从左开始截取指定字符数的字符串.(注:第一个位置为1)

  • ltrim():消除左边的空格
  • mid(str,pos,len):从字符串指定位置开始截取指定字符数,如果不指定截取长度,直接到最后.(注:第一个位置为1)

时间函数

  • now():返回当前日期时间

mysql> SELECT NOW();

        -> '1997-12-15 23:50:26'

mysql> SELECT NOW() + 0;

        -> 19971215235026

  • curdate():返回当前日期

mysql> SELECT CURDATE();

        -> '1997-12-15'

mysql> SELECT CURDATE() + 0;

        -> 19971215

  • curtime():返回当前时间

mysql> SELECT CURTIME();

        -> '23:50:26'

mysql> SELECT CURTIME() + 0;

        -> 235026

  • datediff(起始日期,结束日期):判断2个日期间的天数差距.参数日期必须是字符串格式(用引号)
  • 第一个参数放新日期,第二个参数放旧日期.这样算下来是正数天数,否则是负数天数

参数中的日期可以带时间,不过系统只取日期,忽略时间部分.

  • date_add(日期, interval 时间数字 type):进行时间的增加

type:day/hour/minute/second/

  • UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date):前者返回unix时间戳,后者返回指定日期时间date的时间戳.

若无参数调用,则返回一个Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒数) 作为无符号整数。若用date 来调用UNIX_TIMESTAMP(),它会将参数值以'1970-01-01 00:00:00' GMT后的秒数的形式返回。date 可以是一个DATE 字符串、一个 DATETIME字符串、一个 TIMESTAMP或一个当地时间的YYMMDD 或YYYMMDD格式的数字。

  • from_unixtime():将指定unix时间戳(秒数)转换为日期时间

mysql> SELECT FROM_UNIXTIME(875996580);

        -> '1997-10-04 22:23:00'

mysql> SELECT FROM_UNIXTIME(875996580) + 0;

        -> 19971004222300

数学函数

  • ABS(X):求绝对值
  • CEILING(X) CEIL(X):向上取整
  • FLOOR(X):向下取整
  • POW(X,Y) , POWER(X,Y):返回XY乘方的结果值。
  • RAND() RAND(N):返回一个随机浮点值 v ,范围在 0 到1 之间 (即, 其范围为 0 ≤ v ≤ 1.0)。若已指定一个整数参数 N ,则它被用作种子值,用来产生重复序列。 
  • ROUND(X) ROUND(X,D):四舍五入

其他函数

  • MD5(str):为字符串算出一个 MD5 128比特检查和。该值以32位十六进制数字的二进制字符串的形式返回, 若参数为 NULL 则会返回 NULL。例如,返回值可被用作散列关键字。
  • version():获取版本号
  • database():显示当前所在数据库
  • UUID():返回一个通用唯一标识符(UUID)

UUID其产生的根据是《DCE 1.1: 远程过程调用》 (附录A) CAE (公共应用软件环境) 的说明,该作品于1997年10月由 The Open Group 出版 (文件编号 C706, http://www.opengroup.org/public/pubs/catalog/c706.htm).

UUID被设计成一个在时间和空间上都独一无二的数字。2个对UUID() 的调用应产生2个不同的值,即使这些调用的执行是在两个互不相连的单独电脑上进行。

UUID 是一个由5位十六进制数的字符串表示的128比特数字 ,其格式为  aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee :

    • 前3个数字从一个时间戳产生。 
    • 第4 个数字保持暂时唯一性,以防时间戳值失去单一性 (例如, 由于经济时)。
    • 第5个数字是一个 IEEE 802 节点号/网卡MAC地址,它提供空间唯一性。若后者不可用,则用一个随机数字替换。 (例如, 由于主机没有以太网卡,或我们不知道怎样在你的操作系统上找到界面的机器地址 )。假若这样,空间唯一性就不能得到保证。尽管如此,一个冲突的发生机率还是非常低的。
  • 目前,一个界面的 MAC 地址尽被FreeBSD 和 Linux考虑到。在其它操作系统中, MySQL使用随机产生的 48比特数字。

    mysql> SELECT UUID();

            -> '6ccd780c-baba-1026-9564-0040f4311e29'

自定义函数

自定义函数:用户自己定义的函数

函数:实现某种功能的语句块(由多条语句组成)

  • 1. 函数内部的每条指令都是一个独立的个体:需要符合语句定义规范:需要语句结束符分号
  • 2. 函数是一个整体,而且函数是在调用的时候才会被执行,那么当设计函数的时候,意味着整体不能被中断.
  • 3. mysql一旦见到语句结束符分号,就会自动执行.

解决方案: 在定义的函数之前,尝试修改临时的语句结束符

delimiter  英 [dɪ'lɪmɪtə]  美 [dɪ'lɪmɪtə]  n.定界符,分隔符;

基本语法: delimiter 

修改临时语句结束符: delimiter 新符号[可以使用系统非内置即可$$]

中间为正常sql指令:使用分号结束(系统不会执行:不认识分号)

 使用新符号结束

修改回语句结束符: delimiter;

创建函数

自定义函数包含几个要素:function关键字,函数名,参数,确认函数返回值类型,函数体,返回值

函数定义基本语法

修改语句结束符 新语句结束符

create function 函数名(形参) returns 返回值类型

begin

     //函数体

    return 返回值数据;  //数据必须与结构中定义的返回值类型一致

end

新语句结束符

修改语句结束符 分号  //改回来

如果函数体只有1条语句,可以不需要begin和end,也不需要修改语句结束符

形参:在mysql中需要为形参指定数据类型.形参可以有多个.

基本语法: 变量名 字段类型

查看函数

1. 可以通过查看function状态,查看所有函数:show function status [like 'pattern'];

2. 查看函数创建语句:show create function 函数名;

调用函数

自定义函数的调用与内置函数的调用是一样的: select 函数名(实参列表);

删除函数

删除函数: drop function 函数名;

注意事项:

1. 自定义函数是属于用户级别的:只有当前客户端对应的数据库中可以使用

2. 可以在不同的数据库下看见对应的函数,但不能跨数据库调用

3. 自定义函数:通常是为了将多行代码集合到一起解决一个重复性的问题

4. 函数因为必须规范返回值:那么在函数内部不能使用select指令:select一旦执行就会得到一个结果集(result set).唯一可以的select形式是: select 字段 into @变量;

函数流程结构综合案例

需求:从1开始,直到用户传入的对应值为止,自动求和;凡是5的倍数舍弃.

设计:

  • 1.创建函数
  • 2.需要1个形参:确定要累加到什么位置

  • 3.需要定义1个变量保存对应的结果: set 变量名=值;

使用局部变量:因为是在函数内部操作

declare 变量名 类型 [=默认值]

  • 4.内部需要1个循环来实现迭代累加

  • 5.循环内部需要条件控制判断:5的倍数舍弃

  • 6. 函数必须有返回值

函数定义完成:

调用函数: select 函数名(形参);

注意:如果形参不一致就会出错

变量作用域

局部作用域

使用declare关键字声明(在结构体内:函数/存储过程/触发器),而且只能在结构体中使用.

  • . declare关键字声明的变量没有任何符号修饰,就是普通字符串.如果在外部访问该变量,系统自动认为是字段,则访问不到

会话作用域

用户定义的,使用@符号定义的变量,使用set关键字

会话作用域:在当前用户当次连接有效,只要在本连接之中,任何地方都可以使用(可以在结构内部,也可以跨库)

如上,会话变量可以在函数内部使用

如上,会话变量可以跨库使用.

全局作用域

所有的客户端所有的[新]连接都有效:需要使用全局符号来定义

set global 变量名=值;

set @@global.变量名=值;

通常,在sql编程的时候,不会使用自定义变量来控制全局.一般都是定义会话变量或者在结构中使用局部变量来解决问题.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值