左外连接和左连接的区别(内连接和外连接的区别SQL)
Mysql内连接与外连接
Mysql查询可以分为内连接与外连接,同时,外连接也可以分为左外连接、右外连接与全外连接。
Mysql内连接与外连接区别
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。
右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。
全外连接:左外连接 union 右外连接,Mysql 中暂不支持。
数据准备
创建表
我们首先创建课程表,具体建表语句如下:
# 创建课程表CREATETABLEcourse( idint, namevarchar(40), urlvarchar(128) );
接着,我们创建学生表,具体建表语句如下:
# 创建学生表CREATETABLEstudent( idint, namevarchar(40), course_id int);
插入数据
首先,我们先在课程表插入数据,具体语句如下:
# 插入课程信息INSERTINTOcourse(id, name, url)values(1, "python", "https://haicoder.net/python/python-tutorial.html"); INSERTINTOcourse(id, name, url)values(2, "golang", "https://haicoder.net/golang/golang-tutorial.html"); INSERTINTOcourse(id, name, url)values(3, "java", "https://haicoder.net/java/java-development.html"); INSERTINTOcourse(id, name, url)values(4, "javascript", "https://haicoder.net/javascript/javascript-tutorial.html");
接着,我们在学生表插入数据,具体语句如下:
# 插入学生信息INSERTINTOstudent(id, name, course_id)values(1, "jobs", 1); INSERTINTOstudent(id, name, course_id)values(2, "gates", 3); INSERTINTOstudent(id, name, course_id)values(3, "jack", 5);
最后,我们使用 SELECT 语句,查看创建好的表的数据,首先,查看课程表的数据,具体语句如下:
SELECT* FROMcourse;
执行完毕后,如下图所示:
接着,我们再次查看学生表的数据,具体语句如下:
SELECT* FROMstudent;
执行完毕后,如下图所示:
内连接
语法
INNERJOIN ON
图解
内连接组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分,如下图所示:
案例
我们使用内连接查询,执行如下语句:
SELECT* FROMstudent asstu innerjoincourse ascou onstu.course_id=cou.id;
执行完毕后,如下图所示:
我们可以看到,内连接,只是查询出了两个表都有的数据,即,student 表里面有一条 id 为 3 的记录,其 course_id 为 5 在 course 表里面没有 id 为 5 的数据,因此,该条记录未被查询出来,同时,在 course 表里面有条 id 为 4 的记录,但在 student 表里面没有 course_id 为 4 的记录,所以 course 表里面的该条记录未被查询出来。
内连接还有一种隐式的写法,即不需要显示的指定 INNER JOIN 关键字,具体语法如下:
SELECTstu.id stu_id, stu.name stu_name, cou.id cou_id, cou.name cou_name, cou.url cou_url FROMstudent stu, course cou WHEREstu.course_id=cou.id;
执行完毕后,如下图所示:
我们看到,同样实现了内连接的功能。
左外连接
语法
LEFTJOIN ONLEFTOUTER JOIN ON
left join 是 left outer join 的简写,它的全称是左外连接,是外连接中的一种。
图解
左(外)连接,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为 NULL,如下图所示:
案例
我们使用内连接查询,执行如下语句:
SELECT* FROMstudent asstu LEFTOUTERJOINcourse ascou onstu.course_id=cou.id;
执行完毕后,如下图所示:
我们可以看到,左外连接 student 表里面 id 为 3 的记录,其 course_id 为 5,但 course_id 为 5 的记录在 course 表里面是不存在的,此时,我们用的是左外连接,因此,可以查出该条记录,但 course 表里面的字段的值都是 NULL。
右外连接
语法
RIGHTJOIN ONRIGHTOUTER JOIN ON
right join 是 right outer join 的简写,它的全称是右外连接,是外连接中的一种。
图解
右(外)连接,右表的记录将会全部表示出来,而左表只会显示符合搜索条件的记录。左表记录不足的地方均为 NULL,如下图所示:
案例
我们使用内连接查询,执行如下语句:
SELECT* FROMstudent asstu RIGHTOUTERJOINcourse ascou onstu.course_id=cou.id;
执行完毕后,如下图所示:
我们可以看到,右外连接 course 表里面 id 为 2 和 4 的记录,虽然在 student 表里面没有 course_id 字段与其对应,但也被查出来了,其 student 表里面的字段都为 NULL。
原文地址:https://tangjiusheng.cn/it/3146.html