子查询:

用子查询能解决的问题

假想你想要写一个查询来找出挣钱比陆涛的薪水还多的人。为了解决这个问题,你需要两个查询:一

个找出陆涛的收入,第二个查询找出收入高于陆涛的人。

你可以用组合两个查询的方法解决这个问题,放置一个查询到另一个查询中。

内查询或子查询返回一个值给外查询或主查询。使用一个子查询相当于执行两个连续查询并且用第一个

查询的结果作为第二个查询的搜索值。

子查询语法:

SELECT select_list

FROM table

WHERE expr operator

(SELECT select_list

FROM table);

1.子查询(内查询)在主查询之前执行一次

2.子查询的结果被用于主查询(外查询)

首先执行子查询(内查询)显示子查询返回的值,然后用内查询返回的结果执行外查询,最后,执行整个查询(包括子查询),显示相同的结果。

子查询可嵌套的位置:

子查询是一个SELECT语句,它是嵌在

另一个SELECT语句中的子句。

使用子查询你可以用简单的语句构建功能强大的语句。当你需要从表中用依赖于表本身的数据选择行时

它们是非常有用的。

也可以放在

WHERE子句HAVING子句FROM子句。

在语法中:

operator包括比较条件,例如>、=或IN

比较条件分为两个种类:单行运算符(>, =, >=, , <=)和多行运算符(IN, ANY, ALL)。

子查询通常涉及一个嵌套的SELECT、子-SELECT或内SELECT语句。字查询通常执行一次。并且它的输出被用于完成主或外查询的查询条件。

另外,子查询可以被放在CREATE VIEW语句中、CREATE TABLE语句、UPDATE语句、INSERT语句的INTO子句和UPDATE语句的SET子句中。

使用子查询的原则:

1.子查询放在圆括号中

2.将子查询放在比较条件的右边,可以增加可读性。

在子查询中的ORDER BY子句不需要,除非你正在执行Top-N分析。

Oracle8i以前的版本中,子查询不包含ORDER BY子句。对一个SELECT语句只能用一个ORDER BY子句,并且如果指定了它就必须放在主SELECT语句的最后。从Oracle8i开始,ORDER BY子句可以使用,并且在进行Top-N分析时是必须的。

3.在单行子查询中用单行运算符,在多行子查询中用多行运算符,

在子查询中可以使用两种比较条件:单行运算符和多行运算符。

子查询的个数:

Oracle服务器没有强制限制子查询的数目;限制只与查询所需的缓冲区大小有关。

子查询的类型:

1.单行子查询:从内SELECT语句只返回一行的查询

2.多行子查询:从内SELECT语句返回多行的查询

3.还有多列子查询:从内SELECT语句返回多列的查询。

单行子查询

单行子查询是从内查询返回一行的查询。在该子查询类型中用一个单行操作符

SELECT last_name, job_id

FROM employees

WHERE job_id =

(SELECT job_id

FROM employees

WHERE employee_id = 141);

SELECT last_name, job_id, salary

FROM employees

WHERE job_id =

(SELECT job_idFROM employeesWHERE employee_id = 141)AND salary >(SELECT salaryFROMemployeesWHERE employee_id = 143);

该例子可以由三个查询块组成:外查询和两个内查询。内查询块首先被执行,产生查询结果分别为ST_CLERK和2600。然后处理外查询块,并且使用内查询的返回值来完成它的查询条件。

两个内查询返回单个值(分别是ST_CLERK和2600),所以这种SQL语句被称为单行子查询。

注:外和内查询可以从不同的表中取得数据。

在子查询中使用组函数:

SELECT last_name, job_id, salary

FROM employees

WHERE salary =

(SELECT MIN(salary) FROM employees);

你可以从主查询中显示数据,该主查询使用一个带组函数的单行子查询。子查询放在圆括号中并且放在比较条件的后面。

例子显示所有其薪水等于最低薪水的雇员的last name、job ID和salary。MIN组函数返回单个的值(2500)给外函数。

带子查询的HAVING子句:

1.Oracle服务器首先执行子查询

2.Oracle服务器返回结果到主查询的HAVING子句中

找出平均薪水为最低平均薪水的工作岗位。

SELECT job_id, AVG(salary)

FROM employees

GROUP BY job_id

HAVING AVG(salary) = (SELECT MIN(AVG(salary))

FROM employees

GROUP BY job_id);

子查询错误

使用子查询的一个常见的错误是单行子查询返回返回了多行。

SELECT employee_id, last_name

FROM employees

WHERE salary =

(SELECT MIN(salary) FROM employeesGROUP BY department_id);

ERROR at line 4:ORA-01427: single-rowsubqueryreturns more thanone rowERROR

子查询包含一个GROUP BY子句,这就暗示该子查询将返回多行,每个对应它所找到的一组,在这种情况下,子查询的结果将是4400、6000、2500、4200、7000、17000和8300。

外查询得到子查询的结果(4400、6000、2500、4200、7000、17000、8300)并且在它的WHERE子句中使用这些结果。WHERE子句包含一个等号(=)运算符,这是一个单行比较运算符,只能使用一个值。=操作符不能接受来自子查询的多个值,并且因此产生错误。

为了纠正该错误,改变=操作为IN。

子查询的另一个常见问题是内查询没有返回行。

,子查询包含一个WHERE子句,推测起来,其目的是找名字为Haas的雇员,该语句是正确的,但在执行时选择无行返回。

没有名叫Haas的雇员,所以子查询无返回行,外查询得到子查询的结果(null)并且在WHERE子句中使用该结果,外查询找不到一个job ID等于null的雇员,所以也没有行返回。如果一个job存在null值,也没有返回行,因为比较两个空值还是空,因此WHERE子句的条件不为true。

