九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

良好的sql語句書寫規(guī)范正確的sql書寫順序

上傳人:ta****fu 文檔編號:210907190 上傳時間:2023-05-18 格式:DOCX 頁數(shù):10 大?。?2.86KB
收藏 版權(quán)申訴 舉報 下載
良好的sql語句書寫規(guī)范正確的sql書寫順序_第1頁
第1頁 / 共10頁
良好的sql語句書寫規(guī)范正確的sql書寫順序_第2頁
第2頁 / 共10頁
良好的sql語句書寫規(guī)范正確的sql書寫順序_第3頁
第3頁 / 共10頁

下載文檔到電腦,查找使用更方便

9.98 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《良好的sql語句書寫規(guī)范正確的sql書寫順序》由會員分享,可在線閱讀,更多相關(guān)《良好的sql語句書寫規(guī)范正確的sql書寫順序(10頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、總結(jié)|如何養(yǎng)成良好的書寫SQL的習(xí)慣?作者總結(jié)了八個書寫SQL的習(xí)慣,包括執(zhí)行順序,臨時表和變量表的用法等方面。如何更好的讓系統(tǒng)流暢的運行?提高工作效率,更加完善的做好我們的工作?這些習(xí)慣是很有幫助的。我們做軟件開發(fā)的,大部分人都離不開跟數(shù)據(jù)庫打交道,特別是erp開發(fā)的,跟數(shù)據(jù)庫打交道更是頻繁,存儲過程動不動就是上千行,如果數(shù)據(jù)量大,人員流動大,那么我們還能保證下一段時間系統(tǒng)還能流暢的運行嗎?我們還能保證下一個人能看懂我們的存儲過程嗎?那么我結(jié)合公司平時的培訓(xùn)和平時個人工作經(jīng)驗和大家分享一下,希望對大家有幫助。要知道sql語句,我想我們有必要知道sqlserver查詢分析器怎么執(zhí)行我們sql語

2、句的,我們很多人會看執(zhí)行計劃,或者用profile來監(jiān)視和調(diào)優(yōu)查詢語句或者存儲過程慢的原因,但是如果我們知道查詢分析器的執(zhí)行邏輯順序,下手的時候就胸有成竹,那么下手是不是有把握點呢?1查詢的邏輯執(zhí)行順序FROMJOINONWHEREGROUPBYWITHcube | rollupHAVINGSELECTDISTINCTORDER BY標(biāo)準(zhǔn)的SQL 的解析順序為:(1).FROM 子句 組裝來自不同數(shù)據(jù)源的數(shù)據(jù)(2).WHERE 子句 基于指定的條件對記錄進(jìn)行篩選(3).GROUP BY 子句 將數(shù)據(jù)劃分為多個分組(4).使用聚合函數(shù)進(jìn)行計算(5).使用HAVING子句篩選分組(6).計算所有的

3、表達(dá)式(7).使用ORDER BY對結(jié)果集進(jìn)行排序2執(zhí)行順序1.FROM:對FROM子句中前兩個表執(zhí)行笛卡爾積生成虛擬表vt12.ON:對vt1表應(yīng)用ON篩選器只有滿足 為真的行才被插入vt23.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2 生成t3如果from包含兩個以上表則對上一個聯(lián)結(jié)生成的結(jié)果表和下一個表重復(fù)執(zhí)行步驟和步驟直接結(jié)束4.WHERE:對vt3應(yīng)用 WHERE 篩選器只有使 為true的行才被插入vt45.GROUP BY:按GROUP BY子句中的列列表對vt4中的行分組生成vt56.C

4、UBE|ROLLUP:把超組(supergroups)插入vt6 生成vt67.HAVING:對vt6應(yīng)用HAVING篩選器只有使 為true的組才插入vt78.SELECT:處理select列表產(chǎn)生vt89.DISTINCT:將重復(fù)的行從vt8中去除產(chǎn)生vt910.ORDER BY:將vt9的行按order by子句中的列列表排序生成一個游標(biāo)vc1011.TOP:從vc10的開始處選擇指定數(shù)量或比例的行生成vt11 并返回調(diào)用者看到這里,那么用過linqtosql的語法有點相似???如果我們我們了解了sqlserver執(zhí)行順序,那么我們就接下來進(jìn)一步養(yǎng)成日常sql好習(xí)慣,也就是在實現(xiàn)功能同時有

5、考慮性能的思想,數(shù)據(jù)庫是能進(jìn)行集合運算的工具,我們應(yīng)該盡量的利用這個工具,所謂集合運算實際就是批量運算,就是盡量減少在客戶端進(jìn)行大數(shù)據(jù)量的循環(huán)操作,而用SQL語句或者存儲過程代替。3只返回需要的數(shù)據(jù)返回數(shù)據(jù)到客戶端至少需要數(shù)據(jù)庫提取數(shù)據(jù)、網(wǎng)絡(luò)傳輸數(shù)據(jù)、客戶端接收數(shù)據(jù)以及客戶端處理數(shù)據(jù)等環(huán)節(jié),如果返回不需要的數(shù)據(jù),就會增加服務(wù)器、網(wǎng)絡(luò)和客戶端的無效勞動,其害處是顯而易見的,避免這類事件需要注意:A、橫向來看,(1)不要寫SELECT *的語句,而是選擇你需要的字段。(2)當(dāng)在SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個Column上.這樣一來,就可以減少解析的時間并減少那些由Co

6、lumn歧義引起的語法錯誤。如有表table1(ID,col1)和table2 (ID,col2)Select A.ID, A.col1, B.col2 Select A.ID, col1, col2 不要這么寫,不利于將來程序擴(kuò)展from table1 A inner join table2 B on A.ID=B.ID Where B、縱向來看,(1)合理寫WHERE子句,不要寫沒有WHERE的SQL語句。(2) SELECT TOP N * 沒有WHERE條件的用此替代4盡量少做重復(fù)的工作A、控制同一語句的多次執(zhí)行,特別是一些基礎(chǔ)數(shù)據(jù)的多次執(zhí)行是很多程序員很少注意的。B、減少多次的數(shù)據(jù)轉(zhuǎn)

7、換,也許需要數(shù)據(jù)轉(zhuǎn)換是設(shè)計的問題,但是減少次數(shù)是程序員可以做到的。C、杜絕不必要的子查詢和連接表,子查詢在執(zhí)行計劃一般解釋成外連接,多余的連接表帶來額外的開銷。D、合并對同一表同一條件的多次UPDATE,比如UPDATEEMPLOYEESETFNAME=HAIWERWHEREEMP_ID= VPA30890FUPDATEEMPLOYEESETLNAME=YANGWHEREEMP_ID= VPA30890F這兩個語句應(yīng)該合并成以下一個語句UPDATEEMPLOYEESETFNAME=HAIWER,LNAME=YANGWHEREEMP_ID= VPA30890FE、UPDATE操作不要拆成DELE

8、TE操作+INSERT操作的形式,雖然功能相同,但是性能差別是很大的。5注意臨時表和表變量的用法在復(fù)雜系統(tǒng)中,臨時表和表變量很難避免,關(guān)于臨時表和表變量的用法,需要注意:A、如果語句很復(fù)雜,連接太多,可以考慮用臨時表和表變量分步完成。B、如果需要多次用到一個大表的同一部分?jǐn)?shù)據(jù),考慮用臨時表和表變量暫存這部分?jǐn)?shù)據(jù)。C、如果需要綜合多個表的數(shù)據(jù),形成一個結(jié)果,可以考慮用臨時表和表變量分步匯總這多個表的數(shù)據(jù)。D、其他情況下,應(yīng)該控制臨時表和表變量的使用。E、關(guān)于臨時表和表變量的選擇,很多說法是表變量在內(nèi)存,速度快,應(yīng)該首選表變量,但是在實際使用中發(fā)現(xiàn),(1)主要考慮需要放在臨時表的數(shù)據(jù)量,在數(shù)據(jù)量較

