一、在数据库中的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-函数的更多相关文章

  1. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  2. 重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

  3. Oracle日期时间函数大全

    ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits ...

  4. Oracle过程及函数的参数模式,In、out、in out模式

    Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...

  5. oracle的substr函数的用法

    oracle的substr函数的用法 取得字符串中指定起始位置和长度的字符串   substr( string, start_position, [ length ] ) 如:     substr( ...

  6. Oracle nvl(),nvl2()函数介绍

    NVL函数 Oracle/PLSQL中的一个函数. 格式为: NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值, ...

  7. Oracle LPAD/RPAD函数在处理中文时的注意事项

    首先看下Oracle官方对函数的定义: The RPAD function returns an expression, right-padded to a specified length with ...

  8. oracle wm_concat(column)函数的使用

    oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_concat(column)函数实现字段合并,如果您对oracle wm_concat(c ...

  9. Oracle之自定义函数

    数据库中函数包含四个部分:声明.返回值.函数体和异常处理. --没有参数的函数 create or replace function get_user return varchar2 is v_use ...

  10. oracle 自定义 聚合函数

    Oracle自定义聚合函数实现字符串连接的聚合   create or replace type string_sum_obj as object ( --聚合函数的实质就是一个对象      sum ...

随机推荐

  1. ios 下防止整个网页滑动(阻尼回弹 . 瞒天过海,骗IOS,把阻尼回弹限制在滚动区div内

    下面是一个手机APP页面,分成上中下三部分,最上面和最下面是固定的,中间可以滚动.这是常见的APP布局方式. <style> .box{ overflow: auto; -webkit-o ...

  2. Web前端面试指导(十一):样式导入有哪些方式?

    样式导入方式 link import 使用方式 link的使用 <link href="index.css" rel="stylesheet"> i ...

  3. Java 之常用运算符(3)

    什么是运算符: 运算符是一种“功能”符号,用以通知 Java 进行相关的运算.譬如,我们需要将变量 age 的值设置为 20 ,这时候就需要一个“=”,告诉程序需要进行赋值操作. Java 语言中常用 ...

  4. JDBC URL格式定制

    数据库URL制定: 当加载的驱动程序,可以建立程序中使用DriverManager.getConnection()方法的连接.为方便参考,让列出了三个重载DriverManager.getConnec ...

  5. 命令行模式(CMD)下mysql查询中文显示乱码问题

    mysql的默认编码已经设置为utf-8,用其他工具(代码,mysql workbench)写入或读出时显示正常,但用cmd查询时显示为乱码. 2.原因:mysql的客户端根本无法以utf-8的形式返 ...

  6. git rebase --onto详解

    https://blog.pivotal.io/labs/labs/git-rebase-onto http://www.cnblogs.com/rickyk/p/3848768.html

  7. mobile webiste 中的css的font-size em及line-height等换算

    在mobile web设计 中,我们常常需要使用em这个字体大小的单位.em到底是多少呢? em到底应该设置为多少个em呢?通常换算成方法是1em=target fontsize we want/fo ...

  8. pt-mysql-summary

    pt-mysql-summary主要用来输出MySQL的基本信息,可以作为数据库巡检以及刚开始熟悉数据库环境时候进行使用: [root@mxqmongodb2 bin]# ./pt-mysql-sum ...

  9. mysql io过高

    背景: 晚上,公司业务群里发信息说,有玩家在游戏里面赠送别人礼物后,赠送记录在20多分钟以后才出现,延时太高. 问题: 公司数据库使用mysql,配置了主从.配置的是,游戏程序写数据到主库,读数据到从 ...

  10. 最小生成树-Prim算法与Kruskal算法

    一.最小生成树(MST) ①.生成树的代价:设G=(V,E)是一个无向连通网,生成树上各边的权值之和称为该生成树的代价. ②.最小生成树:在图G所有生成树中,代价最小的生成树称为最小生成树. 最小生成 ...