是关系型数据库的主要特点,区别其他类型数据库的主要标志
只进行笛卡尔乘积联接所有数据
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
保留关键字左表中的所有行,也称保留表 过程:
1. 先进行笛卡尔乘积得到所有行数据 2. 根据on联接条件筛选出数据 3. 添加左表中有而右表中没有的行,也称外部行,右表本中没有的行有了之后值用null填充
保留right join右边表的所有行
select * from emp e right outer join dept d on e.deptno = d.deptno -- 通过右外联接可以找到内联接的部门OPERATIONS里没有的人有谁!
保留关键字两边表的所有行 常用来查找两表中没有匹配数据的行
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. 添加外部行
分为顺序和嵌套联接
将两个结果集的重复行删除
结果包含所有行,包含两结果集中的重复行
合并结果集时使用第一个select选择列表的列名,排序时只能指定第一个select语句中指定的列名作为排序列。 order by的逻辑处理阶段在union合并结果集之后
