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