<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    SQL進階學習筆記

    Posted on 2007-09-08 13:20 久城 閱讀(3311) 評論(1)  編輯  收藏 所屬分類: 數(shù)據(jù)庫學習

    聽了一堂SQL課,受益良多,做下筆記。

    SQL語句的執(zhí)行計劃

    慚愧啊,這個名詞我今天還是第一次接觸,這大概已經(jīng)是常識了吧呵呵。

    沒有太深的研究,暫時想是這樣的,每一種數(shù)據(jù)庫服務(wù)器在執(zhí)行一條SQL語句的時候,首先都要解析這條SQL語句,每種數(shù)據(jù)庫服務(wù)器的解析方式是不一樣的,這樣,制定出來的執(zhí)行計劃也就是不一樣的。服務(wù)器通常都會在執(zhí)行前通過某種算法(優(yōu)化器)計算出很多種執(zhí)行計劃,然后選擇其中它認為是最優(yōu)的一種進行執(zhí)行。

    學會查看SQL語句的執(zhí)行計劃,有助于清晰的理解SQL語句的執(zhí)行過程,特別是對SQL語句進行優(yōu)化的時候,會有很大的幫助。

    外連接

    SELECT table1.column, table2.column
    FROM table1, table2
    WHERE table1.column(+= table2.column

    如上所示,即左外連接,表示左邊的內(nèi)容有可能不全。當不全的時候,結(jié)果用空來代替。

    理解外連接:相當于兩個循環(huán)嵌套。
    for table2.column
        
    // 遍歷table2中的每一列
        
    // 把內(nèi)容全的放在最外層循環(huán)
        for table1.column
        
    // 數(shù)據(jù)庫的具體執(zhí)行內(nèi)容

    全外連接,相當于左外連接和右外連接的并集。

    子查詢

    不相關(guān)子查詢:子查詢中,不涉及外層表中的數(shù)據(jù)。如:
    SELECT list
    FROM table a
    WHERE a.f1 = ( SELECT b.f2
                   
    FROM table b
                   
    WHERE b.f3 = 'hello')

    不相關(guān)子查詢理解:先執(zhí)行子查詢,再執(zhí)行外層查詢。

    相關(guān)子查詢:子查詢中,涉及到外層表中的數(shù)據(jù)。如:
    SELECT list
    FROM table a
    WHERE a.f1 = ( SELECT b.f2
                   
    FROM table b
                   
    WHERE b.f3 = a.f4)

    相關(guān)子查詢理解:同樣是兩個循環(huán)的嵌套,如下:
    for a
        
    // 遍歷表a中的每一行
        for b
        
    // 遍歷表b中的每一行
         
    // 執(zhí)行b.f3 = a.f4的查詢,返回查詢結(jié)果b.f2
        
    // 這里查詢結(jié)果如果為多條,oracle中會報錯
        end for;
        
    // 執(zhí)行a.f1 = b.f2的查詢
    end for;

    PS: a.f1 = (select語句),這個屬于SQL3中的表表達式,select中可以返回多條記錄,Oracle中不支持這種寫法,所以當select語句返回多條記錄的時候,會報錯。但是DB2支持。

    多行子查詢:子查詢返回多行記錄,一般和IN, ANY, ALL, EXISTS配合使用。如:
    SELECT list
    FROM table a
    WHERE a.f1 IN ( SELECT b.f2
                    
    FROM table b
                    
    WHERE b.f3 = a.f4 )


    理解多行子查詢:a.f1會和子查詢結(jié)果中的每一個數(shù)據(jù)進行一次匹配循環(huán),所以,這里值得注意的是:
    1. IN和EXISTS的執(zhí)行計劃正好相反。用IN時,子查詢?yōu)閮?nèi)層循環(huán),用EXISTS時,子查詢?yōu)橥鈱友h(huán)。
    2. 用IN時,子查詢的返回條數(shù)不要太多,一般幾十個已經(jīng)夠多了,如果過百的話.....呵呵.....

    Top-N查詢

    SELECT [column_list] ROWNUM
    FROM ( SELECT [column_list]
           
    FROM table
           
    ORDER BY Top-N_column )
    WHERE ROWNUM <= N;


    這里有個值得注意的地方就是,一定要先排序,再取Top-N。兩個不要寫在一起。

    PS: SQL服務(wù)器從來都不保證解析出來的數(shù)據(jù)是有次序的,雖然我們不寫ORDER BY查詢時,每次查詢結(jié)果的次序幾乎都是一樣的,但是,不能被表象所迷惑,這是不穩(wěn)定的次序。

    游標

    以前理解游標只是一種變量類型,如果把它看成是一種語句執(zhí)行方式的話,那么任何的SQL語句都是用游標的形式執(zhí)行的。

    游標變量
    1. Strong 類型,即強類型。也許是我接觸的比較少,還沒發(fā)現(xiàn)有什么用,該類型游標變量必須指定游標的類型,對游標的使用進行了限制。
    2. Weak類型,即弱類型。經(jīng)常用,使用起來比較靈活,可以存儲任意的返回類型。既然靈活,我想,也許會多少占用一些內(nèi)存吧,還沒深入研究。

    異常

    預(yù)先知道的一些異常,最好不要寫在最后的異常捕獲里。

    比如,SELECT a INTO b FROM c. 如果a為null的話,會報no data found異常。象這樣的,我們往往接受為null的情況,不想用異常來捕獲,可以用兩種方法來處理:
    1. 使用游標
    FETCH ... INTO...的時候,即使為空,也不會出異常,會繼續(xù)執(zhí)行下面的語句。
    2. 使用PL/SQL塊
    BEGIN
      ...
      EXCEPTION
      // 進行局部異常處理
    END;


    關(guān)于優(yōu)化

    這個地方聽的我就很迷糊了,很多概念都很模糊,先記錄下。

    任何一個SQL語句傳到數(shù)據(jù)庫的服務(wù)端都會被解析成一個執(zhí)行樹,每個節(jié)點是一個函數(shù)。

    對表的處理只有兩種處理方式,全表掃描和使用索引。

    當返回值達到N時,使用全表掃描,也就是把數(shù)據(jù)全讀到內(nèi)存中一一進行處理。這里N的值,很多因素影響,一直都有變化,曾經(jīng)是20%,可做參考。

    當返回值小于N時,使用索引進行掃描。

    索引就是一個B+樹,和表密切相關(guān)。在執(zhí)行delete操作的時候,索引并不被刪除,而是用某個標識標識無效,所以,當對某個有索引的表的insert,delete操作比較頻繁的時候,索引很有可能變得很龐大,這個時候就要考慮到對索引的維護。
    這里索引的用法我還有很多地方迷惑,保留做以后研究。

    歡迎來訪!^.^!
    本BLOG僅用于個人學習交流!
    目的在于記錄個人成長.
    所有文字均屬于個人理解.
    如有錯誤,望多多指教!不勝感激!

    Feedback

    # re: SQL進階學習筆記  回復  更多評論   

    2007-09-09 13:39 by 忘了哭
    技術(shù)就是技術(shù),日語是沒有辦法的工具,如果不是必要,請不要放在一起!
    學習的筆記的整理能力值得學習,可以用日語結(jié)束,減,減,減- - :)

    本評論僅用于個人溝通交流!
    目的在于督觸個人成長.
    所有文字均屬于個人理解.
    如有錯誤,望多多指教!不勝感激!

    Copyright © 久城

    主站蜘蛛池模板: 亚洲国产AV无码一区二区三区| 亚洲美女视频一区| 亚洲AV综合永久无码精品天堂| 99久久久精品免费观看国产 | 免费播放春色aⅴ视频| 亚洲午夜精品一区二区麻豆| 野花高清在线观看免费3中文 | 曰批免费视频播放在线看片二| 国产免费69成人精品视频| 亚洲av综合日韩| 亚洲国产精品综合久久网络| 一个人看的www免费在线视频| 亚洲一区二区三区无码影院| 国产精品成人免费观看| 亚洲成A∨人片在线观看不卡| 免费毛片a线观看| 亚洲精品一区二区三区四区乱码| 日本一区二区免费看| 亚洲福利视频一区二区三区| 黄页免费的网站勿入免费直接进入 | 91嫩草免费国产永久入口| 亚洲av无码电影网| 国产精品成人无码免费| 久久久久久久久久久免费精品| 亚洲精品无码高潮喷水在线| 久久99国产乱子伦精品免费| 亚洲人成网网址在线看| 啊v在线免费观看| 三上悠亚在线观看免费| 亚洲白色白色永久观看| 色www永久免费视频| 国产精品免费久久| 亚洲国产美女视频| 免费v片在线观看品善网| 免费人成网站在线观看不卡| 亚洲乱色伦图片区小说| 综合亚洲伊人午夜网| 美女网站免费福利视频| 国产免费伦精品一区二区三区| 久久水蜜桃亚洲av无码精品麻豆| 黑人粗长大战亚洲女2021国产精品成人免费视频 |