1. 程式人生 > >資料庫面試題(二)

資料庫面試題(二)

1、構造SQL語句,列出在1981年入職的職員的姓名、入職時間和月收入(薪水和獎金之和)別名為salary,並將入職時間顯示為::“1981-10-10”這種形式,月收入顯示為”$12,345.67”這種形式。

SELECT ename,

  to_char(hiredate,   'yyyy-mm-dd') hiredate,

  to_char(sal + nvl(comm,   0),  '$99,999.00') salary

FROM emp

WHEREto_char(hiredate,   'yyyy') = '1981';

2、列出職員表中員工的姓名、薪水和薪水等級,並按薪水由高到低排序。等級資料來自於表salgrade。

SELECT e.ename,  e.sal, s.grade

FROM emp e JOINsalgrade s ON e.sal BETWEEN s.losal

AND s.hisal

ORDER BY sal DESC;

3、列出職員表中的員工姓名和他們所在的部門名稱及所在城市,按部門編碼升序排列。暫未分配部門的員工及沒有員工的部門不予考慮。

SELECT e.ename, d.dname,d.loc

FROM emp e JOIN deptd ON e.deptno = d.deptno

ORDER BY e.deptno;

4、列出每個員工的名字(別名為EMPLOYEE

)及他們的直接領導的名字(別名為MANAGER),如果某些員工沒有領導,則在其領導的位置上顯示“boss”。

SELECT e.ename EMPLOYEE, nvl(m.ename,   'boss') MANAGER

FROM emp e LEFT

OUTER JOIN emp m ONe.mgr = m.empno;

5、查詢員工分佈在哪些不同的部門,列出這些部門的部門編碼。去掉重複值顯示。

SELECT DISTINCTdeptno

FROM emp;

6、查詢每個部門每個職位的員工人數,如下形式:

SELECT deptno, job, COUNT(*)

FROM emp

GROUP BY deptno, job;

7、查詢哪些職位的薪水總和大於5000元,列出這些職位和其薪水總和,並按薪水總和升序排列。

SELECT job, SUM(sal)

FROM emp

GROUP BY job HAVINGSUM(sal) > 5000

ORDER BY SUM(sal);

8、查詢哪個部門的平均薪水比部門20的平均薪水低,列出這些部門的編碼和平均薪水值。

SELECT deptno, AVG(sal)

FROM emp

GROUP BY deptnoHAVING AVG(sal) <

  (SELECT AVG(sal)

   FROM emp

   WHERE deptno = 20);

9、查詢機構中薪水最低的五名員工,列出員工名字和薪水值。

SELECT ename, sal

FROM

  (SELECT ename, sal , rownum

   FROM emp

   ORDER BY sal)

WHERE rownum <= 5;

10、按薪水從高到低排序,列出第五位到第八位員工的姓名、薪水和職位。

SELECT ename, sal,job

FROM

  (SELECT a.*, rownum rn

   FROM

    (SELECT *

     FROM emp

     ORDER BY sal desc) a)

WHERE rn BETWEEN 5AND 8;

11、查詢職員表中工資大於1600的員工姓名和工資

Select ename, sal from emp where sal > 1600;

12、查詢職員表中員工號為7369的員工的姓名和部門號碼

Select ename, deptno from emp where empno = 7369;

13、選擇職員表中工資不在4000到5000的員工的姓名和工資

Select ename, sal from emp where sal not between 4000 and 5000;

14、選擇職員表中在20和30號部門工作的員工姓名和部門號

Select ename, deptno from emp where deptno =20 or deptno = 30;

15、選擇職員表中沒有管理者的員工姓名及職位, 按職位排序

Select ename, job from emp where mgr is null order by job;

16、選擇職員表中有獎金的員工姓名,工資和獎金,按工資倒序排列

Select ename, sal, comm. From emp where comm is not null orderby sal desc;

17、選擇職員表中員工姓名的第三個字母是A的員工姓名

Select ename from emp where ename like ‘__A%’;

18、列出部門表中的部門名字和所在城市;

select dname, loc from dept;

19、顯示出職員表中的崗位job,去掉重複的部分。

select distinct job from emp;

20、連線職員表中的職員名字、職位、薪水,列之間用逗號連線,列頭顯示成OUT_PUT(提示:使用連線符||、別名)

select ename || ', ' || job || ', ' || sal from emp;

21、查詢職員表emp中員工號、姓名、工資,以及工資提高百分之20%後的結果

select empno, ename, sal, sal * 1.2 salary from emp;

22、查詢員工的姓名和工資數,條件限定為工資數必須大於1200,並對查詢結果按入職時間進行排列,早入職排在前面,晚入職排在後面。

select ename, sal from emp where sal > 1200 order byhiredate;

