Oracle中绝对经典的单表查询练习,非常值得一练

来源:互联网 发布:淘宝网男士的鞋子 编辑:程序博客网 时间:2024/04/20 06:06

这是一个学习Oracle的查询语句的一个非常好的练习,其中包括了一些简单的查询,已经具有Oracle自身特点的单行函数的应用,非常值得一看。

--1、选择部门30的所有员工SELECT * FROM EMP WHERE deptno=30;--结果 SELECT * FROM EMP WHERE deptno=30; EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7499 ALLEN      SALESMAN   7698 20-二月-81    1600.00    300.00     30 7521 WARD       SALESMAN   7698 22-二月-81    1250.00    500.00     30 7654 MARTIN     SALESMAN   7698 28-九月-81    1250.00   1400.00     30 7698 BLAKE      MANAGER    7839 01-五月-81    2850.00               30 7844 TURNER     SALESMAN   7698 08-九月-81    1500.00      0.00     30 7900 JAMES      CLERK      7698 03-十二月-81    950.00               30 --2、列出所有办事员(CLERK)的姓名,员工编号和部门编号SELECT ename 姓名,empno 员工编号,deptno 部门编号 FROM emp WHERE job='CLERK';--结果姓名           员工编号     部门编号---------- -------- --------SMITH          7369       20ADAMS          7876       20JAMES          7900       30MILLER         7934       10--3、找出佣金高于薪金的员工SELECT * FROM EMP WHERE NVL(comm,0)>sal;--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7654 MARTIN     SALESMAN   7698 28-九月-81    1250.00   1400.00     30--4、找出佣金高于薪金60%的员工SELECT * FROM EMP WHERE NVL(comm,0)>sal*0.6;--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7654 MARTIN     SALESMAN   7698 28-九月-81    1250.00   1400.00     30--5、找出部门10中的所有经理(MANAGER)和部门20的所有办事员(CLERK)的详细资料SELECT * FROM EMP WHERE (job='MANAGER' AND deptno=10) OR (job='CLERK' AND deptno=20);--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH      CLERK      7902 17-十二月-80    800.00               20 7782 CLARK      MANAGER    7839 09-六月-81    2450.00               10 7876 ADAMS      CLERK      7788 23-五月-87    1100.00               20 --6、找出部门10的所有经理(MANAGER),部门20中所有办事员(CLERK),既不是办事员也不是经理但是薪金大于2000的所有员工的详细资料SELECT * FROM EMP WHERE (job='MANAGER' AND deptno=10) OR (job='CLERK' AND deptno=20) OR (job NOT IN('MANAGER','CLERK') AND sal>2000);--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH      CLERK      7902 17-十二月-80    800.00               20 7782 CLARK      MANAGER    7839 09-六月-81    2450.00               10 7788 SCOTT      ANALYST    7566 19-四月-87    3000.00               20 7839 KING       PRESIDENT       17-十一月-81   5000.00               10 7876 ADAMS      CLERK      7788 23-五月-87    1100.00               20 7902 FORD       ANALYST    7566 03-十二月-81   3000.00               20 6 rows selected--7、找出收取佣金的员工的员工的不同工作SELECT DISTINCT(job) FROM EMP WHERE comm IS NOT NULL AND comm !=0;--结果 JOB---------SALESMAN --8、找出不取佣金或者是收取佣金小于100的员工详细信息SELECT * FROM EMP WHERE comm IS NULL OR comm<100;--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH      CLERK      7902 17-十二月-80    800.00               20 7566 JONES      MANAGER    7839 02-四月-81    2975.00               20 7698 BLAKE      MANAGER    7839 01-五月-81    2850.00               30 7782 CLARK      MANAGER    7839 09-六月-81    2450.00               10 7788 SCOTT      ANALYST    7566 19-四月-87    3000.00               20 7839 KING       PRESIDENT       17-十一月-81   5000.00               10 7844 TURNER     SALESMAN   7698 08-九月-81    1500.00      0.00     30 7876 ADAMS      CLERK      7788 23-五月-87    1100.00               20 7900 JAMES      CLERK      7698 03-十二月-81    950.00               30 7902 FORD       ANALYST    7566 03-十二月-81   3000.00               20 7934 MILLER     CLERK      7782 23-一月-82    1300.00               10 11 rows selected--9、找出各月的倒数第三天受雇佣的员工--每个员工的雇佣时间是不一样的,所有需要找出每个员工雇佣的时间所在月份的最后一天,--之后按照‘日期-数字’的方式求出前三天的日期,这个日期必须和雇佣日期相符才能满足条件。SELECT LAST_DAY(hiredate),EMP.* FROM EMP WHERE LAST_DAY(hiredate)-2=hiredate;--结果LAST_DAY(HIREDATE) EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO------------------ ----- ---------- --------- ----- ----------- --------- --------- ------30-九月-81          7654 MARTIN     SALESMAN   7698 28-九月-81    1250.00   1400.00     30--10、找出12早于年前受雇的员工--先使用MONTHS_BETWEEN(SYSDATE,hiredate)求出雇佣的月份,然后除以12的到雇佣的年份SELECT MONTHS_BETWEEN(SYSDATE,hiredate)/12 雇佣年份,EMP.* FROM EMP WHERE MONTHS_BETWEEN(SYSDATE,hiredate)/12 > 12;--结果      雇佣年份 EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO---------- ----- ---------- --------- ----- ----------- --------- --------- ------31.5449952  7369 SMITH      CLERK      7902 17-十二月-80    800.00               2031.3702640  7499 ALLEN      SALESMAN   7698 20-二月-81    1600.00    300.00     3031.3648877  7521 WARD       SALESMAN   7698 22-二月-81    1250.00    500.00     30     31.25  7566 JONES      MANAGER    7839 02-四月-81    2975.00               2030.7654253  7654 MARTIN     SALESMAN   7698 28-九月-81    1250.00   1400.00     3031.1713393  7698 BLAKE      MANAGER    7839 01-五月-81    2850.00               3031.0665006  7782 CLARK      MANAGER    7839 09-六月-81    2450.00               1025.2062855  7788 SCOTT      ANALYST    7566 19-四月-87    3000.00               2030.6283285  7839 KING       PRESIDENT       17-十一月-81   5000.00               1030.8191887  7844 TURNER     SALESMAN   7698 08-九月-81    1500.00      0.00     3025.1121995  7876 ADAMS      CLERK      7788 23-五月-87    1100.00               2030.5826296  7900 JAMES      CLERK      7698 03-十二月-81    950.00               3030.5826296  7902 FORD       ANALYST    7566 03-十二月-81   3000.00               2030.4455328  7934 MILLER     CLERK      7782 23-一月-82    1300.00               10 14 rows selected --11、以首字母大写的方式显示员工姓名 SELECT INITCAP(ename) FROM emp;--结果INITCAP(ENAME)--------------SmithAllenWardJonesMartinBlakeClarkScottKingTurnerAdamsJamesFordMiller 14 rows selected--12、显示姓名正好为5个长度的所有员工SELECT * FROM EMP WHERE LENGTH(ename) = 5;--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH      CLERK      7902 17-十二月-80    800.00               20 7499 ALLEN      SALESMAN   7698 20-二月-81    1600.00    300.00     30 7566 JONES      MANAGER    7839 02-四月-81    2975.00               20 7698 BLAKE      MANAGER    7839 01-五月-81    2850.00               30 7782 CLARK      MANAGER    7839 09-六月-81    2450.00               10 7788 SCOTT      ANALYST    7566 19-四月-87    3000.00               20 7876 ADAMS      CLERK      7788 23-五月-87    1100.00               20 7900 JAMES      CLERK      7698 03-十二月-81    950.00               30 8 rows selected--13、显示带有'R'的员工的详细SELECT * FROM EMP WHERE ename LIKE '%R%';--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7521 WARD       SALESMAN   7698 22-二月-81    1250.00    500.00     30 7654 MARTIN     SALESMAN   7698 28-九月-81    1250.00   1400.00     30 7782 CLARK      MANAGER    7839 09-六月-81    2450.00               10 7844 TURNER     SALESMAN   7698 08-九月-81    1500.00      0.00     30 7902 FORD       ANALYST    7566 03-十二月-81   3000.00               20 7934 MILLER     CLERK      7782 23-一月-82    1300.00               10 6 rows selected--14、显示员工姓名的前三个字符SELECT ename 全名,SUBSTR(ename,0,3) 前三个字符 FROM EMP;--结果全名       前三个字符---------- ----------SMITH      SMIALLEN      ALLWARD       WARJONES      JONMARTIN     MARBLAKE      BLACLARK      CLASCOTT      SCOKING       KINTURNER     TURADAMS      ADAJAMES      JAMFORD       FORMILLER     MIL 14 rows selected --15、显示所有员工的姓名,用‘a’替换所有的'A'SELECT ename 原名,REPLACE(ename,'A','a') 大A替换为小a FROM EMP;--结果原名       大A替换为小A---------- ------------SMITH      SMITHALLEN      aLLENWARD       WaRDJONES      JONESMARTIN     MaRTINBLAKE      BLaKECLARK      CLaRKSCOTT      SCOTTKING       KINGTURNER     TURNERADAMS      aDaMSJAMES      JaMESFORD       FORDMILLER     MILLER 14 rows selected--16、--列出满10年雇佣期限的员工的详细信息SELECT * FROM EMP WHERE MONTHS_BETWEEN(SYSDATE,hiredate)/12>10;--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH      CLERK      7902 17-十二月-80    800.00               20 7499 ALLEN      SALESMAN   7698 20-二月-81    1600.00    300.00     30 7521 WARD       SALESMAN   7698 22-二月-81    1250.00    500.00     30 7566 JONES      MANAGER    7839 02-四月-81    2975.00               20 7654 MARTIN     SALESMAN   7698 28-九月-81    1250.00   1400.00     30 7698 BLAKE      MANAGER    7839 01-五月-81    2850.00               30 7782 CLARK      MANAGER    7839 09-六月-81    2450.00               10 7788 SCOTT      ANALYST    7566 19-四月-87    3000.00               20 7839 KING       PRESIDENT       17-十一月-81   5000.00               10 7844 TURNER     SALESMAN   7698 08-九月-81    1500.00      0.00     30 7876 ADAMS      CLERK      7788 23-五月-87    1100.00               20 7900 JAMES      CLERK      7698 03-十二月-81    950.00               30 7902 FORD       ANALYST    7566 03-十二月-81   3000.00               20 7934 MILLER     CLERK      7782 23-一月-82    1300.00               10 14 rows selected--显示员工的详细资料,并按姓名排序SELECT * FROM EMP ORDER BY ename;--结果SELECT * FROM EMP ORDER BY ename; EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7876 ADAMS      CLERK      7788 23-五月-87    1100.00               20 7499 ALLEN      SALESMAN   7698 20-二月-81    1600.00    300.00     30 7698 BLAKE      MANAGER    7839 01-五月-81    2850.00               30 7782 CLARK      MANAGER    7839 09-六月-81    2450.00               10 7902 FORD       ANALYST    7566 03-十二月-81   3000.00               20 7900 JAMES      CLERK      7698 03-十二月-81    950.00               30 7566 JONES      MANAGER    7839 02-四月-81    2975.00               20 7839 KING       PRESIDENT       17-十一月-81   5000.00               10 7654 MARTIN     SALESMAN   7698 28-九月-81    1250.00   1400.00     30 7934 MILLER     CLERK      7782 23-一月-82    1300.00               10 7788 SCOTT      ANALYST    7566 19-四月-87    3000.00               20 7369 SMITH      CLERK      7902 17-十二月-80    800.00               20 7844 TURNER     SALESMAN   7698 08-九月-81    1500.00      0.00     30 7521 WARD       SALESMAN   7698 22-二月-81    1250.00    500.00     30 14 rows selected--18、显示员工的姓名和受雇日期,并按照老的员工排在前面的方式显示出来SELECT ename,hiredate FROM EMP ORDER BY hiredate ASC;--结果ENAME      HIREDATE---------- -----------SMITH      17-十二月-80ALLEN      20-二月-81WARD       22-二月-81JONES      02-四月-81BLAKE      01-五月-81CLARK      09-六月-81TURNER     08-九月-81MARTIN     28-九月-81KING       17-十一月-81JAMES      03-十二月-81FORD       03-十二月-81MILLER     23-一月-82SCOTT      19-四月-87ADAMS      23-五月-87 14 rows selected--19、显示所有员工的姓名、工作和薪金,按工作的降序排列,工作相同则按照薪金的升序排列SELECT ename,job,sal FROM emp ORDER BY job DESC,sal ASC;--结果ENAME      JOB             SAL---------- --------- ---------WARD       SALESMAN    1250.00MARTIN     SALESMAN    1250.00TURNER     SALESMAN    1500.00ALLEN      SALESMAN    1600.00KING       PRESIDENT   5000.00CLARK      MANAGER     2450.00BLAKE      MANAGER     2850.00JONES      MANAGER     2975.00SMITH      CLERK        800.00JAMES      CLERK        950.00ADAMS      CLERK       1100.00MILLER     CLERK       1300.00SCOTT      ANALYST     3000.00FORD       ANALYST     3000.00 14 rows selected --20、显示所有员工的姓名、加入公司的年份和月份、按接受所在雇佣月排序,若月的相同则按最早年份的员工排在最前面--本程序需要求出所雇的日期的年份和月份,然后再来显示SELECT ename 姓名,TO_CHAR(hiredate,'yyyy') 年份, TO_CHAR(hiredate,'mm') 月份 FROM emp ORDER BY 月份,年份;--结果姓名       年份 月份---------- ---- ----MILLER     1982 01ALLEN      1981 02WARD       1981 02JONES      1981 04SCOTT      1987 04BLAKE      1981 05ADAMS      1987 05CLARK      1981 06TURNER     1981 09MARTIN     1981 09KING       1981 11SMITH      1980 12JAMES      1981 12FORD       1981 12 14 rows selected--21、显示一个月为30天的情况下,所有员工的日薪,忽略余数SELECT ename 姓名,sal 月薪,TRUNC(sal/30) 日薪 FROM EMP;--结果姓名              月薪         日薪---------- --------- ----------SMITH         800.00         26ALLEN        1600.00         53WARD         1250.00         41JONES        2975.00         99MARTIN       1250.00         41BLAKE        2850.00         95CLARK        2450.00         81SCOTT        3000.00        100KING         5000.00        166TURNER       1500.00         50ADAMS        1100.00         36JAMES         950.00         31FORD         3000.00        100MILLER       1300.00         43--22、找出在(任何年份的)2月受雇的员工SELECT * FROM EMP WHERE TO_CHAR(hiredate,'mm') = 02;--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7499 ALLEN      SALESMAN   7698 20-二月-81    1600.00    300.00     30 7521 WARD       SALESMAN   7698 22-二月-81    1250.00    500.00     30  --23、对于每个员工显示其来到公司的天数 SELECT ename 姓名,SYSDATE-hiredate 来公司的天数  FROM EMP;--结果姓名             来公司的天数---------- ------------SMITH      11520.760555ALLEN      11455.760555WARD       11453.760555JONES      11414.760555MARTIN     11235.760555BLAKE      11385.760555CLARK      11346.760555SCOTT      9206.7605555KING       11185.760555TURNER     11255.760555ADAMS      9172.7605555JAMES      11169.760555FORD       11169.760555MILLER     11118.760555 14 rows selected--24、显示姓名字段的任何位置包含有’A‘的员工 SELECT * FROM EMP WHERE ename LIKE '%A%';--结果EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7499 ALLEN      SALESMAN   7698 20-二月-81    1600.00    300.00     30 7521 WARD       SALESMAN   7698 22-二月-81    1250.00    500.00     30 7654 MARTIN     SALESMAN   7698 28-九月-81    1250.00   1400.00     30 7698 BLAKE      MANAGER    7839 01-五月-81    2850.00               30 7782 CLARK      MANAGER    7839 09-六月-81    2450.00               10 7876 ADAMS      CLERK      7788 23-五月-87    1100.00               20 7900 JAMES      CLERK      7698 03-十二月-81    950.00               30 7 rows selected--25、以月份的方式显示所有员工的服务年限--结果分析:--    第一步:求出员工的雇佣年数,雇佣的月数除以12SELECT ename,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 年数 FROM EMP; ENAME             年数---------- ----------SMITH              31ALLEN              31WARD               31JONES              31MARTIN             30BLAKE              31CLARK              31SCOTT              25KING               30TURNER             30ADAMS              25JAMES              30FORD               30MILLER             30 14 rows selected--    第二步:求除去的出去年份之后的月份 SELECT ename,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 年数,TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) 月数 FROM emp; ENAME              年数         月数---------- ---------- ----------SMITH              31          6ALLEN              31          4WARD               31          4JONES              31          3MARTIN             30          9BLAKE              31          2CLARK              31          0SCOTT              25          2KING               30          7TURNER             30          9ADAMS              25          1JAMES              30          6FORD               30          6MILLER             30          5 14 rows selected--    第三步:求出的除去年份和月份之后的天数SELECT ename,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 年数,TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) 月数,TRUNC(SYSDATE-ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate)))  天数  FROM emp;ENAME              年数         月数         天数---------- ---------- ---------- ----------SMITH              31          6         15ALLEN              31          4         12WARD               31          4         10JONES              31          3          0MARTIN             30          9          4BLAKE              31          2          1CLARK              31          0         23SCOTT              25          2         13KING               30          7         15TURNER             30          9         24ADAMS              25          1          9JAMES              30          6         29FORD               30          6         29MILLER             30          5          9 14 rows selected--最后结果SELECT ename,TO_CHAR(SYSDATE,'YYYY-MM-DD'),TO_CHAR(hiredate,'YYYY-MM-DD') 雇佣日期,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 年数,TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) 月数,TRUNC(SYSDATE-ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate)))  天数  FROM emp;--结果 ENAME      TO_CHAR(SYSDATE,'YYYY-MM-DD') 雇佣日期           年数         月数         天数---------- ----------------------------- ---------- ---------- ---------- ----------SMITH      2012-07-02                    1980-12-17         31          6         15ALLEN      2012-07-02                    1981-02-20         31          4         12WARD       2012-07-02                    1981-02-22         31          4         10JONES      2012-07-02                    1981-04-02         31          3          0MARTIN     2012-07-02                    1981-09-28         30          9          4BLAKE      2012-07-02                    1981-05-01         31          2          1CLARK      2012-07-02                    1981-06-09         31          0         23SCOTT      2012-07-02                    1987-04-19         25          2         13KING       2012-07-02                    1981-11-17         30          7         15TURNER     2012-07-02                    1981-09-08         30          9         24ADAMS      2012-07-02                    1987-05-23         25          1          9JAMES      2012-07-02                    1981-12-03         30          6         29FORD       2012-07-02                    1981-12-03         30          6         29MILLER     2012-07-02                    1982-01-23         30          5          9 14 rows selected