设为首页 加入收藏

TOP

Oracle学习笔记之子查询(一)
2015-11-10 12:17:22 来源: 作者: 【 】 浏览:3
Tags:Oracle 学习 笔记 查询

子查询


当我们的一个操作需要基于另一个查询记过,那么就先行执行的这个查询就是子查询


子查询分为:


单行单列子查询:查的结果只有一行,且只有一个字段


多行单列子查询:查询出来的结果有多行,但只有一列 多行多列子查询


查询出多行多个列。


通常,单行单列与多行多列子查询用于where子句中而多行多列子查询用于


FROM子句中。


--查看和SCOTT相同职位的其他员工


SELECT ename,sal,job FROM emp WHERE job=(SELECT job FROM emp WHERE ename='SCOTT')


AND ename <>'SCOTT';


--查看哪些员工工资高于平均水平


SELECT ename,sal FROM emp WHERE? sal>(SELECT AVG(sal) FROM emp);


--题目:查看公司中和SALESMAN相同部门的其他职位员工的信息


--第一步骤:


SELECT ename,deptno FROM emp WHERE job='SALESMAN';


--第二步骤:


SELECT? ename,job,deptno FROM emp WHERE deptno IN(SELECT deptno FROM emp WHERE


job='SALESMAN') AND job<>'SALESMAN';


--查看比20部门所有员工工资都高的其他员工


SELECT ename,sal,deptno FROM emp WHERE deptno =20;


SELECT ename,sal,deptno FROM emp WHERE sal>ALL(SELECT sal FROM emp WHERE deptno =20);


EXISTS的作用, 当子查询中可以至少返回一条记录,那么表达式返回true,下面的例子表示:查看含有员工


的部门


SELECT deptno,dname FROM dept d WHERE EXISTS(SELECT * FROM emp e WHERE d.deptno = e.deptno);


--查看最低薪水高于30号部门最低薪水的部门


SELECT deptno,MIN(sal)"最低薪水" FROM emp GROUP BY deptno HAVING MIN(sal)>(SELECT MIN(sal)FROM emp WHERE deptno=30);


--查看最低薪水高于30号部门最低薪水的部门


SELECT deptno,MIN(sal)"最低薪水" FROM emp GROUP BY deptno HAVING MIN(sal)>(SELECT MIN(sal)FROM emp WHERE deptno=30);


--去除重复项


SELECT DISTINCT deptno FROM emp;


--查询比本部门平均薪水高的员工的信息


--这里的思路是,我们应当先统计每个部门的平均工资因为这个查询结果是一个多行多列的,所以我们将


--其当做一张表来看待,然后使用EMP表与其关联查询即可。所以,多行多列子查询一般用在FROM子句后。


--FROM中书写的子查询,一般称为内视图


SELECT e.ename,e.sal,e.deptno FROM emp e,(SELECT AVG(sal) avg_sal,deptno FROM emp


GROUP BY deptno) x WHERE e.deptno = x.deptno AND e.sal>x.avg_sal;


--查看和SCOTT相同职位的其他员工


SELECT ename,sal,job FROM emp WHERE job=(SELECT job FROM emp WHERE ename='SCOTT')


AND ename <>'SCOTT';


--查看哪些员工工资高于平均水平


SELECT ename "姓名",sal"工资" FROM emp WHERE? sal>(SELECT AVG(sal) FROM emp);


--题目:查看公司中和SALESMAN相同部门的其他职位员工的信息


--第一步骤:


SELECT ename,deptno FROM emp WHERE job='SALESMAN';


--第二步骤:


SELECT? ename,job,deptno FROM emp WHERE deptno IN(SELECT deptno FROM emp WHERE


job='SALESMAN') AND job<>'SALESMAN';


--查看比20部门所有员工工资都高的其他员工


SELECT ename,sal,deptno FROM emp WHERE deptno =20;


SELECT ename,sal,deptno FROM emp WHERE sal>ALL(SELECT sal FROM emp WHERE deptno =20);


--EXISTS的作用, 当子查询中可以至少返回一条记录,那么表达式返回true,下面的例子表示:查看含有员工


--的部门


SELECT deptno,dname FROM dept d WHERE EXISTS(SELECT * FROM emp e WHERE d.deptno=e.deptno);


--查看最低薪水高于30号部门最低薪水的部门


SELECT deptno,MIN(sal)"最低薪水" FROM emp GROUP BY deptno HAVING MIN(sal)>(SELECT MIN(sal)FROM emp WHERE deptno=30);


--去除重复项


SELECT DISTINCT deptno FROM emp;


--查询比本部门平均薪水高的员工的信息


--这里的思路是,我们应当先统计每个部门的平均工资因为这个查询结果是一个多行多列的,所以我们将


--其当做一张表来看待,然后使用EMP表与其关联查询即可。所以,多行多列子查询一般用在FROM子句后。


--FROM中书写的子查询,一般称为内视图


SELECT e.ename,e.sal,e.deptno FROM emp e,(SELECT AVG(sal) avg_sal,deptno FROM emp


GROUP BY deptno) x WHERE e.deptno = x.deptno AND e.sal>x.avg_sal;


--子查询也可以出现在SELECT子句中,通常实现的效果是外连接效果,若emp表中deptno字段的值在进行关联


--查询dept表中没有查询数据时,那么该值显示为null


SELECT e.ename,e.sal,(SELECT d.deptno FROM dept d WHERE d.deptno=e.deptno) deptno FROM emp e;


--分页,将所有记录分批获取,目的:加快查询,减小系统资源消耗


--分页至少需要,为记录编号,以及排序


--编号:在ORALCE中可以使用过ROWNUM的伪列 ROWNUM本身不在表中,使用他作为一列


SELECT * FROM emp;


SELECT * FROM (SELECT ROWNUM rn,e.ename "姓名",e.job "工作",e.sal "工资" FROM emp e ORDER BY "工资" DESC) WHERE


rn BETWEEN 5 AND 10;


SELECT ename,job,sal,DECODE(job,


? ? ? ? ? ? ? ? ? 'MANAGER',sal*1.2,


? ? ? ? ? ? ? ? ? 'ANALYST',sal*1.1,


? ? ? ? ? ? ? ? ? 'SALESMAN',sal*1.05,sal


? ? ? ? ? ? ? ? ? )bouns


? ? ? ? ? ? ? ? ? FROM emp;


? ? ? ? ? ? ? ? ?


--将MANAGER与ANALYST这两个职位看做一组,其他职位的看做另一组,

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux环境中MySQL主从同步--添加.. 下一篇Oracle学习笔记之高级查询

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: