0
点赞
收藏
分享

微信扫一扫

Oracle复习----总结大三上学期的结束

程序员伟杰 2022-02-25 阅读 39
oracle

目录

Oracle连接查询

Oracle子查询

在where语句中使用子查询,也就是在where语句中加入select语句

在from语句中使用子查询,也就是在from语句中加入select语句

在select语句中使用子查询,也就是在select语句中加入select语句

Oracle中union和minus的用法

Oracle Rownum用法

Oracle添加、修改和删除

事务

事务中存在一些概念

创建视图

Oracle练习题


Oracle连接查询

SQL92语法

连接查询:也可以叫跨表查询,需要关联多个表进行查询。

1. 显示每个员工信息,并显示所属的部门名称

指定连接条件

select ename, dname from emp, dept where emp.deptno=dept.deptno;
也可以使用别名(但是不能增加as关键字)
select ename, dname from emp a, dept b where a.deptno=b.deptno;

以上结果输出正确,因为加入了正确的连接。

以上查询也成为“内连接”,指查询相等的数据。

2. 取得员工和所属的经理的姓名

select a.ename, b.ename from emp a, emp b where a.mgr=b.empno;

以上称为“自连接”,只有一张表连接,具体的查询方法,把一张表看作两张表即可,如以上示例:第一个表emp a代码了员工表,emp b代表了经理表,相当于员工表和部门表一样。

sql99语法

 (内连接)显示薪水大于2000的员工信息,并显示所属的部门名称

采用sql99语法:
select ename, dname from emp a join dept b on a.deptno=b.deptno where sal>2000;
或
select ename, dname from emp a inner join dept b on a.deptno=b.deptno where sal >2000;
注释:inner关键字一般省略
采用sql92语法:
select ename, dname from emp a, dept b where a.deptno=b.deptno and sal>2000;

Sql92语法和sql99语法的区别:99语法可以做到表的连接和查询条件分离,特别是多个表进行连接的时候,会比sql92更清晰。

 (外连接)显示薪水大于2000的员工信息,并显示所属的部门名称,如果某一个部门没有员工,那么该部门也必须显示出来。

(关联的2个表存在主从关系的话,那么如果主表在join的左边,就使用左连接,如果在join的右边,就使用右连接)

右连接
select a.ename, b.dname from emp a right join dept b on a.deptno=b.deptno;
同样可以使用左联接
select a.ename, b.dname from dept b left join emp a on a.deptno=b.deptno;

左联接和右连接都是外连接,左连接以左面的表为准和右边的表比较,和右面表相等的不相等都会显示出来,右连接恰恰相反,以上左连接和右连接也可以加入outer关键字,但一般不建议这种写法。

左连接能完成的功能右连接一定可以完成

使用SQL92语法完成左连接,右连接的相关查询:

使用(+) ,放在主表的对面

3. 取得员工和所属的经理的姓名,如果没有上级经理,也要查询出来:

select e.empno, e.ename, e.mgr, m.ename from emp m , emp e where m.empno(+) = e.mgr ;

 

Oracle子查询

子查询就是嵌套的select语句,可以理解为子查询是一张表。

在where语句中使用子查询,也就是在where语句中加入select语句

1、查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名

select empno, ename from emp where empno in(select distinct mgr from emp);

实现思路:

● 先查询出管理者的编号,另外取出重复记录

select distinct mgr from emp where mgr is not null;

● 查询包含管理者编号的员工

select empno, ename from emp where empno in(select distinct mgr from emp where mgr is not null);

2、查询哪些人的薪水高于员工的平均薪水,需要显示员工编号,员工姓名,薪水实现思路

● 首先取得平均薪水

select avg(sal) from emp;

● 取得大于平均薪水的员工

select empno, ename, sal from emp where sal>(select avg(sal) from emp);

分析思路:首先根据文字描述找出被依赖的条件,逐次分析。

在from语句中使用子查询,也就是在from语句中加入select语句

在from后面加入子查询,可以直接理解为一张表。

1、查询各个部门的平均薪水所属等级,需要显示部门编号,平均薪水,等级编号实现思路

