圖解MySQL 內鏈接、外鏈接、左鏈接、右鏈接、全鏈接……太多了

https://blog.csdn.net/plg17/article/details/78758593數據庫

****************************************************************性能

用兩個表(a_table、b_table),關聯字段a_table.a_id和b_table.b_id來演示一下MySQL的內鏈接、外鏈接( 左(外)鏈接、右(外)鏈接、全(外)鏈接)。

MySQL版本:Server version: 5.6.31 MySQL Community Server (GPL)

數據庫表:a_table、b_table

主題:內鏈接、左鏈接(左外鏈接)、右鏈接(右外鏈接)、全鏈接(全外鏈接)
前提
建表語句:測試

CREATE TABLE `a_table` (
  `a_id` int(11) DEFAULT NULL,
  `a_name` varchar(10) DEFAULT NULL,
  `a_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
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

表測試數據:

1、內鏈接

關鍵字:inner join onspa

語句:select * from a_table a inner join b_table bon a.a_id = b.b_id;
執行結果:
說明:組合兩個表中的記錄,返回關聯字段相符的記錄,也就是返回兩個表的交集(陰影)部分。

2、左鏈接(左外鏈接)

關鍵字:left join on / left outer join on
語句:select * from a_table a left join b_table bon a.a_id = b.b_id;
執行結果:
說明:
left join 是left outer join的簡寫,它的全稱是左外鏈接,是外鏈接中的一種。
左(外)鏈接,左表(a_table)的記錄將會所有表示出來,而右表(b_table)只會顯示符合搜索條件的記錄。右表記錄不足的地方均爲NULL。

3、右鏈接(右外鏈接)

關鍵字:right join on / right outer join on
語句:select * from a_table a  right outer join b_table b on a.a_id = b.b_id;
執行結果:
說明:
right join是right outer join的簡寫,它的全稱是右外鏈接,是外鏈接中的一種。
與左(外)鏈接相反,右(外)鏈接,左表(a_table)只會顯示符合搜索條件的記錄,而右表(b_table)的記錄將會所有表示出來。左表記錄不足的地方均爲NULL。
4、全鏈接(全外鏈接)
MySQL目前不支持此種方式,能夠用其餘方式替代解決。
5、補充,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);
那麼,對應的僞代碼以下:.net

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

說明:第五部分摘自《高性能MySQL 第三版》code

相關文章
相關標籤/搜索