Oracle查询

多表查询

笛卡尔积:是两张表的乘积,实际上没有多大意义。

格式:select * from1,表2

多表的综合查询:

内联接:
       隐式内联接: 
           等值内联接:   where e1.deptno = d1.deptno;
           不等值内联接:  where e1.deptno <> d1.deptno;
           自联接: 自己连接自己
       显式内连接:
       格式:inner join     on(inner可以省略)

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

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

--查询员工编号,员工姓名,员工的部门名称,经理的编号,经理的姓名,经理的部门名称
select e1.empno,e1.ename,d1.DNAME,e1.mgr,m1.ename,d2.DNAME 
from emp e1,emp m1,dept d1,dept d2 
where e1.mgr=m1.empno and d1.deptno=e1.deptno and d2.deptno=m1.deptno;
--注意要使用两张dept才可以,因为有可能员工和经理不在一个部门。如果使用一张dept表就是强制员工和经理在同一个部门。

--查询员工编号,员工姓名,员工的部门名称,员工的工资等级,经理的编号,经理的姓名,经理的部门名称
select e1.empno,e1.ename,d1.DNAME,s1.GRADE,e1.mgr,m1.ename,d2.DNAME 
from emp e1,emp m1,dept d1,dept d2,SALGRADE s1
where e1.mgr=m1.empno and d1.deptno=e1.deptno and d2.deptno=m1.deptno and e1.sal between s1.LOSAL and s1.HISAL;

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

--查询员工编号,员工姓名,员工的部门名称,员工的工资等级,经理的编号,经理的姓名,经理的部门名称,经理的工资等级
--将工资等级 1,2,3,4 显示成 中文的 一级 二级二级...
--方式1select e1.empno,e1.ename,d1.DNAME,
case s1.GRADE
when 1 then '一级'
when 2 then '二级'
when 3 then '三级'
else '四级' end "等级",
e1.mgr,m1.ename,d2.DNAME,
case s2.GRADE
when 1 then '一级'
when 2 then '二级'
when 3 then '三级'
else '四级' end "等级"
from emp e1,emp m1,dept d1,dept d2,SALGRADE s1,SALGRADE s2
where e1.mgr=m1.empno and d1.deptno=e1.deptno and d2.deptno=m1.deptno 
and e1.sal between s1.LOSAL and s1.HISAL and m1.sal between s2.losal and s2.hisal;
--方式2select e1.empno,e1.ename,d1.DNAME,
decode(s1.GRADE,1,'一级',2,'二级',3,'三级','四级')"等级",
e1.mgr,m1.ename,d2.DNAME,
decode(s2.GRADE,1,'一级',2,'二级',3,'三级','四级')"等级"
from emp e1,emp m1,dept d1,dept d2,SALGRADE s1,SALGRADE s2
where e1.mgr=m1.empno and d1.deptno=e1.deptno and d2.deptno=m1.deptno 
and e1.sal between s1.LOSAL and s1.HISAL and m1.sal between s2.losal and s2.hisal;

显式內联接:
--查询员工姓名和员工部门所处的位置
select ename,loc from emp inner join dept on emp.deptno=dept.deptno;
select ename,loc from emp join dept on emp.deptno=dept.deptno;
外联接

/*
    外连接: (标准,通用写法)
       左外连接: left outer join 左表中所有的记录,如果右表没有对应记录,就显示空
       右外连接: right outer join 右表中的所有记录,如果左表没有对应记录,就显示空
       outer 关键字可以省略  

    Oracle中的外连接: (+) 实际上是如果没有对应的记录就加上空值
          select * from emp e1,dept d1 where e1.deptno = d1.deptno(+);            
*/
--查询所有员工及其部门的信息
--通用写法
select * from emp left outer join dept on emp.deptno=dept.deptno;
--oracle特有写法
select * from emp,dept where emp.deptno=dept.deptno(+);

--查询所有部门和对应的员工信息
--通用写法
select * from emp right outer join dept on emp.deptno=dept.deptno;
--oracle特有写法
select * from emp,dept where emp.deptno(+)=dept.deptno;

Oracle外联接不可两边写加号,只能一边有

   子查询: 查询语句中嵌套查询语句; 用来解决复杂的查询语句
        查询最高工资的员工信息     
     单行子查询: > >= = < <= <> !=

     多行子查询: in not in  >any >all exists not exists

           查询领导信息

–查询最高工资的员工信息
–1.查询出最高工资 –5000
select max(sal) from emp;
–2. 工资等于最高工资
select * from emp where sal = (select max(sal) from emp);

–查询出比雇员7654的工资高,同时和7788从事相同工作的员工信息
–1.雇员7654的工资 1250
select sal from emp where empno = 7654;
–2.7788从事的工作 ANALYST
select job from emp where empno = 7788;
–3.两个条件合并
select * from emp where sal > 1250 and job = ‘ANALYST’;

select * from emp where sal > (select sal from emp where empno = 7654) and job = (select job from emp where empno = 7788);

–查询每个部门最低工资的员工信息和他所在的部门信息
–1.查询每个部门的最低工资,分组统计
select deptno,min(sal) minsal from emp group by deptno;
–2.员工工资等于他所处部门的最低工资
select *
from emp e1,
(select deptno,min(sal) minsal from emp group by deptno) t1
where e1.deptno = t1.deptno and e1.sal = t1.minsal;
–3.查询部门相关信息
select *
from emp e1,
(select deptno,min(sal) minsal from emp group by deptno) t1,
dept d1
where e1.deptno = t1.deptno and e1.sal = t1.minsal and e1.deptno = d1.deptno;

分页查询

在Oracle里只能使用rownum的子查询。

集合运算

并集:
union:去除重复的,还会进行排序
union all:不去除重复的,不会进行排序。可能结果不是同一个表。
交集:intersect
差集:minus
注意事项:

1.列的类型要一致。
2.列的顺序尽量一致
3.列的数量要一致,如果不足用null值补充,也可以与列同类型数值补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle查询练习考试是一种用于测试学生对Oracle数据库查询语言的掌握程度的考试。该考试通常包含一系列的问题和练习题,要求学生使用SQL语言来查询数据库中的数据。 在考试中,学生需要根据提供的数据库模式和题目的要求,编写查询语句来获取相应的数据结果。这些查询语句可能包括基本的SELECT语句,也可能涉及到联接查询、聚合函数、子查询等复杂操作。 考试的题目通常会设计一些真实场景的查询需求,学生需要通过理解问题背景和数据模式,分析题目要求,并运用自己对Oracle查询语言的知识,来编写相应的查询语句。 完成这样的考试对学生来说具有一定的挑战性和难度。学生需要熟悉Oracle数据库查询语言的基本语法和函数,同时还需要理解数据库的结构和关系模式,以及如何运用查询语言来处理和获取数据。 通过Oracle查询练习考试,学生能够加深对Oracle数据库查询语言的理解和实践,提高自己的数据库查询能力和技巧。同时,这样的考试也有助于学生发现自己在查询过程中存在的问题和不足,从而提升自己的学习和进步空间。 总之,通过Oracle查询练习考试,学生可以提高自己在Oracle数据库查询方面的能力和熟练度,为将来的工作和学习打下坚实的基础。同时,这样的考试也能够通过实践和挑战,完善和提升学生的知识,促进他们在数据库领域的专业发展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值