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