oracle练习题

例题:

现在要求查询出公司的雇员雇佣情况,希望通过数据库可以查找到每个雇员的编号、姓名、基本工资三个信息进行浏览
select empno,ename,sal from emp
现在要求查询公司中所有雇员的职位信息
select ename,job from emp
要求通过数据库查询出所有雇员的编号、雇员姓名和年基本工资、日基本工资,以作为年终奖金的发放标准
select empno,ename,sal,sal/30 from emp
现在公司每个雇员在年底的时候可以领取5000元的年终奖金,要求查询雇员编号、雇员姓名和增长后的年基本工资(不包括提成)。
select empno,ename,sal,(sal*12)+5000 from emp
公司每个月为雇员增加200元的补助金,此时,要求可以查询出每个雇员的编号、姓名、基本年工资(包括在年底的时候可以领取5000元的年终奖金)。
select empno,ename,sal,((sal+200)12)+5000 from emp/一个月的工资+每个月200补助一年12个月+5000年元终奖/
统计出基本工资高于1500的全部雇员信息
select * from emp where sal>1500
现在要求查询出所有基本工资小于等于2000的全部雇员信息
select * from emp where sal<2000
根据之前的查询结果发现SMITH的工资最低,所以现在希望可以取得SMITH的详细资料
select * from emp where ename=‘SMITH’
查询出所有办事员(CLERK)的雇员信息
select * from emp where job=‘CLERK’
查询所有不是办事员的雇员信息
select * from emp where job<>‘CLERK’
/连接表:表尾与表头连接/
select * from emp
select * from dept

select * from emp where comm is null or comm=0

现在要求查询出公司的雇员雇佣情况,希望通过数据库可以查找到每个雇员的编号、姓名、基本工资三个信息进行浏览
现在要求查询公司中所有雇员的职位信息
select empno,ename,job from emp;
要求通过数据库查询出所有雇员的编号、雇员姓名和年基本工资、日基本工资,以作为年终奖金的发放标准
select empno,ename,sal/30, sal12 from emp ;
现在公司每个雇员在年底的时候可以领取5000元的年终奖金,要求查询雇员编号、雇员姓名和增长后的年基本工资(不包括提成)。
select empno,ename,sal
12+5000 from emp;
公司每个月为雇员增加200元的补助金,此时,要求可以查询出每个雇员的编号、姓名、基本年工资(包括在年底的时候可以领取5000元的年终奖金)。
select empno,ename,(sal+200)*12+5000 from emp;
统计出基本工资高于1500的全部雇员信息
select * from emp where sal>1500;
现在要求查询出所有基本工资小于等于2000的全部雇员信息
select * from emp where sal<=2000
根据之前的查询结果发现SMITH的工资最低,所以现在希望可以取得SMITH的详细资料
select * from emp where ename=‘SMITH’
查询出所有办事员(CLERK)的雇员信息
select * from emp where job=‘CLERK’
查询所有不是办事员的雇员信息
select * from emp where job<>‘CLERK’
查询出工资范围在1500 ~ 3000(包含1500和3000)的全部雇员信息
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000
查询职位是办事员,并且基本工资高于1200的所有雇员信息
select * from emp where job='CLERK’and sal>1200
查询不是办事员(CLERK),且基本工资大于2000的全部雇员信息
select * from emp where job<>‘CLERK’ and sal>2000

查询每个员工涨20%的工资是多少,显示名字和金额
select ename, sal*(1+0.2)from emp
查看给每个员工工资加500的薪金是多少
select ename,sal+500 from emp;
查询没有提成的员工信息
select * from emp where comm is null or comm=0;/没有提成的员工/
查询有提成的员工所有信息
select * from emp where comm is not null and comm>0;/有提成的员工/
Null和任何值运算,结果为null
select null+10,null-10,null*10,null/10 from emp;
查询提成加500的员工名字和提成
select ename, comm+500,comm from emp;
找出有奖金的员工的不同工作,不要重复数据
select distinct job from emp where comm is not null and comm>0;
查询没有提成且工资大于2000的员工信息
select * from emp where (comm is null or comm=0) and sal>2000
找出没有奖金或者奖金低于 1000 的员工信息
select * from emp where (comm is null or comm=0)or comm<1000
查询员工编号在7788或者7499或者是 7369的员工信息
select * from emp where empno in(7788,7499,7369);
查询员工姓名是SMITH或者是SCOTT的人员信息
select * from emp where ename in(‘MANAGER’,‘SCOTT’);
习题
SELECT * FROM emp WHERE comm IS NULL OR comm=0;
找出部门 10 中既不是经理(MANAGER)也不是普通员工(CLERK)的信息,
select * from emp where deptno=10 and job not in (‘MANAGER’,‘CLERK’)
找出部门 20 中既不是经理(MANAGER)也不是普通员工(CLERK)的信息,而且工资大于等于 2000 的员工
select * from emp where deptno=20 and job not in (‘MANAGER’,‘CLERK’)and sal>2000;
例题:现在查询出雇员姓名是S开头的全部雇员信息
select * from emp where ename like ‘%S%’
select * from emp where ename like ‘%S’;
select * from emp where ename like ‘S%’;
select * from emp where ename like ‘_S%’
习题:
查询名字以S结尾和部门是20的员工编号、入职日期、部门编号 ,提成
select empno,hiredate,mgr,comm from emp where ename like’%S’ and (deptno=20)
查询员工工资大于等于2000 或者部门是20的员工姓名、入职日期、
select ename,hiredate from emp where deptno=20 or sal>=2000
查询工资在1000到2000之间的员工的姓名和工资
select ename,sal from emp where sal between 1000 and 2000
查询员工叫KING的工资、提成、部门
select sal,comm,deptno from emp where ename=‘KING’
查询员工姓名的第三个字母是A的员工姓名
select * from emp where ename like (’__A%’)
显示提成(COMM)收入比工资(SAL)高的员工的部门编号、名字、入职日期
select empno,ename,hiredate,sal from emp where sal 查询部门20的详细信息,地址,位置

显示10 号部门的所有经理(‘MANAGER’)或者20 号部门的所有职员(‘CLERK’)的员工编号、职位、薪金、部门编号
select empno,job,sal,mgr from emp where( deptno=10 and job=‘MANAGER’) or deptno=20 and job=‘CLERK’
查询不是10部门的员工或者名字带S开头的姓名的信息
select * from emp where ename like’%S’or deptno<>10

/练习题/
测试题:
1.查询20部门的员工信息和上级编号是7788的员工编号、姓名、上级编号和部门
select empno,ename,mgr,deptno from emp where mgr in 7788 and deptno=20
2.查询员工名字叫SCOTT的这个人的所以信息
select * from emp where ename=‘SCOTT’
3.查询工资大于1000和部门是30的员工的编号,姓名,工资
select empno,ename,sal from emp where sal>1000 and deptno=30
4.查询员工叫KING的工资、提成、部门
select sal,comm,/ deptno from emp where ename=‘KING’
/5.查询员工姓名的第三个字母是A的员工或者编号第二位的3的员工编号、姓名和部门/
select * from emp
6.查询职位有哪些(去重),显示职位
select distinct job from emp
7.查询职位(JOB)为’PRESIDENT’的员工的工资和姓名
select sal,ename from emp where job=‘PRESIDENT’
8.查询没有提成的员工和部门是20的员工编号、姓名、日期和提成
select empno,ename,hiredate,comm from emp where deptno=20and comm is null or comm=0 /111/
/9.查询部门40的部门名称,位置(dept表)/

10.显示10 号部门的所有经理(‘MANAGER’)和20 号部门的所有职员(‘CLERK’)的详细信息
/*select * from emp where (deptno=10 and job=‘MANAGER’) or deptno=20 and ename=‘CLERK’
*//*11.显示佣金(COMM)收入比工资(SAL)高的员工的详细信息
*/
12.查询以S结尾的员工姓名及月收入
select * from emp where ename like’%S’
13.查询工资在1000到2000之间的员工的姓名和工资
select ename,sal from emp where sal between 1000 and 2000
14.查询工资大于2000或者部门是20的员工的编号,姓名,工资
select empno,ename,sal,deptno from emp where sal>2000 or deptno=20
15.查询编号以7开头和以8结尾的员工编号、姓名、部门编号
select empno,ename,deptno from emp where empno like ‘7%8’
16.查询编号第四位是8的员工信息,显示编号、姓名和薪金
select empno,ename,sal from emp where empno like ‘___8%’
17.查询名字第三位是A的员工编号、上级编号、日期和部门
select ename,mgr,hiredate,deptno from emp where ename like ‘__A%’

select empno||job from emp --拼接

/第二课时总结/

查询名字以S结尾和部门是20的员工编号、入职日期、部门编号
select empno,hiredate,deptno from emp where ename like ‘S%’ and deptno=20
查询员工工资大于等于2000 或者部门是20的员工姓名、入职日期、提成
select ename,hiredate,comm from emp where sal>=2000 or deptno=20
查询工资在1000到2000之间的员工的姓名和工资
select ename,sal from emp where sal between 1000 and 2000
查询员工叫KING的工资、提成、部门
select ename, sal,comm,deptno from emp where ename=‘KING’
查询员工姓名的第三个字母是A的员工姓名
select * from emp where ename like ‘__A%’
显示提成(COMM)收入比工资(SAL)高的员工的部门编号、名字、入职日期
select empno,ename,hiredate from emp where comm>sal
显示佣金(COMM)收入比工资(SAL)高的员工的详细信息
select * from emp where sal 查询部门20的详细信息,地址,位置

显示10 号部门的所有经理(‘MANAGER’)或者20 号部门的所有职员(‘CLERK’)的员工编号、职位、薪金、部门编号
查询不是10部门的员工或者名字带S开头的姓-
名的信息
select empno,job,sal,deptno from emp where (deptno=10 and job=‘MANAGER’) or deptno=20 and ename=‘CLERK’
显示10 号部门的所有经理(‘MANAGER’)和20 号部门的所有职员(‘CLERK’)的详细信息
select deptno, job,ename from emp where (deptno=10 and job=‘MANAGER’) and deptno=20 and ename=‘CLERK’

select * from emp where ename like’S%'and deptno<>10

/第三课时/
/查看当前日期/
select sysdate from dual
/显示用户/
select user from dual
/显示总行数/
select count() from dual
/运算方式/
select 7
9*10-10 from dual
/查询工资信息,按照工资从低到高顺序进行排列/
select * from emp order by sal
/查询工资信息,按降序排列显示所以信息/
select * from emp order by sal desc
/查询20部门员工的所有信息按薪金降序排序/
select * from emp where deptno=20 order by sal desc
/显示雇员姓名、入职日期、部门编号,根据其服务年限,将最老的雇员排在最前面/
select ename,hiredate,deptno from emp order by hiredate

/* 第四课时*/
select * from a
create table a (empno number(30),ename varchar2(30),job varchar2(30))
insert into a (empno,ename,job) values (1,‘王飞’,‘manager’)
insert into a (empno,ename,job) values (2,‘小明’,‘chishi’)
insert into a (empno,ename,job) values (3,‘李四’,‘henie’)
insert into a (empno,ename,job) values (4,‘张三’,‘maidong’)
insert into a (empno,ename,job) values (5,‘董伟’,‘kele’)
update a set ename='张伟民’where empno=2
alter table a add (mgr number(30))
update a set mgr=3 where empno=1
delete from a where mgr=3

select * from q /执行表格q/
create table q (empno number(30),ename varchar2(30),job varchar2(30))/创建表格q 加表结构/
insert into q (empno,ename,job)values (1,‘小明’,‘manager’) /插入/
insert into q (empno,ename,job)values (2,‘小红’,‘maishi’) /插入/
update q set job='manager’where empno=1/更改表内数据/
delete from q where empno=2 /删除一行/
alter table q add(mgr number(30))/增加一列/
alter table q modify(mgr varchar2(30))/修改成字符串模式/
update q set mgr=‘王’ where empno=1 /列表插值/
alter table q drop column mgr/删除一列/
varchar2 /字符串类型/ number/数字类型/ date /日期类型/ int /整数类型/

select * from f
create table f (empno number(30),ename varchar2(30),job varchar2(30))
insert into f values(1,‘张三’,‘办事处’)/插值/
insert into f values(2,‘李四’,‘门卫’)
update f set ename=‘小明’ where empno=1/更改表内数据/
delete from f where empno=1/删除一行/
alter table f add (mgr number(30))/增加一列/
alter table f modify (mgr varchar2(30))/写改成字符串模式/
update f set mgr=‘王’ where empno=2/列表插值/
alter table f drop column enam/删除一列/

select * from wf
create table wf (empno number(20),ename varchar(20),sal number(20))
insert into wf values(1,‘王坤华’,2)
insert into wf values(2,‘孙铭浩’, 3)
update wf set sal=9999 where empno=1
update wf set sal=9999 where empno=2

select * from emp

查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置信息
select e.empno,e.ename,e.job,e.sal,
d.deptno,
d.loc
from emp e join dept d on e.deptno=d.deptno
查询出每个员工的编号、姓名、雇佣日期、基本工资、工资等级
select e.empno,e.ename,e.hiredate,e.sal,s.grade
from emp e join salgrade s on e.sal between s.losal and s.hisal
查询出每个员工的姓名、职位、基本工资、部门名称、工资等级
select e.ename,e.job,e.sal,d.dname,s.grade
from emp e join dept d on e. deptno=d.deptno
join salgrade s on e.sal between s.losal
and s.hisal
select * from emp e join dept d on e.deptno=d.deptno
join salgrade s on e.sal between losal and hisal
查询出每个雇员的编号、姓名及上级领导的编号、姓名
select e.ename,e.empno,e.ename,m.mgr,m.ename
from emp e,emp m where e.mgr=m.empno

查询雇佣的雇员编号、姓名、雇佣日期、职位、领导姓名、月工资、年工资(基本工资+提成)、
工资等级、部门编号、部门姓名、部门地址、,同时要求这些员工的月工资在1500~3500之间,
最后的结果按照年工资进行降序排列,工资相同,按照雇佣日期.

select e.empno,e.ename,e.hiredate,e.job, e.sal,
m.mgr,
(nvl(e.comm,0)+e.sal)*12 NX,
s.grade,
d.deptno,d.dname,d.loc
from emp e join emp m on e.mgr=m.empno
join dept d on e.deptno=d.deptno
join salgrade s on e.sal between s.losal and s.hisal
and e.sal between 1500 and 3500
order by sal

select * from emp e right join dept d on e.deptno=d.deptno/范例:实现右外连接/

select * from emp e left outer join dept d on e.deptno=d.deptno/范例:实现左外连接/

select * from emp e full join dept d on e.deptno=d.deptno/范例:实现全外连接/

select * from emp where rownum<=5;

select rownum,a. * from emp a
select rownum,a.* from emp a order by sal;
select rownum,a.* from (select * from emp order by sal) a
按照工资排序,查找出工资最低的后两位员工信息
select rownum,a.* from (select * from emp order by sal) a where rownum<=2;
查找出工资最高的第4到第6名员工信息
select * from (select rownum r,a.* from (select * from emp order by sal desc) a) where r between 4 and 6
查询30部门 工资最高的低2到第4名人员信息
select * from
(select rownum r,a.* from
(select * from emp order by sal desc)a)
where r between 4 and 6

查找出工资最高的第4到第6名员工信息
select * from
(select rownum r,a.* from(select * from emp order by sal desc)a)
where r>=4 and r<=6

查询出每个雇员的到今天为止的雇佣天数、以及十天前每个雇员的雇佣天数
select sysdate-hiredate,sysdate-10-hiredate from emp

查询距离今天为止3天之后以及3天之前的日期
select sysdate+3 ,sysdate-3 from dual

按照工资排序,查找出工资最低的后两位员工信息
select rownum,a.* from (select * from emp order by sal)a where rownum between 1 and 2
查询30部门 工资最高的低2到第4名人员信息
select * from (select rownum r,a.from (select * from emp where deptno=30 order by sal desc)a) where r between 2 and 4
查找出工资最高的第4到第6名员工信息
select rownum,a.
from (select * from emp order by sal desc)a where rownum between 4 and 6

查询出每个雇员的到今天为止的雇佣天数、以及十天前每个雇员的雇佣天数
select trunc( sysdate-hiredate),trunc (sysdate-10-hiredate) from emp
要求显示所有雇员在被雇佣三个月之后的日期
select sysdate, ename, job, sal, add_months(hiredate,3)from emp
查询emp表,入职日期的下个星期一是多少号
select sysdate,next_day(hiredate,‘星期一’) 下个星期一 from emp
查询所有是在其雇佣所在月的倒数第三天被公司雇佣的完整雇员信息
select * from emp where hiredate+2=last_day(hiredate)
查询出每个雇员的编号、姓名、雇佣日期、雇佣的月数及年份
select empno,ename,hiredate,trunc(months_between(sysdate,hiredate)),trunc(months_between(sysdate,hiredate)/12)from emp
查询出所有在每年2月份雇佣的雇员信息
select * from emp where to_char(hiredate,‘mm’)=‘02’
现在要求将每个雇员的雇佣日期进行格式化显示,要求所有的雇佣日期可以按照“年-月-日”的形式显示,
也可以将雇佣的年、月、日拆开分别显示
select empno,ename,job,hiredate, to_char(hiredate,‘yyyy-mm-dd’),
to_char(hiredate,‘yyyy’)年,
to_char(hiredate,‘mm’)月,
to_char(hiredate,‘dd’)日
from emp

select job Job,length(job) lengt2h from emp order by ename

要求显示所有雇员在被雇佣三个月之后的日期
select sysdate,add_months(hiredate,3)from emp
查询emp表,入职日期的下个星期一是多少号
select empno,ename,job,hiredate,next_day(hiredate,‘星期一’)from emp
查询所有是在其雇佣所在月的倒数第三天被公司雇佣的完整雇员信息
select * from emp where hiredate+2=last_day(hiredate)
查询出每个雇员的编号、姓名、雇佣日期、雇佣的月数及年份
select empno,ename,hiredate,trunc(months_between(sysdate,hiredate)),trunc(months_between(sysdate,hiredate)/12)from emp
查询出所有在每年2月份雇佣的雇员信息
select * from emp where to_char(hiredate,‘mm’)=‘02’
现在要求将每个雇员的雇佣日期进行格式化显示,要求所有的雇佣日期可以按照“年-月-日”的形式显示,
也可以将雇佣的年、月、日拆开分别显示
select empno,ename,job,hiredate, to_char(hiredate,‘yyyy-mm-dd’),
to_char(hiredate,‘yyyy’)年,
to_char(hiredate,‘mm’)月,
to_char(hiredate,‘dd’)日
from emp

select hiredate,next_day(hiredate,‘星期一’)from emp

Add_months(X,Y) /指定的日期上加如指定的月数,求出新的日期/
NEXT_DAY/(日期,星期数)要想知道下一个“星期一”或是“星期日”的具体日期/
LAST_DAY/(日期)求得指定日期所在月的最后一天日期/
MONTHS_BETWEEN/(日期1,日期2)此函数的功能是取得两个日期之间的所经过的月份间隔数/
To_char()函数
To_date()/函数使用TO_DATE()函数 SELECT TO_DATE(‘19790919’,‘YYYY-MM-DD’) FROM dual ;/
To_number()/函数使用TO_NUMBER()函数将字符串变为数字/

/现在雇员表中的工作有以下几种:
? CLERK:业务员
? SALESMAN:销售人员
? MANAGER:经理
? ANALYST:分析员
? PRESIDENT:总裁
/
要求可以查询雇员的姓名、职位、基本工资等信息,但是要求将所有的职位信息都替换为中文显示。
select ename,sal,decode(job,‘CLERK’,‘业务员’,
‘SALESMAN’,‘销售人员’,
‘MANAGER’,‘经理’,
‘ANALYST’,‘分析员’,
‘PRESIDENT’,‘总裁’)job
from emp
显示emp表部门,当等于10部门的时候,显示‘十部门’,20部门的时候显示‘二十部门’,
30部门的时候显示‘三十部门’,显示员工编号,姓名,部门
select empno,ename,deptno,
case when deptno=10 then ‘十部门’
when deptno=20 then ‘二十部门’
when deptno=30 then ‘三十部门’
end 部门
from emp

select empno,ename,deptno,
decode(deptno,10,‘十部门’,
20,‘二十部门’,
30,‘三十部门’)deptno
from emp
显示每个雇员的姓名、工资、职位,同时显示新的工资
(新工资的标准为:办事员增长10%、销售人员增长20%、经理增长30%、其他职位的人增长50%)
select ename,sal,
case when job=‘CLERK’ then sal1.1
when job=‘SALESMAN’ then sal
1.2
when job=‘MANAGER’ then sal1.3
else sal
1.5
end 新工资
from emp

如果是1的时候,显示‘一等级’,2的时候显示‘二等级’以此类推到4级,
剩下的结果都显示‘最高级’,显示等级和最低工资和最高工资
select hisal,losal,
case when grade=1 then ‘一等级’
when grade=2 then ‘二等级’
when grade=3 then ‘三等级’
when grade=4 then ‘四等级’
else ‘最高级’
end 等级
from salgrade

查询工资,当工资在1000以下的时候显示低工资,当工资在1001到2000的时候显示中等工资,其他显示高工资
select empno,ename,
case when sal<1000 then ‘低工资’
when sal between 1001 and 2000 then ‘中等工资’
else ‘最高工资’
end 工资
from emp

/新课件/
统计出每个部门的人数
select count(deptno),count(empno) from emp
统计出每种职位的最低和最高工资
select job,min(sal),max(sal) from emp group by job
求出每个部门的平均工资最高的工资
select max(avg(sal))from emp group by deptno
查询每个部门的名称、部门人数、部门平均工资、平均服务年限
select d.dname 部门名称,count(e.empno)部门人数,round(avg(e.sal),2) 部门平均工资,
round(avg(months_between(sysdate,hiredate)/12),2) 平均服务年限 from emp e
right join dept d on e.deptno=d.deptno
group by d.dname
查询出公司各个工资等级,雇员的雇佣数量、平均工资。
select s.grade 工作等级,count(e.empno) 雇佣数量,avg(e.sal)平均工资 from emp e
join salgrade s on e.sal between s.losal and s.hisal
group by s.grade

统计出有提成与没有提成的雇员的平均工资、平均雇佣年限、雇员人数。
select comm,avg(sal), round(avg(months_between(sysdate,hiredate)/12),2)雇佣年限,
count(empno)雇员人数
from emp
group by comm
现在要求查询出每个部门的详细信息。
(包含部门编号、部门名称、位置、平均工资、总工资、最高工资、最低工资、部门人数)
select d.deptno,d.dname,d.loc,avg(sal),sum(sal),max(sal),min(sal),count(empno) from emp e
right join dept d on e.deptno=d.deptno
group by d.deptno,d.dname,d.loc
查询出所有平均工资大于2000的职位信息、平均工资、雇员人数
select job,avg(sal),count(empno)
from emp
group by job
having avg(sal)>2000

列出至少有四个员工的所有部门编号、部门名称,并统计出这些部门的平均工资、最低工资、最高工资
select d.deptno,d.dname,avg(e.sal),min(e.sal),max(e.sal) from emp e
join dept d on e.deptno=d.deptno
group by d.deptno,d.dname
having count(e.empno)>=4

显示非销售人员(SALESMAN)工作名称以及从事同一工作雇员的月工资的总和,
并且要满足从事同一工作的雇员的月工资合计大于$5000, 输出结果按月工 资的合计升序排列
select job,sum(sal)月工资 from emp
where job<>‘SALESMAN’
group by job
having sum(sal)>5000
order by sum(sal) desc

                          from    where   group by      having      order by

查询公司之中工资最低的雇员的完整信息
select * from emp where sal=(select min(sal) from emp )
查询出基本工资比ALLEN低的全部雇员信息

select * from emp where sal<(select sal from emp where ename=‘ALLEN’)
查询基本工资高于公司平均薪金的全部雇员信息

select * from emp where sal>(select avg(sal) from emp)
查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息

select * from emp where
sal>(select sal from emp where empno=7521)
and
job=(select job from emp where ename=‘ALLEN’)
查询与SCOTT从事同一工作且工资相同的雇员信息(不包括scott)

select * from emp
where (job,sal)=(select job,sal from emp where ename=‘SCOTT’) and ename<>‘SCOTT’

查询与雇员7566从事同一工作且领导相同的全部雇员信息(不包括7566)
select * from emp where (job,mgr)=(select job,mgr from emp where empno=7566) and empno<>7566

查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
select * from emp
where (job,to_char(hiredate,‘yyyy’))=(select job,to_char(hiredate,‘yyyy’) from emp where ename=‘ALLEN’)

/查询出与每个部门中最低工资的全部雇员信息/
select * from emp where sal in(select min(sal) from emp group by deptno)
/查询出不与每个部门中最低工资相同的全部雇员信息/
select * from emp where sal not in(select min(sal) from emp group by deptno)
/查询部门编号、雇员人数、平均工资,并且要求这些部门的平均工资高于公司平均薪金]/
select deptno,count(empno),avg(sal) from emp
group by deptno
having avg(sal)>(select avg(sal) from emp)
/*查询出平均工资最高的部门名称及平均工资
*/
select d.dname,avg(e.sal) from emp e
join dept d on e.deptno=d.deptno
group by d.dname
having avg(sal)=(select max(avg(sal)) from emp group by deptno)

/要求查询出每个部门的编号、名称、位置、部门人数、平均工资/
select d.deptno,d.dname,d.loc,t.count,t.avg
from dept d,(select deptno,count(empno) count,avg(sal) avg from emp group by deptno) t
where d.deptno=t.deptno

/查询出所有在部门“SALES”(销售部)工作的员工的编号、姓名、基本工资、奖金、职位、雇佣日期、部门的最高和最低工资。/
select e.empno,e.ename,e.sal,e.comm,e.hiredate,t.max,t.min from dept d,emp e,
(select deptno,max(sal) max,min(sal) min from emp group by deptno) t
where e.deptno=d.deptno
and e.deptno=t.deptno
and dname=‘SALES’

查询出所有薪金高于公司平均薪金的员工编号、姓名、基本工资、职位、雇佣日期,
所在部门名称、位置,上级领导姓名,公司的工资等级,部门人数、平均工资、平均服务年限。
select e.empno,e.ename,e.sal,e.job,e.hiredate,
d.dname,d.loc,
m.ename,
s.grade,t.count,t.avg,t.r from emp e,dept d,emp m,salgrade s,
(select deptno,count(empno) count,avg(sal) avg,avg(months_between(sysdate,hiredate)/12) r from emp group by deptno) t
where e.deptno=d.deptno
and e.mgr=m.empno
and e.deptno=t.deptno
and e.sal between s.losal and s.hisal
and e.sal>(select avg(sal) from emp )

/列出薪金比“ALLEN”或“CLARK”多的所有员工的编号、姓名、基本工资、部门名称、其领导姓名,部门人数。/

/出公司各个部门的经理(假设每个部门只有一个经理,job为“MANAGER”)
的姓名、薪金、部门名称、部门人数、部门平均工资。*/
select e.ename,e.sal,d.dname,t.count,t.avg from emp e,dept d,
(select deptno,count(empno) count,avg(sal) avg from emp group by deptno) t
where e.deptno=d.deptno
and e.deptno=t.deptno
and job=‘MANAGER’

查询每个部门的编号、名称、位置、部门平均工资、人数
with a AS(
select deptno,round)

查询每个部门工资最高的雇员编号、姓名、职位、雇佣日期、最高工资、部门编号、部门名称,显示的结果按照部门编号进行排序

select * from a
create table a (empno number(30),ename varchar2(30),job varchar2(30),hiredate date)
insert into a(empno,ename,job,hiredate) values (1,‘小红’,‘MANAGER’,to_date(‘1990-1-23’,‘yyyy-mm-dd’))
insert into a(empno,ename,job,hiredate) values (2,‘张四’,‘CHISHI’,to_date(‘1992-3-14’,‘yyyy-mm-dd’))
update a set ename=‘王飞’ where empno=1
delete from a where empno=1

alter table a add(mgr number(30))
alter table a modify(mgr varchar2(30))
update a set mgr=‘傻子’ where empno=1
alter table a drop column mgr

查询出所有薪金高于公司平均薪金的员工编号、姓名、基本工资、职位、雇佣日期,所在部门名称、
位置,上级领导姓名,公司的工资等级,部门人数、平均工资、平均服务年限。
select e.empno,e.sal,e.job,e.hiredate,
d.dname,d.loc,
m.ename,
s.grade,t.count,t.r from emp e,emp m,dept d,salgrade s,
(select deptno,count(empno) count,avg(months_between(sysdate,hiredate)/12) r from emp group by deptno) t
where e.deptno=d.deptno
and e.mgr=m.empno
and e.deptno=t.deptno
and e.sal between s.losal and s.hisal
and e.sal>(select avg(sal) from emp)
查询部门编号、雇员人数、平均工资,并且要求这些部门的平均工资高于公司平均薪金
select deptno,count(*),avg(sal) from emp group by deptno
having avg(sal)>(select avg(sal) from emp)

列出薪金比“ALLEN”或“CLARK”多的所有员工的编号、姓名、基本工资、部门名称、其领导姓名,部门人数。
select e.empno,e.ename,e.sal,
d.dname,
m.ename, t.count from emp e,emp m,dept d,
(select deptno,count(empno) count from emp group by deptno) t
where e.deptno=d.deptno
and e.mgr=m.empno
and e.deptno=t.deptno
and e.sal>(select sal from emp where ename in(‘ALLEN’,‘CLARK’))
显示非销售人员(SALESMAN)工作名称以及从事同一工作雇员的月工资的总和,
并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列
select job,sum(sal) from emp
where job<>'SALESMAN’group by job
having sum(sal)>5000 order by sum(sal) desc

SELECT deptno , ename, sal ,
SUM(sal) OVER () sum
FROM emp ;

SELECT deptno , ename, sal , comm ,
RANK() OVER (ORDER BY comm DESC NULLS LAST) rk ,
SUM(sal) OVER (ORDER BY comm DESC NULLS LAST) SUM
FROM emp

查询雇员编号是7369的雇员姓名、职、基本工资、部门编号、部门的人数、平均工资、最高工资、最低工资、总工资

查询每个部门中各个职位的总工资
SELECT deptno , job , SUM(sal)
FROM emp
GROUP BY deptno , job ;

统计出有提成与没有提成的雇员的平均工资、平均雇佣年限、雇员人数。
select comm,avg(sal),round(avg(months_between(sysdate,hiredate)/12)),count(empno) from emp group by comm

显示非销售人员(SALESMAN)工作名称以及从事同一工作雇员的月工资的总和,
并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列
select job,sum(sal) from emp
where job<>‘SALESMAN’
group by job
having sum(sal)>5000
order by sum(sal) desc

查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
select * from emp
where (job,to_char(hiredate,‘yyyy’))=(select job,to_char(hiredate,‘yyyy’) from emp where ename=‘ALLEN’)

列出薪金比“ALLEN”或“CLARK”多的所有员工的编号、姓名、基本工资、部门名称、其领导姓名,部门人数。

select e.empno,e.ename,e.sal,
d.dname,
m.ename,r.count
from emp e,dept d,emp m,
(select deptno,count(empno) count from emp group by deptno) r
where e.mgr=m.empno(+)
and e.deptno=d.deptno
and e.deptno=r.deptno
and e.sal>any(select sal from emp where ename in (‘ALLEN’,‘CLAEN’))

select e.empno,e.ename,e.sal,
d.dname,
m.ename, r.部门人数
from emp e,emp m,dept d,
(select deptno,count(empno) 部门人数 from emp group by deptno) r
where e.mgr=m.empno(+)
and e.deptno=d.deptno
and e.deptno=r.deptno
and e.sal>any(select sal from emp where ename in (‘ALLEN’,‘CLARK’) )
查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
select * from emp where
(job,to_char(hiredate,‘yyyy’))=(select job,to_char(hiredate,‘yyyy’) from emp where ename=‘ALLEN’)

列出薪金比“ALLEN”或“CLARK”多的所有员工的编号、姓名、基本工资、部门名称、其领导姓名,部门人数。
select e.empno,e.ename,e.sal,
d.dname,
m.ename,r.count(empno)) from emp e,dept d,emp m,
(select deptno, count(empno) from emp group by deptno) r
where e.deptno=d.deptno
and e.mgr=m.empno(+)
and e.deptno=r.deptno
and e.sal>any(select sal from emp where ename in(‘ALLEN’,‘CLAKE’))

select e.empno,e.ename,e.sal,d.dname,n.ename,m.部门人数
from emp e,emp n,dept d,(select deptno,count(empno) 部门人数 from emp group by deptno) m
where e.mgr=n.empno(+)
and e.deptno=d.deptno
and e.deptno=m.deptno
and e.sal>any(select sal from emp where ename in (‘ALLEN’,‘CLARK’) )

查询每个部门中各个职位的总工资
select deptno,
sum(decode(job,‘CLERK’,sal,0)),
sum(decode(job,‘SALESMAN’,sal,0)),
sum(decode(job,‘MANAGER’,sal,0)),
sum(decode(job,‘ANAESMAN’,sal,0)),
sum(decode(job,‘ANALYST’,sal,0))
from emp
group by deptno

1.1 、查询同时存在"01" 课程和"02"
select st.*,s.score,c.score from student st join sc s on st.sno=s.sno and s.cno=01
join sc c on st.sno=c.sno and c.cno=02

1.2 、查询必须存在"01" 课程,“02”.( 不存在时显示为 null)
select st.,s.score,c.score from student st join sc s on st.sno=s.sno and s.cno=01
left join sc c on st.sno=c.sno and c.cno=02
2.1 、查询同时’01’ 课程比’02’课程低的数据
select st.
,s.score,c.score from student st join sc s on st.sno=s.sno and s.cno=01
join sc c on st.sno=c.sno and c.cno=02
where s.score 2.2 、查询同时’01’ 课程比’02’ 课程分数低或’01’缺考的数据
select st.*,s.score,c.score from student st left join sc s on st.sno=s.sno and s.cno=01
join sc c on st.sno=c.sno and c.cno=02
where s.score 3 、查询平均成绩大于等于 60分的同学的学生编号和学生姓名和平均成绩
select st.sno,st.sname,avg(s.score) from student st join sc s on st.sno=s.sno
group by st.sno,st.sname
having avg(s.score)>60
order by st.sno
4 、查询平均成绩小于 60分的同学的学生编号和学生姓名和平均成绩
select st.sno,st.sname,avg(s.score) from student st join sc s on st.sno=s.sno
group by st.sno, st.sname
having avg(s.score)<60
order by st.sno

4.2 、包括没有考试成绩的数据

select st.sno,st.sname,round(avg(score),2)
from student st left join sc s on st.sno=s.sno
group by st.sno,st.sname
having avg (nvl(s.score,0))<60
order by st.sno

5 、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
5.1 、查询所有成绩的(不含缺考的)。
select st.sno,st.sname,count(s.cno),sum(s.score) from student st join sc s on st.sno=s.sno
group by st.sno,st.sname
5.2 、查询所有成绩的( 包括缺考的) 。
select st.sno,st.sname,count(s.cno),sum(s.score) from student st left join sc s on st.sno=s.sno
group by st.sno,st.sname

6 、查询" 李" 姓老师的数量 (有几个老师姓李.)
select count(tname) from teacher where tname like ‘李%’
7 、哪些学生上过张三(老师)的课
select st.* from student st join sc s on st.sno=s.sno
join course co on s.cno=co.cno
join teacher te on co.tno=te.tno
where te.tname=‘张三’
8 些学生没上过张三(老师)的课
select * from student where sname not in
(select st.sname from student st join sc s on st.sno=s.sno
join course co on s.cno=co.cno
join teacher te on co.tno=te.tno
where te.tname=‘张三’)
9询 、查询 ‘01’ ‘02’ 都学过的同学的信息
select st.* from student st join sc s on st.sno=s.sno and s.cno=01
join sc c on st.sno=c.sno and c.cno=02

10 、查询学过编号为’01’ 但是没有学过编号为’02’ 的课程的同学的信息
select st.* from student st join sc s on st.sno=s.sno and s.cno=01
minus
select st.* from student st join sc s on st.sno=s.sno and s.cno=02

                          from    where   group by      having      order by

select * from student
select * from course 课程表
select * from teacher 老师表66
select * from sc; 分数表

11 、查询没有学全所有课程的同学的信息
11.1 学完所有课程的
select * from student where sno in
(select sno from sc group by sno having count(cno)>=3)
11.2 没有学完所有课程的
select * from student where sno not in
(select sno from sc group by sno having count(sno)>=3)
/*12 、查询至少有一门课与学号为’01’ 的同学所学相同的同学的信息
/select distinct st. from student st join sc s on st.sno=s.sno
where s.cno in (select cno from sc where sno=01) and st.sno<>01 order by st.sno
/*13 、查询和’01’ 号的同学学习的课程完全相同的其他同学的信息
/select distinct st. from
(select * from student where sname not in (select sname from student st join sc s on st.sno=s.sno
where s.sno not in (select cno from sc where sno=01))) st join sc s on st.sno=s.sno where s.score is not null;
/14 、查询没学过" 张三" 老师讲授的任一门课程的学生姓名/
select * from student where sno not in (select st.sno from student st join sc s on st.sno=s.sno where s.cno in
(select cno from course co join teacher te on co.tno=te.tno where te.tname=‘张三’));
15 、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
select st.sno,st.sname,avg(s.score) from student st join sc s on st.sno=s.sno
where s.score<60
group by st.sno,st.sname

16 、检索’01’ 课程分数小于 60 ,按分数降序排列的学生信息
select st.*,s.cno,s.score from student st join sc s on st.sno=s.sno and s.cno=01
where s.score<60
order by s.score desc
/*17 、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
*/
/18 、查询各科成绩最高分、最低 分和平均分:以如下形式显示:课程 ID,课

,课
程 name ,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
/
/19 、按各科成绩进行排序,并显示排名/
20.1 查询学生的总成绩
select st.sno,st.sname,sum(nvl(s.score,0)) from student st left join sc s on st.sno=s.sno
group by st.sno,st.sname

20.2 查询学生的总成绩并进行排名。
select * from (select st.sno,st.sname,round(sum(nvl(score,0))) zz,row_number()over(order by sum(s.score) desc) px
from student st left join sc s on st.sno=s.sno
group by st.sno,st.sname ) px order by zz desc
21 、查询不同老师所教不同课程平均分从高到低显示
select te.tno,te.tname,round(avg(s.score)) zz from sc s join course co on s.cno=co.cno
join teacher te on co.tno=te.tno
group by te.tno,te.tname
order by zz desc
/22 、查询所有课程的成绩第 2 名到第 3 名的学生信息及该课程成绩 Score 重复时保留名次空缺
Score 重复时合并名次
/
select * from (select sno,cno,score,dense_rank()over (partition by cno order by score desc)px from sc)
where px between 2 and 3 ;

select * from (select sno,cno,score,rank()over
(partition by cno order by score desc)px from sc)
where px between 2 and 3 ;

23 号 、 统 计 各 科 成 绩 各 分 数 段 人 数 : 课 程 编 号 , 课 程 名

课 程 名
称,“100-85”,“85-70”,“70-60”,“0-60” 及所占百分比
23.1 号 统 计 各 科 成 绩 各 分 数 段 人 数 : 课 程 编 号 , 课 程 名

课 程 名
称,“100-85”,“85-70”,“70-60”,“0-60”
横向显示
纵向显示 1(显示存在的分数段);
select co.cno,co.cname,
sum(case when score between 85 and 100 then 1 else 0 end ) “85-100”,
sum(case when score between 70 and 84 then 1 else 0 end ) “70-84”,
sum(case when score between 60 and 69 then 1 else 0 end ) “60-69”,
sum(case when score <60 then 1 else 0 end ) “0<60”
from course co join sc s on co.cno=s.cno
group by co.cno,co.cname

/*23.2 号 统 计 各 科 成 绩 各 分 数 段 人 数 : 课 程 编 号 , 课 程 名

课 程 名
称,“100-85”,“85-70”,“70-60”,"<60"及所占百分比
横向显示
及所占百分比
横向显示
纵向显示 1(显示存在的分数段);

*/
24 、 查询学生的平均成绩并进行排名
select st.sno,st.sname,round(avg(nvl(s.score,0)),2) zz,row_number()over(order by avg(s.score) desc ) px
from student st left join sc s on st.sno=s.sno
group by st.sno,st.sname
order by zz desc

25 、查询各科成绩前三名的记录
25.1 分数重复时保留名次空缺

25.2 分数重复时不保留名次空缺,合并名次
26 、查询每门课程被选修的学生数
27 、查询出只有两门课程的全部学生的学号和姓名
28 、查询男生、女生人数
29 、查询名字中含有" 风" 字的学生信息
31 、查询 1990 年出生的学生名单( 注:Student 表中 Sage 列的类型是 date)
32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,
按课程编号升序排列
、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,
按课程编号升序排列
33 、查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
34 、查询课程名称为" 数学" ,且分数低于 60 的学生姓名和分数
35 、查询所有学生的课程及分数情况;
36 、查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数;
37 、查询不及格的课程
38 、查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名;
39 、求每门课程的学生人数
40 、查询选修" 张三" 老师所授课程的学生中,成绩最高的学生信息及其成绩
41 、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
42 、查询每门功成绩最好的前两名
44 、检索至少选修两门课程的学生学号
46 、查询各学生的年龄
47 、查询本周过生日的学生
48 、查询下周过生日的学生
49 、查询本月过生日的学生
50

select * from

select * from student
select * from course 课程表
select * from teacher 老师表66
select * from sc; 分数表

11 、查询没有学全所有课程的同学的信息
11.1 学完所有课程的
11.2 没有学完所有课程的
12 、查询至少有一门课与学号为’01’ 的同学所学相同的同学的信息
13 、查询和’01’ 号的同学学习的课程完全相同的其他同学的信息
14 、查询没学过" 张三" 老师讲授的任一门课程的学生姓名
15 、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
16 、检索’01’ 课程分数小于 60 ,按分数降序排列的学生信息
17 、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
18 、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课

,课
程 name ,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
19 、按各科成绩进行排序,并显示排名
20 、查询学生的总成绩并进行排名
20.1 查询学生的总成绩
20.2 查询学生的总成绩并进行排名。
21 、查询不同老师所教不同课程平均分从高到低显示
22 、查询所有课程的成绩第 2 名到第 3 名的学生信息及该课程成绩
Score 重复时保留名次空缺
Score 重复时合并名次
23 号 、 统 计 各 科 成 绩 各 分 数 段 人 数 : 课 程 编 号 , 课 程 名

课 程 名
称,“100-85”,“85-70”,“70-60”,“0-60” 及所占百分比
23.1 号 统 计 各 科 成 绩 各 分 数 段 人 数 : 课 程 编 号 , 课 程 名

课 程 名
称,“100-85”,“85-70”,“70-60”,“0-60”
横向显示
纵向显示 1(显示存在的分数段);
23.2 号 统 计 各 科 成 绩 各 分 数 段 人 数 : 课 程 编 号 , 课 程 名

课 程 名
称,“100-85”,“85-70”,“70-60”,"<60"及所占百分比
横向显示
及所占百分比
横向显示
纵向显示 1(显示存在的分数段);
24 、 查询学生的平均成绩并进行排名
25 、查询各科成绩前三名的记录
25.1 分数重复时保留名次空缺
25.2 分数重复时不保留名次空缺,合并名次
26 、查询每门课程被选修的学生数
27 、查询出只有两门课程的全部学生的学号和姓名
28 、查询男生、女生人数
29 、查询名字中含有" 风" 字的学生信息
31 、查询 1990 年出生的学生名单( 注:Student 表中 Sage 列的类型是 date)
32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,
按课程编号升序排列
、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,
按课程编号升序排列
33 、查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
34 、查询课程名称为" 数学" ,且分数低于 60 的学生姓名和分数
35 、查询所有学生的课程及分数情况;
36 、查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数;
37 、查询不及格的课程
38 、查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名;
39 、求每门课程的学生人数
40 、查询选修" 张三" 老师所授课程的学生中,成绩最高的学生信息及其成绩
41 、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
42 、查询每门功成绩最好的前两名
44 、检索至少选修两门课程的学生学号
46 、查询各学生的年龄
47 、查询本周过生日的学生
48 、查询下周过生日的学生
49 、查询本月过生日的学生
50

7例题: 现在要求查询出公司的雇员雇佣情况,希望通过数据库可以查找到每个雇员的编号、姓名、基本工资三个信息进行浏览
select empno,ename,sal from emp
现在要求查询公司中所有雇员的职位信息
select ename,job from emp
要求通过数据库查询出所有雇员的编号、雇员姓名和年基本工资、日基本工资,以作为年终奖金的发放标准
select empno,ename,sal,sal/30 from emp
现在公司每个雇员在年底的时候可以领取5000元的年终奖金,要求查询雇员编号、雇员姓名和增长后的年基本工资(不包括提成)。
select empno,ename,sal,(sal*12)+5000 from emp
公司每个月为雇员增加200元的补助金,此时,要求可以查询出每个雇员的编号、姓名、基本年工资(包括在年底的时候可以领取5000元的年终奖金)。
select empno,ename,sal,((sal+200)12)+5000 from emp/一个月的工资+每个月200补助一年12个月+5000年元终奖/
统计出基本工资高于1500的全部雇员信息
select * from emp where sal>1500
现在要求查询出所有基本工资小于等于2000的全部雇员信息
select * from emp where sal<2000
根据之前的查询结果发现SMITH的工资最低,所以现在希望可以取得SMITH的详细资料
select * from emp where ename=‘SMITH’
查询出所有办事员(CLERK)的雇员信息
select * from emp where job=‘CLERK’
查询所有不是办事员的雇员信息
select * from emp where job<>‘CLERK’

select * from emp where comm is null or comm=0

现在要求查询出公司的雇员雇佣情况,希望通过数据库可以查找到每个雇员的编号、姓名、基本工资三个信息进行浏览
现在要求查询公司中所有雇员的职位信息
select empno,ename,job from emp;
要求通过数据库查询出所有雇员的编号、雇员姓名和年基本工资、日基本工资,以作为年终奖金的发放标准
select empno,ename,sal/30, sal12 from emp ;
现在公司每个雇员在年底的时候可以领取5000元的年终奖金,要求查询雇员编号、雇员姓名和增长后的年基本工资(不包括提成)。
select empno,ename,sal
12+5000 from emp;
公司每个月为雇员增加200元的补助金,此时,要求可以查询出每个雇员的编号、姓名、基本年工资(包括在年底的时候可以领取5000元的年终奖金)。
select empno,ename,(sal+200)*12+5000 from emp;
统计出基本工资高于1500的全部雇员信息
select * from emp where sal>1500;
现在要求查询出所有基本工资小于等于2000的全部雇员信息
select * from emp where sal<2000
根据之前的查询结果发现SMITH的工资最低,所以现在希望可以取得SMITH的详细资料
select * from emp where ename=‘SMITH’
查询出所有办事员(CLERK)的雇员信息
select * from emp where job=‘CLERK’
查询所有不是办事员的雇员信息
select * from emp where job<>‘CLERK’
查询出工资范围在1500 ~ 3000(包含1500和3000)的全部雇员信息
select * from emp where sal between 1500 and 3000
查询职位是办事员,并且基本工资高于1200的所有雇员信息
select * from emp where job='CLERK’and sal>1200
查询不是办事员(CLERK),且基本工资大于2000的全部雇员信息
select * from emp where job<>‘CLERK’ and sal>2000

查询每个员工涨20%的工资是多少,显示名字和金额
select ename, sal*(1+0.2)from emp
查看给每个员工工资加500的薪金是多少
select ename,sal+500 from emp;
查询没有提成的员工信息
select * from emp where comm is null or comm=0;/没有提成的员工/
查询有提成的员工所有信息
select * from emp where comm is not null and comm>0;/有提成的员工/
Null和任何值运算,结果为null
select null+10,null-10,null*10,null/10 from emp;
查询提成加500的员工名字和提成
select ename, comm+500,comm from emp;
找出有奖金的员工的不同工作,不要重复数据
select distinct job from emp where comm is not null and comm>0;
查询没有提成且工资大于2000的员工信息
select * from emp where (comm is null or comm=0) and sal>2000
找出没有奖金或者奖金低于 1000 的员工信息
select * from emp where (comm is null or comm=0)or comm<1000
查询员工编号在7788或者7499或者是 7369的员工信息
select * from emp where empno in(7788,7499,7369);
查询员工姓名是SMITH或者是SCOTT的人员信息
select * from emp where ename in(‘MANAGER’,‘SCOTT’);
习题
找出部门 10 中既不是经理(MANAGER)也不是普通员工(CLERK)的信息,
select * from emp where deptno=10 and job not in (‘MANAGER’,‘CLERK’)
找出部门 20 中既不是经理(MANAGER)也不是普通员工(CLERK)的信息,而且工资大于等于 2000 的员工
select * from emp where deptno=20 and job not in (‘MANAGER’,‘CLERK’)and sal>2000;
例题:现在查询出雇员姓名是S开头的全部雇员信息
select * from emp where ename like ‘%S%’
select * from emp where ename like ‘%S’;
select * from emp where ename like ‘S%’;
select * from emp where ename like ‘_S%’
习题:
查询名字以S结尾和部门是20的员工编号、入职日期、部门编号 ,提成
select empno,hiredate,mgr,comm from emp where ename like’%S’ and (deptno=20)
查询员工工资大于等于2000 或者部门是20的员工姓名、入职日期、
select ename,hiredate from emp where deptno=20 or sal>=2000
查询工资在1000到2000之间的员工的姓名和工资
select ename,sal from emp where sal between 1000 and 2000
查询员工叫KING的工资、提成、部门
select sal,comm,deptno from emp where ename=‘KING’
查询员工姓名的第三个字母是A的员工姓名
select * from emp where ename like (’__A%’)
显示提成(COMM)收入比工资(SAL)高的员工的部门编号、名字、入职日期
select empno,ename,hiredate,sal from emp where sal 查询部门20的详细信息,地址,位置

显示10 号部门的所有经理(‘MANAGER’)或者20 号部门的所有职员(‘CLERK’)的员工编号、职位、薪金、部门编号
select empno,job,sal,mgr from emp where( deptno=10 and job=‘MANAGER’) or deptno=20 and job=‘CLERK’
查询不是10部门的员工或者名字带S开头的姓名的信息
select * from emp where ename like’%S’or deptno<>10

/练习题/
测试题:
1.查询20部门的员工信息和上级编号是7788的员工编号、姓名、上级编号和部门
select empno,ename,mgr,deptno from emp where mgr in 7788 and deptno=20
2.查询员工名字叫SCOTT的这个人的所以信息
select * from emp where ename=‘SCOTT’
3.查询工资大于1000和部门是30的员工的编号,姓名,工资
select empno,ename,sal from emp where sal>1000 and deptno=30
4.查询员工叫KING的工资、提成、部门
select sal,comm,/ deptno from emp where ename=‘KING’
/5.查询员工姓名的第三个字母是A的员工或者编号第二位的3的员工编号、姓名和部门/
select * from emp
6.查询职位有哪些(去重),显示职位
select distinct job from emp
7.查询职位(JOB)为’PRESIDENT’的员工的工资和姓名
select sal,ename from emp where job=‘PRESIDENT’
8.查询没有提成的员工和部门是20的员工编号、姓名、日期和提成
select empno,ename,hiredate,comm from emp where deptno=20and comm is null or comm=0 /111/
/9.查询部门40的部门名称,位置(dept表)/

10.显示10 号部门的所有经理(‘MANAGER’)和20 号部门的所有职员(‘CLERK’)的详细信息
/*select * from emp where (deptno=10 and job=‘MANAGER’) or deptno=20 and ename=‘CLERK’
*//*11.显示佣金(COMM)收入比工资(SAL)高的员工的详细信息
*/
12.查询以S结尾的员工姓名及月收入
select * from emp where ename like’%S’
13.查询工资在1000到2000之间的员工的姓名和工资
select ename,sal from emp where sal between 1000 and 2000
14.查询工资大于2000或者部门是20的员工的编号,姓名,工资
select empno,ename,sal,deptno from emp where sal>2000 or deptno=20
15.查询编号以7开头和以8结尾的员工编号、姓名、部门编号
select empno,ename,deptno from emp where empno like ‘7%8’
16.查询编号第四位是8的员工信息,显示编号、姓名和薪金
select empno,ename,sal from emp where empno like ‘___8%’
17.查询名字第三位是A的员工编号、上级编号、日期和部门
select ename,mgr,hiredate,deptno from emp where ename like ‘__A%’

select empno||job from emp --拼接

/第二课时总结/

查询名字以S结尾和部门是20的员工编号、入职日期、部门编号
select empno,hiredate,deptno from emp where ename like ‘S%’ and deptno=20
查询员工工资大于等于2000 或者部门是20的员工姓名、入职日期、提成
select ename,hiredate,comm from emp where sal>=2000 or deptno=20
查询工资在1000到2000之间的员工的姓名和工资
select ename,sal from emp where sal between 1000 and 2000
查询员工叫KING的工资、提成、部门
select ename, sal,comm,deptno from emp where ename=‘KING’
查询员工姓名的第三个字母是A的员工姓名
select * from emp where ename like ‘__A%’
显示提成(COMM)收入比工资(SAL)高的员工的部门编号、名字、入职日期
select empno,ename,hiredate from emp where comm>sal
显示佣金(COMM)收入比工资(SAL)高的员工的详细信息
select * from emp where sal 查询部门20的详细信息,地址,位置

显示10 号部门的所有经理(‘MANAGER’)或者20 号部门的所有职员(‘CLERK’)的员工编号、职位、薪金、部门编号
查询不是10部门的员工或者名字带S开头的姓-
名的信息
select empno,job,sal,deptno from emp where (deptno=10 and job=‘MANAGER’) or deptno=20 and ename=‘CLERK’
显示10 号部门的所有经理(‘MANAGER’)和20 号部门的所有职员(‘CLERK’)的详细信息
select deptno, job,ename from emp where (deptno=10 and job=‘MANAGER’) and deptno=20 and ename=‘CLERK’

select * from emp where ename like’S%'and deptno<>10

/第三课时/
/查看当前日期/
select sysdate from dual
/显示用户/
select user from dual
/显示总行数/
select count() from dual
/运算方式/
select 7
9*10-10 from dual
/查询工资信息,按照工资从低到高顺序进行排列/
select * from emp order by sal
/查询工资信息,按降序排列显示所以信息/
select * from emp order by sal desc
/查询20部门员工的所有信息按薪金降序排序/
select * from emp where deptno=20 order by sal desc
/显示雇员姓名、入职日期、部门编号,根据其服务年限,将最老的雇员排在最前面/
select ename,hiredate,deptno from emp order by hiredate

/* 第四课时*/
select * from a
create table a (empno number(30),ename varchar2(30),job varchar2(30))
insert into a (empno,ename,job) values (1,‘王飞’,‘manager’)
insert into a (empno,ename,job) values (2,‘小明’,‘chishi’)
insert into a (empno,ename,job) values (3,‘李四’,‘henie’)
insert into a (empno,ename,job) values (4,‘张三’,‘maidong’)
insert into a (empno,ename,job) values (5,‘董伟’,‘kele’)
update a set ename='张伟民’where empno=2
alter table a add (mgr number(30))
update a set mgr=3 where empno=1
delete from a where mgr=3

select * from q /执行表格q/
create table q (empno number(30),ename varchar2(30),job varchar2(30))/创建表格q 加表结构/
insert into q (empno,ename,job)values (1,‘小明’,‘manager’) /插入/
insert into q (empno,ename,job)values (2,‘小红’,‘maishi’) /插入/
update q set job='manager’where empno=1/更改表内数据/
delete from q where empno=2 /删除一行/
alter table q add(mgr number(30))/增加一列/
alter table q modify(mgr varchar2(30))/修改成字符串模式/
update q set mgr=‘王’ where empno=1 /列表插值/
alter table q drop column mgr/删除一列/
varchar2 /字符串类型/ number/数字类型/ date /日期类型/ int /整数类型/

select * from f
create table f (empno number(30),ename varchar2(30),job varchar2(30))
insert into f values(1,‘张三’,‘办事处’)/插值/
insert into f values(2,‘李四’,‘门卫’)
update f set ename=‘小明’ where empno=1/更改表内数据/
delete from f where empno=1/删除一行/
alter table f add (mgr number(30))/增加一列/
alter table f modify (mgr varchar2(30))/写改成字符串模式/
update f set mgr=‘王’ where empno=2/列表插值/
alter table f drop column enam/删除一列/

select * from wf
create table wf (empno number(20),ename varchar(20),sal number(20))
insert into wf values(1,‘王坤华’,2)
insert into wf values(2,‘孙铭浩’, 3)
update wf set sal=9999 where empno=1
update wf set sal=9999 where empno=2

查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置信息
select e.empno,e.ename,e.job,e.sal,
d.deptno,
d.loc
from emp e join dept d on e.deptno=d.deptno
查询出每个员工的编号、姓名、雇佣日期、基本工资、工资等级
select e.empno,e.ename,e.hiredate,e.sal,s.grade
from emp e join salgrade s on e.sal between s.losal and s.hisal
查询出每个员工的姓名、职位、基本工资、部门名称、工资等级
select e.ename,e.job,e.sal,d.dname,s.grade
from emp e join dept d on e. deptno=d.deptno
join salgrade s on e.sal between s.losal
and s.hisal
select * from emp e join dept d on e.deptno=d.deptno
join salgrade s on e.sal between losal and hisal
查询出每个雇员的编号、姓名及上级领导的编号、姓名
select e.ename,e.empno,e.ename,m.mgr,m.ename
from emp e,emp m where e.mgr=m.empno

查询雇佣的雇员编号、姓名、雇佣日期、职位、领导姓名、月工资、年工资(基本工资+提成)、
工资等级、部门编号、部门姓名、部门地址、,同时要求这些员工的月工资在1500~3500之间,
最后的结果按照年工资进行降序排列,工资相同,按照雇佣日期.

select e.empno,e.ename,e.hiredate,e.job, e.sal,
m.mgr,
(nvl(e.comm,0)+e.sal)*12 NX,
s.grade,
d.deptno,d.dname,d.loc
from emp e join emp m on e.mgr=m.empno
join dept d on e.deptno=d.deptno
join salgrade s on e.sal between s.losal and s.hisal
and e.sal between 1500 and 3500
order by sal

select * from emp e right join dept d on e.deptno=d.deptno/范例:实现右外连接/

select * from emp e left outer join dept d on e.deptno=d.deptno/范例:实现左外连接/

select * from emp e full join dept d on e.deptno=d.deptno/范例:实现全外连接/

select * from emp where rownum<=5;

select rownum,a. * from emp a
select rownum,a.* from emp a order by sal;
select rownum,a.* from (select * from emp order by sal) a
按照工资排序,查找出工资最低的后两位员工信息
select rownum,a.* from (select * from emp order by sal) a where rownum<=2;
查找出工资最高的第4到第6名员工信息
select * from (select rownum r,a.* from (select * from emp order by sal desc) a) where r between 4 and 6
查询30部门 工资最高的低2到第4名人员信息
select * from
(select rownum r,a.* from
(select * from emp order by sal desc)a)
where r between 4 and 6

