Oracle SQL 查询优化.Part2
2016-04-03 23:04
405 查看
一、排序:
1. 按返回列的顺序排序:
通常排序都是 order by 后边加列名,也可以写为 order by 后边加列所在的次序。下边的查询结果是一样的:
其中,利用返回列所在次序排序可以应用在“动态指定排序列”的情况下,比如上边的 sql 结果第一列可以按需求返回为 empsalary、empno...或其他列,但是排序仍然是 order by 1,指定是第一列,这样就动态指定了排序的列。但实际应该没人会用,个人也不推荐,写到程序里不好维护。
2. 处理排序空值:
Oracle 默认正序排序(asc)空值排在后边,倒序排序(desc)空值排在前边。如果无论是正序或倒序,都想按自己意愿把空值排在前边或后边,不受 asc 或 desc 制约,可以使用 nulls first 或 nulls last 关键字。此处只以倒序举例,正序也是同样道理:
正如上边查询结果,倒序排序默认 null 排在前边。现在想让 null 排在后边,用 nulls last 可以实现:
3. 在 order by 语句中,也可以使用 case when 语句:
在同一个 sql 中,可以“条件分组后按照不同字段排序”。这在某些情况下就可以替代 1 中所说的“按照不同条件指定不同列进行排序”。下边是 order by 中使用 case when 语句:
但是,值得注意的是排序的字段数据类型必须相同,即:字符型和数字型不能同时用于 order by case when 中的排序字段。例如下边这句就会报错“ORA-00932:数据类型不一致:应为 CHAR, 但却获得 NUMBER”
二、translate 字符串替换:
1. translate 函数的使用:
translate 可以做字符串的替换,语法:translate(exp, from_string, to_string),from_string 与 to_string 以字符为单位,逐一对应,逐一替换。例如下边,exp 字符串中的‘a’字符都被‘1’替换、‘b’都被‘2’替换...依次类推:
2. 如果 to_string 为空,返回 null:
3. 如果 to_string 对应位置没有字符,那么 from_string 这个位置上的列出字符,在 exp 中都会消掉:
1. 按返回列的顺序排序:
通常排序都是 order by 后边加列名,也可以写为 order by 后边加列所在的次序。下边的查询结果是一样的:
-- order by 加返回列所在的次序 select emp.empsalary, emp.* from emp order by 1 asc -- order by 加列名 select emp.empsalary, emp.* from emp order by emp.empsalary asc
其中,利用返回列所在次序排序可以应用在“动态指定排序列”的情况下,比如上边的 sql 结果第一列可以按需求返回为 empsalary、empno...或其他列,但是排序仍然是 order by 1,指定是第一列,这样就动态指定了排序的列。但实际应该没人会用,个人也不推荐,写到程序里不好维护。
2. 处理排序空值:
Oracle 默认正序排序(asc)空值排在后边,倒序排序(desc)空值排在前边。如果无论是正序或倒序,都想按自己意愿把空值排在前边或后边,不受 asc 或 desc 制约,可以使用 nulls first 或 nulls last 关键字。此处只以倒序举例,正序也是同样道理:
-- desc,null排在前边 select emp.empsalary, emp.* from emp order by emp.empsalary desc
正如上边查询结果,倒序排序默认 null 排在前边。现在想让 null 排在后边,用 nulls last 可以实现:
-- desc,null排在前边 select emp.empsalary, emp.* from emp order by emp.empsalary desc nulls last
3. 在 order by 语句中,也可以使用 case when 语句:
在同一个 sql 中,可以“条件分组后按照不同字段排序”。这在某些情况下就可以替代 1 中所说的“按照不同条件指定不同列进行排序”。下边是 order by 中使用 case when 语句:
select * from emp where emp.empsalary is not null order by case when emp.empsalary > 3000 then emp.empname else emp.empno end asc;
但是,值得注意的是排序的字段数据类型必须相同,即:字符型和数字型不能同时用于 order by case when 中的排序字段。例如下边这句就会报错“ORA-00932:数据类型不一致:应为 CHAR, 但却获得 NUMBER”
select * from emp where emp.empsalary is not null order by case when emp.empsalary > 3000 then emp.empno else emp.empsalary end asc;
二、translate 字符串替换:
1. translate 函数的使用:
translate 可以做字符串的替换,语法:translate(exp, from_string, to_string),from_string 与 to_string 以字符为单位,逐一对应,逐一替换。例如下边,exp 字符串中的‘a’字符都被‘1’替换、‘b’都被‘2’替换...依次类推:
select translate('ab 你好 cbabcdef', 'abcdef', '123456') new_str from dual;
2. 如果 to_string 为空,返回 null:
select translate('ab 你好 cbabcdef', 'abcdef', '') new_str from dual;
3. 如果 to_string 对应位置没有字符,那么 from_string 这个位置上的列出字符,在 exp 中都会消掉:
select translate('ab 你好 cbabcdef', '1abcdef', '1') new_str from dual;
相关文章推荐
- oracle开发人员误删表的操作及恢复
- Oracle SQL 查询优化.Part1
- Oracle学习笔记五 --- 表查询
- Oracle学习笔记四 --- 变量及表管理
- Oracle学习笔记三 --- 用户管理
- Oracle dataguard之备库切换(failover)
- Oracle-05-SQL语句概述、分类&SQL*PLUS概述(初识insert,desc,list,r,del,a,c,n等命令)
- Oracle dataguard之主备库切换(switchover)
- oracle ocp 学习day6总结(oracle 启动过程与参数文件)
- oracle ocp 学习day5总结(oracle 体系结构基础)
- oracle ocp 学习day4总结(对象的基本操作)
- oracle ocp 学习day3总结(sql基础)
- oracle ocp 学习day2总结(sql基础)
- oracle job
- UDEV SCSI Rules Configuration for ASM in Oracle Linux 5, 6 and 7
- Oracle Outline总结
- ORACLE导出存储过程SQL至文件
- 使用Oracle11g自带的SQL Developer报错:Unable to find a Java Virtual Machine
- Oracle中count()函数 注意点
- Oracle ORA-12541:TNS:no listener错误解决方法