多行子查询:

多行子查询

子查询返回多行被称为多行子查询。对多行子查询要使用多行运算符而不是单行运算符。多行运算符期待多个值。

查找各部门收入为部门最低的那些雇员。

SELECT last_name, salary, department_id

FROM employees

WHERE salary IN (SELECT MIN(salary)

FROM employees

GROUP BY department_id);

内查询先被执行,产生一个查询结果,然后主查询块处理和使用由内查询返回的值完成它的搜索条件。事实上,在Oracle服务器看起来主查询象是下面这样:

SELECT last_name, salary, department_id

FROM employees

WHERE salary IN (2500, 4200, 4400, 6000, 7000, 8300, 8600, 17000);

在多行子查询中使用ANY运算符

SELECT employee_id, last_name, job_id, salary

FROM employees

WHERE salary < ANY(SELECT salaryFROM employeesWHERE job_id = 'IT_PROG')

AND job_id <> 'IT_PROG';

ANY运算符(和它的同义词,SOME运算符)比较一个值与一个子查询返回的每一个值。幻灯片中的例子显示不是IT程序员的雇员,并且这些雇员的的薪水少于IT程序员。挣钱最多的程序员的薪水是$9,000。

oracle单行子查询返回多个行 order by,单行子查询返回多个行相关推荐

  1. oracle单行子查询返回多个行 order by,单行子查询返回多个行 Issue分析求助

    with order_base as --获取订单基础情况 ( select ou.order_key order_key, ou.order_quantity_i, ood.dispatch_tim ...

  2. 嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏

    文章目录 1.需求分析与问题解决 2.单行子查询 3.多行子查询 4.相关子查询 5.抛一个思考题 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入.SQL 中 ...

  3. 思迅软件PDA 3900 BUG 代码:05FF 子查询返回的值不止一个。当子查询跟随在 之后,或子查询用作表达式时

    主程序:思迅商锐9.5 PDA 3900 服务端版本 1.1 事件类型:PDA查询报表 查询商品档案时 返回上图错误 代码:05FF 子查询返回的值不止一个.当子查询跟随在 =.!=.<.< ...

  4. ORACLE——ROWNUM解析(使用ROWNUM大于条件,无法得到任何查询结果)

    标题:Oracle中的rownum不能使用大于>的问题 转自网络,稍做修改: 一.对rownum的说明 关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中的"&g ...

  5. MySQL数据库子查询#where、from、exists三大类型子查询总结

    1.什么是子查询? 当一个查询嵌套了另一个查询,把嵌套在里面的查询先执行的查询就称为子查询. 2.什么情况下会使用到子查询? 当一个查询要完成时,需要用到另一个查询的结果才能继续操作,那么这个查询的s ...

  6. 如何在mysql查询结果集中得到记录行号_获取MySQL查询结果集中记录行号的方法...

    如果需要在查询语句返回的列中包括一列以指示整个结果集中记录的行号,则ISO SQL: 2003标准建议的方法是提供ROW_NUMBER()/ RANK()函数. Oracle可以使用标准方法(版本8i ...

  7. Oracle数据库sql语句练习【emp和dept的连表查询由浅入深】

    Oracle SQL语句练习题 一.表的介绍 Oracle中有几个原始的表,我们可以以其中的三个表为例,来学习一下Oracle中SQL语句的使用.先看下这几个表的结构: 雇员表(emp) 假设该表中的 ...

  8. mysql查询男生基本情况_详解MySql基本查询、连接查询、子查询、正则表达查询...

    select * from STUDENT; 2.2.按条件查询 (1) 比较运算符 > , < ,= , != (< >),>= , <= select * fr ...

  9. 如何在mysql查询结果集中得到记录行号_MySQL中在查询结果集中得到记录行号的方法...

    如果需要在查询语句返回的列中包含一列表示该条记录在整个结果集中的行号, ISO SQL:2003 标准提出的方法是提供 ROW_NUMBER() / RANK() 函数. Oracle 中可以使用标准 ...

最新文章

  1. Android开发之使用Handler封装下载图片工具类(源代码分享)
  2. c语言程序如何实现递减,写一个程序让非递减变成非递增,用C语言。一个程序用两个函数...
  3. Linux-鸟菜-2-主机规划与磁盘分区
  4. 认识 Linux 系统结构
  5. UIButton中的三个UIEdgeInsets属性
  6. WebView加载html页面
  7. C# Barrier类
  8. html post前md5加密,post提交及MD5加密
  9. mysql常见错误解决方法_mysql常见错误解决办法
  10. 前端练手项目合集40.0个,附源码,2022年最新
  11. RTI_DDS自定义插件开发 5 专属区域(_xxEA)
  12. QT 自定义类访问UI控件的几种方法
  13. 用jQuery合并表格中相同文本的相邻单元格
  14. AJDK-Wisp协程
  15. 原生js删除节点、替换节点、复制节点
  16. 人生苦短_人生苦短,懂事太晚!
  17. 消化系统疾病病人的护理
  18. 图像转 ico 图标工具 Any to Icon v3.59
  19. SpringBoot(一)——入门
  20. 一阶系统开环传递函数表达式_机械振动理论(2)-多自由度系统

热门文章

  1. 高通骁龙600系列处理器
  2. Linux 下查看硬盘 smart 信息
  3. 石家庄联通宽带DNS服务器地址
  4. java图片压缩质量_java图片高质量压缩
  5. DSP F28335时钟及控制系统
  6. 最长可重叠的重复子串(2)
  7. 这是一份普通的cpp答卷,可能有错
  8. 在线AES加密/解密工具
  9. 大型网站技术架构-读后感
  10. excel文件无法打印提示内存不足_Mac应用程序无法打开提示不明开发者或文件损坏的处理方法...