Oracle基础练习题,采用Oracle数据库自带的表,适合初学者,其中包括了一些简单的查询,已经具有Oracle自身特点的单行函数的应用

本文使用的实例表结构与表的数据如下:

emp员工表结构如下:

  1. Name     Type         Nullable Default Comments
  2. -------- ------------ -------- ------- --------
  3. EMPNO    NUMBER(4)                       员工号
  4. ENAME    VARCHAR2(10) Y                  员工姓名
  5. JOB      VARCHAR2(9)  Y                  工作
  6. MGR      NUMBER(4)    Y                  上级编号
  7. HIREDATE DATE         Y                  雇佣日期
  8. SAL      NUMBER(7,2)  Y                  薪金
  9. COMM     NUMBER(7,2)  Y                  佣金
  10. DEPTNO   NUMBER(2)    Y                  部门编号

dept部门表:

  1. Name   Type         Nullable Default Comments
  2. ------ ------------ -------- ------- --------
  3. DEPTNO NUMBER(2)                         部门编号
  4. DNAME  VARCHAR2(14) Y                    部门名称
  5. LOC    VARCHAR2(13) Y                    地点

提示:工资 = 薪金 + 佣金

emp表的现有数据如下:

  1. SQL> select * from emp;
  2. EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
  3. ----- ---------- --------- ----- ----------- --------- --------- ------
  4. 7369  SMITH      CLERK      7902 1980-12-17     800.00               20
  5. 7499  ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
  6. 7521  WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
  7. 7566  JONES      MANAGER    7839 1981-4-2      2975.00               20
  8. 7654  MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
  9. 7698  BLAKE      MANAGER    7839 1981-5-1      2850.00               30
  10. 7782  CLARK      MANAGER    7839 1981-6-9      2450.00               10
  11. 7788  SCOTT      ANALYST    7566 1987-4-19     4000.00               20
  12. 7839  KING       PRESIDENT       1981-11-17    5000.00               10
  13. 7844  TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
  14. 7876  ADAMS      CLERK      7788 1987-5-23     1100.00               20
  15. 7900  JAMES      CLERK      7698 1981-12-3      950.00               30
  16. 7902  FORD       ANALYST    7566 1981-12-3     3000.00               20
  17. 7934  MILLER     CLERK      7782 1982-1-23     1300.00               10
  18. 14 rows selected

dept表的现有数据如下:

  1. SQL> select * from dept;
  2.   
  3. DEPTNO DNAME          LOC
  4. ------ -------------- -------------
  5. 10   ACCOUNTING     NEW YORK
  6. 20   RESEARCH       DALLAS
  7. 30   SALES          CHICAGO
  8. 40   OPERATIONS     BOSTON
  9. rows selected

用SQL完成以下问题列表:

第一篇

  1. 列出至少有一个员工的所有部门。
  2. 列出薪金比“SMITH”多的所有员工。
  3. 列出所有员工的姓名及其直接上级的姓名。
  4. 列出受雇日期早于其直接上级的所有员工。
  5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
  6. 列出所有“CLERK”(办事员)的姓名及其部门名称。
  7. 列出最低薪金大于1500的各种工作。
  8. 列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
  9. 列出薪金高于公司平均薪金的所有员工。
  10. 列出与“SCOTT”从事相同工作的所有员工。
  11. 列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
  12. 列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
  13. 列出在每个部门工作的员工数量、平均工资和平均服务期限。
  14. 列出所有员工的姓名、部门名称和工资。
  15. 列出所有部门的详细信息和部门人数。
  16. 列出各种工作的最低工资。
  17. 列出各个部门的MANAGER(经理)的最低薪金。
  18. 列出所有员工的年工资,按年薪从低到高排序。

