今天參加了一個筆試,里面有一道數據庫題,感覺很基礎,但是也很容易出錯。所以記錄一下,方便以后翻閱。
題目:有如下兩個表:
表A 表B
請寫SQL語句輸出一下效果:
(1)
(2)
(3)
下面講解一下這三個小題:
首先由表可以看出:A,B兩個表的id都是字符串類型。這一點很重要,后面會用到。
1.
由第一個小題的要求(圖)可以看出,這是在考察SQL的等值連接,表A和表B 的id相等的都滿足該條件。故:
select * from A a,B b where a.id_a = b.id_b;
2.
由圖2可知:A的沒有全顯示,而B的全顯示出來了,想到這,馬上就可以知道這是“右外連接”,連接的條件為:A的id等於B的id且A的name等於B的name。故可以得到如下SQL語句:
select * from A a right join B b on a.id_a = b.id_b and a.name_a = b.name_b;
不過,這種查詢結果有一點小問題:如圖
可以看出來,這明顯不符合題目要求(可以對比一下第二題的要求)。
接下來就考到細節了,查詢后的結果去null。SQL有這樣一個函數ISNULL(表達式1,表達式2),該函數的大意就是:查詢的結果表達式1是否位NULL,如果為NULL則取表達式2的值,否則取表達式1的值。
所以,完整的答案為:
select ISNULL(a.id_a,'') id_a,ISNULL(a.name_a,'') name_a,ISNULL(a.desc_a,'') desc_a,b.id_b,b.name_b,b.desc_b from A a right join B b on a.name_a = b.name_b;
3.
由圖三可知:
A表id為3對應B表的那一行為空,B表id為3對應A表的那一行為空。這時,可以得出如下結論:
分別對A表和B表全查詢,但是查詢的條件不能為id,而是name。可以想到 'full outer join on' ,它的大意:分別查詢A,B表,A和B在查詢條件滿足時的數據顯示出來,還有不滿足查詢條件的也顯示出來。(去NULL的辦法2中已經介紹)
select ISNULL(a.id_a,'') id_a,ISNULL(a.name_a,'') name_a,ISNULL(a.desc_a,'') desc_a,ISNULL(b.id_b,'') id_b,ISNULL(b.name_b,'') name_b,ISNULL(b.desc_b,'') desc_b from A a full outer join B b on a.name_a =b.name_b ;
今天就總結到這,后面若再有面試,還會繼續出來分析。。。