數(shù)據(jù)庫設(shè)計及開發(fā)規(guī)范齐遵,sql性能優(yōu)化

1 引言

1.1 編寫目的

本文檔用于規(guī)范數(shù)據(jù)庫設(shè)計、開發(fā)等方面的內(nèi)容塔插。

1.2 預(yù)期讀者

本文檔的預(yù)期讀者為本項目組全體成員梗摇,以及其他與項目有關(guān)的管理人員。

1.3 術(shù)語定義

OMP:Operation Management Platform

1.4 參考文檔

《數(shù)據(jù)庫編碼規(guī)范.pdf》

2 數(shù)據(jù)庫規(guī)范

2.1 設(shè)計規(guī)范

2.1.1 命名規(guī)范

數(shù)據(jù)庫對象的命名規(guī)則的范圍為管理平臺設(shè)計開發(fā)所涉及的表想许,對于其他外部系統(tǒng)所創(chuàng)建的表不在本規(guī)范約束范圍內(nèi)伶授,
數(shù)據(jù)庫對象如表、列流纹、序列糜烹、過程、函數(shù)等在命名時要遵循如下規(guī)則:

  • 命名要使用富有意義中文名稱縮寫漱凝,要以字母開頭疮蹦,不能超過30個字符。
  • 數(shù)據(jù)庫對象名稱由如下部分組成:范圍茸炒、類型愕乎、名稱實體,各詞匯間采用“_”連接壁公。
  • 其中各數(shù)據(jù)庫對象的范圍和類型的具體含義及取值詳見各數(shù)據(jù)庫對象的命名規(guī)則感论。
  • 數(shù)據(jù)庫對象的名稱不允許是數(shù)據(jù)庫的 保留字關(guān)鍵字
圖例-1.png

2.1.2 表規(guī)范

2.1.2.1 建表的參數(shù)設(shè)計

  • 不允許將表建立在默認(rèn)系統(tǒng)表空間上
  • 表和索引建立在不同表空間上
  • 建表時必須指明所存儲的表空間
  • 生成表腳本時非空的列放在表的前部紊册,可空的列放在表的后部
  • 數(shù)據(jù)緩沖池的類型:查詢頻繁且數(shù)據(jù)量較少的參數(shù)表 采用 buffer pool keep
  • INITIAL: 對初始化數(shù)據(jù)量大的表比肄,設(shè)置的值要大于初始化數(shù)據(jù)
  • PARALLEL: 對于OLTP(聯(lián)機(jī)事務(wù)處理)系統(tǒng),不允許使用該參數(shù)

2.1.2.2 主外鍵設(shè)計

  • 數(shù)據(jù)約束優(yōu)先考慮利用數(shù)據(jù)庫提供的約束機(jī)制囊陡,在數(shù)據(jù)庫產(chǎn)品所提供的機(jī)制無法滿足的情況下芳绩,再考慮通過編程實現(xiàn)
  • 主鍵的設(shè)置通常不使用實際意義的列做主鍵,具體情況應(yīng)結(jié)合業(yè)務(wù)特性綜合考慮
  • 字表在外鍵的字段上必須建立索引
  • 由Sequence產(chǎn)生的ID列撞反,不作為組合PK的列
  • 刪除約束時使用keep index參數(shù)

2.1.2.3 列設(shè)計

  • 定長字符類型列使用CHAR類型妥色,最大長度為2000;不定長字符類型列使用VARCHAR類型痢畜,最大長度為4000
  • 日期字段需定義為DATE類型垛膝。如果定義為VARCHAR或者CHAR時需要進(jìn)行轉(zhuǎn)換,影響效率丁稀。需要數(shù)據(jù)精確到微秒的字段定義為TIMESTAMP類型
  • 列表為null時,需要定義default值倚聚,避免因為null而造成索引不能被用到的情況
  • 使用NUMBER類型是必須指定長度线衫。由NUMBER的到精度與密度來保障數(shù)據(jù)的一致性
  • 表中字段的命名長度不應(yīng)該超過30個字節(jié)
  • 記錄數(shù)達(dá)到千萬級的表,必須進(jìn)行分區(qū)惑折,分區(qū)一般遵循以下原則:
    1. 數(shù)據(jù)具有明顯的范圍屬性授账,比如日期枯跑,大小等,且經(jīng)常進(jìn)行范圍條件查詢的表白热,采用范圍分區(qū)敛助。
    2. 數(shù)據(jù)具有明顯的列表屬性,比如地點屋确,省份等纳击,且經(jīng)常用列表條件查詢的表,采用列表分區(qū)攻臀。
    3. 數(shù)據(jù)不具有明顯的范圍屬性或者列表屬性焕数,且數(shù)據(jù)量很大,則可以采用hash分區(qū)刨啸。

