「前言」文章内容大致是对MySQL表的内连接和外连接。
「归属专栏」MySQL
「主页链接」个人主页
「笔者」枫叶先生(fy)
目录
- 一、内连接
- 二、外连接
-
- 2.1 左外连接
- 2.2 右外连接
一、内连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,前面篇章学习的查询都是内连
接,也是在开发过程中使用的最多的连接查询
内连接语法如下:
SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;
说明:
- 大写的表示关键字,[ ]中代表的是可选项
- 内连接的条件通过连接条件指明,用户的其他筛选条件通过其他条件指明
显示SMITH的名字和部门名称
按照之前的做法就是,取员工表和部门表的笛卡尔积,在where子句中指明筛选条件为员工的部门号等于部门的部门号,筛选出每个员工匹配的部门信息,并指明员工姓名为SMITH
mysql> select ename, dname from emp, dept
-> where emp.deptno = dept.deptno and ename='SMITH';
上述多表查询的方式本质就是内连接,下面使用标准的内连接SQL编写(写法不同而已):
- 将员工表和部门号放在from子句中并通过
inner join
关键字隔开 - 在
on
子句后指明内连接的条件为员工的部门号等于部门的部门号,保证筛选出来的数据是有意义的 - 在
and
之后指明筛选条件为员工的姓名为SMITH
mysql> select ename, dname from emp inner join dept
-> on emp.deptno = dept.deptno and ename='SMITH';
二、外连接
外连接又分为左外连接和右外连接
2.1 左外连接
如果进行联合查询,左侧的表完全显示我们就说是左外连接,而右侧的数据不完全显示或者为NULL
语法如下:
SELECT ... FROM t1 LEFT JOIN t2 ON 连接条件 [LEFT JOIN t3 ON 连接条件] ... AND 其他条件;
说明:
- 写的表示关键字,[ ]中代表的是可选项
- 左外连接的条件通过连接条件指明,用户的其他筛选条件通过其他条件指明
例如,创建两张表
-- 建两张表
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);
查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
题目要求将没有成绩的学生的个人信息也要显示出来,也就是说学生表当中的内容需要完全被显示出来。
如果在连接学生表和成绩表时将学生表放在左侧,那么就可以使用左外连接
如果左侧表中的某条记录根据连接条件没有找到匹配的右侧表中的记录,其对应的右侧表中的列信息将会用NULL值进行填充
mysql> select * from stu left join exam on stu.id=exam.id;
2.2 右外连接
如果联合查询,右侧的表完全显示我们就说是右外连接,而左侧的数据不完全显示或者为NULL
语法如下:
SELECT ... FROM t1 RIGHT JOIN t2 ON 连接条件 [RIGHT JOIN t3 ON 连接条件] ... AND 其他条件;
说明:
- 大写的表示关键字,[ ]中代表的是可选项
- 右外连接的条件通过连接条件指明,用户的其他筛选条件通过其他条件指明
对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
题目要求将没有学生与它对应的成绩信息也要显示出来,也就是成绩表当中的内容需要完全被显示出来
如果在连接学生表和成绩表时将成绩表放在右侧,那么就可以使用右外连接
右侧表中的某条记录根据连接条件没有找到匹配的左侧表中的记录,而其对应的左侧表中的信息将会用NULL值进行填充
mysql> select * from stu right join exam on stu.id=exam.id;
练习:列出部门名称和这些部门的员工信息,同时列出没有员工的部门
使用的是雇员信息的数据库
题目要求同时列出部门名和员工信息,因此需要将部门表和员工表连接起来
题目要求同时列出没有员工的部门,也就是部门表当中的内容需要完全被显示出来,如果在连接部门表和员工表时将部门表放在左侧,那么就可以使用左外连接
mysql> select dname, emp.* from dept left join emp on dept.deptno=emp.deptno;
也可以右外连接进行操作,右外连接就是显示完全右边的表,即部门表
mysql> select dname, emp.* from emp right join dept on dept.deptno=emp.deptno;
——————— END ———————-
「 作者 」 枫叶先生
「 更新 」 2023.8.26
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
或有谬误或不准确之处,敬请读者批评指正。