[数据库]关于三个比较典型的数据库试题

最近学习Oracle,老师讲了三个比较典型的问题,做一下总结,也便于以后复习.

下图显示的是三个题的题干和要查询的结果:

===========================================第一题============================
找到员工表中工资最高的前三名:

先说明一个现象:

 1 SQL> select rownum,ename from emp;
 2
 3 ROWNUM ENAME
 4 ---------- ----------
 5 1 SMITH
 6 2 ALLEN
 7 3 WARD
 8 4 JONES
 9 5 MARTIN
10 6 BLAKE
11 7 CLARK
12 8 SCOTT
13 9 KING
14 10 TURNER
15 11 ADAMS
16 12 JAMES
17 13 FORD
18 14 MILLER

如果在加上一些条件限制:

 1 SQL> select rownum ,ename,sal from emp order by sal desc;
 2
 3     ROWNUM ENAME             SAL
 4 ---------- ---------- ----------
 5          9 KING             5000
 6         13 FORD             3000
 7          8 SCOTT            3000
 8          4 JONES            2975
 9          6 BLAKE            2850
10          7 CLARK            2450
11          2 ALLEN            1600
12         10 TURNER           1500
13         14 MILLER           1300
14          3 WARD             1250
15          5 MARTIN           1250
16         11 ADAMS            1100
17         12 JAMES             950
18          1 SMITH             800

加上order by rownum 依旧没有变化,说明rownum是基于原始表emp进行排序的 ,固定住了.

把这个查询的结果集再看成一个新表select ename,sal from emp order by sal desc

用rownum就会对这个新表进行排序.排序的rownum按照查询的顺序来展示.

select rownum,ename,sal from
    (select ename,sal from emp order by sal desc)
    where rownum < 4

    ROWNUM ENAME             SAL
---------- ---------- ----------
         1 KING             5000
         2 SCOTT            3000
         3 FORD             3000

===========================================第二题===================================

找到员工表中薪水大于本部门平均薪水的员工

SQL> select e.empno,e.ename,e.sal,d.avgsal
     from  emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d
     where e.deptno=d.deptno and e.sal>d.avgsal;

     EMPNO ENAME             SAL     AVGSAL
---------- ---------- ---------- ----------
      7499 ALLEN            1600 1566.66667
      7566 JONES            2975       2175
      7698 BLAKE            2850 1566.66667
      7788 SCOTT            3000       2175
      7839 KING             5000 2916.66667
      7902 FORD             3000       2175

e.deptno = empavg.deptno and e.sal > empavg.salavg
翻译下来就是:第一个条件是本部门的员工,第二个是薪水大于部门的平均薪水

还有一种不用group by分组函数也能查询到

叫:相关子查询

相关子查询:将主查询中的某些值作为参数传递给子查询.

相关子查询对外边的主表有一个要求,必须有一个别名.

先不看上面结果的第四列(AVGSAL),可以很容易的查询到

select empno,ename, sal from emp e

然后查询某个部门的平均工资:

select avg(sal) from emp where deptno = ?

需要确定这个deptno是什么!

结合上面两个语句

select empno,ename, sal from emp e

where e.sal >( select avg(sal) from emp where deptno = ?)

这个问好?应该代表的是查询的当前员工所在的部门号传给这个问号.

变成:

select empno,ename, sal from emp e

where e.sal > (select avg(sal) from emp where deptno = e.deptno);

然后主查询列上要加上所在部门平均工资

把上面的最后一句查询部门的平均工资拷贝到主查询列上.就可以了.

SQL> select empno,ename, sal,(select avg( sal) from emp  where deptno = e.deptno) avgsal
      from emp e
      where e.sal>(select avg( sal) from emp  where deptno = e.deptno);

     EMPNO ENAME             SAL     AVGSAL
---------- ---------- ---------- ----------
      7499 ALLEN            1600 1566.66667
      7566 JONES            2975       2175
      7698 BLAKE            2850 1566.66667
      7788 SCOTT            3000       2175
      7839 KING             5000 2916.66667
      7902 FORD             3000       2175

===============================================第三题=======================
统计每年入职的员工的个数!

