1. 程式人生 > 實用技巧 >查詢不在表裡的資料

查詢不在表裡的資料

【題目】

下面是學生的名單,表名為“學生表”;近視學生的名單,表名為“近視學生表”。請問不是近視眼的學生都有誰?

(“學生表”表中的學號與“近視學生”表中的學生學號一一對應)

【解題思路】

1.我們先來拆解問題:不是近視眼的學生都有誰?

1)“不是近視眼”的學生,近視資訊在“近視學生”表裡

2)“學生都有誰?,要求的是“學生姓名”,所以我們的輸出答案應該是“學生姓名”,這在“學生”表裡。

涉及2張以上表的查詢時,我們需要用到多表聯結。

2.使用哪種聯結呢?

其中上圖黑色框裡的sql解決的問題是:不在表裡的資料,也就是在表A裡的資料,但是不在表B裡的資料

對於這個題目“不是近視眼的學生都有誰?”,就是在“學生表”裡的資料,但是不在“近視學生”表裡的資料。我們選擇下圖黑色框裡的左聯結sql語句。

select ...
from 表1 as a
left join 表2 as b
on a.列名=b.列名
where b.列名 is null;

3.多表如何聯結?

題目已給出,聯結兩表的關鍵依據分別為“學號”和“學生學號”。示意圖如下:

【解題步驟】

使用分析思路里的sql語句聯結兩表

select a.姓名 as 不近視的學生名單
from 學生表 as a
left join 近視學生表 as b
on a.學號=b.學生學號
where b.序號 is null;

我們來理解下這個sql的執行過程,方便你更深入的理解。

1)在不加where字句的情況下,兩表聯結得到下圖的表

2)假設where字句(where b.序號 is null;)就會把b.序號這一列裡為空值(NULL)的行選出來,就是題目要求的不近視的學生。(下圖綠色框裡的行)

【本題考點】

本題主要考察多表聯結。

遇到要查詢“不在表裡的資料

,也就是在表A裡的資料,但是不在表B裡的資料。”可以使用下圖黑框裡的sql語句。

【舉一反三】

查詢“不在表裡的資料”應用案例:

某網站包含兩個表,顧客姓名錶(表名Customers)和 購買記錄表(表名Orders)。找出所有從不訂購任何東西的客戶。

(“顧客姓名錶”中的ID與“購買記錄”表中的學生學號CustomerId一一對應)

參考答案:

select a.Name as Customers
from Customers as a
left join Orders as b
on a.Id=b.CustomerId
where b.CustomerId is null;

輸出結果: