MySQL 連接 通過實例總結詳解 笛卡爾積,自然連接,內連接,外連接

MySQL 連接

表結構:
以下是使用到的兩張表instructor和teaches,我們希望通過屬性ID進行連接

mysql> select * from instructor;
+-------+------------+------------+----------+
| ID    | name       | dept_name  | salary   |
+-------+------------+------------+----------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00 |
| 12121 | Wu         | Finance    | 90000.00 |
| 15151 | Mozart     | Music      | 40000.00 |
| 22222 | Einstein   | Physics    | 95000.00 |
| 32343 | El Said    | History    | 60000.00 |
| 33456 | Gold       | Physics    | 87000.00 |
| 45565 | Katz       | Comp. Sci. | 75000.00 |
| 58583 | Califieri  | History    | 62000.00 |
| 76543 | Singh      | Finance    | 80000.00 |
| 76766 | Crick      | Biology    | 72000.00 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 |
| 98345 | Kim        | Elec. Eng. | 80000.00 |
+-------+------------+------------+----------+
12 rows in set (0.00 sec)
mysql> select * from teaches;
+-------+-----------+--------+----------+------+
| ID    | course_id | sec_id | semester | year |
+-------+-----------+--------+----------+------+
| 76766 | BIO-101   | 1      | Summer   | 2009 |
| 76766 | BIO-301   | 1      | Summer   | 2010 |
| 10101 | CS-101    | 1      | Fall     | 2009 |
| 45565 | CS-101    | 1      | Spring   | 2010 |
| 83821 | CS-190    | 1      | Spring   | 2009 |
| 83821 | CS-190    | 2      | Spring   | 2009 |
| 10101 | CS-315    | 1      | Spring   | 2010 |
| 45565 | CS-319    | 1      | Spring   | 2010 |
| 83821 | CS-319    | 2      | Spring   | 2010 |
| 10101 | CS-347    | 1      | Fall     | 2009 |
| 98345 | EE-181    | 1      | Spring   | 2009 |
| 12121 | FIN-201   | 1      | Spring   | 2010 |
| 32343 | HIS-351   | 1      | Spring   | 2010 |
| 15151 | MU-199    | 1      | Spring   | 2010 |
| 22222 | PHY-101   | 1      | Fall     | 2009 |
+-------+-----------+--------+----------+------+
15 rows in set (0.00 sec)

笛卡爾積

instructor X teaches

產生的結果最多,排列出所有可能組合,無null,連接屬性ID出現2次。

mysql> select * from instructor, teaches;
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
| ID    | name       | dept_name  | salary   | ID    | course_id | sec_id | semester | year |
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 12121 | Wu         | Finance    | 90000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 15151 | Mozart     | Music      | 40000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 22222 | Einstein   | Physics    | 95000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 32343 | El Said    | History    | 60000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 33456 | Gold       | Physics    | 87000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 58583 | Califieri  | History    | 62000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 76543 | Singh      | Finance    | 80000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 76766 | Crick      | Biology    | 72000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 98345 | Kim        | Elec. Eng. | 80000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 12121 | Wu         | Finance    | 90000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 15151 | Mozart     | Music      | 40000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 22222 | Einstein   | Physics    | 95000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 32343 | El Said    | History    | 60000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 33456 | Gold       | Physics    | 87000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 58583 | Califieri  | History    | 62000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 76543 | Singh      | Finance    | 80000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 76766 | Crick      | Biology    | 72000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 98345 | Kim        | Elec. Eng. | 80000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-101    | 1      | Fall     | 2009 |
| 12121 | Wu         | Finance    | 90000.00 | 10101 | CS-101    | 1      | Fall     | 2009 |
| 15151 | Mozart     | Music      | 40000.00 | 10101 | CS-101    | 1      | Fall     | 2009 |
| 22222 | Einstein   | Physics    | 95000.00 | 10101 | CS-101    | 1      | Fall     | 2009 |
| 32343 | El Said    | History    | 60000.00 | 10101 | CS-101    | 1      | Fall     | 2009 |
| 33456 | Gold       | Physics    | 87000.00 | 10101 | CS-101    | 1      | Fall     | 2009 |
...
180 rows in set (0.00 sec)

使用where限制連接屬性,產生結果ID出現2次,查詢到的結果除此與自然連接相同。

