【MySQL--09】表的内连和外连
表的连接分为内连接和外连接
1.1内连接
内连接实际上就是利用where子句对两种表形成的笛卡尔积进行筛选,我们之前所用的查询都是内连接,也是在开发过程中使用的最多的连接查询。
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;
备注:前面所使用的基本上都是内连接
- 显示SMITH的名字和部门名称
-- 用前面的写法
select ename, dname from emp, dept where emp.deptno=dept.deptno and
ename='SMITH';
mysql> select ename, dname from emp, dept where emp.deptno=dept.deptno and
-> ename='SMITH';
+-------+----------+
| ename | dname |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)
-- 用标准的内连接写法
select ename, dname from emp inner join dept on emp.deptno=dept.deptno and
ename='SMITH';
mysql> select ename, dname from emp inner join dept on emp.deptno=dept.deptno and
-> ename='SMITH';
+-------+----------+
| ename | dname |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)
1.2外连接
外连接分为左外连接和右外连接
1.2.1左外连接
如果联合查询,左侧的表完全显示我们就说左外连接
语法: select 字段名 from 表1 left join 表2 on 连接条件
- 首先我们先建立两张测试表,然后再进行插入数据
create table stu (id int, name varchar(30)); -- 学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam (id int, grade int); -- 成绩表
insert into exam values(1, 56),(2,76),(11, 8);
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)
- 查询所有学生的成绩,如果这个学生没有成绩,也要讲学生的个人信息显示出来
当左边表和右边表没有匹配时,也会显示左边表的数据
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)
1.2.2 右外连接
如果联合查询,右侧的表完全显示我们就说是右外连接
语法: select 字段名 from 表1 right join 表2 on 连接条件
- 对
stu
和exam
表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与之对应,也要显示出来
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 |
+------+------+------+-------+
2.常见问题
2.1 表和表是怎么关联的?
表与表之间常用的关联方式有两种:内连接、外连接,下面以MySQL
为例来说明这两种连接方式。
内连接: 内连接通过INNER JOIN来实现,它将返回两张表中满足连接条件的数据,不满足条件的数据不会查询出 来。
外连接:外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的 数据。外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。
-
左外连接:可以简称为左连接(LEFT JOIN),它会返回左表中的所有记录和右表中满足连接条件 的记录。
-
右外连接:可以简称为右连接(RIGHT JOIN),它会返回右表中的所有记录和左表中满足连接条 件的记录。
除此之外,还有一种常见的连接方式:等值连接。这种连接是通过WHERE子句中的条件,将两张表连 接在一起,它的实际效果等同于内连接。出于语义清晰的考虑,一般更建议使用内连接,而不是等值连 接。
以上是从语法上来说明表与表之间关联的实现方式,而从表的关系上来说,比较常见的关联关系有:一 对多关联、多对多关联、自关联。
-
一对多关联:这种关联形式最为常见,一般是两张表具有主从关系,并且以主表的主键关联从表的 外键来实现这种关联关系。另外,以从表的角度来看,它们是具有多对一关系的,所以不再赘述多 对一关联了。
-
多对多关联:这种关联关系比较复杂,如果两张表具有多对多的关系,那么它们之间需要有一张中 间表来作为衔接,以实现这种关联关系。这个中间表要设计两列,分别存储那两张表的主键。因 此,这两张表中的任何一方,都与中间表形成了一对多关系,从而在这个中间表上建立起了多对多 关系。
-
自关联:自关联就是一张表自己与自己相关联,为了避免表名的冲突,需要在关联时通过别名将它 们当做两张表来看待。一般在表中数据具有层级(树状)时,可以采用自关联一次性查询出多层级 的数据。
2.2 说一说你对外连接的了解?
外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的 数据。常见的外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。
-
左外连接:可以简称为左连接(LEFT JOIN),它会返回左表中的所有记录和右表中满足连接条件 的记录。
-
右外连接:可以简称为右连接(RIGHT JOIN),它会返回右表中的所有记录和左表中满足连接条 件的记录。
实际上,外连接还有一种形式:完全外连接(FULL OUTER JOIN),但MySQL不支持这种形式。
2.3 说一说数据库的左连接和右连接?
外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的 数据。常见的外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。
-
左外连接:可以简称为左连接(LEFT JOIN),它会返回左表中的所有记录和右表中满足连接条件 的记录。
-
右外连接:可以简称为右连接(RIGHT JOIN),它会返回右表中的所有记录和左表中满足连接条 件的记录。