MySQL 連線 通過例項總結詳解 笛卡爾積,自然連線,內連線,外連線
阿新 • • 發佈:2019-01-23
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 |