select e.ename, d.dname
from (select t1.dname
from (select d.dname, count(d.dname) count_num
from emp e, dept d
where e.deptno = d.deptno
and e.ename like 'A%'
group by d.dname) t1,
(select d.dname, count(d.dname) count_num
from emp e, dept d
where e.deptno = d.deptno
and e.ename like 'A%'
group by d.dname) t2
where t1.count_num > t2.count_num) t,
emp e,
dept d
where e.deptno = d.deptno
and t.dname = d.dname
❷ java,oracle面试题,如下,sql怎么写
如题我先进行分析:
第一句话中按月找出平均 填写时间大于3天的人员信息 :
那么可用理解为 根据月份查找 员工平均延迟填写日期大于3天的 人员信息。
第二句话一个人员的日志填写日期有多条则取最早的一条,如果有一天未填写,则取系统当前时间,不含小时。
以上这句话需要注意两点 第一点,取最早的一条此处需要用到ROW_NUMBER() OVER() 以及未填写 则取系统当前时间 不含小时 那么取值格式应为yyyy-mm-dd此处需要处理格式。
根据以上分析提供如下SQL: 注:(以下SQL已ORACLE为例)
--创建临时表存储数据
withemp_logas(
select1asempno,'张一'asempname,'工作内容1'asworkcontent,date'2017-03-20'asbegdate,date'2017-03-23'asentrydate,1asnumfromal
unionall
select1asempno,'张一'asempname,'工作内容2'asworkcontent,date'2017-03-20'asbegdate,date'2017-03-23'asentrydate,2asnumfromal
unionall
select1asempno,'张一'asempname,'工作内容3'asworkcontent,date'2017-03-20'asbegdate,date'2017-03-24'asentrydate,5asnumfromal
unionall
select1asempno,'张一'asempname,'工作内容1'asworkcontent,date'2017-03-24'asbegdate,date'2017-03-30'asentrydate,8asnumfromal
unionall
select2asempno,'张二'asempname,'工作内容21'asworkcontent,date'2017-03-20'asbegdate,date'2017-03-30'asentrydate,8asnumfromal
unionall
select2asempno,'张二'asempname,'工作内容22'asworkcontent,date'2017-03-25'asbegdate,date'2017-03-28'asentrydate,8asnumfromal
unionall
select3asempno,'张三'asempname,'工作内容31'asworkcontent,date'2017-03-20'asbegdate,nullasentrydate,nullasnumfromal
unionall
select3asempno,'张三'asempname,'工作内容32'asworkcontent,date'2017-03-20'asbegdate,nullasentrydate,nullasnumfromal
unionall
select4asempno,'张四'asempname,'工作内容42'asworkcontent,date'2017-03-25'asbegdate,date'2017-03-28'asentrydate,8asnumfromal
)
select*from(
selectempno,empname,sum(num)num,sum(yanci)/count(empno)pingjunyanci--获取人员当月总延迟数除去当月人员每日的打开数计算出当月每天的平均延迟天数
from(selectROW_NUMBER()OVER(PARTITIONBYe.empno,e.begdateORDERBYe.empno,e.begdate)ASRN,--排序获取当天有多条记录并在后面条件中获取第一条
e.empno,e.empname,
e.workcontent,e.begdate,
e.entrydate,
e.num,
(nvl(e.entrydate,to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd'))-begdate)asyanci--判断如果没有填写结束日期那么以系统当前日期进行运算延迟日期
fromemp_loge)e1
wheree1.rn=1--获取第一条
andto_char(begdate,'yyyy-mm')='2017-03'--可用的月份条件
groupbyempno,empname,numorderbyempno--根据人员工号、人员姓名分组汇总
)e2wheree2.pingjunyanci>3;
--分析不易忘认真阅读后采纳,有其他问题请追问我。
❸ 谁有oracle sql语句练习题
1、选择部门30中的雇员
select * from emp where deptno=30;
2、列出所有办事员的姓名、编号和部门
select ename,empno,dname from emp e inner join dept d on e.deptno = d.deptno where job=upper('clerk’);
3、找出佣金高于薪金的雇员
select * from emp where comm>sal;
4、找出佣金高于薪金60%的雇员
select * from emp where comm>sal*0.6
5、找出部门10中所有经理和部门20中的所有办事员的详细资料
select * from emp where (deptno=10 and job=upper('manager')) or (deptno=20 and job=upper('clerk '));
6、找出部门10中所有经理、部门20中所有办事员,既不是经理又不是办事员但其薪金>=2000的所有雇员的详细资料
select * from emp where (deptno=10 and job=upper('manager')) or (deptno=20 and job=upper('clerk ')) or (job<>upper(‘manager’) and job<>upper(‘clerk’) and sal>=2000)
7、找出收取佣金的雇员的不同工作
select distinct job from emp where comm>0;
8、找出不收取佣金或收取的佣金低于100的雇员
select * from emp where nvl(comm,0)<100;
9、找出各月最后一天受雇的所有雇员
select * from emp where hiredate= last_day(hiredate);
10、找出早于25年之前受雇的雇员
select * from emp where months_between(sysdate,hiredate)/12>25;
select * from emp where hiredate<add_months(sysdate,-12*25);
11、显示只有首字母大写的所有雇员的姓名
select ename from emp where ename=initcap(ename);
12、显示正好为6个字符的雇员姓名
select ename from emp where length(ename)=6
13、显示不带有'R'的雇员姓名
Select ename from emp where ename not like ‘%R%’;
Select ename from emp where instr(ename,’R’)=0;
14、显示所有雇员的姓名的前三个字符
select substr(ename,1,3) from emp
15、显示所有雇员的姓名,用a替换所有'A'
Select replace(ename,’A’,’a’) from emp
16、显示所有雇员的姓名以及满10年服务年限的日期
Select ename,add_months(hiredate,12*10) ‘服务年限的日期’ from emp
❹ 请帮忙解决一道Oracle数据库试题:
用管道函数:
create or replace type rec_list is table of number;
CREATE OR REPLACE FUNCTION pipe_rec (pmax NUMBER)
RETURN rec_list PIPELINED
IS
BEGIN
FOR i IN 1 .. pmax
LOOP
PIPE ROW (i);
END LOOP;
RETURN;
END;
/
insert into a
select a.*,1 from table(pipe_rec(10000000)) b
❺ oracle sql面试题求助
--1
select max(sal) ,min(sal) from emp group by deptno;
--2
select max(sal) ,min(sal) from emp where job='CLERK' group by deptno;
--3
select deptno,max(sal) ,min(sal) from emp where job='CLERK' and deptno=(select deptno from emp group by deptno having min(sal)<1000) group by deptno;
--4
select ename,deptno,sal from emp order by deptno desc,sal
--5
select ename,deptno from emp where deptno = (select deptno from emp where ename='张三')
--6
select e.ename,e.job,e.deptno,d.dname from emp e left join dept d on d.deptno=e.deptno
--7
select e.ename,e.job,e.deptno,d.dname from emp e left join dept d on d.deptno=e.deptno where e.job='CLERK'
--8
select e.ename,m.mname from emp e left join mgr m on m.mgr=e.mgr
--9
select * from (select ename, job from emp where job='CLERK') a union all select dname, deptno from dept ;
--10
select e.deptno,e.ename,e.sal from emp e left join (select deptno, avg(sal) SV from emp group by deptno) b on
b.deptno=e.deptno where e.sal>b.SV order by e.deptno ;
--11
select count(e.deptno),e.deptno from emp e left join (select deptno, avg(sal) SV from emp group by deptno) b on
b.deptno=e.deptno where e.sal>b.SV group by e.deptno order by e.deptno;
--12
select e.deptno,count(e.deptno) from emp e left join (select deptno, avg(sal) SV from emp group by deptno) b on
b.deptno=e.deptno where e.sal>b.SV group by e.deptno having count(e.deptno)>1 order by e.deptno;
❻ ORACLE数据库面试题
1.
update t
set logdate=to_date('2003-01-01','yyyy-mm-dd')
where logdate=to_date('2001-02-11','yyyy-mm-dd');
2.
select *
from t
where name in (select name from t group by name having coung(*)>1)
order by name;--没说清楚,到底是升序还是降序
3.
select ID,NAME,ADDRESS,PHONE,LOGDATE
from
(
select t.*,row_number() over(partition by name order by name) rn
from t
)
where rn = 1;
4.
update t
set (address,phone)=
(select address,phone from e where e.name=t.name);
5.
select *
from t
where rownum <=5
minus
select *
from t
where rownum <=2;
也没什么特别的地方,有些题目用oracle特有的函数去做会比较简单,像在第三题中用到的oracle的分析函数,以及在第一题中用到的oracle的to_char()函数。
这几个题目主要是看你能不能使用oracle的函数去处理
❼ oracle sql 语句 面试题
(1)统计有学生选修的课程门数
select count(distinct c#) from SC
2)求选修C4课程的女学生的平均年龄
select avg(s.age) --最好都带上前缀,养成好习惯
from s,c,sc where s.s#=sc.s# and c.c#=sc.c#
and c.cname='C4' and s.sex='女'--字符类型带引号,必须注意大小写,你那么写好麻烦
3)求刘老师所授的课程的每门课程的平均成绩
select c.cname , avg(grade) from sc , c
where c.teacher =' liu' and sc.c# = c.c#
group by c.cname --select后是什么字段,这地方你也得最少有这个字段
(4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求显示课程号和人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
select t.*
from
(select sc.c#, count(s#) counnt_s from s,sc where s.s# = sc.s# group by sc.c# having count(s#) >10) t
order by counnt_s desc,c# asc --你排序不对,另外oracle不可根据别名排序,只可再做嵌套
5)检索学号比王军同学大,而年龄比他小的学生姓名
select a.s#
from
(select s# from s where s#>(select s# from s where sname='王军') a,
select s# from s where age>(select age from s where sname='王军') b
where a.s#=b.s#
6)求年龄大于女同学平均年龄的男学生的姓名和年龄
select sname,age from s
where age>
(select avg(age) from s where sex = 'nv') and sex = 'nan' --没问题
7)求年龄大于所有女同学年龄的男学生的姓名和年龄
select sname ,age from s
where age>(select max(age) from s where sex = 'nv') and sex = 'nan' --没问题
❽ 关于oracle试题,数据库是oracle11g用于scott用户测试的数据库,题目如下。
1:
SELECT d.deptno,d.dname,COUNT(e.empno),AVG(sal),MIN(sal),MAX(sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno(+)
GROUP BY d.deptno,d.dname
HAVING COUNT(e.empno)>1;
3:
SELECT e.empno,e.ename,d.dname,m.ename
FROM emp e,dept d,emp m
WHERE e.sal>ALL(
SELECT sal
FROM emp
WHERE ename IN('SMITH','ALLEN'))
AND e.deptno=d.deptno
AND e.mgr=m.empno(+);
4:
SELECT e.empno,e.ename,m.empno,m.ename,(m.sal+NVL(m.comm,0))*12 income
FROM emp e,emp m www.2cto.com
WHERE e.mgr=m.empno(+)
ORDER BY income DESC;
5:
SELECT e.empno,e.ename,d.dname,d.loc,temp.count
FROM emp e,emp m,dept d,(
SELECT deptno dno,COUNT(empno) count
FROM emp
GROUP BY deptno) temp
WHERE e.mgr=m.empno(+) AND e.hiredate<m.hiredate
AND e.deptno=d.deptno
AND e.deptno=temp.dno;
6:
SELECT * FROM
(select b.*,ROWNUM rn from (select a.* from emp a) b)
WHERE rn BETWEEN 5 AND 10;