mysql> select * from instructor, teaches where instructor.id = teaches.id;
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
| ID    | name       | dept_name  | salary   | ID    | course_id | sec_id | semester | year |
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-101    | 1      | Fall     | 2009 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-315    | 1      | Spring   | 2010 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-347    | 1      | Fall     | 2009 |
| 12121 | Wu         | Finance    | 90000.00 | 12121 | FIN-201   | 1      | Spring   | 2010 |
| 15151 | Mozart     | Music      | 40000.00 | 15151 | MU-199    | 1      | Spring   | 2010 |
| 22222 | Einstein   | Physics    | 95000.00 | 22222 | PHY-101   | 1      | Fall     | 2009 |
| 32343 | El Said    | History    | 60000.00 | 32343 | HIS-351   | 1      | Spring   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | 45565 | CS-101    | 1      | Spring   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | 45565 | CS-319    | 1      | Spring   | 2010 |
| 76766 | Crick      | Biology    | 72000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 76766 | Crick      | Biology    | 72000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 83821 | CS-190    | 1      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 83821 | CS-190    | 2      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 83821 | CS-319    | 2      | Spring   | 2010 |
| 98345 | Kim        | Elec. Eng. | 80000.00 | 98345 | EE-181    | 1      | Spring   | 2009 |
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
15 rows in set (0.00 sec)

自然連接

只考慮兩個關係中在共同屬性上取值相同的元組對。

ID只出現1次,無nulll。

不需要使用修飾詞限制連接屬性。

mysql> select * from instructor natural join teaches;
+-------+------------+------------+----------+-----------+--------+----------+------+
| ID    | name       | dept_name  | salary   | course_id | sec_id | semester | year |
+-------+------------+------------+----------+-----------+--------+----------+------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | CS-101    | 1      | Fall     | 2009 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | CS-315    | 1      | Spring   | 2010 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | CS-347    | 1      | Fall     | 2009 |
| 12121 | Wu         | Finance    | 90000.00 | FIN-201   | 1      | Spring   | 2010 |
| 15151 | Mozart     | Music      | 40000.00 | MU-199    | 1      | Spring   | 2010 |
| 22222 | Einstein   | Physics    | 95000.00 | PHY-101   | 1      | Fall     | 2009 |
| 32343 | El Said    | History    | 60000.00 | HIS-351   | 1      | Spring   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | CS-101    | 1      | Spring   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | CS-319    | 1      | Spring   | 2010 |
| 76766 | Crick      | Biology    | 72000.00 | BIO-101   | 1      | Summer   | 2009 |
| 76766 | Crick      | Biology    | 72000.00 | BIO-301   | 1      | Summer   | 2010 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | CS-190    | 1      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | CS-190    | 2      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | CS-319    | 2      | Spring   | 2010 |
| 98345 | Kim        | Elec. Eng. | 80000.00 | EE-181    | 1      | Spring   | 2009 |
+-------+------------+------------+----------+-----------+--------+----------+------+
15 rows in set (0.00 sec)

內連接

默認join = inner join

select * from instructor join teaches;產生結果與笛卡爾積相同,ID出現2次

需要用using 指定連接屬性,則ID出現1次

mysql> select * from instructor join teaches using (ID);
+-------+------------+------------+----------+-----------+--------+----------+------+
| ID    | name       | dept_name  | salary   | course_id | sec_id | semester | year |
+-------+------------+------------+----------+-----------+--------+----------+------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | CS-101    | 1      | Fall     | 2009 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | CS-315    | 1      | Spring   | 2010 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | CS-347    | 1      | Fall     | 2009 |
| 12121 | Wu         | Finance    | 90000.00 | FIN-201   | 1      | Spring   | 2010 |
| 15151 | Mozart     | Music      | 40000.00 | MU-199    | 1      | Spring   | 2010 |
| 22222 | Einstein   | Physics    | 95000.00 | PHY-101   | 1      | Fall     | 2009 |
| 32343 | El Said    | History    | 60000.00 | HIS-351   | 1      | Spring   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | CS-101    | 1      | Spring   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | CS-319    | 1      | Spring   | 2010 |
| 76766 | Crick      | Biology    | 72000.00 | BIO-101   | 1      | Summer   | 2009 |
| 76766 | Crick      | Biology    | 72000.00 | BIO-301   | 1      | Summer   | 2010 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | CS-190    | 1      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | CS-190    | 2      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | CS-319    | 2      | Spring   | 2010 |
| 98345 | Kim        | Elec. Eng. | 80000.00 | EE-181    | 1      | Spring   | 2009 |
+-------+------------+------------+----------+-----------+--------+----------+------+
15 rows in set (0.00 sec)