2.1.2.4 臨時表

  • 對于只對本事務(wù)有效的臨時表使用ON COMMIT DELETE ROWS關(guān)鍵字創(chuàng)建該表
  • 對于只對本會話有效的臨時表使用ON COMMIT PRESERVE ROWS 關(guān)鍵字建該表
  • 對于臨時表空間要求比較大的業(yè)務(wù)系統(tǒng)堡赔,臨時表要存儲在獨(dú)立的表空間中,并且臨時表空間的數(shù)據(jù)文件需要放在獨(dú)立的磁盤上

2.1.3 索引規(guī)范

  • 選擇使用普通B樹索引
  • 小表(數(shù)據(jù)量小于10000條記錄為標(biāo)準(zhǔn))不需要建立索引
  • 創(chuàng)建或重建索引時需指定使用NOLOGGING子句设联,提高執(zhí)行效率
    對于分區(qū)索引善已,建全局分區(qū)或者本地分區(qū)規(guī)則如下:
分區(qū)規(guī)則圖
  • 建立分區(qū)索引必須指定表空間,并且指定的表空間要與數(shù)據(jù)表空間分開离例。
  • 對于OLTP應(yīng)用的業(yè)務(wù)系統(tǒng)雕拼,單個表上索引的個數(shù)不超過5個
  • 將記錄差別數(shù)最多的列放在索引順序的最前面
  • 對于OLTP應(yīng)用的業(yè)務(wù)系統(tǒng)索引數(shù)據(jù)的重復(fù)率盡量不超過20%
  • 進(jìn)行order by column desc 排序時,創(chuàng)建column desc索引
  • 頻繁使用的index需要放入庫緩存的keep池中

2.1.4 存儲過程粘招、函數(shù)啥寇、包規(guī)范

  • 存儲過程、函數(shù)和包中不允許頻繁使用DDL語句
  • 存儲過程洒扎、函數(shù)和包中必須有相應(yīng)的出錯處理功能
  • 存儲過程辑甜、函數(shù)和包中變量在引用表字段的時候,使用%rowtype類型

2.1.5 別名

  • 對于只讀用戶袍冷,必須創(chuàng)建與表相同名字的別名
  • 別名的訪問順序:public別名 -> private別名 -> 與表同名的對象

2.1.6 Database Link 別名

  • 只允許從其它數(shù)據(jù)庫中查詢少量數(shù)據(jù)時使用dblink
  • 不使用dblink更新其它數(shù)據(jù)庫的數(shù)據(jù)

開發(fā)規(guī)范

2.2.1 變量命名規(guī)范

變量的命名體現(xiàn)其作用域和數(shù)據(jù)類型磷醋,規(guī)則如下:

  • <變量作用域>_<有意義的變量名字>_<變量類型>_<后綴>
  • 變量名不能超過數(shù)據(jù)庫限制(30個字符)
  • 供別的文件或函數(shù)調(diào)用的函數(shù),不能使用全局變量交換數(shù)據(jù)


    圖例-2.png

2.2.2 SQL開發(fā)規(guī)范

2.2.2.1 SQL書寫規(guī)范

  • 每行不能寫超過80個字符
  • 使用兩個空格縮進(jìn)代碼胡诗,比如:
BEGIN
  FOR l_count IN 1..10 LOOP
    x_result := x_result + l_count;
  END LOOP;
END;

  • 關(guān)鍵詞要大寫(比如INSERT)
  • 常數(shù)符號要大寫,比如:
