自定义函数

  • 函数可以无参数,但必须有返回值

函数创建\删除\调用:

-- 创建函数
CREATE [AGGREGATE] FUNCTION function_name(parameter_name type,[parameter_name type,...])
RETURNS {STRING|INTEGER|REAL}
runtime_body
-- 翻译
CREATE FUNCTION 函数名称(参数列表)
RETURNS 返回值类型
函数体
-- 删除函数
DROP FUNCTION function_name;
-- 调用函数
SELECT function_name(parameter_value,...);

函数体:

在函数体中,如果包含多条语句,我们需要把多条语句放到BEGIN...END语句块中

CREATE FUNCTION deleteById(targetId SMALLINT UNSIGNED) 
RETURNS VARCHAR(20) 
BEGIN
DELETE FROM table_name WHERE id = targetId;
RETURN (SELECT COUNT(*) FROM table_name);
END

修改默认的结束符语法:

DELIMITER //
CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) 
RETURNS VARCHAR(20) 
BEGIN
DELETE FROM son WHERE id = uid;
RETURN (SELECT COUNT(id) FROM son);
END//

函数sql语法

  • 声明函数变量
  • 作用域为 BEGIN...END 代码块中
DECLARE var_name[,varname]...date_type [DEFAULT VALUE];
DECLARE 变量1[,变量2,... ]变量类型 [DEFAULT 默认值];
-- example
DECLARE a, b SMALLINT UNSIGNED DEFAULT 10;
  • 变量赋值
-- 赋已知的值
SET parameter_name = value[,parameter_name = value...]
-- example
SET  a = x, b = y;
-- 赋未知值
SELECT INTO parameter_name
-- example
SELECT COUNT(id) FROM tdb_name INTO x;
SELECT group_concat(pid) INTO sTempPar FROM treenodes where pid<>id
  • 声明用户变量(可以理解成全局变量)
  • 作用域:作用域只为当前用户的客户端有效
SET @allParam = 100;
SELECT @allParam;
  • 流程控制

MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句来进行流程控制。

IF语句:

  • search_condition参数表示条件判断语句;
  • statement_list参数表示不同条件的执行语句
IF search_condition
THEN 
	statement_list 
[ELSEIF search_condition THEN statement_list] ... 
[ELSE statement_list] 
END IF

Example:

IF age > 20 
THEN 
	SET @count1=@count1+1;  
ELSEIF age = 20 
THEN 
	SET @count2=@count2+1;  
ELSE 
	SET @count3=@count3+1;  
END IF;

CASE语句:

CASE语句也用来进行条件判断,其可以实现比IF语句更复杂的条件判断

  • case_value参数表示条件判断的变量;
  • when_value参数表示变量的取值;
  • statement_list参数表示不同when_value值的执行语句
CASE case_value 
WHEN when_value 
THEN 
	statement_list 
[WHEN when_value THEN statement_list] ... 
[ELSE statement_list] 
END CASE

example

CASE age 
WHEN 20 
THEN 
	SET @count1=@count1+1; 
ELSE 
	SET @count2=@count2+1; 
END CASE;

CASE语句2:

  • search_condition参数表示条件判断语句;
  • statement_list参数表示不同条件的执行语句;
CASE 
WHEN search_condition THEN statement_list 
[WHEN search_condition THEN statement_list] ... 
[ELSE statement_list] 
END CASE

example

CASE 
WHEN age=20 
THEN 
	SET @count1=@count1+1; 
ELSE 
	SET @count2=@count2+1; 
END CASE;

LOOP语句 LEAVE语句:

LOOP语句可以使某些特定的语句重复执行,实现一个简单的循环。

但是LOOP语句本身没有停止循环的语句,必须是遇到LEAVE语句等才能停止循环。

add_num: LOOP 
SET @count=@count+1; 
IF @count=100 THEN 
	LEAVE add_num;
END LOOP add_num;

ITERATE语句:

ITERATE语句也是用来跳出循环的语句。但是,ITERATE语句是跳出本次循环,然后直接进入下一次循环。

ITERATE语句只可以出现在LOOP、REPEAT、WHILE语句内。

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;

REPEAT语句:

REPEAT语句是有条件控制的循环语句。当满足特定条件时,就会跳出循环语句

[begin_label:] REPEAT 
statement_list 
UNTIL search_condition 
END REPEAT [end_label]

example

REPEAT 
SET 
	@count=@count+1; 
UNTIL @count=100 
END REPEAT ;

WHILE语句:

WHILE语句也是有条件控制的循环语句。但WHILE语句和REPEAT语句是不一样的。

