当前位置:网站首页>MySQL【单行函数】
MySQL【单行函数】
2022-07-30 17:38:00 【桜キャンドル淵】
目录
不同的数据库之间的函数差别是很大的,这里我们所说的函数仅仅是针对于MySQL中的使用。
MySQL提供的内置函数从 实现的功能角度 可以分为数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取MySQL信息函数、聚合函数等。这里,我将这些丰富的内置函数再分为两类: 单行函数 、 聚合函数(或分组函数) 。
单行函数
操作数据对象
接受参数返回一个结果
只对一行进行变换
每行返回一个结果
可以嵌套
参数可以是一列或一个值
一、数值函数
1.基本函数
#基本的操作
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),12 MOD 5,12 % 5
FROM DUAL;
#取随机数
#如果我们放入的随机数的因子是一样的,这个随机数就是相同的,并且不会发生改变
SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1)
FROM DUAL;
#四舍五入,截断操作
#如果round后面第二个参数写的是0就是直接四舍五入到整数位,如果是1就是四舍五入到小数点后1位,以此类推。
#如果第二个参数是负数,比方说-1就是保留到十位,对个位进行四舍五入。
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;
truncate为截断操作,无论后面那一位是啥都会直接截断,不进位。
SELECT TRUNCATE(123.456,0),TRUNCATE(123.496,1),TRUNCATE(129.45,-1)
FROM DUAL;
#单行函数可以嵌套
SELECT TRUNCATE(ROUND(123.456,2),0)
FROM DUAL;
2.角度弧度转换函数
#角度与弧度的互换
SELECT RADIANS(30),RADIANS(45),RADIANS(60),RADIANS(90),
DEGREES(2*PI()),DEGREES(RADIANS(60))
FROM DUAL;
3.三角函数
#三角函数
SELECT SIN(RADIANS(30)),DEGREES(ASIN(1)),TAN(RADIANS(45)),DEGREES(ATAN(1))
FROM DUAL;
ATAN2(M,N)函数返回两个参数的反正切值。 与ATAN(X)函数相比,ATAN2(M,N)需要两个参数,例如有两个点point(x1,y1)和point(x2,y2),使用ATAN(X)函数计算反正切值为ATAN((y2-y1)/(x2-x1)),使用ATAN2(M,N)计算反正切值则为ATAN2(y2-y1,x2-x1)。由使用方式可以看出,当x2-x1等于0时,ATAN(X)函数会报错,而ATAN2(M,N)函数则仍然可以计算。
SELECT SIN(RADIANS(30)),DEGREES(ASIN(1)),TAN(RADIANS(45)),DEGREES(ATAN(1)),DEGREES(ATAN2(1,1)) FROM DUAL;
4.指数函数
#指数和对数
SELECT POW(2,5),POWER(2,4),EXP(2)
FROM DUAL;
SELECT LN(EXP(2)),LOG(EXP(2)),LOG10(10),LOG2(4)
FROM DUAL;
5.进制转换
#进制间的转换
#返回10的二进制数
#返回10的十六进制
#返回10的八进制数
#指定我们的10是一个10进制数,将其转换成8进制数
SELECT BIN(10),HEX(10),OCT(10),CONV(10,10,8)
FROM DUAL;
二、字符串函数
#ASCII只会读取第一个字符的asc码值,与后面的字符的asc值无关
#char_length表示的是字符的个数
#length是字节数,在utf8中一个汉所占的字节数是三个
SELECT ASCII('Abcdfsf'),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开始的!
#将helloworld的第二个位置开始的连续三个替换成aaaaa
#将hello中的lol替换成mm,如果没有就是替换失败,不会报错
SELECT INSERT('helloworld',2,3,'aaaaa'),REPLACE('hello','lol','mmm')
FROM DUAL;
SELECT UPPER('HelLo'),LOWER('HelLo')
FROM DUAL;
#取出hello左边的两个字符,取出hello右边的三个字符,全部取出
SELECT LEFT('hello',2),RIGHT('hello',3),RIGHT('hello',13)
FROM DUAL;
# LPAD:实现右对齐效果
# RPAD:实现左对齐效果
#将salary这一列每一行应为10个字符,如果没有到10和就用空格在左边填补,实现右对齐
SELECT employee_id,last_name,LPAD(salary,10,' ')
FROM employees;
#去除左边的空格
SELECT CONCAT('---',LTRIM(' h el lo '),'***'),
#去除首尾的oo
TRIM('oo' FROM 'ooheollo')
FROM DUAL;
#将hello重复四次,
#提供五个空格,
#前面的字符串减去后面的字符串,如果全面的字符串比较大返回1,如果相等返回0,如果后面的字符串大返回-1
SELECT REPEAT('hello',4),LENGTH(SPACE(5)),STRCMP('abc','abe')
FROM DUAL;
#从第二个位置开始的两个字符
#判断第一个字符串在第二个字符串中的位置,没有匹配到就返回0
SELECT SUBSTR('hello',2,2),LOCATE('lll','hello')
FROM DUAL;
#返回第二个位置的字符
#查找mm在后面的字符串列表中首次出现的位置
SELECT ELT(2,'a','b','c','d'),FIELD('mm','gg','jj','mm','dd','mm'),
#查找mm在后面用逗号分隔的一整个字符串中首次出现的位置。
FIND_IN_SET('mm','gg,mm,jj,dd,mm,gg')
FROM DUAL;
#如果姓和名的长度相等就返回null,如果不相等就将first_name的长度返回
SELECT employee_id,NULLIF(LENGTH(first_name),LENGTH(last_name)) "compare"
FROM employees;
三、日期和时间函数
1.获取日期时间的函数
#3.1 获取日期、时间
SELECT CURDATE(),CURRENT_DATE(),CURTIME(),NOW(),SYSDATE(),
UTC_DATE(),UTC_TIME()
FROM DUAL;
SELECT CURDATE(),CURDATE() + 0,CURTIME() + 0,NOW() + 0
FROM DUAL;
2.日期与时间戳的转换
#3.2 日期与时间戳的转换
SELECT UNIX_TIMESTAMP(),UNIX_TIMESTAMP('2021-10-01 12:12:32'),
FROM_UNIXTIME(1635173853),FROM_UNIXTIME(1633061552)
FROM DUAL;
3.获取月份星期、天数的函数
#3.3 获取月份、星期、星期数、天数等函数
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;
4.日期的操作函数
#3.4 日期的操作函数
SELECT EXTRACT(SECOND FROM NOW()),EXTRACT(DAY FROM NOW()),
#HOUR_MINUTE返回的1513代表的是现在测试的时候是15时,13分
#QUARTER是判断是现在的第几个季度。
EXTRACT(HOUR_MINUTE FROM NOW()),EXTRACT(QUARTER FROM '2021-05-12')
FROM DUAL;
5.时间和秒钟的转换函数
#3.5 时间和秒钟转换的函数
SELECT TIME_TO_SEC(CURTIME()),
SEC_TO_TIME(83355)
FROM DUAL;
6.计算日期和时间的函数
#3.6 计算日期和时间的函数
#这里的interval相当于是一个关键字,是确定的
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;
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;
7.日期格式化与解析
#3.7 日期的格式化与解析
# 格式化:日期 ---> 字符串
# 解析: 字符串 ----> 日期
#此时我们谈的是日期的显式格式化和解析
#之前,我们接触过隐式的格式化或解析
SELECT *
FROM employees
WHERE hire_date = '1993-01-13';
#格式化:
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;
四、流程控制函数
SELECT last_name,salary,IF(salary >= 6000,'高工资','低工资') "details"
FROM employees;
#如果不是null的话就用原来的数据,如果是null的话,就为0
SELECT last_name,commission_pct,IF(commission_pct IS NOT NULL,commission_pct,0) "details",
salary * 12 * (1 + IF(commission_pct IS NOT NULL,commission_pct,0)) "annual_sal"
FROM employees;
#4.2 IFNULL(VALUE1,VALUE2):看做是IF(VALUE,VALUE1,VALUE2)的特殊情况
#如果ifnull的第一个参数不是null就输出第一个参数的值,如果第一个参数是null的话,1就输出第二个参数的值
SELECT last_name,commission_pct,IFNULL(commission_pct,0) "details"
FROM employees;
#4.3 CASE WHEN ... THEN ...WHEN ... THEN ... ELSE ... END
# 类似于java的if ... else if ... else if ... else
#注意when语句之间是没有标点的
SELECT last_name,salary,CASE WHEN salary >= 15000 THEN '高薪'
WHEN salary >= 10000 THEN '中薪'
WHEN salary >= 8000 THEN '低薪'
#起别名为details
ELSE '完蛋' END "details",department_id
FROM employees;
#如果有部分区间没有指明,那么在SQL运行的过程中就会赋给它空值
SELECT last_name,salary,CASE WHEN salary >= 15000 THEN '高薪'
WHEN salary >= 10000 THEN '中薪'
WHEN salary >= 8000 THEN '低薪'
END "details"
FROM employees;
#4.4 CASE ... WHEN ... THEN ... WHEN ... THEN ... ELSE ... END
# 类似于java的swich ... case...
/*
练习1
查询部门号为 10,20, 30 的员工信息,
若部门号为 10, 则打印其工资的 1.1 倍,
20 号部门, 则打印其工资的 1.2 倍,
30 号部门,打印其工资的 1.3 倍数,
其他部门,打印其工资的 1.4 倍数
*/
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;
/*
练习2
查询部门号为 10,20, 30 的员工信息,
若部门号为 10, 则打印其工资的 1.1 倍,
20 号部门, 则打印其工资的 1.2 倍,
30 号部门打印其工资的 1.3 倍数
*/
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
END "details"
FROM employees
WHERE department_id IN (10,20,30);
五、加密与解谜函数
#5. 加密与解密的函数
# PASSWORD()在mysql8.0中弃用。
SELECT MD5('mysql'),SHA('mysql'),MD5(MD5('mysql'))
FROM DUAL;
这些加密过程是不可逆的,也就是说生成的暗文是不能被转换为原来的明文的。但是你两次都输入相同的明文,所转换成的暗文是相同的,只需要比较这两个暗文是否相同,就可以判断你密码输入是否正确了。
#ENCODE()\DECODE() 在mysql8.0中弃用。
/*
SELECT ENCODE('zhuyuan','mysql'),DECODE(ENCODE('zhuyuan','mysql'),'mysql')
FROM DUAL;
*/
六、MySQL信息函数
MySQL中内置了一些可以查询MySQL信息的函数,这些函数主要用于帮助数据库开发或运维人员更好地对数据库进行维护工作。
七、其他函数
#7. 其他函数
#如果n的值小于或者等于0,则只保留整数部分
SELECT FORMAT(123.125,2),FORMAT(123.125,0),FORMAT(123.125,-2)
FROM DUAL;
#将16从10进制转换为二进制
#将8888从十进制转换为十六进制
#null转换还是null
SELECT CONV(16, 10, 2), CONV(8888,10,16), CONV(NULL, 10, 2)
FROM DUAL;
#以“192.168.1.100”为例,计算方式为192乘以256的3次方,加上168乘以256的2次方,加上1乘以256,再加上100。
SELECT INET_ATON('192.168.1.100'),INET_NTOA(3232235876)
FROM DUAL;
#BENCHMARK()用于测试表达式的执行效率
SELECT BENCHMARK(100000,MD5('mysql'))
FROM DUAL;
# CONVERT():可以实现字符集的转换
SELECT CHARSET('烛渊'),CHARSET(CONVERT('烛渊' USING 'gbk'))
FROM DUAL;
边栏推荐
- 数据库系统原理与应用教程(064)—— MySQL 练习题:操作题 51-61(八):查询条件的构造、通配符
- UE5第一人称射击游戏蓝图教程
- JMeter Notes 4 | JMeter Interface Introduction
- 【牛客编程题】GO语言入门46题
- Arranger software FL Studio Chinese version installation tutorial and switching language tutorial
- BCryptPasswordEncoder的使用及原理
- Win11如何把d盘空间分给c盘?Win11d盘分盘出来给c盘的方法
- 数据库系统原理与应用教程(068)—— MySQL 练习题:操作题 90-94(十二):DML 语句练习
- 【Cloud Store Announcement】Notice of Help Center Update on July 30
- 知识蒸馏1:基础原理讲解及yolov5项目实战介绍
猜你喜欢
Summary of String Copy, Concatenation, Comparison and Split Functions (1)
Mo Team - Elegant Violence
FP6606CMP5 CPC-16L USB类型-C和PD充电控制器 百盛电子代理商
(17)[系统调用]追踪系统调用(0环)
Prometheus 基本概念
Excel导入和导出
Error EPERM operation not permitted, mkdir ‘Dsoftwarenodejsnode_cache_cacach两种解决办法
js中的基础知识点 —— BOM
分账系统二清解决方案如何助力电商平台合规经营?
如何让 JOIN 跑得更快?
随机推荐
ERROR 2003 (HY000) Can't connect to MySQL server on 'localhost3306' (10061)Solution
[OC学习笔记]属性关键字
超声波探伤仪是做什么用的?
BCryptPasswordEncoder的使用及原理
【AAAI2020】阿里DMR:融合Matching思想的深度排序模型
18.支持向量机(SVM)的介绍
数据库系统原理与应用教程(064)—— MySQL 练习题:操作题 51-61(八):查询条件的构造、通配符
Mongoose module
(17)[系统调用]追踪系统调用(0环)
快使用flyway管理sql脚本吧~
什么是工业射线照相设备?
C陷阱与缺陷 第6章 预处理器 6.1 不能忽视宏定义中的空格
Servo System of Hydraulic Steering Gear Based on Fuzzy PID
WeChat applet picker scroll selector use detailed explanation
Arranger software FL Studio Chinese version installation tutorial and switching language tutorial
SLIM: Sparse Linear Methods (TopN推荐)
Mathematical Principles of Graph Convolutional Neural Networks——A Preliminary Study on Spectral Graph Theory and Fourier Transform
CMake库搜索函数居然不搜索LD_LIBRARY_PATH
基于stm32的shell实现
C陷阱与缺陷 第7章 可移植性缺陷 7.1 应对C语言标准变更