一、概述

在一个SQL语句中嵌套另一个SQL语句成为子查询。包括单行子查询,多行子查询,多列子查询。

注意,当在DDL语句中引用子查询时,可以带有Order By子句;但是当在where子句、Set子句中引用子查询时,不能带有Order by 子句。子查询具有以下一些作用:

  1. 通过在insert或create table语句中使用子查询,可以将源表数据插入目标表中。
  2. 通过在create view或create materialieed view中使用子查询,可以定义视图或实体化视图所对应的select语句。
  3. 通过在update语句中使用子查询可以修改一列或多列数据。
  4. 通过在where、having、start with子句中使用子查询,可以提供条件值。

非相关(非关联)子查询的使用:

  1. FROM语句可以包含任意类型的非关联子查询。
  2. SELECT和ORDER BY可以包含标量子查询。
  3. GROUP BY语句不能包含子查询。
  4. SHART WITH和CONNECT BY语句可以包含子查询。
  5. WITH语句包含一个命名的非关联子查询,它可以被父查询引用多次而只执行一次。
  6. MERGE的USING语句可以包含非关联子查询。
  7. UPDATE的SET语句可以包含标量子查询或者单行多列子查询
  8. INSERT语句可以在VALUES的位置包含标量子查询。

1、单行子查询(子查询只返回一行)

又称为标量子查询,因为它的结果用作父查询的标量。通常与比较运算符比如=><!=<=>=联合使用。

--查询scott用户下的emp表中工资比scott高的员工的信息(此操作中的子查询只返回一行记录)
select * from emp where sal>(select sal from emp where ename='SCOTT');

2、多行单列子查询(子查询返回多行)

使用特定的关键字如IN,ANY和ALL来将外层查询的单个值与子查询的多行进行比较运算。

(1)子查询出现在where子句中的子查询语法(内嵌子查询)

--查询scott用户下的emp表中所有的经理的信息(此操作子查询会返回多行记录)
select * from emp where empno in ( select mgr from emp);

(2)子查询出现在from子句中(内嵌视图)

--将scott用户下的emp表中查询出的数据作为一个内嵌视图在FROM子句中使用
select * from (select empno,ename,job,sal from emp);

(3)子查询出现在select列表中,此时子查询只能是一个单行子查询。

select (select job from emp where empno=7369)  from emp;

(4)子查询也可以出现在having字句中。

select empno,ename, sal,deptno  from emp   group by deptno,empno,ename,sal
having deptno in ( select deptno from emp where deptno=10 or deptno=20)
order by deptno,sal;

3、多列子查询

1、where之后

成对比较(多列子查询)

select ename,comm,sal form emp where (sal,nvl(comm,-1)) in (select sal,nvl(comm,-1) from emp where deptno=30);

非成对比较

select ename,sal,comm from emp where sal in(select sal from emp where deptno=30)  and nvl(comm,-1) in (select nvl(comm,-1) from emp where deptno=30)

2、set之后

update monthly_orders
set (tot_orders, max_order_amt, min_order_amt, tot_amt) =
(select count(*), max(sale_price), min(sale_price), sum(sale_price) from cust_order
where order_dt >= TO_DATE('01-JUL-2001','DD-MON-YYYY'))
where month = 7 and year = 2001;

二、在DDL语句中使用子查询

1、create table

通过在create table中使用子查询,可以在建立新表的同时复制表的数据。

CREATE TABLE new_emp(id,name,sal,job,deptno) AS SELEct empno,ename,sal,job,deptno FROM emp;

2、create View

建立视图时,必须指定视图所对应的子查询语句。

CREATE OR REPLACE  VIEW dept_10 AS SELECT empno,ename,job,sal,deptno FROM emp WHERE deptno=10 ORDER BY empno;

3、 create materialized view 建立实体化视图

CREATE MATERIALIZED VIEW summary_emp AS
SELECT deptno,job,avg(sal) avgsal,sum(sal) sumsal FROM emp GROUP BY cube(deptno,job);

三、在DML语句中使用子查询

1.INSERT

INSERT INTO employee (id,name,title,salary)
SELECT emptno,ename,job,sal FROM emp;

2.UPDATE

UPDATE emp SET (sal,comm)=
(SELECT sal,comm FROM emp WHERE ename='SMITH')
WHERE job=(SELECT job FROM emp WHERE ename='SMITH');

3.DELETE

DELECT FROM emp WHERE deptno=
(SELECT deptno FROM dept WHERE dname='SALES');

四、WITH语句

如果同一个非关联子查询在同一次查询中被使用多次,这种情况可以使用ORACLE9I提供的WITH语句,WITH语句创建了命名的一个临时的数据集。这个只产生一次数据集可以在整个查询中使用多次,使用这个数据集就和使用表一样。

WITH avg_sal AS (SELECT AVG(salary) val FROM employee)
SELECT e.emp_id, e.lname, e.fname,
(SELECT ROUND(e.salary - val) FROM avg_sal) above_avg
FROM employee e WHERE e.salary > (SELECT val FROM avg_sal);

五、相关子查询。

