創建兩個表(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);