CONSTRAINT G_MAX_VALUE NUMBER :=10;
...
  IF(1_value > G_MAX_VALUE)
  THEN
    ...
  • 語句中出現(xiàn)的所有表名邓线、列名全部小寫,系統(tǒng)保留字煌恢、內(nèi)置函數(shù)名骇陈、SQL保留字大寫,連接符OR瑰抵、IN你雌、AND、以及=二汛、<=婿崭、>=等前后加上一個空格
  • SQL語句的縮進(jìn)風(fēng)格:

    一行有多列拨拓,基于列對齊原則,采用下行縮進(jìn)
    WHERE子句書寫時氓栈,每個條件占一行渣磷,語句另起一行時,以保留字或者連接符開始授瘦,連接符右對齊

  • SELECT語句中不可以用 * ,必須SELECT字段列表醋界,以節(jié)省內(nèi)存,提高效率
  • 避免頻繁 COMMIT ,尤其是把 COMMIT 寫在循環(huán)體中每次循環(huán)都進(jìn)行 COMMIT 奥务。避免在一個事務(wù)中出現(xiàn)2次 COMMIT現(xiàn)象物独。例如執(zhí)行一半執(zhí)行一次COMMIT,執(zhí)行完另外一半又執(zhí)行一次 COMMIT氯葬。
  • LIKE子句如果非必要時盡量使用前端匹配挡篓,如寫成 LIKE'STRING%',不要寫成 LIKE'%STRING%'
  • 批量INSERT大量數(shù)據(jù)時可以采用APPEND和NOLOGGING方式帚称,提高處理速度
  • EXP時可以采用DIRECT=Y,INDEX=NO的方式提高處理效率官研,IMP時可以指定較大的buffer。如果是ORACLE 10g以上則可以使用EXPDP和IMPDP來提高處理的速度
  • EXP和IMP時闯睹,如果系統(tǒng)中存在主外鍵約束戏羽,在IMP時可以設(shè)置CONSTRAINTS=N,避免在IMP時因為主外鍵而報錯
  • SQL中盡量不要使用數(shù)據(jù)庫未文檔化的功能楼吃,比如WMSYS.WM_CONCAT

2.2.2.2 索引與分區(qū)使用規(guī)范

  • 表的記錄數(shù)少于10000條始花,執(zhí)行全表掃描
  • 在寫查詢條件時注意引用索引
  • 批量提取數(shù)據(jù),使用按分區(qū)掃描
  • 比較值與索引列數(shù)據(jù)類型要保持一致性
  • 查詢列與索引列次序保持一致
  • 拍序列與索引列次序保持一致
  • 對于復(fù)合索引孩锡,SQL語句必須使用主索引列酷宵,按照復(fù)合索引組成列的順序書寫
  • 盡量不要對索引列進(jìn)行計算,如有特例對索引列計算較多躬窜,則需要建立函數(shù)索引
  • IN浇垦、OP子句常會使索引失效,在表數(shù)據(jù)記錄數(shù)大于10000條的情況下荣挨,考慮把子句拆開
  • 對于索引的比較男韧,不使用NOT
  • 刪除一個表的所有數(shù)據(jù)時,使用TRUNCATE默垄,而不是DELETE此虑。不能在事務(wù)中使用該語句,并且務(wù)必確認(rèn)表中數(shù)據(jù)可以全部被刪除

2.2.2.3 SELECT列和WHERE條件規(guī)范

  • 在查詢語句中查詢表達(dá)式左邊不允許出現(xiàn)函數(shù)及其它運(yùn)算表達(dá)式厕倍,所有左邊的表達(dá)式都可以用其它的方法實現(xiàn)
  • WHERE條件中不要使用常量比較寡壮,將常量綁定到變量中使用
  • 查找數(shù)據(jù)時只取出確實需要的那些列,不要使用 * 來代替所有列名讹弯。要清楚明白地使用列名况既,而不能使用列的序號
  • 不要order by 和 group by 排序操作。必須使用排序操作時组民,請遵循如下規(guī)則:

    排序盡量建立在有索引的列上
    查詢結(jié)果集不要求唯一時棒仍,使用 union all 代替 union

2.2.2.4 多表連接規(guī)范

  • 在表中的記錄數(shù)低于10萬條的情況下,可以使用多表連接
  • 多表連接時臭胜,必須使用表的別名來引用列
  • 使用EXISTS替代DISTINCT表達(dá)方式
#低效:
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 'X'
                    FROM EMP E
                    WHERE E.DEPT_NO = D.DEPT_NO);

  • 多張大表進(jìn)行JOIN 時一條 SQL 語句中關(guān)聯(lián)查詢的大表盡量不要超過3個

