连接查询是数据库中很重要的查询操作,其可以实现将多张表按照某个条件进行连接。主要包括内连接、左连接、右连接。
我们的数据表如下:
此时,如果想要对这两个表进行查询,比如:
select * from students, classes;
此时会产生笛卡尔积,如下表所示:
上表【图-1】似乎看不出来什么规律,其实它产生了一个笛卡尔积。假设:A(1, 2, 3), B(a, b), 则按照上面方式查询出来的结果为:
1a 1b 2a 2b 3a 3n
这里面的数据可能有我们想要的结果,但是也有很多冗余、无用的信息。我们可以通过两个表之间的关联关系去除这些冗余信息。
- 内连接
- 外连接
1. 内连接查询
内连接查询的语法为:
select * from students s inner join classes c on s.cls_id = c.id;
这行 SQL 语句的过程如下:先从 students 中取出一条数据,并拿着它的 cls_id 和 classes 表中的 id 进行比较,如果满足条件,则将该条数据假如到临时表中,如果不满足则丢弃该条数据。
2. 外连接
外连接包含:左外连接、右外连接。左连接的语法为:
select * from students s left join classes c on s.cls_id = c.id;
从 students 表取出一条数据的 cls_id 和 classes 的 id 进行比较,如果满足 on 条件,则将这两个表的对应的两条数据合并为一条,加入到临时表中。如果在 classes 表中有多条数据满足 on 条件,则产生多条数据并加入到临时表中。如果 classes 中没有满足条件的数据,则以 NULL 显示。
select * from students s right join classes c on s.cls_id = c.id;
右连接表示以 right join 右侧的表为主,从右表 classes 中取出一条数据的 id 去匹配左表 students 中的 cls_id,满足一条就加到临时表中。对于,我们 students 和 classes 两张表的情况,classes 一条数据可能有多条 students 表中的数据匹配,此时会生成多条数据加入到临时表中。如果 classes 中的数据 id 在 students 中的 cls_id 都不对应,则以 NULL 表示。
左右连接的区别是,左连接以 left join 左边的表为主,在右面的表中去匹配满足 on 条件的数据。而右连接则以 right join 右面的表为主,在左边的表中去搜索满足 on 条件的数据。两者匹配失败,不会丢弃数据,以 NULL 显示。
内连接和外连接的区别是:内连接在不满足 on 条件时会丢弃数据。