使用關系代數合并數據 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 * |