相关子查询:是指需要引用主查询表列的子查询语句。相关子查询是通过EXISTS谓词来实现的。

SELECT ename,job,sal,deptno FROM emp WHERE EXISTS
(SELECT 1 FROM dept WHERE dept.deptno=emp.deptno AND dept.loc='NEW YORK');

找出工资高于其所在部门平均工资的员工

select enam,sal from emp t1 where t1.sal > (select avg(sal) from emp t2 where t1.Deptno = t2.Deptno)

找出换了二次或二次以上工作的员工:

select last_name from employees e where 2<=
(select count(*) from job_history j where j.employee_id =e.employee_id)

PL/SQL 子查询的更多相关文章

  1. sql子查询 嵌套SELECT语句

    嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在sele ...

  2. SQL子查询/嵌套查询

    sql子查询 嵌套SELECT语句 嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为 ...

  3. SQL Server温故系列(3):SQL 子查询 & 公用表表达式 CTE

    1.子查询 Subqueries 1.1.单行子查询 1.2.多行子查询 1.3.相关子查询 1.4.嵌套子查询 1.5.子查询小结及性能问题 2.公用表表达式 CTE 2.1.普通公用表表达式 2. ...

  4. SQL 子查询,连接查询复习

    use lianxi0720 go --创建部门表 create table bumen ( bcode int primary key,--部门编号 bname ), --部门名称 bceo ), ...

  5. sql子查询

    一.子查询入门: 1.单值子查询: 单值子查询的唯一限制:子查询的返回值必须只有一行记录,而且只能有一列(又被称为标量子查询). 可以使用在select语句的列表.表达式中,以及where语句中等. ...

  6. Sql Server的艺术(六) SQL 子查询,创建使用返回多行的子查询,子查询创建视图

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  7. PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法

    PL/SQL查询时,如果Number(17)以上的大数,会显示为科学计数法 解决方法: TOOLS->PREFERENCES->WINDOW TYPE->SQL WINDOW下选中N ...

  8. sql子查询在insert、update、delete中的应用

    子查询可以应用在INSERT.UPDATE以及DELETE等语句中,合理的使用子查询将能够简化功能的实现并且极大的提高SQL语句执行的效率 用到的表: CREATE TABLE `t_readerfa ...

  9. Oracle数据库PL/SQL Developer查询结果显示问号乱码的解决方法

    PL SQL Developer,查询结果中的中文变成了一堆问号,SQL语句中的中文被提示invalid character,不能识别. 解决方法: 执行,select userenv('langua ...

随机推荐

  1. 任务调度之Quartz.Net基础

    最近公司要求将之前的系统设计文档补上,于是大家就都被分配了不同的任务,紧锣密鼓的写起了文档来.发现之前项目中使用了Quartz.Net来做一些定时任务的调度,比如定时的删除未支付的订单,定时检查支付状 ...

  2. LeetCode 14. 最长公共前缀(Longest Common Prefix)

    14. 最长公共前缀 14. Longest Common Prefix 题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". Lee ...

  3. TensorSpace:超酷炫3D神经网络可视化框架

    TensorSpace:超酷炫3D神经网络可视化框架 TensorSpace - 一款 3D 模型可视化框架,支持多种模型,帮助你可视化层间输出,更直观地展示模型的输入输出,帮助理解模型结构和输出方法 ...

  4. [转帖]TPC-C解析系列02_OceanBase如何做TPC-C测试

    TPC-C解析系列02_OceanBase如何做TPC-C测试 http://www.itpub.net/2019/10/08/3333/   导语: 蚂蚁金服自研数据库OceanBase登顶TPC- ...

  5. python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)

    9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型 池子内什么时候装线程:并发的任务属于I ...

  6. PAT(B) 1051 复数乘法(Java)

    题目链接:1051 复数乘法 (15 point(s)) 参考博客:1051 复数乘法(PAT 乙级 C++实现)-guangjinzheng 题目描述 复数可以写成 (A+Bi) 的常规形式,其中 ...

  7. 简单即时通讯、聊天室--java NIO版本

    实现的功能: 运行一个服务端,运行多个客户端.在客户端1,发送消息,其余客户端都能收到客户端1发送的消息. 重点: 1.ByteBuffer在使用时,注意flip()方法的调用,否则读取不到消息. 服 ...

  8. 在我的电脑中删除wps云文档图标

    在我的电脑中删除wps云文档图标 右键点击win10左下角选择运行,输入regedit打开注册表后,找到以下注册表路径: HKEY_CURRENT_USER\Software\Microsoft\Wi ...

  9. HTML的发展历史

    HTML是Web统一语言,这些容纳在尖括号里的简单标签,构成了如今的Web,1991年,Tim Berners-Lee编写了一份叫做“HTML标签”的文档,里面包含了大约20个用来标记网页的HTML标 ...

  10. H5之拖拽

    步骤: 1.为将要拖拽的元素设置允许拖拽,并赋予dragstart事件将其id转换成数据保存: 2.为容器添加dragover属性添加事件阻止浏览器默认事件,允许元素放置,并赋予drop事件进行元素的 ...