2.2.2.5 嵌套查詢規(guī)范

  • 使用 NOT EXIST 代替 NOT IN 子句進(jìn)行嵌套查詢
#例如:
SELECT …
FROM EMP
WHERE DEPT_NO NOT IN (SELECT DEPT_NO 
                         FROM DEPT 
                         WHERE DEPT_CAT='A');
#為了提高效率,改寫成:
SELECT ….
FROM EMP E
WHERE NOT EXISTS (SELECT 'X'
                    FROM DEPT D
                    WHERE D.DEPT_NO = E.DEPT_NO
                    AND DEPT_CAT = 'A');

  • 避免嵌套連接莫其,子查詢(多級) 如:A = B AND B = C AND C = D

2.2.3 PL/SQL開發(fā)規(guī)范

2.2.3.1 包規(guī)范

  • 按照項目制定的文件組織劃分包內(nèi)容

2.2.3.2 游標(biāo)規(guī)范

  • 外部查詢的多行數(shù)據(jù)返回使用游標(biāo)進(jìn)行處理,通過傳遞游標(biāo)變量的形式返回數(shù)據(jù)到外部接口耸三,由外部程序自行FETCH數(shù)據(jù)
  • 打開游標(biāo)前乱陡,必須顯式檢查游標(biāo)的%ISOPEN 屬性
  • 使用FETCH語句后,要立即檢查%NOTFOUND 屬性仪壮,以便正常終止游標(biāo)FETCH循環(huán)
  • 無論P(yáng)L/SQL 程序是正常終止還是出錯退出憨颠,都要關(guān)閉所有已打開的游標(biāo)。在出錯退出時积锅,應(yīng)該在其異常處理部分所有游標(biāo)爽彤,這可以釋放一部分的系統(tǒng)資源
  • 盡可能使用顯式游標(biāo),避免使用隱式游標(biāo)

2.2.3.3 事務(wù)處理規(guī)范

  • 在需要分割事務(wù)以使主事務(wù)的提交或者回滾獨(dú)立于子事務(wù)的提交及回滾時缚陷,應(yīng)使用自治事務(wù)
  • 所有的存儲過程均統(tǒng)一在結(jié)束處 COMMIT 或者 ROLLBACK

2.2.3.4 數(shù)據(jù)封裝規(guī)范

  • 按照業(yè)務(wù)邏輯實現(xiàn)功能模塊的封裝适篙,將業(yè)務(wù)邏輯集中的在更少量的、良好設(shè)計的箫爷、易于維護(hù)的函數(shù)或者過程嚷节,不必每條SQL 語句或者每天 PL/SQL程序中重復(fù)這些邏輯
  • 基于單一數(shù)據(jù)表的增、刪虎锚、改或颊、查采用標(biāo)準(zhǔn)SP進(jìn)行封裝寸爆,不允許同邏輯的處理出現(xiàn)在多個SP中

2.2.3.5 數(shù)據(jù)訪問規(guī)范

  • 后臺數(shù)據(jù)按照邏輯劃分成多個SCHEMA,不同 SCHEMA的數(shù)據(jù)不可互相訪問
  • 需要相互訪問的表均存放在某一個的SCHEMA 中,通過訪問該SCHEMA 中的接口表實現(xiàn)跨SCHEMA 的數(shù)據(jù)訪問

2.2.3.6 日志書寫規(guī)范

  • 采用公共的API包完成后臺日志數(shù)據(jù)記錄(API完成輸出錯誤信息提示珍语、記錄錯誤信息內(nèi)容到數(shù)據(jù)庫表、系統(tǒng)級的錯誤代碼及錯誤信息等)
  • 后臺日志的信息記錄級別包括 INFO嫉到、WARN哩都、ERROR,其定義以及不同級別日志的采集標(biāo)準(zhǔn)如下:

    INFO-提示信息坐搔,供開發(fā)人員調(diào)試使用藏研,由開發(fā)人員自行確定,主要是調(diào)試信息概行,程序運(yùn)行中普通信息提示
    WARN-警告信息,可能導(dǎo)致嚴(yán)重錯誤的警告信息
    ERROR-錯誤信息蠢挡,導(dǎo)致系統(tǒng)運(yùn)行錯誤的信息

  • 所有表操作的錯誤處理部分均應(yīng)記錄日志信息

