[MySQL]MySQL内外连接
文章目录
- [MySQL]MySQL内外连接
- 1. 内连接
- 2. 外连接
- 2.1 左外连接
- 2.2 右外连接
- 3. 简单练习
1. 内连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,也是在开发过程中使用的最多的连接查询。
语法:
SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;
- 内连接的条件通过连接条件指明,用户的其他筛选条件通过其他条件指明。
- 内连接的效果和多表查询的效果相同。
示例:显示SMITH的名字和部门名称。
现给出以下表:
此表为员工表,其中ename就是员工姓名。
还有另一张表:
此表为部门表,其中dname就是部门名称。
要显示SMITH的名字和部门名称,可以选择直接对两张表进行笛卡尔积运算,然后筛选出部门号相同,名字是SMITH的记录:
除了上面这种方式还可以直接使用内连接,内连接的是员工表和部门表,连接条件是部门号相同,其他条件为姓名为SMITH:
2. 外连接
2.1 左外连接
如果联合查询,左侧的表完全显示我们就说是左外连接。
语法:
SELECT ... FROM t1 LEFT JOIN t2 ON 连接条件 [LEFT JOIN t3 ON 连接条件] ... AND 其他条件;
- 左侧的表完全显示。
- 右侧的表中连接条件满足的就将数据连接,不满足的将null值连接。
测试样例: 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来。
用下面的SQL语句创建两张表,然后插入一部分数据。
-- 建两张表
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);
学生表的结构和数据如下:
成绩表的结构和数据如下:
如果使用内连接,连接条件为id相同,只会显示id相同的连接记录:
由于学生没有成绩,也要将学生的个人信息显示出来,因此需要将学生表放在左侧并且使用左外连接,连接条件为id相同,id相同且成绩表中有成绩的会将数据连接过来,id相同且成绩表中没有成绩的会将null值连接过来:
2.2 右外连接
如果联合查询,右侧的表完全显示我们就说是右外连接。
语法:
SELECT ... FROM t1 RIGHT JOIN t2 ON 连接条件 [RIGHT JOIN t3 ON 连接条件] ... AND 其他条件;
- 右侧的表完全显示。
- 左侧的表中连接条件满足的就将数据连接,不满足的将null值连接。
示例: 对学生表和成绩表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来。
由于需要把所有的成绩都显示出来,因此需要将成绩表放在右侧并且使用右外连接,连接条件为id相同,如果该成绩没有学习对应,左侧会将null值连接过来。
3. 简单练习
列出部门名称和这些部门的员工信息,同时列出没有员工的部门。
由于需要部门表和员工表,需要先查看一下表的数据:
部门表的数据如下:
员工表的数据如下:
列出部门名称和这些部门的员工信息,同时列出没有员工的部门,由此可以看出无论有没有员工都要显示部门,因此可以选择将部门表作为左侧表进行左外连接,连接条件为部门号相同,为了方便查看我们对结果按照部门号进行升序排序:
同样的,还可以将部门表作为右侧表进行右外连接,连接条件为部门号相同,为了方便查看我们对结果按照部门号进行升序排序: