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本身不在表中,使用他作为一列

--值是源自表中查询出来数据进行的编号,ORACLE自动生成该列的值

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这两个职位看做一组,其他职位的看做另一组,统计这两组的总人数,

--思路:将需要被看做一组,但值又不同的那些数据,我们使用DECODE将他们改为相同的值即可。

SELECT DECODE(job,‘MANAGER‘,‘VIP‘,‘ANALYST‘,‘VIP‘,‘OPERATIONS‘) NAME, COUNT(*) FROM emp

GROUP BY DECODE(job,‘MANAGER‘,‘VIP‘,‘ANALYST‘,‘VIP‘,‘OPERATIONS‘);

SELECT deptno,dname FROM dept ORDER BY DECODE(dname,‘OPERATIONS‘,1,‘ACCPOUNTING‘,2,‘SALES‘,3);

--按照部门分组,按照工资降序,产生组内连续唯一的数字:

SELECT ename,deptno,sal,ROW_NUMBER()OVER

(PARTITION BY deptno ORDER BY sal DESC)rank FROM emp;--rank函数与ROW_NUMBER的区别在于,进行排序的字段若值相同

--且他们在同一组时,那么他们得到的数字是相同的,但是,在下面的数字会有跳跃,RANK会生成组内不连续且不唯一的数字。

--DENSE_RANK()会产生一个连续唯一的

SELECT ename,deptno,sal, DENSE_RANK()OVER(PARTITION BY deptno ORDER BY sal DESC) rank FROM emp;

--集合操作中: 并集,将两个集合中的所有元素集合成一个集合 普通并集与全并集。

--全并集:会产生重复元素,两个集合都有的元素,会在合并后在新的集合中出现两次。

--交集:新的集合中只保留两个集合都有的元素

--差集:新的集合中只保存我有你没有的元素。

--差集

SELECT ename,job,sal FROM emp WHERE job =‘MANAGER‘ MINUS SELECT ename,job,sal FROM emp WHERE sal>2500;

--普通并集

SELECT ename,job,sal FROM emp WHERE job =‘MANAGER‘ UNION SELECT ename,job,sal FROM emp WHERE sal>2500;

--全并集

SELECT ename,job,sal FROM emp WHERE job =‘MANAGER‘ UNION ALL SELECT ename,job,sal FROM emp WHERE sal>2500;

--交集

SELECT ename,job,sal FROM emp WHERE job =‘MANAGER‘ INTERSECT SELECT ename,job,sal FROM emp WHERE sal>2500;

SELECT * FROM sales_tab;

SELECT year_id,month_id,day_id,SUM(sales_value) FROM SALES_TAB GROUP BY

GROUPING SETS((year_id,month_id,day_id),(year_id,month_id))

ORDER BY year_id,month_id,day_id;

时间: 2024-10-14 22:11:13

Oracle 笔记之子查询的相关文章

彻底搞懂oracle的标量子查询

oracle标量子查询和自定义函数有时用起来比较方便,而且开发人员也经常使用,数据量小还无所谓,数据量大,往往存在性能问题. 以下测试帮助大家彻底搞懂标量子查询. SQL> create table a (id int,name varchar2(10)); Table created. SQL> create table b (id int,name varchar2(10)); Table created. SQL> insert into a values (1,'a1'); 1

[转]Oracle DB 使用子查询来解决查询

? 定义子查询 ? 描述子查询可以解决的问题类型 ? 列出子查询的类型 ? 编写单行和多行子查询 ? 子查询:类型.语法和准则 ? 单行子查询: – 子查询中的组函数 – 带有子查询的HAVING子句 ? 多行子查询 – 使用ALL或ANY运算符 ? 使用EXISTS运算符 ? 子查询中的空值 使用子查询解决问题 谁的薪金高于Abel 的薪金? 子查询: Abel 的薪金是多少? 主查询: 哪些雇员的薪金高于Abel 的薪金? 使用子查询解决问题 假设要编写一个查询来找出谁的薪金高于Abel 的

Oracle with重用子查询

--with 重用子查询对于多次使用相同子查询的复杂查询语句来说,用户可能会将查询语句分成两条语句执行.第一条语句将子查询结果存放到临时表,第二条查询语句使用临时表处理数据.从 Oracle 9i 开始,通过 with 子句可以给予子查询指定一个名称,并且使得在一条语句中可以完成所有任务,从而避免了使用临时表. [email protected] test10g> with summary as (  2  select dname, sum(sal) dept_total from emp,

《卸甲笔记》-子查询

1查询公司中工资最低的雇员的完整信息 Oracle SQL> select * 2  from emp 3  where sal=( 4  select MIN(sal) from emp); EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO ---------- ---------- ---------- ---------- ------------ ---------- -

Oracle DB 使用子查询来解决查询

? 定义子查询 ? 描述子查询可以解决的问题类型 ? 列出子查询的类型 ? 编写单行和多行子查询 ? 子查询:类型.语法和准则 ? 单行子查询: – 子查询中的组函数 – 带有子查询的HAVING子句 ? 多行子查询 – 使用ALL或ANY运算符 ? 使用EXISTS运算符 ? 子查询中的空值 使用子查询解决问题 谁的薪金高于Abel 的薪金? 子查询: Abel 的薪金是多少? 主查询: 哪些雇员的薪金高于Abel 的薪金? 使用子查询解决问题 假设要编写一个查询来找出谁的薪金高于Abel 的

12W学习笔记——独立子查询,更新,删除,建立视图

查询的学习进入了最后阶段了,接下来我就来介绍一下查询最后的独立子查询. 独立子查询基本上都是用SELECT  FROM  WHERE 三个语句. 例:在学院表.专业表中,查询人文与管理学院下设各专业的简称 学习完查询之后,回过头学习更新,删除,建立视图 1.更新 更新中最主要的语句是UPDATE  SET  WHERE,并且在过程中也会经常使用到独立子查询. 例:将所有专业基础课的考试方式都改为"考试" 2.删除 (1)清空表 DELETE+表名 (2)删除某些记录 删除也会经常使用独

Oracle篇 之 子查询

子查询:先执行内部再外部 Select last_name,salary,dept_id From s_emp Where dept_id in ( Select dept_id From s_emp Where dept_id is not null ); Select last_name,dept_id From s_emp Where dept_id = ( Select dept_id From s_emp Where last_name=’Smith’ ); Select salary

Oracle系列七 子查询

子查询语法 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); 子查询 (内查询) 在主查询之前一次执行完成. 子查询的结果被主查询(外查询)使用 . 示例: SELECT last_name FROM employees WHERE salary > ( SELECT salary FROM employees WHERE last_name = 'Abel' ); 注意事项 子查

oracle查询优化之子查询条件优化

环境:oracle 11g 现有a表与b表通过a01字段关联,要查询出a表的数据在b表没有数据的数据:sql如下 select count(1) from (select a.*,(select count(1) from b where b.a01=a.a01) as flag from a) where flag=0 因为flag是虚拟字段没有走不了索引导致这条sql执行起来特别慢 310W条数据查总数花费2秒左右. 利用not exists优化sql如下 select count(1) f