`

Oracle连接查询,子查询(相关子查询,嵌套子查询)

 
阅读更多

转自:http://www.cnblogs.com/ylbtech/archive/2012/08/09/2630705.html

1,Demo连接查询

 

--========================================================

--ylb:Oracle

--17:13 2011-12-30

--1,链接查询(传统链接、内链接)

--========================================================

   

--总结:什么时候使用连接查询?

--当需要显示的数据来源于多个表时,使用连接查询。

--一,连接查询--分传统连接与内连接

/*

1,查询员工姓名和所在部门的名称(2种 )

--传统连接  --依赖的是    ,和where

*/

select * from emp,dept where emp.deptno=dept.deptno

select ename,dname,emp.deptno from emp ,dept where emp.deptno=dept.deptno;

select * from emp a ,dept b where a.deptno=b.deptno;

select a.ename,b.dname from emp a,dept b where a.deptno=b.deptno

select a.ename,b.dname,a.deptno from emp a,dept b where a.deptno=b.deptno

--内联接    --依赖的是     inner join   on 

select * from emp a inner join dept b on a.deptno=b.deptno

   

2,查询员工姓名和所在部门的名称,要求部门编号为30(2种 )

select a.ename,b.dname from emp a inner join dept b on a.deptno=b.deptno where a.deptno=30

select a.ename,b.dname from emp a,dept b where a.deptno=b.deptno and a.deptno=30

3,查询员工姓名和部门名称,要求没有员工的部门的名称也要查询出来

--传统连接 :使用”(+)“

select * from emp a ,dept b where a.deptno(+)=b.deptno;

select * from emp a ,dept b where b.deptno=a.deptno(+);

--使用join连接 :   

右外连接

select * from emp a right outer join dept b on a.deptno=b.deptno

  

左外连接  

select * from emp a left outer join dept b on a.deptno=b.deptno;

       

全外连接: 

--只能用标准sql来书写

 select * from emp a full outer join dept b on a.deptno=b.deptno;

   

4,查询员工姓名和其直接上级的姓名,要求没有经理的员工也查询出来

--自连接

员工 SMITH 的上级是 FORD

select '员工'||a.ename||'的上级是'||b.ename from emp a left outer join emp b on a.mgr=b.empno;

select '员工'||a.ename||'的上级是'||b.ename from emp a,emp b where a.mgr=b.empno(+)

  

select a.ename,b.ename from emp a,emp b where a.mgr=b.empno(+)

2,Demo 子查询(相关子查询,嵌套子查询)

--========================================================

--ylb:Oracle

--17:13 2011-12-30

--1,子查询(嵌套子查询、相关子查询)

--========================================================

/*** 

连接与子查询的区别:

1,当需要多个表的数据时用连接,子查询只能返回单表数据。

2,连接快,子查询慢。

3,子查询功能强大。

4,子查询-两种(嵌套子查询,关联子查询)

 嵌套简单,关联复杂,面试关联查询

**/

  

  

--一, 子查询第一种 : 嵌套子查询:简单--子查询可以独立运行,自内而外

--1,查询工资高于SMITH工资的所有员工

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

go

--2,查询工资高于公司平均工资的所有员工?

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

--附加题,

--> >= < <= = != <> ^= 后面只能跟一个值,

--如果有多个值,>all--大于最大值    >any--大于最小值

--查询工资高于所有部门的平均工资的员工

select * from emp where sal>all(select avg(sal) from emp group by deptno)

--查询工资高于任何部门的平均工资的员工

  

select * from emp where sal>any(select avg(sal) from emp group by deptno)

      

      

go

/*********************************************************************************/                

--二, 子查询第二种 : 关联子查询 ,思考:自外而内

--3,查询工资高于本部门平均工资的所有员工?

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

--4,查询本部门最高工资的员工?(三种方法)

--方法一,使用嵌套子查询(非关联子查询)

select * from emp a where (a.deptno,a.sal) in (select deptno,max(sal) from emp group by deptno)

--方法二,使用关联子查询/*9-******************

select * from emp a where a.sal=(select max(sal) from emp where deptno=a.deptno)

--方法三,使用关联子查询的名次问题,名次=人数+1 

sal=800

deptno=20

select * from emp a 

where (

select count(*) from emp 

where deptno=a.deptno and sal>a.sal)=1

/*********************************************************************************/   

  

  

go

--补充题:

--查询本部门第二高工资的员工?(一种方法)

--5,查询本部门最低工资的员工 ?

select * from emp a where (select count(*) from emp where deptno=a.deptno and sal<a.sal)=0                                   

  

------------------------------------------------------三,select 语句做表达式

--6,统计每个部门的信息和人数?

select a.*,(select count(*) from emp where deptno=a.deptno) 人数 from dept a

select a.* from dept a

     

select a.deptno,b.dname,b.loc,count(*) from emp a,dept b where a.deptno=b.deptno group by a.deptno,b.dname,b.loc

                 

--7,统计每个部门工资在(500-1000)/(1000-3500)/(3500-7000) 的人数?

select a.*,

(select count(*) from emp where deptno=a.deptno and sal>500 and sal<=1000) "500-1000",

(select count(*) from emp where deptno=a.deptno and sal>1000 and sal<=3500),

(select count(*) from emp where deptno=a.deptno and sal>3500 and sal<=7000) 

from dept a

<!--EndFragment-->
分享到:
评论
1 楼 liusong6196 2017-07-26  

相关推荐

    oracle表连接和子查询实例

    ### Oracle 表连接和子查询实例解析 #### 一、最大薪资部门的员工信息 **SQL语句**: ```sql SELECT ename, sal FROM emp JOIN (SELECT MAX(sal) max_sal, deptno FROM emp GROUP BY deptno) t ON (emp.sal = t....

    25.Oracle子查询1

    Oracle子查询是数据库查询中的一个重要概念,它是指在SQL语句中嵌套另一个查询语句,用于获取数据或满足特定条件。子查询可以被用在SELECT、INSERT、UPDATE和DELETE命令中,甚至可以在一个子查询内部再嵌套其他子...

    Oracle初级(子查询).doc

    Oracle子查询的语法结构如下: ```sql SELECT [DISTINCT] * | 列名 1 [别名 1], 列名 2 [别名 2]… FROM 表名, (SELECT [DISTINCT] * | 列名 1 [别名 1], 列名 2 [别名 2]… FROM 表名 [WHERE 条件] [GROUP BY...

    Oracle数据库应用教程--子查询与高级查询.pptx

    子查询还可以分为三种子类型:多列子查询、关联子查询和嵌套子查询。多列子查询向外部的SQL语句返回多列。关联子查询引用外部的SQL语句中的一列或多列。在关联子查询中,可以使用EXISTS和NOT EXISTS操作符。嵌套子...

    基于成本的ORACLE子查询性能研究.pdf

    【基于成本的ORACLE子查询性能研究】 Oracle数据库在处理SQL查询时,特别是涉及子查询时,会基于一种称为“成本”的评估标准来选择最佳执行计划。本文将深入探讨Oracle中的几种子查询类型,以及如何优化子查询以...

    数据库开发 Oracle数据库 SQL开发教程 第09章 高级子查询(共23页).pdf

    相关子查询与嵌套子查询的不同之处在于,它会根据父查询的每一行记录执行一次。这样,相关子查询可以更直观地解决某些问题,如查询高于员工所在部门平均工资的员工。在处理时,对于父查询的每一条记录,都会执行一...

    ORACLE子查询ppt

    子查询的类型 1、单行子查询:不向外部的SQL语句返回结果,或者只返回一行 2、多行子查询:向外部的SQL语句返回一行或者多行 ...3、嵌套子查询:位于另外一个子查询中,子查询最多可以嵌套255层

    子查询课程实验

    4. 子查询与连接(JOIN): - 子查询通常可以被JOIN操作替换,两者在某些场景下可互换,但子查询提供了一种更灵活的处理方式,尤其是在处理复杂的逻辑时。 5. 与集合操作符的结合: - UNION、UNION ALL、...

    Oracle基础学习之子查询

    Oracle子查询是数据库查询中的一个重要概念,它是在一个SQL语句中嵌套另一个SQL查询,用以提供外部查询所需的条件或值。子查询可以作为WHERE、HAVING、FROM或SELECT子句的一部分,用于处理复杂的查询需求。以下是...

    Oracle 查询优化,个人练习

    3. **子查询优化**:尽量减少子查询,尤其是嵌套子查询,它们可能导致多次表扫描。考虑用JOIN或临时表替换子查询,或使用关联子查询和存在子查询的优化策略。 4. **聚合函数和分组**:使用GROUP BY和HAVING子句时,...

    Oracle数据库应用教程子查询与高级查询.pptx

    此外,还有多列子查询(返回多列结果)、关联子查询(涉及外部SQL语句中的列)以及嵌套子查询(子查询中包含子查询)。在编写子查询时,需要注意使用括号来包裹子查询,并且子查询通常放置在比较操作符的右侧。 2. ...

    Oracle数据库中基本的查询优化与子查询优化讲解

    此外,子查询优化还包括考虑使用关联子查询(JOIN)代替嵌套子查询,或者使用索引来加速查询。关联子查询可以在单次遍历中完成,而嵌套子查询可能需要多次访问表。同时,确保子查询涉及的列有合适的索引,可以大大...

    第8章Oracle资料学习.pptx

    子查询可分为单行子查询和多行子查询,以及特殊类型的多列子查询、关联子查询和嵌套子查询。在使用子查询时,需注意将其用括号括起,并确保子查询位置正确,如放置在比较操作符的右侧。 在WHERE子句中使用子查询是...

    oracle9i的查询优化

    - **子查询“展平”**:将嵌套子查询转换为连接查询,以降低查询复杂度,提高执行效率。 - **谓词下推和上移**:优化谓词的位置,使其尽可能接近数据源,减少不必要的数据处理。 - **外联接到内联接的转换**:通过...

    oracle 查询语句笔记

    这个查询首先在子查询中找出每个部门的最高薪水(max_sal),然后通过JOIN操作将这个信息与员工表(emp)连接,找出那些薪水等于部门最高薪水并且在相同部门的员工。 2. **求部门平均薪水的等级**: 首先计算每个...

    oracle数据库练习题emp练习题

    以上知识点涵盖了Oracle数据库中常见的查询技巧,包括但不限于多表查询、子查询、连接查询、聚合函数与分组、条件筛选、数据排序与显示以及复杂查询等。这些知识点对于学习和掌握Oracle数据库具有重要的指导意义。

    Oracle数据库查询优化分析与研究.pdf

    6. **优化子查询**:减少子查询的使用,或利用关联子查询替代嵌套子查询,提高查询效率。 7. **注意排序和分组操作**:排序和分组操作会消耗大量资源,尽可能利用索引进行排序,避免不必要的全表排序。 8. **监控...

Global site tag (gtag.js) - Google Analytics