關於資料庫中的JOIN的用法學習

2021-06-11 08:41:27 字數 3159 閱讀 7780

我的sql語句是這樣的:

select d.username as username,d.uid as uid_d,c.webname,c.uid as uid_c from qb_blog_home c left join qb_memberdata d on c.uid=d.uid

我的資料庫表的資料是這樣:

當我執行上面的sql語句後出現了如下結果:

這就搞的我有點不明白了 為什麼uid_d與uid_c不等的也出來了? 後來才發現原來是我的基本不好 呵呵 經過修正,我把left join 換成 inner join後達到了我的效果 :

最終的原因就是我對join的語義還是不太了解,特摘錄網上的分析:

下面是例子分析

表a記錄如下: 

aid anum 

1 a20050111 

2 a20050112 

3 a20050113 

4 a20050114 

5 a20050115 

表b記錄如下: 

bid bname 

1 2006032401 

2 2006032402 

3 2006032403 

4 2006032404 

8 2006032408 

建立這兩個表sql語句如下: 

create table a 

aid int( 1 ) auto_increment primary key , 

anum char( 20 ) 

) create table b( 

bid int( 1 ) not null auto_increment primary key , 

bname char( 20 ) 

) insert into a 

values ( 1, 'a20050111' ) , ( 2, 'a20050112' ) , ( 3, 'a20050113' ) , ( 4, 'a20050114' ) , ( 5, 'a20050115' ) ; 

insert into b 

values ( 1, ' 2006032401' ) , ( 2, '2006032402' ) , ( 3, '2006032403' ) , ( 4, '2006032404' ) , ( 8, '2006032408' ) ; 

實驗如下: 

1.left join(左聯接) 

sql語句如下: 

select * from a 

left join b 

on a.aid =b.bid 

結果如下: 

aid anum bid bname 

1 a20050111 1 2006032401 

2 a20050112 2 2006032402 

3 a20050113 3 2006032403 

4 a20050114 4 2006032404 

5 a20050115 null null 

(所影響的行數為 5 行) 

結果說明: 

left join是以a表的記錄為基礎的,a可以看成左表,b可以看成右表,left join是以左表為準的. 

換句話說,左表(a)的記錄將會全部表示出來,而右表(b)只會顯示符合搜尋條件的記錄(例子中為: a.aid = b.bid). 

b表記錄不足的地方均為null. 

2.right join(右聯接) 

sql語句如下: 

select * from a 

right joing b 

on a.aid = b.bid 

結果如下: 

aid anum bid bname 

1 a20050111 1 2006032401 

2 a20050112 2 2006032402 

3 a20050113 3 2006032403 

4 a20050114 4 2006032404 

null null 8 2006032408 

(所影響的行數為 5 行) 

結果說明: 

仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(b)為基礎的,a表不足的地方用null填充. 

3.inner join(相等聯接或內聯接) 

sql語句如下: 

select * from a 

inner join b 

on a.aid =b.bid 

等同於以下sql句: 

select * 

from a,b 

where a.aid = b.bid 

結果如下: 

aid anum bid bname 

1 a20050111 1 2006032401 

2 a20050112 2 2006032402 

3 a20050113 3 2006032403 

4 a20050114 4 2006032404 

結果說明: 

很明顯,這裡只顯示出了 a.aid = b.bid的記錄.這說明inner join並不以誰為基礎,它只顯示符合條件的記錄. 

left join操作用於在任何的 from 子句中, 

組合**表的記錄。使用 left join 運算來建立乙個左邊外部聯接。左邊外部聯接將包含了從第乙個(左邊)開始的兩個表中的全部記錄,即 

使在第二個(右邊)表中並沒有相符值的記錄 (右邊沒有符合的話就用null),right join也一樣。

通俗一點說就是:inner join 主表和從表都存在的記錄才會查出來,outer join 如果主表中存在的記錄,從表中不存在則用null替代

語法:from table1 left join table2 on table1.field1 compopr table2.field2 

說明:table1, table2引數用於指定要將記錄組合的表的名稱。 

field1, field2引數指定被聯接的字段的名稱。且這些字段必須有相同的資料型別及包含相同型別的資料,但它們不需要有相同的 

名稱。 

compopr引數指定關係比較運算子:"=", "", "<=", ">=" 或 "<>"。 

如果在inner join操作中要聯接包含memo 資料型別或 ole object 資料型別資料的字段,將會發生錯誤。

關於資料庫中的JOIN的用法學習

問題 於我在幫修改乙個系統bug時出現的,一直沒發現這個問題,就是left join 與 inner join的區別,剛才在群裡討論後還特意看了書,在網上看了下大家的分享,現在大概明白了。我的sql語句是這樣的 select d.username as username,d.uid as uid d...

資料庫中 join 的使用

關聯多張表資料,並通過條件篩選符合條件的資料。一般來說,會有四種 1.left join 左連線 2.right join 右連線 3.inner join 內連線 4.full join 全連線 left join以左表作為基準,然後加入符合條件的右表資料,最終得到的資料數目基本會不小於左表的資料...

漫談資料庫中的join

join是我們這些整天與資料打交道的人繞不開的乙個詞,不管是在傳統的關係型資料庫,還是在大資料領域的資料倉儲 資料湖中,join都是常客。特別是對於olap業務而言,幾乎每個查詢都需要用join來建立表之間的關係,地位非常之重要。本文就來簡單講解一些主要的join演算法 真的非常簡單哦 nested...