目录
1.测试1 :ASCII CHAR_LENGTH LENGTH
🐟EXTRACT(type FROM date)函数中type的取值与含义:
①上述非GET_FORMAT 函数中fmt参数常用的格式符:
②GET_FORMAT函数中date_type和format_type参数取值如下:
一、什么是函数?
函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?
它可以把我们经常使用的代码封装起来, 需要的时候直接调用即可。这样既提高了代码效率 ,又提高了可维护性 。在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数,可以极大地提高用户对数据库的管理效率 。
⚪函数的分类
从函数定义的角度出发,我们可以将函数分成 内置函数 和 自定义函数 。在 SQL 语言中,同样也包括了内置函数和自定义函数。
内置函数是系统内置的通用函数,而自定义函数是我们根据自己的需要编写的
两种SQL函数
⚪单行函数
- 操作数据对象
- 接受参数返回一个结果
- 只对一行进行变换
- 每行返回一个结果
- 可以嵌套
- 参数可以是一列或一个值
二、数值函数
1.基本函数
SELECT ABS(-123),ABS(32),SIGN(43),PI(),CEIL(32.32),CEILING(-32.32),FLOOR(32.32)
FROM DUAL;
SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1)
FROM DUAL;
SELECT
ROUND(12.33),ROUND(12.343,2),ROUND(12.324,-1),TRUNCATE(12.66,1),TRUNCATE(12.66,-1)
FROM DUAL;
单行函数可以嵌套
SELECT TRUNCATE(ROUND(123.456,2),0)
FROM DUAL;
2.角度与弧度互换函数
SELECT RADIANS(30),RADIANS(60),RADIANS(90),
DEGREES(2*PI()),DEGREES(RADIANS(90))
FROM DUAL;
3.三角函数
SELECT SIN(RADIANS(30)),DEGREES(ASIN(1)),TAN(RADIANS(45)),DEGREES(ATAN(1))
FROM DUAL;
4.指数和对数
①指数
SELECT POW(2,5),POW(2,-1),POW(4,-2),EXP(2)
FROM DUAL;
②对数
SELECT LN(EXP(2))
FROM DUAL;
5.进制间的转换
SELECT BIN(10),HEX(10),OCT(10),CONV(10,10,8)
FROM DUAL;
三、字符串函数
注意:MySQL中,字符串的位置是从1开始的。
1.测试1 :ASCII CHAR_LENGTH LENGTH
SELECT ASCII('Abcvbn'),CHAR_LENGTH('HELLO'),CHAR_LENGTH('你好'),LENGTH('HELLO'),LENGTH('你好')
FROM DUAL;
2.测试2:CONCAT CONCAT_WS
SELECT CONCAT(e.last_name,' welcome ',' to ',l.city)
FROM employees e JOIN locations l;
SELECT CONCAT_WS('-','HELLO','WORLD','HELLO','XI\'AN')
FROM DUAL;
3.测试3 :INSERT,REPLACE
#将字符串HELLOWORLD从第2位置开始,3个字符长的子串替换为字符串aaaaa
SELECT INSERT('HELLOWORLD',2,3,'aaaaa')
FROM DUAL;
SELECT REPLACE('hello','ll','mmm')
FROM DUAL;
四、日期和时间函数
1. 获取日期、时间
SELECT CURDATE(),CURRENT_DATE(),CURTIME(),NOW(),SYSDATE(),
UTC_DATE(),UTC_TIME()
FROM DUAL;
2.日期与时间戳的转换
①UNIX_TIMESTAMP()
以UNIX时间戳的形式返回当前时间。
SELECT UNIX_TIMESTAMP()
FROM DUAL;
②UNIX_TIMESTAMP
将时间date以UNIX时间戳的形式返回。
SELECT UNIX_TIMESTAMP('2022-2-22 22:22:22')
FROM DUAL;
③FROM_UNIXTIME
将UNIX时间戳的时间转换为普通格式的时间
SELECT FROM_UNIXTIME(1644726483)
FROM DUAL;
3.获取月份、星期、星期数、天数等函数
SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()),
HOUR(CURTIME()),MINUTE(NOW()),SECOND(SYSDATE())
FROM DUAL;
SELECT MONTHNAME('2022-2-22'),DAYNAME('2022-2-22'),WEEKDAY('2022-2-22'),
QUARTER(CURDATE()),WEEK(CURDATE()),DAYOFYEAR(NOW()),
DAYOFMONTH(NOW()),DAYOFWEEK(NOW())
FROM DUAL;
4.日期的操作函数
🐟EXTRACT(type FROM date)函数中type的取值与含义:
SELECT EXTRACT(SECOND FROM NOW()),EXTRACT(DAY FROM NOW()),
EXTRACT(HOUR_MINUTE FROM NOW()),#1244:12:44
EXTRACT(QUARTER FROM NOW()) #获取季度
FROM DUAL;
5.时间和秒钟转换的函数
SELECT TIME_TO_SEC(CURTIME()),
SEC_TO_TIME(46066)
FROM DUAL;
6. 计算日期和时间的函数
第①组
SELECT NOW(),DATE_ADD(NOW(),INTERVAL 1 YEAR)#在现在时间的基础上增加一年
FROM DUAL;
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY) AS col1,DATE_ADD('2022-2-22 22:22:22',INTERVAL 1 SECOND) AS col2,
ADDDATE('2022-2-22 22:22:22',INTERVAL 1 SECOND) AS col3,
DATE_ADD('2022-2-22 22:22:22',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 DATE_SUB('2022-2-22',INTERVAL 31 DAY) AS col1,
SUBDATE('2022-2-22',INTERVAL 31 DAY) AS col2,
DATE_SUB('2022-2-22 22:22:22',INTERVAL '1 1' DAY_HOUR) AS col3
FROM DUAL;
第②组
SELECT
ADDTIME(NOW(),20),SUBTIME(NOW(),30),
SUBTIME(NOW(),'1:1:3'),
DATEDIFF(NOW(),'2022-2-22'),
TIMEDIFF(NOW(),'2022-2-22 22:22:22'),
FROM_DAYS(366),TO_DAYS('0000-12-25'),
LAST_DAY(NOW()),MAKEDATE(YEAR(NOW()),12),
MAKETIME(10,21,23),
PERIOD_ADD(20200101010101,10)
FROM DUAL;
7.日期的格式化与解析
- 格式化:日期 ————> 字符串
- 解 析:字符串 ————> 日期
此时我们所说的是日期的显式格式化和解析,之前所接触的是日期的隐式格式化或解析
SELECT * FROM employees WHERE hire_date = '1993-01-13';
' '中的写法必须与原日期格式相同才能查询出来,年月日不可颠倒
①上述非GET_FORMAT 函数中fmt参数常用的格式符:
②GET_FORMAT函数中date_type和format_type参数取值如下:
(1)格式化
SELECT
DATE_FORMAT(CURDATE(),'%Y-%M-%D') AS DATE1,
DATE_FORMAT(NOW(),'%Y-%m-%d') AS DATE2,
TIME_FORMAT(CURTIME(),'%H:%i:%S') AS DATE3,
TIME_FORMAT(CURTIME(),'%h:%i:%S') AS DATE4,
DATE_FORMAT(NOW(),'%Y-%M-%D %h:%i:%S %W %w %T %r') AS DATE5
FROM DUAL;
(2)解析 :格式化的逆过程
SELECT STR_TO_DATE('2022-February-13th 03:11:05 Sunday 0 15:11:05',
'%Y-%M-%D %h:%i:%S %W %w') AS RESULT
FROM DUAL;
SELECT GET_FORMAT(DATE, 'USA')
FROM DUAL;
SELECT DATE_FORMAT(CURDATE(),GET_FORMAT(DATE, 'USA'))
FROM DUAL;
五、流程控制函数
流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL语句中实现不同的条件选择。
MySQL中的流程处理函数主要包括IF()、IFNULL()和CASE()函数。
#例1
SELECT last_name,salary,IF(salary > 6000,'高工资','低工资') "details"
FROM employees;
#例2
SELECT employee_id,salary, CASE WHEN salary>=15000 THEN '高薪'
WHEN salary>=10000 THEN '潜力股'
WHEN salary>=8000 THEN '屌丝'
ELSE '草根' END "描述"
FROM employees;
#例3
SELECT oid,`status`, CASE `status` WHEN 1 THEN '未付款'
WHEN 2 THEN '已付款'
WHEN 3 THEN '已发货'
WHEN 4 THEN '确认收货'
ELSE '无效订单' END
FROM t_order;
六、加密与解密函数
加密与解密函数主要用于对数据库中的数据进行加密和解密处理,以防止数据被他人窃取。这些函数在保证数据库安全时非常有用。
🐟可以看到ENCODE(value,password_seed)函数与DECODE(value,password_seed)函数互为反函数。
SELECT PASSWORD('MySQL') #PASSWORD在MySQL 8.0中弃用
FROM DUAL;
SELECT MD5('MySQL'),SHA('MySQL')
FROM DUAL;
注:PASSWORD & SHA 加密是不可逆的
七、 MySQL信息函数
MySQL中内置了一些可以查询MySQL信息的函数,这些函数主要用于帮助数据库开发或运维人员更好地对数据库进行维护工作。
SELECT VERSION(),#版本号
CONNECTION_ID(),#连接ID
DATABASE(),SCHEMA(),USER(),CURRENT_USER(),
CHARSET('中国'),COLLATION('中国')
FROM DUAL;