数据库面试题(二)

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';

你可能感兴趣的:(数据库面试题)