9、多的情況下,臨時表的速度反而更快。(2)執(zhí)行時間段與預(yù)計執(zhí)行時間(多長)F、關(guān)于臨時表產(chǎn)生使用SELECT INTO和CREATE TABLE + INSERT INTO的選擇,一般情況下,SELECT INTO會比CREATE TABLE + INSERT INTO的方法快很多,但是SELECT INTO會鎖定TEMPDB的系統(tǒng)表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用戶并發(fā)環(huán)境下,容易阻塞其他進(jìn)程所以我的建議是,在并發(fā)系統(tǒng)中,盡量使用CREATE TABLE + INSERT INTO,而大數(shù)據(jù)量的單個語句使用中,使用SELECT INTO。6子查詢的用法(

10、1)子查詢是一個 SELECT 查詢,它嵌套在 SELECT、INSERT、UPDATE、DELETE 語句或其它子查詢中。任何允許使用表達(dá)式的地方都可以使用子查詢,子查詢可以使我們的編程靈活多樣,可以用來實現(xiàn)一些特殊的功能。但是在性能上,往往一個不合適的子查詢用法會形成一個性能瓶頸。如果子查詢的條件中使用了其外層的表的字段,這種子查詢就叫作相關(guān)子查詢。相關(guān)子查詢可以用IN、NOT IN、EXISTS、NOT EXISTS引入。 關(guān)于相關(guān)子查詢,應(yīng)該注意:(1)A、NOT IN、NOT EXISTS的相關(guān)子查詢可以改用LEFT JOIN代替寫法。比如: SELECT PUB_NAME FROM

