文章目录
- 🌈 一、内连接
- ⭐ 0. 准备工作
- ⭐ 1. 隐式内连接
- ⭐ 2. 显式内连接
- 🌈 二、外连接
- ⭐ 0. 准备工作
- ⭐ 1. 左外连接
- ⭐ 2. 右外连接
🌈 一、内连接
- 内连接实际上就是利用 where 子句对两张表形成的笛卡儿积进行筛选,之前所有的查询都是内连接,也是在开发过程中使用的最多的连接查询。
- 内连接查询的是两张表交集部分的数据。
- 内连接分为隐式内连接和显式内连接,隐式内连接和显式内连接除了写法不同之外,查询的结果是一致的。
⭐ 0. 准备工作
- 当前有三张表,分别是:部门表 dept,员工表 emp,薪资等级表 salgrade,之后的查询工作主要依赖于这三张表进行。
- 这三张表各自包含的字段和每个字段的内容如下。
- 员工表 emp:员工编号 (empno)、员工姓名 (ename)、员工职位 (job)、员工领导的编号 (mgr)、雇佣时间 (hiredate)、月薪 (sal)、奖金 (comm)、部门编号 (deptno)。
- 部门表 dept:部门编号 (deptno)、部门名称 (dname)、部门所在地 (loc)。
- 薪资登记表 salgrade:等级 (grade)、此等级最低工资 (losal)、此等级最高工资 (hisal)。
⭐ 1. 隐式内连接
- 之前的所有查询都属于隐式内连接。
select 字段列表 from 表1, 表2 where 条件 ... ;
案例:显示 SMITH 的名字和部门名称
- 对员工表 emp 和部门表 dept 作笛卡尔积,在 where 子句中指定使用员工表中的部门表含与部门表中的部门编号过滤迪科尔基,并且指定员工姓名为 SMITH。
⭐ 2. 显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件 ... and 其他条件;
- 显式内连接才是标准的内连接写法。
案例:显示 SMITH 的名字和部门名称
- 在 on 子句中指定内连接的连接条件为员工表的部门编号等于部门表的部门编号,再在 and 之后指定其他筛选条件为员工姓名 ename = ‘SMITH’。
🌈 二、外连接
- 外连接分为左外连接和右外连接。
⭐ 0. 准备工作
- 创建学生表:表中包含 id 和名字 name 两个字段。
- 创建成绩表:表中包含 id 和成绩 grade 这两个字段。
- 插入数据:让 id 为 1、2、11 的同学有成绩,而 3、4 号同学没有成绩,学生表中并没有 11 号同学。
⭐ 1. 左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件 ... and 其他条件;
- 左外连接查询的是表 1 的全部数据,让表 2 按照条件与表 1 进行拼接,如果条件不满足,则用 null 进行拼接。
案例:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
- 要将学生表中的内容完全显示出来,将学生表 student 设为左表即可使用左外连接。如果左表中的某条记录根据连接条件没有找到匹配的右表中的记录,则会直接显示左表中的记录信息,而其对应的右表中的列信息将会用 null 值进行填充。
- 将学生表和成绩表按照 id 进行连接起来,并且 3、4 号同学没有成绩。
⭐ 2. 右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件 ... and 其他条件;
- 右外连接查询的是表 2 的全部数据,让表 1 按照条件与表 2 进行拼接,如果条件不满足,则用 null 进行拼接。
案例:对学生表和成绩表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
- 要将成绩表中的内容完全显示出来,将成绩表 exam 设为右表即可使用右外连接。如果右表中的某条记录根据连接条件没有找到匹配的左表中的记录,则会直接显示右表中的记录信息,而其对应的左表中的列信息将会用 null 值进行填充。
- 将学生表和成绩表按照 id 进行连接起来,并且没有 11 号同学。