转自: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
相关推荐
### 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....
Oracle子查询是数据库查询中的一个重要概念,它是指在SQL语句中嵌套另一个查询语句,用于获取数据或满足特定条件。子查询可以被用在SELECT、INSERT、UPDATE和DELETE命令中,甚至可以在一个子查询内部再嵌套其他子...
Oracle子查询的语法结构如下: ```sql SELECT [DISTINCT] * | 列名 1 [别名 1], 列名 2 [别名 2]… FROM 表名, (SELECT [DISTINCT] * | 列名 1 [别名 1], 列名 2 [别名 2]… FROM 表名 [WHERE 条件] [GROUP BY...
子查询还可以分为三种子类型:多列子查询、关联子查询和嵌套子查询。多列子查询向外部的SQL语句返回多列。关联子查询引用外部的SQL语句中的一列或多列。在关联子查询中,可以使用EXISTS和NOT EXISTS操作符。嵌套子...
【基于成本的ORACLE子查询性能研究】 Oracle数据库在处理SQL查询时,特别是涉及子查询时,会基于一种称为“成本”的评估标准来选择最佳执行计划。本文将深入探讨Oracle中的几种子查询类型,以及如何优化子查询以...
相关子查询与嵌套子查询的不同之处在于,它会根据父查询的每一行记录执行一次。这样,相关子查询可以更直观地解决某些问题,如查询高于员工所在部门平均工资的员工。在处理时,对于父查询的每一条记录,都会执行一...
子查询的类型 1、单行子查询:不向外部的SQL语句返回结果,或者只返回一行 2、多行子查询:向外部的SQL语句返回一行或者多行 ...3、嵌套子查询:位于另外一个子查询中,子查询最多可以嵌套255层
4. 子查询与连接(JOIN): - 子查询通常可以被JOIN操作替换,两者在某些场景下可互换,但子查询提供了一种更灵活的处理方式,尤其是在处理复杂的逻辑时。 5. 与集合操作符的结合: - UNION、UNION ALL、...
Oracle子查询是数据库查询中的一个重要概念,它是在一个SQL语句中嵌套另一个SQL查询,用以提供外部查询所需的条件或值。子查询可以作为WHERE、HAVING、FROM或SELECT子句的一部分,用于处理复杂的查询需求。以下是...
3. **子查询优化**:尽量减少子查询,尤其是嵌套子查询,它们可能导致多次表扫描。考虑用JOIN或临时表替换子查询,或使用关联子查询和存在子查询的优化策略。 4. **聚合函数和分组**:使用GROUP BY和HAVING子句时,...
此外,还有多列子查询(返回多列结果)、关联子查询(涉及外部SQL语句中的列)以及嵌套子查询(子查询中包含子查询)。在编写子查询时,需要注意使用括号来包裹子查询,并且子查询通常放置在比较操作符的右侧。 2. ...
此外,子查询优化还包括考虑使用关联子查询(JOIN)代替嵌套子查询,或者使用索引来加速查询。关联子查询可以在单次遍历中完成,而嵌套子查询可能需要多次访问表。同时,确保子查询涉及的列有合适的索引,可以大大...
子查询可分为单行子查询和多行子查询,以及特殊类型的多列子查询、关联子查询和嵌套子查询。在使用子查询时,需注意将其用括号括起,并确保子查询位置正确,如放置在比较操作符的右侧。 在WHERE子句中使用子查询是...
- **子查询“展平”**:将嵌套子查询转换为连接查询,以降低查询复杂度,提高执行效率。 - **谓词下推和上移**:优化谓词的位置,使其尽可能接近数据源,减少不必要的数据处理。 - **外联接到内联接的转换**:通过...
这个查询首先在子查询中找出每个部门的最高薪水(max_sal),然后通过JOIN操作将这个信息与员工表(emp)连接,找出那些薪水等于部门最高薪水并且在相同部门的员工。 2. **求部门平均薪水的等级**: 首先计算每个...
以上知识点涵盖了Oracle数据库中常见的查询技巧,包括但不限于多表查询、子查询、连接查询、聚合函数与分组、条件筛选、数据排序与显示以及复杂查询等。这些知识点对于学习和掌握Oracle数据库具有重要的指导意义。
6. **优化子查询**:减少子查询的使用,或利用关联子查询替代嵌套子查询,提高查询效率。 7. **注意排序和分组操作**:排序和分组操作会消耗大量资源,尽可能利用索引进行排序,避免不必要的全表排序。 8. **监控...