数据库入门day06之联接查询(脑图+详解)
联接查询
是关系型数据库的主要特点,区别其他类型数据库的主要标志
交叉联接(cross join)
只进行笛卡尔乘积联接所有数据
select * from emp --14
select * from dept --4
select ename,dname from emp cross join dept --14*4=56
emp表
dept表
select ename,dname from emp cross join dept --14*4=56
内联接
先进行笛卡尔乘积,在虚拟表中使用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个人
第二点:
-- and后边的条件不生效,逻辑出错,因为外联接不能将where和on子句合并,因为在on筛选之后有添加外部行的操作,然而我不没有用where将其筛选
select * from emp e left outer join dept d on e.deptno = d.deptno and e.empno > 1
左外连接(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里没有的人有谁!
完全外部联接(full outer join)
保留关键字两边表的所有行
常用来查找两表中没有匹配数据的行
select * from emp e full outer join dept d on e.deptno = d.deptno -- 查询所有员工和所有部门的各种不匹配信息
自联接
使用同一列
查找重名员工
-- 使用同一列:查询重名员工
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合并结果集之后