1.內連接
內連接實際上就是利用 WHERE
子句(連接條件)對兩張表形成的笛卡爾積(內連接)進行篩選,我們之前學習的查詢基本都是內連接,也是在實際生產中被使用得最多的連接查詢。
另外內連接還可以使用下面的語法形式來達成內連接:
# 內連接的語法形式
SELECT 字段 FROM 表1 [as] INNER JOIN 表2 [as] ON 連接條件 AND 其他條件;
上述的語法形式比我們之前的笛卡爾積更加準確,語義更加明顯,但結果一樣。
# 嘗試使用笛卡爾積的兩種做法
mysql> select emp.ename, dept.dname from emp, dept where emp.deptno=dept.deptno;
+--------+------------+
| ename | dname |
+--------+------------+
| clark | accounting |
| king | accounting |
| miller | accounting |
| smith | research |
| jones | research |
| scott | research |
| adams | research |
| ford | research |
| allen | sales |
| ward | sales |
| martin | sales |
| blake | sales |
| turner | sales |
| james | sales |
+--------+------------+
14 rows in set (0.00 sec)mysql> select emp.ename, dept.dname from emp inner join dept where emp.deptno=dept.deptno;
+--------+------------+
| ename | dname |
+--------+------------+
| clark | accounting |
| king | accounting |
| miller | accounting |
| smith | research |
| jones | research |
| scott | research |
| adams | research |
| ford | research |
| allen | sales |
| ward | sales |
| martin | sales |
| blake | sales |
| turner | sales |
| james | sales |
+--------+------------+
14 rows in set (0.00 sec)
2.外連接
外連接本身又分為:左連接(左側的表完全顯示) 和 右連接(右側的表完全顯示)。
# 左連接和右連接的語法形式
SELECT 字段 FROM 表1 LEFT JOIN 表2 ON 連接條件;
SELECT 字段 FROM 表1 RIGHT JOIN 表2 ON 連接條件;
我們來實際操作一下就知道了:
# 左連接、右連接的使用
mysql> select * from stu;
+------+------+
| id | name |
+------+------+
| 1 | jack |
| 2 | tom |
| 3 | kity |
| 4 | nono |
+------+------+
4 rows in set (0.00 sec)mysql> select * from exam;
+------+-------+
| id | grade |
+------+-------+
| 1 | 56 |
| 2 | 76 |
| 11 | 8 |
+------+-------+
3 rows in set (0.00 sec)# (1)左連接:查詢學生對應的成績,但是如果有沒找到的成績,也必須把所有學生名字顯示出來
mysql> select * from stu left join exam on stu.id=exam.id;
+------+------+------+-------+
| id | name | id | grade |
+------+------+------+-------+
| 1 | jack | 1 | 56 |
| 2 | tom | 2 | 76 |
| 3 | kity | NULL | NULL |
| 4 | nono | NULL | NULL |
+------+------+------+-------+
4 rows in set (0.00 sec)# (2)右連接:顯示學生對應的成績,但是如果沒有找到的學生,也必須把所有成績顯示出來
mysql> select * from stu right join exam on stu.id=exam.id;
+------+------+------+-------+
| id | name | id | grade |
+------+------+------+-------+
| 1 | jack | 1 | 56 |
| 2 | tom | 2 | 76 |
| NULL | NULL | 11 | 8 |
+------+------+------+-------+
3 rows in set (0.00 sec)
補充:實際上右連接可以使用左連接替代,只需要調換一下表的先后順序即可。