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 ...
随机推荐
- MySQL在DOS界面对database和table增删改查
昨天新接触MySQL,学习了一些内容,今天过来复习一下.(吐槽一下:安装个MySQL耗费老子半天时间!!) 学习了一下,大概知道了对数据库基本的增删改查,增add,删drop,改alter,查show ...
- safari兼容时间格式
前提: 使用iview的DatePicker组件,保存时间后台接收时间戳 问题: safari中不支持2018-02-13这种格式转为时间戳会显示NaN 解决: new Date('2018/02/1 ...
- js基本数据类型和引用类型的区别详解-笔记
原文参考http://mp.weixin.qq.com/s/apFyUgqT5N-bsDUjP4Eryg 笔记总结 首先记住js中的基础数据类型undefined,null,boolean,strin ...
- Scrapy安装教程 pip 或 conda 两种安装方法.
cmd: pip -V 查看pip版本 pip install --upgrade pip 升级最高版本 https://sourceforge.net/projects/py ...
- js event事件对象概括
事件是用户或者浏览器自身执行的动作,而响应某个事件的函数就叫做事件处理程序或者叫事件侦听器. 定义事件处理程序可以大致分为以下三种: 一.html事件处理程序 元素支持的每种事件都可以用一个与之对应的 ...
- Java xml 操作(Dom4J修改xml + xPath技术 + SAX解析 + XML约束)
1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...
- Python爬虫编程常见问题解决方法
Python爬虫编程常见问题解决方法: 1.通用的解决方案: [按住Ctrl键不送松],同时用鼠标点击[方法名],查看文档 2.TypeError: POST data should be bytes ...
- canvas.addEventListener()
对 canvas 元素的事件监听用addEventListener()实现, 但是有一点缺陷是:canvas 不支持键盘事件,为了解决这个问题,可以采用以下两种方案: 方案一: key event - ...
- mybatis ${}使用注意事项
${key}有值, ${key,jdbcType=VARCHAR}没有值 总结:${}使用时不要指定jdbcType等属性,指定这些反而取不到值,这也是跟#{}的一个区别.以上只是开发中遇到的情况,具 ...
- 捕获Task.WhenALl返回的Task的Exception
如果有一个任务抛出异常,则Task.WhenAll 会出错,并把这个异常放在返回的Task 中.如果多个任务抛出异常,则这些异常都会放在返回的Task 中.但是,如果这个Task 在被await 调用 ...