mysql 內連線,左連線,右連線

2022-06-23 04:51:14 字數 2973 閱讀 8082

本文**於:

用兩個表(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

表測試資料:

一、內連線

關鍵字:inner join on

語句:select * from a_table a inner join b_table bon a.a_id = b.b_id;

執行結果:

說明:組合兩個表中的記錄,返回關聯字段相符的記錄,也就是返回兩個表的交集(陰影)部分。

二、左連線(左外連線)

關鍵字: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。

三、右連線(右外連線)

關鍵字: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。

四、全連線(全外連線)

mysql目前不支援此種方式,可以用其他方式替代解決。

五、補充,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

endouter_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

endelse

output [ outer_row.col1, null]

endouter_row = outer_iter.next

end

mysql 內連線 左連線 右連線

記錄備忘下,初始資料如下 drop table ifexists t demo product create table ifnot exists t demo product proid int 20 proname varchar 20 price int 10 primary key proi...

內連線 左連線 右連線

弄個例題,直觀一點。兩個表 表stu id name 1,jack 2,tom 3,kity 4,nono 表exam id grade 1,56 2,76 11,89 內連線 顯示兩表id匹配的 select stu.id,exam.id,stu.name,exam.grade from stu ...

內連線 左連線 右連線

1.內連線 利用內連線可獲取兩表的公共部分的記錄,即圖3的記錄集c 語句如下 select from a join b on a.aid b.bnameid 執行結果如下圖4所示 其實select from a,b where a.aid b.bnameid與select from a join b...