數據庫常見的三種join方式(收藏)

          數據庫常見的join方式有三種:inner join, left outter join, right outter join(還有一種full join,因不常用,本文不討論)。這三種連接方式都是將兩個以上的表通過on條件語句,拼成一個大表。以下是它們的共同點:

          ? 1. 關于左右表的概念。左表指的是在SQL語句中排在left join左邊的表,右表指的是排在left join右邊的表。
          ? 2. 在拼成的大表中,左表排在左邊,右表排在右邊。
          ? 3. on條件語句最好用=號對兩表相應的主外鍵進行連接。當然,也可以用其他操作符,如>, <, 來連接兩表的任一字段,此時的關系將非常復雜,連接后的記錄數也隨之而變得不確定。如果在一些特殊的場合中需要用到這種方式,必須通過簡單的實例加以確認,否則,連接結果很可能不是我們所想要的!
          ? 4. on條件語句不能省略。
          ? 5. 可以連鎖使用join,每次使用join都令另一表與當前的表或連接的結果相連接。


          在下文中,用到了兩個表,"部門"表與"組織"表,其中,"部門"表有一名為"組織編號"的外鍵,指向"組織"表中的主鍵"編號"。

          inner join

          ? 格式:select * from 部門 inner join 組織 on 部門.組織編號 = 組織.編號

          ? 目的:將兩表中符合on條件的所有記錄都找出來。

          ? 規律:

          ??? 1. 拼出的大表記錄不會增加。
          ??? 2. 如果左邊與右表的關系是一對多的關系,在選出的任一記錄中,假若右表有多個記錄與其對應,那么,連接后的左表,主鍵將不再唯一。

          ? 典型應用:將存在多關系的引用表放在左表,將存在一關系的被引用表放在右表,通過=號將主外鍵進行連接,通過對右表設定過濾條件,選出相應的且主鍵唯一的左表記錄。

          ? 備注:inner join 是默認的連接方式,可縮寫為join。

          ? 轉化為where子句:

          ??? select * from 部門, 組織 where 部門.組織編號 = 組織.編號

          ?

          left outter join

          ? 格式: select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號

          ? 格式: select * from 組織 left join 部門 on 組織.編號 = 部門.組織編號

          ? 目的:將左表的所有記錄列出,右表中只要符合on條件的,與左表記錄相拼合,不符合條件的,填以null值。

          ? 規律:

          ??? 1. 選出所有符合條件的左表,如果左邊與右表的關系是一對一的關系,則拼成的大表記錄不會改變。
          ?????? 如果左邊與右表的關系是多對一的關系,則拼成的大表記錄也不會改變。
          ?????? 如果左邊與右表的關系是一對多的關系,則拼成的大表記錄會增加。對于每一具有一對多關系的左表記錄,如果左表1:N與右表對應,那么會多出N-1條記錄。例如,如果左表第一條記錄1:3對應于右表,多出2條記錄。如果左表第二條記錄1:2對應于右表,則再多出1條記錄。這樣,總共多出3條記錄。其他類推。
          ??? 2. 如果左邊與右表的關系是一對多的關系,在選出的任一記錄中,假若右表有多個記錄與其對應,那么,連接后的左表,主鍵將不再唯一。
          ??? 3. 如果左邊與右表的關系是一對多的關系,對于左表任一記錄,如果右表沒有記錄與其相對應,則全部填以null值。

          ? 典型應用:將存在多關系的引用表放在左表,將存在一關系的被引用表放在右表,通過對右表設定過濾條件,選出相應的且主鍵唯一的左表記錄。

          ? 備注:left outter join可用left join代替。在有些數據庫中,如HSqlDb, 只能使用left join而不能使用left outter join。

          ? 轉化為where子句:

          ??? select * from 部門, 組織 where 部門.組織編號 = 組織.編號


          right outter join

          ? 格式: select * from 部門 right join 組織 on 部門.組織編號 = 組織.編號

          ? 格式: select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號

          ? 目的:將右表的所有記錄列出,左表中只要符合on條件的,與右表記錄相拼合,不符合條件的,填以null值。

          ? 規律:(與left outter join相反)

          ? 典型應用:可轉化成left outter join。例如

          ??? select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號
          ??? 與
          ??? select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號
          ??? 的效果一樣

          ? 備注:right outter join可用right join代替。在有些數據庫中,如HSqlDb, 沒有實現right join功能。

          ? 轉化為where子句:

          ??? select * from 部門, 組織 where 部門.組織編號 = 組織.編號

          posted on 2006-05-18 09:43 beyondduke 閱讀(5860) 評論(1)  編輯  收藏 所屬分類: 編程隨筆

          評論

          # re: 數據庫常見的三種join方式(收藏) 2007-02-12 12:28 曲奇

          好像只有第一種才能轉為where子句的條件吧
          left 和 right都不可以  回復  更多評論   

          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          公告


          MSN聯系

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          我的連接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 句容市| 清涧县| 吉木乃县| 德州市| 玛纳斯县| 枞阳县| 来宾市| 普格县| 商洛市| 专栏| 临猗县| 阿坝| 邢台市| 祁连县| 仁寿县| 高密市| 莱西市| 黄浦区| 许昌县| 清苑县| 镇原县| 辽源市| 韩城市| 丰镇市| 怀集县| 手游| 定南县| 盐源县| 容城县| 胶州市| 巨野县| 平塘县| 聂荣县| 太保市| 静海县| 稷山县| 安多县| 嘉鱼县| 鹰潭市| 东乌珠穆沁旗| 鹤山市|