第二篇

  1. 找出EMP表中的姓名(ENAME)第三个字母是A 的员工姓名。
  2. 找出EMP表员工名字中含有A 和N的员工姓名。
  3. 找出所有有佣金的员工,列出姓名、工资、佣金,显示结果按工资从小到大,佣金从大到小。
  4. 列出部门编号为20的所有职位。
  5. 列出不属于SALES 的部门。
  6. 显示工资不在1000 到1500 之间的员工信息:名字、工资,按工资从大到小排序。
  7. 显示职位为MANAGER 和SALESMAN,年薪在15000 和20000 之间的员工的信息:名字、职位、年薪。
  8. 说明以下两条SQL语句的输出结果:
    1. SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL;
    2. SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL;
  9. 让SELECT 语句的输出结果为
    1. SELECT * FROM SALGRADE;
    2. SELECT * FROM BONUS;
    3. SELECT * FROM EMP;
    4. SELECT * FROM DEPT;
    5. ……

    列出当前用户有多少张数据表,结果集中存在多少条记录。

  10.判断SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'是否报错,为什么?

答案:如果需要建表,可以看看这个:http://www.cnblogs.com/yjxt/p/8193801.htm------第一篇

--1.列出至少有一个员工的所有部门。
select dname from dept where deptno in(select deptno from emp group by deptno having count(deptno)>=3); --2.列出薪金比“SMITH”多的所有员工。
select * from emp where sal>(select sal from emp where ename='SMITH'); --3.列出所有员工的姓名及其直接上级的姓名。
select a.ename,(select ename from emp b where b.empno=a.mgr) as boss_name from emp a; --4.列出受雇日期早于其直接上级的所有员工。
select a.ename from emp a where a.hiredate>(select hiredate from emp b where b.empno=a.mgr); --5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门(left join从左表那里返回所有的行,即使在右表中没有匹配的行。)
select a.dname,b.empno,b.ename,b.job,b.mgr,b.hiredate,b.sal,b.deptno from dept a left join emp b on a.deptno=b.deptno; --6.列出所有“CLERK”(办事员)的姓名及其部门名称。(:as 是 alias 的缩写,是“别名”的意思,后面接中文需要用 "" 。)
select a.ename,(select dname from dept b where b.deptno=a.deptno) as dname from emp a where a.job='CLERK';
select a.ename,b.dname from emp a join dept b on a.deptno=b.deptno and a.job='CLERK'; --7.列出最低薪金大于1500的各种工作。(distinct 筛选重复值)
select distinct job from emp group by job having min(sal)>1500; --8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
select ename from emp where deptno=(select deptno from dept where dname='SALES'); --9.列出薪金高于公司平均薪金的所有员工。
select ename from emp where sal>(select avg(sal) from emp); --10.列出与“SCOTT”从事相同工作的所有员工。
select ename from emp where job=(select job from emp where ename='SCOTT'); --11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。(in 操作符允许我们在where子句中规定多个值)
select ename,sal from emp where sal in(select sal from emp where deptno=30); --12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。(max() 求最大值)
select ename,sal from emp where sal>(select max(sal) from emp where deptno=30); --13.列出在每个部门工作的员工数量、平均工资和平均服务期限。(group by+[分组字段](可以有多个)用于结合合计函数,根据一个或多个列对结果集进行分组。)
select (select b.dname from dept b where b.deptno=a.deptno) 部门, count(deptno) 平均工资,avg(sal) 平均服务期限 from emp a group by deptno; --14.列出所有员工的姓名、部门名称和工资。
select ename,(select b.dname from dept b where b.deptno= a.deptno) 部门,sal from emp a; --15.列出所有部门的详细信息和部门人数。(count(列名)函数返回指定列的值的数目,返回的是一个数字)
select deptno, dname, loc,(select count(deptno) from emp b where b.deptno=a.deptno group by deptno) 部门人数 from dept a; --16.列出各种工作的最低工资。( min(列名) 求最小值 ;max(列名) 求最大值 )
select job, min(sal+nvl(comm,0) from emp group by job;
select job, min(nvl2(comm,sal+comm,sal)) from emp group by job; --17.列出各个部门的MANAGER(经理)的最低薪金。
select deptno,(select dname from dept b where b.deptno=a.deptno) 部门,min(sal) from emp a where job='MANAGER' group by deptno; --18.列出所有员工的年工资,按年薪从低到高排序。( nvl(表达式,value):如果表达式计算结果为 null ,则返回 value)
select ename,(sal+nvl(comm,0))*12 as salpersal from emp order by salpersal;
select ename,(nvl2(comm,sal+comm, sal))*12 as salpersal from emp order by salpersal;

------第二篇
--1. 找出EMP表中的姓名(ENAME)第三个字母是A 的员工姓名。(like 操作符用于在 where 子句中搜索列中的指定模式。 "%" 可用于定义通配符(模式中缺少的字母)。)
select ename from emp where ename like '__A%'; --2. 找出EMP表员工名字中含有A 和N的员工姓名。(and 并且 ; or 或者)
select ename from emp where ename like '%A%' and ename like '%N%' --3. 找出所有有佣金的员工,列出姓名、工资、佣金,显示结果按工资从小到大,佣金从大到小。(order by 默认按照升序排序;order by 列名 desc 降序)
select ename,nvl2(comm,sal+comm,sal) as wage,comm from emp order by wage,comm desc; --4. 列出部门编号为20的所有职位。(和第一篇的第七题类似)
select distinct job from emp where deptno=20; --5. 列出不属于SALES 的部门。
--in和exists的区别:
--exists(相关子查询):存在,后面一般都是子查询,不返回列表的值,只是返回一个ture或false的结果
--in:包含,in()后面的子查询 是返回结果集的
select distinct * from dept where dname not in('SALES');
select distinct * from dept where exists(select dname from dept where dname='SALES'); --6. 显示工资不在1000 到1500 之间的员工信息:名字、工资,按工资从大到小排序。(between ... and 会选取介于两个值之间的数据范围。)
select ename,nvl2(comm,sal+comm,sal) as wage from emp where nvl2(sal,comm+comm,sal) not between 1000 and 1500 order by wage desc;
select ename,nvl2(comm,sal+comm,sal) as wage from emp where nvl2(sal,comm+comm,sal)<1000 or sal+comm>1500 order by wage desc; -- 7. 显示职位为 MANAGER 和 SALESMAN,年薪在15000 和20000 之间的员工的信息:名字、职位、年薪。
select ename 姓名,job 职位,(sal+nvl(comm,0))*12 年薪 from emp where (sal+comm)*12 between 15000 and 20000 and job in('MANAGER','SALESMAN') -- 8. 说明以下两条SQL语句的输出结果:
-- SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL;
-- SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL;
-- 答案:IS NULL:是判断某个‘字段’是否为空,为空并不等价于为空字符串或为数字0;
-- = NULL :是判断某个‘值’是否等于NULL,NULL=NULL和NULL="" 都返回false。<br=""> --9.让SELECT 语句的输出结果为
-- SELECT * FROM SALGRADE;  
-- SELECT * FROM BONUS;  
-- SELECT * FROM EMP;  
-- SELECT * FROM DEPT;  
-- ……
--列出当前用户有多少张数据表,结果集中存在多少条记录。 
select * from user_tables; --10.判断SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'是否报错,为什么?
--答:不会抱错,这儿存在隐式数据类型的。

Oracle数据库基础--SQL查询经典例题的更多相关文章

  1. [转载]Oracle数据库基础--SQL查询经典例题

    Oracle基础练习题,采用Oracle数据库自带的表,适合初学者,其中包括了一些简单的查询,已经具有Oracle自身特点的单行函数的应用 本文使用的实例表结构与表的数据如下: emp员工表结构如下: ...

  2. Oracle数据库 基础SQL语句练习

    一.说明 第一次使用Oracle,想做一些练习,熟悉一些oracle. 表:使用的是scott用户,默认的表 具体表讲解,可以参考该文档:https://www.cnblogs.com/xjcheng ...

  3. oracle数据库元数据SQL查询

    oracle数据库经典SQL查询 .查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from ...

  4. Oracle数据库提高sql查询效率总结

    我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句 ...

  5. 第一章 oracle数据库基础

    第一章   oracle数据库基础 1.oracle简介-->数据库管理系统    1.1:数据库    1.2:全局数据库名    1.3:数据库实例    1.4:表空间    1.5:数据 ...

  6. 数据库基础SQL知识面试题一

    数据库基础SQL知识面试题一 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 如标题所示,本篇博客主要介绍基础知识的面试题.大家可以用来测试面试者的技术水平,由于个人水平所限,难免 ...

  7. Oracle数据库基础入门《二》Oracle内存结构

    Oracle数据库基础入门<二>Oracle内存结构 Oracle 的内存由系统全局区(System Global Area,简称 SGA)和程序全局区(Program Global Ar ...

  8. ASP.NET操作ORACLE数据库之模糊查询

    ASP.NET操作ORACLE数据库之模糊查询 一.ASP.NET MVC利用OracleHelper辅助类操作ORACLE数据库 //连接Oracle数据库的连接字符串 string connect ...

  9. 15个初学者必看的基础SQL查询语句

    本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 本文将分享15个初学者必看的基础SQL查询语句,都很基础,但是你不一定都会,所以好好看看吧. 1.创建表和数据插 ...

随机推荐

  1. ProtoBuf练习(二)

    重复数据类型 protobuf语言的重复字段类型相当于C++的std::list数据类型 工程目录结构 $ ls proto/ TServer.proto TSession.proto proto文件 ...

  2. Python中的循环语句

    Python中有while循环和for循环 下面以一个小例子来说明一下用法,用户输入一些数字,输出这些数字中的最大值和最小值 array = [5,4,3,1] for i in array: pri ...

  3. PAT1098【插入排序+堆排序】

    简单插入排序: 简单插入排序的核心思想: 把一条这么个难看的序列默认分为两个排好序的和未排好序的两个部分: 所以一开始排好序的只有一个a[0](好看的只有一个),难看的有N(数组长度)-1个a[1,n ...

  4. HELLO---MVC

    前言 很荣幸有机会参加BS的项目,这个图书馆系统这个项目,需要用到ITOO框架,其中涉及到好多小框架的学习,MVC就是其中的一个学习知识点,像大家一样,刚刚接触一个新鲜的知识,心里除了恐惧还有就是茫然 ...

  5. Hibernate的优化方案

    使用参数绑定 使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用生成好的执行计划,这样做节省CPU时间和内存. 避免SQL注入. 尽量少使用NOT 如果where子句中包含not关键 ...

  6. Gson本地和服务器环境不同遇到的Date转换问题 Failed to parse date []: Invalid time zone indicator

    GoogleGson在处理Date格式时有个小陷阱,在不同环境中部署时可能会遇到问题. Gson默认处理Date对象的序列化/反序列化是通过一个SimpleDateFormat对象来实现的,通过下面的 ...

  7. linux下apache无法启动之(httpd not running, trying to st)

    这突然接手的服务器,本来是没什么事的,可是因为机房的问题,需要将服务器迁回来,结果可想而知,关机重启了,其中有一台估计诚心给我过不去,待配置好ip并重启了服务后,发现apache无法正常启动了! 先还 ...

  8. angular中使用canvas画布做验证码

    //填充画布,五位随机数 drawNumber(): void { this.clearCanvas(); let ctx: CanvasRenderingContext2D = this.myGra ...

  9. CF213E Two Permutations 线段树维护哈希值

    当初竟然看成子串了$qwq$,不过老师的$ppt$也错了$qwq$ 由于子序列一定是的排列,所以考虑插入$1$到$m$到$n-m+1$到$n$; 如何判断呢?可以用哈希$qwq$: 我们用线段树维护哈 ...

  10. 【SQL Server 优化性能的几个方面】(转)

    转自:http://blog.csdn.net/feixianxxx/article/details/5524819     SQL Server 优化性能的几个方面 (一).数据库的设计 可以参看最 ...