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

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

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

    blog.Toby

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      130 隨筆 :: 2 文章 :: 150 評論 :: 0 Trackbacks

    inner,outer,left,right join

    SQL語句中的JION語句的認識- -

                                          

     

    jion 語句有三種,inner join, left outer join 和 right outer join 都可以簡寫,分別為jion,left join,right jion。
    jion語句可以用來組合兩個表中的記錄,只要在公共字段之中有相符的值即可,該語句聯合兩個表查詢得到的結果是可以添加新的數據,可以把它看成將兩個具有相關內容的表聯接在一起新生成的表,而一般的select 語句沒有這個功能。
    1)      內連接,inner join ... on
        語句格式:

        FROM (((表1 INNER JOIN 表2 ON 表1.字段號=表2.字段號) INNER JOIN 表3 ON 表1.字段號=表3.字段號) INNER JOIN 表4 ON Member.字段號=表4.字段號) INNER JOIN 表X ON Member.字段號=表X.字段號

         例子:

        SELECT *

        FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock

        ORDER BY MemberDate DESC

         內連接的功能是,把兩個表相關聯的記錄列出來,必須是相關聯的記錄。

       2)      左外連接,left outer join ... on

        語句格式:

          FROM [表名1] LEFT JOIN [表名2]

          ON [表名1.字段A] 〈關系運算符〉[表名2.字段B]

        其實LEFT JOIN 的功能就是將LEFT左邊的表名1中的所有記錄全部保留,而將右邊的表名2中的字段B與表名1.字段A相對應的記錄顯示出來(當使用SELECT * 時)。而RIGHT JOIN 和LEFT JOIN 相反。

         外連接的功能是,把LEFT左邊的表中的所有記錄保留,而右邊表只保留相關聯的記錄,也就是先執行一次INNER JOIN,然后把LEFT左邊的表中的與右邊表沒有任何關聯的記錄也保留,而右邊表的字段為null.

    3)      右外連接,right outer join ... on

        與 left join左右相反。

    4)      全連接,full join ... on(不常使用,只能用于outer)

         功能結合了以上三種聯軍,先執行一次inner join,然后把兩個表的多余字段都保留,但連接的對應字段為null.

    如果想將幾個表聯接起來,在JOIN操作中我們可以進行嵌套操作,有三個表:表1、表2、表3,現在將三個表聯接起來:

          FROM (表1 INNER JOIN 表2 ON 表1.序號=表2.序號)

           INNER JOIN 表3 ON 表1.序號=表3.序號

    =====================

    在一個正規化的數據庫環境中, 我們常會碰到這款情形: 所需的資料并不是放在同一個資料表中, 在這個時候, 你就要用到 Join
    當然 Join 如何將不同的數據庫的資料結合, 還要看你如何使用它, 一共有四種不同的 Join 的方式, 在這篇文章中我們將為你介紹 Inner Join 及 Outer Join 以及其應用
    Inner Join
    Inner Join 應該是最常用的 Join 方式, 它只會傳回符合 Join 規則的紀錄, 還是先來看看語法
    Select <要選擇的字段> From <主要資料表>
    <Join 方式> <次要資料表> [On <Join 規則>]
    現在我們利用 MS SQL 內建的北風數據庫來實際練習一下! 想多了解 MS SQL 的內建數據庫, 你可以看看 SQL Server 的內建數據庫 這篇文章
    請打開 QA (Query Analyzer), 為了使用北風數據庫, 請先執行 Use Northwind, 然后執行
    Select ProductId, ProductName, SupplierId From Products
    從 Products 產品資料表中取出三個字段, 分別是產品代碼, 產品名稱, 供貨商代碼, 但查詢出來的結果保證讓你的老板很不滿意, 因為供貨商代碼對于人類實在是無蝦米意義, 這個時候 Join 就可以幫上忙了, 藉由 Join Suppliers 這個資料表我們便可以查詢到供貨商名稱
    Select ProductId, ProductName, Suppliers.SupplierId
    From Products
    Inner Join Suppliers
    Products.Suppliers = Suppliers.SupplierId
    這款的查詢結果是不是卡清楚呢! Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是講 Join 規則不相符的資料就會被排除掉, 譬如講在 Product 中有一項產品的供貨商代碼 (SupplierId), 沒有出現在 Suppliers 資料表中, 那么這筆記錄便會被排除掉
    Outer Join
    這款的 Join 方式是一般人比較少用到的, 甚至有些 SQL 的管理者也從未用過, 這真是一件悲哀的代志, 因為善用 Outer Join 是可以簡化一些查詢的工作的, 先來看看 Outer Join 的語法
    Select <要查詢的字段> From <Left 資料表>
    <Left | Right> [Outer] Join <Right 資料表> On <Join 規則>
    語法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本質上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查詢結果會包含所有 Left 資料表的資料, 顛倒過來講, Right Outer Join 的查詢就會包含所有 Right 資料表的資料, 接下來我們還是來做些實際操作, 仍然是使用北風數據庫, 但要先做一些小小的修改, 才能達到我們要的結果
    首先要拿掉 Products 資料表的 Foreign Key, 否則沒有法度在 Products 資料表新增一筆 SupplierId 沒有對映到 Suppliers 資料表的紀錄, 要知影一個資料表的 Constraint 你可以執行 SQL 內建的 sp_helpconstraint , 在 QA 執行
    sp_helpconstraint Products
    接下來刪除 FK_Products_Suppliers 這個 Foreign Key
    Alter Table Products
    Drop Constraint FK_Products_Suppliers
    再來新增一筆紀錄于 Products 資料表, SupplierId 使用 50 是因為它并沒有對映到 Suppliers 資料表中的記錄
    Insert Into Products (ProductName,SupplierId,CategoryId)
    values ('Test Product','50','1')
    現在我們再執行頭前的查詢, 只是將 Inner Join 改為 Left Outer Join
    Select ProductId, ProductName, Suppliers.SupplierId
    From Products
    Left Outer Join Suppliers
    Products.Suppliers = Suppliers.SupplierId
    比較一下兩種 Join 方式的查詢結果, 你應該就會知影其中的差別!
    再來看看 Right Outer Join, 請新增下底這筆記錄
    Insert Into Suppliers (CompanyName)
    values ('LearnASP')
    現在請使用 Right Out Join 來作查詢, 比較看看查詢的結果和 Inner Join 有什么不同!
    尋找不相符紀錄
    這里我們來看看如何使用 Out Join 來找不相符紀錄, 可能是有子紀錄卻沒有父紀錄或是顛倒過來
    Select Suppliers.CompanyName From Products
    Right Join Suppliers
    On Products.SupplierId = Suppliers.SupplierId
    Where Products.SupplierId is Null
    執行結果你會找到一筆資料為 LearnASP, 該筆供貨商資料存在, 但基本上已經沒有產品是來自這個供貨商, 想象一下如果不用 Outer Join 你要怎么以一個 SQL 指令完成同一查詢結果! 知道 Outer Join 的好用了吧! 再執行
    Select Products.ProductName
    From Products
    Left Join Suppliers
    On Products.SupplierId = Suppliers.SupplierId
    Where Suppliers.SupplierId is Null
    這個查詢結果你會發現 Test Product 這項產品竟然找不到供貨商的資料!


    posted on 2008-05-27 11:24 渠上月 閱讀(628) 評論(0)  編輯  收藏 所屬分類: sql (sqlServer)
    主站蜘蛛池模板: 亚洲短视频男人的影院| 亚洲成a人片在线观看精品| 99re免费视频| 亚洲丰满熟女一区二区哦| 亚洲精品成人久久久| 99国产精品免费视频观看| 亚洲老熟女五十路老熟女bbw| 亚洲成A∨人片天堂网无码| 99精品视频在线观看免费播放 | 4399好看日本在线电影免费| 亚洲色大网站WWW永久网站| 亚洲中文字幕无码永久在线| 国产高清不卡免费在线| 免费无码一区二区| 国产久爱免费精品视频| 亚洲日本香蕉视频观看视频| 四虎免费永久在线播放| 1000部免费啪啪十八未年禁止观看 | 亚洲综合在线视频| 国产精品黄页在线播放免费| 人妻无码一区二区三区免费| 亚洲AV第一成肉网| 亚洲激情校园春色| 亚洲中久无码永久在线观看同| 青春禁区视频在线观看直播免费| 三级网站免费观看| 免费人成视频在线播放| 亚洲午夜电影在线观看| 亚洲精品乱码久久久久久自慰| 四虎免费大片aⅴ入口| 9277手机在线视频观看免费| 国产精品玖玖美女张开腿让男人桶爽免费看 | 美女啪啪网站又黄又免费| 亚洲理论片中文字幕电影| 亚洲欧洲日本在线| 在线a毛片免费视频观看| 永久在线观看www免费视频| 中国videos性高清免费| 亚洲av色香蕉一区二区三区 | 亚洲熟妇av一区二区三区下载 | 丝袜捆绑调教视频免费区|