● 首先取得部门的平均薪水

select deptno, avg(sal) avg_sal from emp group by deptno;

● 将平均薪水,作为一张表和等级表比较

select a.deptno, a.avg_sal, b.grade 
from (select deptno, avg(sal) avg_sal from emp group by deptno) a, salgrade b 
where a.avg_sal between b.losal and b.hisal;

关键点:将子查询看作一张表。

在select语句中使用子查询,也就是在select语句中加入select语句

1、查询员工信息以及部门名称

select  e.empno, e.ename, e.deptno, (select dname from dept where deptno = e.deptno) as dname from emp e;

 

Oracle中union和minus的用法

union可以合并集合(相加)

select * from emp where job='MANAGER'
union
select * from emp where job='SALESMAN'

Union在某些场合下相当于or或in,等同于如下代码:

select * from emp where job in('MANAGER','SALESMAN');或select * from emp where job='MANAGER' or job='SALESMAN';

不是所有的查询语句都可以进行union操作。

select * from emp union select * from dept;

使用union必须保证查询的结果集包含相同的列数。

select empno, ename from emp
union
select deptno, dname from dept

使用unoin必须保证查询结果的字段含义相同。

使用unoin必须保证查询结果的字段的数据类型相同。

minus可以移出集合(相减)

● 查询部门编号为10和20的,去除薪水大于2000的(第一种方法)

select * from emp where deptno in(10, 20) and sal <=2000;

● 查询部门编号为10和20的,去除薪水大于2000的(第二种方法,使用minus) 

select * from emp where deptno in(10, 20)
minus
select * from emp where sal>2000

 

Oracle Rownum用法

Oracle提供了rownum,rownum是一个隐含的(查询结果集)字段,rownum是一个行号,从1开始。

rownum隐含字段

select rownum, a.* from emp a;

取得前5条数据

select * from emp where rownum <=5;

取得大与第5条的所有数据

select * from emp where rownum >5;

以上语句,oracle不支持,oracle只支持rownum小于或小于等于的运算, 不支持大于或大于等于的运算。

取得薪水最好的前5名

select rownum, empno, ename, sal from emp where rownum<=5 order by sal desc;

因为采用order by不会改变rownum,rownum的值在数据插入到表中时已经形成,正确使用的方式,将排序好的数据作为一张表来使用,这样这个表的rownum是新形成的,所以可以保证它的顺序是正确的,如下:

select empno, ename, sal 
from (select empno, ename, sal from emp order by sal desc)
where rownum <=5

采用rownum进行分页

分页主要是为了提高效率,一般采用数据库的机制比较多,主要从数据库表中定位记录的开始位置和结束位置,如每页两条数据:

第一页:记录1~2

第二页:记录3~4

。。。。。。。

因为rownum存在问题,所以需要采用三层的select嵌套完成分页,嵌套的目的将rownum转换成我们自己的字段,如:

select empno, ename, sal
from 
(
 select rownum r, empno, ename, sal 
 from 
  (
   select empno, ename, sal from emp order by sal desc
  )    
  where rownum <=5 
)where r>0

通用的分页方法,使用的时候可以直接拷贝。只需要修改红色字体的部分就可以了。

select *
from 
(
 select rownum r, t.* 
 from 
  (
    任意的SQL语句
  )  t  
  where rownum <=结尾的行号 
)where r>开始的行号

 

Oracle添加、修改和删除

insert

添加、修改和删出都属于DML,主要包含的语句:insert、update、delete。

● Insert语法格式

Insert into 表名(字段,。。。。) values(值,………..)

● 省略字段的插入

insert into emp values(9999, 'zhangsan', 'MANAGER', NULL, NULL, 200, 100, 10);

不建议使用此种方式,因为当数据库表中的字段位置发生改变的时候会影响到insert语句。

● 指定字段的插入(建议使用此种方式)

SQL> insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(9999, 'zhangsan', 'MANAGER', NULL, NULL, 200, 100, 10);
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(9999, 'zhangsan', 'MANAGER', NULL, NULL, 200, 100, 10)
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP)

● 主键不能重复

insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(8887, 'zhangsan', 'MANAGER', null, sysdate, 200, 100, 10);

insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(8888, 'zhangsan', 'MANAGER', null, to_date('2001-01-01', 'yyyy-mm-dd'), 200, 100, 10);

注意sysdate或to_date

● 表内容的复制

create table emp_bak as select * from emp;

以上的语句会自动创建一张表,将所有的数据复制到新表中,但是不能将表的约束条件进行复制,比如:主键约束。

● 如何将查询的数据直接放到已经存在的表中,可以使用条件?

insert into emp_bak select * from emp where job='MANAGER';

update

可以修改数据,可以根据条件修改数据。

● 语法格式:

update 表名 set 字段名称1=需要修改的值1, 字段名称2=需要修改的值2 where …….

● 将job为manager的员工的工资上涨10%

update emp set sal=sal+sal*0.1 where job='MANAGER';

delete

可以删除数据,可以根据条件删除数据。

● 语法格式:

Delete from表名 where 。。。。。

● 删除津贴为300的员工

delete from emp where comm=300;

● 删除津贴为null的员工

delete from emp where comm is null;

事务

事务可以保证多个操作原子性,要么全成功,要么全失败。对于数据库来说事务保证批量的sql要么全成功,要么全失败。事务具有四个特征ACID:

1、原子性(多个操作)

2、一致性(数据的状态)

3、隔离性

4、持续性

事务中存在一些概念

1、事务(Transaction):一批操作(一组sql)

2、开启事务(Begin Transaction)

3、回滚事务(rollback Transaction)--Oracle---rollback

4、提交事务(commit transaction)----Oracle--commit

当执行DML语句是其实就是开启一个事务。

关于事务的回滚需要注意:只能回滚insert、delete和update语句,不能回滚select(回滚select没有任何意义),对于create、drop、alter这些无法回滚。

为什么使用视图?,因为需求决定以上语句需要在多个地方使用,如果频繁的拷贝以上代码,会给维护带来成本,视图可以解决这个问题。

创建视图

create view v_dept_avg_sal as select a.deptno, a.avg_sal, b.grade from (select deptno, avg(sal) avg_sal from emp group by deptno) a, salgrade b where a.avg_sal between b.losal and b.hisal;

出现错误,权限不够,如何查询某个用户拥有的权限?

select * from session_privs;

如何切换用户?

conn system/bjpowernode

如何让scott以dba的角色登陆?

conn scott/tiger as sysdba

如何对scott用户授权?

切换到system用户
conn system/bjpowernode
在system用户下为scott授权,授予scott创建视图的权利
grant create view to scott;
再次切换到scott用户下,查看是否拥有创建视图的权利
conn scott/tiger
select * from session_privs;

Scott用户已经拥有了创建视图的权利。

如何使用视图?

视图的使用和表的使用是一致,但是视图不能进行增删改,因为视图是表的结果,采用视图主要是为了操作的方便性,重复使用的结果集考虑建成视图,创建视图,一般是对不经常修改的表创建的。

删除视图

drop view V_DEPT_AVG_SAL;

Oracle练习题

1、取得每个部门最高薪水的人员名称

第一步:取得每个部门的最高薪水

select deptno, max(sal) maxSal from emp group by deptno

第二步:获取结果

select ename, sal, e.deptno from emp e join ( select deptno, max(sal) maxSal from emp group bydeptno) t on e.deptno = t.deptno and e.sal = t.maxSal

2、哪些人的薪水在部门的平均薪水之上

第一步:获取每个部门的平均薪水

select deptno, avg(sal) avgSal from emp group by deptno

第二步:获取结果

select ename, sal from emp e join (select deptno, avg(sal) avgSal from emp group by deptno) t on e.deptno = t.deptno and e.sal > t.avgSal

3、取得部门中(所有人的)平均的薪水等级,如下:

第一步:获取每个员工的薪水等级

select deptno, grade from emp e join salgrade g on e.sal between g.LOSAL and g.HISAL

第二步:将第一步的结果用部门编号进行分组,得到结果

