一.内置函数

函数可以用在数据表的任何字段上。

1.字符函数

(1)CONCAT() 字符连接

# 可以连接任意个数的字符
SELECT CONCAT('kim','-','xiaotiantian',' ','so',' ','beautiful','!');
# 创建一张新表	
CREATE TABLE tbl_test ( first_name VARCHAR ( 20 ), last_name VARCHAR ( 10 ) );
# 将新表的两个字段组合在一起查询
SELECT CONCAT(first_name,last_name) AS full_name FROM tbl_test;

(2)CONTACT_WS() 使用指定的分隔符进行字符连接

# 第一个值为指定的分隔符,后面为使用分隔符连接的内容,可以连接任意个数的字符
SELECT CONCAT_WS('|','A','B','C','D');

(3)FORMAT() 数字格式化

# 返回结果是一个字符型。第二位是几,则保留几位数。
SELECT FORMAT(88888.80032,2);
# 0则保留整数位
SELECT FORMAT(88888.80032,0);

(4)LOWER() 转换成小写字母

# 得到一个完全小写的字符
SELECT LOWER('MySQL');

(5)UPPER() 转换成大写字母

# 得到一个完全大写的字符
SELECT UPPER('Mysql');

(6)LEFT() 获取左侧字符

# LEFT函数有两个参数,第一个参数是指从哪个字符串获取,第二个参数是获取几位
SELECT LEFT('MySQL',2);
# 也可以进行函数的嵌套使用
SELECT LOWER(LEFT('MySQL',2));

(7)RIGHT() 获取右侧字符

# RIGHT函数有两个参数,第一个参数是指从哪个字符串获取,第二个参数是获取几位
SELECT RIGHT('MySQL',3);

(8)LENGTH() 获取字符串长度

# 获取字符串的长度,如果有空格,空格也算长度
SELECT LENGTH(' MySQL ');

(9)LTRIM() 删除前导空格

# 可以获取到结果为11
SELECT LENGTH('  MySQL    ');
# LTRIM()表示删除第一个字母前面的空格,可以获取到结果为9,确定前面的空格被删除掉
SELECT LENGTH(LTRIM('  MySQL    '));

(10)RTRIM() 删除后续空格

# 可以获取到结果为11
SELECT LENGTH('  MySQL    ');
# RTRIM()表示删除最后一个字母后面的空格,可以获取到结果为7,确定后面的空格被删除掉
SELECT LENGTH(RTRIM('  MySQL    '));

(11)TRIM() 删除前导和后续空格

# 可以获取到结果为12
SELECT LENGTH('  My SQL    ');
# TRIM()表示删除前面和后面的所有空格,可以获取到结果为6,确定前面和后面的空格都被删除掉。无法去掉中间的空格
SELECT LENGTH(TRIM('  My SQL    '));
# TRIM()也可以用来删除指定字符,下面这个SQL表示删除前导的'?'字符
SELECT TRIM(LEADING '?' FROM '??MySQL???');
# TRIM()也可以用来删除指定字符,下面这个SQL表示删除后续的'?'字符
SELECT TRIM(TRAILING '?' FROM '??MySQL???');
# TRIM()也可以用来删除指定字符,下面这个SQL表示删除前导和后置的'?'字符,无法删除中间的。
SELECT TRIM(BOTH '?' FROM '??My?SQL???');

(12)SUBSTRING() 字符串截取

# SUBSTRING截取字符串
# 三个参数,第一个是从哪个字符串截取,第二个是从第几位截取,第三个是截取几位
SELECT SUBSTRING('hello world','2','3');
# 两个参数如果不指定截取几位,则默认截取到字符串末尾
SELECT SUBSTRING('hello world','2');
# 起始位可以为负值,表示从后往前数几位
SELECT SUBSTRING('hello world','-3');

(13)[NOT] LIKE() 模式匹配

# %表示任意数,返回结果为1表示True,0表示FALSE
SELECT 'MYSQL' LIKE 'M%';
# %表示任意数,查询lst_name中带有o的结果
SELECT * FROM tbl_test WHERE last_name LIKE '%o%';
# 想查询lst_name中带有%的结果则要使用下面的方式,表示1后面的%不需要再认为是通配符解析了,直接认为是标准的%
SELECT * FROM tbl_test WHERE last_name LIKE '%1%%' ESCAPE 1;
# _下划线表示任意一个数
SELECT * FROM tbl_test WHERE last_name LIKE '__o';

