一.内置函数
函数可以用在数据表的任何字段上。
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');