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
避免復雜的多表關聯
避免使用耗費資源的操作