目录
函数的理解:
函数在计算机语言的使用中贯穿始终,函数的作用是什么?可以把我们常用的代码进行封装,需要时直接调用。这样不仅提高了代码的效率,还提高了可维护性。
在SQL种我们也可以使用函数对索引出来的数据进行函数操作。使用这些函数,可以极大地提高用户对数据库的管理效率。
从函数定义的角度出发,可将函数分成内置函数和自定义函数。在SQL中,同样也包括了内置函数和自定义函数。内置函数是系统内置的通用函数,而自定义函数是根据自己的需求编写的。
在使用SQL语言时,不是直接和这门语言打交道,而是通过使用不同的数据库软件。而在实际中,只有很少的函数时被数据库软件同时支持的。大部分数据库软件都会有自己特定的函数,就意味着采用SQL函数的代码的可移植性是很差的,因此在使用函数的时候需要特别注意。
MySQL的内置函数及分类:
MySQL提供了丰富的内置函数,这些函数使得数据的维护与管理更加方便,能够更好地提供数据的分析与统计功能,在一定程度上提高了开发人员进行数据分析与统计的效率。
MySQL提供的内置函数从实现的功能角度可以分为数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取MySQL信息函数、聚合函数等。
单行函数:
操作数据对象;接收参数返回一个结果;只对一行进行变换;每行返回一个结果;可以嵌套;参数可以是一列或者是一个值。
数值函数:
基本函数:
函数 |
用法 |
ABS(X) |
返回x的绝对值 |
SIGN(X) |
返回x的符号。证书返回1,负数返回-1,0则返回0 |
PI() |
返回圆周率的值 |
CEIL(X),CEILING(X) |
返回大于或者等于某个值的最小整数 |
FLOOR(X) |
返回小于或者等于某个值的最大整数 |
LEAST(e1,e2,e3,...) |
返回列表中的最小值 |
GREATEST(e1,e2,e3,...) |
返回列表中的最大值 |
MOD(X,Y) |
返回x除以y后的余数 |
RAND() |
返回0-1的随机数 |
RAND(X) |
返回0-1的随机数,其中x的值用作种子值,相同的x会产生相同的随机数 |
ROUND(X) |
返回一个对x的值进行四舍五入后,最接近于x的整数 |
ROUND(X,Y) |
返回一个对x的值进行四舍五入后,最接近x的值,并保留小数点后面y位 |
TRUNCATE(X,Y) |
返回数字x截断y位小数的结果 |
SQRT(X) |
返回x的平方根,当x的值为负数时,返回NULL |
SELECT RAND(X),RAND(Y)
FROM DUAL;
如果X=Y那么,产生的随机数的值时一样的。
SELECT ROUND(X,Y)
FROM DUAL;
如果Y为正数,那么对小数第几位后面进行截断 如果Y为负数,那么对整数部分第几位进行保留: 比如说TRUNCATE(126.156,-1);如果对整数部分第一位进行截断保留, 结果为120。
SELECT TRUNCATE(X,Y)
FROM DUAL;
如果Y为正数,那么对小数第几位后面进行截断 如果Y为负数,那么对整数部分第几位进行保留: 比如说TRUNCATE(126.156,-1);如果对整数部分第一位进行截断保留, 结果为120。
所以可以注意区分以下ROUND(X,Y)和TRUNCATE(X,Y)。
角度与弧度互换函数:
函数 |
用法 |
RADIANS(X) |
将角度转化为弧度,其中,参数x为角度值 |
DEGREES(X) |
将弧度转化为角度,其中,参数x为弧度值 |
三角函数:
函数 |
用法 |
SIN(X) |
返回x的正弦值,其中,参数x为弧度值 |
ASIN(X) |
返回x的反正弦值,即获取正弦为x的值,如果x的值不在-1到1之间,则返回NULL |
COS(X) |
返回x的余弦值,其中,参数x为弧度值 |
ACOS(X) |
返回x的反余弦值,即获取余弦为x的值,如果x的值不在-1到1之间,则返回NULL |
TAN(X) |
返回x的正切值,其中,参数x为弧度值 |
ATAN(X) |
返回x的反正切值,即返回正切值为x的值 |
ATAN2(X,Y) |
返回两个参数的反正切值 |
COT(X) |
返回x的余切值,其中,x为弧度值 |
指数与对数:
函数 |
用法 |
POW(X,Y),POWER(X,Y) |
返回x的y次方 |
EXP(X) |
返回e的x次方,其中e是一个常数 |
LN(X),LOG(X) |
返回以e为底的x的对数,当x |
LOG10(X) |
返回以10为底的x对数,当x |
LOG2(X) |
返回以2为底的x对数,当x |
进制转换:
函数 |
用法 |
BIN(X) |
返回x的二进制编码 |
HEX(X) |
返回x的十六进制编码 |
OCT(X) |
返回x的八进制编码 |
CONV(X,Y1,Y2) |
返回y1进制数变成y2进制数 |
字符串函数:
函数 |
用法 |
ASCLL(S) |
返回字符串s中第一个字符的ascll码值 |
CHAR_LENGTH(S) |
返回字符串s的字符数,作用与CHARACTER_LENGTH(s)相同 |
LENGTH(S) |
返回字符串s的字节数,和字符集有关 |
CONCAT(S1,S2,...,Sn) |
连接s1,s2,...,sn为一个字符串 |
CONCAT_WS(X,S1,S2,...,Sn) |
同CONCAT(s1,s2,...)函数,但是每一个字符串之间要加上x |
INSERT(str,index,len,replacestr) |
将字符串str从第index位置开始,len个字符长的子串替换为字符串replacestr(索引是从1开始的) |
REPLACE(str,a,b) |
用字符串b替换字符串str中所有出现的字符串a |
UPPER(S)或UCASE(S) |
将字符串s的所有字母转成大写字母 |
LOWER(S)或LCASE(S) |
将字符串s的所有字母转成小写字母 |
LEFT(str,n) |
返回字符串str最左边的n个字符,如果n大于str的字符数,就全取 |
RIGHT(str,n) |
返回字符串str最右边的n个字符,如果n大于str的字符数,就全取 |
LPAD(str,len,pad) |
用字符串pad对str最左边进行填充,直到str的长度为len个字符(实现右对齐效果) |
RPAD(str,len,pad) |
用字符串pad对str最右边进行填充,直到str的长度为len个字符(实现左对齐效果) |
LTRIM(S) |
去掉字符串s左侧的空格 |
RTRIM(S) |
去掉字符串s右侧的空格 |
TRIM(S) |
去掉字符串s开始与结尾的空格 |
TRIM(S1 FROM S) |
去掉字符串s开始与结尾的S1 |
TRIM(LEADING S1 FROM S) |
去掉字符串s开始处的s1 |
TRIM(TRAILING S1 FROM S) |
去掉字符串s结尾处的s1 |
REPEAT(str,n) |
返回str重复n次的结果 |
SAPCE(n) |
返回n个空格 |
STRCMP(s1,s2) |
比较字符串s1,s2的ascll码值的大小 |
SUBSTR(s,index,len) |
返回从字符串s的index位置其len个字符,作用与SUBSTRING(s,n,len)、MID(s,n,len)相同 |
LOCATE(substr,str) |
返回从字符串substr在字符串str中首次出现的位置,作用于POSITION(substr IN str)、INSTR(str,substr)相同。未找到,返回0 |
ELT(m,s1,s2,...,sn) |
返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回sn |
FIELD(s,s1,s2,...,sn) |
返回字符串s在字符串列表中第一次出现的位置 |
FIND_IN_SET(s1,s2) |
返回字符串s1在字符串s2中首次出现的位置。其中,字符串s2是一个以逗号分隔的字符串 |
REVERSE(S) |
返回s反转后的字符串 |
NULLIF(value1,value2) |
比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value1 |
日期和时间函数:
获取日期、时间:
函数 |
用法 |
CURDATE()、CURRENT_DATE() |
返回当前日期,只包含年、月、日 |
CURTIME()、CURRENT_TIME() |
返回当前时间,只包含时、分、秒 |
NOW()/SYSDATE()/CURRENT_TIMESTAMP()/LOCALTIME()/LOCALTIMESTAMP() |
返回当前系统日期和时间 |
UTC_DATE() |
返回UTC(世界标准时间)日期 |
UTC_TIME() |
返回UTC(世界标准时间)时间 |
日期与时间戳的转换:
函数 |
用法 |
UNIX_TIMESTAMP() |
以UNIX时间戳的形式返回当前时间 |
UNIX_TIMESTAMP(date) |
将时间date以UNIX时间戳的形式返回 |
FROM_UNIXTIME(timestamp) |
将UNIX时间戳的时间转换为普通格式的时间 |
获取月份、星期、星期数、天数等函数:
函数 |
用法 |
YEAR(date)/MONTH(date)/DAY(date) |
返回具体的日期值 |
HOUR(time)/MINUTE(time)/SECOND(time) |
返回具体的时间值 |
MONTHNAME(date) |
返回月份 |
DAYNAME(date) |
返回星期几 |
WEEKDAY(date) |
返回周几,周一是0,周二是1,...周日是6 |
QUARTER(date) |
返回日期对应的季度,范围为1~4 |
WEEK(data),WEEKOFYEAR(date) |
返回一年中的第几周 |
DAYOFYEAR(date) |
返回日期是一年中的第几天 |
DAYOFMONTH(date) |
返回日期位于所在月份的第几天 |
DAYOFWEEK(date) |
返回周几,注意:周日是1,周一是2,...周六是7 |
日期的操作函数:
函数 |
用法 |
EXTRACT(type FROM date) |
返回指定日期中特定的部分,type指定返回的值 |
type的含义:
type的取值 |
含义 |
MICROSECOND |
返回毫秒数 |
SECOND |
返回秒数 |
MINUTE |
返回分钟数 |
HOUR |
返回小时数 |
DAY |
返回天数 |
WEEK |
返回日期在一年中的第几个星期 |
MONTH |
返回日期在一年中的第几个月 |
QUARTER |
返回日期在一年中的第几个季度 |
YEAR |
返回日期的年份 |
SECOND_MICROSECOND |
返回秒和毫秒值 |
MINUTE_MICROSECOND |
返回分钟和毫秒值 |
MINUTE_SECOND |
返回分钟和秒值 |
HOUR_MICROSECOND |
返回小时和毫秒值 |
HOUR_SECOND |
返回小时和秒值 |
HOUR_MINUTE |
返回小时和分钟值 |
DAY_MICROSECOND |
返回天和毫秒值 |
DAY_SECOND |
返回天和秒值 |
DAY_MINUTE |
返回天和分钟值 |
DAY_HOUR |
返回天和小时 |
YEAR_MONTH |
返回年和月 |
时间和秒钟转换函数:
函数 |
用法 |
TIME_TO_SEC(time) |
将time转化为秒并返回结果值。转化的公式为:小时*3600+分钟*60+秒 |
SEC_TO_TIME(seconds) |
将second描述转化为包含小时、分钟和秒时间 |
计算日期和时间的函数:
函数 |
用法 |
DATE_ADD(datetime,INTERVAL expr type),ADDDATE(date,INTERVAL expr type) |
返回与给定日期时间相差INTERVAL时间段的日期时间 |
DATE_SUB(date,INTERVAL expr type),SUBDATE(date,INTERVAL expr type) |
返回与date相差INTERVAL时间间隔的日期 |
type的含义:
间隔类型 |
含义 |
HOUR |
小时 |
MINUTE |
分钟 |
SECOND |
秒 |
TEAR |
年 |
MONTH |
月 |
DAY |
日 |
YEAR_MONTH |
年和月 |
DAY_HOUR |
日和小时 |
DAY_MINUTE |
日和分钟 |
DAY_DECOND |
日和秒 |
HOUR_MINUTE |
小时和分钟 |
HOUR_SECOND |
小时和秒 |
MINUTE_SECOND |
分钟和秒 |
函数 |
用法 |
ADDTIME(time1,time2) |
返回time1加上time2的时间,当time2为一个数字时,代表的是秒,可以为负数 |
SUBTIME(time1,time2) |
返回time1减去time2后的时间,当time2为一个数字时,代表的时秒,可以为负数 |
DATEDIFF(date1,date2) |
返回date1-date2的日期间隔天数 |
TIMEDIFF(time1,time2) |
返回time1-time2的时间间隔 |
FROM_DAYS(N) |
返回从0000年1月1日起,n天以后的日期 |
TO_DAYS(date) |
返回日期date距离0000年1月1日的天数 |
LAST_DAY(date) |
返回date所在月份的最后一天的日期 |
MAKEDATE(year,n) |
针对给定年份与所在年份中的天数返回一个日期 |
MAKETIME(hour,minute,second) |
将给定的小时、分钟和秒组合成时间并返回 |
PERIOD_ADD(time,n) |
返回time加上n后的时间 |
日期的格式化与解析:
格式化:将日期转化为字符串
解析:将字符串转化为日期
函数 |
用法 |
DATE_FORMAT(date,fmt) |
按照字符串fmt格式化日期date值 |
TIME_FORMAT(time,fmt) |
按照字符串fmt格式化时间time值 |
GET_FORMAT(date_type,format_type) |
返回日期字符串的显示格式 |
STR_TO_DATE(str,fmt) |
按照字符串fmt对str进行解析,解析为一个日期 |
GET_FORMAT()函数中的fmt参数常用的格式符:
格式符 |
说明 |
格式符 |
说明 |
%Y |
4位数表示年份 |
%y |
表示两位数字表示年份 |
%M |
月名表示月份(January) |
%m |
两位数字表示月份(01,02,03,...) |
%b |
缩写的月名(Jan,Feb,...) |
%c |
数字表示月份(1,2,3,...) |
%D |
英文后缀表示月中的天数(1st,2nd,3rd,...) |
%d |
两位数字表示月中的天数(01,02,...) |
%e |
数字形式表示月中的天数 |
||
%H |
两位数字表示小数,24小时制(01,02,...) |
%h和%I |
两位数字表示小时,12小时制(01,02,...) |
%k |
数字形式的小时,24小时制(1,2,3) |
%l |
数字形式表示小时,12小时制(1,2,3,4,...) |
%i |
两位数字表示分钟(00,01,02) |
%S和%s |
两位数字表示秒(00,01,02,...) |
%W |
一周中的星期名称(Sunday,...) |
%a |
一周中的星期缩写(Sun,Mon,Tues,...) |
%w |
以数字表示周中的天数(0=Sundat,1=Monday) |
||
%j |
以3为数字表示年中的天数(001,002,003,...) |
%U |
以数字表示年中的第几周(1,2,3,...),其中Sunday为周中第一天 |
%u |
以数字表示年中的第几周(1,2,3,...)其中Monday为周中第一天 |
||
%T |
24小时制 |
%r |
12小时制 |
%p |
AM或PM |
%% |
表示% |
GET_FORMAT函数中date_type和format_type参数取值:
日期类型 |
格式化类型 |
返回的格式化字符串 |
DATE |
USA |
%m.%d.%Y |
DATE |
JIS |
%Y-%m-%d |
DATE |
ISO |
%Y-%m-%d |
DATE |
EUR |
%d.%m.%Y |
DATE |
INTERNAL |
%Y%m%d |
TIME |
USA |
%h:%i:%s%p |
TIME |
JIS |
%H:%i:%s |
TIME |
ISO |
%H:%i:%s |
TIME |
EUR |
%H.%i.%s |
TIME |
INTERNAL |
%H%i%s |
DATETIME |
USA |
%Y-%m-%d %H.%i.%s |
DATETIME |
JIS |
%Y-%m-%d %H:%i:%s |
DATETIME |
ISO |
%Y-%m-%d %H:%i:%s |
DATETIME |
EUR |
%Y-%m-%d %H.%i.%s |
DATETIME |
INTERNAL |
%Y%m%d%H%i%s |
流程控制函数:
流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL语句中实现不同的条件选择。MySQL中的流程处理函数主要包括IF()、IFNULL()和CASE()函数。
函数 |
用法 |
IF(value,value1,value2) |
如果value的值为TRUE,返回value1,否则返回value2 |
IFNULL(value1,value2) |
如果value1不为NULL,返回value1,否则返回value2 |
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ...[ELSE return] END |
相当于C++的if...else if...else... |
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值2 THEN 值2 ... [ELSE 值n] END |
相当于C++的switch...case... |
SELECT 字段,IF(条件,'value1','value2')
FROM 表名;
IFNULL()可以看成IF()的特殊情况。
SELECT 字段,IF(字段 IS NOT NULL,value1,value2)
SELECT 字段,IFNULL(value1,value2)
SELECT 字段1,字段2,CASE WHEN 条件1 THEN
WHEN 条件2 THEN
[ELSE 返回值] END
FROM 表名;
SELECT 字段1,字段2,CASE 判断的字段
WHEN 值1 THEN
WHEN 值2 THEN
[ELSE 值n] END
FROM 表名;
加密与解密函数:
加密与解密函数主要用于对数据库中的数据进行加密和解密处理,以防止数据被他人窃取。这些函数在保证数据库安全时非常有用。
函数 |
用法 |
PASSWORD(str) |
返回字符串str的加密版本,41为长的字符串。加密结果不可逆,常用于用户的密码加密 |
MD5(str) |
返回字符串str的md5加密后的值,也是一种加密方式。若参数为NULL,则会返回NULL |
SHA(str) |
从原明文密码str计算并返回加密后的密码字符串,当参数为NULL时,返回NULL。SHA加密算法比MD5更安全 |
ENCODE(value,password_seed) |
返回使用password_seed作为加密密码加密value |
DECODE(value,password_seed) |
返回使用password_seed作为加密密码解密value |
SELECT PASSWORD(str)
FROM DUAL;
PASSWORD在MySQL8.0中不支持使用
SELECT MD5(str)
FROM DUAL;
SELECT SHA(str)
FROM DUAL;
明文转化为暗文之后,不能再转化为明文。是不可逆的。
在MySQL中,MD5和SHA加密函数都是不可逆的,两者均属于单向哈希算法,无法从哈希值反推出原始数据。
MD5函数:
生成128位(32字符)的哈希值,基于单向哈希原理,输入数据的微小变化会导致输出完全不同。设计初衷是确保数据完整性,但存在已知安全漏洞(如碰撞攻击),不推荐用于高安全性场景。
SHA函数:
包含多种变体(如SHA-1、SHA-256),生成更长的哈希值(如SHA-256为256位),同样具有不可逆性。相较于MD5,SHA系列算法更安全,抗碰撞能力更强,建议优先使用SHA-256或更高版本。
SELECT ENCODE(value,password_seed)
FROM DUAL;
与
SELECT DECODE(value,password_seed)
FROM DUAL;
ENCODE(value,password_seed)与DECODE(value,password_seed)在MySQL8.0中不支持使用
信息函数:
MySQL中内置了一些可以查询的MySQL信息的函数,这些函数主要用于帮助数据库开发或者运维人员更好地对数据库进行维护工作。
函数 |
用法 |
VERSION() |
返回当前MySQL的版本号 |
CONNECTION_ID() |
返回当前MySQL服务器的连接数 |
DATABASE(),SCHEMA() |
返回MySQL命令行当前所在的数据库 |
USER(),CURRENT()_USER(),SYSTEM_USER(),SESSION_USER() |
返回当前连接MySQL的用户名,返回结果格式为“主机名@用户名” |
CHARSET(value) |
返回字符串value自变量的字符集 |
COLLATION(value) |
返回字符串value的比较规则 |
其他函数:
函数 |
用法 |
FORMAT(value,n) |
返回对数字value进行格式化后的结果数据。n表示四舍五入后保留到小数点后第n位,如果n的值小于或者等于0,则只保留整数部分 |
CONV(value,from,to) |
将value的值进行不同进制之间的转换 |
INET_ATON(ipvalue) |
将以点分隔的IP地址转化为一个数字 |
INET_NTOA(value) |
将数字形式的IP地址转化为以点分隔的IP地址 |
BENCHMARK(n,expr) |
将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间 |
CONVERT(value USING char_code) |
将value所使用的字符编码修改为char_code |