SQL的函数分为:
单行函数:每行返回一个结果。
多行函数:每个处理集合返回一个结果。
字符函数
UPPER: 转换字符串到大写。
SELECT UPPER('Hello World')
FROM dual; --返回HELLO WORLD
LOWER: 转换字符串到小写。
SELECT LOWER('HELLO WORLD')
FROM dual; --hello world
INITCAP: 首字母大写
SELECT INITCAP('hello world')
FROM dual; --Hello World
进行姓名匹配的时候,可是将判断的两边都转换为小写。
SELECT first_name ||'.' || last_name AS 姓名, salary AS 工资, department_id AS 部门
FROM employees
WHERE LOWER(last_name) = LOWER('&emp_name');
CONCAT(str1, str2): 连接两个字符串。
SELECT CONCAT(first_name, last_name) AS 姓名
FROM employees
WHERE LOWER(last_name) = 'higgins'; --姓名字段: ShelleyHiggins
SUBSTR(str,开始位置,截取长度): 从字符串的开始位置,截取长度为n的字符。
SELECT SUBSTR('Hello, World', 1, 5) FROM dual; --Hello
LENGTH(str) : 获取字符串的长度
SELECT LENGTH('HELLO, WORLD') FROM dual; --12
INSTR(str1, str2): 获取str2在str1的开始位置,计数从1开始。
SELECT INSTR('HELLOWORLD', 'WOR') FROM dual; --6
LPAD(str, 长度, 补位内容):将字符串从左侧补位到指定长度。
RPAD(str, 长度, 补位内容):将字符串从右侧补位到指定长度。
SELECT LPAD(salary, 8,'#')
FROM employees WHERE salary > 9000 ORDER BY salary ;
单行函数可以嵌套任意层,执行顺序从最里层到最外层。
SELECT last_name, CONCAT(UPPER(SUBSTR(last_name, 1,8)),'_US')
FROM employees WHERE salary > 9000 ORDER BY salary ;
SUBSTR -> UPPER -> CONCAT的顺序执行。
数字函数
ROUND(NUM, 保留位数):将结果四舍五入到保留的位数。
SELECT ROUND(16.239,2) FROM dual; -- 16.24
TRUNC(NUM, 保留位数):将结果截取到保留的位数,不进行四舍五入。
SELECT TRUNC(16.239,2) FROM dual; -- 16.23
CEIL(NUM):返回大于等于指定数字的最小整数。
SELECT CEIL(16.239) FROM dual; --17
FLOOR(NUM):返回小于等于指定数字的最大整数。
SELECT CEIL(16.239) FROM dual; --16
MOD(被除数,除数):取余数,也就是取模操作。
SELECT MOD(5,2) FROM dual; --1
关于RR日期格式
系统中对于字段中日期的默认显示方式是采用RR日期格式。
可以更改字段的日期显示方式。
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SELECT sysdate FROM dual; --2021-05-02 17:15:41
SELECT TO_DATE('05-MAY-21','DD-MM-RR') FROM dual; TO_DATE('05-MAY-21' ------------------- 2021-05-05 00:00:00 SQL> SELECT TO_DATE('05-MAY-51','DD-MM-RR') FROM dual; TO_DATE('05-MAY-51' ------------------- 1951-05-05 00:00:00
可以通过TO_DATE(‘2021-5-1’, ‘YYYY-MM-DD’) 来将字符串数据转换为日期类型数据。
SELECT SESSIONTIMEZONE, CURRENT_DATE, CURRENT_TIMESTAMP FROM dual;
SESSIONTIMEZONE:返回当前时区。Asia/Shanghai
CURRENT_DATE:返回当前日期和时间。02-5月 -21
CURRENT_TIMESTAMP:返回当前时间戳。 02-5月 -21 05.25.09.931610000 下午 ASIA/SHANGHAI
日期函数
MONTHS_BETWEEN(DATE1, DATE2) :获取两个日期之间的月份差
SELECT CEIL(MONTHS_BETWEEN(sysdate, hire_date))
FROM employees ORDER BY 1;
ADD_MONTHS(DATE, n) : 在日期上增加n个月。
SELECT ADD_MONTHS(sysdate,7) FROM dual; --02-12月-21
NEXT_DAY(日期, 星期几): 查找下一个星期几对应的日期。
SELECT NEXT_DAY(sysdate, '星期五') FROM dual; --07-5月-21
LAST_DAY(日期) : 查找当月最后一天日期
SELECT LAST_DAY(sysdate) FROM dual; --2021-05-31 18:50:44 (当前日期2021-5-2)
ROUND(日期, 'MONTH') : 1~15日的日期,返回本月一日。16~31的日期,返回下个月一日。
ROUND(日期, 'YEAR') : 1.1~6.30的日期,返回当年1.1日。7.1~12.31的日期,返回下年的1.1日。
SELECT ROUND(TO_DATE('2021-7-1','YYYY-MM-DD'),'YEAR') FROM dual; ROUND(TO_DATE('2021 ------------------- 2022-01-01 00:00:00 SQL> SELECT ROUND(TO_DATE('2021-5-15','YYYY-MM-DD'),'MONTH') FROM dual; ROUND(TO_DATE('2021 ------------------- 2021-05-01 00:00:00
TRUNC(日期, 'MONTH') : 返回当个月的第一天日期,相对于ROUND,TRUNC不进行四舍五入。
TRUNC(日期, 'YEAR') : 返回年的第一天日期,相对于ROUND,TRUNC不进行四舍五入。
SELECT TRUNC(TO_DATE('2021-5-31','YYYY-MM-DD'),'MONTH') FROM dual; TRUNC(TO_DATE('2021 ------------------- 2021-05-01 00:00:00 SQL> SELECT TRUNC(TO_DATE('2021-12-31','YYYY-MM-DD'),'YEAR') FROM dual; TRUNC(TO_DATE('2021 ------------------- 2021-01-01 00:00:00
日期的计算
从日期添加或者减去一个数字,得到结果的日期值。
SELECT sysdate+2 FROM dual; --当前2021.5.2, 加2后得到04-5月 -21。
日期之间相减,得到之间相差的天数。
SELECT CEIL((sysdate - hire_date)/7) AS 入职周数 FROM employees;
SELECT TO_DATE('2021-05-01','YYYY-MM-DD') - TO_DATE('2021-04-30','YYYY-MM-DD') AS 日期差异 FROM dual; 日期差异 ---------- 1