WHILE语句是当满足条件时,执行循环内的语句。

[begin_label:] WHILE search_condition DO 
statement_list 
END WHILE [end_label]

example

WHILE @count<100 DO 
SET @count=@count+1; 
END WHILE ;

MySQL常用内置函数

字符串

1、字符串函数

-- ASCII('a'):返回ASCII码值,空串返回0
mysql> SELECT ASCII('a');
+------------+
| ASCII('a') |
+------------+
|         97 |
+------------+
1 row in set (0.01 sec)

-- CONV(n, from_base, to_base):对数字n进制转换,并转换为字串返回(任何参数为null时返回null,进制范围为2-36进制,当to_base是负数时n作为有符号数否则作无符号数,conv以64位点精度工作)
mysql> SELECT CONV(6, 10, 2);
+----------------+
| CONV(6, 10, 2) |
+----------------+
| 110            |
+----------------+
1 row in set (0.00 sec)

-- CONCAT(str1,str2,...):把参数连成一个长字符串并返回(任何参数是null时返回null)  
mysql> SELECT CONCAT('aa', 'bb', 'cc');
+--------------------------+
| CONCAT('aa', 'bb', 'cc') |
+--------------------------+
| aabbcc                   |
+--------------------------+
1 row in set (0.00 sec)

-- length(str):字符串长度
mysql> SELECT LENGTH('MySQL');
+-----------------+
| LENGTH('MySQL') |
+-----------------+
|               5 |
+-----------------+
1 row in set (0.00 sec)

-- locate(substr,str):返回字符串substr在字符串str第一次出现的位置(str不包含substr时返回0)
-- locate(substr,str,pos):返回substr在字符串str的第pos个位置起第一次出现的位置(str不包含substr时返回0)
mysql> SELECT LOCATE('y', 'MySQL');
+----------------------+
| LOCATE('y', 'MySQL') |
+----------------------+
|                    2 |
+----------------------+
mysql> SELECT LOCATE('y', 'MySQL', 3);
+-------------------------+
| LOCATE('y', 'MySQL', 3) |
+-------------------------+
|                       0 |
+-------------------------+

-- lpad(str,len,padstr):用字符串padStr填充str左侧,直到长度达到len
-- rpad(str,len,padstr):用字符串padStr填充str右侧,直到长度达到len
mysql> SELECT RPAD('MySQL', 10, 'x');
+------------------------+
| RPAD('MySQL', 10, 'x') |
+------------------------+
| MySQLxxxxx             |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT LPAD('MySQL', 10, 'x');
+------------------------+
| LPAD('MySQL', 10, 'x') |
+------------------------+
| xxxxxMySQL             |
+------------------------+
1 row in set (0.00 sec)

-- left(str,len):返回字符串str的左端len个字符
-- right(str,len):返回字符串str的右端len个字符
-- substring(str,pos,len):返回字符串str的位置pos起len个字符mysql
-- substring(str,pos):返回字符串str的位置pos起的一个子串
mysql> SELECT LEFT('MySQL', 3);
+------------------+
| LEFT('MySQL', 3) |
+------------------+
| MyS              |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT RIGHT('MySQL', 3);
+-------------------+
| RIGHT('MySQL', 3) |
+-------------------+
| SQL               |
+-------------------+
1 row in set (0.00 sec)

mysql> SELECT SUBSTRING('MySQL', 2, 2);
+--------------------------+
| SUBSTRING('MySQL', 2, 2) |
+--------------------------+
| yS                       |
+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT SUBSTRING('MySQL', 2);
+-----------------------+
| SUBSTRING('MySQL', 2) |
+-----------------------+
| ySQL                  |
+-----------------------+
1 row in set (0.00 sec)

-- trim([[both | leading | trailing] [remstr] from] str):返回前缀或后缀remstr被删除了的字符串str(位置参数默认both,remstr默认值为空格)  
mysql> SELECT TRIM('               bar        ');
+------------------------------------+
| TRIM('               bar        ') |
+------------------------------------+
| bar                                |
+------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT TRIM(LEADING ' ' FROM '               bar        ');
+-----------------------------------------------------+
| TRIM(LEADING ' ' FROM '               bar        ') |
+-----------------------------------------------------+
| bar                                                 |
+-----------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT TRIM(LEADING 'x' FROM 'xxxxxxxxxxfooxxxx');
+--------------------------------------------+
| TRIM(LEADING 'x' FROM 'xxxxxxxxxxfooxxxx') |
+--------------------------------------------+
| fooxxxx                                    |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT TRIM(TRAILING 'x' FROM 'xxxxxxxxxxfooxxxx');
+---------------------------------------------+
| TRIM(TRAILING 'x' FROM 'xxxxxxxxxxfooxxxx') |
+---------------------------------------------+
| xxxxxxxxxxfoo                               |
+---------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT TRIM(BOTH 'x' FROM 'xxxxxxxxxxfooxxxx');
+-----------------------------------------+
| TRIM(BOTH 'x' FROM 'xxxxxxxxxxfooxxxx') |
+-----------------------------------------+
| foo                                     |
+-----------------------------------------+
1 row in set (0.00 sec)