11、 PUBLISHERS WHERE PUB_ID NOT IN (SELECT PUB_ID FROM TITLES WHERE TYPE = BUSINESS)可以改寫成: SELECT A.PUB_NAME FROM PUBLISHERS A LEFT JOIN TITLES B ON B.TYPE = BUSINESS AND A.PUB_ID=B. PUB_ID WHERE B.PUB_ID IS NULL(2)SELECTTITLEFROMTITLESWHERENOTEXISTS(SELECTTITLE_IDFROMSALESWHERETITLE_ID = TITLES.TITLE_

12、ID)可以改寫成:SELECTTITLEFROMTITLESLEFT JOINSALESONSALES.TITLE_ID = TITLES.TITLE_IDWHERESALES.TITLE_IDISNULLB、 如果保證子查詢沒有重復(fù) ,IN、EXISTS的相關(guān)子查詢可以用INNER JOIN 代替。比如:SELECTPUB_NAMEFROMPUBLISHERSWHEREPUB_IDIN(SELECTPUB_IDFROMTITLESWHERETYPE=BUSINESS)可以改寫成:SELECTA.PUB_NAME -SELECTDISTINCTA.PUB_NAMEFROMPUBLISHERS

13、AINNER JOINTITLES BONB.TYPE=BUSINESSANDA.PUB_ID=B. PUB_ID(3)C、 IN的相關(guān)子查詢用EXISTS代替,比如SELECTPUB_NAMEFROMPUBLISHERSWHEREPUB_IDIN(SELECTPUB_IDFROMTITLESWHERETYPE=BUSINESS)可以用下面語句代替:SELECTPUB_NAMEFROMPUBLISHERSWHEREEXISTS(SELECT1FROMTITLESWHERETYPE=BUSINESSANDPUB_ID= PUBLISHERS.PUB_ID)D、不要用COUNT(*)的子查詢判斷是

14、否存在記錄,最好用LEFT JOIN或者EXISTS,比如有人寫這樣的語句:SELECTJOB_DESCFROMJOBSWHERE(SELECT COUNT(*)FROMEMPLOYEEWHEREJOB_ID=JOBS.JOB_ID)=0應(yīng)該改成:SELECTJOBS.JOB_DESCFROMJOBSLEFT JOINEMPLOYEEONEMPLOYEE.JOB_ID=JOBS.JOB_IDWHEREEMPLOYEE.EMP_IDISNULLSELECTJOB_DESCFROMJOBSWHERE(SELECT COUNT(*)FROMEMPLOYEEWHEREJOB_ID=JOBS.JOB_I

15、D)0應(yīng)該改成:SELECTJOB_DESCFROMJOBSWHEREEXISTS(SELECT1FROMEMPLOYEEWHEREJOB_ID=JOBS.JOB_ID)7盡量使用索引建立索引后,并不是每個查詢都會使用索引,在使用索引的情況下,索引的使用效率也會有很大的差別。只要我們在查詢語句中沒有強(qiáng)制指定索引,索引的選擇和使用方法是SQLSERVER的優(yōu)化器自動作的選擇,而它選擇的根據(jù)是查詢語句的條件以及相關(guān)表的統(tǒng)計信息,這就要求我們在寫SQL語句的時候盡量使得優(yōu)化器可以使用索引。為了使得優(yōu)化器能高效使用索引,寫語句的時候應(yīng)該注意:(1)A、不要對索引字段進(jìn)行運算,而要想辦法做變換,比如SE

