Oracle 多表查询

一、多表连接基本查询

使用一张以上的表做查询就是多表查询
语法: SELECT {DISTINCT} *|列名… FROM 表名 别名,表名 1 别名
{WHERE 限制条件 ORDER BY 排序字段 ASC|DESC…}

  • 范例:查询员工表和部门表
    在这里插入图片描述
    我们发现产生的记录数是 56 条,我们还会发现 emp 表是 14 条, dept 表是 4 条, 56 正是 emp
    表和 dept 表的记录数的乘积,我们称其为笛卡尔积。

    如果多张表进行一起查询而且每张表的数据很大的话笛卡尔积就会变得非常大,对性能造
    成影响,想要去掉笛卡尔积我们需要关联查询。
    在两张表中我们发现有一个共同的字段是 depno, depno 就是两张表的关联的字段,我们可
    以使用这个字段来做限制条件,两张表的关联查询字段一般是其中一张表的主键,另一张表的
    外键。
    在这里插入图片描述
    关联之后我们发现数据条数是 14 条,不在是 56 条。
    多表查询我们可以为每一张表起一个别名
    在这里插入图片描述

  • 查询出雇员的编号,姓名,部门的编号和名称,地址
    在这里插入图片描述

  • 范例:查询出每个员工的上级领导
    分析: emp 表中的 mgr 字段是当前雇员的上级领导的编号,所以该字段对 emp 表产生了自身关联,可以使用 mgr 字段和 empno 来关联
    在这里插入图片描述

  • 范例:在上一个例子的基础上查询该员工的部门名称
    在这里插入图片描述

  • 范例:查询出每个员工编号,姓名,部门名称,工资等级和他的上级领导的姓名,工资等级

select e.empno,e.ename,
	decode(s.grade,
		1,'一级',
		2,'二级',
		3,'三级',
		4,'四级',
		5,'五级') grade,
	d.dname,e1.empno,e1.ename,
	decode(s1.grade,
		1,'一级',
		2,'二级',
		3,'三级',
		4,'四级',
		5,'五级') grade
from emp e, emp e1, dept d, salgrade s, salgrade s1
where e.mgr = e1.empno
and e.deptno = d.deptno
and e.sal between s.losal and s.hisal
and e1.sal between s1.losal and s1.hisal

在这里插入图片描述

---笛卡尔积
select * from emp e, dept d;
---等值连接
select *
from emp e, dept d
where e.deptno=d.deptno;
---内连接
select *
from emp e inner join dept d
on e.deptno = d.deptno;

二、外连接(左右连接)

  • 右连接
    当我们在做基本连接查询的时候,查询出所有的部门下的员工,我们发现编号为 40 的部门下没有员工,但是要求把该部门也展示出来,我们发现上面的基本查询是办不到的
    在这里插入图片描述
    使用(+)表示左连接或者右连接,当(+)在左边表的关联条件字段上时是左连接,如果是在右
    边表的关联条件字段上就是右连接。

  • 范例:查询出所有员工的上级领导
    分析:我们发现使用我们以前的做法发现 KING 的上级领导没有被展示,我们需要使用左右连接把他查询出来
    在这里插入图片描述

---查询出所有部门,以及部门下的员工信息。【外连接】
select *
from emp e right join dept d
on e.deptno=d.deptno;
---查询所有员工信息,以及员工所属部门
select *
from emp e left join dept d
on e.deptno=d.deptno;
---oracle中专用外连接
select *
from emp e, dept d
where e.deptno(+) = d.deptno;

select * from emp;

---查询出员工姓名,员工领导姓名
---自连接:自连接其实就是站在不同的角度把一张表看成多张表。
select e1.ename, e2.ename
from emp e1, emp e2
where e1.mgr = e2.empno;
------查询出员工姓名,员工部门名称,员工领导姓名,员工领导部门名称
select e1.ename, d1.dname, e2.ename, d2.dname
from emp e1, emp e2, dept d1, dept d2
where e1.mgr = e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值