MySQL中的內連接、左連接、右連接、全連接、交叉連接


創建兩個表(a_table、b_table),兩個表的關聯字段分別為:a_table.a_id和b_table.b_id

CREATE TABLE a_table (
  a_id int NOT NULL,
  a_name varchar(10) DEFAULT NULL,
  a_part varchar(10) DEFAULT NULL
);
CREATE TABLE b_table (
  b_id int(11) DEFAULT NULL,
  b_name varchar(10) DEFAULT NULL,
  b_part varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

分別向兩個表中插入數據:
a_table:                b_table:

                  

一、內連接
說明:組合兩個表中的記錄,返回關聯字段相符的記錄,即:兩個表的交集(陰影)部分。

關鍵字:inner join on
SQL語句:

select * from a_table a inner join b_table b on a.a_id = b.b_id;

執行結果:

二、左連接(左外連接)
說明:左連接全稱是左外連接,是外連接中的一種。
左表(a_table)的記錄將會全部表示出來,而右表(b_table)只會顯示符合搜索條件的記錄,右表記錄不符合搜索條件的地方均為NULL。

關鍵字:left join on / left outer join on(left join 是left outer join的簡寫)
SQL語句:

select * from a_table a left join b_table b on a.a_id = b.b_id;
select * from a_table a left outer join b_table b on a.a_id = b.b_id;

執行結果:

---------------------------------------------------

當兩個表的記錄行數不同時,以左表為准。

例:

a_table有四條記錄:            b_table有五條記錄:

                       

SQL語句:

select * from a_table as a left join b_table as b on a.a_id = b.b_id;

執行結果:

 

三、右連接(右外連接)
說明:右連接的全稱是右外連接,是外連接中的一種。
與左連接相反,右連接中,右表(b_table)的記錄將會全部表示出來,左表(a_table)只會顯示符合搜索條件的記錄,記錄不符合搜索條件的地方均為NULL。

關鍵字:right join on / right outer join on(right join是right outer join的簡寫)
SQL語句:

select * from a_table a right join b_table b on a.a_id = b.b_id;
select * from a_table a right outer join b_table b on a.a_id = b.b_id;

執行結果:

---------------------------------------------------

當兩個表的記錄行數不同時,以右表為准。

例:

a_table有四條記錄:            b_table有五條記錄:

                       

SQL語句:

select * from a_table as a right join b_table as b on a.a_id = b.b_id;

執行結果:

四、全連接(全外連接)

說明:返回左右表的所有行。哪個表中沒有的就用null填充。
關鍵字:MySQL不支持全外連接,所以只能采取關鍵字UNION來聯合左、右連接
SQL語句:

select * from a_table as a left join b_table as b on a.a_id = b.b_id
UNION
select * from a_table as a right join b_table as b on a.a_id = b.b_id;

執行結果:

五、交叉連接
說明:沒有where條件的交叉連接中,產生連接表就是笛卡爾積。將兩個表的所有行進行組合,連接后的行數為兩個表的行數的乘積數。
關鍵字:cross join
1. SQL語句:

select * from a_table cross join b_table; 
#等價於:select * from a_table, b_table;

執行結果:

2. SQL語句

select * from a_table as a cross join b_table as b on a.a_id = b.b_id;

執行結果:

六、自連接
說明:自連接是連接的一種用法,但並不是連接的一種類型,因為它的本質是把一張表當成兩張表來使用。
例子:https://www.cnblogs.com/liangwh520/p/8299481.html

七、MySQL如何執行關聯查詢
MySQL認為任何一個查詢都是一次“關聯”,並不僅僅是一個查詢需要到兩個表匹配才叫關聯,所以在MySQL中,每一個查詢,每一個片段(包括子查詢,甚至基於單表查詢)都可以是一次關聯。
當前MySQL關聯執行的策略很簡單:MySQL對任何關聯都執行嵌套循環關聯操作,即MySQL先在一個表中循環取出單條數據,然后在嵌套循環到下一個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止。然后根據各個表匹配的行,返回查詢中需要的各個列。請看下面的例子中的簡單的查詢:

查詢語句:

select tbl1.col1, tbl2.col2 from tbl1 inner join tbl2 using(col3) where tbl1.col1 in (5, 6);

假設MySQL按照查詢中的表順序進行關聯操作,我們則可以用下面的偽代碼表示MySQL將如何完成這個查詢:

outer_iter = iterator over tbl1 where col1 in (5, 6)
outer_row = outer_iter.next
while outer_row
    inner_iter = iterator over tbl2 where col3 = outer_row.col3
    inner_row = inner_iter.next
    while inner_row
        output [ outer_row.col1, inner_row.col2]
        inner_row = inner_iter.next
    end
    outer_row = outer_iter.next
end

上面的執行計划對於單表查詢和多表關聯查詢都適用,如果是一個單表查詢,那么只需要上面外層的基本操作。
對於外連接,上面的執行過程仍然適用。例如,我們將上面的查詢語句修改如下:

select tbl1.col1, tbl2.col2 from tbl1 left outer join tbl2 using(col3) where tbl1.col1 in (5, 6);

那么,對應的偽代碼如下:

outer_iter = iterator over tbl1 where col1 in (5, 6)
outer_row = outer_iter.next
while outer_row
    inner_iter = iterator over tbl2 where col3 = outer_row.col3
    inner_row = inner_iter.next
    if inner_row
        while inner_row
            output [ outer_row.col1, inner_row.col2]
            inner_row = inner_iter.next
        end
    else
        output [ outer_row.col1, null]
    end
        outer_row = outer_iter.next
end

 

note:SQL語句中的using:
在做等值連接的時候,若A表中和B表中的列名相同,則可以使用using簡寫,例:

a_table                  b_table

    

 1. 使用等值連接

select * from a_table a right join b_table b on a.id = b.id;

2. 使用using

select * from a_table a right join b_table b using(id);

 

參考:https://blog.csdn.net/plg17/article/details/78758593


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM