数据库面试题(三)
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、向表中插入下列数据,并提交,查询数据;
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是分组前过滤
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(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是分组前过滤
相关文章推荐
- 一个数据库面试题的多种解法
- 数据库面试题(求助)
- 一道比较常用的数据库的面试题
- 数据库面试题集合
- 【转】数据库常用面试题
- JAVA综合面试题:页面的抓取、解析、保存数据库和生成HTML的页面展示
- J2EE面试题及其数据库面试题集锦,附答案
- 数据库常用面试题(SQL Server)
- 数据库面试题集合
- 数据库面试题
- 总结的关于数据库的一些面试题
- 一套外企的数据库设计面试题
- 你要向你8岁的侄子解释什么是数据库,请用三句话完成。 - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题,
- 数据库面试题(偏开发人员)
- 微软的数据库面试题。
- 一道数据库面试题
- 数据库面试题
- 一套外企的数据库设计面试题[转]
- 一家公司的数据库面试题
- (转)JAVA综合面试题:页面的抓取、解析、保存数据库和生成HT