9.子查询

原创 2018年04月17日 09:34:29

我这些学习笔记,记录的都是我自己认为的知识点,可能以后再看的时候还要翻书,但是可以用来定位到准确的书中示例的位置,减少翻书重找的时间,利于自身知识体系的搭建。                   self-transcendence

第9章 子查询

9.1 单行子查询

实际应用中,如果知道使用的子查询返回的结果是一行数据,即返回的结果是一个值时,就可以使用算数比较运算符进行操作。> < =等等....

例:where money > (select money from a where name=’老王’)

如上的子查询返回一个值,才能用比较运算符,否则不能用。

 

 

 

9.2 多行子查询

子查询返回的结果集中有多行数据,就要使用多行运算符inanyall等。

 

9.2.1 使用in运算符

In运算符,将满指定列表中满足表达式的所有值都查询出来。

例:where dept in (select dept from dept_tab)

也可以使用not in,查出所有不满足的值。

 

9.2.2 使用any运算符

Any把与子查询中任一结果匹配的值返回,使用any时要和比较运算符(< >等)一起使用。

Any和比较运算符结合

意义

=any

等于查询结果中的任一值。相当于in

>any

大于查询结果中的任一值。即大于查询结果中的min

<any

小于查询结果中的任一值。即小于查询结果中的max

>=any

大于等于查询结果中的任一值。即大于等于查询结果中的min

<=any

小于等于查询结果中的任一值。即小于等于查询结果中的max

<>any(!=any)

不等于查询结果中的任一值。

例:where money >any (select money from a)

 

9.2.3 使用all运算符

All把跟子查询中的匹配的结果全部返回,使用all时要和比较运算符(< >等)一起使用。

all和比较运算符结合

意义

=all

等于查询结果中的所有值

>all

大于查询结果中的所有值。即大于查询结果中的max

<all

小于查询结果中的所有值。即小于查询结果中的min

>=all

大于等于查询结果中的所有值。即大于等于查询结果中的max

<=all

小于等于查询结果中的所有值。即小于等于查询结果中的min

<>all(!=all)

不等于查询结果中的所有值。相当于not in运算符

例:where money >all(select money from a)

 

 

 

9.3 多列子查询

返回多个数据列的子查询语句。在where中也可以使用将多个属性值用括号括起来的方式实现多列子查询。多列子查询中,where中需要用括号将属性括起来,用逗号分隔。

例:where (dept,pro) = (select dept,pro from t_tab where dept=’60’)

在多列子查询中,如果是多个列成对比较,则外层查询的where中数据列属性要和子查询中的数据列的属性相同。如果dept=’60’有多条,那么就不能使用=要使用in

 

 

 

9.4 相关子查询

相关子查询中,子查询会重复执行。没处理一行外部的查询语句,子查询都会被执行一次。使用existsnot exists关键字实现。

 

带有exists关键字的子查询执行后只会返回truefalse,不会返回数据。

如果exists的子查询中有返回的结果,那么外层查询的where就返回true,然后该结果就会作为最后的结果集显示出来;如果子查询中没有返回的结果,那么外层的where就会返回false,这个过程会反复执行,直到外层查询出来的数据全部检测完毕。

例:select * from s_tab s where exists (select * from t_tab t where s.id=t.id)

使用exists子查询时,子查询select后面一般都用*,因为返回的只会是truefalse所以用列名没有意义。

由于相关子查询会反复执行,因此数据库的负担会较大,如果子查询中嵌套层数过多,就会影响查询效率,这时候就要考虑用连接查询来做。

 

Not exists exists相反。Not exists子查询中没有返回的结果,外层where就返回true,然后该结果就会作为最后的结果集显示出来;如果子查询中有返回的结果,那么外层的where就会返回false

例:select * from s_tab s where not exists (select * from t_tab t where s.id=t.id)

相关子查询中,外部查询和子查询是有关联的,子查询的查询条件要依赖于外层查询中的属性值。

 

 

 

9.5 sql语句中使用子查询

子查询除了在where中使用,还可以在selectfromorder byhavingcreate tablecreate viewinsertupdatedelete等语句中使用。

 