查找出工资最高的第4到第6名员工信息
select * from
(select rownum r,a.* from(select * from emp order by sal desc)a)
where r>=4 and r<=6

查询出每个雇员的到今天为止的雇佣天数、以及十天前每个雇员的雇佣天数
select sysdate-hiredate,sysdate-10-hiredate from emp

查询距离今天为止3天之后以及3天之前的日期
select sysdate+3 ,sysdate-3 from dual

按照工资排序,查找出工资最低的后两位员工信息
select rownum,a.* from (select * from emp order by sal)a where rownum between 1 and 2
查询30部门 工资最高的低2到第4名人员信息
select * from (select rownum r,a.from (select * from emp where deptno=30 order by sal desc)a) where r between 2 and 4
查找出工资最高的第4到第6名员工信息
select rownum,a.
from (select * from emp order by sal desc)a where rownum between 4 and 6

查询出每个雇员的到今天为止的雇佣天数、以及十天前每个雇员的雇佣天数
select trunc( sysdate-hiredate),trunc (sysdate-10-hiredate) from emp
要求显示所有雇员在被雇佣三个月之后的日期
select sysdate, ename, job, sal, add_months(hiredate,3)from emp
查询emp表,入职日期的下个星期一是多少号
select sysdate,next_day(hiredate,‘星期一’) 下个星期一 from emp
查询所有是在其雇佣所在月的倒数第三天被公司雇佣的完整雇员信息
select * from emp where hiredate+2=last_day(hiredate)
查询出每个雇员的编号、姓名、雇佣日期、雇佣的月数及年份
select empno,ename,hiredate,trunc(months_between(sysdate,hiredate)),trunc(months_between(sysdate,hiredate)/12)from emp
查询出所有在每年2月份雇佣的雇员信息
select * from emp where to_char(hiredate,‘mm’)=‘02’
现在要求将每个雇员的雇佣日期进行格式化显示,要求所有的雇佣日期可以按照“年-月-日”的形式显示,
也可以将雇佣的年、月、日拆开分别显示
select empno,ename,job,hiredate, to_char(hiredate,‘yyyy-mm-dd’),
to_char(hiredate,‘yyyy’)年,
to_char(hiredate,‘mm’)月,
to_char(hiredate,‘dd’)日
from emp

要求显示所有雇员在被雇佣三个月之后的日期
select sysdate,add_months(hiredate,3)from emp
查询emp表,入职日期的下个星期一是多少号
select empno,ename,job,hiredate,next_day(hiredate,‘星期一’)from emp
查询所有是在其雇佣所在月的倒数第三天被公司雇佣的完整雇员信息
select * from emp where hiredate+2=last_day(hiredate)
查询出每个雇员的编号、姓名、雇佣日期、雇佣的月数及年份
select empno,ename,hiredate,trunc(months_between(sysdate,hiredate)),trunc(months_between(sysdate,hiredate)/12)from emp
查询出所有在每年2月份雇佣的雇员信息
select * from emp where to_char(hiredate,‘mm’)=‘02’
现在要求将每个雇员的雇佣日期进行格式化显示,要求所有的雇佣日期可以按照“年-月-日”的形式显示,
也可以将雇佣的年、月、日拆开分别显示
select empno,ename,job,hiredate, to_char(hiredate,‘yyyy-mm-dd’),
to_char(hiredate,‘yyyy’)年,
to_char(hiredate,‘mm’)月,
to_char(hiredate,‘dd’)日
from emp

select hiredate,next_day(hiredate,‘星期一’)from emp

Add_months(X,Y) /指定的日期上加如指定的月数,求出新的日期/
NEXT_DAY/(日期,星期数)要想知道下一个“星期一”或是“星期日”的具体日期/
LAST_DAY/(日期)求得指定日期所在月的最后一天日期/
MONTHS_BETWEEN/(日期1,日期2)此函数的功能是取得两个日期之间的所经过的月份间隔数/
To_char()函数
To_date()/函数使用TO_DATE()函数 SELECT TO_DATE(‘19790919’,‘YYYY-MM-DD’) FROM dual ;/
To_number()/函数使用TO_NUMBER()函数将字符串变为数字/

/现在雇员表中的工作有以下几种:
? CLERK:业务员
? SALESMAN:销售人员
? MANAGER:经理
? ANALYST:分析员
? PRESIDENT:总裁
/
要求可以查询雇员的姓名、职位、基本工资等信息,但是要求将所有的职位信息都替换为中文显示。
select ename,sal,decode(job,‘CLERK’,‘业务员’,
‘SALESMAN’,‘销售人员’,
‘MANAGER’,‘经理’,
‘ANALYST’,‘分析员’,
‘PRESIDENT’,‘总裁’)job
from emp
显示emp表部门,当等于10部门的时候,显示‘十部门’,20部门的时候显示‘二十部门’,
30部门的时候显示‘三十部门’,显示员工编号,姓名,部门
select empno,ename,deptno,
case when deptno=10 then ‘十部门’
when deptno=20 then ‘二十部门’
when deptno=30 then ‘三十部门’
end 部门
from emp

select empno,ename,deptno,
decode(deptno,10,‘十部门’,
20,‘二十部门’,
30,‘三十部门’)deptno
from emp
显示每个雇员的姓名、工资、职位,同时显示新的工资
(新工资的标准为:办事员增长10%、销售人员增长20%、经理增长30%、其他职位的人增长50%)
select ename,sal,
case when job=‘CLERK’ then sal1.1
when job=‘SALESMAN’ then sal
1.2
when job=‘MANAGER’ then sal1.3
else sal
1.5
end 新工资
from emp

如果是1的时候,显示‘一等级’,2的时候显示‘二等级’以此类推到4级,
剩下的结果都显示‘最高级’,显示等级和最低工资和最高工资
select hisal,losal,
case when grade=1 then ‘一等级’
when grade=2 then ‘二等级’
when grade=3 then ‘三等级’
when grade=4 then ‘四等级’
else ‘最高级’
end 等级
from salgrade

查询工资,当工资在1000以下的时候显示低工资,当工资在1001到2000的时候显示中等工资,其他显示高工资
select empno,ename,
case when sal<1000 then ‘低工资’
when sal between 1001 and 2000 then ‘中等工资’
else ‘最高工资’
end 工资
from emp

/新课件/
统计出每个部门的人数
select count(deptno),count(empno) from emp
统计出每种职位的最低和最高工资
select job,min(sal),max(sal) from emp group by job
求出每个部门的平均工资最高的工资
select max(avg(sal))from emp group by deptno
查询每个部门的名称、部门人数、部门平均工资、平均服务年限
select d.dname 部门名称,count(e.empno)部门人数,round(avg(e.sal),2) 部门平均工资,
round(avg(months_between(sysdate,hiredate)/12),2) 平均服务年限 from emp e
right join dept d on e.deptno=d.deptno
group by d.dname
查询出公司各个工资等级,雇员的雇佣数量、平均工资。
select s.grade 工作等级,count(e.empno) 雇佣数量,avg(e.sal)平均工资 from emp e
join salgrade s on e.sal between s.losal and s.hisal
group by s.grade

统计出有提成与没有提成的雇员的平均工资、平均雇佣年限、雇员人数。
select comm,avg(sal), round(avg(months_between(sysdate,hiredate)/12),2)雇佣年限,
count(empno)雇员人数
from emp
group by comm
现在要求查询出每个部门的详细信息。
(包含部门编号、部门名称、位置、平均工资、总工资、最高工资、最低工资、部门人数)
select d.deptno,d.dname,d.loc,avg(sal),sum(sal),max(sal),min(sal),count(empno) from emp e
right join dept d on e.deptno=d.deptno
group by d.deptno,d.dname,d.loc
查询出所有平均工资大于2000的职位信息、平均工资、雇员人数
select job,avg(sal),count(empno)
from emp
group by job
having avg(sal)>2000

列出至少有四个员工的所有部门编号、部门名称,并统计出这些部门的平均工资、最低工资、最高工资
select d.deptno,d.dname,avg(e.sal),min(e.sal),max(e.sal) from emp e
join dept d on e.deptno=d.deptno
group by d.deptno,d.dname
having count(e.empno)>=4

显示非销售人员(SALESMAN)工作名称以及从事同一工作雇员的月工资的总和,
并且要满足从事同一工作的雇员的月工资合计大于$5000, 输出结果按月工 资的合计升序排列
select job,sum(sal)月工资 from emp
where job<>‘SALESMAN’
group by job
having sum(sal)>5000
order by sum(sal) desc

                          from    where   group by      having      order by

查询公司之中工资最低的雇员的完整信息
select * from emp where sal=(select min(sal) from emp )
查询出基本工资比ALLEN低的全部雇员信息

select * from emp where sal<(select sal from emp where ename=‘ALLEN’)
查询基本工资高于公司平均薪金的全部雇员信息

select * from emp where sal>(select avg(sal) from emp)
查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息

select * from emp where
sal>(select sal from emp where empno=7521)
and
job=(select job from emp where ename=‘ALLEN’)
查询与SCOTT从事同一工作且工资相同的雇员信息(不包括scott)

select * from emp
where (job,sal)=(select job,sal from emp where ename=‘SCOTT’) and ename<>‘SCOTT’

查询与雇员7566从事同一工作且领导相同的全部雇员信息(不包括7566)
select * from emp where (job,mgr)=(select job,mgr from emp where empno=7566) and empno<>7566

查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
select * from emp
where (job,to_char(hiredate,‘yyyy’))=(select job,to_char(hiredate,‘yyyy’) from emp where ename=‘ALLEN’)

/查询出与每个部门中最低工资的全部雇员信息/
select * from emp where sal in(select min(sal) from emp group by deptno)
/查询出不与每个部门中最低工资相同的全部雇员信息/
select * from emp where sal not in(select min(sal) from emp group by deptno)
/查询部门编号、雇员人数、平均工资,并且要求这些部门的平均工资高于公司平均薪金]/
select deptno,count(empno),avg(sal) from emp
group by deptno
having avg(sal)>(select avg(sal) from emp)
/*查询出平均工资最高的部门名称及平均工资
*/
select d.dname,avg(e.sal) from emp e
join dept d on e.deptno=d.deptno
group by d.dname
having avg(sal)=(select max(avg(sal)) from emp group by deptno)

/要求查询出每个部门的编号、名称、位置、部门人数、平均工资/
select d.deptno,d.dname,d.loc,t.count,t.avg
from dept d,(select deptno,count(empno) count,avg(sal) avg from emp group by deptno) t
where d.deptno=t.deptno

/查询出所有在部门“SALES”(销售部)工作的员工的编号、姓名、基本工资、奖金、职位、雇佣日期、部门的最高和最低工资。/
select e.empno,e.ename,e.sal,e.comm,e.hiredate,t.max,t.min from dept d,emp e,
(select deptno,max(sal) max,min(sal) min from emp group by deptno) t
where e.deptno=d.deptno
and e.deptno=t.deptno
and dname=‘SALES’

查询出所有薪金高于公司平均薪金的员工编号、姓名、基本工资、职位、雇佣日期,
所在部门名称、位置,上级领导姓名,公司的工资等级,部门人数、平均工资、平均服务年限。
select e.empno,e.ename,e.sal,e.job,e.hiredate,
d.dname,d.loc,
m.ename,
s.grade,t.count,t.avg,t.r from emp e,dept d,emp m,salgrade s,
(select deptno,count(empno) count,avg(sal) avg,avg(months_between(sysdate,hiredate)/12) r from emp group by deptno) t
where e.deptno=d.deptno
and e.mgr=m.empno
and e.deptno=t.deptno
and e.sal between s.losal and s.hisal
and e.sal>(select avg(sal) from emp )

/列出薪金比“ALLEN”或“CLARK”多的所有员工的编号、姓名、基本工资、部门名称、其领导姓名,部门人数。/

/出公司各个部门的经理(假设每个部门只有一个经理,job为“MANAGER”)
的姓名、薪金、部门名称、部门人数、部门平均工资。*/
select e.ename,e.sal,d.dname,t.count,t.avg from emp e,dept d,
(select deptno,count(empno) count,avg(sal) avg from emp group by deptno) t
where e.deptno=d.deptno
and e.deptno=t.deptno
and job=‘MANAGER’

查询每个部门的编号、名称、位置、部门平均工资、人数
with a AS(
select deptno,round)

查询每个部门工资最高的雇员编号、姓名、职位、雇佣日期、最高工资、部门编号、部门名称,显示的结果按照部门编号进行排序

select * from a
create table a (empno number(30),ename varchar2(30),job varchar2(30),hiredate date)
insert into a(empno,ename,job,hiredate) values (1,‘小红’,‘MANAGER’,to_date(‘1990-1-23’,‘yyyy-mm-dd’))
insert into a(empno,ename,job,hiredate) values (2,‘张四’,‘CHISHI’,to_date(‘1992-3-14’,‘yyyy-mm-dd’))
update a set ename=‘王飞’ where empno=1
delete from a where empno=1

alter table a add(mgr number(30))
alter table a modify(mgr varchar2(30))
update a set mgr=‘傻子’ where empno=1
alter table a drop column mgr

查询出所有薪金高于公司平均薪金的员工编号、姓名、基本工资、职位、雇佣日期,所在部门名称、
位置,上级领导姓名,公司的工资等级,部门人数、平均工资、平均服务年限。
select e.empno,e.sal,e.job,e.hiredate,
d.dname,d.loc,
m.ename,
s.grade,t.count,t.r from emp e,emp m,dept d,salgrade s,
(select deptno,count(empno) count,avg(months_between(sysdate,hiredate)/12) r from emp group by deptno) t
where e.deptno=d.deptno
and e.mgr=m.empno
and e.deptno=t.deptno
and e.sal between s.losal and s.hisal
and e.sal>(select avg(sal) from emp)
查询部门编号、雇员人数、平均工资,并且要求这些部门的平均工资高于公司平均薪金
select deptno,count(*),avg(sal) from emp group by deptno
having avg(sal)>(select avg(sal) from emp)

列出薪金比“ALLEN”或“CLARK”多的所有员工的编号、姓名、基本工资、部门名称、其领导姓名,部门人数。
select e.empno,e.ename,e.sal,
d.dname,
m.ename, t.count from emp e,emp m,dept d,
(select deptno,count(empno) count from emp group by deptno) t
where e.deptno=d.deptno
and e.mgr=m.empno
and e.deptno=t.deptno
and e.sal>(select sal from emp where ename in(‘ALLEN’,‘CLARK’))
显示非销售人员(SALESMAN)工作名称以及从事同一工作雇员的月工资的总和,
并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列
select job,sum(sal) from emp
where job<>'SALESMAN’group by job
having sum(sal)>5000 order by sum(sal) desc

SELECT deptno , ename, sal ,
SUM(sal) OVER () sum
FROM emp ;

SELECT deptno , ename, sal , comm ,
RANK() OVER (ORDER BY comm DESC NULLS LAST) rk ,
SUM(sal) OVER (ORDER BY comm DESC NULLS LAST) SUM
FROM emp

