Oracle基礎練習題,採用Oracle資料庫自帶的表,適合初學者,其中包括了一些簡單的查詢,已經具有Oracle自身特點的單行函數的應用 本文使用的實例表結構與表的數據如下: emp員工表結構如下: dept部門表: 提示:工資 = 薪金 + 佣金 emp表的現有數據如下: dept表的現有數據如 ...
Oracle基礎練習題,採用Oracle資料庫自帶的表,適合初學者,其中包括了一些簡單的查詢,已經具有Oracle自身特點的單行函數的應用
本文使用的實例表結構與表的數據如下:
emp員工表結構如下:
- Name Type Nullable Default Comments
- -------- ------------ -------- ------- --------
- EMPNO NUMBER(4) 員工號
- ENAME VARCHAR2(10) Y 員工姓名
- JOB VARCHAR2(9) Y 工作
- MGR NUMBER(4) Y 上級編號
- HIREDATE DATE Y 雇佣日期
- SAL NUMBER(7,2) Y 薪金
- COMM NUMBER(7,2) Y 佣金
- DEPTNO NUMBER(2) Y 部門編號
dept部門表:
- Name Type Nullable Default Comments
- ------ ------------ -------- ------- --------
- DEPTNO NUMBER(2) 部門編號
- DNAME VARCHAR2(14) Y 部門名稱
- LOC VARCHAR2(13) Y 地點
提示:工資 = 薪金 + 佣金
emp表的現有數據如下:
- SQL> select * from emp;
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ----- ---------- --------- ----- ----------- --------- --------- ------
- 7369 SMITH CLERK 7902 1980-12-17 800.00 20
- 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
- 7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
- 7566 JONES MANAGER 7839 1981-4-2 2975.00 20
- 7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
- 7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
- 7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
- 7788 SCOTT ANALYST 7566 1987-4-19 4000.00 20
- 7839 KING PRESIDENT 1981-11-17 5000.00 10
- 7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
- 7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
- 7900 JAMES CLERK 7698 1981-12-3 950.00 30
- 7902 FORD ANALYST 7566 1981-12-3 3000.00 20
- 7934 MILLER CLERK 7782 1982-1-23 1300.00 10
- 14 rows selected
dept表的現有數據如下:
- SQL> select * from dept;
- DEPTNO DNAME LOC
- ------ -------------- -------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
- 4 rows selected
用SQL完成以下問題列表:
第一篇
- 列出至少有一個員工的所有部門。
- 列出薪金比“SMITH”多的所有員工。
- 列出所有員工的姓名及其直接上級的姓名。
- 列出受雇日期早於其直接上級的所有員工。
- 列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門
- 列出所有“CLERK”(辦事員)的姓名及其部門名稱。
- 列出最低薪金大於1500的各種工作。
- 列出在部門“SALES”(銷售部)工作的員工的姓名,假定不知道銷售部的部門編號。
- 列出薪金高於公司平均薪金的所有員工。
- 列出與“SCOTT”從事相同工作的所有員工。
- 列出薪金等於部門30中員工的薪金的所有員工的姓名和薪金。
- 列出薪金高於在部門30工作的所有員工的薪金的員工姓名和薪金。
- 列出在每個部門工作的員工數量、平均工資和平均服務期限。
- 列出所有員工的姓名、部門名稱和工資。
- 列出所有部門的詳細信息和部門人數。
- 列出各種工作的最低工資。
- 列出各個部門的MANAGER(經理)的最低薪金。
- 列出所有員工的年工資,按年薪從低到高排序。
第二篇
- 找出EMP表中的姓名(ENAME)第三個字母是A 的員工姓名。
- 找出EMP表員工名字中含有A 和N的員工姓名。
- 找出所有有佣金的員工,列出姓名、工資、佣金,顯示結果按工資從小到大,佣金從大到小。
- 列出部門編號為20的所有職位。
- 列出不屬於SALES 的部門。
- 顯示工資不在1000 到1500 之間的員工信息:名字、工資,按工資從大到小排序。
- 顯示職位為MANAGER 和SALESMAN,年薪在15000 和20000 之間的員工的信息:名字、職位、年薪。
- 說明以下兩條SQL語句的輸出結果:
- SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL;
- SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL;
- 讓SELECT 語句的輸出結果為
- SELECT * FROM SALGRADE;
- SELECT * FROM BONUS;
- SELECT * FROM EMP;
- SELECT * FROM DEPT;
- ……
列出當前用戶有多少張數據表,結果集中存在多少條記錄。
10.判斷SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'是否報錯,為什麼?
答案:如果需要建表,可以看看這個:http://www.cnblogs.com/yjxt/p/8193801.htm------第一篇
--1.列出至少有一個員工的所有部門。 select dname from dept where deptno in(select deptno from emp group by deptno having count(deptno)>=3); --2.列出薪金比“SMITH”多的所有員工。 select * from emp where sal>(select sal from emp where ename='SMITH'); --3.列出所有員工的姓名及其直接上級的姓名。 select a.ename,(select ename from emp b where b.empno=a.mgr) as boss_name from emp a; --4.列出受雇日期早於其直接上級的所有員工。 select a.ename from emp a where a.hiredate>(select hiredate from emp b where b.empno=a.mgr); --5.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門(left join從左表那裡返回所有的行,即使在右表中沒有匹配的行。) select a.dname,b.empno,b.ename,b.job,b.mgr,b.hiredate,b.sal,b.deptno from dept a left join emp b on a.deptno=b.deptno; --6.列出所有“CLERK”(辦事員)的姓名及其部門名稱。(:as 是 alias 的縮寫,是“別名”的意思,後面接中文需要用 "" 。) select a.ename,(select dname from dept b where b.deptno=a.deptno) as dname from emp a where a.job='CLERK'; select a.ename,b.dname from emp a join dept b on a.deptno=b.deptno and a.job='CLERK'; --7.列出最低薪金大於1500的各種工作。(distinct 篩選重覆值) select distinct job from emp group by job having min(sal)>1500; --8.列出在部門“SALES”(銷售部)工作的員工的姓名,假定不知道銷售部的部門編號。 select ename from emp where deptno=(select deptno from dept where dname='SALES'); --9.列出薪金高於公司平均薪金的所有員工。 select ename from emp where sal>(select avg(sal) from emp); --10.列出與“SCOTT”從事相同工作的所有員工。 select ename from emp where job=(select job from emp where ename='SCOTT'); --11.列出薪金等於部門30中員工的薪金的所有員工的姓名和薪金。(in 操作符允許我們在where子句中規定多個值) select ename,sal from emp where sal in(select sal from emp where deptno=30); --12.列出薪金高於在部門30工作的所有員工的薪金的員工姓名和薪金。(max() 求最大值) select ename,sal from emp where sal>(select max(sal) from emp where deptno=30); --13.列出在每個部門工作的員工數量、平均工資和平均服務期限。(group by+[分組欄位](可以有多個)用於結合合計函數,根據一個或多個列對結果集進行分組。) select (select b.dname from dept b where b.deptno=a.deptno) 部門, count(deptno) 平均工資,avg(sal) 平均服務期限 from emp a group by deptno; --14.列出所有員工的姓名、部門名稱和工資。 select ename,(select b.dname from dept b where b.deptno= a.deptno) 部門,sal from emp a; --15.列出所有部門的詳細信息和部門人數。(count(列名)函數返回指定列的值的數目,返回的是一個數字) select deptno, dname, loc,(select count(deptno) from emp b where b.deptno=a.deptno group by deptno) 部門人數 from dept a; --16.列出各種工作的最低工資。( min(列名) 求最小值 ;max(列名) 求最大值 ) select job, min(sal+nvl(comm,0) from emp group by job;
select job, min(nvl2(comm,sal+comm,sal)) from emp group by job; --17.列出各個部門的MANAGER(經理)的最低薪金。 select deptno,(select dname from dept b where b.deptno=a.deptno) 部門,min(sal) from emp a where job='MANAGER' group by deptno; --18.列出所有員工的年工資,按年薪從低到高排序。( nvl(表達式,value):如果表達式計算結果為 null ,則返回 value) select ename,(sal+nvl(comm,0))*12 as salpersal from emp order by salpersal;
select ename,(nvl2(comm,sal+comm, sal))*12 as salpersal from emp order by salpersal;
------第二篇 --1. 找出EMP表中的姓名(ENAME)第三個字母是A 的員工姓名。(like 操作符用於在 where 子句中搜索列中的指定模式。 "%" 可用於定義通配符(模式中缺少的字母)。) select ename from emp where ename like '__A%'; --2. 找出EMP表員工名字中含有A 和N的員工姓名。(and 並且 ; or 或者) select ename from emp where ename like '%A%' and ename like '%N%' --3. 找出所有有佣金的員工,列出姓名、工資、佣金,顯示結果按工資從小到大,佣金從大到小。(order by 預設按照升序排序;order by 列名 desc 降序) select ename,nvl2(comm,sal+comm,sal) as wage,comm from emp order by wage,comm desc; --4. 列出部門編號為20的所有職位。(和第一篇的第七題類似) select distinct job from emp where deptno=20; --5. 列出不屬於SALES 的部門。 --in和exists的區別: --exists(相關子查詢):存在,後面一般都是子查詢,不返回列表的值,只是返回一個ture或false的結果 --in:包含,in()後面的子查詢 是返回結果集的 select distinct * from dept where dname not in('SALES'); select distinct * from dept where exists(select dname from dept where dname='SALES'); --6. 顯示工資不在1000 到1500 之間的員工信息:名字、工資,按工資從大到小排序。(between ... and 會選取介於兩個值之間的數據範圍。) select ename,nvl2(comm,sal+comm,sal) as wage from emp where nvl2(sal,comm+comm,sal) not between 1000 and 1500 order by wage desc; select ename,nvl2(comm,sal+comm,sal) as wage from emp where nvl2(sal,comm+comm,sal)<1000 or sal+comm>1500 order by wage desc; -- 7. 顯示職位為 MANAGER 和 SALESMAN,年薪在15000 和20000 之間的員工的信息:名字、職位、年薪。 select ename 姓名,job 職位,(sal+nvl(comm,0))*12 年薪 from emp where (sal+comm)*12 between 15000 and 20000 and job in('MANAGER','SALESMAN') -- 8. 說明以下兩條SQL語句的輸出結果: -- SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL; -- SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL; -- 答案:IS NULL:是判斷某個‘欄位’是否為空,為空並不等價於為空字元串或為數字0; -- = NULL :是判斷某個‘值’是否等於NULL,NULL=NULL和NULL="" 都返回false。<br=""> --9.讓SELECT 語句的輸出結果為 -- SELECT * FROM SALGRADE; -- SELECT * FROM BONUS; -- SELECT * FROM EMP; -- SELECT * FROM DEPT; -- …… --列出當前用戶有多少張數據表,結果集中存在多少條記錄。 select * from user_tables; --10.判斷SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'是否報錯,為什麼? --答:不會抱錯,這兒存在隱式數據類型的。