【MySQL–09】表的内连和外连


文章目录

  • 【MySQL--09】表的内连和外连
  • 1.1内连接
  • 1.2外连接
  • 1.2.1左外连接
  • 1.2.2 右外连接
  • 2.常见问题
  • 2.1 表和表是怎么关联的?
  • 2.2 说一说你对外连接的了解?
  • 2.3 说一说数据库的左连接和右连接?



表的连接分为内连接和外连接

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 连接条件

  • stuexam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与之对应,也要显示出来
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),它会返回右表中的所有记录和左表中满足连接条 件的记录。
    外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。
  • 左外连接:可以简称为左连接(LEFT JOIN),它会返回左表中的所有记录和右表中满足连接条件 的记录。
  • 右外连接:可以简称为右连接(RIGHT JOIN),它会返回右表中的所有记录和左表中满足连接条 件的记录。