zoukankan      html  css  js  c++  java
  • oracle—decode、nvl、rownum、like、all、any使用

    一、decode()——多值判断

    语法:decode(表达式,比较值1,结果值1,比较值1,结果值1,...,默认值)

    SQL> select employee_name,decode(sign(instr(employee_position,'工程师')),1,'技术部','行政部') partment from employees;
     
    EMPLOYEE_NAME PARTMENT
    ------------- --------
    江小白        行政部
                  行政部
    大鳄          技术部
    昂呜          技术部
    李四          技术部
    张三          行政部
    过户          技术部
    问题          技术部
    语句          技术部
    陈武          技术部
    六六          技术部
     
    11 rows selected
    View Code

    二、nvl()——空值判断

    语法:nvl(表达式,新值/表达式)

    SQL> select employee_name,employee_position,nvl(employee_position,'行政部') new from employees;
     
    EMPLOYEE_NAME EMPLOYEE_POSITION NEW
    ------------- ----------------- ----------
    江小白                          行政部
    大鳄          工程师            工程师
    昂呜          高级工程师        高级工程师
    李四          高级工程师        高级工程师
    张三          开发经理          开发经理
    过户          工程师            工程师
    问题          工程师            工程师
    语句          测试工程师        测试工程师
    陈武          测试工程师        测试工程师
    六六          测试工程师        测试工程师
     
    10 rows selected
    View Code

    三、rownum()——结果集行号

    1.增加rownum一列

    SQL> select employee_id,employee_name,rownum new from employees;
     
    EMPLOYEE_ID EMPLOYEE_NAME        NEW
    ----------- ------------- ----------
    10          江小白                 1
    4           大鳄                   2
    3           昂呜                   3
    2           李四                   4
    1           张三                   5
    5           过户                   6
    6           问题                   7
    7           语句                   8
    8           陈武                   9
    9           六六                  10
     
    10 rows selected
    View Code

    2.rownum与order by

    需求:按照id排序并取出前3位。

    SQL> select employee_id,employee_name,rownum new from employees where rownum <=3 order by employee_id;
     
    EMPLOYEE_ID EMPLOYEE_NAME        NEW
    ----------- ------------- ----------
    10          江小白                 1
    3           昂呜                   3
    4           大鳄                   2
     
    SQL> select employee_id,employee_name,rownum new from(select *  from employees  order by employee_id) where rownum<=3 ;
     
    EMPLOYEE_ID EMPLOYEE_NAME        NEW
    ----------- ------------- ----------
    1           张三                   1
    10          江小白                 2
    2           李四                   3
    
    SQL> select employee_id,employee_name,rownum new from(select *  from employees  order by cast(employee_id as number)) where rownum<=3 ;
     
    EMPLOYEE_ID EMPLOYEE_NAME        NEW
    ----------- ------------- ----------
    1           张三                   1
    2           李四                   2
    3           昂呜                   3
    View Code

    备注:where的过滤条件优先于order by 条件;id的类型为varchar,所以排序是10排在2前面,利用cast将字符转换为数值型后,排序正常。

    3.rownum与“=”

    能获取到rownum=1的数据,获取不到rownum=4的数据。

    SQL> select * from employees where rownum=1;
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
    10          江小白                                                            
     
    SQL> select * from employees where rownum=4;
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
    View Code

    4.rownum与“>”

    rownum>1时没有数据,rownum>0时查询全部数据。

    SQL> select * from employees where rownum>1;
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
     
    SQL> select * from employees where rownum>0;
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
    10          江小白                                                            
    4           大鳄          工程师                      26 巴南                 1988-07-01
    3           昂呜          高级工程师                  27 渝北                 1998-06-01
    2           李四          高级工程师                  32 渝北                 1994-09-01
    1           张三          开发经理                    37 巴南                 1987-11-01
    5           过户          工程师                      26 渝中                 1985-08-01
    6           问题          工程师                      25 渝中                 1980-02-09
    7           语句          测试工程师                  24 九龙坡               2010-05-03
    8           陈武          测试工程师                  25 江北                 2004-01-23
    9           六六          测试工程师                  32 南岸                 1994-12-21
     
    10 rows selected
    View Code

    四、like——模糊匹配

    1."%"——匹配

    需求:查询以“工程师”结尾的数据

    SQL> select * from employees where employee_position like '%工程师';
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
    4           大鳄          工程师                      26 巴南                 1988-07-01
    3           昂呜          高级工程师                  27 渝北                 1998-06-01
    2           李四          高级工程师                  32 渝北                 1994-09-01
    5           过户          工程师                      26 渝中                 1985-08-01
    6           问题          工程师                      25 渝中                 1980-02-09
    7           语句          测试工程师                  24 九龙坡               2010-05-03
    8           陈武          测试工程师                  25 江北                 2004-01-23
    9           六六          测试工程师                  32 南岸                 1994-12-21
     
    8 rows selected
    View Code

    2."_"——匹配一个字符

    需求:查询以“XX工程师”的数据

    SQL> select * from employees where employee_position like '__工程师';
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
    3           昂呜          高级工程师                  27 渝北                 1998-06-01
    2           李四          高级工程师                  32 渝北                 1994-09-01
    7           语句          测试工程师                  24 九龙坡               2010-05-03
    8           陈武          测试工程师                  25 江北                 2004-01-23
    9           六六          测试工程师                  32 南岸                 1994-12-21
    View Code

    3.元义字符

    需求:判断以%号结尾

    SQL> select 1 result from dual where '10%' like '%%';
     
        RESULT
    ----------
             1
     
    SQL> select 1 result from dual where '10' like '%%';
     
        RESULT
    ----------
             1
     
    SQL> select 1 result from dual where '10' like '%\%' escape '';
     
        RESULT
    ----------
     
    SQL> select 1 result from dual where '10%' like '%\%' escape '';
     
        RESULT
    ----------
             1
    View Code

    五、all、some、any——集合判断

     需求:查询大于所有工程师年龄的员工信息。

    SQL> select * from employees where employee_age>all(select employee_age from employees where employee_position='工程师');
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
    3           昂呜          高级工程师                  27 渝北                 1998-06-01
    2           李四          高级工程师                  32 渝北                 1994-09-01
    9           六六          测试工程师                  32 南岸                 1994-12-21
    1           张三          开发经理                    37 巴南                 1987-11-01
     
    SQL> select * from employees where employee_age> (select max(employee_age) from employees where employee_position='工程师');
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
    3           昂呜          高级工程师                  27 渝北                 1998-06-01
    2           李四          高级工程师                  32 渝北                 1994-09-01
    1           张三          开发经理                    37 巴南                 1987-11-01
    9           六六          测试工程师                  32 南岸                 1994-12-21
     
    View Code

    需求:查询大于任意一位工程师年龄的员工信息。

    SQL> select * from employees where employee_age>any(select employee_age from employees where employee_position='工程师');
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
    1           张三          开发经理                    37 巴南                 1987-11-01
    2           李四          高级工程师                  32 渝北                 1994-09-01
    9           六六          测试工程师                  32 南岸                 1994-12-21
    3           昂呜          高级工程师                  27 渝北                 1998-06-01
    5           过户          工程师                      26 渝中                 1985-08-01
    4           大鳄          工程师                      26 巴南                 1988-07-01
     
    6 rows selected
     
    SQL> select * from employees where employee_age> (select min(employee_age) from employees where employee_position='工程师');
     
    EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
    ----------- ------------- ----------------- ------------ -------------------- --------------
    4           大鳄          工程师                      26 巴南                 1988-07-01
    3           昂呜          高级工程师                  27 渝北                 1998-06-01
    2           李四          高级工程师                  32 渝北                 1994-09-01
    1           张三          开发经理                    37 巴南                 1987-11-01
    5           过户          工程师                      26 渝中                 1985-08-01
    9           六六          测试工程师                  32 南岸                 1994-12-21
     
    6 rows selected
    View Code

     整理于《oracle入门很简单》一书

  • 相关阅读:
    vue 同时使用过渡和动画
    ie和火狐事件addEventListener()及attachEvent()区别分析
    闭包的理解
    实现Date函数属性中的format方法
    js读取cookie信息
    js解决千分符问题
    js脚本语言在页面上不执行
    split使用和特殊使用(包括截取第一个字符后的数据)
    js中请求数据的$post和$ajax区别(同步和异步问题)
    禁止页面拖拽事件(数据什么的)
  • 原文地址:https://www.cnblogs.com/zs-chenkang/p/13930722.html
Copyright © 2011-2022 走看看