mysql表的连接——内外连接
文章目录
- mysql表的内外连接
- 内连接
- 外连接
- 左外连接
- 右外连接
- 总结
mysql表的内外连接
在mysql的符合查询部分,我们学习了如何将两个表连接起来——笛卡尔积。
今天,我们将重点针对于表的连接做一个理解!
内连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
这里再提及这个概念,是因为使用内连接的说法,在语义上是更加清晰的!
接下来,我们将通过一个例子,来对内连接进行一个理解!
eg:显示SMITH的名字和其所在部门的相关信息
方法1:
# 直接使用之前学习的方法,最后通过where进行筛选:
mysql> select * from EMP, DEPT
where EMP.DEPTNO=DEPT.DEPTNO and ENAME='SMITH';
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | DEPTNO | DNAME | LOC |
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 | 20 | RESEARCH | DALLAS |
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
1 row in set (0.00 sec)
方法1我们已经很熟悉了,这里不再啰嗦。
方法2:使用内连接
# 语法
select (...) from table1 inner join table2 on ...and
# (若需要多条件级联,可以继续添加and)mysql> select * from EMP inner join DEPT on EMP.DEPTNO=DEPT.DEPTNO and ENAME='SMITH';
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | DEPTNO | DNAME | LOC |
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 | 20 | RESEARCH | DALLAS |
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
1 row in set (0.00 sec)
最后使用where来筛选也是可以的:

上述需要说明的是:
其实内连接就和直接对表进行筛选,使用笛卡尔积 + where的效果是一样的!
只不过是:在使用inner join的时候,语义更加的明确!
外连接
既然有表的内连接,也就会有表的外连接!
其中表的外连接是分为左外连接和右外连接。
左外连接
我们需要先解释,表的左外连接是什么意思呢?
当我们在连接两张表的时候,经常会需要进行筛选,把一些不太符合需求的数据筛选掉。
假设现在有一个数据是在左表是存在的,但是右表没有其对应的相关信息!
如果我们使用内连接筛选,那么只在左表存在的数据就会被过滤掉。
但是有时候我们又希望它能显示出来,哪怕其对应的信息是空!
所以,mysql提供了一种功能:表的左外连接
它能够在连接两张表的同时,把左边表的内容完好无损的显示出来!
mysql> desc students;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> desc marks;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| score | int | YES | | NULL | |
+-------+------+------+-----+---------+-------+
2 rows in set (0.00 sec)
同时插入一些数据:
# 我们可以很清晰的发现:有一些学生查不到对应的成绩,有一些成绩查不到对应的学生!
# 这是故意这么做的 就是为了后序能够演示出效果!
insert into students values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
insert into marks values(1, 56),(2,76),(11, 8);
eg:显示所有学生对应的成绩(如果学生没有成绩显示空即可)
mysql> select students.id, name, score
from students left join marks on students.id=marks.id;
+------+------+-------+
| id | name | score |
+------+------+-------+
| 1 | jack | 56 |
| 2 | tom | 76 |
| 3 | kity | NULL |
| 4 | nono | NULL |
+------+------+-------+
4 rows in set (0.00 sec)
我们发现,id=3,id=4的两个学生,在marks表中是找不到成绩的!但是通过左外连接,成功地把左表原封不动的筛选出来了!
如果使用内连接,3号和4号是没办法显示出来的:

右外连接
知道了左外连接是怎么一回事,右外连接其实也就很简单了:
其作用是连接表的时候,把右表完整显示出来!
其实,只有左外连接也是可以的!因为两个表可以互换位置!
所以:哪一个表需要完整显示,谁就放在left join的左边即可!
但是,mysql提供了这么一个功能,我们就直接用就好了!
eg:对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来:
mysql> select students.id as sid, marks.id as mid, name, score from
students right join marks on students.id=marks.id;
+------+------+------+-------+
| sid | mid | name | score |
+------+------+------+-------+
| 1 | 1 | jack | 56 |
| 2 | 2 | tom | 76 |
| NULL | 11 | NULL | 8 |
+------+------+------+-------+
3 rows in set (0.00 sec)
在我们最近常用的职工、部门、薪水等级表中,隐藏了这么一个细节:

故意留下一个部门是没有员工的!
需求:列出部门名称和这些部门的员工信息,同时列出没有员工的部门。
mysql> select ENAME, DEPT.DEPTNO, EMP.JOB from
EMP right join DEPT on EMP.DEPTNO=DEPT.DEPTNO;
+--------+--------+-----------+
| ENAME | DEPTNO | JOB |
+--------+--------+-----------+
| CLARK | 10 | MANAGER |
| KING | 10 | PRESIDENT |
| MILLER | 10 | CLERK |
| SMITH | 20 | CLERK |
| JONES | 20 | MANAGER |
| SCOTT | 20 | ANALYST |
| ADAMS | 20 | CLERK |
| FORD | 20 | ANALYST |
| ALLEN | 30 | SALESMAN |
| WARD | 30 | SALESMAN |
| MARTIN | 30 | SALESMAN |
| BLAKE | 30 | MANAGER |
| TURNER | 30 | SALESMAN |
| JAMES | 30 | CLERK |
| NULL | 40 | NULL |
+--------+--------+-----------+
15 rows in set (0.00 sec)
总结
至此,我们就对mysql中表的连接做了一个简单的理解!
我们学习了表是如何进行连接的,如何使用内外连接对表进行筛选。
