Oracle查询优化-02给查询结果排序

简介: Oracle查询优化-02给查询结果排序

2.1以指定的次序返回查询结果


问题


显示部门10中的员工姓名、职位、工资,并且按照工资升序排列,结果集如下:

SQL> select  a.ename,a.job ,a.sal from emp  a where a.deptno=10;
ENAME JOB         SAL
---------- --------- ---------
CLARK MANAGER   2450.00
KING  PRESIDENT   5000.00
MILLER CLERK   1300.00


解决方案

使用order by 子句

SQL>  select  a.ename,a.job ,a.sal from emp  a where a.deptno=10 order by a.sal asc ;
ENAME JOB         SAL
---------- --------- ---------
MILLER CLERK   1300.00
CLARK MANAGER   2450.00
KING  PRESIDENT   5000.00


总结

  1. 使用order by子句可以对结果集进行排序。 默认情况下 升序排列,因此asc是可选的, 降序排列使用desc.
  2. . 不一定要指定排序所基于的列名,也可以给出这列的编号, 编号从1开始。
SQL>  select  a.ename,a.job ,a.sal from emp  a where a.deptno=10 order by  3 ;
ENAME JOB         SAL
---------- --------- ---------
MILLER CLERK   1300.00
CLARK MANAGER   2450.00
KING  PRESIDENT   5000.00


  1. 用数字来代替列位置只能用于order by 子句中,其他地方都不能用。

2.2按多个字段排序


问题

在emp表中,首先按照deptno升序排列,然后按照工资降序排列

解决方案

order by子句中列出不同的排序列,使用逗号分隔

SQL> select  a.deptno,a.sal from emp  a   order by a.deptno ,a.sal desc ;
DEPTNO       SAL
------ ---------
    10   5000.00
    10   2450.00
    10   1300.00
    20   3000.00
    20   3000.00
    20   2975.00
    20   1100.00
    20    800.00
    30   2850.00
    30   1600.00
    30   1500.00
    30   1250.00
    30   1250.00
    30    950.00
14 rows selected
SQL> 

总结


多列排序时,若前面的列有重复值,后面的排序才有用,相当于是通过前面的列把数据分成了几组,然后每组的数据再按照后面的列进行排序。

在order by中,优先顺序是从左到右。 如果在select列表中使用的数字位置排序,那么这个数值不能大于select列表中项目的数目。

一般情况下都可以按照select列表中没有的列来排序,但必须显示的给出排序的列名。

如果在查询中使用group by 或者distinct,则不能按照select列中


2.3按子串排序


问题

按照字符串的某一部分对查询结果进行排序。

比如从emp中返回员工的名字和职位,并且按照职位字段的最后两个字符排序。


解决方案

在order by 子句中使用substr函数

SQL> select a.ename, a.job from emp a order by substr ( job, -2);
SQL> select a.ename, a.job from emp a order by substr ( job, length(job)-1);
SQL> select a.ename, a.job from emp a order by substr ( job, length(job)-1);
ENAME JOB
---------- ---------
ALLEN SALESMAN
MARTIN SALESMAN
WARD SALESMAN
TURNER SALESMAN
BLAKE MANAGER
JONES MANAGER
CLARK MANAGER
KING  PRESIDENT
SMITH CLERK
ADAMS CLERK
JAMES CLERK
MILLER CLERK
SCOTT ANALYST
FORD ANALYST
14 rows selected
SQL> 


总结

使用dbms的子串字符,可以很容易的按照字符串的一部分来排序。


2.4 TRANSLATE

语法

TRANSLATE(string,from_str,to_str)


工具


返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。

TRANSLATE 是 REPLACE 所提供的功能的一个超集。如果 from_str 比 to_str 长,那么在 from_str 中而不在 to_str 中的额外字符将从 string 中被删除,因为它们没有相应的替换字符。to_str 不能为空。

Oracle 将空字符串解释为 NULL,并且如果TRANSLATE 中的任何参数为NULL,那么结果也是 NULL。


总结