select deptno, avg(grade) from (select deptno, grade from emp e join salgrade g on e.sal between g.LOSAL and g.HISAL) group by deptno

4、不准用组函数(Max),取得最高薪水(给出两种解决方案)

第一种(rownum):

● 将员工薪水降序排列

select * from emp order by sal desc

● 取得查询结果的第一条数据

select sal from ( select * from emp order by sal desc) where rownum = 1

第二种(自关联)

● 将Emp表当成2张表来用,进行比较,得到最大值以外的值。

select distinct e.sal from emp e join emp t on e.sal < t.sal

● 获取最大薪水

select sal from emp where sal not in (select distinct e.sal from emp e join emp t on e.sal < t.sal)

5、取得平均薪水最高的部门的部门编号(至少给出两种解决方案)

第一种:

select * from (select deptno from emp group by deptno order by avg(sal) desc) where rownum = 1

第二种:

● 获取每个部门的平均薪水

select deptno, avg(sal) from emp group by deptno

● 取得查询结果的最高数据

select max(avgSal) from (select deptno, avg(sal) avgSal from emp group by deptno)

● 取得结果

select deptno from (select deptno, avg(sal) avgSal from emp group by deptno) s join (select max (avgSal) maxAvgSal from (select deptno, avg(sal) avgSal from emp group by deptno)) t on s.avgSal = t.maxAvgSal

第三种(聚合函数可以嵌套使用)

select deptno from emp group by deptno having avg(sal) = (select max(avg(sal)) from emp group by deptno);

6、取得平均薪水最高的部门的部门名称

● 参考上一题的结果(取得部门编号)

select deptno from emp group by deptno having avg(sal) = (select max(avg(sal)) from emp group by deptno);

● 取得部门名称

Select dname from dept where deptno = (select deptno from emp group by deptno having avg(sal) = (select max(avg(sal)) from emp group by deptno))

7、求平均薪水的等级最低的部门的部门名称

第一步:取得每个部门的平均薪水

select deptno, avg(sal) avgSal from emp group by deptno

第二步:获取每个部门的平均 薪水等级

select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal

第三步:取得最低的等级

select min(grade) from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal)

第四步:获取部门编号

Select deptno from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal) where grade = (select min(grade) from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal))

第五步:取得部门名称

Select dname from dept where deptno in (Select deptno from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal) where grade = (select min(grade) from (select deptno, avgSal, grade from salgrade g join ( select deptno, avg(sal) avgSal from emp group by deptno ) t on t.avgSal between g.losal and g.hisal)))

8、取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的经理人姓名

第一步:取得所有经理的员工编号

select distinct mgr from emp where mgr is not null

第二步:取得普通员工的最高薪水

Select max(sal) maxSal from emp where empno not in (select distinct mgr from emp where mgr is not null )

第三步:获取结果

select ename , sal from emp where empno in (select distinct mgr from emp where mgr is not null) and sal > (Select max(sal) maxSal from emp where empno not in (select distinct mgr from emp where mgr is not null ))

9、取得薪水最高的前五名员工

select *
from 
(
 select rownum r, t.* 
 from 
  (
    Select ename, sal from emp order by sal desc
  )  t  
  where rownum <=5 
)where r>0

10、取得薪水最高的第六到第十名员工

select *
from 
(
 select rownum r, t.* 
 from 
  (
    Select ename, sal from emp order by sal desc
  )  t  
  where rownum <=10 
)where r>5

11、取得最后入职的5名员工

Select * from ( select ename, hiredate from emp order by hiredate desc ) where rownum <= 5 

 

12、取得每个薪水等级有多少员工

第一步:取得每个员工的薪水等级

select empno, ename, grade from emp e join salgrade g on e.sal between g.losal and g.hisal

第二步:根据等级进行分组,然后取得数量

select grade, count(*) from (select empno, ename, grade from emp e join salgrade g on e.sal bet ween g.losal and g.hisal) group by grade

有3个表S,C,SC

S(SNO,SNAME)代表(学号,姓名)

C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)

SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)

问题:

第一题:找出没选过“黎明”老师的所有学生姓名。

