Oralce的子查询

//数据库在执行sql是从右到左


什么是子查询?
子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询


1)单行子查询
单行子查询是指只返回一行数据的子查询语句

?如何显示与SMITH同一部门的所有员工
SQL> select * from emp where deptno=(select deptno from emp where ename='SMITH');


2)多行子查询
多行子查询指返回多行数据的子查询

?如何查询和部门10的工作相同的雇员的名字,岗位,工资,部门号
SQL> select * from emp where job in (select distinct job from emp where deptno=10);


注意:如果是多行子查询就不能够使用'='要使用in作为范围

******************************************************************
            数据的去重
******************************************************************


3)***如何进行数据的过滤(将重复的数据过滤掉)***


只需要在需要去重的数据前面加上一个distinct
SQL> select distinct job from emp where deptno=30;


4)在多行子查询中使用all操作符

?如何显示工资比部门30的所有员工的工资高的员工姓名、工资和部门号

方法1:使用all操作符
SQL> select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);

方法2:使用max()函数   这个效率更高
SQL> select ename,sal,deptno from emp where sal>(select max(sal) from emp where deptno=30);

5)在多行子查询中使用any操作符

?如何显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号

方法1:使用any操作符
SQL> select ename,sal,deptno from emp where sal>any(select sal from emp where deptno=30);

方法2:使用min()函数
SQL> select ename,sal,deptno from emp where sal>(select min(sal) from emp where deptno=30);


6)多列子查询
单列子查询是指子查询只返回单列、单行数据,多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句

*****************************************************************
?如何查询与SMITH的部门和岗位都完全相同的所有雇员
SQL> select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');

注意:括号里的顺序要相同


再次强调:
group by用于对查询的结果分组统计
having子句用于限制分组显示结果

在from子句中使用子查询

?如何显示高于自己部门平均工资的员工信息

//1.查询出各个部门的平均工资和部门号
select deptno,avg(sal) mysal from emp group by deptno;

//2.把上面的查询看做事一张子表
(select deptno,avg(sal) mysal from emp group by deptno) a1
上面的意思就是将上面查询到的结果当成是一张表并命名为a1


SQL> select a1.ename,a1.sal,a2.deptno,a2.mysal from emp a1,(select deptno,avg(sal) mysal from emp group by deptno) a2 where a1.deptno=a2.deptno and a1.sal>a2.mysal order by deptno;


在from子句中使用子查询

这里需要说明的是当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此也叫做内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名

用查询的结果创建新表

这个命令是一种快捷的建表方法:
create table mytable (id,name,sal,job,deptno) as select empno,ename,sal,job,deptno,from emp;

这种命令创建的表拥有和参考的表一样的数据
即相当于将参考表的数据都转移到了新建的表中


合并查询(在实际中不怎么使用)
有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus

1)union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行
select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job='MANAGER';

2)union all

该操作符和union相似,但是它不会取消重复行并且不会排序,就类似逻辑运算符‘或’。
select ename,sal,job from emp where sal>2500 union all select ename,sal,job from emp where job='MANAGER';

3)intersect(相交)

该操作符用于取得两个结果集的交集。
select ename,sal,job from emp where sal>2500 intersect select ename,sal,job from emp where job='MANAGER';

4)minus(减去)

该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据
select ename,sal,job from emp where sal>2500 minus select ename,sal,job from emp where job='MANAGER';

即第一个集合减去第二个集合中后第一个集合中剩下的数据

猜你喜欢

转载自1124117571.iteye.com/blog/2284839