Oracle作业4-函数
一、在数据库中的emp和dept表中做如下查询:
1.列出所有分析师(ANALYST)的姓名、编号和部门
SELECT ENAME,EMPNO,E.DEPTNO,DNAME FROM EMP E,DEPT D WHERE UPPER(JOB)='ANALYST' AND E.DEPTNO=D.DEPTNO;

2.找出佣金高于薪金的雇员
SELECT EMPNO,ENAME,SAL,COMM FROM EMP WHERE NVL(COMM,0)>SAL;--为了避免用NULL值进行比较,使用NVL函数

3.找出部门10中所有经理和部门20中的所有分析师(ANALYST)的详细资料
SELECT * FROM EMP WHERE JOB='MANAGER' AND DEPTNO=10 OR JOB='ANALYST' AND DEPTNO=20;

4.找出各月最后一天受雇的所有雇员
分析:EMP表中的HIREDATE为DATE数据类型,数据格式为:1980/12/17;LAST_DAY(HIREDATE)的值为1980/12/31,也是DATE类型,故两者格式相同,可进行是否相等的比较
SELECT * FROM EMP WHERE HIREDATE = LAST_DAY(HIREDATE); --没有满足条件的查询结果

5.找出早于25年之前受雇的雇员
SELECT * FROM EMP WHERE (MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)>25;

6.显示只有首字母大写的所有雇员的姓名
SELECT ENAME FROM EMP WHERE INITCAP(ENAME)=ENAME; -- 没有满足条件的查询结果

7.显示所有雇员的姓名的前三个字符
SELECT SUBSTR(ENAME,1,3) 姓名前三个字符 FROM EMP;

8.显示所有雇员的姓名,用a替换所有'A'
SELECT REPLACE(ENAME,'A','a') 员工姓名 FROM EMP;

9.显示所有雇员的姓名以及满10年服务年限的日期
SELECT ENAME 员工姓名,HIREDATE 受雇日期,ADD_MONTHS(HIREDATE,10*12) 工作十周年日 FROM EMP;

10.列出所有员工及直接上级的姓名
思路:由于MGR字段存在一个叫KING的终极大Boss是没有上级的,所以在自连接时,为了将其也显示出来,不能用E.MGR=M.EMPNO,所以采用左自连接将为空的那行也显示出来。
SELECT E.EMPNO,E.ENAME,E.JOB,E.MGR,M.ENAME 上级姓名 FROM EMP E,EMP M WHERE E.MGR=M.EMPNO(+) ORDER BY E.EMPNO;
--上面的左自连接查询可以用下面的左外连接查询实现
SELECT E.EMPNO,E.ENAME,E.JOB,E.MGR,M.ENAME 上级姓名 FROM EMP E LEFT JOIN EMP M ON E.MGR=M.EMPNO ORDER BY E.EMPNO;

二、综合题:
1.取得部门中(所有人的)平均的薪水等级
思路:查询得到各部门的平均薪水这个查询结果(后面把这个查询结果简称为A),然后从A、SALGRADE表和DEPT表中根据A中平均薪水在SALGRADE表的相应区间以及A中部门编号与部门表的关联关系获取到相应的薪水等级和部门名称等相关查询结果。
SELECT T.DEPTNO,D.DNAME,T.ASAL,GRADE FROM
SALGRADE,(SELECT AVG(SAL) ASAL,DEPTNO FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO)T,DEPT D
WHERE T.ASAL BETWEEN LOSAL AND HISAL AND D.DEPTNO=T.DEPTNO;

2.取得平均薪水最高的部门的部门编号
思路:最关键是查询得到各部门的平均工资这个结果(后面把这个查询结果简称为A),这个查询结果在下面的SQL语句中出现了两次,后面出现的A是为了从中获取最高平均工资这个结果,然后为前面的查询提供条件,而前面的A是为了从中查询到满足题目要求的部门编号和对应平均薪水。
SELECT DEPTNO,ASAL2 平均薪水 FROM (SELECT AVG(SAL) ASAL2,DEPTNO FROM EMP GROUP BY DEPTNO)
WHERE ASAL2=(SELECT MAX(ASAL1) FROM (SELECT AVG(SAL) ASAL1,DEPTNO FROM EMP GROUP BY DEPTNO));

3.取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的经理人姓名
思路:首先查询EMP表中的MGR,再用NOT IN来过滤掉不在MGR列出现的EMPNO后查到对应的工资,再查出这些工资中的最高工资,最后在此EMP中把高于此最高工资且职位为经理的员工的相关信息查询显示出来。
--查询方法一:使用NVL
SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE SAL>
(SELECT MAX(SAL) FROM (SELECT SAL FROM EMP WHERE EMPNO NOT IN(SELECT DISTINCT NVL(MGR,0) FROM EMP)))
AND JOB='MANAGER';
--查询方法二:使用IS NOT NULL
SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE SAL>
(SELECT MAX(SAL) FROM (SELECT SAL FROM EMP WHERE EMPNO NOT IN(SELECT DISTINCT MGR FROM EMP WHERE MGR IS NOT NULL)))
AND JOB='MANAGER';

注意:
1)使用NOT IN时要过滤掉子查询中的NULL值,不然会查询无结果!因为NOT IN等价于!=ALL,故只要其与子查询中的每个值比较时中有一个为false,整个就为false,而与NULL值比较时就是false,故整个NOT IN条件就不成立,所以不会返回结果
SELECT EMPNO,ENAME,SAL FROM EMP WHERE EMPNO NOT IN(SELECT DISTINCT MGR FROM EMP) ORDER BY EMPNO;

