oracle--4


1、自连接:

列出所有雇员的姓名及其上级的姓名。
select e.ename, m.ename mname  from emp e ,emp m where e.mgr =m.empno(+);

列出入职日期早于其直接上级的所有雇员。
select e.ename, m.ename mname, e.hiredate eh, m.hiredate mh
  from emp e, emp m
 where e.mgr = m.empno
   and e.hiredate < m.hiredate;



2、列出从事“SALES”(销售)工作的雇员的姓名,假定不知道销售部的部门编号。  

子查询
select ename from emp where deptno =(select deptno from dept where dname='SALES');

表连接
select ename
  from emp e, dept d
 where e.deptno = d.deptno
   and d.dname = 'SALES';


3、求出部门编号为20的雇员名、部门名、薪水等级

--雇员名 emp
--部门名 dept
--薪水等级 salgrade
--部门编号为20 过滤条件
select ename, dname, grade
  from emp e, dept d, salgrade s
 where e.deptno = d.deptno
   and e.sal >= s.losal
   and e.sal <= s.hisal
   and e.deptno = 20;


4、行转列

   1)、如果course='语文',其显示内容为score,否则为null
    select name,
      decode(course, '语文', score) "语文"
      from tb_student;

   2)、查询  课程名称 获取
      select distinct course from tb_student;
    decode +分组
      select * from tb_student;

   3)、行转列
    select name,
           min(decode(course, '语文', score)) "语文",
           min(decode(course, '英语', score)) "英语",
           min(decode(course, '数学', score)) "数学"
      from tb_student
     group by name;


 

5、

99语法:概念明确 、连接条件与过滤条件 分开
注意:自然连接、using 连接 相同列名 共同所有 不能 使用表的别名访问
1、交叉连接  cross join                    -->笛卡尔积
2、自然连接(主外键|列名相同)  natural join  -->等值连接
   相同列名 共同所有 不能 使用表的别名访问
3、using 连接(列名相同)                    -->等值连接
    相同列名 共同所有 不能 使用表的别名访问
4、on  连接  解决一切       -->等值连接 非等值 自连接
   相同的列名必须区分
5、外连接 :确保主表的记录至少出现一次,从表不匹配 补充null
    left join  on|using
    right join on|using   
6、全连接: 确保 所有表的记录 至少出现一次,匹配,直接使用等值 ,不匹配相互补充null
   full join  on|using

--1、交叉连接
select * from emp cross join dept;
--2、自然连接(主外键|列名相同)  natural join  -->等值连接
select * from emp natural join dept;
--3、using连接(主外键|列名相同)    -->等值连接
select * from emp join dept using(deptno);
--4、on 连接 -->等值连接   相同的列名必须区分
select emp.deptno,empno,ename,dname from emp join dept on  emp.deptno =dept.deptno;
--4、on连接  -->非等值  员工的工资等级(一定范围内)
select ename, grade
  from emp e
  join salgrade s
    on e.sal between s.losal and s.hisal;
--4、on连接    -->自连接   员工的上级名称
select e.ename,m.ename mname  from emp e join emp m  on e.mgr =m.empno;
--5、所有部门的员工数
--员工数
select count(*),deptno from emp group by deptno;
--左外
select dname ,c from dept d left join (select count(*) c, deptno from emp group by deptno) e
 using (deptno);
select dname ,c from dept d left join (select count(*) c, deptno from emp group by deptno) e
 on d.deptno=e.deptno;
 --右外
 select dname, c
   from (select count(*) c, deptno from emp group by deptno) e
  right join dept d
  using (deptno);

----11.求出部门编号为20的雇员名、部门名、薪水等级
--雇员名 emp
--部门名 dept
--薪水等级 salgrade
--部门编号为20 过滤条件
select ename, dname, grade
  from emp e natural
  join dept d
  join salgrade s
    on e.sal >= s.losal
   and e.sal <= s.hisal
 where deptno = 20;

select ename, dname, grade
  from emp e
  join dept d using(deptno)
  join salgrade s
    on e.sal >= s.losal
   and e.sal <= s.hisal
 where deptno = 20;

select ename, dname, grade
  from emp e
  join dept d
    on e.deptno = d.deptno
  join salgrade s
    on e.sal >= s.losal
   and e.sal <= s.hisal
 where e.deptno = 20;
 
--创建表 了解 全连接
create table tb_test1(
     id number(1),
     name varchar2(2)
)
insert into tb_test1 values(1,'a');
insert into tb_test1 values(2,'b');
insert into tb_test1 values(4,'f');
commit;
create table tb_test2(
     id number(1),
     name varchar2(2)
)
insert into tb_test2 values(1,'c');
insert into tb_test2 values(3,'d');
commit;
 

select * from tb_test1;
select * from tb_test2;
--左链
select id,t1.name,t2.name from tb_test1 t1 left join tb_test2 t2 using (id);  
--全连接
select id,t1.name,t2.name from tb_test1 t1 full join tb_test2 t2 using (id);
 
--92如何实现 全连接?



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值