Day58-Oracle02 - 内连接、外连接、子查询(exists用法,关联/非关联子查询)、课堂练习(行列转换)、rownum和rowid

本文详细介绍了Oracle数据库中的查询技术,包括笛卡尔积、内连接、外连接(左外、右外、全外)的使用,子查询的分类及应用,如单行、多行子查询以及exists的用法。此外,还探讨了关联与非关联子查询,并通过实例展示了rownum和rowid在查询中的作用。最后,分享了华为笔试题中涉及的集合运算注意事项。
摘要由CSDN通过智能技术生成

笛卡尔积 和内连接 外连接

实际上是两张表的乘积,查询结果没有实际意义
select * from emp,dept;

内连接-等值内连接(隐式)

select * from emp,dept where emp.deptno = dept.deptno;

内连接-不等值内连接
select * from emp,dept where emp.deptno <> dept.deptno;

内连接-显式内连接 
select * from emp inner join dept on emp.deptno = dept.deptno;

多表查询时,习惯性的去取别名,数据库在后台进行多表操作的时候也会自动起别名进行查询。
select * from emp e,dept d where e.deptno = d.deptno;

自连接:自己连接自己
select * from emp e1,emp m1 where e1.mgr = m1.empno;

内连接查询练习

-- 查询员工编号,员工姓名,经理编号, 经理姓名
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1,emp e2
where e1.mgr = e2.empno;

-- 查询员工编号,员工姓名,员工的部门名称,经理编号, 经理姓名
select e1.empno,e1.ename,d.dname,e1.mgr,e2.ename
from emp e1,emp e2,dept d
where e1.mgr = e2.empno and e1.deptno = d.deptno;

-- 查询员工编号,员工姓名,员工的部门名称,经理编号, 经理姓名,经理的部门名称
select e1.empno,e1.ename,d1.dname,e1.mgr,e2.ename,d2.dname
from emp e1,emp e2,dept d1,dept d2
where e1.mgr = e2.empno and e1.deptno = d1.deptno and e2.deptno = d2.deptno;
//这里是员工和经理两个对象,分别查询两个对象的部门名称,需要引入两次部门表,因为员工和他的经理可能是在同一个部门,也可能在不同的不能,如果只引用一个部门表的话会丢失掉员工和经理在不同部门的数据

-- 查询员工编号,员工姓名,员工的部门名称,员工工资等级,经理编号, 经理姓名,经理的部门名称
select e1.empno,e1.ename,d1.dname,s.grade,e1.mgr,e2.ename,d2.dname
from emp e1,emp e2,dept d1,dept d2,salgrade s
where e1.mgr = e2.empno and e1.deptno = d1.deptno and e2.deptno = d2.deptno
      and e1.sal between s.losal and s.hisal;



-- 查询员工编号,员工姓名,员工的部门名称,员工工资等级,经理编号, 经理姓名,经理的部门名称,经理工资等级
select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,e2.ename,d2.dname,s2.grade
from emp e1,emp e2,dept d1,dept d2,salgrade s1,salgrade s2
where e1.mgr = e2.empno and e1.deptno = d1.deptno and e2.deptno = d2.deptno
      and e1.sal between s1.losal and s1.hisal
      and e2.sal between s2.losal and s2.hisal;



-- 查询员工编号,员工姓名,员工的部门名称,员工工资等级(一级),经理编号, 经理姓名,经理的部门名称,经理工资等级
select e1.empno,e1.ename,d1.dname,
       case s1.grade
         when 1 then '一级'
         when 2 then '二级'
         when 3 then '三级'
         else
           '四级'
         end,
       e1.mgr,e2.ename,d2.dname,
       case s2.grade
         when 1 then '一级'
         when 2 then '二级'
         when 3 then '三级'
         when 4 then '四级'
         else
           '顶级'
         end
from emp e1,emp e2,dept d1,dept d2,salgrade s1,salgrade s2
where e1.mgr = e2.empno and e1.deptno = d1.deptno and e2.deptno = d2.deptno
      and e1.sal between s1.losal and s1.hisal
      and e2.sal between s2.losal and s2.hisal;


外连接查询练习

  • 左外连接: 查询左表中所有的记录,如果右表没有对应的记录,则显示null
    left outer join .. on

select * from emp e left outer join dept d on e.deptno = d.deptno;

  • 右外连接: 查询右表中所有的记录,如果左表没有对应的记录,则显示null
    right outer join .. on

select * from emp e right join dept d on e.deptno = d.deptno;

  • Oracle外连接特有写法: (+) : 没有对应的记录, + null 值
  • 左外连接
    select * from emp e, dept d where e.deptno = d.deptno(+);

  • 右外连接
    select * from emp e,dept d where e.deptno(+) = d.deptno;

–扩展: oracle特有, 全外连接 – full join
select * from emp e full join dept d on e.deptno = d.deptno;

内连接和外连接的区别和关系:
这里写图片描述


子查询

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值