查询雇员编号是7369的雇员姓名、职、基本工资、部门编号、部门的人数、平均工资、最高工资、最低工资、总工资

查询每个部门中各个职位的总工资
SELECT deptno , job , SUM(sal)
FROM emp
GROUP BY deptno , job ;

统计出有提成与没有提成的雇员的平均工资、平均雇佣年限、雇员人数。
select comm,avg(sal),round(avg(months_between(sysdate,hiredate)/12)),count(empno) from emp group by comm

显示非销售人员(SALESMAN)工作名称以及从事同一工作雇员的月工资的总和,
并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列
select job,sum(sal) from emp
where job<>‘SALESMAN’
group by job
having sum(sal)>5000
order by sum(sal) desc

查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
select * from emp
where (job,to_char(hiredate,‘yyyy’))=(select job,to_char(hiredate,‘yyyy’) from emp where ename=‘ALLEN’)

列出薪金比“ALLEN”或“CLARK”多的所有员工的编号、姓名、基本工资、部门名称、其领导姓名,部门人数。

select e.empno,e.ename,e.sal,
d.dname,
m.ename,r.count
from emp e,dept d,emp m,
(select deptno,count(empno) count from emp group by deptno) r
where e.mgr=m.empno(+)
and e.deptno=d.deptno
and e.deptno=r.deptno
and e.sal>any(select sal from emp where ename in (‘ALLEN’,‘CLAEN’))

select e.empno,e.ename,e.sal,
d.dname,
m.ename, r.部门人数
from emp e,emp m,dept d,
(select deptno,count(empno) 部门人数 from emp group by deptno) r
where e.mgr=m.empno(+)
and e.deptno=d.deptno
and e.deptno=r.deptno
and e.sal>any(select sal from emp where ename in (‘ALLEN’,‘CLARK’) )
查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
select * from emp where
(job,to_char(hiredate,‘yyyy’))=(select job,to_char(hiredate,‘yyyy’) from emp where ename=‘ALLEN’)

列出薪金比“ALLEN”或“CLARK”多的所有员工的编号、姓名、基本工资、部门名称、其领导姓名,部门人数。
select e.empno,e.ename,e.sal,
d.dname,
m.ename,r.count(empno)) from emp e,dept d,emp m,
(select deptno, count(empno) from emp group by deptno) r
where e.deptno=d.deptno
and e.mgr=m.empno(+)
and e.deptno=r.deptno
and e.sal>any(select sal from emp where ename in(‘ALLEN’,‘CLAKE’))

select e.empno, e.ename, e.sal, d.dname, n.ename, m.部门人数
from emp e,
emp n,
dept d,
(select deptno, count(empno) 部门人数 from emp group by deptno) m
where e.mgr = n.empno(+)
and e.deptno = d.deptno
and e.deptno = m.deptno
and e.sal > any
(select sal from emp where ename in (‘ALLEN’, ‘CLARK’))

查询每个部门中各个职位的总工资
select deptno,
sum(decode(job,‘CLERK’,sal,0)),
sum(decode(job,‘SALESMAN’,sal,0)),
sum(decode(job,‘MANAGER’,sal,0)),
sum(decode(job,‘ANAESMAN’,sal,0)),
sum(decode(job,‘ANALYST’,sal,0))
from emp
group by deptno

/50道题/
/*
Drop Table student;–学生表 sno学号 sname姓名 sage年龄 ssex性别
Drop Table sc; --成绩表 sno学号 cno学科号 score成绩
Drop Table teacher;–教师表 tno教师号 tname教师姓名
Drop Table course; --课程表 tno教师号 cno学科号 cname学科
*/

select * from student
select * from sc
select * from teacher
select * from course

/1、查询’01’ '02’课程分数/
1.1 、查询同时存在"01" 课程和"02"课程的情况
select st.*,
s.score,c.score
from student st join sc s on st.sno=s.sno and s.cno=01
join sc c on st.sno=c.sno and c.cno=02

1.2 、查询必须存在"01" 课程,“02” 课程可以没有的情况
select st.,
s.score,c.score
from student st join sc s on st.sno=s.sno and s.cno=01
left join sc c on st.sno=c.sno and c.cno=02
/2、查询’01’课程比’02’课程成绩低的学生的信息及课程分数/
2.1 、查询同时’01’ 课程比’02’课程分数低的数据
select st.
,s.score,c.score
from student st join sc s on st.sno=s.sno and s.cno=01
join sc c on st.sno=c.sno and c.cno=02
where s.score 2.2 、查询同时’01’ 课程比’02’ 课程分数低或’01’ 缺考的数据
select st.*,s.score,c.score
from student st left join sc s on st.sno=s.sno and s.cno=01
join sc c on st.sno=c.sno and c.cno=02
where nvl(s.score,0) 3 、查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
select st.sno,st.sname,round(avg(score),2) from student st
join sc s on st.sno=s.sno
group by st.sname,st.sno
having avg(score)>=60
order by st.sno
/4、查询平均成绩小于 60 分的同学的学生编号和学生姓名和平均成绩/
4.1 、有考试成绩,且小于 60
select st.sno,st.sname,avg(score) from student st
join sc s on st.sno=s.sno
group by st.sno,st.sname
having avg(score)<60
order by st.sno
4.2 包括没有考试成绩的数据
select st.sno,st.sname,round(avg(score),2) from student st
left join sc s on st.sno=s.sno
group by st.sno,st.sname
having round(avg(score),2)<60
order by st.sno
/5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩/
5.1 、查询所有成绩的(不含缺考的)。
select st.sno,st.sname,count(c.cno),sum(c.score) from student st
join sc c on st.sno=c.sno
group by st.sno,st.sname
order by st.sno
5.2 、查询所有成绩的( 包括缺考的) 。
select st.sno,st.sname,count(c.cno),sum(c.score) from sc c
right join student st on st.sno=c.sno
group by st.sno,st.sname
order by st.sno

6 、查询" 李" 姓老师的数量 (有几个老师姓李)
select count(tname) from teacher where tname like’李%’
7、哪些学生上过张三(老师)的课
select * from student st join sc s on st.sno=s.sno
join course c on c.cno=s.cno
join teacher t on c.tno=t.tno
where tname=‘张三’

8、哪些学生没上过张三(老师)的课
select * from student where sname not in (select st.sname from student st join sc s on st.sno=s.sno
join course c on s.cno=c.cno
join teacher t on c.tno=t.tno
where tname=‘张三’)
9、查询 ‘01’ ‘02’ 都学过的同学的信息
select st.* from student st join sc s on st.sno=s.sno and s.cno=‘01’
join sc c on st.sno=c.sno and c.cno=‘02’
10 、查询学过编号为’01’ 但是没有学过编号为’02’ 的课程的同学的信息
select st.* from student st join sc s on st.sno=s.sno and s.cno=‘01’
left join sc c on st.sno=c.sno and c.cno=‘02’
where c.cno is null

11.1 学完所有课程的

11.2 没有学完所有课程的

12 、查询至少有一门课与学号为’01’ 的同学所学相同的同学的信息

13 、查询和’01’ 号的同学学习的课程完全相同的其他同学的信息

14 、查询没学过" 张三"老师讲授的任一门课程的学生姓名

15 、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

16 、检索’01’ 课程分数小于 60 ,按分数降序排列的学生信息

17 、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

18 、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课
程,课程 name ,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

19 、按各科成绩进行排序,并显示排名

20.1 查询学生的总成绩

20.2 查询学生的总成绩并进行排名

21 、查询不同老师所教不同课程平均分从高到低显示

22 、查询所有课程的成绩第 2 名到第 3 名的学生信息及该课程成绩

23.1 号 统 计 各 科 成 绩 各 分 数 段 人 数 : 课 程 编 号 , 课 程 名
称课程名称,“100-85”,“85-70”,“70-60”,“0-60”

23.2 号 统 计 各 科 成 绩 各 分 数 段 人 数 : 课 程 编 号 , 课 程 名
称课程名称,“100-85”,“85-70”,“70-60”,"<60"及所占百分比

24 、 查询学生的平均成绩并进行排名

25.1 分数重复时保留名次空缺

25.2 分数重复时不保留名次空缺,合并名次

26 、查询每门课程被选修的学生数

27、查询出只有两门课程的全部学生的学号和姓名

28、查询男生、女生人数

29 、查询名字中含有" 风" 字的学生信息

31 、查询 1990 年出生的学生名单( 注:Student 表中 Sage 列的类型是 date)

32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,
按课程编号升序排列

33 、查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩

34 、查询课程名称为" 数学" ,且分数低于 60 的学生姓名和分数

35 、查询所有学生的课程及分数情况;

36 、查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数;

37 、查询不及格的课程

38 、查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名;

39 、求每门课程的学生人数

40 、查询选修" 张三" 老师所授课程的学生中,成绩最高的学生信息及其成绩

41 、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

42、查询每门功成绩最好的前两名

44、检索至少选修两门课程的学生学号

46、查询各学生的年龄

47 、查询本周过生日的学生

48 、查询下周过生日的学生

49 、查询本月过生日的学生
50 、查询下月过生日的学生


declare
–定义变量
v_num number;

begin
–给变量赋值
v_num:=1000;
–输出
dbms_output.put_line(‘v_num的变量是内容是’||v_num);

end;


–编写PL/SQL块,输入一个雇员编号,而后取得指定的雇员姓名
DECLARE
v_empno NUMBER;
v_ename VARCHAR(10);
BEGIN
v_empno:=&empno;
SELECT ename INTO v_ename FROM emp WHERE empno=v_empno;
dbms_output.put_line(‘输入的编号为’||v_empno||‘姓名是’||v_ename);
END;


–编写PL/SQL块,输入一个雇员编号,输出这个人的名字和年薪?
DECLARE
v_empno NUMBER;
v_ename VARCHAR(10);
v_sal NUMBER;
BEGIN
v_empno:=&empno;
SELECT ename,(sal+NVL(comm,0))*12 INTO v_ename,v_sal FROM emp WHERE empno=v_empno;
dbms_output.put_line(‘输入的员工编号是’||v_empno||‘姓名是’||v_ename||‘薪资是’||v_sal);
END;


–Dept表:输入部门编号显示地址和部门名称
declare
–定义变量
v_deptno number;
v_loc varchar2(100);
v_dname varchar2(100);
begin
–键盘输入
v_deptno := &deptmo;
–获取数据,如果有的话就赋值给变量
select deptno, loc, dname into v_deptno, v_loc, v_dname from dept where deptno = v_deptno;
–打印输出
dbms_output.put_line(‘部门编号为:’ || v_deptno || ‘,地址:’ || v_loc || ‘,部门名称:’ ||
v_dname);
end;


declare
–定义一个常量赋值(不可变的量)
v_jiegouA constant number not null :=100;

begin
dbms_output.put_line(‘sada的内容’||v_jiegouA);

end;


–记录性变量
declare

v_deptno dept%rowtype;

begin

select * into v_deptno from dept where deptno = 20;
dbms_output.put_line(‘部门编号’ || v_deptno.deptno || ‘,名称’ ||
v_deptno.dname || ‘,位置’ || v_deptno.loc);

end;


declare
v_wz varchar2(30) := ‘www.gouzhengjiaoyv.cn’;
v_sum1 number := 30;
v_sum2 number := 19;

begin
if v_sum1 > v_sum2 then
dbms_output.put_line(‘第一个数比第二个大’);
end if;

if v_wz like ‘%jiaoyv%’ then
dbms_output.put_line(‘网址中包含jiaoyv单词’);
end if;

end;


declare
v_count number;
begin
select count(empno) into v_count from emp;
if v_count > 10 then
dbms_output.put_line(‘emp表中的数据大于10条’);
elsif v_count < 10 then
dbms_output.put_line(‘emp表中的数据小于10条’);
else
dbms_output.put_line(‘emp表中的数据等于10条’);
end if;
end;


–查询emp表的工资,输入员工编号,根据编号查询工资,如果工资高于3000元,则显示高工资,
–如果工资大于2000元,则显示中等工资,如果工资小于等于2000元,则显示低工资。

declare
v_empno number;
v_sal number;
begin
–键盘输入
v_empno:=&empno;
select sal into v_sal from emp where empno=v_empno;

if v_sal>3000 then
dbms_output.put_line(‘高工资’);
elsif v_sal>2000 then
dbms_output.put_line(‘中等工资’);
elsif v_sal<=2000 then
dbms_output.put_line(‘低工资’);
end if;
end;


–用户输入一个雇员编号,根据它所在的部门给上涨工资(更改数据,不输出打印),规则: 10部门上涨10%,20上涨20%,30上涨30%;
–但是要求最高不能超过5000,超过5000就停留在5000
declare
v_sal emp.sal%type; – 定义变量与emp.sal字段类型相同
v_deptno emp.deptno%type; – 定义变量与emp.deptno字段类型相同
v_empno emp.empno%type; – 定义变量与emp.empno字段类型相同
begin
v_empno := &empno; – 用户输入要查找的雇员编号
select deptno, sal into v_deptno, v_sal from emp where empno = v_empno;

if v_deptno = 10 then
if v_sal * 1.1 > 5000 then
update emp set sal = 5000 where empno = v_empno;
else
update emp set sal = sal * 1.1 where empno = v_empno;
end if;

elsif v_deptno = 20 then
if v_sal * 1.2 > 5000 then
update emp set sal = 5000 where empno = v_empno;
else
update emp set sal = sal * 1.2 where empno = v_empno;
end if;

elsif v_deptno = 30 then
IF v_sal * 1.3 > 5000 then
update emp set sal = 5000 where empno = v_empno;
else
update emp set sal = sal * 1.3 where empno = v_empno;
end if;

else
null;
end if;
end;


declare

begin
if to_date(‘1983-09-19’,‘yyyy-mm-dd’)between to_date(‘1980-01-01’,‘yyyy-mm-dd’)
and to_date(‘1989-12-31’,‘yyyy-mm-dd’) then
dbms_output.put_line(‘您俗称80后!’);
end if;

end;


BEGIN
IF 10 IN (10,20,30) THEN
DBMS_OUTPUT.put_line(‘数据已成功查找到’) ;
END IF ;
END;


DECLARE
v_xz NUMBER := 1 ;
BEGIN
CASE WHEN v_xz=0 THEN
DBMS_OUTPUT.put_line(‘您选择的是第0项。’) ;
WHEN v_xz=1 THEN
DBMS_OUTPUT.put_line(‘您选择的是第1项。’) ;
ELSE
DBMS_OUTPUT.put_line(‘没有选项满足。’) ;
END CASE ;
END ;


–打印循环1-10
declare
–声明一个循环变量赋初值
v_sum number := 1;
begin

loop
exit when v_sum > 10;
dbms_output.put_line(v_sum);
v_sum := v_sum + 1;
end loop;

end;


–Loop:先执行后判断,至少执行一次;
–While…loop:先判断再执行;


–求: 12+32+52+…+152 的值。
declare
v_t number(6) := 0;
v_count number(6) := 1;

begin
loop
v_t := v_t + v_count ** 2;
exit when v_count = 15;

v_count := v_count + 2;
dbms_output.put_line(v_count);

end loop;
dbms_output.put_line(v_t);

end;


–求:2 +4 +6 +8…20的值
declare
sum1 number := 0;
sum2 number := 2;
begin
loop
sum1 := sum1 + sum2;
exit when sum2 = 20;
sum2 := sum2 + 2;
end loop;
dbms_output.put_line(sum1);

end;

–求:1234…*8的值。
declare
sum1 number := 1;
sum2 number := 2;
begin
loop
sum1 := sum1 * sum2;
exit when sum2 = 8;
sum2 := sum2 + 1;
end loop;
dbms_output.put_line(sum1);

end;

–求:显示(1+2)(2+3)(3+4)…(6+7)的结果
declare
sum1 number := 1;
sum2 number := 2;
sum3 number := 1;
begin
loop
sum3 := sum3*(sum1+sum2);
exit when sum1=6 and sum2=7;
sum1 := sum1 + 1;
sum2 := sum2 + 1;
end loop;
dbms_output.put_line(sum3);

end;

–求:(12+1)+(23+2)+(34+3)…(56+5)的值。
declare
sum1 number :=1;
sum2 number :=2;
sum3 number :=1;
sum4 number :=0;
begin
loop
sum4 := sum4+(sum1*sum2+sum3);
exit when sum1=5 and sum2=6 and sum3=5;
sum1 :=sum1+1;
sum2 :=sum2+1;
sum3 :=sum3+1;
dbms_output.put_line(sum1);
dbms_output.put_line(sum2);
dbms_output.put_line(sum3);

end loop;
dbms_output.put_line(sum4);

end;


–While…loop:先判断再执行;
declare
v_i number := 1;
begin
while (v_i <= 3) loop
dbms_output.put_line(‘v_i是:’||v_i);
v_i := v_i + 1;
end loop;
end;


–求:1+3+5+…+15的值
–求:2 +4 +6 +8+…+12的值


–for循环
declare
v_i number := 1;
begin
for v_i in 1 …10 loop
dbms_output.put_line(‘v_i是:’ || v_i);
end loop;
end;


–执行跳出结束
declare
v_i number := 1; --定义一个变量,用于循环
begin
for v_i in 1 … 10 loop
if v_i = 5 then --当v_i等于5的时候就跳出循环
exit;
end if;
dbms_output.put_line(‘v_i是:’ || v_i);
end loop;
end;


–执行跳出本次循环
declare
v_i number := 1; --定义一个变量,用于循环
begin
for v_i in 1 … 10 loop
if v_i = 5 then
continue; --为5的时候不执行
end if;
dbms_output.put_line(‘v_i是:’ || v_i);
end loop;
end;


select * from dept /执行表格q/
create table q (empno number(30),ename varchar2(30),job varchar2(30))/创建表格q 加表结构/
insert into q (empno,ename,job)values (1,‘小明’,‘manager’) /插入/
insert into q (empno,ename,job)values (2,‘小红’,‘maishi’) /插入/
update q set job='manager’where empno=1/更改表内数据/
delete from dept where deptno=90 /删除一行/
alter table q add(mgr number(30))/增加一列/
alter table q modify(mgr varchar2(30))/修改成字符串模式/
update q set mgr=‘王’ where empno=1 /列表插值/
alter table q drop column mgr/删除一列/
varchar2 /字符串类型/ number/数字类型/ date /日期类型/ int /整数类型/
select * from dept1


–1.用 loop 循环结构,为 dept 表增加 50、60…90 这些部门
declare
deptno number:=50;
begin
loop
insert into dept1(deptno) values (deptno);
exit when deptno>=90;
deptno:=deptno+10;
end loop;
end;
select * from dept1;


–2.接收一个雇员名,显示该雇员的所有内容,(用%rowtype 实现),当没有这个雇员时,用异常来显示错误提示
declare
v_ename emp.ename%type;
v_www emp%rowtype;
begin
v_ename:=&ename;
select * into v_www from emp where ename = v_ename;
dbms_output.put_line(v_www.empno || ‘,’ || v_www.job || ‘,’ ||
v_www.hiredate || ‘,’ || v_www.sal || ‘,’ ||
v_www.deptno || ‘,’ || v_www.comm || ‘,’ ||
v_www.mgr);
exception
when others then
dbms_output.put_line(‘没有这个雇员’);
end;
select * from emp


–3.编写一个 PL/SQL 程序块以计算某个雇员的年度薪水总额,包括提成(手动输入名字)
declare
v_ename emp.ename%type := ‘&v_ename’;
v_sum number;
begin
select ((sal + nvl(comm, 0)) * 12)
into v_sum
from emp
where ename = v_ename;
dbms_output.put_line(v_sum);
end;


–4.编写一个 PL/SQL 程序块以向 emp 表添加 10 条雇员编号(7911-7920)
declare
v_sum number := 7911;
begin
loop
insert into emp1 (empno) values (v_sum);
exit when v_sum >= 7920;
v_sum := v_sum + 1;
end loop;
end;


–5.接收 2 个数相除,并显示结果,如果除数为 0,则显示错误提示;
declare
v_num1 number := ‘&v_num1’;
v_num2 number := ‘&v_num2’;
v_num3 number := 0;
begin
if v_num2 != 0 then
v_num3 := v_num1 / v_num2;
dbms_output.put_line(v_num3);
else
dbms_output.put_line(‘错误’);
end if;

end;


–6.做个功能:从键盘录入一个数,判断正负(如果是正数,显示:正数,是负数显示:负数,0则显示0)
declare
v_num number:=’&v_num’;
begin
if v_num>0 then
dbms_output.put_line(‘正数’);

   elsif v_num<0 then
      dbms_output.put_line('负数');
      
   else
      dbms_output.put_line('0');
      
   end if;

end;


declare

