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

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

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

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

    2.2 內(nèi)連接(Inner Join
    內(nèi)連接是最常見(jiàn)的一種連接,它頁(yè)被稱(chēng)為普通連接,而E.FCodd最早稱(chēng)之為自然連接。
    下面是ANSI SQL-92標(biāo)準(zhǔn)
    select *
    from   t_institution i
    inner join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = "5801"
    其中inner可以省略。
    等價(jià)于早期的連接語(yǔ)法
    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)
    全外連接返回參與連接的兩個(gè)數(shù)據(jù)集合中的全部數(shù)據(jù),無(wú)論它們是否具有與之相匹配的行。在功能上,它等價(jià)于對(duì)這兩個(gè)數(shù)據(jù)集合分別進(jìn)行左外連接和右外連接,然后再使用消去重復(fù)行的并操作將上述兩個(gè)結(jié)果集合并為一個(gè)結(jié)果集。
    在現(xiàn)實(shí)生活中,參照完整性約束可以減少對(duì)于全外連接的使用,一般情況下左外連接就足夠了。在數(shù)據(jù)庫(kù)中沒(méi)有利用清晰、規(guī)范的約束來(lái)防范錯(cuò)誤數(shù)據(jù)情況下,全外連接就變得非常有用了,你可以使用它來(lái)清理數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
    select *
    from   t_institution i
    full outer join t_teller t
    on i.inst_no = t.inst_no
    2.3.4         外連接與條件配合使用
    當(dāng)在內(nèi)連接查詢(xún)中加入條件是,無(wú)論是將它加入到join子句,還是加入到where子句,其效果是完全一樣的,但對(duì)于外連接情況就不同了。當(dāng)把條件加入到join子 句時(shí),SQL Server、Informix會(huì)返回外連接表的全部行,然后使用指定的條件返回第二個(gè)表的行。如果將條件放到where子句 中,SQL Server將會(huì)首先進(jìn)行連接操作,然后使用where子句對(duì)連接后的行進(jìn)行篩選。下面的兩個(gè)查詢(xún)展示了條件放置位子對(duì)執(zhí)行結(jié)果的影響:
    條件在join子句
    select *
    from   t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    and i.inst_no = “5801”
    結(jié)果是:
    inst_no     inst_name             inst_no     teller_no   teller_name
    5801        天河區(qū)                5801        0001        tom
    5801        天河區(qū)                5801        0002        david
    5802        越秀區(qū)
    5803        白云區(qū)
    條件在where子句
    select *
    from   t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = “5801”
    結(jié)果是:
    inst_no     inst_name             inst_no     teller_no   teller_name
    5801        天河區(qū)                5801        0001        tom
    5801        天河區(qū)                5801        0002        david

    2.4 自身連接
    自身連接是指同一個(gè)表自己與自己進(jìn)行連接。這種一元連接通常用于從自反關(guān)系(也稱(chēng)作遞歸關(guān)系)中抽取數(shù)據(jù)。例如人力資源數(shù)據(jù)庫(kù)中雇員與老板的關(guān)系。
    下面例子是在機(jī)構(gòu)表中查找本機(jī)構(gòu)和上級(jí)機(jī)構(gòu)的信息。
    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

    結(jié)果是:
    superior_inst sup_inst_name         inst_no     inst_name
    800            廣州市                5801        天河區(qū)
    800            廣州市                5802        越秀區(qū)
    800            廣州市                5803        白云區(qū)

    2.5 交叉(無(wú)限制) 連接
    交叉連接用于對(duì)兩個(gè)源表進(jìn)行純關(guān)系代數(shù)的乘運(yùn)算。它不使用連接條件來(lái)限制結(jié)果集合,而是將分別來(lái)自?xún)蓚€(gè)數(shù)據(jù)源中的行以所有可能的方式進(jìn)行組合。數(shù)據(jù)集合中 一的每個(gè)行都要與數(shù)據(jù)集合二中的每一個(gè)行分別組成一個(gè)新的行。例如,如果第一個(gè)數(shù)據(jù)源中有5個(gè)行,而第二個(gè)數(shù)據(jù)源中有4個(gè)行,那么在它們之間進(jìn)行交叉連接 就會(huì)產(chǎn)生20個(gè)行。人們將這種類(lèi)型的結(jié)果集稱(chēng)為笛卡爾乘積。
    大多數(shù)交叉連接都是由于錯(cuò)誤操作而造成的;但是它們卻非常適合向數(shù)據(jù)庫(kù)中填充例子數(shù)據(jù),或者預(yù)先創(chuàng)建一些空行以便為程序執(zhí)行期間所要填充的數(shù)據(jù)保留空間。
    select *
    from   t_institution i
    cross join t_teller t
    在交叉連接中沒(méi)有on條件子句
    posted on 2009-07-24 18:26 Frank_Fang 閱讀(483) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): SSH+JQuery+DWR
    主站蜘蛛池模板: 浮力影院亚洲国产第一页| 日韩免费观看视频| 亚洲中文字幕无码日韩| 真人无码作爱免费视频| 四虎国产精品成人免费久久| 日韩电影免费在线观看视频| 亚洲最大无码中文字幕| 四虎影院在线免费播放| 日本中文一区二区三区亚洲| 老司机亚洲精品影院在线观看 | 亚洲一区二区三区久久| 免费人成大片在线观看播放| 57pao国产成视频免费播放| 亚洲嫩草影院久久精品| 9277手机在线视频观看免费| 亚洲Av无码国产情品久久| 亚洲成aⅴ人片在线影院八| fc2免费人成为视频| 国产亚洲无线码一区二区| 曰批全过程免费视频免费看 | 免费成人在线电影| 免费国产在线观看老王影院| 国产精品亚洲专区在线播放| 中文字幕亚洲不卡在线亚瑟| 91av在线免费视频| 亚洲人成网站在线在线观看| 99久久久国产精品免费牛牛四川| 亚洲日本乱码一区二区在线二产线 | 亚洲av麻豆aⅴ无码电影 | 最近中文字幕电影大全免费版| 亚洲制服在线观看| 久久久精品2019免费观看| 亚洲另类精品xxxx人妖| 国产视频精品免费| a级毛片毛片免费观看永久| 久久精品国产亚洲av麻豆小说 | 欧美大尺寸SUV免费| 亚洲人成片在线观看| 国产又黄又爽又刺激的免费网址| 久久er国产精品免费观看8| 久久夜色精品国产噜噜噜亚洲AV|