【資料庫】淺顯易懂地理解左、右串連,資料庫淺顯易懂

來源:互聯網
上載者:User

【資料庫】淺顯易懂地理解左、右串連,資料庫淺顯易懂

之前一直對資料庫裡面的外串連有些疑惑,理解的不是很透徹,今天總算自己建了個表,詳細地對照了幾種寫法,總算徹底搞清楚了。

基本概念

左串連、右串連就是資料庫裡面的關鍵字  left join 和 right join, 當然在oracle裡面也可以在某個欄位的後面加上(+)來表示外串連

左串連保留出現在left join左邊的關係中的元組,也就是允許右邊關係中為空白;通俗一點:Left join 會從左表中返回所有的行,即便在右表中沒有找到匹配的項。

同理右串連保留出現在right join右邊的關係中的元組,也就是允許左邊關係中為空白;Right join會總右表中返回所有的行,即便在左表中沒有找到匹配的項。

在Oracle中

select * from a left join b on a.xxx=b.xxx

select * from a, b where  a.xxx = b.xxx(+)

是等價的。


舉例說明

再難理解的知識點放到實際中去操作一下,立刻就能理解地透徹很多。

我們假設現在有兩張表 a1 和a2

a1:

a2:

這兩個表中有共同的欄位id表示相同的含義,bcde欄位可以看做不同的4列;

可以看到這兩個表中有一個相同的id  1;那如果不做任何選擇,a1和a2的笛卡爾積是什麼樣子呢?

試著執行下列語句:

select * from a1, a2

你會得到如下的結果:


笛卡爾積是個全乘積,但是單單得到笛卡爾積是沒有什麼用的,因為這個集合很大,而且很多行並沒有什麼實際意義,這時候就需要加上where語句來選擇出真正有用的列

試著執行下列語句:

select a.id, b, c, d, e from a,b where  a.id=b.id;

注意,如果笛卡爾積中的欄位是唯一的,可以不用在select的時候標明,也就是說不用寫  select a.c , b.d, b.e 等。

這時候得到的結果一定是只有1行的,也就是

這個很容易理解,也是我們最常使用的,那如果我們想得到a1表中的所有id,而無論他在不在a2中呢,改如何做呢?

試試下列語句中的任意一條:

select a.id,b,c,d,e from a,b where a.id=b.id(+);select a.id,b,c,d,e from a left join b on a.id = b.id;

你會得到什麼結果呢?


是的,你會發現我們把a1表中所有的id都選擇了出來,如果這個id沒有在a2表中出現,那麼這一行就會留空。

看到這裡,一個更通俗易懂的理解外串連的訣竅就是:+號出現的那一側允許出現NULL

當然,我們可以通過在d和e欄位加上nvl(d,0)語句來把相應的null值改成我們想要的資料。

目的:

到了這裡,相信我們已經對外串連有個清晰的認識了,不過為什麼我們需要外串連呢??

舉個簡單的例子,假如a1表是學生資訊表,a2表示學生選課表


由於某種特殊原因,學號為201400002的那位女同學就是沒有選一門課,不管她是休學1年還是已經修滿學分了,就是任性,一門課也不修,那如果我們想統計學生的姓名,年齡,選課資訊等等,如果不使用外串連,很容易地就把這位女同學漏掉了,而一個a.id=b.id(+)就足以規避這種特殊情況帶來的錯誤了!







相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.