Oracle数据库基础--SQL查询经典例题
Oracle基础练习题,采用Oracle数据库自带的表,适合初学者,其中包括了一些简单的查询,已经具有Oracle自身特点的单行函数的应用
本文使用的实例表结构与表的数据如下:
emp员工表结构如下:
- Name Type Nullable Default Comments
- -------- ------------ -------- ------- --------
- EMPNO NUMBER(4) 员工号
- ENAME VARCHAR2(10) Y 员工姓名
- JOB VARCHAR2(9) Y 工作
- MGR NUMBER(4) Y 上级编号
- HIREDATE DATE Y 雇佣日期
- SAL NUMBER(7,2) Y 薪金
- COMM NUMBER(7,2) Y 佣金
- DEPTNO NUMBER(2) Y 部门编号
dept部门表:
- Name Type Nullable Default Comments
- ------ ------------ -------- ------- --------
- DEPTNO NUMBER(2) 部门编号
- DNAME VARCHAR2(14) Y 部门名称
- LOC VARCHAR2(13) Y 地点
提示:工资 = 薪金 + 佣金
emp表的现有数据如下:
- SQL> select * from emp;
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ----- ---------- --------- ----- ----------- --------- --------- ------
- 7369 SMITH CLERK 7902 1980-12-17 800.00 20
- 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
- 7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
- 7566 JONES MANAGER 7839 1981-4-2 2975.00 20
- 7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
- 7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
- 7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
- 7788 SCOTT ANALYST 7566 1987-4-19 4000.00 20
- 7839 KING PRESIDENT 1981-11-17 5000.00 10
- 7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
- 7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
- 7900 JAMES CLERK 7698 1981-12-3 950.00 30
- 7902 FORD ANALYST 7566 1981-12-3 3000.00 20
- 7934 MILLER CLERK 7782 1982-1-23 1300.00 10
- 14 rows selected
dept表的现有数据如下:
- SQL> select * from dept;
- DEPTNO DNAME LOC
- ------ -------------- -------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
- 4 rows selected
用SQL完成以下问题列表:
第一篇
- 列出至少有一个员工的所有部门。
- 列出薪金比“SMITH”多的所有员工。
- 列出所有员工的姓名及其直接上级的姓名。
- 列出受雇日期早于其直接上级的所有员工。
- 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
- 列出所有“CLERK”(办事员)的姓名及其部门名称。
- 列出最低薪金大于1500的各种工作。
- 列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
- 列出薪金高于公司平均薪金的所有员工。
- 列出与“SCOTT”从事相同工作的所有员工。
- 列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
- 列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
- 列出在每个部门工作的员工数量、平均工资和平均服务期限。
- 列出所有员工的姓名、部门名称和工资。
- 列出所有部门的详细信息和部门人数。
- 列出各种工作的最低工资。
- 列出各个部门的MANAGER(经理)的最低薪金。
- 列出所有员工的年工资,按年薪从低到高排序。
第二篇
- 找出EMP表中的姓名(ENAME)第三个字母是A 的员工姓名。
- 找出EMP表员工名字中含有A 和N的员工姓名。
- 找出所有有佣金的员工,列出姓名、工资、佣金,显示结果按工资从小到大,佣金从大到小。
- 列出部门编号为20的所有职位。
- 列出不属于SALES 的部门。
- 显示工资不在1000 到1500 之间的员工信息:名字、工资,按工资从大到小排序。
- 显示职位为MANAGER 和SALESMAN,年薪在15000 和20000 之间的员工的信息:名字、职位、年薪。
- 说明以下两条SQL语句的输出结果:
- SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL;
- SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL;
- 让SELECT 语句的输出结果为
- SELECT * FROM SALGRADE;
- SELECT * FROM BONUS;
- SELECT * FROM EMP;
- SELECT * FROM DEPT;
- ……
列出当前用户有多少张数据表,结果集中存在多少条记录。
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查询经典例题的更多相关文章
- [转载]Oracle数据库基础--SQL查询经典例题
Oracle基础练习题,采用Oracle数据库自带的表,适合初学者,其中包括了一些简单的查询,已经具有Oracle自身特点的单行函数的应用 本文使用的实例表结构与表的数据如下: emp员工表结构如下: ...
- Oracle数据库 基础SQL语句练习
一.说明 第一次使用Oracle,想做一些练习,熟悉一些oracle. 表:使用的是scott用户,默认的表 具体表讲解,可以参考该文档:https://www.cnblogs.com/xjcheng ...
- oracle数据库元数据SQL查询
oracle数据库经典SQL查询 .查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from ...
- Oracle数据库提高sql查询效率总结
我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句 ...
- 第一章 oracle数据库基础
第一章 oracle数据库基础 1.oracle简介-->数据库管理系统 1.1:数据库 1.2:全局数据库名 1.3:数据库实例 1.4:表空间 1.5:数据 ...
- 数据库基础SQL知识面试题一
数据库基础SQL知识面试题一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如标题所示,本篇博客主要介绍基础知识的面试题.大家可以用来测试面试者的技术水平,由于个人水平所限,难免 ...
- Oracle数据库基础入门《二》Oracle内存结构
Oracle数据库基础入门<二>Oracle内存结构 Oracle 的内存由系统全局区(System Global Area,简称 SGA)和程序全局区(Program Global Ar ...
- ASP.NET操作ORACLE数据库之模糊查询
ASP.NET操作ORACLE数据库之模糊查询 一.ASP.NET MVC利用OracleHelper辅助类操作ORACLE数据库 //连接Oracle数据库的连接字符串 string connect ...
- 15个初学者必看的基础SQL查询语句
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 本文将分享15个初学者必看的基础SQL查询语句,都很基础,但是你不一定都会,所以好好看看吧. 1.创建表和数据插 ...
随机推荐
- 网页游戏开发秘笈 PDF扫描版
精选10种常见的游戏类型,透过典型实例,深入剖析游戏引擎及工具的选用技巧,详细讲解每款游戏的制作过程,为快速掌握网页游戏开发提供系统而实用的指南. 网页游戏开发秘笈 目录: 译者序 前 言 导 言 ...
- uWSGI + Nginx + Django 部署
1. uWSGI 服务器 Django 默认使用 WSGI(Python Web Server Gateway ) 作为 Web 服务器,一般仅用来作为测试使用,实际生产环境而是使用 uWSGI 和 ...
- 【linux安装软件步骤】
一.解析linux应用软件安装包: 通常Linux应用软件的安装包有三种: tar包,如software-1.2.3-1.tar.gz.它是使用UNIX系统的打包工具tar打包的. rpm包,如sof ...
- C#进行Post请求(解决url过长的问题)
//实例代码: 1.post请求 private string GetImageXY(string imgbyte) { string result3 = string.Empty; try { st ...
- Java中的Junit单元测试
测试方法必须使用@Test进行修饰 测试方法必须使用public void 进行修饰,不能带任何的参数 新建一个源代码目录来存放我们的测试代码 测试类的包名应该和被测试类的包名一致 测试单元中的每个方 ...
- 微信小程序小结(1) ------ 前后端交互及wx.request的简易封装
微信小程序的应用目前越来越多,不管喜欢与否我们都应该了解一些.废话不多,直接干货. 做项目自然避免不了前后端的交互,小程序在调试过程中需要在先在:小程序公众平台--设置--开发设置中,将要从后台请求的 ...
- MySQL的CURRENT_DATE(),NOW(),DATE_FORMAT()函数的应用,类型转换及操作汇总
内容简介 datetime类型和timestamp类型的取值范围,CURRENT_DATE()函数应用,NOW()函数应用,DATE_FROMAT()函数取星期,日期.字符串.时间戳相互转换等. 时间 ...
- Apple开发者账号更改公司名称
对于大多数的开发者而言,可能很少遇见要修改账户的公司名称的问题,本来公司之前是这个名称,但是后来改名为另外的名称,这样的话在Apple开发者账号上的公司名称再用就不好了,所以就需要到Apple dev ...
- tput 命令行使用说明
转载自:https://blog.csdn.net/fdipzone/article/details/9993961 什么是 tput?tput 命令将通过 terminfo 数据库对您的终端会话进行 ...
- QueueUtil
import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import org.slf4 ...