資料庫面試題(二)
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
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';