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 ...
随机推荐
- css3特别篇图解FlexBox
图文转自微博网友勾三股四 一.flex-direction 二.flex-wrap 三.justify-content 四.align-items 五.align-content
- 【转】JSON.parse()与JSON.stringify()的区别
JSON.parse()[从一个字符串中解析出json对象] 例子: //定义一个字符串 var data='{"name":"goatling"}' //解析 ...
- sftp java 上传
1. 注意问题 uri的格式: sftp://zhangsan:123456@10.10.10.10:22 dir问题 : 判断有没有 没有创建 然后进入 类推 config问题: StrictHos ...
- JS判断是否到达页面底部
<script type="text/javascript">//判断整个文档到底部$(window).scroll(function(){ //滚动条所在位置的 ...
- lianxi
package dududu; public class qiqiqi { public static void main(String[] args) { // TODO 自动生成的方法存根 ; ; ...
- Android热修复 Dex注入实现静默消灭bug
当app上线后发现紧急bug,如果重新发布版本周期比较长,并且对用户体验不好,此时热修复就派上用场了.热修复就是为紧急bug而生,能够快速修复bug,并且用户无感知.针对热修复,阿里系先后推出AndF ...
- Python爬虫教程-25-数据提取-BeautifulSoup4(三)
Python爬虫教程-25-数据提取-BeautifulSoup4(三) 本篇介绍 BeautifulSoup 中的 css 选择器 css 选择器 使用 soup.select 返回一个列表 通过标 ...
- 【Python】Python3基本语法入门学习
0.Python概述 1.First Word Game 2.变量与字符串 3.improved game 4.Python数据类型 5.常用操作符 6.分支与循环 7.列表 8.元组 9.字符串内置 ...
- content provider其中操作文件的函数
此类函数还是有杀伤力的 1.openAssetFile(Uri uri, String mode)This is like openFile(Uri, String), but can be impl ...
- svn环境搭建
(一)svn介绍 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对代码文件.文档等没有进行版本控制,将会出现很多问题: 备份多个版本,占用磁盘空间大 解决代码冲突困难 容易引发BUG ...