Table:?Product
+--------------+---------+
| Column Name ?| Type ? ?|
+--------------+---------+
| product_id ? | int ? ? |
| product_name | varchar |
| unit_price ? | int ? ? |
+--------------+---------+
product_id 是這張表的主鍵
Table:?Sales
+-------------+---------+
| Column Name | Type ? ?|
+-------------+---------+
| seller_id ? | int ? ? |
| product_id ?| int ? ? |
| buyer_id ? ?| int ? ? |
| sale_date ? | date ? ?|
| quantity ? ?| int ? ? |
| price ? ? ? | int ? ? |
+------ ------+---------+
這個表沒有主鍵,它可以有重復的行.
product_id 是 Product 表的外鍵.
編寫一個 SQL 查詢,查詢購買了 S8 手機卻沒有購買 iPhone 的買家。注意這里 S8 和 iPhone 是 Product 表中的產品。
查詢結果格式如下圖表示:
Product table:
+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1 ? ? ? ? ?| S8 ? ? ? ? ? | 1000 ? ? ? |
| 2 ? ? ? ? ?| G4 ? ? ? ? ? | 800 ? ? ? ?|
| 3 ? ? ? ? ?| iPhone ? ? ? | 1400 ? ? ? |
+------------+--------------+------------+
Sales table:
+-----------+------------+----------+------------+----------+-------+
| seller_id | product_id | buyer_id | sale_date ?| quantity | price |
+-----------+------------+----------+------------+----------+-------+
| 1 ? ? ? ? | 1 ? ? ? ? ?| 1 ? ? ? ?| 2019-01-21 | 2 ? ? ? ?| 2000 ?|
| 1 ? ? ? ? | 2 ? ? ? ? ?| 2 ? ? ? ?| 2019-02-17 | 1 ? ? ? ?| 800 ? |
| 2 ? ? ? ? | 1 ? ? ? ? ?| 3 ? ? ? ?| 2019-06-02 | 1 ? ? ? ?| 800 ? |
| 3 ? ? ? ? | 3 ? ? ? ? ?| 3 ? ? ? ?| 2019-05-13 | 2 ? ? ? ?| 2800 ?|
+-----------+------------+----------+------------+----------+-------+
Result table:
+-------------+
| buyer_id ? ?|
+-------------+
| 1 ? ? ? ? ? |
+-------------+
id 為 1 的買家購買了一部 S8,但是卻沒有購買 iPhone,而 id 為 3 的買家卻同時購買了這 2 部手機。
思路:查出兩個手機的id,根據手機id查出買過兩個手機的名單,判斷每一個人在第一個名單里,不愛第二個名單里。
select distinct buyer_id
from Sales
where buyer_id in (select buyer_id from Sales where product_id=(select product_id from Product where product_name='S8'))
and buyer_id not in (select buyer_id from Sales where product_id=(select product_id from Product where product_name='iPhone'));
?