查詢不在表裡的資料
阿新 • • 發佈:2020-08-27
【題目】
下面是學生的名單,表名為“學生表”;近視學生的名單,表名為“近視學生表”。請問不是近視眼的學生都有誰?
(“學生表”表中的學號與“近視學生”表中的學生學號一一對應)
【解題思路】
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)的行選出來,就是題目要求的不近視的學生。(下圖綠色框裡的行)
【本題考點】
本題主要考察多表聯結。
遇到要查詢“不在表裡的資料
【舉一反三】
查詢“不在表裡的資料”應用案例:
某網站包含兩個表,顧客姓名錶(表名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;
輸出結果: