
(以下内容全部来自上述课程)
单行函数
1. 内置函数及分类
- 单行函数
- 聚合函数(或分组函数)
1.1 单行函数特点
- 操作数据对象
- 接受参数返回一个结果
- 只对一行进行变换
- 每行返回一个结果
- 可以嵌套
- 参数可以是一列或一个值
2. 数值函数
2.1 基本函数

sql
#1.数值函数
# 基本的操作
# 绝对值:123 32 正负号:-1 1 3.14... 33 -43 32
SELECT ABS (-123),ABS (32),SIGN (-23),SIGN (43),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32),
# -44 取余:2 2 2
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;
#四舍五入,截断操作
# 124 123 123.5 123.46 120 200
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;
# 123 123.4 120
SELECT TRUNCATE(123.456,0),TRUNCATE(123.496,1),TRUNCATE(129.45,-1)
FROM DUAL;
#单行函数可以嵌套
# 123
SELECT TRUNCATE(ROUND(123.456,2),0)
FROM DUAL;
2.2 角度与弧度的转换

sql
#角度与弧度的互换
SELECT RADIANS(30),RADIANS(45),RADIANS(60),RADIANS(90),
DEGREES(2*PI()),DEGREES(RADIANS(60))
FROM DUAL;
2.3 三角函数

2.4 指数与对数

sql
# 指数与对数
# 32 16 7.389....
select pow(2,5),power(2,4),exp(2)
from dual;
# 2 2 1 2
select ln(exp(2)),log(exp(2)),log10(10),log2(4),
from dual;
2.5 进制间的转换

sql
#进制间的转换
SELECT BIN(10),HEX(10),OCT(10),CONV(10),2,8)
FROM DUAL;
3.字符串函数

sql
# 2.字符串函数
# 65 5 2
SELECT ASCII('Abcdfsf'),CHAR_LENGTH('hello'),CHAR_LENGTH('我们'),
# 5 6
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;
#字符串的索引是从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;
4. 日期和时间函数
4.1 获取日期、时间

4.2 日期与时间戳的转换

4.3 获取月份、星期、星期数、天数等函数

4.4 日期的操作函数
sql
SELECT EXTRACT(MINUTE FROM NOW()),EXTRACT( WEEK FROM NOW()),
EXTRACT( QUARTER FROM NOW()),EXTRACT(MINUTE_SECOND FROM NOW())
FROM DUAL;
4.5 时间和秒钟转换的函数

4.6 计算日期和时间的函数
- 第一组:
sql
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 DATE_SUB('2021-01-21',INTERVAL 31 DAY) AS col1,
SUBDATE('2021-01-21',INTERVAL 31 DAY) AS col2,
DATE_SUB('2021-01-2102:01:01',INTERVAL '1 1'DAY_HOUR) AS col3
FROM DUAL;
- 第二组:
sql
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()),12),MAKETIME(10,21,23),PERIOD_ADD(20200101010101,10)
FROM DUAL;
4.7 日期的格式化与解析
sql
#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-0ctober-25th 11:34:42 Monday 1 23:34:42','%Y-%M-%D %h:%i:%S %W %w %T')
FROM DUAL;

5. 控制流程函数

sql
#4.流程控制函数
#IF (VALUE,VALUE1,VALUE2)
SELECT last_name, salary,IF(salary >= 6000,'高工资','低工资')"details"
FROM employees;
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)的特殊情况
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
SELECT last name,salary,CASE
WHEN salary>= 15000 THEN'白骨精'
WHEN salary >= 10000 THEN'潜力股'
WHEN salary >= 8000 THEN'小屌丝'
ELSE '草根' END "details",department id
FROM employees;