多表连接分类
连接查询分类
内连接:相当于查询 A,B 交集部分数据
外连接
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
子查询
(1) 内连接
隐式链接
sql
SELECT 字段列表 FROM 表1,表2 WHERE 条件;
显式链接
SQL
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
案例
- 查询每一个员工的姓名,以及关联的部门的名称(隐式内链接实现)
表结构: emp
, dept
连接条件: emp.dept_id = dept.id
sql
select emp.name,dept.name from emp,dept where emp.dept_id = dept.id;
-- 为没一张表起别名,简化SQL编写
select e.name,d.name from emp e,dept d where e.dept_id = d.id;
-- 这里注意使用了别名 以后都得用别名了
- 查询每一个员工的姓名,以及关联的部门名称(显式内连接实现)
表结构: emp
, dept
连接条件: emp.dept_id = dept.id
sql
SELECT e.name,d.name FROM emp e INNER JOIN dept d ON e.dept_id = d.id;
-- 为每一张表起别名,简化SQL编写
SELECT e.name,d.name FROM emp e JOIN dept d ON e.dept_id = d.id;
警告
table as 别名 1,table as 别名 2
table 别名 1,table 别名 2
一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段
外连接
左外连接
sql
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
左外连接相当于查询表 1(左表)的所有数据,当然也包含表一和表二交集部分的数据
右外连接
sql
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
右外连接相当于查询表 2(右表)的所有数据,当然也包含表一和表二交集部分的数据
案例
- 查询 emp 表的所有数据和对应的部门信息
由于需求中提到,要查询 emp 的所有数据,所以是不能内连接查询的,需要考虑外连接查询
表结构 emp ,dept
连接条件 emp.dept_id = dept.id
sql
SELECT e.*,d.name FROM emp e left outer join dept d on e.dept_id = d.id;
SELECT e.*,d.name FROM emp e left join dept d on e.dept_id = d.id;
- 查询 dept 表的所有数据和对应的员工信息(右外连接)
由于需求中提到 要查询 dept 表的所有数据,所以是不能内连接查询的.需要考虑外连接查询
表结构: emp,dept
连接条件: emp.dept_id = dept.id
sql
SELECT e.*,d.name FROM emp e right outer join dept d on e.dept_id = d.id;
SELECT e.*,d.name FROM emp e right join dept d on e.dept_id = d.id;
警告
注意事项:
左外连接和右外连接是可以相互替换的,只需要调整在连接查询时,哪个是左表哪个是右表即可
左外连接和右外连接的效果是不同的
我们日常开发的时候,更偏向于左外连接