Oracle-查询-单行函数

字符函数

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

猜你喜欢

转载自blog.csdn.net/qq_36722039/article/details/85145550