您的位置:首页 > 职场人生

数据库面试题(三)

2017-01-04 10:54 197 查看
41、查询各职位的员工工资的最大值,最小值,平均值,总和

select job, max(sal),min(sal), avg(sal), sum(sal)

   fromemp

   groupby job;

42、选择具有各个job的员工人数(提示:对job进行分组)

select job, count(*)

   fromemp

   groupby job;

43、查询员工最高工资和最低工资的差距,列名为DIFFERENCE;

selectmax(sal)-min(sal) "DIFFERENCE"

   fromemp;

44、查询各个管理者属下员工的最低工资,其中最低工资不能低于800,没有管理者的员工不计算在内

select mgr, min(sal)

from emp

where mgr is not null

group by mgr

having min(sal) >=800;

45、查询所有部门的部门名字dname,所在位置loc,员工数量和工资平均值;

select dept.dname,dept.loc, COUNT, AVG

from dept

join(

   select deptno, count(*)as"COUNT", avg(sal)
as "AVG"

    from emp

    group by deptno

        )

using(deptno);

46、查询和scott相同部门的员工姓名ename和雇用日期hiredate

select ename, hiredate

from emp

where deptno = (select deptnofrom empwhere emp.ename = 'SCOTT');

47、查询工资比公司平均工资高的所有员工的员工号empno,姓名ename和工资sal。

select empno, ename, sal

from emp

where sal > (select avg(sal)from emp);

48、查询和姓名中包含字母u的员工在相同部门的员工的员工号empno和姓名ename

select empno, ename

from emp

where deptno in (select deptnofrom empwhere ename like '%U%');

49、查询在部门的loc为newYork的部门工作的员工的员工姓名ename,部门名称dname和岗位名称job

select e.ename, d.dname, e.job

from emp e join dept d

using (deptno)

where deptno = (select deptnofrom deptwhere loc = 'NEW YORK');

50、查询管理者是king的员工姓名ename和工资sal

select ename, sal

from emp

where mgr = (select empno fromemp whereename = 'KING');

51、显示Operations部门有哪些职位

select distinct e.job from empe , dept d where e.deptno = d.deptnoand d.dname = 'Operations';

52、各个部门中工资大于1500的员工人数

select dept_id , count(*) cntfrom s_emp where salary > 1500group by dept_id;

53、哪些员工的工资,高于整个公司的平均工资,列出员工的名字和工资(降序)

select first_name , salaryfrom s_emp where salary > (selectavg(salary) from s_emp) order by salarydesc;

54、所在部门平均工资高于1500的员工名字

select first_name , salaryfrom s_emp where dept_id in (selectdept_id from s_emp group by dpet_id havingavg(salary) > 1500);

55、列出各个部门中工资最高的员工的信息:名字、部门号、工资

select first_name , salary ,dept_id from s_emp where (dept_id ,salary) in (select dept_id , max(salary)from s_emp group by dept_id);

56、哪个部门的平均工资是最高的,列出部门号、平均工资

select dept_id,avg(salary)from s_emp group by dept_id havingavg(salary) = (select max(avg(salary)) froms_emp);

 

57、创建表employee,字段为:

Id number

First_Name varchar2(20),

last_Name varchar2(20),

  mgrid
NUMBER,  

Job varchar2(20),

Salary number(7,2)

 

CREATE TABLE employee(

id NUMBER,

first_name VARCHAR2(20),   

last_name   VARCHAR2(20),

mgrid NUMBER,  

salary NUMBER(7,2));

58、向表中插入下列数据,并提交,查询数据;
ID
FIRST_NAME
LAST_NAME
MGRID
SALARY
1
Rose
Tyler
4
1500
2
Matha
Jones
4
2200
3
Donna
Noble
4
1300
4
Doctor
Who
3500
5
Jack
Harkness
1
3000
INSERT INTO employee VALUES(1, 'Rose','Tyler', 4, 1500);

INSERT INTO employee VALUES(2, 'Martha','Jones', 4, 2200);

INSERT INTO employee VALUES(3, 'Donna','Noble', 4, 1300);

INSERT INTO employee VALUES(4, 'Doctor','Who', NULL,3500);

INSERT INTO employee VALUES(5, 'Jack','Harkness', 1, 3000);

