目前分類:Oracle SQL (15)

瀏覽方式: 標題列表 簡短摘要

--列出所有應用模組對應的ID
SELECT
appview.APPLICATION_ID
,appview.APPLICATION_SHORT_NAME
,appview.APPLICATION_NAME

oracleD2K 發表在 痞客邦 留言(0) 人氣()

項目 PRIMARY KEY 單一 PRIMARY KEY 複合
建立 CREATE TABLE customer
(
  C_Id INT NOT NULL PRIMARY KEY,
  Name VARCHAR(50) NOT NULL,
  Address VARCHAR(255),

oracleD2K 發表在 痞客邦 留言(0) 人氣()

Statement 陳述

Description 敘述

SELECT

Retrieves data from the database.

 

oracleD2K 發表在 痞客邦 留言(1) 人氣()

description='111,222,333,444,555,666,777,888,999,101'

select

nvl(substr(description, 1,instr(description, ',', 1, 1)-1),'無') one,

nvl(substr(description, instr(description, ',', 1, 1)+1, instr(description, ',', 1, 2) - instr(description, ',', 1, 1)-1),'無') two,

oracleD2K 發表在 痞客邦 留言(0) 人氣()

 三種JOIN語法的差異

敘述

用途說明

oracleD2K 發表在 痞客邦 留言(1) 人氣()

 http://www.searchfull.net/blog/2006/11/18/1163822247129.html
http://blog.roodo.com/emisjerry/archives/cat_3885.html

一、TABLE 結構表
fphm,kshm

oracleD2K 發表在 痞客邦 留言(1) 人氣()

 在SQL語句優化過程中,我們經常會用到hint,現總結一下在SQL優化過程中常見Oracle HINT的用法:

1. /*+ALL_ROWS*/
表明對語句塊選擇基於開銷的優化方法,並獲得最佳吞吐量,使資源消耗最小化.
例如:

oracleD2K 發表在 痞客邦 留言(0) 人氣()

 基本的Sql編寫注意事項

  • 盡量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。
  • 不用NOT IN操作符,可以用NOT EXISTS或者外連接+替代。
  • Oracle在執行IN子查詢時,首先執行子查詢,將查詢結果放入臨時表再執行主查詢。而EXIST則是首先檢查主查詢,然后運行子查詢直到找到第一個匹配項。NOT EXISTS比NOT IN效率稍高。但具體在選擇IN或EXIST操作時,要根據主子表資料量大小來具體考慮。
  • 不用“<>”或者“!=”操作符。對不等於操作符的處理會造成全表掃瞄,可以用“<” or “>”代替。
  • Where子句中出現IS NULL或者IS NOT NULL時,Oracle會停止使用索引而執行全表掃瞄。可以考慮在設計表時,對索引列設置為NOT NULL。這樣就可以用其他操作來取代判斷NULL的操作。
  • 當通配符“%”或者“_”作為查詢字符串的第一個字符時,索引不會被使用。
  • 對於有連接的列“||”,最后一個連接列索引會無效。盡量避免連接,可以分開連接或者使用不作用在列上的函數替代。
  • 如果索引不是基於函數的,那麼當在Where子句中對索引列使用函數時,索引不再起作用。
  • Where子句中避免在索引列上使用計算,否則將導致索引失效而進行全表掃瞄。
  • 對資料類型不同的列進行比較時,會使索引失效。
  • 用“>=”替代“>”。
  • UNION操作符會對結果進行篩選,消除重復,資料量大的情況下可能會引起磁盤排序。如果不需要刪除重復記錄,應該使用UNION ALL。
  • Oracle從下到上處理Where子句中多個查詢條件,所以表連接語句應寫在其他Where條件前,可以過濾掉最大數量記錄的條件必須寫在Where子句的末尾。
  • Oracle從右到左處理From子句中的表名,所以在From子句中包含多個表的情況下,將記錄最少的表放在最后。(只在採用RBO優化時有效,下文詳述)
  • Order By語句中的非索引列會降低性能,可以通過添加索引的方式處理。嚴格控制在Order By語句中使用表達式。
  • 不同區域出現的相同的Sql語句,要保證查詢字符完全相同,以利用SGA共享池,防止相同的Sql語句被多次分析。
  • 多利用內部函數提高Sql效率。
  • 當在Sql語句中連接多個表時,使用表的別名,並將之作為每列的前置碼。這樣可以減少解析時間。

需要注意的是,隨著Oracle的昇級,查詢優化器會自動對Sql語句進行優化,某些限制可能在新版本的Oracle下不再是問題。尤其是採用CBO(Cost-Based Optimization,基於代價的優化方式)時。

我們可以總結一下可能引起全表掃瞄的操作:

  • 在索引列上使用NOT或者“<>”;
  • 對索引列使用函數或者計算;
  • NOT IN操作;
  • 通配符位於查詢字符串的第一個字符;
  • IS NULL或者IS NOT NULL;
  • 多列索引,但它的第一個列並沒有被Where子句引用;

Oracle優化器

oracleD2K 發表在 痞客邦 留言(2) 人氣()

 select to_char(timestamp, 'DD-MON-YY HH24:MI:SS'),
message_text,
module,
log_sequence
 from fnd_log_messages

oracleD2K 發表在 痞客邦 留言(0) 人氣()

   oracle SQL裡常用的時間函數,經典推薦
相信很多人都有過統計某些數據的經歷,比如,要統計財務的情況,可能要按每年,每季度,每月,甚至每個星期來分別統計。 那在oracle中應該怎麼來寫sql語句呢,這個時候Oracle的日期函數會給我們很多幫助。

常用日期型函數
1。  Sysdate當前日期和時間
 SQL> Select sysdate from dual;

oracleD2K 發表在 痞客邦 留言(5) 人氣()

 Delete from emp e

  where e.rowid >

   (select min(f.rowid) from emp f

oracleD2K 發表在 痞客邦 留言(0) 人氣()

1.取,之前的文字,如果是.就把,換掉
SELECT SUBSTR('abc,123,TYT', 1 ,INSTR('abc,123,TYT', ',', 1, 1)-1)
FROM dual;

ANS : abc

oracleD2K 發表在 痞客邦 留言(0) 人氣()

MERGE語句是Oracle9i新增的語法,用來合併UPDATE和INSERT語句。
通過MERGE語句,根據一張表或子查詢的連接條件對另外一張表進行查詢,
連接條件匹配上的進行UPDATE,無法匹配的執行INSERT。
這個語法僅需要一次全表掃描就完成了全部工作,執行效率要高於INSERT+UPDATE。
下面看個具體的例子:

oracleD2K 發表在 痞客邦 留言(2) 人氣()

部分列為空的排序問題
1.null值排在最前面,其他數值升序排列,使用關鍵字:desc nulls first  

order by A.X desc nulls first


oracleD2K 發表在 痞客邦 留言(0) 人氣()

       decode(sign(rgd.acctd_amount),1,rgd.acctd_amount,null) dr
       ,decode(sign(rgd.acctd_amount),-1,rgd.acctd_amount*-1,null) cr

oracleD2K 發表在 痞客邦 留言(0) 人氣()