外連接

full/left/right outer join 全/左/右外連接

會產生null,產生2次ID,需要用on指定連接屬性

mysql> select * from instructor left outer join teaches on instructor.id = teaches.id;
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
| ID    | name       | dept_name  | salary   | ID    | course_id | sec_id | semester | year |
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-101    | 1      | Fall     | 2009 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-315    | 1      | Spring   | 2010 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-347    | 1      | Fall     | 2009 |
| 12121 | Wu         | Finance    | 90000.00 | 12121 | FIN-201   | 1      | Spring   | 2010 |
| 15151 | Mozart     | Music      | 40000.00 | 15151 | MU-199    | 1      | Spring   | 2010 |
| 22222 | Einstein   | Physics    | 95000.00 | 22222 | PHY-101   | 1      | Fall     | 2009 |
| 32343 | El Said    | History    | 60000.00 | 32343 | HIS-351   | 1      | Spring   | 2010 |
| 33456 | Gold       | Physics    | 87000.00 | NULL  | NULL      | NULL   | NULL     | NULL |
| 45565 | Katz       | Comp. Sci. | 75000.00 | 45565 | CS-101    | 1      | Spring   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | 45565 | CS-319    | 1      | Spring   | 2010 |
| 58583 | Califieri  | History    | 62000.00 | NULL  | NULL      | NULL   | NULL     | NULL |
| 76543 | Singh      | Finance    | 80000.00 | NULL  | NULL      | NULL   | NULL     | NULL |
| 76766 | Crick      | Biology    | 72000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 76766 | Crick      | Biology    | 72000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 83821 | CS-190    | 1      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 83821 | CS-190    | 2      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 83821 | CS-319    | 2      | Spring   | 2010 |
| 98345 | Kim        | Elec. Eng. | 80000.00 | 98345 | EE-181    | 1      | Spring   | 2009 |
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
18 rows in set (0.00 sec)

使用on true where ...,則上結果中的null屬性被去掉,其他不變,依然ID出現兩次。

mysql> select * from instructor left outer join teaches on true where instructor.id = teaches.id;
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
| ID    | name       | dept_name  | salary   | ID    | course_id | sec_id | semester | year |
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-101    | 1      | Fall     | 2009 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-315    | 1      | Spring   | 2010 |
| 10101 | Srinivasan | Comp. Sci. | 65000.00 | 10101 | CS-347    | 1      | Fall     | 2009 |
| 12121 | Wu         | Finance    | 90000.00 | 12121 | FIN-201   | 1      | Spring   | 2010 |
| 15151 | Mozart     | Music      | 40000.00 | 15151 | MU-199    | 1      | Spring   | 2010 |
| 22222 | Einstein   | Physics    | 95000.00 | 22222 | PHY-101   | 1      | Fall     | 2009 |
| 32343 | El Said    | History    | 60000.00 | 32343 | HIS-351   | 1      | Spring   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | 45565 | CS-101    | 1      | Spring   | 2010 |
| 45565 | Katz       | Comp. Sci. | 75000.00 | 45565 | CS-319    | 1      | Spring   | 2010 |
| 76766 | Crick      | Biology    | 72000.00 | 76766 | BIO-101   | 1      | Summer   | 2009 |
| 76766 | Crick      | Biology    | 72000.00 | 76766 | BIO-301   | 1      | Summer   | 2010 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 83821 | CS-190    | 1      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 83821 | CS-190    | 2      | Spring   | 2009 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 | 83821 | CS-319    | 2      | Spring   | 2010 |
| 98345 | Kim        | Elec. Eng. | 80000.00 | 98345 | EE-181    | 1      | Spring   | 2009 |
+-------+------------+------------+----------+-------+-----------+--------+----------+------+
15 rows in set (0.00 sec)

總結

下表中,任意的連接類型可以與右側任意的連接條件組合,where顯然不是連接條件。

連接類型 連接條件
inner join natural
left outer join on
right outer join using(A1, A2, …, An)
full outer join
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章