数据库入门day06之联接查询(脑图+详解)

数据库入门day06之联接查询(脑图+详解)

联接查询

是关系型数据库的主要特点,区别其他类型数据库的主要标志

交叉联接(cross join)

只进行笛卡尔乘积联接所有数据

select * from emp --14
select * from dept --4
select ename,dname from emp cross join dept --14*4=56 

emp表 

数据库入门day06之联接查询(脑图+详解)

 

dept表 

数据库入门day06之联接查询(脑图+详解)

select ename,dname from emp cross join dept --14*4=56 

数据库入门day06之联接查询(脑图+详解)

 

内联接

先进行笛卡尔乘积,在虚拟表中使用on筛选器,两表不匹配的行被清除掉,得到内联接的查询结果

等值联接

select * from emp e inner join dept d on e.deptno = d.deptno and e.empno = 7788   -- 内联接 等值联接

不等值联接

select * from emp e inner join dept d on e.deptno = d.deptno and e.empno <> 7788 -- 内联接 不等值联接,我们不难发现,少2人!(TONY和test去哪了)

外联接

第一点:

select * from emp e left outer join dept d on e.deptno = d.deptno -- 通过左外联接可以找到我查询少了2个人

数据库入门day06之联接查询(脑图+详解)

第二点: 

-- and后边的条件不生效,逻辑出错,因为外联接不能将where和on子句合并,因为在on筛选之后有添加外部行的操作,然而我不没有用where将其筛选
select * from emp e left outer join dept d on e.deptno = d.deptno and e.empno > 1  

数据库入门day06之联接查询(脑图+详解)

左外连接(left outer join)

保留关键字左表中的所有行,也称保留表
过程:

1. 先进行笛卡尔乘积得到所有行数据
2. 根据on联接条件筛选出数据
3. 添加左表中有而右表中没有的行,也称外部行,右表本中没有的行有了之后值用null填充

右外联接(right outer join)

保留right join右边表的所有行

select * from emp e right outer join dept d on e.deptno = d.deptno -- 通过右外联接可以找到内联接的部门OPERATIONS里没有的人有谁!

数据库入门day06之联接查询(脑图+详解)

 

完全外部联接(full outer join)

保留关键字两边表的所有行
常用来查找两表中没有匹配数据的行

select * from emp e full outer join dept d on e.deptno = d.deptno -- 查询所有员工和所有部门的各种不匹配信息

数据库入门day06之联接查询(脑图+详解)

 

自联接

使用同一列

查找重名员工

-- 使用同一列:查询重名员工
select * from emp a join emp b on a.ename = b.ename where a.ename<>b.ename 

使用不同列

查询每个员工的领导(一张表中)

select a.empno,a.ename,b.ename as 领导  
from emp a left join emp b 
on a.mgr = b.empno -- 查询员工的领导

逻辑处理过程

from子句中的操作,3个阶段都在where子句之前执行
每个阶段会产生一张虚拟表作为下一阶段的输入表

内联接的逻辑处理过程:1. 执行笛卡尔积 2. on筛选器

外联接的逻辑处理过程:1. 执行笛卡尔积 2. on筛选器 3. 添加外部行

多表联接

分为顺序和嵌套联接

合并结果集

union

将两个结果集的重复行删除

union all

结果包含所有行,包含两结果集中的重复行

对合并结果集排序

合并结果集时使用第一个select选择列表的列名,排序时只能指定第一个select语句中指定的列名作为排序列。
order by的逻辑处理阶段在union合并结果集之后