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)
补充:实际上右连接可以使用左连接替代,只需要调换一下表的先后顺序即可。