ORACLE SQL子查询

学习oracle已经有一段时间了,今天开始准备记录一下某些知识点以及自己的心得,方便加深理解以及回顾自己的努力,希望自己可以坚持下去。

 使用子查询的两种情况:

1.一条查询语句的查询条件依赖另外一条查询语句的查询结果。比如查询公司里工资比某个人高的员工 ,这里某个人的工资就是条件。

SELECT * FROM EMP WHERE SAL>(SELECT * FROM EMP WHERE ENAME='XXX');

2.需要对查询结果作为另一个表再次进行查询。这个想不出来怎么比如 = =  反正放到from子句里就是了

子查询分为单行子查询,多行子查询,多列子查询。分别使用=和in以及(xx,xxx) in,可以放在几乎所有子句中,包括select、here 、having 、order by等。灵活使用即可。

哈哈哈哈哈  第一次记录并且分享自己的知识 感觉有点怪 但还是要坚持下去,希望能多记录一些有价值的东西(感觉今天的就不太有价值,毕竟第一次嘛  也没学多久 理解一下)。

记录一下自己写的一段觉得比较复杂的查询语句,用了N个查询以及表连接,可以说是毕生所学了。虽然能实现结果,但总觉得非常冗余,希望自己学完优化或者更熟练后能改过来。

 查询没学过湛燕老师课的同学的学号、姓名

select s.sname,s.sno
from student s where (s.sname,s.sno) not in
(select s.sname,s.sno
        from (select s.sno,s.sname,t.tname 
                     from student s
                     join sc
                     on s.sno=sc.sno
                     join course c
                     on sc.cno=c.cno
                     join teacher t
                     on c.tno=t.tno) s 
        where s.tname='谌燕' group by s.sname,s.sno);

相关子查询

在内层使用where将内外层的相关条件相同,与非相关子查询不同的是  前者需要重复执行子查询,每满足一个条件则输出一条数据

--查询员工中大于本部门平均工资的员工姓名
select ename,sal,deptno
from emp e1
where sal>(
           select avg(sal) 
           from emp 
           where deptno=e1.deptno);

--查询存在在dept中且不存在emp表中的部门      
select * 
from dept d
where not exists (
             select * from emp
             where emp.deptno=d.deptno
             ) ;

--相关子查询实现更新
CREATE TABLE EMP_111 AS SELECT * FROM DEPT;

ALTER TABLE EMP_111 ADD(DNAME VARCHAR2(20));

UPDATE EMP_111 SET DNAME=(
                          SELECT DNAME 
                          FROM DEPT
                          WHERE EMP_111.DEPTNO=DEPT.DEPTNO);

WITH子句:避免重复使用相同语句 。感觉自己上面那个题有希望了

/*WITH子句*/
WITH SMITH_SAL AS(
                  SELECT SAL 
                  FROM EMP
                  WHERE ENAME='SMITH')

SELECT ENAME,SAL
FROM EMP
WHERE SAL> (
      SELECT SAL FROM SMITH_SAL
 );
 
--查询公司中各部门的总工资大于公司中各部门的平均工资的部门信息

with 
sum_sal as (
select d.dname,sum(sal) sum1 from emp e,dept d
where e.deptno=d.deptno  group by d.dname),

avt_sal as(
select sum(sum1)/count(1) avg1 from sum_sal
)
select *
from sum_sal
where sum1>(select avg1 from avt_sal)

看来目前是没啥希望 一是我觉得用不上  二是我也没听太懂


版权声明:本文为m0_59799986原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。