mysql各種連接查詢
一、 建表
資料庫表: 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
填充測驗資料:
a_table:
| aid | a_name | a_part |
|---|---|---|
| 1 | 張三 | 總裁部 |
| 2 | 李四 | 秘書部 |
| 3 | 王五 | 設計部 |
| 4 | 趙六 | 運營部 |
b_table:
| b_id | b_name | b_part |
|---|---|---|
| 2 | 李四 | 秘書部 |
| 3 | 王五 | 設計部 |
| 5 | 小七 | 人事部 |
| 6 | 小八 | 生產部 |
二、 內連接
關鍵字:inner join on
陳述句:
select *from a_table a inner join b_table b on a.a_id = b.b_id;
結果:

說明: 內連接是兩個表的交集部分,

三、 左(外)連接
關鍵字:left join on 或 **left outer join on **
陳述句:
select *from a_table a left outer join b_table b on a.a_id = b.b_id;
結果:

說明:
左連接=左外連接,left join on = left outer join on,右表記錄不足的地方為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 on = right outer join on,左表記錄不足的地方為null

五、 左表獨有
關鍵字:left outer join on 、 is null
陳述句:
select *from a_table a left outer join b_table b on a.a_id = b.b_id where b.b_id is null;
結果:

說明:
兩表關聯,查詢左表獨有的資料,(注意:左表獨有,右表 id 為空)

六、 右表獨有
關鍵字:right outer join on、 is null
陳述句:
select *from a_table a right outer join b_table b on a.a_id = b.b_id where a.a_id is null;
結果:

說明:
兩表關聯,查詢右表獨有的資料,(注意:右表獨有,左表 id 為空)

七、 全連接
關鍵字:left outer join on 、 union、 right outer join on
陳述句:
select *from a_table a left outer join b_table b on a.a_id = b.b_id
UNION
select *from a_table a right outer join b_table b on a.a_id = b.b_id;
結果:

說明:
在oracle中 有 full join 進行全連接,mysql中沒有,所以可以用 一個左連接 并上 一個右連接

八、 并集去交集(左右表獨有)
關鍵字:left outer join on 、 — 、 union、 right outer join on
陳述句:
(select *from a_table a left join b_table b on a.a_id = b.b_id
UNION
select *from a_table a RIGHT JOIN b_table b on a.a_id = b.b_id)
-
select *from a_table a where a.a_id = b.b_id
結果:

說明:
? 減號 前面求并集,減號 后面求交集, 相減就是結果,
但是還可以有簡便做法,邏輯上等價于
左表獨有 并上 右表獨有
那么陳述句就是
select *from a_table a left outer join b_table b on a.a_id = b.b_id where b.b_id is null
UNION
select *from a_table a right outer join b_table b on a.a_id = b.b_id where a.a_id is null;

九、 笛卡爾積
假設現在有兩集合:
A = {0,1} B = {2,3,4}
集合 A×B 和 B×A的結果集就可以分別表示為以下這種形式:
A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
以上A×B和B×A的結果就可以叫做兩個集合相乘的‘笛卡爾積’,
從以上的資料分析我們可以得出以下兩點結論:
1,兩個集合相乘,不滿足交換率,既 A×B ≠ B×A;
2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相結合的所有的可能性,既兩個集合相乘得到的新集合的元素個數是 A集合的元素個數 × B集合的元素個數;
(A × B ≠ B × A)
先來看一下笛卡爾積的圖示,

關鍵字:join 或 cross join
A * B 笛卡爾積:
陳述句:
select *from a_table a cross join b_table b;
結果:

B * A 笛卡爾積:
陳述句:
select *from a_table a join b_table b;

參考
圖解MySQL 內連接、外連接、左連接、右連接、全連接……太多了
mysql幾種連接方式區別
MYSQL之笛卡爾積
MySQL的多表查詢(笛卡爾積原理)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/173203.html
標籤:MySQL
下一篇:mysql中的事務
