什么是函数
函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样即提高了代码效率,又提高了可维护性。在SQL
中我们也可以使用函数对检索出来的数据进行操作。使用这些函数,可以极大地提高用户对数据库的管理效率。
从函数定义的角度出发,我们可以将函数分成内置函数和自定义函数。在SQL
语言中,同样也包括了内置函数和自定义函数。内置函数是系统内置的通用函数,而自定义函数是我们根据自己的需要编写的。
不同DBMS
函数的差异
我们在使用SQL
语言的时候,不是直接和这门语言打交道,而是通过它使用不同的数据库软件,即DBMS
。DBMS
之间的差异性很大,远大于同一个语言不同版本之间的差异。实际上,只有很少的函数被DBMS
同时支持的。大部分DBMS
会有自己特定的函数,这就意味着采用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 ABS(-123), ABS(32), SIGN(-23), SIGN(43), PI(), CEIL(32.32), CEILING(-43.23), FLOOR(32.32),
FLOOR(-43.23), MOD(12, 5)
FROM DUAL;
#取随机数
SELECT RAND(), RAND(), RAND(10), RAND(10), RAND(-1), RAND(-1)
FROM DUAL;
#四舍五入
SELECT ROUND(123.556), ROUND(123.456, 0), ROUND(123.456, 1), ROUND(123.456, 2),
ROUND(123.456, -1), ROUND(153.456, -2)
FROM DUAL;
# 截断操作
SELECT TRUNCATE(123.456, 0), TRUNCATE(123.496, 1), TRUNCATE(129.45, -1)
FROM DUAL;
角度与弧度互换函数
函数 | 用法 |
---|---|
RADIANS(x) |
将角度转化为弧度,其中,参数x为角度值。 |
DEGREES(x) |
将弧度转化为角度,其中,参数x为弧度制 |
SELECT RADIANS(30), RADIANS(45), RADIANS(60), RADIANS(90), DEGREES(2 * PI()), DEGREES(RADIANS(60))
FROM DUAL;
三角函数
函数 | 用法 |
---|---|
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(m, n) |
返回两个参数的反正切值 |
COT(x) |
返回x 的余切值,其中,x 为弧度值 |
SELECT SIN(RADIANS(30)), DEGREES(ASIN(1)), TAN(RADIANS(45)), DEGREES(ATAN(1))
FROM DUAL;
指数与对数
函数 | 用法 |
---|---|
POW(x, y)、POWER(x, y) |
返回x 的y 的次方 |
EXP(x) |
返回e 的X 次方,其中e 是一个常数,2.718281828459045 |
LN(x)、LOG(x) |
返回以e 为底的X 的对数,当x <= 0 时,返回的结果为NULL |
LOG10(x) |
返回以10 为底的X 的对数,当x <= 0 时,返回的结果为NULL |
LOG2(x) |
返回以2 为底的X 的对数,当x <= 0 时,返回的结果为NULL |
SELECT POW(2, 5), POWER(2, 4), EXP(2)
FROM DUAL;
SELECT LN(EXP(2)), LOG(EXP(2)), LOG10(10), LOG2(4)
FROM DUAL;
进制间的转换
函数 | 用法 |
---|---|
BIN(x) |
返回x 的二进制编码 |
HEX(x) |
返回x 的十六进制编码 |
OCT(x) |
返回x 的八进制编码 |
CONV(x, f1, f2) |
返回f1 的进制数变成f2 进制数 |
SELECT BIN(10), HEX(10), OCT(10), CONV(10, 10, 8)
FROM DUAL;
函数 | 用法 |
---|---|
ASCII(s) |
返回字符串s 中的第一个字符的ASCII 码值 |
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, idx, len, replacestr) |
将字符串str 从第idx 位置开始,len 个字符长的子串替换为字符串replacestr |
REPLACE(str, a, b) |
用字符串b 替换字符串str 中所有出现的字符串a |
UPPER(s) 或UCASE(s) |
将字符串s 的所有字母转成大写字母 |
LOWER(s) 或LCASE(s) |
将字符串s 的所有字母转成小写字母 |
LEFT(str, n) |
返回字符串str 最左边的n 个字符 |
RIGHT(str, n) |
返回字符串str 最右边的n 个字符 |
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(TRAILNG s1 FROM s) |
去掉字符串s 尾处的s1 |
REPEAT(str, n) |
返回str 重复n 的结果 |
SPACE(n) |
返回n 个空格 |
STRCMP(s1, s2) |
比较字符串s1 , s2 的ASCII 码值的大小 |
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 是一个以逗号分隔的字符串 |
REVERES(s) |
返回s 反转后的字符串 |
NULLIF(value1, value2) |
比较两个字符串,如果value1 与value2 相等,则返回NULL ,否则返回value1 |
SELECT ASCII('Abcfsf'), CHAR_LENGTH('hello'), CHAR_LENGTH('我们'), LENGTH('hello'), LENGTH('我们')
FROM DUAL;
# xxx worked for yyy
SELECT CONCAT(emp.last_name, ' worked for ', mgr.last_name) "details"
FROM employees emp JOIN employees mgr
WHERE emp.manager_id = mgr.employee_id;
SELECT CONCAT_WS('-', 'hello', 'world', 'hello', 'beijing')
FROM DUAL;
#字符串的索引是从1开始的!
SELECT INSERT('helloworld', 2, 3, 'aaaaa'), REPLACE('hello', 'lol', 'mmm')
FROM DUAL;
SELECT UPPER('HelLo'), LOWER('HelLo')
FROM DUAL;
SELECT last_name, salary
FROM employees
WHERE LOWER(last_name) = 'King';
SELECT LEFT('hello', 2), RIGHT('hello', 3), RIGHT('hello', 13)
FROM DUAL;
# LPAD:实现右对齐效果
# RPAD:实现左对齐效果
SELECT employee_id, last_name, LPAD(salary, 10, ' ')
FROM employees;
SELECT CONCAT('---', LTRIM(' h el lo '), '***'),TRIM('oo' FROM 'ooheollo')
FROM DUAL;
SELECT REPEAT('hello', 4), LENGTH(SPACE(5)), STRCMP('abc', 'abe')
FROM DUAL;
SELECT SUBSTR('hello', 2, 2), LOCATE('lll', 'hello')
FROM DUAL;
SELECT ELT(2, 'a', 'b', 'c', 'd'), FIELD('mm', 'gg', 'jj', 'mm', 'dd', 'mm'),
FIND_IN_SET('mm', 'gg,mm,jj,dd,mm,gg')
FROM DUAL;
SELECT employee_id, NULLIF(LENGTH(first_name), LENGTH(last_name)) "compare"
FROM employees;
获取日期、时间
函数 | 用法 |
---|---|
CURDATE()、CURRENT_DATE() |
返回当前日期,只包含年、月、日 |
CURTIME()、CURRENT_TIME() |
返回当前时间,只包含时、分、秒 |
NOW()、SYSDATE()、CURRENT_TIMEAMP()、LOCALTIME()、LOCALTIMESTAMP() |
返回当前系统日期和时间 |
UTC_DATE() |
返回UTC(世界标准时间) 日期 |
UTC_TIME() |
返回UTC(世界标准时间) 时间 |
SELECT CURDATE(), CURRENT_DATE(), CURTIME(), NOW(), SYSDATE(), UTC_DATE(), UTC_TIME()
FROM DUAL;
日期与时间戳的转换
函数 | 用法 |
---|---|
UNIX_TIMESTAMP() |
以UNIX 时间戳的形式返回当前时间 |
UNIX_TIMESTAMP(date) |
将时间date 以UNIX 时间戳的形式返回 |
FROM_UNIXTIME(timestamp) |
将UNIX 时间戳的时间转换为普通格式的时间 |
SELECT UNIX_TIMESTAMP(), UNIX_TIMESTAMP('2021-10-01 12:12:32'),
FROM_UNIXTIME(1635173853), FROM_UNIXTIME(1633061552)
FROM DUAL;
获取月份、星期、星期数、天数等函数
函数 | 用法 |
---|---|
YEAR(date)、MONTH(date)、DAY(date) |
返回具体的日期值 |
HOUR(time)、MINUE(time)、SECOND(time) |
返回具体的时间值 |
MONTHNAME(date) |
返回月份 |
DAYNAME(date) |
返回星期几 |
WEEKDAY(date) |
返回周几,注意:周1是0,周2是1,… |
QUARTER(date) |
返回日期对应的季度,范围为1~4 |
WEEK(date)、WEEKOFYEAR(date) |
返回一年中的第几周 |
DAYOFYEAR(date) |
返回日期是一年中的第几天 |
DAYOFMONTH(date) |
返回日期位于所在月份的第几天 |
DAYODWEEK(date) |
返回周几,注意:周日是1,周一是2,… |
SELECT YEAR(CURDATE()), MONTH(CURDATE()), DAY(CURDATE()),
HOUR(CURTIME()), MINUTE(NOW()), SECOND(SYSDATE())
FROM DUAL;
SELECT MONTHNAME('2021-10-26'), DAYNAME('2021-10-26'), WEEKDAY('2021-10-26'),
QUARTER(CURDATE()), WEEK(CURDATE()), DAYOFYEAR(NOW()),
DAYOFMONTH(NOW()), DAYOFWEEK(NOW())
FROM DUAL;
日期的操作函数
函数 | 用法 |
---|---|
EXTRACT(type FROM date) |
返回指定日期中特定的部分,type 指定返回的值 |
EXTRACT(type FROM date)
函数中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 |
返回年和月 |
SELECT EXTRACT(SECOND FROM NOW()), EXTRACT(DAY FROM NOW()),
EXTRACT(HOUR_MINUTE FROM NOW()), EXTRACT(QUARTER FROM '2021-05-12')
FROM DUAL;
时间和秒钟转换的函数
函数 | 用法 |
---|---|
TIME_TO_SEC(time) |
将time 转化为秒并返回结果集。 |
SEC_TO_TIME(seconds) |
将seconds 描述转换化为包含小时、分钟和秒的时间 |
SELECT TIME_TO_SEC(CURTIME()),SEC_TO_TIME(83355)
FROM DUAL;
计算日期和时间的函数
第一组
函数 | 用法 |
---|---|
DATE_ADD(datetime, INIERVAL 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 |
秒 |
YEAR |
年 |
MONTH |
月 |
DAY |
日 |
YEAR_MONTH |
年和月 |
DAY_HOUR |
日和小时 |
DAY_MINUTE |
日和分钟 |
DAY_SECOND |
日和秒 |
HOUR_MINUTE |
小时和分钟 |
HOUR_SECOND |
小时和秒 |
MINUTE_SECOND |
分钟和秒 |
SELECT NOW(), DATE_ADD(NOW(), INTERVAL 1 YEAR),
DATE_ADD(NOW(), INTERVAL -1 YEAR),
DATE_SUB(NOW(), INTERVAL 1 YEAR)
FROM DUAL;
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY) AS col1,
DATE_ADD('2021-10-21 23:32:12', INTERVAL 1 SECOND) AS col2,
ADDDATE('2021-10-21 23:32:12', INTERVAL 1 SECOND) AS col3,
DATE_ADD('2021-10-21 23:32:12', INTERVAL '1_1' MINUTE_SECOND) AS col4,
DATE_ADD(NOW(), INTERVAL -1 YEAR) AS col5,
DATE_ADD(NOW(), INTERVAL '1_1' YEAR_MONTH) AS col6
FROM DUAL;
第二组
函数 | 用法 |
---|---|
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 后的时间 |
SELECT ADDTIME(NOW(), 20), SUBTIME(NOW(), 30),
SUBTIME(NOW(), '1:1:3'), DATEDIFF(NOW(), '2021-10-01'),
TIMEDIFF(NOW(), '2021-10-25 22:10:10'), FROM_DAYS(366), TO_DAYS('0000-12-25'),
LAST_DAY(NOW()), MAKEDATE(YEAR(NOW()), 32),
MAKETIME(10, 21, 23), PERIOD_ADD(20200101010101, 10)
FROM DUAL;
日期的格式化与解析
函数 | 用法 |
---|---|
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 |
月名表示月份 | %m |
两位数字表示月份 |
%b |
缩写的月份 | %c |
数字表示月份 |
%D |
英文后缀表示月中的天数 | %d |
两位数字表示月中的天数 |
%e |
数字形式表示月中的天数 | ||
%H |
两位数字表示小数,24 小时制 |
%h 和%l |
两位数字表示小时,12小时制(01 ,02 .... ) |
%k |
数字形式的小时,24小时制 | %l |
数字形式表示小时,12小时制(1, 2, 3, 4 ) |
%i |
两位数字表示分钟(00 ,01.... ) |
%S 和%s |
两位数字表示秒(00 , 01 ... ) |
%W |
一周中的星期名称 | %a |
一周中的星期缩写 |
%w |
以数字表示周中的天数 | ||
%j |
以3位数字表示年中的天数 | %U |
以数字表示年中的第几周,其中Sunday 为周中第一天 |
%u |
以数字表示年中的第几周,其中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 |
#格式化:
SELECT DATE_FORMAT(CURDATE(), '%Y-%M-%D'),
DATE_FORMAT(NOW(), '%Y-%m-%d'), TIME_FORMAT(CURTIME(), '%h:%i:%S'),
DATE_FORMAT(NOW(), '%Y-%M-%D %h:%i:%S %W %w %T %r')
FROM DUAL;
#解析:格式化的逆过程
SELECT STR_TO_DATE('2021-October-25th 11:37:30 Monday 1', '%Y-%M-%D %h:%i:%S %W %w')
FROM DUAL;
SELECT GET_FORMAT(DATE, 'USA')
FROM DUAL;
SELECT DATE_FORMAT(CURDATE(), GET_FORMAT(DATE, 'USA'))
FROM DUAL;
流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL
语句中实现不同的条件选择。MySQL
中的流程处理函数主要包括IF()
、IFNULL()
和CASE()
函数。
函数 | 用法 |
---|---|
IF(value, vaule1, vaule2) |
如果value 的值为TRUE ,返回value1 ,否则返回value2 |
IFUNLL(value1, value2) |
如果value1 不为NULL ,返回value1 ,否则返回value2 |
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ... [ELSE resultn] END |
相当于Java 的if ... else if ... else ... |
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 ... [ELSE resultn] END |
相当于Java 的switch ... case ... |
#1 IF(VALUE,VALUE1,VALUE2)
SELECT last_name, salary, IF(salary >= 6000, '高工资', '低工资') "details"
FROM employees;
#2 IFNULL(VALUE1,VALUE2):看做是IF(VALUE,VALUE1,VALUE2)的特殊情况
SELECT last_name, commission_pct,IFNULL(commission_pct, 0) "details"
FROM employees;
#3 CASE WHEN ... THEN ...WHEN ... THEN ... ELSE ... END
SELECT last_name, salary, CASE WHEN salary >= 15000 THEN '领导'
WHEN salary >= 10000 THEN '白领'
WHEN salary >= 8000 THEN '蓝领'
ELSE '临时工' END "details", department_id
FROM employees;
#4 CASE ... WHEN ... THEN ... WHEN ... THEN ... ELSE ... END
SELECT employee_id, last_name, department_id, salary, CASE department_id WHEN 10 THEN salary * 1.1
WHEN 20 THEN salary * 1.2
WHEN 30 THEN salary * 1.3
ELSE salary * 1.4 END "details"
FROM employees;
加密与解密函数主要用于对数据库中的数据进行加密和解密处理,以防止数据被他人窃取。这些函数在保证数据安全时非常有用。
函数 | 用法 |
---|---|
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 |
# PASSWORD()在mysql8.0中弃用。
/*
SELECT PASSWORD('mysql')
FROM DUAL;
*/
SELECT MD5('mysql'), SHA('mysql'), MD5(MD5('mysql'))
FROM DUAL;
#ENCODE()\DECODE() 在mysql8.0中弃用。
/*
SELECT ENCODE('atguigu','mysql'),DECODE(ENCODE('atguigu','mysql'),'mysql')
FROM DUAL;
*/
MySQL
中内置了一些可以查询MySQL
信息的函数,这些函数主要用于帮助数据库开发或运维人员更好地对数据库进行维护工作。
函数 | 用法 |
---|---|
VERSION() |
返回当前MySQL 的版本号 |
CONNECTION_ID() |
返回当前MySQL 服务器的连接数 |
DATABASE() 、SCHEMA() |
返回MySQL 命令行当前所在的数据库 |
USER() 、CURRENT_USER() 、SYSTEM_USER() 、SESSION_USER() |
返回当前连接MySQL 的用户名,返回结果格式为主机名@用户名 |
CHARSET(value) |
返回字符串value 自变量的字符集 |
COLLATION(value) |
返回字符串value 的比较规则 |
SELECT VERSION(), CONNECTION_ID(), DATABASE(), SCHEMA(),
USER(), CURRENT_USER(), CHARSET('小王同学'), COLLATION('小王同学')
FROM DUAL;
MySQL
中有些函数无法对其进行具体的分类,但是这些函数在MySQL
的开发和运维过程中也是不容忽视的。
函数 | 用法 |
---|---|
FORMAT(value, n) |
返回对数字value 进行格式化后的结果数据。n 表示四舍五入后保留到小数点后n 位 |
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 |
#如果n的值小于或者等于0,则只保留整数部分
SELECT FORMAT(123.125, 2), FORMAT(123.125, 0), FORMAT(123.125, -2)
FROM DUAL;
SELECT CONV(16, 10, 2), CONV(8888, 10, 16), CONV(NULL, 10, 2)
FROM DUAL;
SELECT INET_ATON('192.168.1.100'), INET_NTOA(3232235876)
FROM DUAL;
SELECT BENCHMARK(100000, MD5('mysql'))
FROM DUAL;
SELECT CHARSET('atguigu'), CHARSET(CONVERT('atguigu' USING 'gbk'))
FROM DUAL;