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

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

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

    隨筆-204  評論-149  文章-0  trackbacks-0
    使用關系代數合并數據
    1 關系代數
    合并數據集合的理論基礎是關系代數,它是由E.F.Codd于1970年提出的。
    在關系代數的形式化語言中:
            用表、或者數據集合表示關系或者實體。
            用行表示元組。
             用列表示屬性。
    關系代數包含以下8個關系運算符
            選取――返回滿足指定條件的行。
             投影――從數據集合中返回指定的列。
             笛卡爾積――是關系的乘法,它將分別來自兩個數據集合中的行以所有可能的方式進行組合。
             并――關系的加法和減法,它可以在行的方向上合并兩個表中的數據,就像把一個表壘在另一個表之上一樣。
             交――返回兩個數據集合所共有的行。
             差――返回只屬于一個數據集合的行。
             連接――在水平方向上合并兩個表,其方法是:將兩個表中在共同數據項上相互匹配的那些行合并起來。
             除――返回兩個數據集之間的精確匹配。
    此外,作為一種實現現代關系代數運算的方法,SQL還提供了:
             子查詢――類似于連接,但更靈活;在外部查詢中,方式可以使用表達式、列表或者數據集合的地方都可以使用子查詢的結果。
    本章將主要講述多種類型的連接、簡單的和相關的子查詢、幾種類型的并、關系除以及其他的內容。
    2 使用連接
    2.1 連接類型
    在關系代數中,連接運算是由一個笛卡爾積運算和一個選取運算構成的。首先用笛卡爾積完成對兩個數據集合的乘運算,然后對生成的結果集合進行選取運算,確保 只把分別來自兩個數據集合并且具有重疊部分的行合并在一起。連接的全部意義在于在水平方向上合并兩個數據集合(通常是表),并產生一個新的結果集合,其方 法是將一個數據源中的行于另一個數據源中和它匹配的行組合成一個新元組。
    SQL提供了多種類型的連接方式,它們之間的區別在于:從相互交疊的不同數據集合中選擇用于連接的行時所采用的方法不同。
    連接類型         定義
    內連接         只連接匹配的行
    左外連接         包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
    右外連接         包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
    全外連接         包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
    (H)(theta)連接         使用等值以外的條件來匹配左、右兩個表中的行
    交叉連接         生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配
    在INFORMIX中連接表的查詢
    如果FROM子句指定了多于一個表引用,則查詢會連接來自多個表的行。連接條件指定各列之間(每個表至少一列)進行連接的關系。因為正在比較連接條件中的列,所以它們必須具有一致的數據類型。
    SELECT語句的FROM子句可以指定以下幾種類型的連接
    FROM子句關鍵字         相應的結果集
    CROSS JOIN         笛卡爾乘積(所有可能的行對)
    INNER JOIN         僅對滿足連接條件的CROSS中的列
    LEFT OUTER JOIN         一個表滿足條件的行,和另一個表的所有行
    RIGHT OUTER JOIN         與LEFT相同,但兩個表的角色互換
    FULL OUTER JOIN        LEFT OUTER 和 RIGHT OUTER中所有行的超集

    2.2 內連接(Inner Join
    內連接是最常見的一種連接,它頁被稱為普通連接,而E.FCodd最早稱之為自然連接。
    下面是ANSI SQL-92標準
    select *
    from   t_institution i
    inner join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = "5801"
    其中inner可以省略。
    等價于早期的連接語法
    select *
    from t_institution i, t_teller t
    where i.inst_no = t.inst_no
    and i.inst_no = "5801"

    2.3 外連接
    2.3.1         左外連接(Left Outer Jion)
    select *
    from   t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    其中outer可以省略。
    2.3.2         右外連接(Rigt Outer Jion)
    select *
    from   t_institution i
    right outer join t_teller t
    on i.inst_no = t.inst_no
    2.3.3         全外連接(Full Outer)
    全外連接返回參與連接的兩個數據集合中的全部數據,無論它們是否具有與之相匹配的行。在功能上,它等價于對這兩個數據集合分別進行左外連接和右外連接,然后再使用消去重復行的并操作將上述兩個結果集合并為一個結果集。
    在現實生活中,參照完整性約束可以減少對于全外連接的使用,一般情況下左外連接就足夠了。在數據庫中沒有利用清晰、規范的約束來防范錯誤數據情況下,全外連接就變得非常有用了,你可以使用它來清理數據庫中的數據。
    select *
    from   t_institution i
    full outer join t_teller t
    on i.inst_no = t.inst_no
    2.3.4         外連接與條件配合使用
    當在內連接查詢中加入條件是,無論是將它加入到join子句,還是加入到where子句,其效果是完全一樣的,但對于外連接情況就不同了。當把條件加入到join子 句時,SQL Server、Informix會返回外連接表的全部行,然后使用指定的條件返回第二個表的行。如果將條件放到where子句 中,SQL Server將會首先進行連接操作,然后使用where子句對連接后的行進行篩選。下面的兩個查詢展示了條件放置位子對執行結果的影響:
    條件在join子句
    select *
    from   t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    and i.inst_no = “5801”
    結果是:
    inst_no     inst_name             inst_no     teller_no   teller_name
    5801        天河區                5801        0001        tom
    5801        天河區                5801        0002        david
    5802        越秀區
    5803        白云區
    條件在where子句
    select *
    from   t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = “5801”
    結果是:
    inst_no     inst_name             inst_no     teller_no   teller_name
    5801        天河區                5801        0001        tom
    5801        天河區                5801        0002        david

    2.4 自身連接
    自身連接是指同一個表自己與自己進行連接。這種一元連接通常用于從自反關系(也稱作遞歸關系)中抽取數據。例如人力資源數據庫中雇員與老板的關系。
    下面例子是在機構表中查找本機構和上級機構的信息。
    select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
    from t_institution i
    join t_institution s
    on i.superior_inst = s.inst_no

    結果是:
    superior_inst sup_inst_name         inst_no     inst_name
    800            廣州市                5801        天河區
    800            廣州市                5802        越秀區
    800            廣州市                5803        白云區

    2.5 交叉(無限制) 連接
    交叉連接用于對兩個源表進行純關系代數的乘運算。它不使用連接條件來限制結果集合,而是將分別來自兩個數據源中的行以所有可能的方式進行組合。數據集合中 一的每個行都要與數據集合二中的每一個行分別組成一個新的行。例如,如果第一個數據源中有5個行,而第二個數據源中有4個行,那么在它們之間進行交叉連接 就會產生20個行。人們將這種類型的結果集稱為笛卡爾乘積。
    大多數交叉連接都是由于錯誤操作而造成的;但是它們卻非常適合向數據庫中填充例子數據,或者預先創建一些空行以便為程序執行期間所要填充的數據保留空間。
    select *
    from   t_institution i
    cross join t_teller t
    在交叉連接中沒有on條件子句
    posted on 2009-07-24 18:26 Frank_Fang 閱讀(483) 評論(0)  編輯  收藏 所屬分類: SSH+JQuery+DWR
    主站蜘蛛池模板: 国产亚洲精品美女| 久爱免费观看在线网站| 狠狠色婷婷狠狠狠亚洲综合| 999zyz**站免费毛片| 久久精品私人影院免费看| 亚洲Av熟妇高潮30p| 女人18特级一级毛片免费视频| 美女裸免费观看网站| 亚洲人成网址在线观看| 在线免费观看一区二区三区| caoporn成人免费公开| 亚洲国产成人久久综合一区| 又黄又爽的视频免费看| 69视频免费观看l| 亚洲AV中文无码字幕色三| 免费可以看黄的视频s色| 色吊丝免费观看网站| 亚洲狠狠久久综合一区77777| 成人性生活免费视频| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲美女大bbbbbbbbb| 国产免费午夜a无码v视频| 亚洲乱码无限2021芒果| 亚洲免费视频一区二区三区| 国产免费不卡视频| 一级成人毛片免费观看| 77777午夜亚洲| 亚洲国产精品无码久久久蜜芽| 手机在线免费视频| 外国成人网在线观看免费视频| 色婷婷六月亚洲综合香蕉| 亚洲国产精品人久久| 国产成人精品曰本亚洲79ren| 亚洲性线免费观看视频成熟| 久草免费福利在线| 丰满亚洲大尺度无码无码专线| 久久99亚洲网美利坚合众国| 久久乐国产精品亚洲综合| 成在人线AV无码免费| 亚洲一级毛片免费观看| 野花香高清视频在线观看免费|