-- replace(str,source_str,target_str):用字符串to_str替换字符串str中的子串from_str并返回
mysql> SELECT REPLACE('MySQL', 'S', 'A');
+----------------------------+
| REPLACE('MySQL', 'S', 'A') |
+----------------------------+
| MyAQL                      |
+----------------------------+
1 row in set (0.00 sec)

-- reverse(str):颠倒字符串顺序并返回
mysql> SELECT REVERSE('MySQL');
+------------------+
| REVERSE('MySQL') |
+------------------+
| LQSyM            |
+------------------+
1 row in set (0.00 sec)

-- find_in_set(str,strlist):返回str在字符串集strlist中的序号(任何参数是null则返回
-- null,如果str没找到返回0,参数1包含","时工作异常)  
mysql> SELECT FIND_IN_SET('3', '1,2,3,4,5,6');
+---------------------------------+
| FIND_IN_SET('3', '1,2,3,4,5,6') |
+---------------------------------+
|                               3 |
+---------------------------------+
1 row in set (0.00 sec)

2、数学函数

-- abs(n):绝对值
mysql> SELECT ABS(-12);
+----------+
| ABS(-12) |
+----------+
|       12 |
+----------+
1 row in set (0.00 sec)

-- FLOOR(1.23): 1
-- CEILING(1.23): 2
-- ROUND(n,d):返回n的四舍五入值,保留d位小数(d的默认值为0)
mysql> SELECT FLOOR(1.23);
+-------------+
| FLOOR(1.23) |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT CEILING(1.23);
+---------------+
| CEILING(1.23) |
+---------------+
|             2 |
+---------------+
1 row in set (0.00 sec)

mysql> SELECT ROUND(1.23,1);
+---------------+
| ROUND(1.23,1) |
+---------------+
|           1.2 |
+---------------+
1 row in set (0.00 sec)

-- EXP(n):返回e的n次方
-- LOG(n):返回n的自然对数 
-- LOG10(n):10为底的对数
-- pow(x,y):返回x的y次幂
-- sqrt(n):返回非负数n的平方根  
-- pi():返回圆周率   
-- rand(n):返回0-1之间随机浮点值
mysql> SELECT ROUND(RAND() * 100, 0);
+------------------------+
| ROUND(RAND() * 100, 0) |
+------------------------+
|                     33 |
+------------------------+
1 row in set (0.01 sec)

mysql> SELECT ROUND(RAND() * 100, 0);
+------------------------+
| ROUND(RAND() * 100, 0) |
+------------------------+
|                     64 |
+------------------------+
1 row in set (0.00 sec)

3、时间函数

-- dayofweek(date):返回日期date是星期几(1=星期天,2=星期一,……7=星期六,odbc标准)
-- dayofmonth(date):返回date是一月中的第几日(在1到31范围内)
-- dayofyear(date):返回date是一年中的第几日(在1到366范围内) 
-- month(date):返回date中的月份数值
-- dayname(date):返回date是星期几(按英文名返回) 
-- monthname(date):返回date是几月(按英文名返回)
-- week(date,first):返回date是一年的第几周(first默认值0,first取值1表示周一是周的开始,0从周日开始)
-- quarter(date):返回date是一年的第几个季度
-- year(date):返回date的年份(范围在1000到9999)  
-- hour(time):返回time的小时数(范围是0到23) 
-- minute(time):返回time的分钟数(范围是0到59) 
-- second(time):返回time的秒数(范围是0到59) 
-- now():sysdate():current_timestamp():当前时间
mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2019-03-18 16:48:23 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT SYSDATE();
+---------------------+
| SYSDATE()           |
+---------------------+
| 2019-03-18 16:48:38 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2019-03-18 16:48:59 |
+---------------------+
1 row in set (0.01 sec)

mysql> SELECT CURRENT_TIMESTAMP() + 0;
+-------------------------+
| CURRENT_TIMESTAMP() + 0 |
+-------------------------+
|          20190318164904 |
+-------------------------+
1 row in set (0.00 sec)