Oracle多表连接,自身连接(习题答案)

本文介绍了数据库中多表连接的各种类型,包括笛卡尔积、内连接、外连接和自身连接的实例,以及如何使用子查询来筛选特定条件的数据。同时,提供了多个练习题以加深对这些概念的理解,涉及员工与部门、工资等级等多个实体之间的关系处理。
摘要由CSDN通过智能技术生成

多表连接

1.表别名 别名越多越好,定义必须使用

2.笛卡尔积P61-62
2.1
(练习1)emp与dept笛卡尔积连接
select * from emp dept
(练习2)使用交叉连接,emp与dept笛卡尔积连接
select * from emp cross join dept
使用等值连接(where语句),实现emp与dept连接
select * from emp e,dept d where e.deptno=d.deptno
使用内连接(【inner】join on 语句),实现emp与dept连接
select * from emp inner join dept using(deptno)
使用自然连接(natural join 语句),实现emp与deptno连接
select * from emp natural join dept
–emp与salgrade连接(练习)
–where条件表达式
select * from emp,salgrade where emp.sal between salgrade.losal and salgrade.hisal
–内连接 on
select * from emp join salgrade on emp.sal between salgrade.losal and salgrade.hisal
4、外连接平p69悬浮元组
–按员工,汇总员工和部门信息
–按部门,汇总部门和员工信息
create table copy_emp as select * from emp where 1>1;--复制表结构,空表
desc copy_emp;
select count(*) from copy_emp;
drop table copy_emp purge
create table copy_emp as select * from emp;--复制表结构和表数据
select count(*) from copy_emp;
insert all
into copy_emp values(6699,'张三''MANAGER',NULL,NULL,2300,NULL,20)
into copy_emp values(8888,'李兴华','CLERK',7369,SYSDATE,800,100,NULL)
into copy_emp values(7777,'DAVID','CLERK',7369,to_date('1981-2-28','YYYY-MM-DD'),1600,100,NULL)
into copy_emp values(9999,'李兴华','CLERK',7369,SYSDATE,800,100,NULL)
select 1 from dual;
insert into copy_emp values(6699,'张三','MANAGER',NULL,NULL,2300,NULL,20);
insert into copy_emp values(8888,'李兴华','CLERK',7369,SYSDATE,800,100,NULL);
[习题7]显示所有员工及其所属部门信息
select * from emp e left join dept d on e.deptno=d.deptno

select * from emp e,dept d where e.deptno=d.deptno(+)
[习题8]显示所有员工及其所属部门人数(难)
select e.*,temp.dnum from(select deptno,count(*) dnum from copy_emp group by deptno)temp,copy_emp e
where temp.deptno(+)=e.deptno order by e.deptno

select e.ename,d.deptno,count(d.deptno)from copy_emp e,dept d where e.deptno=d.deptno group by d.deptno,e.ename
按部门,汇总部门和员工信息
[习题9]显示所有部门序号及各部门人数(where+group by)(难)
select d.deptno,nvl(temp.dnum,0)dnum 
from (select deptno,count(*)dnum from emp group by deptno)temp,dept d
where temp.deptno(+)=d.deptno order by d.deptno
[习题10]显示所有部门信息及各部门人数(where+group by)(难)
select d.*,nvl(temp.dnum,0)dnum
from (select deptno,count(*)dnum from emp group by deptno)temp,dept d
where temp.deptno(+)=d.deptno order by d.deptno

task10-11

5.自身连接 P77
[习题1]查询每个雇员的编号、姓名及上司的上司编号、姓名。(问题???)
select e.empno,e.ename,m.empno mno,m.ename mname from emp e,emp m 
where e.mgr=m.empno(+)
[习题2]查询每个雇员的编号、姓名及其下属的编号、姓名。
select e.empno,e.ename,l.empno lno,l.ename lname from emp e , emp l 
where l.mgr(+)=e.empno;
[习题3]查询出每个雇员的编号、姓名、部门名称及其上级领导的编号、姓名、部门名称。(问题???)
select e.empno,e.ename,p.empno mmno,p.ename mmname from emp e,emp m,emp p
where e.mgr=m.empno(+) and m.mgr=p.empno(+)
[习题4]查询1981年雇佣的全部雇员的编号、姓名、雇佣日期(按照年-月-日显示)、工作、领导姓名、雇员月工资、雇员年工资(基本工资+奖金),雇员工资等级、部门编号、部门名称、部门位置,并且要求这些雇员的月基本工资在1500~3500之间,将最后的结果按照年工资的降序排列,如果年工资相等,则按照工作进行排序
select e.empno ,e.ename,to_char(e.hiredate,'YYYY-MM-DD') hiredate, e.job,
m.ename mname,e.sal+nvl(e.comm,0) month_sal,(e.sal+nvl(e.comm,0))*12 year_sal,decode(s.grade,1,'E级工资',2,'D级工资',3,'C级工资',4,'B级工资',5,'A级工资') sgrade,
e.deptno,d.dname,d.loc 
from emp e,emp m,dept d,salgrade s
where e.mgr=m.empno(+)
      and to_char(e.hiredate,'YYYY')='1981'
      and e.deptno=d.deptno
      and e.sal between 1500 and 3500
      and e.sal between s.losal and s.hisal
 order by year_sal desc,e.job;
 
子查询
[习题5]查看比职位是SALESMAN和CLERK工资都高的员工信息(姓名、基本工资和职位)
select sal from emp where job in ('SALEMAN','CLERK');
[习题6]查看有员工的部门编号和部门名称
select d.deptno,dname,count(*) from dept d,emp e where d.deptno=e.deptno group by d.deptno,dname;
[习题7]与SALESMAN职位同部门的其他职位的员工信息(分别用in和exists实现)
select deptno from emp where job='SALESMAN';
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值