1. 程式人生 > 實用技巧 >SQL:七 集合運算

SQL:七 集合運算

表的加減法

什麼是集合運算

  • 集合在數學領域表示“(各種各樣的)事物的總和”,在資料庫領域表示記錄的集合
  • 表、檢視和查詢的執行結果都是記錄的集合
  • 集合運算,就是對滿足同一規則的記錄進行的加減等四則運算
  • 進行集合運算的運算子稱為集合運算子

表的加法

  • UNION(並集)
  • 集合運算子會除去重複的記錄
  • -- 使用UNION對錶進行加法運算 
    SELECT product_id, product_name  
    FROM Product 
    UNION 
    SELECT product_id, product_name  
    FROM Product2;

集合運算的注意事項

  • ①作為運算物件的記錄的列數必須相同
  • ②作為運算物件的記錄中列的型別必須一致
  • ③可以使用任何SELECT語句,但ORDER BY子句只能在最後使用一次
  • -- 列數不一致時會發生錯誤 
    SELECT product_id, product_name  
    FROM Product 
    UNION 
    SELECT product_id, product_name, sale_price  
    FROM Product2;
    
    -- 資料型別不一致時會發生錯誤 
    SELECT product_id, sale_price  
    FROM Product 
    UNION 
    SELECT product_id, regist_date  
    FROM
    Product2; -- ORDER BY子句只在最後使用一次 SELECT product_id, product_name FROM Product WHERE product_type = '廚房用具' UNION SELECT product_id, product_name FROM Product2 WHERE product_type = '廚房用具' ORDER BY product_id;

包含重複行的集合運算

  • ALL選項
  • 在集合運算子中使用ALL選項,可以保留重複行
  • -- 保留重複行 
    SELECT product_id, product_name  
    
    FROM Product UNION ALL SELECT product_id, product_name FROM Product2;

選取表中公共部分

  • INTERSECT(交集)
  • INTERSECT 應用於兩張表,選取出它們當中的公共記錄
  • -- 使用INTERSECT選取出表中公共部分
    SELECT product_id, product_name  
    FROM Product 
    INTERSECT 
    SELECT product_id, product_name  
    FROM Product2 
    ORDER BY product_id;

記錄的減法

  • EXCEPT(差 集)
  • 減法運算中減數和被減數的位置不同,所得到的結果也不相同
  • -- 使用EXCEPT對記錄進行減法運算
    SELECT product_id, product_name  
    FROM Product 
    EXCEPT 
    SELECT product_id, product_name  
    FROM Product2 
    ORDER BY product_id;

聯結(以列為單位對錶進行聯結)

什麼是聯結

  • 聯結(JOIN)運算
  • 將其他表中的 列新增過來,進行“新增列”的運算
  • 實際上,期望得到的資料往往會分散在不同的表之中。使用聯結就可以從多張表(3 張以上的表也沒關係) 中選取資料了

內聯結

  • INNER JOIN

  • 所謂聯結運算,以A中的列作為橋樑,將 B中滿 足同樣條件的列彙集到同一結果之中

  • 內聯結要點

    • ①FROM子句

      • FROM ShopProduct AS SP INNER JOIN Product AS P
      • 進行聯結時需要在FROM子句中使用多張表
    • ②ON子句

      • ON SP.product_id = P.product_id
      • 在 ON 之後指定兩張表聯結所使用的列(聯結鍵)
      • 進行內聯結時必須使用ON子句,並且要書寫在FROM和WHERE之間
    • ③SELECT子句

      • SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
      • 使用聯結時SELECT子句中的列需要按照“<表的別名>.<列名>”的格式進行書寫
  • 內聯結和WHERE子句結合使用

    • 聯結運算將滿足相同規則的表聯結起來時,WHERE、 GROUP BY、HAVING、ORDER BY 等工具都可以正常使用
    • 將聯結之後的結果想象為新創建出來的一張表,對這張表使用 WHERE 子句等工具
    • 這張“表”只在 SELECT 語句執行期間存在,SELECT 語 句執行之後就會消失。如果希望繼續使用這張“表”,將它建立成檢視
-- 將兩張表進行內聯結
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price  
FROM ShopProduct AS SP INNER JOIN Product AS P 
ON SP.product_id = P.product_id;

-- 內聯結和WHERE子句結合使用
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price  
FROM ShopProduct AS SP INNER JOIN Product AS P 
ON SP.product_id = P.product_id 
WHERE SP.shop_id = '000A';

外聯結

  • OUTER JOIN

  • 外聯結要點

    • ①選取出單張表中全部的資訊

    • ②每張表都是主表嗎

      • 把哪張表作為主表,最終的結果中會包含主表內所有的資料

      • 指定主表的關鍵字是 LEFT 和 RIGHT

        • 使用LEFT 時FROM 子句中寫在左側的表是主表,使用RIGHT 時右側的表是主表
  • 3張以上的表的聯結

  • 交叉聯結

    • CROSS JOIN(笛卡 兒積)

      • 對滿足相同規則的表進行交叉聯結的集合運算子
    • 進行交叉聯結時無法使用內聯結和外聯結中所使用的ON 子句, 這是因為交叉聯結是對兩張表中的全部記錄進行交叉組合,因此結果中 的記錄數通常是兩張表中行數的乘積

  • 聯結的特定語法和過時語法

    • 對於聯結的過時語法和特定語法,雖然不建議使用,但還是希望能夠讀懂。
-- 將兩張表進行外聯結
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,  P.sale_price  
FROM ShopProduct AS SP RIGHT OUTER JOIN Product AS P 
ON SP.product_id = P.product_id;

-- 對3張表進行內聯結
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price, IP.inventory_quantity  
FROM ShopProduct AS SP INNER JOIN Product AS P 
ON SP.product_id = P.product_id
          INNER JOIN InventoryProduct AS IP
             ON SP.product_id = IP.product_id 
WHERE IP.inventory_id = 'P001';

-- 將兩張表進行交叉聯結
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name  FROM ShopProduct AS SP CROSS JOIN Product AS P;

-- 使用過時語法的內聯結
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price  
FROM ShopProduct SP, Product P 
WHERE SP.product_id = P.product_id   
AND SP.shop_id = '000A';