三、通用函数:

 

 

nvl函数转换mysql sql nvl函数_nvl函数转换mysql

1、NVL函数:

nvl函数转换mysql sql nvl函数_nvl函数转换mysql_02

 

凡是空值参与运算的结果都为空。

(1)、nvl(a,b):如果a为空值,则用b来代替a;反之,输出a。

select employee_id,last_name,salary*12*(1+nvl(commission_pct,0)) "annual sal"

from employees

 

(2)、输出last_name、department_id,当department_id为null时,显示“没有部门“。

select last_name,nvl(to_char(department_id,'99999'),'没有部门')

from employees

/*       将部门number类型改为char类型的,就可以和没有部门这个char类型的对应了      */

 

2、NVL2函数:

nvl函数转换mysql sql nvl函数_nvl函数转换mysql_03

 

 

(1)、查询员工的奖金率,若为空,返回0.01;若不为空,返回实际奖金率+0.015.

select last_name,commission_pct,nvl2(commission_pct,commission_pct+0.015,0.01)

from employees

 

3、NULLIF函数:

 

nvl函数转换mysql sql nvl函数_隐式转换_04

 

4、COALESCE函数:

 

nvl函数转换mysql sql nvl函数_IT_05

 

四、条件表达式:

nvl函数转换mysql sql nvl函数_字符串_06

 

1、CASE表达式:

 

nvl函数转换mysql sql nvl函数_字符串_07

 

(1)、题目要求:“case … when … then …“

nvl函数转换mysql sql nvl函数_IT_08

解答:在where条件下的

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

else部分实现的是30号工资用1.3倍,结束后并且为department_id声明一个别名                                          

from employees

where department_id in (10,20,30)

结果:

EMPLOYEE_ID LAST_NAME                    NEW_SAL

----------- ------------------------- ----------

        114 Raphaely                       14300

        115 Khoo                            4030

        116 Baida                           3770

        117 Tobias                          3640

        118 Himuro                          3380

        119 Colmenares                      3250

        200 Wha_len                         4840

        201 Hartstein                      15600

        202 Fay                             7200

 

9 rows selected

 

2、DECODE函数(可类比CASE表达式):

nvl函数转换mysql sql nvl函数_nvl函数转换mysql_09

 

nvl函数转换mysql sql nvl函数_字符串_10

 

(1)、题目要求同CASE表达式的题目:

select employee_id,last_name,department_id,

decode(department_id ,10 , salary*1.1,        //如果部门是10号,工资增长百分之10

                           20 , salary*1.2,    //如果部门是20号,工资增长百分之20

                           salary)  new_sal (别名) //如果部门是30,工资不增长                                                      

from employees

where department_id in (10,20,30)        //条件是部门号为10或20或30

 

结果:

EMPLOYEE_ID LAST_NAME                    DEPARTMENT_ID  NEW_SAL

----------- ------------------------- ------------- ----------

        114   Raphaely                             30      11000

        115   Khoo                                 30       3100

        116   Baida                                30       2900

        117   Tobias                               30       2800

        118   Himuro                               30       2600

        119   Colmenares                           30       2500

        200   Wha_len                              10       4840

        201   Hartstein                            20      15600

        202   Fay                                  20       7200

 

9 rows selected

 

nvl函数转换mysql sql nvl函数_字符串_11

 

五、测验题一:

 

18. 打印出 "2009年10月14日 9:25:40" 格式的当前系统的日期和时间.

select to_char(sysdate, 'YYYY"年"MM"月"DD"日" HH:MI:SS')
    from dual

    注意: 使用双引号向日期中添加字符

 

19. 格式化数字: 1234567.89 为 1,234,567.89

select to_char(1234567.89, '999,999,999.99')
    from dual

 

20. 字符串转为数字时

    1). 若字符串中没有特殊字符, 可以进行隐式转换:

select '1234567.89' + 100
    from dual


 2). 若字符串中有特殊字符, 例如 '1,234,567.89', 则无法进行隐式转换, 需要使用 to_number() 来完成

select to_number('1,234,567.89', '999,999,999.99') + 100
    from dual

 

21. 对于把日期作为查询条件的查询, 一般都使用 to_date() 把一个字符串转为日期, 这样可以不必关注日期格式

select last_name, hire_date
    from employees
    where hire_date = to_date('1998-5-23', 'yyyy-mm-dd')
--    where to_char(hire_date,'yyyy-mm-dd') = '1998-5-23'

 

22. 转换函数:

to_char(), to_number(), to_date()

 

23. 查询每个月倒数第 2 天入职的员工的信息. 

select last_name, hire_date
    from employees
    where hire_date = last_day(hire_date) - 1

 

24. 计算公司员工的年薪

 

    --错误写法: 因为空值计算的结果还是空值

select last_name, salary * 12 * (1 + commission_pct) year_sal
    from employees


   --正确写法

select last_name, salary * 12 * (1 + nvl(commission_pct, 0)) year_sal
    from employees

 

25. 查询部门号为 10, 20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数

 

    --使用 case-when-then-else-end

select last_name, department_id, salary, case department_id when 10  then salary * 1.1
                                                                    when 20  then salary * 1.2
                                                                    when 30  then salary * 1.3
                                                 end new_sal
    from employees
    where department_id in (10, 20, 30)


 --使用 decode

select last_name, department_id, salary, decode(department_id, 10, salary * 1.1,
                                                                      20, salary * 1.2,
                                                                       30, salary * 1.3
                                                 ) new_sal
        from employees
        where department_id in (10, 20, 30)

 

六、测验题二:

 

1、显示系统时间(注:日期+时间)

select to_char(sysdate,'yyyy-mm-dd hh:mi:ss')
from dual

 

2、查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)

select employee_id,last_name,salary,salary*1.2 "new salary"
from employees

 

3、将员工的姓名按首字母排序,并写出姓名的长度(length)

select last_name,length(last_name)
from employees
order by last_name asc

 

4、查询各员工的姓名,并显示出各员工在公司工作的月份数(worked_month)。

select last_name,hire_date,round(months_between(sysdate,hire_date),1) workded_month   //保留一位小数。
from employees

 

5、查询员工的姓名,以及在公司工作的月份数(worked_month),并按月份数降序排列

Select last_name,hire_date,round(months_between(sysdate,hire_date),1) workded_month
from employees
order by workded_month desc

 

6、做一个查询,产生下面的结果

<last_name> earns <salary> monthly but wants <salary*3>

Dream Salary

King earns $24000 monthly but wants $72000

select last_name || ' earns '|| to_char(salary,'$999999')||' monthly,but wants '||to_char(3*salary,'$999999') "Dream Salary"
from employees

 

 7、使用decode函数,按照下面的条件:

job                  grade

AD_PRES            A

ST_MAN             B

IT_PROG             C

SA_REP              D

ST_CLERK           E

产生下面的结果

Last_name

Job_id

Grade

king

AD_PRES

A

select last_name "Last_name",job_id "Job_id",decode(job_id, 'AD_PRES','A',
'ST_MAN','B', 
'IT_PROG','C', 
'SA_REP','D', 
'ST_CLERK','E') "Grade"
from employees

 

8、将第7题的查询用case函数再写一遍。

select last_name "Last_name",job_id "Job_id",case 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'E' end  "Grade"
from employees