(14)REPLACE() 字符串替换

# 想去掉中间的空格或者字符,可以使用replace替换。
# 第一个参数为要处理的字符,第二个参数为要被替换的字符,第三个参数为替换为的字符
SELECT REPLACE('??My?SQL???','?','');
# 也可以进行1个字符替换多个字符,多个字符替换一个字符,多个字符替换多个字符的操作
SELECT REPLACE('??My?SQL???','??','&!');
SELECT REPLACE('??My?SQL???','?','&!');
SELECT REPLACE('??My?SQL???','??','!');

2.数值运算符与函数

(1)CEIL() 向上取整,进一取整

# 有小数位就向上取整,即用整数位+1.结果为4
SELECT CEIL(3.01);

(2)DIV() 整数除法

# 整数除法,只保留整数位的除法
SELECT 3 DIV 4;

(3)FLOOR() 向下取整,舍一取整

# 有小数位就向下取整,即用整数位-1.结果为3
SELECT FLOOR(3.66);

(4)MOD() 取余数(取模)

# 取余数,对整数和消数都可以,和‘%’一样。
SELECT 5.1 MOD 4;
# 两个结果一样
SELECT 5.1 % 4;

(5)POWER() 幂运算

# POWER(n,m),表示n的m次方
SELECT POWER(2,3);

(6)ROUND() 四舍五入

# ROUND表示四舍五入,第一个参数为四舍五入的数,第二个参数表示保留几位
SELECT ROUND(3.652,2);
# 第二个参数可以为负数,结果为40
SELECT ROUND(35.652,-1);

(7)TRUNCATE() 数字截取

# 第一个参数为被截取的数,第二个参数表示保留几位。结果是125.8,和四舍五入不一样,这是单纯的截取
SELECT TRUNCATE(125.89,0);
# 第二个参数可以为负数,结果为100
SELECT TRUNCATE(125.89,-2);

3.比较运算符与函数

(1)[NOT] BETWEEN...AND... 【不】在范围之内

# 在不在某个闭合范围内,返回1为TRUE,0为FALSE
SELECT 9 NOT BETWEEN 1 AND 10; 
SELECT 9 BETWEEN 1 AND 10;

(2)[NOT] IN () 【不】在列出值范围内

# 在不在列出的值的范围内,给的是数轴上的某些个特定的点,返回1为TRUE,0为FALSE
SELECT 9 NOT IN (1,2,3,4,5,6,7,8,9);
SELECT 9 IN (1,2,3,4,5,6,7,8,9);

(3)IS [NOT] NULL() 【不】为空

# 是否为空,返回1为TRUE,0为FALSE
# 返回1
SELECT NULL IS NULL;
# 返回0
SELECT '' IS NULL;
# 返回0
SELECT 0 IS NULL;
# 实际中使用,查询first_name不为空的数据
SELECT * FROM tbl_test WHERE first_name IS NOT NULL;

4.日期时间函数

(1)NOW() 当前日期和时间

# 查看当前的日期和时间
SELECT NOW();

(2)CURDATE() 当前日期

# 查看当前的日期
SELECT CURDATE();

(3)CURTIME() 当前时间

# 查看当前的时间
SELECT CURTIME();

(4)DATE_ADD() 日期变化

# 查看日期变化
# 在2018-12-12的基础上+365天
SELECT DATE_ADD('2018-12-12',INTERVAL 365 DAY);
# 在2018-12-12的基础上-365天
SELECT DATE_ADD('2018-12-12',INTERVAL -365 DAY);
# 在2018-12-12的基础上+1年
SELECT DATE_ADD('2018-12-12',INTERVAL 1 YEAR);
# 在2018-12-12的基础上+3周
SELECT DATE_ADD('2018-12-12',INTERVAL 3 WEEk);
# 在2018-12-12的基础上+2月
SELECT DATE_ADD('2018-12-12',INTERVAL 2 MONTH);

(5)DATEDIFF() 日期差值

# 返回两个日期的差值
SELECT DATEDIFF('2015-6-1','2018-12-24');

(6)DATE_FORMAT() 日期格式化

# 日期格式化,将常见的一种日期格式转换成另外一种日期格式
SELECT DATE_FORMAT('2014-3-12','%m/%d/%Y');

5.信息函数

(1)CONNECTION_ID() 连接ID