16、LECTIDFROMTWHERENUM/2=100應(yīng)改為:SELECTIDFROMTWHERENUM=100*2SELECTIDFROMTWHERENUM/2=NUM1如果NUM有索引應(yīng)改為:SELECTIDFROMTWHERENUM=NUM1*2如果NUM1有索引則不應(yīng)該改。(2)發(fā)現(xiàn)過這樣的語句:SELECT 年,月,金額 FROM 結(jié)余表 WHERE 100*年+月=2010*100+10改為:SELECT 年,月,金額 FROM 結(jié)余表 WHERE 年=2010 AND月=10B、 不要對索引字段進(jìn)行格式轉(zhuǎn)換日期字段的例子:WHERE CONVERT(VARCHAR(10), 日期字段

17、,120)=2010-07-15應(yīng)該改為WHERE日期字段=2010-07-15 AND 日期字段ISNULL轉(zhuǎn)換的例子:WHERE ISNULL(字段,”)”應(yīng)改為:WHERE字段”WHERE ISNULL(字段,”)=”不應(yīng)修改WHERE ISNULL(字段,F) =T應(yīng)改為: WHERE字段=TWHERE ISNULL(字段,F)T不應(yīng)修改(3)C、 不要對索引字段使用函數(shù)WHERE LEFT(NAME, 3)=ABC 或者WHERE SUBSTRING(NAME,1, 3)=ABC應(yīng)改為: WHERE NAME LIKE ABC%日期查詢的例子:WHERE DATEDIFF(DAY,

18、日期,2010-06-30)=0應(yīng)改為:WHERE 日期=2010-06-30 AND 日期WHERE DATEDIFF(DAY, 日期,2010-06-30)0應(yīng)改為:WHERE 日期WHERE DATEDIFF(DAY, 日期,2010-06-30)=0應(yīng)改為:WHERE 日期WHERE DATEDIFF(DAY, 日期,2010-06-30)應(yīng)改為:WHERE 日期=2010-07-01WHERE DATEDIFF(DAY, 日期,2010-06-30)應(yīng)改為:WHERE 日期=2010-06-30D、不要對索引字段進(jìn)行多字段連接比如:WHERE FAME+ . +LNAME=HAIWE

19、I.YANG應(yīng)改為:WHERE FNAME=HAIWEI AND LNAME=YANG8多表連接的連接條件對索引的選擇有著重要的意義,所以我們在寫連接條件條件的時候需要特別注意A、多表連接的時候,連接條件必須寫全,寧可重復(fù),不要缺漏。B、連接條件盡量使用聚集索引C、注意ON、WHERE和HAVING部分條件的區(qū)別ON是最先執(zhí)行, WHERE次之,HAVING最后,因為ON是先把不符合條件的記錄過濾后才進(jìn)行統(tǒng)計,它就可以減少中間運算要處理的數(shù)據(jù),按理說應(yīng)該速度是最快的,WHERE也應(yīng)該比 HAVING快點的,因為它過濾數(shù)據(jù)后才進(jìn)行SUM,在兩個表聯(lián)接時才用ON的,所以在一個表的時候,就剩下WHE

20、RE跟HAVING比較了考慮聯(lián)接優(yōu)先順序:(1)INNER JOIN(2)LEFT JOIN (注:RIGHT JOIN 用 LEFT JOIN 替代)(3)CROSS JOIN其它注意和了解的地方有:A、在IN后面值的列表中,將出現(xiàn)最頻繁的值放在最前面,出現(xiàn)得最少的放在最后面,減少判斷的次數(shù)B、注意UNION和UNION ALL的區(qū)別。允許重復(fù)數(shù)據(jù)用UNION ALL好C、注意使用DISTINCT,在沒有必要時不要用D、TRUNCATE TABLE 與 DELETE 區(qū)別E、減少訪問數(shù)據(jù)庫的次數(shù)還有就是我們寫存儲過程,如果比較長的話,最后用標(biāo)記符標(biāo)開,因為這樣可讀性很好,即使語句寫的不怎么樣

21、但是語句工整,C# 有regionsql我比較喜歡用的就是startof 查詢在職人數(shù)sql語句end of正式機(jī)器上我們一般不能隨便調(diào)試程序,但是很多時候程序在我們本機(jī)上沒問題,但是進(jìn)正式系統(tǒng)就有問題,但是我們又不能隨便在正式機(jī)器上操作,那么怎么辦呢?我們可以用回滾來調(diào)試我們的存儲過程或者是sql語句,從而排錯。BEGIN TRANUPDATE a SET 字段=”ROLLBACK作業(yè)存儲過程我一般會加上下面這段,這樣檢查錯誤可以放在存儲過程,如果執(zhí)行錯誤回滾操作,但是如果程序里面已經(jīng)有了事務(wù)回滾,那么存儲過程就不要寫事務(wù)了,這樣會導(dǎo)致事務(wù)回滾嵌套降低執(zhí)行效率,但是我們很多時候可以把檢查放在存儲過程里,這樣有利于我們解讀這個存儲過程,和排錯。BEGIN TRANSACTION事務(wù)回滾開始檢查報錯IF ( ERROR 0 )BEGIN回滾操作ROLLBACK TRANSACTIONRAISERROR(刪除工作報告錯誤, 16, 3)RETURNEND結(jié)束事務(wù)COMMIT TRANSACTION好久沒有寫博文了,工作項目一個接一個,再加上公司人員流動,新人很多事情接不下來,加班成了家常便飯,倉促寫下這些希望對大家有幫助,不對的也歡迎指點,交流互相提高。

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!