mysql 函数回顾
最近公司项目用到将一个表的查询出全表的父子集关系,并支持分页和模糊查询,复习一下相关技术,便于解决问题
语法:Create function function_name(参数列表)returns返回值类型
函数体 函数名,应合法的标识符,不应与系统关键字冲突。
一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
参数部分,由参数名和参数类型组成。
返回值类类型.注意,一定要有return返回值语句。
创建函数:
#删除已存在的函数
mysql>DROP FUNCTION IF EXISTS SP_FUNC_DBDH_ONE
#定义分隔符,必须要有 ,本例为 && 可以为得数字符,例如: $$,%%,**
mysql>DELIMITER &&
mysql>
CREATE FUNCTION SP_FUNC_DBDH_ONE( PARA_VAR varchar(30))
RETURNS VARCHAR(100)
BEGIN
DECLARE NAYIBU_FIR VARCHAR(30) DEFAULT 'THIS IS MY FIRST,';
SET NAYIBU_FIR = concat(NAYIBU_FIR,PARA_VAR);
RETURN NAYIBU_FIR;
END &&
#调用自定义函数,输出结果如下:
mysql> SELECT SP_FUNC_DBDH_ONE('PROGRAM');
+------------------------------+
| SP_FUNC_DBDH_ONE('PROGRAM') |
+------------------------------+
| 'THIS IS MY FIRST, PROGRAM |
+------------------------------+
1 row in set (0.00 sec)
2,无参的自定义函数
delimiter &&
DROP FUNCTION IF EXISTS hello;
CREATE FUNCTION hello() RETURNS VARCHAR(255)
BEGIN
RETURN 'hello,this is my first function';
END &&
delimiter;
调用函数:
select hello();
语法总结:
1 创建函数: create Function 函数名称 (输入参数变量,类型) RETURNS 类型 begin ... return 返回值 end (中间是具体实现)
2 变量定义关键字:declare 变量名+类型。
3流程控制: if(condition)then ...elseif(condition) then ... else... end if;
4 变量赋值: select ..into 变量名 或者是 set 变量名=value
5 date_format() 函数。
自定义函数中定义局部变量语法:
DECLARE var_name[,varname]...date_type [DEFAULT VALUE];
简单来说就是:
DECLARE 变量1[,变量2,... ]变量类型 [DEFAULT 默认值]
这些变量的作用范围是在BEGIN...END程序中,而且定义局部变量语句必须在BEGIN...END的第一行定义,这些局部变量的作用范围是在BEGIN...END程序中
ex:
DELIMITER //
CREATE FUNCTION addTwoNumber(x SMALLINT UNSIGNED, Y SMALLINT UNSIGNED)
RETURNS SMALLINT BEGIN DECLARE a, b SMALLINT UNSIGNED DEFAULT 10;
SET a = x, b = y;
RETURN a+b;
END
//
为变量赋值语法:
SET parameter_name = value[,parameter_name = value...]
SELECT INTO parameter_name
ex:
...在某个UDF中... DECLARE x int; SELECT COUNT(id) FROM tdb_name INTO x; RETURN x; END//
用户变量定义语法:(可以理解成全局变量)
SET @param_name = value
SET @allParam = 100; SELECT @allParam;
上述定义并显示@allParam用户变量,其作用域只为当前用户的客户端有效
自定义函数中流程控制语句语法:
存储过程和函数中可以使用流程控制来控制语句的执行。
MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句来进行流程控制。
每个流程中可能包含一个单独语句,或者是使用BEGIN...END构造的复合语句,构造可以被嵌套
1.IF语句
IF语句用来进行条件判断。根据是否满足条件,将执行不同的语句。其语法的基本形式如下:
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] ... [ELSE statement_list] END IF
其中,search_condition参数表示条件判断语句;statement_list参数表示不同条件的执行语句。
注意:MYSQL还有一个IF()函数,他不同于这里描述的IF语句
下面是一个IF语句的示例。代码如下:
IF age>20 THEN SET @count1=@count1+1; ELSEIF age=20 THEN SET @count2=@count2+1; ELSE SET @count3=@count3+1; END IF;
该示例根据age与20的大小关系来执行不同的SET语句。
如果age值大于20,那么将count1的值加1;如果age值等于20,那么将count2的值加1;
其他情况将count3的值加1。IF语句都需要使用END IF来结束。
2.CASE语句
CASE语句也用来进行条件判断,其可以实现比IF语句更复杂的条件判断。CASE语句的基本形式如下:
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE
其中,case_value参数表示条件判断的变量;
when_value参数表示变量的取值;
statement_list参数表示不同when_value值的执行语句。
CASE语句还有另一种形式。该形式的语法如下:
CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE
其中,search_condition参数表示条件判断语句;
statement_list参数表示不同条件的执行语句。
注意:这里的CASE语句和“控制流程函数”里描述的SQL CASE表达式的CASE语句有轻微不同。这里的CASE语句不能有ELSE NULL子句
并且用END CASE替代END来终止!!
3.LOOP语句
LOOP语句可以使某些特定的语句重复执行,实现一个简单的循环。
但是LOOP语句本身没有停止循环的语句,必须是遇到LEAVE语句等才能停止循环。
LOOP语句的语法的基本形式如下:
[begin_label:] LOOP statement_list END LOOP [end_label]
其中,begin_label参数和end_label参数分别表示循环开始和结束的标志,这两个标志必须相同,而且都可以省略;
statement_list参数表示需要循环执行的语句。
下面是一个LOOP语句的示例。代码如下:
add_num: LOOP SET @count=@count+1; END LOOP add_num ;
该示例循环执行count加1的操作。因为没有跳出循环的语句,这个循环成了一个死循环。
LOOP循环都以END LOOP结束。
4.LEAVE语句
LEAVE语句主要用于跳出循环控制。其语法形式如下:
LEAVE label
其中,label参数表示循环的标志。
下面是一个LEAVE语句的示例。代码如下:
add_num: LOOP SET @count=@count+1; IF @count=100 THEN LEAVE add_num ; END LOOP add_num ;
该示例循环执行count加1的操作。当count的值等于100时,则LEAVE语句跳出循环。
5.ITERATE语句
ITERATE语句也是用来跳出循环的语句。但是,ITERATE语句是跳出本次循环,然后直接进入下一次循环。
ITERATE语句只可以出现在LOOP、REPEAT、WHILE语句内。
ITERATE语句的基本语法形式如下:
ITERATE label
其中,label参数表示循环的标志。
下面是一个ITERATE语句的示例。代码如下:
add_num: LOOP SET @count=@count+1; IF @count=100 THEN LEAVE add_num ; ELSE IF MOD(@count,3)=0 THEN ITERATE add_num; SELECT * FROM employee ; END LOOP add_num ;
该示例循环执行count加1的操作,count值为100时结束循环。如果count的值能够整除3,则跳出本次循环,不再执行下面的SELECT语句。
说明:LEAVE语句和ITERATE语句都用来跳出循环语句,但两者的功能是不一样的。
LEAVE语句是跳出整个循环,然后执行循环后面的程序。而ITERATE语句是跳出本次循环,然后进入下一次循环。
使用这两个语句时一定要区分清楚。
6.REPEAT语句
REPEAT语句是有条件控制的循环语句。当满足特定条件时,就会跳出循环语句。REPEAT语句的基本语法形式如下:
[begin_label:] REPEAT statement_list UNTIL search_condition END REPEAT [end_label]
其中,statement_list参数表示循环的执行语句;search_condition参数表示结束循环的条件,满足该条件时循环结束。
下面是一个ITERATE语句的示例。代码如下:
REPEAT SET @count=@count+1; UNTIL @count=100 END REPEAT ;
该示例循环执行count加1的操作,count值为100时结束循环。
REPEAT循环都用END REPEAT结束。
7.WHILE语句
WHILE语句也是有条件控制的循环语句。但WHILE语句和REPEAT语句是不一样的。
WHILE语句是当满足条件时,执行循环内的语句。
WHILE语句的基本语法形式如下:
[begin_label:] WHILE search_condition DO statement_list END WHILE [end_label]
其中,search_condition参数表示循环执行的条件,满足该条件时循环执行;
statement_list参数表示循环的执行语句。
下面是一个ITERATE语句的示例。代码如下:
WHILE @count<100 DO SET @count=@count+1; END WHILE ;
该示例循环执行count加1的操作,count值小于100时执行循环。
如果count值等于100了,则跳出循环。WHILE循环需要使用END WHILE来结束。
######################################################################
mysql数据库自带特殊函数:
1、求余函数MOD(X,Y)
MOD(X,Y)返回x被y除后的余数,MOD()对于带有小数部分的数值也起作用,他返回除法运算后的精确余数
2、四舍五入函数TRUNCATE(X,Y)
TRUNCATE(X,Y)返回被舍去至小数点后y位的数字x。若y的值为0,则结果不带有小数点或不带有小数部分。
若y设为负数,则截去(归零)x小数点左边起第y位开始后面所有低位的值。
3、求余函数HEX(X)和UNHEX(X)函数
有以下的代码可以演示HEX和UNHEX的功能:
SELECT HEX('this is a test str')
4、LENGTH(STR)返回值为字符串的字符个数(sqlserver使用len()函数)
LENGTH函数在读取char类型数据时会删除字符右边的空格,而varchar不会
5、CHAR_LENGTH(STR)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符
SELECT CHAR_LENGTH('DATE')
6、合并字符串函数CONCAT_WS(x,s1,s2,......)
CONCAT_WS(x,s1,s2,......),CONCAT_WS代表CONCAT with Separator,是CONCAT()函数的特殊形式。
第一个参数x是其他参数的分隔符,分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是
其他参数。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL值。
7、替换字符串的函数INSERT(S1,X,LEN,S2)
INSERT(S1,X,LEN,S2)函数跟SQLSERVER里的STUFF()函数的功能是一样的,这里不作介绍了
8、填充字符串的函数LPAD(S1,LEN,S2)和RPAD(S1,LEN,S2)
LPAD(S1,LEN,S2)返回字符串s1,其左边由字符串s2填补到len字符串长度。假如s1的长度大于len,则返回值被缩短至len字符。
LPAD()函数和RPAD()函数功能跟SQLSERVER里的 REPLACE()相似,不过功能更加强大
9、RPAD(S1,LEN,S2)返回字符串s1,其右边被字符串s2填补至len字符长度。假如字符串s1的长度大于len,则返回值被缩短到len字符长度
10、删除空格的函数TRIM(S)
TRIM(S)删除字符串s两侧的空格
MYSQL这里比SQLSERVER方便,SQLSERVER要删除两边的空格,需要使用: SELECT LTRIM(RTRIM(' hello '))
11、TRIM(S1 FROM S)删除字符串s中两端所有的子字符串s1。s1为可选项,在未指定情况下,删除空格
SELECT TRIM('xy' FROM 'xyxboxyokxxyxy')
12、重复生成字符串的函数REPEAT(S,N)
这个函数跟SQLSERVER里的REPLICATE()函数是一样的,参数个数都是一样的,这里不作介绍了
13、比较字符串大小的函数STRCMP(S1,S2)
STRCMP(S1,S2)若所有的字符串均相同,则返回0;若根据当前分类次序,第一个参数小于第二个,则返回-1,其他情况返回1
14、匹配子串开始位置的函数
LOCATE(STR1,STR)、POSITION(STR1 IN STR)、INSTR(STR,STR1)3个函数作用相同,返回子字符串str1在字符串str中的开始位置
这三个函数跟SQLSERVER里的CHARINDEX()函数功能类似
15、返回指定位置的字符串的函数
ELT(N,字符串1,字符串2,字符串3,...,),若N=1,则返回值为字符串1,若N=2,则返回值为字符串2,以此类推。
若N小于1或大于参数的数目,则返回值为NULL
16、返回指定字符串位置的函数FIELD(S,S1,S2,...)
FIELD(S,S1,S2,...)返回字符串s在列表s1,s2,......中第一次出现的位置,在找不到s的情况下,返回值为0。
如果s为NULL,则返回值为0,原因是NULL不能同任何值进行同等比较。
17、返回子串位置的函数FIND_IN_SET(S1,S2)
FIND_IN_SET(S1,S2)返回字符串s1在字符串列表s2中出现的位置,字符串列表是一个由多个逗号
‘,’分开的字符串组成的列表。如果s1不在s2或s2为空字符串,则返回值为0。如果任意一个参数为NULL,则返回值为NULL。
这个函数在第一个参数包含一个逗号‘,’时将无法正常运行。
18、选取字符串的函数MAKE_SET(X,S1,S2,...)
MAKE_SET(X,S1,S2,...)返回由x的二进制数指定的相应位的字符串组成的字符串,s1对应比特1,s2对应比特01以此类推。
s1,s2...中的NULL值不会被添加到结果中。
日期和时间函数
1、获取当前日期的函数和获取当前时间的函数
CURDATE()、CURRENT_DATE()、CURRENT_TIMESTAMP()、LOCALTIME()、NOW()、SYSDATE()
以上函数都是返回当前日期和时间值,MYSQL的函数数量的确比SQLSERVER多很多,SQLSERVER获取当前时间和日期用的
函数是: SELECT GETDATE()
2、计算日期和时间的函数
MYSQL里计算日期和时间的函数比较多
增加日期:DATE_ADD(date,interval expr type),ADDDATE(date,interval expr type)
减去日期:DATE_SUB(date,interval expr type),SUBDATE(date,interval expr type)
增加时间:ADD_TIME(date,expr)
减去时间:SUBTIME(date,expr)
时间差:DATEDIFF()
最后一天:LAST_DAY(datetime)
日期和时间格式化:
DATE_FORMAT(date,format)
TIME_FORMAT(time,format)
返回日期时间字符串的显示格式:GET_FORMAT(val_type,format_type)
系统信息函数
1、获取MYSQL版本号、连接数和数据库名的函数
VERSION()返回指示MYSQL服务器版本的字符串。这个字符串使用utf8字符集
SELECT VERSION()
2、CONNECTION_ID()返回MYSQL服务器当前连接的次数,每个连接都有各自唯一的ID
查看当前用户的连接数
SELECT CONNECTION_ID()
3、SHOW PROCESSLIST;
4、SHOW FULL PROCESSLIST;
processlist命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态
帮助识别出有问题的查询语句等。
如果是root帐号,能看到所有用户的当前连接。如果是其他普通帐号,则只能看到自己占用的连接。showprocesslist只能列出当前100条
如果想全部列出,可以使用SHOW FULL PROCESSLIST命令
各个列的含义
(1)id列,用户登录mysql时,系统分配的“connection_id”
(2)user列,显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句
(3)host列,显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户
(4)db列,显示这个进程目前连接的是哪个数据库
(5)command列,显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)
(6)time列,显示这个状态持续的时间,单位是秒
(7)state列,显示使用当前连接的sql语句的状态,很重要的列,后续会有所有状态的描述,state只是语句执行中的某一个状态。一个sql语句,
以查询为例
可能需要经过
copying to tmp table,
sorting result,
sending data
等状态才可以完成
(8)info列,显示这个sql语句,是判断问题语句的一个重要依据。
5、DATABASE()和SCHEMA()函数返回使用utf8字符集的默认(当前)数据库名
6、获取用户名的函数
USER()、CURRENT_USER()、CURRENT_USER、SYSTEM_USER()、SESSION_USER()
这几个函数返回当前被MYSQL服务器验证的用户名和主机名组合。这个值符合确定当前登录用户
存取权限的MYSQL帐户。一般情况下,这几个函数的返回值是相同的。
7、获取字符串的字符集和排序方式的函数
CHARSET(STR)返回字符串str自变量的字符集
8、COLLATION(str)返回字符串str的字符排列方式
9、获取最后一个自动生成的ID值的函数
LAST_INSERT_ID()自动返回最后一个INSERT或UPDATE为AUTO_INCREMENT列设置的第一个发生的值
在向数据表插入一条记录时,LAST_INSERT_ID()返回带有AUTO_INCREMENT约束的字段最新生成的值2;继续向表
中同时添加3条记录,这时候因为当使用一条INSERT语句插入多个行时,LAST_INSERT_ID只返回插入的第一行数据
时产生的值,在这里为第3条记录。之所以这样,是因为这使依靠其他服务器复制同样的INSERT语句变得简单
加密函数
1、加密函数PASSWORD(STR)
PASSWORD(STR)从原文密码str计算并返回加密后的密码字符串,当参数为NULL时,返回NULL
2、加密函数MD5(str)
MD5(str)为字符串算出一个MD5 128比特校验和。该值以32位十六进制数字的二进制字符串形式返回,若参数为NULL,则会返回NULL
3、加密函数ENCODE(str,pswd_str)
ENCODE(str,pswd_str)使用pswd_str作为密码,加密str。使用DECODE()解密结果,结果是一个和str长度相同的二进制字符串
4、解密函数DECODE(crypt_str,pswd_str)
DECODE(crypt_str,pswd_str)使用pswd_str作为密码,解密加密字符串crypt_str,crypt_str是由ENCODE()返回的字符串
1、格式化函数FORMAT(x,n)
FORMAT(x,n)将数字x格式化,并以四舍五入的方式保留小数点后n位,结果以字符串的形式返回。
若n为0,则返回结果函数不含小数部分
2、不同进制的数字转换的函数
CONV(N,from_base,to_base)函数进行不同进制数间的转换。
3、IP地址与数字相互转换的函数
INET_ATON(expr)给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。
地址可以是4或8比特地址
INET_NTOA(expr)给定一个数字网络地址(4或8比特),返回作为字符串的该地址的点地址表示。
4、加锁函数和解锁函数
GET_LOCK(str,timeout)设法使用字符串str给定的名字得到一个锁,超时为timeout秒。
RELEASE_LOCK(str)解开被GET_LOCK()获取的,用字符串str所命名的锁。
IS_FREE_LOCK(str)检查名为str的锁是否可以使用
IS_USED_LOCK(str)检查名为str的锁是否正在被使用
5、重复执行指定操作的函数
BENCHMARK(count,expr)函数重复count次执行表达式expr。他可以用于计算MYSQL处理表达式的速度。
结果值通常为0(0只是表示处理过程很快,并不是没有花费时间)
另一个作用是他可以在MYSQL客户端内部报告语句执行的时间。
6、改变字符集的函数
CONVERT(...using...)带有USING的CONVERT()函数被用来在不同的字符集之间转化数据。
7、改变数据类型的函数
CAST:属于SQL2003标准,并且在mysql,sqlserver,oracle都已经被实现
CAST(x,AS type)和CONVERT(x,type)函数将一个类型的值转换为另一个类型的值,可转换的type有:
BINARY、CHAR(n)、DATE、TIME、DATETIME、DECIMAL、SIGNED、UNSIGNED
在SQLSERVER里也是使用这两个函数进行数据类型转换的~
存储过程与自定义函数的区别
-
存储过程实现的功能要复杂一些,而函数的的针对性更强
-
存储的过程可以返回多个值,函数只能有一个返回值
-
存储过程一般独立的执行,而函数可以作为其他 SQL语句的组成部分来实现。
-
过程 通俗易懂的说法:它只是将其中的程序执行一遍
-
函数 通俗易懂的说法:它不但将其中的程序执行一遍,还返回一个值
MySQL中进行树状所有子节点的查询
[MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)mysql递归查询,mysql中从子类ID查询所有父类(做无限分类经常用到)
-
navicat for mysql 函数过程的创建步骤。