MySQL 中的完全連線
Preet Sanghavi
2023年1月3日
本教程旨在探索如何在 MySQL 中執行完全連線或完全外部連線。
完全外連線用於合併或組合來自兩個單獨表的整個資料。例如,假設我們有兩個名為 student_id
和 student_name
的表,它們有一個公共列。
我們可以通過匹配公共列的值以及 UNION
、LEFT JOIN
和 RIGHT JOIN
,在 MySQL 中完全合併這兩個表。雖然這個過程乍一看似乎很複雜,但讓我們逐步理解這些。
在開始之前,我們將通過建立一個包含幾行的 student_details
表來建立一個虛擬資料集。
-- create the table student_details
CREATE TABLE student_details(
stu_id int,
stu_firstName varchar(255) DEFAULT NULL,
stu_lastName varchar(255) DEFAULT NULL,
primary key(stu_id)
);
-- insert rows to the table student_details
INSERT INTO student_details(stu_id,stu_firstName,stu_lastName)
VALUES(1,"Preet","Sanghavi"),
(2,"Rich","John"),
(3,"Veron","Brow"),
(4,"Geo","Jos"),
(5,"Hash","Shah"),
(6,"Sachin","Parker"),
(7,"David","Miller");
要檢視資料中的條目,我們使用以下程式碼。
SELECT * FROM student_details;
輸出:
stu_id stu_firstName stu_lastName
1 Preet Sanghavi
2 Rich John
3 Veron Brow
4 Geo Jos
5 Hash Shah
6 Sachin Parker
7 David Miller
我們需要另一個名為 student_marks
的表,其中包含與 stu_id
對應的每個學生的分數。我們可以使用以下查詢建立這樣的表。
-- create the table student_marks
CREATE TABLE student_marks(
stu_id int,
stu_marks int
);
-- insert rows to the table student_marks
INSERT INTO student_marks(stu_id,stu_marks)
VALUES(1,10),
(2,20),
(3,30),
(4,7),
(5,9),
(6,35),
(7,15);
我們可以藉助以下查詢視覺化該表。
SELECT * from student_marks;
輸出:
stu_id stu_marks
1 10
2 20
3 30
4 7
5 9
6 35
7 15
讓我們的目標是對 student_details
和 student_marks
表進行完全外連線,其中 stu_id
作為兩個表中的公共列。
MySQL 中的 FULL JOIN
語句
FULL OUTER JOIN
技術的基本語法如下。
SELECT * FROM table_1
LEFT JOIN table_2 ON table_1.id = table_2.id
UNION
SELECT * FROM table_1
RIGHT JOIN table_2 ON table_1.id = table_2.id
如上面的查詢所示,我們的目標是在左連線
和右連線
的幫助下,基於公共的 id
列連線名為 table_1
和 table_2
的兩個表。
我們可以使用以下查詢來解決 student_details
和 student_marks
表的問題。
-- Full Join using UNION
SELECT * FROM student_details
LEFT JOIN student_marks ON student_details.stu_id = student_marks.stu_id
UNION
SELECT * FROM student_details
RIGHT JOIN student_marks ON student_details.stu_id = student_marks.stu_id
如上面的程式碼所示,我們正在根據 stu_id
列合併兩個正在考慮的表。上面程式碼的輸出如下。
stu_id stu_firstName stu_lastName stu_id stu_marks
1 Preet Sanghavi 1 10
2 Rich John 2 20
3 Veron Brow 3 30
4 Geo Jos 4 7
5 Hash Shah 5 9
6 Sachin Parker 6 35
7 David Miller 7 15
從輸出塊中可以看出,stu_marks
在完全外連線後根據 stu_id
正確分配給每個學生。
注意
我們可以通過在
left join
和 right join
的幫助下指定要連線的確切列名來避免重複列 stu_id
。由於我們查詢的 UNION
子句,這將建立一個沒有重複行的外連線。因此,藉助 UNION
語句以及兩個不同表上的左連線
和右連線
,我們可以有效地在 MySQL 中建立完全外連線,而不會出現任何重複行。
作者: Preet Sanghavi