1. Oracle 行转列和列转行
最常见的行转列,主要原理利用decode函数、聚合函数(sum() Max())、结合group by分组实现的
MAX(DECODE(SW.SBBL, '1', SW.SBBL, NULL)) AS SBBL_01,
MAX(DECODE(SW.SBBL, '2', SW.SBBL, NULL)) AS SBBL_02,
说明: SW.SBBL中值为1或2,现在将其转化为2列。如果是1就以SBBL_01为列名,这一列的值为1。如果是2就以SBBL_02为列名,这一列的值为2.
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
DECODE( B.TASK_STATUS,'1','办理中','2','已办理')
列传行,主要利用sql里面的union,具体sql
select user_name, 'CN_SCORE' COURSE , CN_SCORE as SCORE from test_tb_grade2
union
select user_name, 'MATH_SCORE' COURSE, MATH_SCORE as SCORE from test_tb_grade2
union
select user_name, 'EN_SCORE' COURSE, EN_SCORE as SCORE from test_tb_grade2
order by user_name,COURSE
2. 对表中的数据进行去除重复,当表数据小的时候可以直接使用distinct(属性),但当表数据大的时候。
使用exists替换distinct
低效
select distinct dept_no,dept_name
from dept d,emp e
where d.dept_no=e.dept_no
高效
select dept_no,dept_name
from dept d
where exists(select 1 from emp e
where e.dept_no=d.dept_no)
3. oracle采用自下而上的顺序解析where子句。当where中多表联接,返回行数少的表,有过滤条件的子句应放在where子句最后
4. 当表数据大的时候,使用truncate替代delete进行数据删除操作。
5. 将date类型的数据进行转化为字符串类型操作。
TO_CHAR(B.RECEIVE_TIME, 'YYYY-MM-DD HH24:MI:SS') RECEIVE_TIME
6.sql优化一般原则:
尽量依赖oracle优化器,建立合适的索引。
编码方面 利用索引,避免大表、合理使用临时表、避免写复杂sql
几个常见优化方案
创建表时,应尽量建立主键,根据实际需要调用整数据表pctfree和pctused参数
大数据表删除 truncate table
少用*号 select count(key) from tab where key>0性能优于 select count(*)
尽量少用嵌套子查询
对于比较多or运算,建议分成多个查询,用union all联结起来
oracle 解析器对表解析从右到左,记录少的表放在右边
访问频繁的表可常驻内存。alter table ..cache
避免复杂的多表关联
避免使用耗费资源的操作