SQL> SELECT TRANSLATE('abcdefghij','abcdef','123456') FROM dual; 
TRANSLATE('ABCDEFGHIJ','ABCDEF
------------------------------
123456ghij
SQL> select translate('abcbbaadef','bad','#@') from dual;
TRANSLATE('ABCBBAADEF','BAD','
------------------------------
@#c##@@ef
b将被#替代,a将被@替代,d对应的值是空值,将被移走。


2.5 按数字和字母混合字符串中的字母排序

问题

现有字母和数字混合的数据,希望按照数字或者字母部分来排序。

数据集 如下:

SQL> create or replace view v as select a.ename|| ' ' ||a.deptno  as data  from emp a ;
View created
SQL> select * from v ;
DATA
---------------------------------------------------
SMITH 20
ALLEN 30
WARD 30
JONES 20
MARTIN 30
BLAKE 30
CLARK 10
SCOTT 20
KING 10
TURNER 30
ADAMS 20
JAMES 30
FORD 20
MILLER 10
14 rows selected
SQL> 


解决方案

按照 deptno 排序

SQL> select *
  from v
 order by replace(data,
                  replace(translate(data, '0123456789', '##########'),
                          '#',
                          ''),
                  '');
DATA
---------------------------------------------------
CLARK 10
KING 10
MILLER 10
JONES 20
FORD 20
ADAMS 20
SMITH 20
SCOTT 20
WARD 30
TURNER 30
ALLEN 30
JAMES 30
BLAKE 30
MARTIN 30
14 rows selected
SQL> 


按照 ename排序

SQL> select *
  from v
 order by replace(replace(translate(data, '0123456789', '##########'),
                         '#',
                         ''),
                 '');
DATA
---------------------------------------------------
ADAMS 20
ALLEN 30
BLAKE 30
CLARK 10
FORD 20
JAMES 30
JONES 20
KING 10
MARTIN 30
MILLER 10
SCOTT 20
SMITH 20
TURNER 30
WARD 30
14 rows selected
SQL> 


总结

translate和replace函数从每一行中去掉数字或者字符,这样就很容易的可以根据具体情况来排序。


2.6 处理排序空值 - nulls first 和 nulls last

问题


emp表中comm字段,这个字段可以为空,需要指定是否将空值排在最后 或者将空值排在最前。


解决方案


oracle9i以后 可以使用关键字 nulls first 和 nulls last 来确保null是首先排序还是最后排序,而不必考虑非空值的排序方式。

SQL>  select ename ,comm from emp order by comm desc nulls first;
ENAME      COMM
---------- ---------
SMITH 
CLARK 
FORD 
JAMES 
ADAMS 
JONES 
BLAKE 
MILLER 
SCOTT 
KING  
MARTIN   1400.00
WARD    500.00
ALLEN    300.00
TURNER      0.00
14 rows selected
SQL> select ename ,comm from emp order by comm desc nulls last;
ENAME      COMM
---------- ---------
MARTIN   1400.00
WARD    500.00
ALLEN    300.00
TURNER      0.00
SCOTT 
KING  
ADAMS 
JAMES 
FORD 
MILLER 
BLAKE 
JONES 
SMITH 
CLARK 
14 rows selected
SQL> 

总结

oracle9i以后 可以使用关键字 nulls first 和 nulls last 来确保null是首先排序还是最后排序,而不必考虑非空值的排序方式。


2.7 根据条件取不同列中的值来排序

问题


要根据某些条件逻辑来排序,比如 job是saleman的要根据comm排序,否则按照sal排序,降序排列


解决方案


在order by 子句中使用case表达式

SQL>   select ename, job, sal, comm
    from emp
   order by case  
              when job = 'SALESMAN' then
               comm 
              else
               sal 
            end  desc;
ENAME JOB         SAL      COMM
---------- --------- --------- ---------
KING  PRESIDENT   5000.00 
FORD ANALYST   3000.00 
SCOTT ANALYST   3000.00 
JONES MANAGER   2975.00 
BLAKE MANAGER   2850.00 
CLARK MANAGER   2450.00 
MARTIN SALESMAN   1250.00   1400.00
MILLER CLERK   1300.00 
ADAMS CLERK   1100.00 
JAMES CLERK    950.00 
SMITH CLERK    800.00 
WARD SALESMAN   1250.00    500.00
ALLEN SALESMAN   1600.00    300.00
TURNER SALESMAN   1500.00      0.00
14 rows selected
SQL> 

总结

可以使用CASE表达式来动态改变如何对结果排序。 传递给order by 的值类似这样:

  select ename, job, sal, comm,
  case  
              when job = 'SALESMAN' then
               comm 
              else
               sal 
               end  as ordered_col 
    from emp 
   order by  ordered_col   desc ;


或者

  select ename, job, sal, comm,
  case  
              when job = 'SALESMAN' then
               comm 
              else
               sal 
               end  as ordered_col 
    from emp 
   order by  5  desc ;
相关文章
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
|
12月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的闪回版本查询
本文介绍了Oracle数据库的闪回版本查询(Flashback Version Query)功能,通过示例详细讲解了其使用方法。闪回版本查询可获取指定时间区间内行的不同版本,利用`versions between`子句实现。文中包含视频讲解,并通过创建测试表、插入数据及执行查询等步骤,演示如何获取历史版本信息和伪列详情,帮助用户深入了解该功能的实际应用。
281 13
|
11月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回事务查询
Oracle数据库的闪回事务查询(Flashback Transaction Query)是闪回版本查询的扩充,可用于审计或撤销已提交的事务。通过`flashback_transaction_query`视图,可生成还原特定事务的SQL语句。本文介绍了其基本概念,并通过实战演示如何使用该功能:从授权、开启UNDO数据增强,到创建测试表和事务,最后利用闪回查询撤销已提交的事务,验证数据恢复效果。附带视频讲解,帮助深入理解。
310 3
|
12月前
|
Oracle 关系型数据库 Linux
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】oracle dblink varchar类型查询报错记录
这篇文章主要介绍了 Oracle DBLINK 查询崖山 DB 报错的相关内容,包括 ODBC 安装配置、数据源配置、dblink 环境配置、问题原因分析及规避方法。问题原因是 dblink 连接其他数据库时 varchar 类型转换导致的,还介绍了 long 类型限制、char 等类型区别,规避方法是修改参数 MAX_STRING_SIZE 支持 32K。
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
某客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有版本。问题源于操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常原因为系统调用 fork() 失败。经验总结:优化日志记录,提供更多异常信息。
|
Oracle 关系型数据库 数据库
【YashanDB知识库】oracle dblink varchar类型查询报错记录
在使用Oracle DBLink查询VARCHAR类型数据时,可能会遇到多种报错。通过了解常见错误原因,采取合适的解决方法,可以有效避免和处理这些错误。希望本文提供的分析和示例能帮助你在实际工作中更好地处理DBLink查询问题。
431 10
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
6月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
543 93
|
5月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
312 0

推荐镜像

更多