两种SQL函数:单行函数和多行函数
单行函数:
select lower ('ATGUIGUJAVA'),Upper('AtGuiGu Java'),initcap('AtGuiGu java')
from dual;
-- atguigujava ATGUIGU JAVA Atguigu Java
select concat('hello','world'),substr('helloworld',2,4),length('HELLOWORLD')
from dual;
--helloworld ello 10
select instr('helloworld','l') from dual;
--3
select instr('hellojava','w') from dual;
--0
select employee_id ,last_name,ipad(salary,10,'*'),rpad(salary,10,'')
from employees;
--ipad:把salary输出,长度为10,从右侧开始输出,用*补全
--rpad:把salary输出,长度为10,从左侧开始输出,用空格补全
select trim('h','hhhellohworldh') from dual;
--ellohworld,trim消除的是首尾的h
select replace ('abcdab','b','m') from dual;
--replace()用m代替b,替换所有的b
--amcdam
select round (435.45,2),round(435.45),round(435.45,-2) from dual;
--435.45 435 400
select trunc (435.45,1),trunc(435.45),trunc(435.45,-1) from dual;
--435.4 435 430
select mod(1100,100) from dual;
--0,取余
select mod(1100,300) from dual;
--200
函数 | 描述 |
---|---|
MONTHS_BETWEEN | 两个日期相差的月数 |
ADD_MONTHS | 向指定日期中加上若干月数 |
NEXT_DAY | 指定日期的下一个星期几对应的日期 |
LAST_DAY | 本月的最后一天 |
ROUND | 日期四舍五入 |
TRUNC | 日期截断 |
Oracle中的日期型数据实际含有两个值:日期和时间
select employee_id,last_name,trunc(sysdate-hiredate) worked_days
from employees;
select employee_id,last_name,sysdate-hiredate worked_months
from employees;
select employee_id,last_name,sysdate-hiredate worked_months,months_between(sysdate,hire_date)
from employees;
select add_months(sysdate,2),add_months(sysdate,-3),next_day(sysdate,'星期一')
from dual;
--2020/3/7 13:50:10 2019/10/7 13:50:10 2020/1/13 13:50:10
--来公司的员工中,hire_date是每个月倒数第二天来有哪些?
select last_name,hire_date
from emlpoyees
where hire_date=last_day(hire_date);
select round(syssqlate,'month'),round(sysdate,'mm'),trunc(sysdate,'HH')
from dual;
--2020/1/1 2020/1/1 2020/1/7 14:00:00
--round()过半舍掉,trunc()全部舍去
Oracle自动完成下列转换:
源数据类型 | 目标数据类型 |
---|---|
VARCHAR2 or CHAR | NUMBER |
VARCHAR2 or CHAR | DATE |
NUMBER | VARCHAR2 |
DATE | VARCHAR2 |
select '12'+2 from dual;
--14
select sysdate+2 from dual;
--2020/1/9 14:13:00
select employee_id,to_char(hire_date,'yyyy"年"mm"月"dd"日"')
from employees
--where hire_date='7-6月-94';
--where to_char(hire_date,'yyyy-mm-dd')='1994-06-07';
--where to_date('1994-06-07','yyyy-mm-dd')=hire_date;
--where to_char(hire_date,'yyyy"年"mm"月"dd"日"')='1994年06月07日';
select to_char(1234567.89,'999,999,999.99')
from dual;
-- 1,234,567.89
select to_char(1234567.89,'$000,000,999.99')
from dual;
-- $001,234,567.89
select to_char(1234567.89,'l000,000,999.99')
from dual;
--¥001,234,567.89
select to_number('¥001,234,567.89','l000,000,999.99') +1
from dual;
--1234568.89
这些函数适用于任何数据类型,同时也适用于空值:
将空值转换为一个已知的值:
可以使用的数据类型有日期、字符、数字。
函数的一般形式:
-NVL(commission_pct,0)
-NVL(hire_date,‘01_JAN-97’)
-NVL(job_id,‘No Job Yet’)
--求公司员工的年薪(commission_pct)
select employee_id,last_name,salary*12*(1+nvl(commission_pct,0)) "annual salary"
from employees;
--输出last_name,department_id,当department_id为null时,显示'没有部门'
select last_name,nvl(to_char(department_id,'9999'),'没有部门')
from employees;
NVL2(expr1,expr2,expr3):expr1不为NULL,返回expr2;为NULL,返回expr3。
--查询员工的奖金率,若为空,返回0.01,
--若不为空,返回实际奖金率+0.015
select last_name,commission_pct,NVL2(commission_pct,commission_pct+0.015,0.01)
from employees;
NVLLIF(expr1,expr2):相等返回NULL,不等返回expr1
在SQL语句中使用IF-THEN-ELSE逻辑
使用两种方法:
CASE表达式
-DECODE函数
--查询部门号为10,20,30的员工信息
--若部门号为10,则打印其工资的1.1倍,
--20号部门,则打印其工资的1.2倍,
--30号部门打印其工资的1.3倍。
select employee_id,last_name,case department_id when 10 then salary*1.1
when 20 then salary*1.2
else salary*1.3 end new_sal
from employees
where department_id in (10,20,30);
select employee_id,last_name,department_id,decode(department_id,10,salary*1.1,
20,salary*1.2
salary) new_sal
from employees
where department_id in (10,20,30);