字符函数
LOWER(str):传入的字符串转换为小写
UPPER(str):传入的字符串转换为大写
CANCAT(str1,str2):连接两个字符串
LENGTH(str):计算字符串长度
SUBSTR(str,index,end):截取字符串,返回index到end的子串——下标从1开始包括后面的字符
SELECT SUBSTR('Oracle',1,4) FROM dual;
-- 结果:Orac
LPAD(str,len,char):查询出来的字符串为len位,超过则从第一位开始截取位,不足则在左边补char
SELECT LPAD(last_name,1,'*') FROM employees;
-- 结果位:K
SELECT LPAD(last_name,10,'*') FROM employees;
-- 结果为:******King
RPAD(str,len,char):查询出来的字符串为len位,超过则从第一位开始截取位,不足则在右边补char
TRIM(char from str):去除字符串str中前后的char字符
SELECT TRIM('H' FROM 'HHelloHHHWorldHH') FROM dual;
-- 结果为:elloHHHWorld
REPLACE(str,char1,char2):将字符串str中的char1替换为char2
SELECT replace('HHelloHHHWorldHH','H','A') FROM dual;
-- 结果为:AAelloAAAWorldAA
数字函数
ROUND:保留几位数(约等于)
SELECT round(234.56,2),round(234.56),round(234.56,-2) FROM dual;
-- 结果为:234.56 235 200
TRUNC:截断
SELECT TRUNC(234.56,2),TRUNC(234.56),TRUNC(234.56,-2) FROM dual;
-- 结果为:234.56 234 200
MOD:求余
SELECT MOD(7,2) FROM dual;
-- 结果为:1
日期函数
MONTHS_BETWEEN(date1,date2):两个日期相差的几个月
SELECT last_name, Months_between(SYSDATE,HIRE_DATE) FROM employees;
ADD_MONTHS(date,n):指定日期上加几个月
NEXT_DAY(date,week):下一个星期几的日期
SELECT NEXT_DAY(SYSDATE,'星期六') FROM dual;
LAST_DAY(date):日期的当月的最后一天
SELECT LAST_DAY(SYSDATE) FROM dual;
-- 结果为:2018/12/31 23:29:58
求员工入职日期为当月的倒数第二天的人
SELECT last_name,hire_date FROM employees WHERE hire_date = last_day(hire_date) - 2;
-- 结果:
-- 1 Chen 1997/9/28
-- 2 Mikkilineni 1998/9/28
-- 3 Davies 1997/1/29
-- 4 Zlotkey 2000/1/29
ROUND:约等于
TRUNC:截断
SELECT ROUND(SYSDATE,'month'),ROUND(SYSDATE,'mm'),trunc(SYSDATE),TRUNC(SYSDATE,'hh') FROM dual;
-- 结果:2019/1/1 2019/1/1 2018/12/21 2018/12/21 20:00:00
转换函数
TO_CHAR():转换为字符串
SELECT to_char(12345678.123,'99,999,999.999') FROM dual;
-- 结果为: 12,345,678.123
SELECT to_char(1234567.89,'$9,999,999.99') FROM dual;
-- 结果为: $1,234,567.89
SELECT * FROM employees e WHERE to_char(e.hire_date,'yyyy/mm/dd') = '1987/06/17'
-- 结果为:1 100 Steven King SKING 515.123.4567 1987/6/17 AD_PRES 24000.00 90
TO_DATE():将字符串转换为日期
TO_NUMBER():将字符串转换为数字
SELECT to_number('$1,234,567.89','$9,999,999.99') FROM dual;
-- 结果为:1234567.89
通用函数
NVL(var,default):当var为空时,值为default,否则值为var
SELECT 12*e.salary*(1 + NVL(e.commission_pct,0)) FROM employees e ;
-- 函数中前后值类型需要匹配
SELECT NVL(to_char(department_id),'没有部门') FROM employees;
NVL2(var1,var2,var3):当var1不为null返回var2,若var1为null则返回var3
SELECT NVL2(e.department_id,1,0) FROM employees e;
NULLIF(exp1,exp2):两个值相等返回null,不等返回exp1
IF-THEN-ELSE:
SELECT CONCAT(e.last_name, e.last_name),e.department_id,
CASE e.department_id
WHEN 10 THEN e.salary*(1 + 0.1)
WHEN 20 THEN e.salary*(1 + 0.2)
WHEN 30 THEN e.salary*(1 + 0.3)
ELSE e.salary
END new_salary
FROM employees e
DECODE:
SELECT e.first_name || '_' || e.last_name,e.department_id,
DECODE(e.department_id,10,e.salary*1.1,
20,e.salary*1.2,
e.salary)
FROM employees e;
习题
-- 打印出 "2009年10月14日 9:25:40" 格式的当前系统的日期和时间.
SELECT to_char(SYSDATE,'yyyy"年"mm"月"dd"日" hh:mi:ss ') FROM dual;
-- 格式化数字: 1234567.89 为 1,234,567.89
SELECT to_char(1234567.89,'9,999,999.99') FROM dual;
-- 字符串转为数字时
-- 1). 若字符串中没有特殊字符, 可以进行隐式
SELECT '123.45'+ 100 FROM dual;
-- 结果:223.45
-- 2). 若字符串中有特殊字符, 例如 '1,234,567.89', 则无法进行隐式转换, 需要使用 to_number() 来完成
SELECT to_number('¥1,234,567.89','L9,999,999.99') FROM dual;
-- 结果:1234567.89
-- 对于把日期作为查询条件的查询, 一般都使用 to_date() 把一个字符串转为日期, 这样可以不必关注日期格式
SELECT e.last_name,e.hire_date
FROM employees e
--WHERE to_char(e.hire_date,'yyyy/mm/dd') = '1987/06/17';
WHERE to_date('1987/06/17','yyyy/mm/dd') = e.hire_date;
-- 查询每个月倒数第 2 天入职的员工的信息.
SELECT e.last_name,e.hire_date
FROM employees e
WHERE last_day(e.hire_date) -2 = e.hire_date;
-- 计算公司员工的年薪
SELECT e.last_name,e.salary*(1 + NVL(e.commission_pct,0))*12 year_sal
FROM employees e
-- 1. 显示系统时间(注:日期+时间)
SELECT to_char(SYSDATE,'yyyy/mm/dd hh:mi:ss') FROM dual;
SELECT SYSDATE FROM dual;
-- 2. 查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)
SELECT e.employee_id,e.last_name,e.salary,e.salary*(1 + 0.2)
FROM employees e
-- 3. 将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT e.last_name,Length(e.last_name)
FROM employees e
ORDER BY e.last_name
-- 4. 查询各员工的姓名,并显示出各员工在公司工作的月份数(worked_month)。
SELECT e.last_name,TRUNC(months_between(SYSDATE,e.hire_date))
FROM employees e
-- 5. 查询员工的姓名,以及在公司工作的月份数(worked_month),并按月份数降序排列
SELECT e.last_name,TRUNC(months_between(SYSDATE,e.hire_date)) worked_month
FROM employees e
ORDER BY worked_month DESC
SELECT * FROM employees;
-- 6. 使用decode函数,按照下面的条件:
SELECT e.last_name,
DECODE(
e.job_id,'AD_PRES','A',
'ST_MAN',
'B','IT_PROG',
'C','SA_REP',
'D','ST_CLERK',
'D','Z'
) job_id
FROM employees e
-- 7. 将第6题的查询用case函数再写一遍。
SELECT e.last_name,
CASE e.job_id WHEN 'AD_PRES' THEN 'A'
WHEN 'ST_MAN' THEN 'B'
WHEN 'IT_PROG' THEN 'C'
WHEN 'SA_REP'THEN 'D'
WHEN 'ST_CLERK' THEN 'D'
ELSE 'Z'END job_id
FROM employees e