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 ...
随机推荐
- easyui window窗口 随body的滚动条 滚动
问题描述: 当easyui window窗口弹出的时候,依然可以滚动body 的滚动条,而且window窗口也会随它一起滚动 思路:bootstrap 模态框弹出的时候,给body 添加了 .moda ...
- OpenCV 小图重叠至大图指定位置
Android OpenCV Java: Codes: smallImg.copyTo( bigImg.submat( y, smallImg.rows(), x, smallImg.cols() ) ...
- unity配置Android SDK,并构建导出apk格式
1.点击 Edit --> preferences出现如图界面 2.在Android中SDK选项中放入Android SDK:JDK选项中放入Java JDK.(下载地址:http://t ...
- ES6入门——函数的扩展
1.函数参数的默认值 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法.现在ES6可以为函数的参数添加默认值,简洁了许多. ES5 function show(a,b){ b = b ...
- ubuntu下root不能复制 abc用户下的软连接文件
使用root用户去复制,提示权限不足: 那么这个软连接是个什么东西??
- scp 上传和下载文件
mac和linux自带scp命令,windows的话请考虑gitbash或者专业linux工具 (默认端口为22,所以-p可不写) 上传文件 scp -p /home/lnmp.gz root@ip: ...
- CentOS7 安装tomcat为系统服务器 Systemctl管理Tomcat,并设置开机启动
本文转载:http://blog.chinaunix.net/uid-24648266-id-5729891.html CentOS7开始,从/etc/init.d脚本改为了systemctl管理服务 ...
- Linux配置临时IP和网关命令
配置IP以及子网掩码: ifconfig eth0 192.168.1.33 netmask 255.255.255.0 up 设置网关: route add default gw 192.168 ...
- yii2.0查询关联数据以及widgets小部件
怎样去查询关联数据呢,接下来整理一个简单的代码:
- less 学习
收藏地址 : http://www.bootcss.com/p/lesscss/