欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

where,insert,delete,update,select子查询,关联子查询,分页查询,集合查询

程序员文章站 2022-06-01 17:06:58
...

子查询

高级查询:子查询(出现多个select)

where子句中使用子查询

查询和SMITH在同一个部门的员工信息

select * from emp where deptno=

(

select deptno from emp where ename='SMITH'

);

查询比SCOTT工资高的

select * from emp where sal>

(

select sal from emp where ename=‘SCOTT’

);

查询跟10号部门工资一样的

select * from emp where sal=

(

select sal from emp where deptno=10

);此方法肯定不对,用了关系用算符,结果只能是一个

子查询返回结果不止一行

解决方法:(= —— in > —— any(some)、all)

select * from emp where sal in

(

select sal from emp where deptno=10

);

查询比10号部门工资高的

select * from emp where sal >

any(

select sal from emp where deptno=10

);查询出比10号部门任意(最低)工资高

select * from emp where sal >

all(

select sal from emp where deptno=10

);查询出比10号部门所有人工资高

查询和SMITH在同一部门同一职位的员工

select * from emp where deptno=(select deptno from emp where ename=‘SMITH’)and job=(select job from emp where ename=‘SMITH’);

select * from emp where(deptno,job)=(select deptno,job from emp where ename=‘SMITH’);

insert 子句中使用子查询

insert into exam values((select stuid from student where stuname=‘里斯’),‘JAVA’,88);

delete子句中使用子查询

delete from emp where deptno=(select deptno from dept where loc=‘NEW YORK’);

delete from emp where deptno in(select deptno from dept where loc=‘NEW YORK’);

update子句中使用子查询

update emp set sal=sal+100 where deptno in(select deptno from dept where loc=‘NEW YORK’);

select子句中使用子查询

select ename,job,(select dname from dept where deptno=emp.deptno) as 部门 from emp;

查平均工资

select ename,job,sal(select avg(sal) from emp) as 平均工资 from emp;

select ename,job,sal,(select avg(sal) from emp where deptno=e.deptno) as 部门平均工资 from emp e;

关联子查询

查询比本部门的平均工资高的员工工资

select * from emp e where sal>(select avg(sal) from emp where deptno=e.deptno);

一个查询结果可以当作一个临时表,从临时表中查询数据,可以将临时表和其他表做联合查询

分页查询⭐

rownum行号

每页5行,显示第一页

不能写大于2的条件

select * from emp where rownum<=5;

按工资排序再取前5个

select t.* ,rownum from(

select * from emp order by sal

)t where rownum<=5;

查看第二页

select* from(

select t.* ,rownum as rn from(

select * from emp order by sal

)t

)t2 where t2.rn between 6 and 10;

row_number行号

select emp.*,row_number() over(order by sal asc) as rn from emp;

分页

select* from(

select emp.*,row_number() over(order by sal asc) as rn from emp;

)t2 where t2.rn between 6 and 10;

查询每个部门中工资最高的员工的信息

方法1

select * from emp

inner join(

select deptno,max(sal) as maxsal from emp group by deptno)t

on emp.deptno=t.deptno and emp.sal=t.maxsal;

方法2

select * from emp

where (deptno,sal) in

(

select deptno,max(sal) as maxsal from emp group by deptno

)

集合查询

并集

union

union all

合并可以是两个表

select * from emp where sal>2000

union

select * from emp where ename like ‘S%’;

查员工的名字,工资,职位,另一个表dname,平均工资

select ename,sal,job from emp

union

select dname,’’,avg(sal) from dept inner join emp on emp.deptno=dept.deptno group by dname;

交集

intersect

两个条件都满足

select * from emp where job=‘CLERK’

intersect

select * from emp where sal>2000;

差集

minus

从第一个结果中剪掉第二个结果剩下的

select * from emp wher deptno=10

minus

select * from emp where sal<2000;