從不訂購的客戶

2021-10-03 16:15:54 字數 1643 閱讀 4930

題目:從不訂單的客戶

某**包含兩個表,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...