select count(*) from emp where decode(substr(to_char(hiredate,‘yyyy-mm-dd‘),3,2)80

decode(substr(to_char(hiredate,"yyyy-mm-dd"),3,4),‘81‘,count+1)

SQL> select count(*) ,
2 sum(decode(to_char(hiredate,‘RR‘),‘80‘,1,0)) "1980",
3 sum(decode(to_char(hiredate,‘RR‘),‘81‘,1,0)) "1981",
4 sum(decode(to_char(hiredate,‘RR‘),‘87‘,1,0)) "1987"
5 from emp;

COUNT(*) 1980 1981 1987
---------- ---------- ---------- ----------
14 1 10 2
时间: 2024-10-14 19:05:11

[数据库]关于三个比较典型的数据库试题的相关文章

Nosql里典型的数据库

Nosql里典型的数据库 Redis 对网站服务器进行写入 传统关系式数据库无法过多的写入 对数据库要求: 数据库高并发读写需求 解决方案: (1:读写分离 两台主如果同时写入会发生冲突 (2:水平分割: 关系式数据库 数据之间有操作 海量数据的高效率存储和访问的需求 用户如果在海量数据中查询某一条数据 记录 数据库的高扩展性和高可用性 ############################################### 任何一个领域,如果不能通过自己的努力 去获取或者超出其他人的竞争

调用数据库的三种方式

ThinkPHP 内置了抽象数据库访问层,把不同的数据库操作封装起来.我们只需要使用公共的 Db 类进行操作,无须针对不同的数据库写不同的代码和底层实现.Db 类会自动调用相应的数据库驱动来处理. 一.全局配置定义   在 common/conf/config.php 中 'DB_TYPE'=>'mysql', //数据库类型 'DB_HOST'=>'localhost', //服务器地址 'DB_NAME'=>'thinkphp', //数据库名 'DB_USER'=>'root

javaweb(三十三)——使用JDBC对数据库进行CRUD

一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的executeUpdate方法,用于向数据库发送增.删.改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化). Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的Result

C#使用DataSet Datatable更新数据库的三种实现方法

本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法.DataAdapter 更新数据源以及使用sql语句更新.分享给大家供大家参考之用.具体方法如下: 一.自动生成命令的条件 CommandBuilder 方法 a)动态指定 SelectCommand 属性 b)利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand.InsertCommand 和 UpdateCommand

学习oracle数据库引航三——数据库对象

一.表-段 表分区:便于进行删除操作等. 可以直接删除分区表(迅速). 使用while等条件时效率高. 二.索引 提高查询速度 影响DML(更新.插入.删除)效率 更新表内容同时也要更新索引的内容. 三.数据库链 database link 两台数据之间 基于分布式事务的机制. 四.表空间 可以有多个数据文件 学习oracle数据库引航三--数据库对象,布布扣,bubuko.com

Spring Security 3 (三) 用户数据存放于数据库

上章回顾: 上一章中,我们将用户名.密码以及用户对应的角色都配置于applicationContext-security.xml中,基本实现了我们能控制用户的访问权限.但是在现实开发中,我们不可能将用户信息硬编码在配置文件中,通常我们都是存放到数据中.同时我们应该对用户的密码进行加密存储. 目标: 1.将用户信息存放于数据库 2.对用户的密码进行加密 详细操作: 1.其他代码参考上一章中代码.本章中,首先我们要创建一张数据表来记录我们的用户信息.SpringSecurity提供的验证机制中,首先

浅尝key-value数据库(三)——MongoDB的分布式

浅尝key-value数据库(三)——MongoDB的分布式 测试了单机MongoDB的随机读和写入性能,这一节来讲一讲MongoDB的分布式. MongoDB的分布式分成两种,一种是Replication,一种是Sharding.我们主要来看一下Sharding. 先贴一张结构示意图: MongoDB Auto-Sharding的配置非常简单,在不同的机器分别开启shard, config server, mongos的进程即可.(假设config serevr的IP为192.168.1.11

数据库中三种范式的讲解

数据库三大范式详解 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小. 目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).巴德斯科范式(BCNF).第四范式(4NF)和第五范式(5NF,又称完美范式).满足最低要求的范式是第一范式(1NF).在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推.一般说来,数据库只需满足第三范式(3NF)

[PHP]PHP编程操作Mysql数据库的三种方式

当我开始去接触PHP的时候,真切的感受到其所具有的魅力,本着学习的态度和打破固有的语言和模式的想法,开始了PHP之旅,总的来说,走的还是比较顺利,在其中能够看到C,Java,Perl影子,学习曲线不大,但是做好产品仍然有着一条漫漫长路. 多余的话不说了,慢慢感受和领悟,本文主要讲述PHP操作数据库的三种扩展. 如下图是PHP访问数据库的三种扩展方式: 下面举出三种方式访问数据库并查询数据的实例代码: 1.mysql扩展 <?php //1:获取数据库连接 $connection = @ mysq