SQL 內連線,外連線(左外連線 右外連線)

2021-09-20 05:19:05 字數 2275 閱讀 9792

參考整理筆記

關鍵字: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先在乙個表中迴圈取出單條資料,然後在巢狀迴圈到下乙個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止。然後根據各個表匹配的行,返回查詢中需要的各個列。請看下面的例子中的簡單的查詢:

查詢語句: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.nextwhile 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.nextend
上面的執行計畫對於單錶查詢和多表關聯查詢都適用,如果是乙個單錶查詢,那麼只需要上面外層的基本操作。對於外連線,上面的執行過程仍然適用。例如,我們將上面的查詢語句修改如下:

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.nextwhile 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.nextend
說明:第五部分摘自《高效能mysql 第三版》

Oracle外連線,左外連線,右外連線,內連線簡析

內連線即普通等值連線 select e.ename,e.job,e.sal,d.dname from emp e inner join dept d on e.deptno d.deptno where e.sal 2000 select e.ename e.job,e.sal d.dname fr...

SQL之全外連線,左外連線,右外連線,內連線

1.內連線 內聯接使用比較運算子 使用像 或 之類的比較運算子 根據每個表共有的列的值匹配兩個表中的行,根據這兩張表中相同列的條件,得出其交集。沒有inner join,形成的中間表為兩個表的笛卡爾積 select from customers c,orders o where c.id o.cus...

SQL 左外連線,右外連線,全連線,內連線

例子1 a表 id name b表 id job parent id 1 張3 1 23 1 2 李四 2 34 2 3 王武 3 34 4 a.id同parent id 存在 關係內連線 select a.b.from a inner join b on a.id b.parent id 結果是 ...