2009年3月17日 星期二

關聯式代數 - 原始運算子與 SQL 的對應關係

關聯式資料庫的 SQL 語法是以關聯式代數作為基礎的。

以下就針對 E. F. Codd 這位大師對於關聯式代數的八個最原始的運算子,與 SQL 語法的對應關係作一個說明。

原始運算子:在這八個運算子裡面有五個運算子可稱為「原始運算子」,因為這些運算子無法以其他的運算子來定義他們的。
  1. Select:從一個 Table 中取出符合條件的資料,也就是取得 Row 的資料,請注意這裡的 Select 是運算子並不是指 SQL 語法中的 Select。
      取出的資料如下圖 Table 反白部分所示:

      Table ( T1 )
      C1C2C3C4
          
          
          
          
          

      對應的 SQL 語法:
      代碼:
      Select *
          From T1
          Where

  2. Project:從一個 Table 中取出所需要的欄位,也就是取得 Column 的資料。
      取出的資料如下圖 Table 反白部分所示:

      Table ( T1 )
      C1C2C3C4
          
          
          
          
          

      對應的 SQL 語法:請注意沒有條件篩選的設定。
      代碼:
      Select C1, C2
          From T1

  3. Cartesian Product:將兩個 Table 組合成一個 Table,這個是理論基礎上的運算子,在實務上是避免這種使用方式的。
      將 Table T1 與 Table T2 做 Cartesian Product 運算的結果如下,Table 中的資料為假設值。

      Table ( T1 )
      C11C12
      c11ac12a
      c11bc12b
      c11cc12c


      Table ( T2 )
      C21C22
      c21ac22a
      c21bc22b


      Table ( T1 ) 與 Table ( T2 ) 做 Cartesian Product 運算的結果
      C11C12C21C22
      c11ac12ac21ac22a
      c11ac12ac21bc22b
      c11bc12bc21ac22a
      c11bc12bc21bc22b
      c11cc12cc21ac22a
      c11cc12cc21bc22b

      對應的 SQL 語法:請注意沒有條件篩選的設定。
      代碼:
      Select *
          From T1, T2

  4. Union:從兩個 Table 中取出聯集的資料,重複的資料只取出一筆,請注意這裡的 Union 是運算子並不是指 SQL 語法中的 Union。
      將 Table T1 與 Table T2 做 Union 運算的結果如下,Table 中的資料為假設值。

      Table ( T1 )
      C1C2
      c1ac2a
      c1bc2b


      Table ( T2 )
      C1C2
      c1ac2a
      c1cc2c


      Table ( T1 ) 與 Table ( T2 ) 做 Union 運算的結果
      C1C2
      c1ac2a
      c1bc2b
      c1cc2c

      對應的 SQL 語法:要注意的是兩個 Table 間的對應欄位資料型態必須是相同或是可以轉換的。
      代碼:
      Select *
          From T1
      Union
      Select *
          From T2

  5. Difference:從一個 Table 中刪除另一個 Table 中有的資料,還是看圖示比較清楚。
      將 Table T1 與 Table T2 做 Difference 運算的結果如下,Table 中的資料為假設值。

      Table ( T1 )
      C1C2
      c1ac2a
      c1bc2b


      Table ( T2 )
      C1C2
      c1ac2a
      c1cc2c


      Table ( T1 ) 與 Table ( T2 ) 做 Difference 運算的結果
      C1C2
      c1bc2b

      對應的 SQL 語法:要注意的是兩個 Table 間的對應欄位資料型態必須是相同或是可以轉換的。
      代碼:
      Select *
          From T1
          Where not exists (
              Select *
                  From T2
                  Where T1.C1 = T2.C1 and T1.C2 = T2.C2 )

這就是關聯式代數八大運算子中,五個原始運算子的部分,下次再為大家介紹其他三個非原始運算子的內容。

本則專題由飛達客工作室提供