面試排坑指南之SQL join

前言

在面試的時候曾3次踩過了sql join的坑,第一次是校招面試的時候,面的是國內某大行的開發崗,被問到會不會使用sql join,當時直接回答的是不會,只會使用簡單的sql操作。第二次面試的是另一大行的測試崗,人家直接問的是left join和right join的區別,這次我事先做了準備吧,說left join查詢會顯示左表的全部內容,right join會顯示右表的全部內容。ok,勉強過關,面試官也沒再繼續追問下去,如果他繼續追問下去我一定原形畢露。兩年多過去了,博主從事了QA(Quality Analyist)的工作,每天都在專研怎麼寫測試用例、怎麼實施質量內建、怎麼搞自動化測試,平時項目中會用到簡單的sql查數據庫,之前面試的痛並沒有引起我的重視,畢竟第二次我算是敷衍過了。誰曾想到,還有第三次!公司內部爲了員工的發展考慮,可以根據自我意願換業務線,換之前會有一個簡單的面試。
面試的同事看了看我的簡歷說:看你會sql呀?
我:是的,會一些簡單的。(不詳的預感瞬間飆升)
面試同事:那你知道sql join的一些操作嗎?比如inner join。
我:知道一些left join、right join的操作,inner join不清楚。(你看,這像是一個用過join操作的人的回答嗎?!)
面試同事:好,那你說一下她們是幹嘛的呢?
我:left join查詢會顯示左表的全部內容,right join會顯示右表的全部內容(強撐!)
面試同事:😱(他真的露出了吃驚的表情),說看來你沒有真正理解它們的用法呀。
我:嗯嗯是呢,平時沒怎麼用。(內心os:饒了我吧,我不該強撐說知道的,早點投降不香嗎?)
面試同事:888888開始給我講它們的用法。。。
所以,我痛下決心,要學一下這幾個join的用法,發誓不在同一個地方跌倒4次。

前期準備

  1. 安裝mysql/oracle
    可參考:https://blog.csdn.net/qq_37924224/article/details/105288363

  2. 創建user表、orders表和order_items表並插入數據,如下圖:
    可參考:https://blog.csdn.net/qq_37924224/article/details/105510809

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
4. 理解join的含義
join的意思是連接,對於數據庫來說,就是連接兩個或以上的表。當什麼時候需要連接查詢兩個表呢?當一個表中的內容不足以表達你需要的內容,而另一個與之相關聯的表恰好有你所需的信息。所以join查詢的目的就是補充你查詢的表中沒有的內容。那怎麼樣將兩個表關聯起來呢?就需要兩個表有相同的字段,即primary key和foreign key。

inner join

inner join/join級聯查詢兩個表時,返回的結果是兩個表中均存的記錄,可以理解是與關係。如下圖所示:
在這裏插入圖片描述
下面是實際的例子。

例1:inner join查詢兩張表

  1. 需求:查詢下了訂單的用戶信息及其對應的訂單編號。
  2. sql語句:
select user.user_id,
       user.user_name,
       user.user_alias,
       user.email,
       user.city,
       orders.order_id,
       orders.create_date,
       orders.update_date
from user
         inner join orders on user.user_id = orders.user_id
order by user.user_id;
  1. 查詢結果在這裏插入圖片描述
    可以看到返回的結果是user表和orders表的交集,沒有訂單的用戶1、用戶5、用戶6、用戶7都不在查詢的結果中。

那如果是3張表呢,又該怎麼查詢?

例2:inner join查詢三張表

  1. 需求:查詢下了訂單的用戶買的物品和對應訂單號
  2. sql語句:
select user.user_id,
       user.user_name,
       orders.order_id,
       order_items.item_id,
       order_items.item_name
from user
         inner join orders on user.user_id = orders.user_id
         inner join order_items on orders.order_id = order_items.order_id
order by user.user_id;
  1. 查詢結果
    在這裏插入圖片描述

left join

left join級聯查詢兩個表時,會返回的左表的所有記錄以及右表存在的記錄,沒有則返回null。如下圖所示:
在這裏插入圖片描述

例3:left join查詢兩張表

  1. 需求:查詢所有用戶的訂單記錄。
  2. sql語句:
select user.user_id,
       user.user_name,
       orders.order_id,
       orders.create_date,
       orders.update_date
from user
         left join orders on user.user_id = orders.user_id
order by user.user_id;
  1. 查詢結果:
    在這裏插入圖片描述
    如圖所示,用戶1沒有訂單記錄,返回的就是null。

例4:left join查詢三張表

  1. 需求:查詢所有用戶的訂單信息以及訂單包含的物品信息。
  2. sql語句:
select user.user_id,
       user.user_name,
       orders.order_id,
       order_items.item_id,
       order_items.item_name
from user
         left join orders on user.user_id = orders.user_id
         left join order_items on orders.order_id = order_items.order_id
order by user.user_id;
  1. 查詢結果:
    在這裏插入圖片描述

right join

right join級聯查詢兩個表時,會返回的右表的所有記錄以及左表存在的記錄,沒有則返回null。如下圖所示:
在這裏插入圖片描述

例4:left join查詢兩張表

  1. 需求:查詢所有訂單關聯的用戶信息。
  2. sql語句:
select orders.order_id,
       user.user_id,
       user.user_name,
       user.user_alias,
       user.city,
       user.email
from user
         right join orders on user.user_id = orders.user_id
order by orders.order_id;
  1. 查詢結果:
    在這裏插入圖片描述

例6:right join查詢兩張表

  1. 需求:查詢所有訂單訂單關聯的用戶信息及物品信息。
  2. sql語句:
select orders.order_id,
       user.user_id,
       user.user_name,
       user.user_alias,
       user.city,
       user.email,
       order_items.order_id,
       order_items.item_name
from user
         right join orders on user.user_id = orders.user_id
         right join order_items on orders.order_id = order_items.order_id
order by orders.order_id;
  1. 查詢結果
    在這裏插入圖片描述

full join

full join級聯查詢兩個表時,會返回的兩個表中所有的記錄,沒有則返回null。如下圖所示:
在這裏插入圖片描述
由於mysql不支持full join,所以這裏就不做full join的演示了。不過我們可以使用left join和right join來達到full join的目的。

例7:使用union代替full join

  1. 需求:查詢所有的用戶信息和所有的訂單信息。
  2. sql語句:
select *
from user
         left join orders on user.user_id = orders.user_id
union
select *
from user
         right join orders on user.user_id = orders.user_id order by user_name;
  1. 查詢結果:
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章