/*

Oracle——基本SQL(1)

第 2 章 过滤和排序数据

  1. WHERE 子句紧随 FROM 子句

  2. 查询 last_name 为 'King' 的员工信息

    错误1: King 没有加上 单引号

    select first_name, last_name
    from employees
    where last_name = King
    

    错误2: 在单引号中的值区分大小写

    select first_name, last_name
    from employees
    where last_name = 'king'
    

    正确

    select first_name, last_name
    from employees
    where last_name = 'King'
    
  3. 查询 1998-4-24 来公司的员工有哪些?

    注意: 日期必须要放在单引号中, 且必须是指定的格式

    select last_name, hire_date
    from employees
    where hire_date = '24-4月-1998'
    
  4. 查询工资在 5000 -- 10000 之间的员工信息.

    1). 使用 AND

    select *
    from employees
    where salary >= 5000 and salary <= 10000
    

    2). 使用 BETWEEN .. AND .., 注意: 包含边界!!

    select *
    from employees
    where salary between 5000 and 10000
    
  5. 查询工资等于 6000, 7000, 8000, 9000, 10000 的员工信息

    1). 使用 OR

    select *
    from employees
    where salary = 6000 or salary = 7000 or salary = 8000 or salary = 9000 or salary = 10000
    

    2). 使用 IN

    select *
    from employees
    where salary in (6000, 7000, 8000, 9000, 10000)
    
  6. 查询 LAST_NAME 中有 'o' 字符的所有员工信息.

    select *
    from employees
    where last_name like '%o%'
    
  7. 查询 LAST_NAME 中第二个字符是 'o' 的所有员工信息.

    select *
    from employees
    where last_name like '_o%'
    
  8. 查询 LAST_NAME 中含有 '_' 字符的所有员工信息

    1). 准备工作:

    update employees
    set last_name = 'Jones_Tom'
    where employee_id = 195
    

    2). 使用 escape 说明转义字符.

    select *
    from employees
    where last_name like '%\_%' escape '\'
    
  9. 查询 COMMISSION_PCT 字段为空的所有员工信息

    select last_name, commission_pct
    from employees
    where commission_pct is null
    
  10. 查询 COMMISSION_PCT 字段不为空的所有员工信息

    select last_name, commission_pct
        from employees
    where commission_pct is not null
    
  11. ORDER BY:
    1). 若查询中有表达式运算, 一般使用别名排序
    2). 按多个列排序: 先按第一列排序, 若第一列中有相同的, 再按第二列排序.
    格式: ORDER BY 一级排序列 ASC/DESC,二级排序列 ASC/DESC;


第 3 章 单行函数

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

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

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

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

    select to_char(1234567.89, '999,999,999.99')
    from dual
    
  3. 字符串转为数字时

    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
    
    
  4. 对于把日期作为查询条件的查询, 一般都使用 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()

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

    select last_name, hire_date
    from employees
    where hire_date = last_day(hire_date) - 1
    
  2. 计算公司员工的年薪

    --错误写法: 因为空值计算的结果还是空值
    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)
	


补充



通用函数

这些函数适用于任何数据类型,同时也适用于空值:

NVL (expr1, expr2)
NVL2 (expr1, expr2, expr3)
NULLIF (expr1, expr2)
COALESCE (expr1, expr2, ..., exprn)

NVL 函数

将空值转换成一个已知的值:
可以使用的数据类型有日期、字符、数字。
函数的一般形式:
NVL(commission_pct,0)
NVL(hire_date,'01-JAN-97')
NVL(job_id,'No Job Yet')

练习1:求公司员工的年薪(含commission_pct)

--求公司员工的年薪(含commission_pct)
select employee_id, last_name, salary*12*(1+nvl(commission_pct,0)) "annual_salary"
from employees
        201 Hartstein                        156000
        202 Fay                               72000
        203 Mavris                            78000
EMPLOYEE_ID LAST_NAME                 annual_salary
----------- ------------------------- -------------
        204 Baer                             120000
        205 Higgins                          144000
        206 Gietz                             99600
107 rows selected

练习2:输出last_name,department_id,当department_id为null时,显示‘没有部门’。

--输出last_name,department_id,当department_id为null时,显示‘没有部门’
select last_name,nvl(to_char(department_id, '99999'), '没有部门') 
from employees
Livingston                    80
Grant                     没有部门
Johnson                       80
Taylor                        50
Fleaur                        50
Sullivan                      50
LAST_NAME                 NVL(TO_CHAR(DEPARTMENT_ID,'999
------------------------- ------------------------------
Geoni                         50

NVL2 函数

NVL2 (expr1, expr2, expr3) : expr1不为NULL,返回expr2;为NULL,返回expr3。

练习:查询员工的奖金率,若为空,返回0.01,

若不为空,返回实际奖金率+0.015

--练习:查询员工的奖金率,若为空,返回0.01,
--若不为空,返回实际奖金率+0.015
select last_name, commission_pct, nvl2(commission_pct, commission_pct + 0.015, 0.01)
from employees	
Taylor                              0.20                          0.215
Livingston                          0.20                          0.215
Grant                               0.15                          0.165
Johnson                             0.10                          0.115
Taylor                                                             0.01
Fleaur                                                             0.01
Sullivan                                                           0.01
LAST_NAME                 COMMISSION_PCT NVL2(COMMISSION_PCT,COMMISSION
------------------------- -------------- ------------------------------

条件表达式

在 SQL 语句中使用IF-THEN-ELSE 逻辑
使用两种方法:
CASE 表达式
DECODE 函数

CASE 表达式

在需要使用 IF-THEN-ELSE 逻辑时:

CASE expr WHEN comparison_expr1 THEN return_expr1
         [WHEN comparison_expr2 THEN return_expr2
          WHEN comparison_exprn THEN return_exprn
          ELSE else_expr]
END

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

--查询部门号为 10, 20, 30 的员工信息, 
--若部门号为 10, 则打印其工资的 1.1 倍, 
--20 号部门, 则打印其工资的 1.2 倍, 
--30 号部门打印其工资的 1.3 倍数
select employee_id,last_name,first_name,department_id,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)
SQL> /
EMPLOYEE_ID LAST_NAME                 FIRST_NAME           DEPARTMENT_ID    NEW_SAL
----------- ------------------------- -------------------- ------------- ----------
        114 Raphaely                  Den                             30      14300
        115 Khoo                      Alexander                       30       4030
        116 Baida                     Shelli                          30       3770
        117 Tobias                    Sigal                           30       3640
        118 Himuro                    Guy                             30       3380
        119 Colmenares                Karen                           30       3250
        200 Whalen                    Jennifer                        10       4840
        201 Hartstein                 Michael                         20      15600
        202 Fay                       Pat                             20       7200
9 rows selected

DECODE 函数

在需要使用 IF-THEN-ELSE 逻辑时:

DECODE(col|expression, search1, result1 ,
      			   [, search2, result2,...,]
      			   [, default])
--查询部门号为 10, 20, 30 的员工信息, 
--若部门号为 10, 则打印其工资的 1.1 倍, 
--20 号部门, 则打印其工资的 1.2 倍, 
--30 号部门打印其工资的 1.3 倍数
select employee_id,last_name,first_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) 
posted @ 2020-04-23 21:18  Enthusiast  阅读(271)  评论(0编辑  收藏  举报