第二题:列出2门以上(含2门)不及格学生姓名及平均成绩。

第三题:即学过1号课程又学过2号课所有学生的姓名。

请用标准SQL语言写出答案,方言也行(请说明是使用什么方言)。

CREATE TABLE SC
(
  SNO      VARCHAR2(200 BYTE),
  CNO      VARCHAR2(200 BYTE),
  SCGRADE  VARCHAR2(200 BYTE)
);

CREATE TABLE S
(
  SNO    VARCHAR2(200 BYTE),
  SNAME  VARCHAR2(200 BYTE)
);

CREATE TABLE C
(
  CNO       VARCHAR2(200 BYTE),
  CNAME     VARCHAR2(200 BYTE),
  CTEACHER  VARCHAR2(200 BYTE)
);

INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '1', '语文', '张'); 
INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '2', '政治', '王'); 
INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '3', '英语', '李'); 
INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '4', '数学', '赵'); 
INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '5', '物理', '黎明'); 
commit;
 
INSERT INTO S ( SNO, SNAME ) VALUES ( '1', '学生1'); 
INSERT INTO S ( SNO, SNAME ) VALUES ( '2', '学生2'); 
INSERT INTO S ( SNO, SNAME ) VALUES ( '3', '学生3'); 
INSERT INTO S ( SNO, SNAME ) VALUES ( '4', '学生4'); 
commit;
 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '1', '40'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '2', '30'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '3', '20'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '4', '80'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '5', '60'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '1', '60'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '2', '60'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '3', '60'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '4', '60'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '5', '40'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '3', '1', '60'); 
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '3', '3', '80'); 
commit;

问题一:找出没选过“黎明”老师的所有学生姓名。

第一步:求出黎明老师教授的课程编号

Select cno from c where CTEACHER =  '黎明'

第二步:查询选择黎明老师的课程的学生编号

select sno from sc where cno in (Select cno from c where CTEACHER =  '黎明')

第三步,得到结果

select sname from s where sno not in ( select sno from sc where cno in (Select cno from c where CTEACHER =  '黎明'))

问题二:列出2门以上(含2门)不及格学生姓名及平均成绩。

第一步:获取2门以上(含2门)不及格的学生编号

select sno from sc where sc.SCGRADE < 60 group by sno having count(*) >= 2

第二步:获取每个同学的平均成绩

Select sno, avg(scgrade) avgGrade from sc group by sno

第三步: 获取结果

Select sname, avgGrade from s join (select sno from sc where sc.SCGRADE < 60 group by sno having count(*) >= 2) n on s.sno = n.sno join (Select sno, avg(scgrade) avgGrade from sc group by sno) g on n.sno = g.sno

问题三:即学过1号课程又学过2号课所有学生的姓名。

第一步:查询选择过1号课程和2号课程的学生编号

Select sno from sc where cno='1' and sno in ( select sno from sc where cno='2' )

第二步:获取结果

Select sname from s where sno in (Select sno from sc where cno='1' and sno in ( select sno from sc where cno='2' ))

14、列出所有员工及直接上级的姓名

(99语法)Select e.ename, nvl(m.ename, '没有上级') as mname from emp e left join emp m on e.mgr = m.empno 
(92语法) Select e.ename, nvl(m.ename, '没有上级') as mname from emp e, emp m where e.mgr = m.empno(+)

15、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称

select e.empno, e.ename, d.dname from emp e join emp m on e.mgr = m.empno and e.hiredate < m.hiredate join dept d on e.deptno = d.deptno

16、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

Select d.dname, e.* from emp e right join dept d on e.deptno = d.deptno

17、列出至少有一个员工的所有部门

Select dname, count(*) from emp e join dept d on e.deptno = d.deptno group by dname

Select dname, count(e.empno) from emp e right join dept d on e.deptno = d.deptno group by dname having count(e.empno) > 0

 18、列出薪金比"SMITH"多的所有员工信息

select * from emp where sal > (select sal from emp where ename = 'SMITH')

19、列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数

第一步:获取工作岗位是CLERK的员工信息

