oracle中对排序的总结

本文介绍Oracle数据库中各种排序方法,包括按字符、拼音、部首、笔画等不同方式进行排序的具体实现,以及如何处理NULL值和进行分页查询。
-- 按字符方式排序

  select * from perexl order by perexl.xx

  -- 按字符对应的数字方式排序

  select * from perexl order by to_number(perexl.xx)

  -- 按拼音排序 (系统默认)

  select * from perexl order by nlssort(danwei,'NLS_SORT=SCHINESE_PINYIN_M');

  -- 按部首排序

  select * from perexl order by nlssort(danwei,'NLS_SORT=SCHINESE_STROKE_M');

  -- 按笔画排序

  select * from perexl order by nlssort(danwei,'NLS_SORT=SCHINESE_RADICAL_M');

  --排序后获取第一行数据

  select * from (select * from perexl order by nlssort(danwei,'NLS_SORT=SCHINESE_PINYIN_M') )C where rownum=1

  --降序排序

  select * from perexl order by zongrshu desc

  --升序排序

  select * from perexl order by zongrshu asc

  --将nulls始终放在最前

  select * from perexl order by danwei nulls first

  --将nulls始终放在最后

  select * from perexl order by danwei desc nulls last

  --decode函数比nvl函数更强大,同样它也可以将输入参数为空时转换为一特定值

  select * from perexl order by decode(danwei,null,'单位是空', danwei)

  -- 标准的rownum分页查询使用方法

  select *from (select c.*, rownum rn from personnel c)where rn >= 1and rn <= 5

  --在oracle语句rownum对排序分页的解决方案

  --但是如果, 加上order by 姓名 排序则数据显示不正确

  select *from (select c.*, rownum rn from personnel c order by 出生年月)where rn >= 1and rn <= 5

  --解决方法,再加一层查询,则可以解决

  select *from (select rownum rn, t.*from (select 姓名, 出生年月 from personnel order by 出生年月 desc) t)where rn >= 1and rn <= 5

  --如果要考虑到效率的问题,上面的还可以优化成(主要两者区别)

  select *from (select rownum rn, t.*from (select 姓名,出生年月 from personnel order by 出生年月 desc) t where rownum <= 10) where rn >= 3

  --nvl函数可以将输入参数为空时转换为一特定值,下面就是当单位为空的时候转换成“单位是空”

  select * from perexl order by nvl(danwei,'单位是空')

<think>嗯,用户想要获取关于Oracle SQL的总结、最佳实践和常用技巧。首先,我需要整理一下已有的引用内容,看看里面有哪些相关的信息。引用1提到了SQL优化的目标,包括减少数据读取、利用索引、优化查询逻辑。引用2讲到了SQL的数据类型、约束和数据库对象,比如表、视图、索引,还有SELECT语句的基本结构。引用3提到了临时表空间的管理,使用AWR报告分析性能瓶颈。这些都是用户需要的内容。 接下来,我应该按照用户的要求,结构清晰地组织这些信息。可能分成几个部分,比如SQL编写规范、性能优化技巧、索引使用最佳实践、临时表管理、高级特性应用等。每个部分下面再细分具体点,比如在性能优化里,可以包括减少数据访问、优化逻辑、执行计划分析等。 需要注意的是用户特别要求使用中文回答,并且所有数学表达式要用$...$格式。不过在这个问题里,可能数学公式用的不多,但如果有的话要正确使用LaTeX。另外,用户希望生成相关问题,放在最后。同时,引用要自然地添加在段落末尾,比如引用[^1]、[^2]、[^3]。 我需要确保每个部分的信息都来自提供的引用内容,不能添加外部知识。例如,在索引最佳实践部分,引用1提到避免过多索引,引用2提到了索引的作用,所以可以结合起来说明。临时表空间管理部分,引用3的AWR报告分析需要包含进去。 然后,要检查是否符合用户的其他要求,比如行内数学表达式是否正确使用,独立公式是否用$$...$$,但看起来这里可能不需要太多数学公式。另外,代码块如果有的话要用正确的语法,比如SQL示例。不过引用中没有提供具体的代码,可能需要用提到的SQL语句结构来举例。 最后,生成相关问题时要围绕用户的需求,可能涉及SQL优化方法、索引维护、执行计划分析、临时表空间优化等。需要确保问题相关且有针对性,帮助用户进一步深入学习。 可能还需要注意术语的一致性,比如“执行计划”在引用1中提到,需要详细解释如何使用。另外,提到绑定变量和批量操作时,要结合引用中的内容,确保准确。 总结下来,回答的结构应该是分点列出最佳实践,每个点下详细说明,并正确标注引用来源。然后生成的问题要覆盖各个主要部分,便于用户后续探索。</think>### Oracle SQL 总结与最佳实践 #### 一、SQL编写规范与基础 1. **数据类型与约束** - 常用数据类型包括整数、浮点数、字符(`VARCHAR2`)、日期(`DATE`)等。 - 约束如`PRIMARY KEY`(唯一标识)、`FOREIGN KEY`(数据一致性)、`UNIQUE`(字段唯一性)、`NOT NULL`(非空)和`CHECK`(条件校验)[^2]。 2. **基础查询优化** - 使用明确的字段列表(避免`SELECT *`),减少数据传输量。 - 示例: ```sql SELECT employee_id, name FROM employees WHERE department_id = 10; ``` #### 二、性能优化关键技巧 1. **减少数据访问** - 通过索引(如B树索引、位图索引)快速定位数据,减少全表扫描[^1]。 - 使用`WHERE`条件过滤无关数据,结合`EXPLAIN PLAN`分析执行路径[^2]。 2. **逻辑优化** - 避免复杂子查询嵌套,改用`JOIN`或`WITH`子句(公共表表达式)。 - 示例: ```sql WITH dept_summary AS (SELECT department_id, AVG(salary) avg_sal FROM employees GROUP BY department_id) SELECT * FROM dept_summary WHERE avg_sal > 5000; ``` 3. **执行计划分析** - 使用`DBMS_XPLAN.DISPLAY_CURSOR`查看实际执行计划,关注高成本的`FULL TABLE SCAN`或`HASH JOIN`操作[^1]。 #### 三、索引使用最佳实践 1. **适用场景** - 高频查询字段(如`WHERE`、`JOIN`条件)。 - 选择性高的列(例如唯一值比例高)[^2]。 2. **维护与陷阱** - 定期重建碎片化索引(`ALTER INDEX ... REBUILD`)。 - 避免过度索引:索引会增加写操作开销。 #### 四、临时表空间与资源管理 1. **临时表空间优化** - 监控临时表空间使用情况(`DBA_TEMP_FILES`)。 - 通过AWR报告分析`tempfile`相关的等待事件(如`direct path write temp`)[^3]。 2. **动态管理** - 使用`ALTER TABLESPACE ... ADD TEMPFILE`动态扩展空间,避免排序或哈希操作因空间不足失败。 #### 五、高级特性应用 1. **绑定变量与批量操作** - 使用绑定变量(`:var`)减少硬解析开销。 - 批量处理(`BULK COLLECT`、`FORALL`)提升PL/SQL效率。 2. **分区表与物化视图** - 按时间或范围分区,加速查询和数据维护。 - 物化视图预计算复杂聚合结果,适合报表场景。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值