1. 程式人生 > 其它 >Task 04: 集合運算

Task 04: 集合運算

技術標籤:mysql

4.1 表的加減法
4.1.1 什麼是集合運算
4.1.2 表的加法–UNION

練習題 :

分別使用 UNION 或者 OR 謂詞,找出毛利率不足 30%或毛利率未知的商品.

參考答案:

– 使用 OR 謂詞

SELECT * 
  FROM Product 
 WHERE sale_price / purchase_price < 1.3 
    OR sale_price / purchase_price IS NULL;

– 使用 UNION

SELECT * 
  FROM Product 
 WHERE sale_price / purchase_price <
1.3 UNION SELECT * FROM Product WHERE sale_price / purchase_price IS NULL;

練習題:

找出 Product 和 Product2 中售價高於 500 的商品的基本資訊.

SELECT *
  FROM product
 WHERE sale_price > 500
 UNION
SELECT *
  FROM product2
 WHERE sale_price > 500;

練習題:

商店決定對product表中利潤低於50%和售價低於1000的商品提價, 請使用UNION ALL 語句將分別滿足上述兩個條件的結果取並集. 查詢結果類似下表:

在這裡插入圖片描述
答:

SELECT * 
  FROM Product 
 WHERE sale_price < 1000
 UNION ALL
SELECT * 
  FROM Product 
 WHERE sale_price > 1.5 * purchase_price

4.1.3 MySQL 8.0 不支援交運算INTERSECT

4.1.4 差集,補集與表的減法

練習題:

找出只存在於Product表但不存在於Product2表的商品.

-- 使用 IN 子句的實現方法
SELECT * 
  FROM Product
 WHERE product_id NOT IN (SELECT product_id 
                            FROM
Product2)

練習題:

使用NOT謂詞進行集合的減法運算, 求出Product表中, 售價高於2000,但利潤低於30%的商品, 結果應該如下表所示.

在這裡插入圖片描述
答:

SELECT * 
  FROM Product
 WHERE sale_price > 2000 
   AND product_id NOT IN (SELECT product_id 
                            FROM Product 
                           WHERE sale_price<1.3*purchase_price)

練習題:

使用AND謂詞查詢product表中利潤率高於50%,並且售價低於1500的商品,查詢結果如下所示.
在這裡插入圖片描述
答:

SELECT * 
  FROM Product
 WHERE sale_price > 1.5 * purchase_price 
   AND sale_price < 1500

4.1.5 對稱差

練習題:

使用Product表和Product2表的對稱差來查詢哪些商品只在其中一張表, 結果類似於:
在這裡插入圖片描述
– 使用 NOT IN 實現兩個表的差集
SELECT *
FROM Product
WHERE product_id NOT IN (SELECT product_id FROM Product2)
UNION
SELECT *
FROM Product2
WHERE product_id NOT IN (SELECT product_id FROM Product)

4.2 連結(JOIN)
4.2.1 內連結(INNER JOIN)

練習題:

每個商店中, 售價最高的商品的售價分別是多少?

答案:

SELECT SP.shop_id
      ,SP.shop_name
      ,MAX(P.sale_price) AS max_price
  FROMshopproduct AS SP
 INNER JOINproduct AS P
    ON SP.product_id = P.product_id
 GROUP BY SP.shop_id,SP.shop_name

4.2.2 外連結(OUTER JOIN)
4.2.3 多表連結
4.2.4 ON 子句進階–非等值連結
4.2.5 交叉連結—— CROSS JOIN(笛卡爾積)
4.2.6 連結的特定語法和過時語法