-----------------------------------------------子查询
--1,单行子查询
--查看工资高于工号为7566员工的所有员工信息
select * from emp
where sal>(select sal from emp where empno=7566);
--2,子查询空值、多值问题
--如果子查询未返回任何行,则主查询也不会返回任何结果
select * from emp where sal>nvl((select sal from emp where empno =8888),0);
select nvl((select sal from emp where empno =8888),0) from dual;
--3,如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符
select * from emp where sal>(select sal from emp where empno=7566);
--4,如果子查询返回赴欧行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符
--5,多行子查询
select * from emp where sal > any(select avg(sal) from emp group by deptno);
select * from emp where sal > all(select avg(sal) from emp group by deptno);
select * from emp where job in(select job from emp where ename = 'MARTIN' or ename = 'SMITH');
--6,TopN查询
select * from emp where rownum = 1 or rownum = 2;
select * from (select * from emp order by sal desc) where rownum <=5;
--7,分页查询
select * from (select rownum no,e.* from
(select * from emp order by sal desc )e
where rownum<=5) where no>3;
select * from (select rownum no,e.* from
(select * from emp order by sal desc) e )
where no>3 and no<=5;
--8,exists的执行流程
select * from t1 where t1 where exists (select null from t2 where y=x)
--可以理解成
for x in(select * from t1)
loop
if(exists(select null from t2 where y=x))
then
output the record
end if
end loop
--对于in和exists的性能区别:
--如果子查询独处的结果集记录较少,主要查询中格的表较大且又有索引时应该用in,
--反之若果外层的猪查询记录较少,子查询种的表大,又有索引时使用exists
--区分in和exists 主要是造成了驱动顺序的改变(这是性能变化的关键),如果是
--exists,那么以外层表为驱动表,先被访问,如果是in那么先执行子查询,所以我们会以
--驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了另外in是不对null进行处理
--如 select 1 from dual where null in (0,1,1,null);
--练习
--1,列出员工表中每个部门的员工数,和部门no
select deptno,count(*) from emp group by deptno;
--2,列出员工表中每个部门的员工数(员工数必须大于3),和部门名称
select d.*,ed.cou from dept d,
(select deptno,count(*) cou from emp group by deptno having count(*)>3) ed where d.deptno=ed.deptno;
--3,找出工资比jones高的员工
select * from emp where sal>=(select sal from emp where lower(ename)='jones')
--4,列出所有员工的姓名和其上级的姓名
select e1.ename as lower,e2.ename as upper from emp e1,emp e2 where e1.mgr=e2.empno;
select e1.ename,e1.job,e2.ename,e2.job from emp e1,emp e2 where e1.mgr=e2.empno;
--5,以职位分组,找出平均工资最高的两种职位
select * from (select job,avg(sal) a from emp group by job order by a desc) where rownum <3;
--6,查找不在部门20,且比部门20中任何一个人工资都高的员工姓名
select ename,sal from emp join (select min(sal) m from emp where deptno = 20) a on emp.deptno <> 20 and a.m<emp.sal
--7,得到平均工资大于2000的工作职种
select * from (select job,avg(sal) a from emp group by job) b where b.a>2000 order by b.a desc
--8,分部门得到工资大于2000的所有员工的平均工资,并且平均工资还要大于2500
select deptno,avg(sal),count(*) 部门工资大于2000的人数 from emp where sal >2000 group by deptno
select deptno,avg(sal) from emp group by deptno
select sal from emp where deptno = 30;
--9,得到每个月工资总数最多的那个部门的部门编号,名称,部门所在地,工资总数,部门人数
select a.d from (select deptno d,sum(sal) s,count(*) from emp group by deptno order by s desc)a where rownum<2
select * from DEPT join(select * from (select deptno d,sum(sal) s,count(8) from emp group by deptno order by s desc)a where rownum<2)b on dept.deptno = b.d;
select max(sum(sal)) from emp group by deptno
--10,分部门得到平均工资等级为2级(等级表)的部门编号
select b.dno from salgrade sa,(select deptno as dno,avg(sal) as avgsal from emp
group by deptno) b where sa.grade=4 and b.avgsal between sa.losal and sa.hisal;
--11,查找出部门10和部门20中,工资最高的第3名到工资第5名的员工的员工名字,部门名字,部门所在
select * from (select rownum no,e.* from
(select empno,sal,emp.deptno,dname,loc from emp,dept where emp.deptno=dept.deptno and emp.deptno between 10 and 20 order by emp.sal desc) e)
where no between 3 and 5;
--12,查找出收入(工资+奖金),下级比自己上级还高的员工编号,姓名,收入
select empno 工资高于上级的员工的编号,ename 工资高于上级的员工的姓名,sal+nvl(emp.comm,0) 工资高于上级的员工的总收入 from emp join (select empno eno,sal+nvl(emp.comm,0) c from emp) a
on emp.mgr=a.eno and emp.sal+nvl(emp.comm,0)>a.c
--13,查出工资等级不为4级的员工的员工名字,部门名字,部门位置
select emp.deptno,emp.ename,emp.sal from emp,salgrade where sal between losal and hisal and grade<>4
select a.en,dept.dname,dept.loc from dept
join(select emp.deptno d,emp.ename en,emp.sal es from emp,salgrade where sal between losal and hisal and grade<>4
) a on dept.deptno = a.d
--14,查找出职位和MARTIN或者SMITH一样的平均员工的平均工资
select avg(a.sal) from
(select * from emp where job =
(select job from emp where ename='MARTIN') or job = (select job from emp where ename='SMITH'))a;
select avg(sal) from emp where job in(select job from emp where ename = 'MARTIN' or ename = 'SMITH');
select avg(sal) from emp where job in(select job from emp where ename in('MARTIN','SMITH'));
--15,查找不属于任何部门的员工
select * from emp where deptno is null or deptno not in(select deptno from dept);
--16,按部门统计员工数,查出员工数最多的部门中工资第二名到第五名的所有员工信息
select * from(select rownum N,e.* from (select emp.* from emp where deptno =
(select deptno from (select deptno,count(*) c from emp group by deptno order by c desc) where rownum =1)
order by sal desc)e) where N between 2 and 5;
--17,查出king所在部门的部门号\部门名称\部门人数
select a.deptno,dname,a.c from dept join
(select deptno,count(*) c from emp where emp.deptno=(select deptno from emp where ename = 'KING')group by deptno) a on
dept.deptno = a.deptno
--18,查出king所在部门工作年限最大的员工名字
select * from emp where hiredate = (select min(hiredate) from emp where emp.deptno = (select deptno from emp where ename='KING'));
--19,查出工资成本最高的部门的部门编号和部门名称
select emp.deptno,dept.dname from emp,dept
where nvl(emp.mgr,0)+sal = (select max(nvl(emp.mgr,0)+sal) from emp)
and emp.deptno = dept.deptno;
发表评论
-
PL/SQL 经典总结(一)习题
2011-02-21 16:12 1500------------------------------- ... -
PL/SQL 经典总结(一)
2011-02-21 14:48 794------------------------------P ... -
truncate,delete,drop的异同
2011-02-16 09:47 705注意:这里说的delete是指不带where子句的delete ... -
oracle创建表空间 用户授权
2011-02-15 10:42 853SYS用户在CMD下以DBA身份登陆: 在CMD中打sq ... -
oracle 高级查询及相关示例
2011-02-14 17:44 805------------------------------- ... -
oracle 集合查询及相关操作
2011-02-14 16:55 995------------------------------- ... -
oracle 多表查询
2011-02-14 16:54 839------------------------------- ... -
oracle 分组函数及相关测试
2011-02-14 16:52 912------------------------------- ... -
oracle 通用函数及相关测试
2011-02-14 16:50 1454------------------------------- ... -
oracle 数值函数、日期函数、转换函数
2011-02-14 16:47 1174------------------------------- ... -
Oracle 单行函数
2011-02-14 16:44 758------------------------------- ... -
emp表初试
2011-02-14 16:43 840--1,选择部门号30的所有员工 select * from ... -
亚信的数据库面试
2011-02-14 16:39 1408以下示例皆采取scott用户下的系统自带表 ,一切从基础开始 ...
相关推荐
Oracle子查询知识点总结 Oracle子查询是指在SQL语句中嵌套使用SELECT语句,以解决复杂的查询问题。下面是Oracle子查询的知识点总结: 一、子查询的定义和类型 * 子查询是一个完整的SELECT语句,嵌套在另一个...
总结来说,Oracle子查询是数据库查询中的一种强大工具,能够帮助我们处理复杂的查询逻辑,找出满足特定条件的数据。理解并熟练运用子查询是提升SQL技能的关键一步,它使我们能够更有效地从大型数据库中提取信息。
### Oracle 子查询详解 #### 一、子查询概述 在Oracle数据库中,子查询(也称为嵌套查询)是一种非常强大的SQL特性,它允许在一条SQL语句中嵌入另一条查询语句。子查询可以用来解决各种复杂的数据检索问题,特别是...
根据提供的文件信息,我们可以归纳出以下关于Oracle子查询的关键知识点: ### Oracle子查询概述 子查询是指在SQL语句中的一个查询嵌套在另一个查询之中。这种查询方式可以帮助我们更灵活地处理数据,并且能够实现...
Oracle 数据库在处理树形数据结构时,提供了一种强大的查询方法,即 `SELECT...START WITH...CONNECT BY...PRIOR` 语法。这种查询模式允许我们以递归方式遍历和检索具有层级关系的数据,例如组织结构、产品分类或者...
总结,Oracle子查询优化涉及多个方面,包括优化SQL结构、使用合适的索引、合理运用数据库工具和技巧,以及针对特定场景进行查询改写。理解这些最佳实践对于提升数据库性能至关重要。在实际工作中,应根据具体情况...
根据提供的Oracle代码片段,我们可以总结出一系列与Oracle数据库操作相关的知识点。这些知识点涵盖了日期处理、时间转换、数据类型转换等方面的重要功能。下面是针对这些代码片段的详细解释: ### 1. 使用`LAST_DAY...
根据给定的文件信息,我们可以总结出一系列关于Oracle SQL的经典查询练习知识点,这些知识点主要围绕着Oracle数据库中的SQL查询技巧,特别聚焦于“经典查询练手系列”文章中提到的练习题,旨在帮助读者加深对Oracle ...
Oracle数据库学习总结资料.pdf 是一份关于 Oracle 数据库的学习总结资料,涵盖了 Oracle 数据库的各个方面,包括 Oracle 的简介、简单查询、标量函数和算数运算、多表查询、列函数和分组、子查询、表的更新操作、表...
这篇文档"Oracle数据库所有操作总结.doc"主要涵盖了Oracle中的查询语句和其他基本操作,对于熟悉和使用Oracle数据库非常有帮助。以下是对这些知识点的详细解释: 1. **查询语句**:基本的查询语句使用`SELECT`...
4. **子查询与连接的比较**:在某些情况下,子查询可能比连接更高效,反之亦然。文章可能比较了两者在不同场景下的性能表现。 5. **并行查询**:Oracle支持并行执行查询,这可以在大型数据集上提高性能。不过,过度...
进阶的SQL概念有联接(JOIN)、子查询、聚合函数(COUNT、SUM、AVG、MAX、MIN)、分组(GROUP BY)和排序(ORDER BY)等。此外,了解视图(VIEW)和索引(INDEX)的概念和用法也是提高查询效率的关键。 四、Oracle...
3. 查询重构:简化复杂的SQL语句,分解成多个简单查询,或者使用子查询、连接查询的适当组合。 4. 避免排序和聚集操作:这些操作消耗大量资源,可以通过索引或改变查询逻辑来避免。 5. 分区策略:根据业务需求选择...
例如,相关子查询(correlated subqueries)在执行时可能会多次扫描同一数据集,造成不必要的计算开销。 4. 分析和优化表的连接顺序。在复杂的查询中,表的连接顺序会对查询性能产生很大影响。优化器尝试各种可能的...
1. 首先,我们需要为每一种课程类型创建一个子查询,其中每个子查询都会返回姓名和对应的课程成绩。 2. 对于不存在的成绩,我们可以用 `'0'` 或 `NULL` 来表示。 3. 最后,使用 `GROUP BY` 子句按姓名分组,得到最终...
掌握SQL的基础语法,如SELECT、INSERT、UPDATE、DELETE语句,以及联接(JOIN)、子查询、聚合函数(COUNT、SUM、AVG等)和分组(GROUP BY)等,是每个Oracle开发者的基本功。 二、创建表 创建表是数据库设计的第一...
本文将根据提供的材料,深入探讨Oracle查询语句中的一个重要概念——子查询。 #### 二、为什么引入子查询 子查询是一种非常强大的功能,它允许我们在主查询中嵌套另一个查询。通过这种方式,我们可以解决一些复杂的...
3. SQL语言基础:学习SQL(结构化查询语言)用于数据查询、插入、更新和删除的基本语法,以及联接、子查询、聚合函数和分组等高级特性。 4. 表空间与数据文件:理解Oracle中的表空间是存储数据的逻辑单位,而数据...
- **减少子查询使用**:将复杂的子查询转换为连接操作或者使用物化视图等技术来减少查询复杂度。 - **合理使用JOIN操作**:正确使用内连接(`INNER JOIN`)、外连接(`LEFT JOIN`, `RIGHT JOIN`)等连接方式,确保只获取...