Select deptno, ename from emp where job = 'CLERK '

第二步:获取部门名称

select ename ,dname from dept d join (Select deptno, ename from emp where job ='CLERK') t on t.deptno = d.deptno

第三步:取得每个部门的人数

Select dname, count(*) from emp e join dept d on e.deptno = d.deptno group by dname

第四步:获取结果

Select ename, d.dname, cc from (select ename ,dname from dept d join (Select deptno, ename from emp where job ='CLERK') t on t.deptno = d.deptno) d join (Select dname, count(*) cc from emp e join dept d on e.deptno = d.deptno group by dname) c on d.dname = c.dname

20、列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数

第一步:获取最低薪水大于1500的工作

Select job from emp group by job having min(sal) > 1500

第二步:取得每种工作岗位的员工数量

Select job ,count(*) from emp group by job

第三步:获取结果

Select j.job, cc from (Select job from emp group by job having min(sal) > 1500) j join (Select job ,count(*)  cc from emp group by job) c on j.job = c.job

21、列出在部门"SALES"<销售部>工作的员工的姓名,假定不知道销售部的部门编号

22、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级

第一步 获取公司的平均薪水

Select avg(sal) from emp

第二步 获取大于平均薪水的员工

Select * from emp where sal > (Select avg(sal) from emp)

第三步 和部门表进行关联

Select ename, dname from (Select * from emp where sal > (Select avg(sal) from emp)) t join dept d on t.deptno = d.deptno 

第四步 和经理表关联

Select t.ename, d.dname, m.ename as mname  from (Select * from emp where sal > (Select avg(sal) from emp)) t join dept d on t.deptno = d.deptno left join emp m on t.mgr = m.empno

第五步 和等级关联

Select t.ename 姓名, d.dname 部门名称, nvl(m.ename, '无') 上级经理, grade 工资等级  from (Select * from emp where sal > (Select avg(sal) from emp)) t join dept d on t.deptno = d.deptno left join emp m on t.mgr = m.empno join salgrade g on t.sal between g.losal and g.hisal

23、列出与"SCOTT"从事相同工作的所有员工及部门名称

Select e.ename, d.dname from emp e join dept d on e.deptno = d.deptno where job = (Select job from emp where ename = 'SCOTT')

24、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金

第一步 获取部门是30的所有员工薪水

select sal from emp where deptno = 30

第二步 获取结果

Select ename, sal from emp where sal in (select sal from emp where deptno = 30)

25、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金.部门名称

select ename, sal, dname from emp e join dept d on e.deptno = d.deptno where sal >  (select max (sal) maxSal from emp where deptno = 30)

26、列出在每个部门工作的员工数量,平均工资和平均服务期限

Select d.dname 部门名称, count(e.empno) 员工数量, round(avg(e.sal), 2) 平均薪水, round(avg(sysdate-hiredate)/365,0) 服务期限 from emp e, dept d where e.deptno = d.deptno group by d.dname

27、列出所有员工的姓名、部门名称和工资

Select ename, dname, sal from emp e, dept d where e.deptno = d.deptno

28、列出所有部门的详细信息和人数

Select d.*, (select count(e.empno) from emp e where e.deptno = d.deptno) 人数 from dept d

30、列出各个部门的MANAGER(经理)的最低薪金

select deptno, min(sal) from (select deptno, sal, empno from emp where empno in (Select distinct mgr from emp where mgr is not null)) group by deptno

32、查出某个员工的上级主管,并要求出这些主管中的薪水超过3000

select ename 主管, sal 主管工资 from emp where empno in (Select distinct mgr from emp where mgr is not null) and sal > 3000

33、求出部门名称中,带'S'字符的部门员工的工资合计、部门人数

select deptno from dept where dname like '%S%'
select d.dname, sum(e.sal), count(e.empno) from emp e right join dept d on e.deptno = d.deptno group by d.dname having d.dname like '%S%'

34、给任职日期超过28年的员工加薪10%

Update emp set sal = sal*1.1 where (months_between(sysdate, hiredate)/12) > 28
举报

相关推荐

0 条评论