<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          項目中的那些SQL語句規(guī)范,你做到了幾條?

          共 2971字,需瀏覽 6分鐘

           ·

          2020-09-16 20:35

          點(diǎn)擊上方SQL數(shù)據(jù)庫開發(fā),關(guān)注獲取SQL視頻教程


          SQL專欄

          SQL基礎(chǔ)知識匯總

          SQL高級知識匯總


          公司有SQL語句規(guī)范的參考文檔,這里特別做個筆記。

          書寫風(fēng)格

          1. 語句關(guān)鍵字應(yīng)全部使用小寫。


          2. 引用字符時應(yīng)使用單引號。

          如:update testable set idcol='abcd'。


          3. 連接符或運(yùn)算符or、in、and、=、<=、>=, +,- 等前后宜加上一個空格。否則容易導(dǎo)致以下類似問題。

          例如

          在語句select a–b from table中,a,b均為變量,拼寫該語句時,如果a = 6,b = -3,則語句變?yōu)閟elect 6--3 from table。--被視為SQL的注釋,結(jié)果語句報錯。


          4. 不得使用“select * from …”語法,必須標(biāo)明字段名。即select col1, col2,… from tablea where …


          5. 嚴(yán)禁使用“insert into table_name values (?,?,……)”語法,統(tǒng)一使用“insert into table_name (col1,col2,……) values (?,?,…...)”。


          6. SQL語句包含多表連接時,必須加上表的別名,對每個字段的使用都要帶上表別名。

          即?

          select?
          a.col1,
          a.col2,
          b.col3
          from?tablea a, tableb b
          where?a.col4=b.col5

          7. 應(yīng)避免顯式或隱含的類型轉(zhuǎn)換。例如在where子句中numeric型和int型的列的比較。


          8. 在子查詢中前后必須加上括號。


          select?
          col1,
          col2
          from?tablea
          where?col3 in?(
          ??select?col4 from?tableb
          ??where?col4>0
          )



          9. 執(zhí)行SQL時一次應(yīng)只執(zhí)行一條,如果多條語句則應(yīng)分開執(zhí)行,但必須保持在一個事務(wù)中。不得一次執(zhí)行通過分號等分開的多條語句,這樣處理不清晰。


          10. 如果能采用or代替,則不宜使用in 語句。in語句中的元素不得超過500個,如果超過,則應(yīng)拆分為多條SQL語句。嚴(yán)禁使用xx in(‘’,’’….) or xx in(‘’,’’,’’)。


          11. or連接條件不得超過 500,超過時應(yīng)拆分為多條語句。



          性能優(yōu)化

          1. 查詢時應(yīng)盡量減少多余數(shù)據(jù)的讀取,通過使用where子句來減少返回的記錄數(shù)。


          2. 如果在語句中有not in(in)操作,應(yīng)盡量用not exists(exists)來代替。特別對大數(shù)據(jù)量的兩者檢索速度有很明顯的區(qū)別。


          3. 不宜使用外連接。外連接效率低。


          4. 一條SQL語句中不宜使用3層以上的嵌套查詢。如果超過,則應(yīng)在Java等應(yīng)用服務(wù)器程序中處理。


          5. 一條SQL語句中不得從4個及以上表中同時取數(shù)。僅作關(guān)聯(lián)或過濾條件而不涉及取數(shù)的表不參與表個數(shù)計算;如果必須關(guān)聯(lián)4個或4個以上表,應(yīng)在Java等應(yīng)用服務(wù)器程序中處理。


          6. 應(yīng)盡量避免使用order by和group by排序操作,如必須使用排序操作,盡量建立在有索引的列上。因?yàn)榇罅康呐判虿僮饔绊懴到y(tǒng)性能。


          7. 對索引列的比較,應(yīng)盡量避免使用not 或 !=,可拆分為幾個條件。因?yàn)椤皀ot”和“!=”不會使用索引。如col1 是索引列,條件col1 !=0 可以拆分為col1 >0 or col2 <0。


          8. 應(yīng)盡量將數(shù)據(jù)庫函數(shù)、計算表達(dá)式寫在邏輯操作符右邊。因?yàn)檫@些對列的操作會將導(dǎo)致表掃描,影響性能。


          9. 在where子句中,如果有多個過濾條件,應(yīng)將索引列或過濾記錄數(shù)最多的條件放在前面。


          10. 能用連接方式實(shí)現(xiàn)的功能,不得用子查詢。

          例如:

          select?
          name?
          from?customer
          where?customerId in?(
          ?select?customerId from?order
          ?where?money > 1000
          )


          應(yīng)該用如下語句代替:

          select?
          name?
          from?customer
          inner?join?order?
          on?customer.customerId = order.customerId where?order.money > 100


          或?

          select?
          name?
          from?customer
          where?exists?(
          ?select?1?from?order?
          ?where?money > 1000?
          ?and?customer.customerId = order.customerId
          )


          ?(這里需要注意:使用exists的效率依賴于匹配度,inner join效率比較穩(wěn)定)


          11. 多表關(guān)聯(lián)查詢時,寫法可遵循以下原則,這樣做有利于建立索引,提高查詢效率。

          格式如下:

          select?
          sum?(t1.je)
          from?table1 t1, table2 t2, table3 t3
          where?(
          t1的等值條件
          and?(t1的非等值條件)
          and?(t2與t1的關(guān)聯(lián)條件)
          and?(t2的等值條件)
          and?(t2的非等值條件)
          and?(t3與t2的關(guān)聯(lián)條件)
          and?(t3的等值條件)
          and?(t3的非等值條件)
          )



          跨數(shù)據(jù)庫支持

          1. 對于跨數(shù)據(jù)庫Java應(yīng)用程序的VO映射數(shù)據(jù)庫的數(shù)據(jù)格式建議:
          1) 整型字段:字段設(shè)置保存為Integer或者Long
          2) 數(shù)字型字段:若需要使用小數(shù)2位以上的精確計算,讀取、插入、更新使用BigDecimal類型
          3) 字符型字段:讀取為String,并保存為String,插入或者更新為String
          4) 時間字段:讀取為String,插入或者更新時的時間格式使用中間件統(tǒng)一處理。

          2. 字符串連接應(yīng)使用“||”符號,而不應(yīng)使用“+”。
          “+”是SQL Server語法,Oracle和DB2支持“||”,Hibernate轉(zhuǎn)化為SQL Server時,會自動將“||”轉(zhuǎn)為“+”。

          3. 通配符不能使用‘[a-c]%’這種形式。
          應(yīng)寫成如:
          select?
          col1,
          col2 from?
          table_name
          where?col1 like?'[a]%'?
          OR?col1 like?'[b]%'?
          OR?col1 like?'[c]%'


          4. 截取字符串長度函數(shù)應(yīng)使用substr,起始位置為1表示從頭開始。因?yàn)閐b2中substr起點(diǎn)為1,0會報錯;在SqlServer數(shù)據(jù)庫中使用的是substring需要進(jìn)行轉(zhuǎn)換。


          5. 不得通過select percent n和select top n限制查詢結(jié)果集的記錄數(shù)。


          6. join 與on 必須嚴(yán)格匹配,嚴(yán)禁出現(xiàn)沒有on的join。


          7. join…on 后面不宜使用or,如果使用則需將or的范圍用( )括起來。


          8. 不得使用select into 的格式。Select into是SQL Server特有語法,因?yàn)镺racle和DB2不支持。


          9. 應(yīng)將Null值與空字符串(長度為零的字符串)視為不同。雖然Oracle視Null與空字符串為相同,但DB2和SQL Server卻視為不同。


          ——End——

          后臺回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
          后臺回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。
          推薦閱讀
          這是一個能學(xué)到技術(shù)的公眾號,歡迎關(guān)注
          點(diǎn)擊「閱讀原文」了解SQL訓(xùn)練營

          瀏覽 15
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜免费网站 | 分分艹| 把美女弄到高潮不断免费视频网站观看 | 国产大鸡巴视频 | AV无码免费一区二区三区不卡 |