OracleSQL的多表查询看这⼀篇⽂章就够了~多表查询核⼼
数据关联
左右连接
数据分组 (分组统计、统计函数、多字段分组)
分组数据的过滤(having)
⼦查询(以上的综合)
本篇⽂章将根据以上五点进⾏SQL多表查询的详细解释,包含有语法、案例、思路、分析、测试
数据关联
概念:
多表查询,即在多张表中查询需要的信息,但是直接查询的话会产⽣笛卡尔积,会造成数据量及其庞⼤
简单说明笛卡尔积:
两个表的数据量(⾏数)相乘 这⾥是14×4 为56⾏数据
如下图:
解决:
利⽤关联字段来进⾏数据的多表查询,关联字段是根据数据来关联的 并不是字段名称
注意:
多表查询之前,⾸先必须查询各个表中的数据量,这个操作可以通过COUNT()函数来完成。
#查询emp表中的数据量
select count(*) from emp;
#查询dept表中的数据量
select count(*) from dept;
具体举例说明:
按照上⾯的思路 你可能会这样写关联字段
select * from emp,dept where deptno=deptno;
这样当然是错误的,因为数据库系统并不能⾃动识别deptno是数据哪个表的
正确的语法是这样的
select * from emp,dept where emp.deptno=dept.deptno;
查询出来的信息中并没有40部门的原因是 这样写的关联字段是根据=前的表来进⾏关联的,即emp表中没有40部门如下图:
注:
根据需求来调整显⽰的关联关系 ⽤左右连接 下⾯会讲到
如果表的名称⽐较长,那么这样的⽅式很不⽅便使⽤,解决办法就是使⽤表别名,如下:
注意语法 在查询的表名后⾯空格写别名
select * from emp e,dept d where e.deptno=d.deptno;效果跟上⾯的⼀样
注意:
这个别名只是对当前sql有效
练习案例:
查询每⼀位雇员的编号,姓名,职位,部门名称,部门位置
思路:
1、⾸先确认需要的表;
emp表可以查询雇员的编号,姓名,职位;
dept表可以查询部门名称和位置;
2、确定表的关联字段;
emp.deptno=dept.deptno
做法:
1、查询出每⼀位雇员的编号,姓名和职位;
ame,e.job from emp e;
2、为查询中引⼊部门表,同时增加消除笛卡⼉积的条件;
ame,e.job,d.dname,d.loc
from emp e,dept d
where e.deptno=d.deptno;
查询出每⼀位雇员的姓名,职位和领导姓名
思路:
1、确认需要的表;
oracle中trunc函数用法emp表可以查询雇员的姓名,职位和领导编号
emp表可以查询领导的姓名
2、确定关联字段;
<=pno,雇员的领导编号=领导的雇员编号 要
做法:
1、查询每⼀位雇员的姓名和职位
ame,e.job from emp e;
2、查询领导信息,加⼊⾃⾝关联
ame,e.ame
from emp e,emp m
=m.empno; 根据领导的编号来决定雇员的编号,所以要把mgr写在前⾯
注意:查询结果少了⼀⾏,缺少KING的领导姓名,因为他没有领导,后⾯左右链接解释。KING是没有领导的
查询出每个雇员的编号,姓名,基本⼯资,职位,领导的姓名,部门名称及位置
思路:
1、确认需要的表;
emp表查询每个雇员的编号,姓名,基本⼯资,职位
emp表查询领导的姓名
dept表查询部门的名称及位置
2、确定已知的关联字段
雇员和部门: e.deptno=d.deptno
雇员和领导: e.pno
做法:
1、查询出每个雇员的编号,姓名,基本⼯资,职位
select empno,ename,sal,job from emp;
2、加⼊领导的信息,引⼊⾃⾝关联,同时增加消除笛卡⼉积的条件
ame,e.sal,e.ame
from emp e,emp m
=m.empno;
3、加⼊部门的信息,引⼊dept表,有新表,则要继续加⼊消除笛卡⼉积的条件
ame,e.sal,e.ame,d.dname,d.loc
from emp e,emp m,dept d
=m.empno 这⾥更上⼀个案例的描述相同
and e.deptno=d.deptno; 要根据员⼯的部门编号去关联部门的表是因为题中要查询的是员⼯的部门名称与位置
注意:
要分清楚关联条件 即=左边的才是基数据(要查询的数据)根据左边来关联右边,这及其关键,要不然会造成查询的数据有很⼤的出⼊
查询出每⼀个雇员的编号,姓名,⼯资,领导的姓名,部门名称及位置,⼯资所在公司的⼯资等级此案例请⾃⼰试着做⼀下 跟上⼀个案例其实差不多
思路:
关联:
表1与表2  e.pno 以前⾯的为主导 即 以领导的数量为筛选因素(表1为主导)
表1与表3  e.deptno=d.deptno 以前⾯的为主导 即 以表1的前提为筛选因素
表1与表4  ((e.sal>s.losal) and (e.sal<s.hisal)) 以前⾯的为主导 即 以表1的前提为筛选因素
ame,e.ame,d.dname,d.ade
from  emp e,emp m,dept d,salgrade s
=m.empno and e.deptno=d.deptno  and ((e.sal>s.losal) and (e.sal<s.hisal));
⼯资等级也可以⽤以下语句
(e.sal between s.losal and s.hisal)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。