Mysql内连接与外连接

Mysql 查询可以分为内连接与外连接,同时,外连接也可以分为左外连接、右外连接与全外连接。

Mysql内连接与外连接区别

内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。

外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。

左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。

右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。

全外连接:左外连接 union 右外连接,Mysql 中暂不支持。

数据准备

创建表

我们首先创建课程表,具体建表语句如下:

# 创建课程表 CREATE TABLE course( id int, name varchar(40), url varchar(128) );

接着,我们创建学生表,具体建表语句如下:

# 创建学生表 CREATE TABLE student( id int, name varchar(40), course_id int );

插入数据

首先,我们先在课程表插入数据,具体语句如下:

# 插入课程信息 INSERT INTO course(id, name, url)values(1, "python", "https://haicoder.net/python/python-tutorial.html"); INSERT INTO course(id, name, url)values(2, "golang", "https://haicoder.net/golang/golang-tutorial.html"); INSERT INTO course(id, name, url)values(3, "java", "https://haicoder.net/java/java-development.html"); INSERT INTO course(id, name, url)values(4, "javascript", "https://haicoder.net/javascript/javascript-tutorial.html");

接着,我们在学生表插入数据,具体语句如下:

# 插入学生信息 INSERT INTO student(id, name, course_id)values(1, "jobs", 1); INSERT INTO student(id, name, course_id)values(2, "gates", 3); INSERT INTO student(id, name, course_id)values(3, "jack", 5);

最后,我们使用 SELECT 语句,查看创建好的表的数据,首先,查看课程表的数据,具体语句如下:

SELECT * FROM course;

执行完毕后,如下图所示:

01_mysql连接.png

接着,我们再次查看学生表的数据,具体语句如下:

SELECT * FROM student;

执行完毕后,如下图所示:

02_mysql连接.png

内连接

语法

INNER JOIN ON

图解

内连接组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分,如下图所示:

03_mysql连接.png

案例

我们使用内连接查询,执行如下语句:

SELECT * FROM student as stu inner join course as cou on stu.course_id=cou.id;

执行完毕后,如下图所示:

04_mysql连接.png

我们可以看到,内连接,只是查询出了两个表都有的数据,即,student 表里面有一条 id 为 3 的记录,其 course_id 为 5 在 course 表里面没有 id 为 5 的数据,因此,该条记录未被查询出来,同时,在 course 表里面有条 id 为 4 的记录,但在 student 表里面没有 course_id 为 4 的记录,所以 course 表里面的该条记录未被查询出来。

内连接还有一种隐式的写法,即不需要显示的指定 INNER JOIN 关键字,具体语法如下:

SELECT stu.id stu_id, stu.name stu_name, cou.id cou_id, cou.name cou_name, cou.url cou_url FROM student stu, course cou WHERE stu.course_id=cou.id;

执行完毕后,如下图所示:

05_mysql连接.png

我们看到,同样实现了内连接的功能。

左外连接

语法

LEFT JOIN ON LEFT OUTER JOIN ON

left join 是 left outer join 的简写,它的全称是左外连接,是外连接中的一种。

图解

左(外)连接,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为 NULL,如下图所示:

06_mysql连接.png

案例

我们使用内连接查询,执行如下语句:

SELECT * FROM student as stu LEFT OUTER JOIN course as cou on stu.course_id=cou.id;

执行完毕后,如下图所示:

07_mysql连接.png

我们可以看到,左外连接 student 表里面 id 为 3 的记录,其 course_id 为 5,但 course_id 为 5 的记录在 course 表里面是不存在的,此时,我们用的是左外连接,因此,可以查出该条记录,但 course 表里面的字段的值都是 NULL。

右外连接

语法

RIGHT JOIN ON RIGHT OUTER JOIN ON

right join 是 right outer join 的简写,它的全称是右外连接,是外连接中的一种。

图解

右(外)连接,右表的记录将会全部表示出来,而左表只会显示符合搜索条件的记录。左表记录不足的地方均为 NULL,如下图所示:

08_mysql连接.png

案例

我们使用内连接查询,执行如下语句:

SELECT * FROM student as stu RIGHT OUTER JOIN course as cou on stu.course_id=cou.id;

执行完毕后,如下图所示:

09_mysql连接.png

我们可以看到,右外连接 course 表里面 id 为 2 和 4 的记录,虽然在 student 表里面没有 course_id 字段与其对应,但也被查出来了,其 student 表里面的字段都为 NULL。