# 查看当前的连接ID
SELECT CONNECTION_ID();

(2)DATABASE() 当前数据库

# 查看当前的连接的数据库
SELECT DATABASE();

(3)LAST_INSERT_ID() 最后插入记录的ID号

# 要在之前插入一条有自动编号id的数据,得到最后插入记录的ID号
# 但写入多条数据的时候,只能获取到多条中第一条写入的ID,无法获取后面写入的ID
SELECT LAST_INSERT_ID();

(4)USER() 当前用户

# 查看当前用户
SELECT USER();

(5)VERSION() 版本信息

# 查看版本信息
SELECT VERSION();

6.聚合函数

   聚合函数的特点是只有一个返回值。

(1)AVG() 平均值

# 查看平均价格
SELECT AVG(goods_price) AS avg_price FROM tbl_goods;

(2)COUNT() 计数

# 查看总条数
SELECT COUNT(goods_id) AS totalnum FROM tbl_goods;

(3)MAX() 最大值

# 最大值,查看商品价格最高的
SELECT MAX(goods_price) AS avg_price FROM tbl_goods;

(4)MIN() 最小值

# 最小值,查看商品价格最低的
SELECT MIN(goods_price) AS avg_price FROM tbl_goods;

(5)SUM() 求和

# 求和,查看全部商品的总价
SELECT SUM(goods_price) AS avg_price FROM tbl_goods;

7.加密函数

(1)MD5() 信息摘要算法

# 信息摘要算法,加密完为一个32位的数字
# 如果是为了以后的WEB页面作准备,尽量使用MD5
SELECT MD5('kimtian');

(2)PASSWORD() 密码算法

# 进行密码的计算
SELECT PASSWORD('kimtian');
# 修改客户端自己密码的时候,使用PASSWORD修改用户密码
SET PASSWORD=PASSWORD('kimtian');

二.自定义函数

1.定义

          用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同。

          自定义函数的两个必要条件:(1)参数 (2)返回值

          函数可以返回任意类型的值,同样可以接收这些类型的参数,参数不可以超过1024个。

2.语法

CREATE FUNCTION function_name RETURNS {STRING | INTEGER | REAL | DECIMAL} routine_body

          routine_body指的是函数体。

3.函数体

          (1)函数体由合法的SQL语句构成;

          (2)函数体可以是简单的SELECT或INSERT语句;

          (3)函数体如果为复合结构则使用BEGIN...END语句;

          (4)复合结构可以包含声明,循环,控制结构。

4.创建不带参数的自定义函数

            在最开始创建自定义函数的时候报错:

           ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

            解决办法:

使用命令:set global log_bin_trust_function_creators=1;

            接下来就可以创建成功自定义函数了:         

# 想按照年月日 时分秒和指定格式获取当前日期
SELECT DATE_FORMAT((NOW()),'%Y年%m月%d日 %H点:%i分:%s秒');
# 将上面的查询封装成一个函数,方便以后使用,创建函数f1
CREATE FUNCTION f1() RETURNS VARCHAR(30) 
RETURN DATE_FORMAT((NOW()),'%Y年%m月%d日 %H点:%i分:%s秒');
# 使用函数f1
SELECT f1();

5.创建带有参数的自定义函数        

# 创建带有参数的自定义函数
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
# 使用函数f2
SELECT f2(1002,4233);

6.删除函数

       语法:DROP  FUNCTION [IF EXISTS] function_name

# 删除函数的命令
DROP FUNCTION f2;

7.创建具有复合结构函数体的自定义函数

  • 函数体由合法的SQL语句构成;
  • 函数体可以是简单的SELECT或INSERT语句;
  • 函数体如果为复合结构则使用BEGIN...END语句;
  • 复合结构可以包含声明,循环,控制结构;     
# 修改默认的mysql的分隔符,改为必须用$$结束Mysql,不用在结尾加分号,加了分号分隔符就变成了$$;
DELIMITER $$
# 如果使用命令行 择要修改默认的mysql的分隔符,并在结尾加上$$
CREATE FUNCTION adduser2(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT inserttest(username) VALUES (username);
RETURN LAST_INSERT_ID();
END
$$
# 如果使navicat等工具,不用加$$
CREATE FUNCTION adduser2(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT inserttest(username) VALUES (username);
RETURN LAST_INSERT_ID();
END
# 使用复合函数adduser()
SELECT adduser('lalala');