23、列出除了ACCOUNT部門還有哪些部門。

select deptno, dname, loc from dept where dname <>  'ACCOUNT';

24、將員工的姓名按首字母排序,並列出姓名的長度(length)

select ename, length(ename) from emp order by ename;

25、做查詢顯示下面形式的結果

使用decode函式,按照下面的條件:

JOB                  GRADE

PRESIDENT            A

MANAGER              B

ANALYST              C

SALESMAN             D

CLERK                E

產生類似下面形式的結果

ENAME   JOB   GRADE

SMITH   CLERK   E

答案如下: 

SELECT ename, job,

DECODE(job,'PRESIDENT','A',

'MANAGER','B',

'ANALYST','C',

'SALESMAN','D',

'CLERK','E'

) AS "Grade"

FROM EMP;

26、查詢各員工的姓名ename,並顯示出各員工在公司工作的月份數(即:與當前日期比較,該員工已經工作了幾個月,用整數表示)。

select ename, round(months_between(sysdate, hiredate))hire_months from emp;

27、現有資料表Customer,其結構如下所示:

    cust_id NUMBER(4)  Primary Key,      --客戶編碼

    cname VARCHAR2(25) Not Null,        --客戶姓名

    birthday DATE,                       --客戶生日

   account NUMBER.                    --客戶賬戶餘額

(1).構造SQL語句,列出Customer資料表中每個客戶的資訊。如果客戶生日未提供,則該列值顯示“not available” 。如果沒有餘額資訊,則顯示“no account”。

select cust_id, cname, nvl(to_char(birthday, 'yyyy-mm-dd'), 'notavailable'),nvl(to_char(account,'9999'), 'no account') from Customer;

(2).構造SQL語句,列出生日在1987年的客戶的全部資訊。

select * from Customer where extract(year from birthday) = '1987';或者: select * fromCustomer where to_char(birtday,’yyyy’)=’1987’

(3).構造SQL語句,列出客戶帳戶的餘額總數。

select sum(account) from Customer;

28、按照”2009-4-11 20:35:10 ”格式顯示系統時間。

selectto_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') now from dual;

29、構造SQL語句查詢員工表emp中員工編碼empno,姓名ename,以及月收入(薪水 + 獎金),注意有的員工暫時沒有獎金。

select empno,ename, sal + nvl(comm, 0) month_salary from emp;

30、查詢員工姓名的長度是5個字元的員工資訊。

select * from empwhere length(ename) = 5;

31、查詢員工的姓名和工資,按下面的形式顯示:(提示:使用lpad函式)

    NAME            SALARY

-----------------------------------------------------

SMITH              $$$$$$$$$$24000

select ename name, lpad(sal, 15, '$') salary from emp;

32、查詢薪水大於2000元的員工的姓名和薪水,薪水值顯示為’RMB5000.00’這種形式,並對查詢結果按薪水的降序方式進行排列;

select ename, to_char(sal, 'L9999.00') salary from emp

where sal > 2000

order by sal desc;

33、構造查詢語句,產生類似於下面形式的結果:

    NAME            HIREDATE                REVIEW

---------------------------------------------------

SMITH               1980-12-17             1980年12月17日

select ename name, to_char(hiredate, 'yyyy-mm-dd') hiredate,

to_char(hiredate, 'yyyy"年"mm"月"dd"日"') review

from emp;

34、顯示所有員工的姓名ename,部門號deptno和部門名稱dname。

Select e.ename, d.deptno, d.dname

From emp e join dept d on e.deptno = d.deptno;

35、選擇在DALLAS工作的員工的員工姓名、職位、部門編碼、部門名字

Select e.ename, d.deptno, d.dname

From emp e join dept d on e.deptno = d.deptno and d.loc =‘DALLAS’;

36、選擇所有員工的姓名ename,員工號deptno,以及他的管理者mgr的姓名ename和員工號deptno,結果類似於下面的格式

employees

Emp#

manager

Mgr#

select wor.ename"employees", wor.empno "Emp#", mag.ename"manager", mag.empno "Mgr#"

from emp wor, emp mag

where wor.mgr = mag.empno;

37、查詢各部門員工姓名和他們所在位置,結果類似於下面的格式

Deptno

Ename

Loc

select deptno,e.ename,d.loc

from emp e join dept d

using (deptno);

38、查詢公司員工工資的最大值,最小值,平均值,總和

select max(sal),min(sal), avg(sal), sum(sal) from emp;

39、列出每個員工的名字,工資、漲薪後工資(漲幅為8%),元為單位進行四捨五入

Select ename , sal , round(sal*1.08) fromemp;

40、查詢出JONES的領導是誰(JONES向誰報告)。

select e1.ename from emp e1 , emp e2 where e1.mgr= e2.empno and e2.ename = 'JONES';