连表查询
适用条件
当要查询的数据来自于多个数据源时使用连表查询
92语法
语法
- select 数据 from 数据源1,数据源2… where 行过滤条件 group by 分组字段1,分组字段2… having 组过滤信息 order by 排序字段1,… desc|asc;
执行流程
- from --> where --> group by --> having --> select --> order by
表连接条件
- 过滤通过连表产生的不满足要求的表连接数据
- 实现方式
- 等值连接
- 判断两个数据源中的某个字段值相等或者不相等,用“=” 判断
- 非等值连接
- 判断区间,判断范围的条件,不用 “ =” 判断,可以用between and来判断
- 分类
- 自连接
- 特殊的等值连接 (来自于同一张表)
- select e.ename, m.ename from emp e, emp m where e.mgr = m.empno;
- 内连接
- 满足连接条件查询到不满足过滤掉
- 外连接
- 某一个数据源中的数据不满足连接条件的时候也能显示
- 左外连接|左连接
- from后面,主表在左边
- select * from emp e1,emp e2 where e1.mgr=e2.empno(+);
- 右外连接|右连接
- from后面,主表在右边
- select * from emp e1,emp e2 where e1.mgr(+)=e2.empno;
- 主表
- 主表中的数据无论是否满足连接条件都能显示
- 位置
- 在连接条件位置,(+)的对面是主表
99语法
交叉连接
- cross join —>笛卡尔积
- select 数据 from 数据源1 cross join 数据源2
等值连接和非等值连接
-
等值连接
-
自然连接 natural join -->自动做等值连接(根据同名字段|主外键字段)
- 在自然连接中同名字段不能使用指定的表限定词
- join using 连接(同名字段) -->根据给定的同名字段做等值连接
- 在join…using中同名字段不能使用指定的表限定词
-
非等值连接
-
判断区间,判断范围的条件
- select ename,sal,job,grade from emp e join salgrade s on sal between losal and hisal - select * from emp e1 inner join emp e2 on e1.mgr=e2.empno
[inner] join on 连接
- 数据源1 +join +数据源2 +on + 连接条件
- 等值连接 非等值 自连接 都可以实现
- 在join…on中同名字段的必须使用制定的表限定词
内连接和外连接
- 内连接
- 数据源1 + (inner) join +数据源2
- 默认 join 为内连接
- 外连接
- 主表中的数据无论是否满足连接条件都显示
- 左外连接|左连接 : left join
- select * from emp e1 left join emp e2 on e1.mgr=e2.empno;
- 右外连接|右连接 : right join
- select * from emp e1 right join emp e2 on e1.mgr=e2.empno;
全连接
- full join on|using
- 两张表都是主表
- 全连接 满足直接匹配,不满足 相互补充null ,确保 所有表的记录 都至少出现一次
- select * from emp e1 full join emp e2 on e1.mgr=e2.empno