2)使用IN的时就不用管null值,因为IN在逻辑上等价于ANY,即只要其中有一个为true,整个就为true,即使与NULL值比较为false,只要其它子查询的比较为真就可返回相应结果。
SELECT EMPNO,ENAME,SAL FROM EMP WHERE EMPNO IN(SELECT DISTINCT MGR FROM EMP) ORDER BY EMPNO;

4.取得薪水最高的第六到第十名员工
思路:首先按工资降序查得员工工资信息,再通过子查询获取升序的伪列,再通过子查询更进一步使得伪列可以从6到10进行筛选
SELECT S.* FROM
(SELECT ROWNUM R,T.* FROM
(SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC)T)S WHERE R BETWEEN 6 AND 10;--注意WHERE后面是用别名R,不是用关键字ROWNUM,用ROWNUM查不到数据

5.取得每个薪水等级有多少员工
思路:先获取每个员工的薪水等级,以此作为子查询再获取每个薪水等级的员工数
SELECT GRADE 薪水等级,COUNT(GRADE) 员工数 FROM (SELECT EMPNO,ENAME,SAL,GRADE FROM EMP,SALGRADE WHERE SAL BETWEEN LOSAL AND HISAL) GROUP BY GRADE;

6.显示所有员工的姓名,加入公司的年份和月份,按照受雇日期所在月份排序,若月份相同则将受雇年份越早的员工排在越前面
思路:使用TO_CHAR获取HIREDATE数据中的年份和月份,然后进行排序
SELECT ENAME 员工姓名,TO_CHAR(HIREDATE,'YYYY') 入职年份,TO_CHAR(HIREDATE,'MM') 入职月份 FROM EMP ORDER BY 入职月份,入职年份;

Oracle作业4-函数的更多相关文章
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- 重写Oracle的wm_concat函数,自定义分隔符、排序
oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...
- Oracle日期时间函数大全
ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits ...
- Oracle过程及函数的参数模式,In、out、in out模式
Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...
- oracle的substr函数的用法
oracle的substr函数的用法 取得字符串中指定起始位置和长度的字符串 substr( string, start_position, [ length ] ) 如: substr( ...
- Oracle nvl(),nvl2()函数介绍
NVL函数 Oracle/PLSQL中的一个函数. 格式为: NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值, ...
- Oracle LPAD/RPAD函数在处理中文时的注意事项
首先看下Oracle官方对函数的定义: The RPAD function returns an expression, right-padded to a specified length with ...
- oracle wm_concat(column)函数的使用
oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_concat(column)函数实现字段合并,如果您对oracle wm_concat(c ...
- Oracle之自定义函数
数据库中函数包含四个部分:声明.返回值.函数体和异常处理. --没有参数的函数 create or replace function get_user return varchar2 is v_use ...
- oracle 自定义 聚合函数
Oracle自定义聚合函数实现字符串连接的聚合 create or replace type string_sum_obj as object ( --聚合函数的实质就是一个对象 sum ...
随机推荐
- 一道google的面试题(据说)
1. 原题(同事给的) Max Howell 参加了谷歌的面试,出题人竟然要求 Max Howell 在白板上作出解答,Max Howell 当然愤怒地拒绝了,回家以后马上在微博上跟我们分享他的吐槽: ...
- sass语法一(变量篇)
文件后缀名 sass有两种后缀名的文件:一种后缀名为sass,不使用大括号和分号:另一种是我们这里使用的scss文件,这种和我们平时使用的css文件格式差不多,使用大括号和分号. //后缀名为sass ...
- Docker 简单运用
Docker 帮助系统管理员和程序员在容器中开发应用程序,并且可以扩展到成千上万的节点,容器和 VM(虚拟机)的主要区别是,容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离.虚拟机可能需要一分钟 ...
- Java 之常用运算符(3)
什么是运算符: 运算符是一种“功能”符号,用以通知 Java 进行相关的运算.譬如,我们需要将变量 age 的值设置为 20 ,这时候就需要一个“=”,告诉程序需要进行赋值操作. Java 语言中常用 ...
- 【Markdown】Markdown 使用MathJax引擎 书写Latex 数学公式
大家都看过Stackoverflow上的公式吧,漂亮,其生成的不是图片.这就要用到MathJax引擎,在Markdown中添加MathJax引擎也很简单, <script type=" ...
- Jmeter参数化设置,多用户登录
一.模拟多用户登录场景 如登录模式如下图所示,登录界面中需要输入:用户名.密码.验证码 用户名以及密码均是固定值,不需要做处理.验证码需要处理一下,可以后台配置成固定值,具体可以找开发咨询. 在此场景 ...
- QT容器map的插入,修改,遍历
除了map,QT的容器还有hash,以及迭代器等,这里写的是map #include "mainwindow.h" #include <QApplication> #i ...
- Jquery学习---一键上传
一键上传 jar包下载 jquery代码 $(function () { $(".uploadfile").upload({ action: 'CourseXMLFileUploa ...
- Oracle Fusion Middleware Supported System check,jdk,java .etc requirements
http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-certification-100350.html 在oracle官 ...
- 初窥IM通信协议
即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议. 前者是以数据流的形式,将传输数 ...