9.5.1 select中使用子查询

例:select a.stuId,(select stuName from t_tab where stuId=a.stuId) as stuName from t1_tab

 

9.5.2 from中使用子查询

例:from t_tab,(select id,name,age from b_tab)b_tab where t_tab.id=b_tab.id

 

9.5.3 having中使用子查询

例:having a.id in (select stuId from b)

 

 

 

9.6 多重子查询

多重子查询允许查询条件中有多个子查询语句

例:where name in (select name from a) and age in (select age from b)

子查询中嵌套的层次过多,会影响查询效率,首先要选择避免。如果一定要用,应该在子查询中尽量将无用的数据过滤掉。Oracle中最多允许子查询嵌套16层。

 

 

 

9.7 create table语句中使用子查询实现数据表的复制

回头再仔细看,暂时感觉没有作用

 

9.数据库中的子查询

子查询 在一个 select 语句中,嵌入了另外一个 select 语句,那么被嵌入的 select 语句称之为子查询语句   主查询 主要查询的对象,第一条 select 语...
  • xun527
  • xun527
  • 2017-09-22 23:24:32
  • 153

数据库子查询数据库子查询

  • 2009年09月27日 11:30
  • 31KB
  • 下载

相关子查询和嵌套子查询

SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类。前提,假设Books表如下: 类编号  图书名         出版社               价格 -----------...
  • looksun
  • looksun
  • 2014-11-16 11:19:50
  • 2823

SQLServer--IN子查询与NOT IN子查询的用法

IN子查询–使用IN后面的子查询可以返回多条记录。常用IN替换等于(=)的比较子查询 NOT IN子查询--使用IN后面的子查询可以返回多条记录。常用IN替换等于(=)的比较子查询 Select S...
  • qq_36482772
  • qq_36482772
  • 2017-08-30 15:27:28
  • 350

Hibernate HQL的子查询

子查询是SQL中很重要的功能,他可以在SQL中利用另外一条SQL的查询结果,HQL同样支持此机制如果子查询返回都条记录,可以用以下关键字进行量化all: 表示所有记any:表示所有记录中的任意1条so...
  • daryl715
  • daryl715
  • 2007-12-06 14:37:00
  • 14743

相关子查询&非相关子查询概念

子查询:嵌套在其它查询中的查询语句。(又称为内部查询)主查询:包含其它子查询的查询称为主查询。(又称外部查询) 子查询分为两类:相关子查询非相关子查询在主查询中,每查询一条记录,需要重新做一次子查询,...
  • sTeVes
  • sTeVes
  • 2010-01-19 14:17:00
  • 8474

关联子查询-嵌套子查询

查询里边还有一个区别:关联子查询和嵌套子查询,关联子查询就是把子查询部分的数据作为一个中间表放在from的位置,在where中当作两个单独的表对待,  而嵌套子查询则是将子查询的数据作为外部查询的一部...
  • dreamwbt
  • dreamwbt
  • 2017-01-10 18:06:15
  • 3840

相关子查询和不相关子查询

子查询:嵌套在其他查询中的查询称之。 子查询又称内部,而包含子查询的语句称之外部查询(又称主查询)。 所有的子查询可以分为两类,即相关子查询和非相关子查询 1. 非相关子查询是独立于外部查询的子...
  • dacainiao007
  • dacainiao007
  • 2012-10-30 18:08:00
  • 3611

[疯狂Java]SQL:子查询

1. SQL标准对子查询的定义:     1) 简单的讲就是嵌套select查询,SQL都支持多层嵌套查询;     2) 要求内存的查询必须用括号()包起来;     3) 子查询可以出现的位...
  • Lirx_Tech
  • Lirx_Tech
  • 2016-04-10 17:35:40
  • 1069

SQL子查询的一些例子

1、单行子查询        select ename,deptno,sal        from emp        where deptno=(select deptno from dept ...
  • devercn
  • devercn
  • 2004-06-23 01:01:00
  • 126545
收藏助手
不良信息举报
您举报文章:9.子查询
举报原因:
原因补充:

(最多只允许输入30个字)