Oracle SQL 查詢優化 Part2

2021-07-10 22:59:56 字數 2615 閱讀 5039

一、排序:

1. 按返回列的順序排序:通常排序都是 order by 後邊加列名,也可以寫為 order by 後邊加列所在的次序。下邊的查詢結果是一樣的:

-- order by 加返回列所在的次序

select emp.empsalary, emp.* from emp order by 1 asc

-- order by 加列名

其中,利用返回列所在次序排序可以應用在「動態指定排序列」的情況下,比如上邊的 sql 結果第一列可以按需求返回為 empsalary、empno...或其他列,但是排序仍然是 order by 1,指定是第一列,這樣就動態指定了排序的列。但實際應該沒人會用,個人也不推薦,寫到程式裡不好維護

2. 處理排序空值:

oracle 預設正序排序(asc)空值排在後邊,倒序排序(desc)空值排在前邊。如果無論是正序或倒序,都想按自己意願把空值排在前邊或後邊,不受 asc 或 desc 制約,可以使用 nulls first 或 nulls last 關鍵字。此處只以倒序舉例,正序也是同樣道理:

-- desc,null排在前邊

正如上邊查詢結果,倒序排序預設 null 排在前邊。現在想讓 null 排在後邊,用 nulls last 可以實現:

-- desc,null排在前邊

3. 在 order by 語句中,也可以使用 case when 語句:在同乙個 sql 中,可以「條件分組後按照不同字段排序」。這在某些情況下就可以替代 1 中所說的「按照不同條件指定不同列進行排序」。下邊是 order by 中使用 case when 語句:

但是,值得注意的是排序的字段資料型別必須相同,即:字元型和數字型不能同時用於 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 SQL查詢優化

語句快取 sql語句 共享池 快取記憶體 軟解析 從共享池中 取出 以前的解析 過的語句 硬解析 重新開始新的解析硬解析會消耗資源多很多,sql可以復用還是要復用的。sql語句 hsah 值 當做key 存入快取記憶體中 sql語句的大小寫會影響key 使用繫結變數,sql還可以復用所以,sql查詢...

Oracle SQL 查詢優化 Part1

一 空值處理 1.查詢空值 null select from emp where emp.empdesc null select from emp where emp.empdesc is null 2.空值 null 不能做 加 減 乘 除 比較 等運算 select from emp where...

Oracle Sql優化筆記

基本的sql編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自動對sql語句進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用cbo cost based optimization,基於代價的優化方式 時。我們可以總結一下可能引起全表掃瞄的操作 oracle優化器...