2.2.3.7 錯誤處理規(guī)范

  • 凡是涉及到表操作(INSERT,UPDATE,SELECT,DELETE)的SQL語句,都必須進(jìn)行錯誤捕捉,不能將錯誤帶到后面的語句
  • 錯誤信息必須準(zhǔn)確
  • 在每個異常錯誤處理部分业踏,捕捉到的錯誤要寫入錯誤日志系統(tǒng)
  • 寫入錯誤日志函數(shù)統(tǒng)一提供

2.2.3.8 書寫規(guī)范

  • PL/SQL 語句的所有表名禽炬、字段名遵照數(shù)據(jù)字典的定義,系統(tǒng)保留字勤家、內(nèi)置函數(shù)名腹尖、PL/SQL保留字\關(guān)鍵字大寫,用戶聲明的標(biāo)識符小寫
  • 對于子程序伐脖、觸發(fā)器热幔、包等帶名的程序塊,使用結(jié)束標(biāo)識
  • 連接符OR讼庇、IN绎巨、AND、以及=蠕啄、<=场勤、>=等前后加上一個空格
  • 對較為復(fù)雜的SQL語句加上注釋,說明算法介汹、功能
  • 注釋風(fēng)格:注釋單獨(dú)成行却嗡、放在語句前面

    應(yīng)對不易理解的分支條件表達(dá)式加注釋
    對重要的計算應(yīng)說明其功能
    過長的行數(shù)出現(xiàn),應(yīng)將其語句按實現(xiàn)的功能分段加以概括性說明
    常量及變量注釋時嘹承,應(yīng)注釋保存值的含義(必須),合法取值的范圍
    可采用單行/多行注釋窗价。(-- 或 /* */ 或者 #)

  • SQL語句的縮進(jìn)風(fēng)格

    一行有多列,超過80個字節(jié)時叹卷,基于列對齊原則撼港,采用下行縮進(jìn)
    WHERE子句書寫時,每個條件占一行骤竹,語句另起一行時帝牡,以保留字或者連接符開始,連接符左對齊蒙揣。例如:

       WHERE      f1 = 1
       AND        f2 = 2
       OR     f3 = 3
    

    INSERT 語句靶溜,必須書寫字段,字段可5個或者6個一組懒震,中間用TAB分開
    多表連接時罩息,使用表的別名來引用列
    供別的文件或者函數(shù)調(diào)用的函數(shù),絕不應(yīng)該使用全局變量交換數(shù)據(jù)
    TAB 統(tǒng)一定義為4個空格个扰,建議使用Ultraedit作為SQL書寫工具

2.2.3.9 書寫優(yōu)化性能建議

  • 避免嵌套連接瓷炮。例如:A = B AND B = C AND C = D
  • WHERE條件中盡量減少使用常量比較,改用主機(jī)變量
  • 系統(tǒng)可能選擇基于規(guī)則的優(yōu)化器递宅,所以將結(jié)果集返回數(shù)據(jù)量小的表作為驅(qū)動表(FROM后邊最后一個表)
  • 大量的排序操作影響系統(tǒng)性能娘香,所以盡量減少ORDER BY和GROUP BY排序操作苍狰。如必須使用排序操作,請遵循如下規(guī)則:

    排序盡量建立在有索引的列上
    如結(jié)果集不需唯一烘绽,使用UNION ALL代替UNION

  • 索引的使用

    盡量避免對索引列進(jìn)行計算
    盡量注意比較值與索引列數(shù)據(jù)類型的一致性
    對于復(fù)合索引淋昭,SQL語句必須使用主索引列
    索引中,盡量避免使用NULL
    對于索引的比較诀姚,盡量避免使用!= 查詢列和排序列與索引列次序保持一致

  • 盡量避免相同語句由于書寫格式的不同响牛,而導(dǎo)致多次語法分析
  • 盡量使用共享的SQL語句
  • 查詢的WHERE過濾原則玷禽,應(yīng)使過濾記錄數(shù)最多的條件放在最前面
  • 任何對列的操作都將導(dǎo)致表掃描赫段,它包括數(shù)據(jù)庫函數(shù)、計算表達(dá)式等等矢赁,查詢時要盡可能將操作移至等號右邊
  • IN糯笙、OR子句常會使用工作表,使索引失效撩银;如果不產(chǎn)生大量重復(fù)值给涕,可以考慮把子句拆開;拆開的子句中應(yīng)該包含索引

2.2.3.10 其他經(jīng)驗性規(guī)則

  • 盡量少用嵌套查詢额获。如必須够庙,請用not exist代替not in子句
#錯誤寫法
SELECT ......
  FROM emp
  WHERE dept_no NOT IN ( SELECT dept_no  
            FROM dept  
            WHERE dept_cat='A');

#正確寫法
SELECT ......  
    FROM emp e  
    WHERE NOT EXISTS ( SELECT 'X'  
    FROM dept  
    WHERE dept_no=e.dept_no  
    AND dept_cat='A');

  • 用多表連接代替EXISTS子句
#錯誤寫法
SELECT ......  
    FROM emp  
    WHERE EXISTS ( SELECT 'X'  
    FROM dept  
    WHERE dept_no=e.dept_no  
    AND dept_cat='A');

#正確寫法
SELECT ......  
    FROM emp e,dept d  
    WHERE e.dept_no=d.dept_no  
    AND dept_cat='A';

  • 少用DISTINCT,用EXISTS代替
#錯誤寫法
SELECT DISTINCT d.dept_code,d.dept_name  
    FROM dept d ,emp e  
    WHERE e.dept_code=d.dept_code;


#正確寫法
SELECT dept_code,dept_name  
    FROM dept d  
    WHERE EXISTS ( SELECT 'X'  
    FROM emp e  
    WHERE e.dept_code=d.dept_code);

  • 使用UNION ALL抄邀、MINUS耘眨、INTERSECT提高性能
  • 使用ROWID提高檢索速度。對SELECT得到的單行記錄境肾,需進(jìn)行DELETE剔难、UPDATE操作時,使用ROWID將會使效率大大提高
  • 使用優(yōu)化線索機(jī)制進(jìn)行訪問路徑控制
  • 使用CURSOR時奥喻,顯示光標(biāo)優(yōu)于隱式光標(biāo)

3 拓展

3.1 Oracle 與 Mysql之間部分函數(shù)和語法對比

3.1.1 UUID生成

  • 在 Oracle 中生成隨機(jī)數(shù)UUID的方法是sys_guid()
SELECT sys_guid() FROM dual

SYS_GUID(),是Oracle 8i 后提供的函數(shù)偶宫。SYS_GUID產(chǎn)生并返回一個全球唯一的標(biāo)識符(原始值)由16個字節(jié)組成,在Oracle 9i和Oracle 10g生成的是32個字節(jié)。在大多數(shù)平臺,生成的標(biāo)識符由主機(jī)標(biāo)符环鲤,執(zhí)行函數(shù)的進(jìn)程或者線程標(biāo)識符纯趋,和進(jìn)程或線程的一個非重復(fù)的值(字節(jié)序列)組成。
可以用來生成唯一標(biāo)識ID冷离;

  • 在 Mysql 中生成隨機(jī)數(shù)UUID的方法是uuid()
SELECT uuid() FROM dual

MySQL 實現(xiàn)了 UUID吵冒,并且提供 UUID() 函數(shù)方便用戶生成 UUID。在 MySQL 的 UUID() 函數(shù)中酒朵,前三組數(shù)字從時間戳中生成桦锄,第四組數(shù)字暫時保持時間戳的唯一性,第五組數(shù)字是一個 IEEE 802 節(jié)點標(biāo)點值蔫耽,保證空間唯一结耀。使用 UUID() 函數(shù)留夜,可以生成時間、空間上都獨(dú)一無二的值图甜。據(jù)說只要是使用了 UUID碍粥,都不可能看到兩個重復(fù)的 UUID 值。當(dāng)然黑毅,這個只是在理論情況下嚼摩。

比較:本質(zhì)上都是方便用戶生成隨機(jī)的唯一索引,SYS_GUID()生成的是32位的字節(jié);uuid()生成的則是帶4根- 的36位的字節(jié)矿瘦。

3.1.2 表之間左右連接使用

在關(guān)系型數(shù)據(jù)庫中枕面,左連接使用 LEFT JOIN ……ON……,右連接使用 RIGHT JOIN ……ON……

SELECT t1.* FROM TABLE1 t1 LEFT JOIN TABLE2 t2 ON t1.id = t2.id
SELECT t2.* FROM TABLE1 t1 RIGHT JOIN TABLE2 t2 ON t1.id = t2.id

但是在Oracle中卻有一種簡化寫法,采用 += 缚去、=+ 來替代左連接和右連接潮秘,寫法如下

SELECT t1.* FROM TABLE1 t1 , TABLE2 t2 t1.id += t2.id
SELECT t2.* FROM TABLE1 t1 , TABLE2 t2 t1.id =+ t2.id

3.1.3 判斷并替換null函數(shù)

在Mysql中判斷null函數(shù)并且替換null的函數(shù)是ifnull(exp1,result)

SELECT ifnull(t1.user_name,'張三') as user_name FROM TABLE1 t1

在Oracle中判斷null函數(shù)并且替換null的函數(shù)是nvl(exp1,result)

3.1.4 條件語句(函數(shù))

在Mysql中條件判斷語句可以使用 IF(exp1,exp2,exp3)函數(shù),缺陷是只能判斷單重條件

SELECT 
  IF(t1.user_name='',"zhang san",t1.user_name) as user_name
FROM TABLE1 t1

在Oracle中條件判斷語句可以使用 decode(exp1,result1,exp2,result2,result3)函數(shù),可支持多重判斷

SELECT 
  decode(t1.user_name='',"zhang san",t1.user_name is null,'li si',t1.user_name) as user_name
FROM TABLE1 t1

對于比較復(fù)雜的多重條件判斷易结,推薦使用通用的 CASE WHEN 條件 THEN 結(jié)果 WHEN 條件 THEN 結(jié)果 ELSE 結(jié)果 END 這種形式

SELECT 
  CASE WHEN t1.user_name=''THEN 
  "zhang san"
  WHEN t1.user_name is null THEN
  "li si"
  ELSE t1.user_name END as user_name
FROM TABLE1 t1

3.1.4 字符串拼接

字符串拼接是sql中常用到枕荞,在Mysql中提供了concat(str1,str2,…strn)和concat_ws(separator,str1,str2,...)

#無添加任何字符拼接
SELECT concat(column1,column2,……) as column_sttr FROM TABLE1;

#各個字符串之間以'-'拼接
SELECT concat_ws('-',column1,column2,……) as column_sttr FROM TABLE1;

在Oracle中,字符拼接是以 "||" 方式,此種方式顯得更靈活點

SELECT column1 ||column2 || column3 as column_sttr FROM TABLE1;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搞动,一起剝皮案震驚了整個濱河市躏精,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹦肿,老刑警劉巖矗烛,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狮惜,居然都是意外死亡高诺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門碾篡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虱而,“玉大人,你說我怎么就攤上這事开泽∧的矗” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵穆律,是天一觀的道長惠呼。 經(jīng)常有香客問我,道長峦耘,這世上最難降的妖魔是什么剔蹋? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮辅髓,結(jié)果婚禮上泣崩,老公的妹妹穿的比我還像新娘少梁。我一直安慰自己,他們只是感情好矫付,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布凯沪。 她就那樣靜靜地躺著,像睡著了一般买优。 火紅的嫁衣襯著肌膚如雪妨马。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天杀赢,我揣著相機(jī)與錄音烘跺,去河邊找鬼。 笑死葵陵,一個胖子當(dāng)著我的面吹牛液荸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脱篙,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伤柄!你這毒婦竟也來了绊困?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤适刀,失蹤者是張志新(化名)和其女友劉穎秤朗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笔喉,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡取视,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了常挚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片作谭。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奄毡,靈堂內(nèi)的尸體忽然破棺而出折欠,到底是詐尸還是另有隱情,我是刑警寧澤吼过,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布锐秦,位于F島的核電站,受9級特大地震影響盗忱,放射性物質(zhì)發(fā)生泄漏酱床。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一趟佃、第九天 我趴在偏房一處隱蔽的房頂上張望扇谣。 院中可真熱鬧慷垮,春花似錦、人聲如沸揍堕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衩茸。三九已至芹血,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楞慈,已是汗流浹背幔烛。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留囊蓝,地道東北人饿悬。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像聚霜,于是被迫代替她去往敵國和親狡恬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容