Oracle 多表查询
发布日期:2021-05-07 19:44:22 浏览次数:19 分类:精选文章

本文共 1897 字,大约阅读时间需要 6 分钟。

文章目录

一、多表连接基本查询

使用一张以上的表做查询就是多表查询

语法: 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,'五级') gradefrom emp e, emp e1, dept d, salgrade s, salgrade s1where e.mgr = e1.empnoand e.deptno = d.deptnoand e.sal between s.losal and s.hisaland e1.sal between s1.losal and s1.hisal

在这里插入图片描述

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

二、外连接(左右连接)

  • 右连接

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

  • 范例:查询出所有员工的上级领导

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

---查询出所有部门,以及部门下的员工信息。【外连接】select *from emp e right join dept don e.deptno=d.deptno;---查询所有员工信息,以及员工所属部门select *from emp e left join dept don e.deptno=d.deptno;---oracle中专用外连接select *from emp e, dept dwhere e.deptno(+) = d.deptno;select * from emp;---查询出员工姓名,员工领导姓名---自连接:自连接其实就是站在不同的角度把一张表看成多张表。select e1.ename, e2.enamefrom emp e1, emp e2where e1.mgr = e2.empno;------查询出员工姓名,员工部门名称,员工领导姓名,员工领导部门名称select e1.ename, d1.dname, e2.ename, d2.dnamefrom emp e1, emp e2, dept d1, dept d2where e1.mgr = e2.empnoand e1.deptno=d1.deptnoand e2.deptno=d2.deptno;
上一篇:(Java 剑指 offer)和为S的连续正数序列
下一篇:Oracle 多行函数(聚合函数)和分组统计

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年03月31日 00时02分48秒