oracle练习,题目来源于网络

演示使用的是oracle中scott用户提供的表,

–查询员工姓名,工作日期,并按月份数降序排序

select 
  ename,
   months_between(sysdate,hiredate) workdate 
    from 
      emp 
       order by 
         hiredate;

–查询公司员工工资的最大值,最小值,平均值,总和

select 
  max(sal) maxSal,
   min(sal) minSal,
     avg(sal) avgSal,
       sum(sal) sumSal 
        from 
         emp;

–查询各job的员工工资的最大值,最小值,平均值,总和

select 
  max(sal) jobMaxSal,
   min(sal) jobMinSal,
    avg(sal) jobAvgSal,
     sum(sal) jobSumSal 
      from 
       emp 
        group by 
         job;

–选择具有各个job_id的员工人数

select 
 job,
  count(*) 
   from 
    emp 
     group by 
      job;

补充:
count(*) count(列) count(1) 到底是哪个高效?
如果你的数据表没有主键,那么count(1)比count(*)快
如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快
如果你的表只有一个字段的话那count(*)就是最快的啦
count(星),自动会优化指定到那一个字段。所以没必要去count(1),用count( 星 ),sql会帮你完成优化的
以上是百度查询的答案 ,以下是我的个人分析
没有索引的时候,count(1) 跟 count(列)效率基本一致
如果创建了索引,并且允许为空,那么count(索引列)会高效一些,
如果创建了索引,不允许为空,count(索引列)的效率跟 count(*)基本一致
也就是说,count(1) 跟count (星)没区别, count(索引列)才会有高效的效果,前提是索引列不能为空,所以,通常写的话 count(*) 就行,因为一般表没有索引列,也就是说,它们效率基本一致

以上纯属个人观点,如果觉得有什么不对,帮忙指出一下,3q,下面是我的测试图片
oracle练习,题目来源于网络_第1张图片


回归正题,继续刷题
–查询员工最高工资和最低工资的差距
select max(sal) - min(sal) 工资差距 from emp;

–查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内

普通写法
select 
      mgr,min(sal) 
           from 
              emp 
                 where 
                    mgr is not null 
                       group by 
                          mgr 
                            having 
                               min(sal) >= 6000;

子查询的写法 
select 
  mgr,min(sal) 
    from 
     emp 
       where 
        mgr 
         in(select mgr from emp) 
           group by mgr 
             having 
               min(sal) >= 6000;

–查询所有部门的名字,location_id,员工数量和工资平均值

select 
  d.dname ,d.loc ,count(*) ,avg(e.sal)  
    from 
      dept d,emp e 
       where 
        d.deptno = e.deptno 
          group by 
            d.dname,d.loc;
这里使用俩个条件进行的分组原因是,如果没有分组的字段是不能显示在页面上的,因为我们需要loc 的数据,所以只能加一个分组条件了,

–查询和JONES相同部门的员工姓名和雇用日期

select 
  ename,hiredate 
    from 
      emp 
       where 
        deptno =  
          (select deptno from emp where ename = 'JONES');

–查询工资比公司平均工资高的员工的员工号,姓名和工资。

步骤1.查询出本公司的平均工资 2073.21
select 
  avg(sal) 
    from 
      emp;   

步骤2.查询所有人,工资大于平均工资就输出
select 
  empno,ename,sal 
   from 
    emp 
     where 
      sal 
       > 
        (select avg(sal) from emp);

–查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资

步骤1.查询所有部门的平均工资 
 select 
   avg(sal) avgSal,
     deptno 
      from 
       emp 
        group by 
         deptno;

 步骤2. 查询所有员工,工资比本部门高就输出 
 select 
   empno,ename,sal 
    from emp e,
     (select avg(sal)  avgSal,deptno from emp group by deptno) d
      where 
        e.deptno 
         = 
          d.deptno 
           and 
            e.sal 
             > 
              d.avgSal;

–查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名

步骤1. 查询包含I字母的员工所在部门,
select deptno from emp where ename like '%I%';

步骤2.查询所有员工,部门号相同就输出(结果可能有多个,所以我们使用in)
select empno,ename from emp where deptno in(select deptno from emp where ename like '%I%');

这里需要扯一嘴, 因为我的基础比较弱,所以我开始并分不清 in 和 any 的区别,查询资料后,我的理解是 in只能用作是否相等, any 是用作是否大于,小于的判断,


–查询在部门的loc为’NEW YORK’的部门工作的员工的员工号

步骤1.查询'NEW YORK'的部门 
select 
  deptno 
   from 
    dept 
     where 
      loc = 'NEW YORK';

步骤2.查询所有员工,如果部门号等于'NEW YORK'的部门号,就输出 
select 
 empno 
  from 
   emp 
    where 
     deptno 
      in
       (select deptno from dept where loc = 'NEW YORK');

–查询管理者是King的员工姓名和工资


步骤1.查询KING的员工编号 
select empno 
   from emp 
     where 
       ename 
         = 
          'KING';

步骤2. 查询所有员工信息,如果员工管理者编号等于 KING的编号,就打印
select ename,sal from emp where mgr = (select empno from emp where ename = 'KING');

exists用法:

如果查询语句,有结果,则返回true,否则返回false

– 查询有员工的部门信息

select * from dept d where exists(select * from emp e where d.deptno = e.deptno)

oracle查询的执行顺序 
1from子句组装来自不同数据源的数据;
2where子句基于指定的条件对记录行进行筛选;
3group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。

代码解释, 假设我们有3个部门,分别是  10 , 20 , 30, 
代码首先会执行  from  然后执行 where  然后执行子查询 ,子查询里面会先用 10的部门编号在emp表里找, 如果找到了 返回true;  就相当于 
select * form dept where true;
然后在执行第二遍,再用20的部门编号去emp里找,如果没有找到,那么就会返回false,就相当于 select * from dept where false;  这条语句就不会输出,然后找下一条,

oracle练习,题目来源于网络_第2张图片

这一块有一点难,需要配合执行流程来理解,

本章就讲到这里,

你可能感兴趣的:(数据库的学习)