begin
exception
when others then
DBMS_OUTPUT.put_line(‘返回的数据过多!’) ;
DBMS_OUTPUT.put_line('sqlcode = ’ || sqlcode) ;
DBMS_OUTPUT.put_line('sqlcode = ’ || sqlcode) ;
end;


create or replace procedure kkkk --创建存过
as

begin
dbms_output.put_line(‘www.gouzheng.cn’);

end;


–定义过程,根据雇员编号找到雇员姓名及工资
create or replace procedure get_emp_info_proc(p_eno emp.empno%type)
as
v_ename emp.ename%type;
v_sal emp.sal%type;
v_count number;

begin
select count(empno) into v_count from emp where empno=p_eno;
if v_count=0 then --没有发现数据
return; --结束过程调用
end if;

select ename,sal into v_ename,v_sal from emp where empno=p_eno;
dbms_output.put_line(‘编号为’|| p_eno ||‘的雇员姓名:’|| v_ename ||’,工资’|| v_sal);
end;

–调用
begin
get_emp_info_proc(7788);
end;


–例题: 利用过程增加部门编号和部门名称、部门位置
create or replace procedure dept_insert_proc(
p_dno dept.deptno%type,
p_dna dept.dname%type,
p_dlo dept.loc%type)
AS
v_deptCount number ; – 保存COUNT()函数结果
begin
select count(deptno) into v_deptCount from dept where deptno=p_dno ; – 统计
if v_deptCount > 0 then – 有此编号的部门
–RAISE_APPLICATION_ERROR(-20789,‘增加失败:该部门已存在!’) ;
DBMS_OUTPUT.put_line(‘该部门已存在!’) ;
else
insert into dept(deptno,dname,loc) values (p_dno,p_dna,p_dlo) ;
DBMS_OUTPUT.put_line(‘新部门增加成功!’) ;
commit ;
end if ;
exception
when others then
dbms_output.put_line('SQLERRM = ’ || SQLERRM) ;
rollback ; – 事务回滚
end ;
select * from dept1


–定义函数 —— 通过雇员编号查找此雇员的月薪
create or replace function get_sal_fun(p_eno emp.empno%type)
return number
as
v_sal emp.sal%type ;
begin
select sal + nvl(comm,0) into v_sal from emp where empno=p_eno ;
return v_sal; --返回的数据
end;

–调用
declare
v_sal number;
begin
v_sal := get_sal_fun(7788) ;
dbms_output.put_line(‘雇员7788的工资为:’ || v_sal) ;
end ;
–通过SQL调用函数
select get_sal_fun(7788) from dual;


–练习题
创建一个存储过程,以员工号为参数,输出该员工的工资
create or replace procedure get_emp_info_proc(v_empno emp.empno%type)
as
v_ename emp.ename%type;
v_sal emp.sal%type;
v_count number;
begin
select count(empno) into v_count from emp where empno=v_empno;
if v_count=0 then
dbms_output.put_line(‘emp表中不存在您要输入的编号’);
return;
end if;
select ename,sal into v_ename,v_sal from emp where empno=v_empno;
dbms_output.put_line(‘员工编号是:’||v_empno||’,姓名是:’||v_ename||’,薪资是:’||v_sal);
end;
–调用
begin
get_emp_info_proc(7788);
end;


创建一个存储过程,以员工号为参数,修改该员工的工资。若该员工属于10号部门,则工资增加150;
若属于20号部门,则工资增加200;若属于30号部门,则工资增加250,若属于其他部门,则增加300。
create or replace procedure get_emp1_info_proc (v_empno emp1.ename%type)
as
v_ename emp1.ename%type;
v_sal emp1.sal%type;
v_deptno emp1.deptno%type;
v_count number;
begin
select count(empno) into v_count from emp1 where empno=v_empno;
if v_count=0 then
dbms_output.put_line(‘没有您要查询的员工’);
return;
end if;
select ename,sal,deptno into v_ename,v_sal,v_deptno from emp1 where empno=v_empno;
if v_deptno=10 then
v_sal:=v_sal+150;
dbms_output.put_line(‘员工编号是:’||v_empno||’,姓名是:’||v_ename||’,薪资是:’||v_sal);

elsif v_deptno=20 then
v_sal:=v_sal+200;
dbms_output.put_line('员工编号是:'||v_empno||',姓名是:'||v_ename||',薪资是:'||v_sal);    

elsif v_deptno=30 then
v_sal:=v_sal+250;
dbms_output.put_line('员工编号是:'||v_empno||',姓名是:'||v_ename||',薪资是:'||v_sal);    

else 
 v_sal:=v_sal+300;
 dbms_output.put_line('员工编号是:'||v_empno||',姓名是:'||v_ename||',薪资是:'||v_sal);    

end if;
end;


创建一个函数,以部门号为参数,返回该部门的平均工资
create or replace function get_sal_fun(v_deptno emp1.deptno%type)
return number
as
v_sal emp1.sal%type;
begin
select avg(sal) into v_sal from emp1 where deptno=v_deptno;
return v_sal;
end;


创建一个函数,以员工号为参数,返回该员工所在的部门的平均工资
create or replace function get_sal_fun1(v_empno emp1.empno%type)
return number
as
v_sal emp1.sal%type;
v_deptno emp1.deptno%type;
begin
select deptno,avg(sal) into v_deptno,v_sal from emp1 where deptno=v_deptno;
return v_deptno;
return v_sal;
end;


创建一个存储过程,以部门号为参数,输出入职日期最早的3个员工信息。


创建一个存储过程,以一个整数为参数,输入工资最高的前几个(参数值)员工的信息(如输入5,显示工资最高的前五名信息)。


编写一个存储过程,手动输出数字,批量插入 1000 条数据(只插入 I 为奇数的数据)
创建个表 create table test(i number(10));


–游标
–隐式游标
–验证%ROWCOUNT
declare
v_count number;
begin
select count(*) into v_count from dept;–只返回一行结果
dbms_output.put_line(‘SQL%ROWCOUNT=’||SQL%ROWCOUNT);
end;


–验证%ROWCOUNT,增加新数据返回行数
declare
begin
insert into dept(deptno,dname,loc) values (90,‘yanfa’,‘北京’) ;
dbms_output.put_line('SQL%ROWCOUNT = '|| SQL%ROWCOUNT) ;
end ;
select * from dept


–观察单行隐式游标:
DECLARE
v_empRow emp%ROWTYPE ; – 保存emp每行记录
BEGIN
SELECT * INTO v_empRow FROM emp WHERE empno=7369 ;
IF SQL%FOUND THEN – 发现数据
DBMS_OUTPUT.put_line(‘雇员姓名:’ || v_empRow.ename || ‘,职位:’ || v_empRow.job) ;
END IF ;
END ;


declare
–声明游标
cursor c_emp is
select ename, sal from emp;
–声明变量
v_ename emp.ename%type;

v_sal emp.sal%type;

begin
–打开游标
open c_emp;

–遍历游标
loop
–获取游标中的数据,如果有的话就赋值给变量
fetch c_emp
into v_ename, v_sal;

exit when c_emp%notfound;--判断是否有游标

dbms_output.put_line('姓名' || v_ename || '薪水' || v_sal);

end loop;

–关闭游标
close c_emp;

end;


–使用FOR循环操作游标
declare
cursor v_emp is select * from emp ;

begin
–隐含打开游标
for xx in v_emp loop
–隐含执行一个FETCH语句
dbms_output.put_line(‘雇员姓名:’ || xx.ename || ‘,职位:’ || xx.job || ‘,工资:’ || xx.sal) ;
–隐含监测c_sal%notfount
end loop ;
–隐含关闭游标
end ;


–习题: 用循环把dept表的数据全部显示出来
declare
cursor v_dept is select * from dept1; --进行查表复制
begin
for xx in v_dept loop – 进行循环
dbms_output.put_line(‘雇员姓名’||xx.dname||’,部门’||xx.deptno||’,位置’||xx.loc); --打印输出
end loop; --结束循环
end;


–习题: 用游标输出emp表和dept表的员工编号、姓名、部门名称、地址
declare
cursor v_mmm is select *from emp e join dept d on e.deptno=d.deptno; --进行关联复赋值
begin
for xx in v_mmm loop --进行循环
dbms_output.put_line(‘雇员编号’||xx.empno||’,姓名’||xx.ename||’,部门名称’||xx.dname||‘地址’||xx.loc); --打印输出
end loop; --结束循环
end;


–习题:向游标传递一个职位,显示此工种的所有雇员的所有信息(手动输入参数)
declare
v_job emp.job%type:=’&JOB’;
cursor v_emp is select * from emp where job=v_job;
begin

for xx in v_emp loop
dbms_output.put_line(‘员工编号’||xx.empno||‘姓名’||xx.ename||‘部门编号’||xx.deptno||
‘入职如期’||xx.hiredate||‘职位’||xx.job||‘领导编号’||xx.mgr||‘工资’||xx.sal||‘奖金’||xx.comm);
end loop;
end;


–输入两个薪金数值,显示出符合在范围内结果的数据(emp表数据)

declare
v_los number:=&输入最低工资;
v_his number:=&最高工资;
cursor c_s is select * from emp where sal between v_los and v_his;
begin
case when v_los>v_his then
dbms_output.put_line(‘最低工资不能大于最高工资’);
when v_los>5000 or v_his<800 then
dbms_output.put_line(‘输入范围无结果’);
else
for xx in c_s loop
dbms_output.put_line(‘编号为:’||xx.empno||‘姓名为:’||xx.ename||‘职位为:’||xx.job||‘上司为:’
||xx.mgr||‘入职日期’||xx.hiredate||‘工资为:’||xx.sal||‘奖金为:’||xx.comm||‘部门为:’||xx.deptno);
end loop;
end case;
end;





–查询没有提成的员工信息
select * from emp where comm IS null and comm=0;
–查询有提成的
select * from emp where comm is not null and comm>0;
–查询员工信息第三位是A的
SELECT * FROM emp WHERE ename LIKE ‘__A%’
–找出20部门中既不是经历也不是普通员工的信息
SELECT * FROM emp WHERE DEPTNO=20 AND job NOT IN(‘MANAGER’, ‘CLERK’)
–建表差值
CREATE TABLE q (empno NUMBER,ename VARCHAR(20),sal NUMBER);
INSERT INTO q (empno,ename,sal)VALUES(2222,‘张三’,4555);
–表结构的增删改

利用过程增加部门,编写一个过程,过程里面可以实现部门数据的增加。需要告诉用户增加成功与否,
如果是0表示增加成功,如果是1表示增加失败。(用in或 out作为判断标记)

CREATE OR REPLACE PROCEDURE dept_insert_proc(
p_dno dept1.deptno%TYPE,
p_dna dept1.dname%TYPE,
p_dlo dept1.loc%TYPE ,
p_result OUT NUMBER) – 此为操作标记变量
AS
v_deptCount NUMBER ; – 保存COUNT()函数结果
BEGIN
SELECT COUNT(deptno) INTO v_deptCount FROM dept1 WHERE deptno=p_dno ; – 统计
IF v_deptCount > 0 THEN – 有此编号的部门
p_result := 1 ; – 修改返回标记
ELSE
INSERT INTO dept1(deptno,dname,loc) VALUES (p_dno,p_dna,p_dlo) ;
p_result := 0 ; – 修改返回标记
COMMIT ;
END IF ;
END ;
SELECT * FROM dept1

编写一个存过,要求输入一个编号,显示编号的年薪(用in out 模式)

习题:
–1.创建一个存储过程,以员工号为参数,返回该员工的工作年限(以参数形式返回)。
create or replace procedure p_sxt3
(v_empno in emp.empno%type, v_year out number)
is
begin
select round(months_between(sysdate,hiredate)/12,1) into v_year
from emp where empno = v_empno;
end;
–执行
declare
v_empno emp.empno%type := 7369;
v_year number;
begin
p_sxt3(v_empno,v_year);
dbms_output.put_line(v_empno || ’ 工作年限为 ’ || v_year || ‘年’);
end;

create or replace procedure p_sxt3
(v_empno emp.empno%type)
is
v_year number;
begin
select round(months_between(sysdate,hiredate)/12,1) into v_year
from emp where empno = v_empno;
end;

–2.写一个存储过程,传入一个员工编号,如果入职日期比10部门任意一个员工晚的话,则传出员工姓名,入职日期,否则,传出空,不包括10部门员工
create or replace procedure p_test5(i_empno in number,
o_ename out varchar2,
o_date out date)
as
begin
select ename,hiredate into o_ename,o_date from emp
where empno=i_empno
and deptno!=10
and hiredate>(select max(hiredate) from emp where deptno=10);
dbms_output.put_line(‘姓名:’||o_ename||’ 入职日期:’||o_date);
exception
when OTHERS then
dbms_output.put_line(‘sqlcode=’||sqlcode);
dbms_output.put_line(‘sqlerrm=’||sqlerrm);
end;

–3.写一个函数(dept表)传入:部门编号,传出:如果部门有员工,将部门编号改为60传出,如果部门没有员工,将部门编号改为88传出
–(直接赋值就行,不用改表中的数据);返回值:部门位置
create or replace function f_deptno(i_deptno in out dept.deptno%type)
return varchar2
as
v_t number; --判断有没有部门
v_count number; --判断部门有没有员工
v_loc dept.loc%type; --地址
begin
select count(deptno) into v_t from dept where deptno=i_deptno;
if v_t=0 then
dbms_output.put_line(‘没有此部门!’);
else
select loc into v_loc from dept where deptno=i_deptno;
select count(*) into v_count from emp where deptno=i_deptno;
if v_count > 0 then
i_deptno := 60;
else
i_deptno := 88;
end if;
end if;
return v_loc;
end f_deptno;
–4.写一个函数:传出:今天是周几(1表示周一,一次类推)今天是几月
–返回值:下个月的1号
create or replace function f_date(i_dd out number, i_mm out number)
return date
is
i_yy date;
begin
select to_number(to_char(sysdate - 1, ‘d’)) into i_dd from dual;
select to_number(to_char(sysdate, ‘mm’)) into i_mm from dual;
select last_day(sysdate) + 1 into i_yy from dual;
return i_yy;
end;
–测试:
declare
v_day number(10);
v_mm number(10);
v_date date;
begin
v_date:=f_date(v_day,v_mm);
dbms_output.put_line
(‘星期几:’||v_day || '月份’v_mm ||‘下个月的第一天’||to_char(v_date,‘yyyy-mm-dd’);
end;

–5.写一个函数,输出:工资最小的员工的姓名,编号,经理名字,返回值:工资最大的员工的工资
create or replace function f_sal
( o_ename out emp.ename%type,–员工姓名
o_empno out emp.empno%type,–员工编号
o_mename out emp.ename%type)–领导姓名
return number
as
v_sal emp.sal%type;
begin
select ename,empno,mename
into o_ename,o_empno,o_mename
from (select a.sal,a.ename,a.empno,b.ename mename
from emp a join emp b on a.mgr=b.empno
order by a.sal)
where rownum=1;
select max(sal) into v_sal from emp;
return v_sal;
end;
---------第二种:
create or replace function f_sal( o_ename out emp.ename%type,
o_empno out emp.empno%type,
o_mename out emp.ename%type)
return number
as
v_sal emp.sal%type;
begin
select ename,empno,b.ename
into o_ename,o_empno,o_mename
from emp a,empb
where a.mgr=b.empno
and sal=(select min(sal) from emp);
select max(sal)
into v_sal
from emp;
return v_sal;
end;

.写一个函数
输出:查询部门人数大于所有部门平均人数的部门编号,部门名称
返回:该部门的人数

2.写一个函数
输入:员工编号
输出:员工的工资,姓名,部门
如果工资比MILLER工资高并且工作地点在CHICAGO,则返回0,否则返回1

3.写一个函数
输出:入职日期比10部门入职日期最早的员工还要早的员工数量
返回:入职日期比30部门入职日期最早的员工还要早的员工的入职日期

4.写一个存储过
输入:入职日期
如果比10部门所有员工晚,则在屏幕上(out参数)显示员工姓名,入职日期,不包括10员工(日期相同随机显示)

5.写一个存储过程
输入:一个员工编号
如果和10部门任意一个员工职位相同,则在屏幕(out参数)上显示0,否则显示1,不包括10部门员工

6.写一个存储过程
显示平均工资最高的部门平均工资及部门名称(out参数)

7.写入一个函数
传入:姓名
传出:如果工资比TURNER高,则传出0,否则传出1
返回值:工资

/联系/
1、查询dept表的结构
Desc dept;

2、检索dept表中的所有行、所有列的数据。
select * from dept
3、检索emp表中的员工姓名、月收入及部门编号
Select ename,sal,deptno from emp;

4、检索emp表中员工姓名、及雇佣时间
日期数据的默认显示格式为"DD-MM-YY"
select ename,hiredate from emp
5、使用distinct去掉重复行。
检索emp表中的部门编号及工种,并去掉重复行。
select distinct deptno,job from emp
查询 employees 表中有多少个部门
select distinct deptno from emp
6、使用表达式来显示列
检索emp表中的员工姓名及全年的收入
select ename,ename,sal*12 from emp

7、使用列别名
用“姓名”显示员工姓名,用“年收入”显示全年收入。
select ename 姓名,sal*12 年收入 from emp

8、连接字符串
检索emp表,用is a 这个字符串来连接员工姓名和工种两个字段
结果示例:
select concat(ename ‘is a’ job) from emp
SMITH is a CLERK
ALLEN is a SALESMAN
WARD is a SALESMAN

9、使用WHERE子句

  检索月收入大于2000的员工姓名及月收入。
  sele
  
  检索月收入在1000元到2000元的员工姓名、月收入及雇佣时间。

  查询 1998-4-24 来公司的员工有哪些

10、like的用法:

检索以S开头的员工姓名及月收入。
  
 检索员工姓名中的第三个字符是A的员工姓名及月收入。

11、在WHERE条件中使用IN操作符

检索emp表中月收入是800的或是1250的员工姓名及部门编号

12、在WHERE条件中使用逻辑操作符(AND、OR、NOT)

显示在部门20中岗位CLERK的所有雇员信息

 
显示工资高于2500或岗位为MANAGER的所有雇员信息

13、查询表中是空值的数据

  查询 所有经理为空的所有员工信息

  检索emp表中有提成的员工姓名、月收入及提成。

14、使用ORDER BY子句,进行排序。

检索emp表中部门编号是30的员工姓名、月收入及提成,并要求其结果按月收入升序、然后按提成降序显示。

15,显示系统时间(取别名为"DATE").

16,查询员工号,姓名,工资(若为NULL则作为0处理)

  以及工资提高百分之20%(乘1.2)后四舍五入到整数的结果(取别名为new salary)

17,将员工的姓名(取别名为"Name")按字母表先后顺序排序,并写出姓名的长度(取别名为"length")

18,查询各员工的姓名,并显示出各员工在公司工作了多少个月份(起别名为"worked_month")四舍五入到整数。

19,查询员工的姓名和工资,按下面的形式显示结果(工资字段必须为15位,空位用$填充)

姓名 工资
KING $$$$$$$$ 24000 M I K E 24000 MIKE 24000MIKE$$$$$$$$$4800

20,查询员工的姓名,以及在公司工作满了多少个月(worked_month),并按月份数降序排列

20,–使用 case-when-then-else-end

1)job名称所对应的级别如下:
CLERK A
SALESMAN B
MANAGER C
ANALYST D
PRESIDENT E
OTHER
请查询员工的姓名、job名称、级别

结果示例:
姓名 job名称 级别
MARTIN SALESMAN B
BLAKE MANAGER C

2)查询部门号为 10, 20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数

22,查询公司员工工资的最大值,最小值,平均值,总和

23,查询各个不同job的员工工资的最大值,最小值,平均值,总和

24,查询员工最高工资和最低工资的工资差距

25,查询公司的人数,以及在80,81,82,87年,每年雇用的人数,结果类似下面的格式
total 1980 1981 1982 1987
14 1 10 1 2

26,显示所有员工的姓名,部门号和部门名称(dname)。联合查询emp, dept.

27,不重复地查询20号部门员工的job和20号部门的loc.

28,选择所有有提成的(提成非空并且大于0)员工的ename , dname , loc

29,选择在CHICAGO(一个loc)工作的员工的ename , job , deptno , dname

30,查询所有员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式:
employees Emp# manager Mgr#
kochhar 101 king 100

31,查询各部门员工姓名和他们的同事(在同一个部门工作的其他人)姓名,结果类似于下面的格式:

Department_id Last_name colleague
20 Fay Brown
20 Fay Peter

32,查询各个管理者的编号及其手下员工的最低工资,其中最低工资低于6000的排除在外,没有管理者的员工不计算在内

33,查询所有部门的名称,loc,员工数量和工资平均值

34,根据salgrade表和employee表,查询出所有员工的工资等级。

35,使用子查询,查询出 ename 为 ‘MILLER’ 的 manager 的信息.

36,查询CHICAGO 这个城市的员工的平均工资。

37,查询各个城市的平均工资。

38,查询平均工资高于 8000 的部门 id 和它的平均工资.

39,查询平均工资高于 6000 的 job 有哪些?

40,谁的工资比 SCOTT 高?

41,查询公司中工资最低的员工的信息。

42,查询平均工资最低的部门名称

43,查询平均工资高于公司平均工资的部门有哪些?

44,查询出公司中所有 manager 的详细信息

45,各个部门中都有最高的工资,这些“最高工资”中最低的那个部门的是哪个?再查该部门的 最低工资是多少?

46,查询 1999 年来公司的人所有员工的最高工资的那个员工的信息.

47,select department_id
from employees
group by department_id
having avg(salary) >= any (
–所有部门的平均工资
select avg(salary)
from employees
group by department_id
)
会返回什么值,为什么?

48,select department_id
from employees
group by department_id
having avg(salary) >= all (
–所有部门的平均工资
select avg(salary)
from employees
group by department_id
)
会返回什么值,为什么?

49,利用子查询创建表 myemp, 该表中包含 employee 表的
employeeno,ename,job,sal 字段

1). 创建表的同时复制 employee 对应的记录	


2). 创建表的同时不包含 employee 中的记录, 即创建一个空表

50,对现有的myemp表进行修改操作

1). 添加一个新列 age int(3)	

2). 修改现有列的类型 MODIFY(ename varchar(30));

3). 修改现有列的名字sal   TO   salary	
  1. . 删除现有的列 COLUMN age;

51,清空myemp表, 不能回滚!!

52,创建一个表emp2, 该表和 employee 有相同的表结构, 但为空表

53,把 employee 表中 20 号部门的所有数据复制到 emp2 表中

54,更改 7369 员工的信息: 使其工资变为所在部门中的最高工资, job 变为公司中平均工资最低的 job

55,删除 7369 号员工所在部门中工资最低的那个员工.

56,创建emp3表,结构与employee相同。创建时在job上添加非空约束,在ename上添加唯一约束,在deptno上添加外键约束,约束指向dept表的deptno。

57,同上创建emp4表,建表时建立在deptno上添加外键约束,约束指向dept表的deptno。同时,指定该约束在级联删除主键时,不级联删除外键的数据。

58,查询员工表中 salary 前 10 名的员工信息

59,查询员工表中 salary 在10 - 20 名的员工信息。

60,对员工表内容根据salary排序后,进行分页查询,每页3条。

–定义函数 —— 通过雇员编号查找此雇员的月薪
create or replace function get_sal_fun(p_eno emp.empno%type)
return number
as
v_sal emp.sal%type ;
begin
select sal + nvl(comm,0) into v_sal from emp where empno=p_eno ;
if v_sal then
return v_sal;
end;

if v_t=0 then
dbms_output.put_line(‘没有此部门!’);
else
select loc into v_loc from dept where deptno=i_deptno;
select count(*) into v_count from emp where deptno=i_deptno;
if v_count > 0 then
i_deptno := 60;
else
i_deptno := 88;
end if;
end if;

–调用
declare
v_sal number;
begin
v_sal := get_sal_fun(7788) ;
dbms_output.put_line(‘雇员7788的工资为:’ || v_sal) ;

end ;
–通过SQL调用函数
select get_sal_fun(7788) from dual

你可能感兴趣的:(oracle)