您的位置:首页 > 其它

相关子查询和非相关子查询

2013-07-14 18:31 155 查看
1.非相关子查询(嵌套子查询)

一个select...From...Where查询语句块可以嵌套在另一个select...From...Where查询块的Where子句中,称为嵌套查询。外层查询称为父查询,主查询。内层查询称为子查询,从查询。
子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。

---------------------------------------

建表
create table xscj /*学生成绩表*/
(
cjid NUMBER(4) not null,
xsbh VARCHAR2(10) not null, /*学生编号 关联学生表*/
fs number(3) default 0 /*分数*/
)

alter table xscj add constraint PK_xscj primary key (cjid);

create table student /*学生表*/
(
xsid NUMBER not null,

xsbh VARCHAR2(10) not null, /*学生编号*/
xsname VARCHAR2(10) not null /*学生姓名*/
)

alter table student add constraint PK_student primary key (xsid);
---------------------------------------------------------------------------

添加数据
select * from student;
insert into student values (1,'001','小张三');
insert into student values (2,'002','小李四');
insert into student values (3,'003','小王五');
insert into student values (4,'004','小赵六');
--------------------------------
select * from xscj;

insert into xscj values(1,'001',95);

insert into xscj values(2,'002',90);
insert into xscj(cjid,xsbh) values(3,'003');
  update xscj set fs='85' where cjid=3;
insert into xscj values(4,'004',80);

-------------------------------------------------------------------------

我要查询 分数 大于等于 学生编号是'003' 的分数 的所有学生成绩信息
select * from xscj where fs>=(select fs from xscj where xsbh='003');

2. 查询 员工表中每一个部门的最高基本工资的员工资料

select * from emp ;
select deptno from emp group by deptNo; --3个部门
select max(sal),deptNo from emp group by deptNo; 2850--30, 3000--20, 5000--10;

用到相关子查询

select * from emp a where sal =(select max(sal) from emp b where b.deptno = a.deptno) order by deptno ;

-----------------------------------------------

相关子查询中使用到 exists

  查询员工表emp中 在部门表中没有的员工
select * from emp e where exists (select 1 from dept where dept.deptno=e.deptno);

-------------------------

在select 中使用相关子查询

a.在员工表和部门表中检索出所有部门的 部门名称和每个部门的基本工资总和

select dname ,(select sum(sal) from emp b where b.deptno=a.deptno) salsum from dept a ;

select * from emp;
select * from dept;
select sum(sal) from emp where deptno=10

结果集:

DNAME SALSUM
-------------- ----------
ACCOUNTING 8750
RESEARCH 10875
SALES 9400
OPERATIONS

b.查询每个部门的员工人数

select dname,( select count(*) from emp b where b.deptno= a.deptno) as rs from dept a;

结果集:

DNAME RS
-------------- ----------
ACCOUNTING 3
RESEARCH 5
SALES 6
OPERATIONS 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: