oracle基础知识4_多表查询

 

   || 符号解释: 字符串连接,相当于 mssql中的 +

 

笛卡尔集:

 

联合两个表 emp, dept 查询数据,那么查询的结果:

1 列是两个表的列数相加

2 行数是这两个表的行数乘积

3 查询结果会在两个表形成笛卡尔集结果后在按照条件筛选得到。

 



 

 

笛卡尔集产生条件:

 

1 查询时省略连接条件

2 连接条件无效

3 所有表中的所有行相互连接

 

为了提高查询效率,应该让where条件的连接条件更有效

学多表下查询就是学连接条件如何写。

 

连接条件分类:

1 等值连接

查询员工信息: 员工号 姓名 月薪 部门名称

select e.empno,e.ename,e.sal,d.dname
    from emp e,dept d
    where e.deptno=d.deptno;

 

2 不等值连接

 select e.empno,e.ename,e.sal,s.grade
    from emp e,salgrade s
    where e.sal between s.losal and s.hisal;

 

3 外连接(在结果集中,包含某些不成立的记录)

看如下写法:

 

按部门统计员工人数

 select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
   from emp e,dept d
   where e.deptno=d.deptno
   group by d.deptno,d.dname

 

部门号部门名称人数
10ACCOUNTING3
20RESEARCH5
30SALES6

 

结果: 部门号40无法显示出来,虽然这部门下没人,但是按照题目要求,显示所有部门人数,应该显示40号部门为0人。

未显示原因:因为用条件 e.deptno=d.deptno,表emp中没有deptno=40的记录,因此查询结果必然没有40这项。

 

 

 

 

左外连接: 当where e.deptno=d.deptno不成立的时候,等号左边所代表的表记录 任然被包含

tablea left join tableb on 条件

右外连接: 当where e.deptno=d.deptno不成立的时候,等号右边所代表的表记录 任然被包含

tablea rigth join tableb on 条件

 

使用右外连接,达到需要的效果,语句如下:

select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
   from emp e right join dept d
   on e.deptno=d.deptno
   group by d.deptno,d.dname
   order by d.deptno ;

查询结果如下:

部门号部门名称人数
10ACCOUNTING4
20RESEARCH5
30SALES6
40OPERATIONS0

 

 

 

4 自连接(通过表的别名,将同一张表视为多张表====>就是自己跟自己连接查询,工作中常涉及到 部门表, 帖子表 设计成自连接查询)

 

select e.ename||'的领导是'||b.ename
   from emp e,emp b
   where e.mgr=b.empno;

 

FORD的领导是JONES
SCOTT的领导是JONES
JAMES的领导是BLAKE
TURNER的领导是BLAKE
MARTIN的领导是BLAKE

 

 

自连接操作不太适合操作太大的表,否则查询的时候产生的笛卡尔集会随着表记录增长而成平方级别的增长

 

 

5 层次查询(遍历的是一棵树,利用递归)

 

分析上面案例,得到领导和下属关系的树结构图如下:



 

 前一次操作的员工号是后一次操作的领导号

select level,empno,ename,sal,mgr
    from emp
    connect by prior empno=mgr
    start with mgr is null
    order by level;  --->  可以修改成 order by 1;   1表示查询条件的第一个字段,即level

 

 

执行的过程:
 1. KING: start with mgr is null ---> empno=7839
 2. where mgr = 7839; ---> 7566 7698 7782
 3. where mgr in (7566 7698 7782)

 

 结果:

LEVELEMPNOENAMESALMGR
17839KING5000 
27566JONES29757839
27698BLAKE28507839
27782CLARK24507839
37902FORD30007566
37521WARD12507698
37900JAMES9507698
37934MILLER13007782

 

 

多表连接查询案例;

查询员工工资大于本部门平均工资的员工信息:(涉及的知识1 子查询 2 多表查询 3 函数 4 分组)

 

select e.empno,e.deptno,e.ename,e.sal,d.avgsal
 from emp e,(select deptno,avg(sal)avgsal from emp group by deptno) d
  where  e.deptno= d.deptno and e.sal > d.avgsal;

 

EMPNODEPTNOENAMESALAVGSAL
769830BLAKE28501566.66667
749930ALLEN16001566.66667
790220FORD30002175
778820SCOTT30002175
756620JONES29752175
783910KING50003687.5
100110Tom_ABCD60003687.5

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值