59.将3号员工的last_name修改为“Tate”,并提交,查询数据;

UPDATE employee SET last_name= 'Tate'WHERE id = 3;

60.将所有工资少于2000的员工的工资修改为2000 (不提交),并设置保存点,查询数据;

UPDATE employee SET salary =2000 WHEREsalary < 2000;

SAVEPOINT A;

61.删除employee表中所有数据(不提交),查询数据;

DELETE FROM employee;

SELECT * FROM employee;

62.回滚到60题中的设置的保存点,查询数据;

Rollback to A;

SELECT * FROM employee;

63.删除表employee中所有数据,并提交,查询数据;

DELETE FROM employee;

COMMIT;

SELECT * FROM employee;

64、现有数据表Customer,其结构如下所示:

    cust_idNUMBER(4)  Primary
Key,      --客户编码

    cnameVARCHAR2(25)
Not Null,        --客户姓名

   csexCHAR(6)                        --客户性别

   birthdayDATE,                       --客户生日

account NUMBER.                    --客户账户余额

1)、创建表,客户编码为主键,姓名不能为空,性别只能选择”男”或”女”;

CREATE TABLEcustomer(

cust_id NUMBERPRIMARY KEY,

cname VARCHAR2(25)NOT NULL,

csex CHAR(6),

birthday DATE,

account NUMBER,

CONSTRAINTcust_csex_chk CHECK(csex IN (‘男’, ‘女’),));

2).构造SQL语句,向Customer数据表中插入一条记录,其信息如下:客户编码使用第一步创建的序列获得,客户姓名为sean,性别为”男”,生日为1987-11-17,帐户余额为12345元。

INSERT INTOcustomer(cust_id,cname, birthday, account) VALUES(cust_seq.NEXTVAL, 'sean',

TO_DATE('1987-11-17','yyyy-mm-dd'),12345);

 

65、创建一个序列,初始值是1000,步进是10;

Create sequence start with1000 increment by 10;

66、创建一个视图v_emp,内容是按部门分组,各个部门的薪水总和和员工人数;视图字段定义为deptno,total_sal, total_count;

Create or replace view

Is

Select deptno, sum(sal)total_sal, count(*) total_count

From emp group by deptno;

67、查询视图,列出全部记录;

Select * from v_emp;

68、列出薪水最低的三名员工的名字;

SELECT ename, sal, ROWNUM

FROM     (SELECT
ename,sal

                 FROM
emp

                 ORDER
BYsal)

WHERE ROWNUM <= 3;

69、列出按员工编码排序,第6到第10条员工记录。

SELECT  ename,
sal, rn

FROM     (SELECT
ROWNUMrn, ename, sal

                 FROM
emp

                ORDER
BY empno )

WHERE rn BETWEEN 6 AND 10;

70、有员工表empinfo

(

Fempno varchar2(10) not nullpk,

Fempname varchar2(20) notnull,

Fage number not null,

Fsalary number not null

);

假如数据量很大约1000万条;写一个你认为最高效的SQL,用一个SQL计算以下四种人:

fsalary>9999 and fage >35

fsalary>9999 and fage <35

fsalary <9999 and fage >35

fsalary <9999 and fage <35

每种员工的数量;

select sum(case when fsalary> 9999 and fage > 35

then 1

else 0 end) as"fsalary>9999_fage>35",

sum(case when fsalary >9999 and fage < 35

then 1

else 0

end) as"fsalary>9999_fage<35",

sum(case when fsalary <9999 and fage > 35

then 1

else 0

end) as"fsalary<9999_fage>35",

sum(case when fsalary <9999 and fage < 35

then 1

else 0

end) as "fsalary<9999_fage<35"

from empinfo;

71、aa,bb表都有20个字段,且记录数量都很大,aa,bb表的X字段(非空)上有索引, 请用SQL列出aa表里面存在的X在bb表不存在的X的值,请写出认为最快的语句,并解译原因。

select aa.x from aa

where not exists (select 'x'from bb where aa.x = bb.x) ;

以上语句同时使用到了aa中x的索引和的bb中x的索引

 

72. having与where的区别

having 和where 都是用来筛选用的,having 是分组后过滤  而where是分组前过滤

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: