題目:從不訂單的客戶
某**包含兩個表,customers 表和 orders 表。編寫乙個 sql 查詢,找出所有從不訂購任何東西的客戶。
customers 表:
±—±------+
| id | name |
±—±------+
| 1 | joe |
| 2 | henry |
| 3 | sam |
| 4 | max |
±—±------+
orders 表:
±—±-----------+
| id | customerid |
±—±-----------+
| 1 | 3 |
| 2 | 1 |
±—±-----------+
例如給定上述**,你的查詢應返回:
±----------+
| customers |
±----------+
| henry |
| max |
±----------+
法一:左連線,七種連線理論的 一張表有該元組另一種表沒有的該元組的情況,差集。
1.按左外連線left join將表連線,左表為customers,右表為orders;
2.之後where選擇出新表中 代表右表的字段中字段值為null的元組;
3.用select投影到選擇出的元組的name屬性。
select c.name as customers
from customers c left
join orders o
on c.id=o.customerid
where o.customerid is
null
;
注:七種連線理論
1.查詢訂單表,因為是不相關子查詢,所以先執行子查詢,把orders裡所以的客戶編號找到;
2.查詢客戶表,用where選擇出編號不在訂單表的使用者元組;
3.select投影到選擇出的元組的name欄位。
select name as customers
from customers
where id notin(
select customerid
from orders
);
法三:相關子查詢+not exists
1.把客戶表的編號乙個乙個的拿到子查詢裡遍歷訂單表的每乙個元組,之後子查詢裡找不到匹配的訂單元組則not exists返回true給where,否則返回false;
2.not exists 就是該元組不存在則返回true,where選擇成立。
select name as customers
from customers c
where
notexists
(select
*from orders o
where o.customerid=c.id
);
注:相關子查詢的執行過程是乙個雙重迴圈的過程,類似排序演算法裡的o(n^2)演算法,在元組數很多時,效率低。 從不訂購的客戶
假設乙個 包含兩個表,customers表和orders表。編寫乙個sql語句找出所有從不訂購任何東西的客戶。customers表 id name 1 joe 2 henry 3 sam 4 max orders表 id customerid 1 3 2 1 以上述 為例,返回以下內容 custom...
從不訂購的客戶
sql架構 某 包含兩個表,customers 表和 orders 表。編寫乙個 sql 查詢,找出所有從不訂購任何東西的客戶。customers 表 id name 1 joe 2 henry 3 sam 4 max orders 表 id customerid 1 3 2 1 例如給定上述 你的...
從不訂購的客戶
create table ifnot exists customers id int name varchar 255 create table ifnot exists orders id int customerid int truncate table customers insert int...