一、子查询入门:

1、单值子查询:

单值子查询的唯一限制:子查询的返回值必须只有一行记录,而且只能有一列(又被称为标量子查询)。

可以使用在select语句的列表、表达式中,以及where语句中等。

例1:select 1 as f1,2,(select min(fyearpublished) from t_book),(select max(fyearpublished) from t_book) as f4 from dual;

2、列值子查询:

列值子查询可返回一个多行多列的结果集(又称为表子查询)。

可以使用在select语句的from子句中、insert语句、连接、in子句等。

例1:select t_reader.fname,t2.fyearpublished,t2.fname

from t_reader,(select * from t_book where fyearpublished < 1800) t2;

表子查询可以看做一张临时表,所以引用子查询中列的时候必须使用子查询中定义的列名,也就是如果子查询中为列定义了别名,那么在引用的时候也要使用别名。

例2:select t_reader.fname,t2.fyear,t2.fname,t2.f3

from t_reader,(select fyearpublished as fyear,fname,1+2 as f3 from t_book where fyearpublished < 1800) t2;

二、select列表中的标量子查询:

例1:select fid,fname,(select max(fyearpublished) from t_book where t_book.fcategoryid = t_category.fid)

from t_category;

这里的子查询与前面的不同,这个子查询必须依赖于外部查询的字段,也就是可以直接单独直行,而这里的子查询是依赖于外部查询中的t_category.fid这个字段的,是无法单独执行的。

三、where子句中的标量子查询:

例1:select freaderid from t_readerfavorite

where fcategoryid=(

select fid from t_category where fname='story'

);

例2:检索每种类型中最早出版的图书:

select t_category.fid,min(t_book.fyearpublished)

from t_category

inner join t_book on t_category.fid=t_book.fcategoryid

group by t_category.fid;

在上一句的基础上,加上书籍名称:

select t_category.fid,t_book.fyearpublished

from t_category

inner join t_book on t_category.fid=t_book.fcategoryid

where t_book.fyearpublished=

(

select min(t_book.fyearpublished) from t_book where t_book.fcategoryid=t_category.fid

);

首先在两个表内进行自连接,再在where子句中使用子查询来过滤数据。

四、集合运算符与子查询:

1、in运算符:

例:检索出所有图书出版年份内入会的读者信息:

select * from t_reader

where fyearofjoin in

(select fyearpublished from t_book);

2、any和some运算符:

在sql中any和some是同义词,基本用法也相同。any必须和其他比较运算符共同使用,而且必须将比较运算符放在any关键字之前,所比较的值也需要匹配子查询中的任意一个值:

例:any和=运算符共同使用的例子,检索出所有图书出版年份内入会的读者信息。“=any”等价于in

select * from t_reader

where fyearofjoin =any

(select fyearpublished from t_book);

any还可以和大于、小于、大于等于、小于等于等比较运算符共同使用。

例:检索出会员出生之前出版的图书。

select * from t_book

where fyearpublished<any

(select fyearofbirth from t_reader);

注意:any运算符不能和固定的集合相匹配,如:select * from t_book where fyearpublished<any(2001,2003,2005);

3、all运算符:

all运算符要求比较的值需要匹配子查询中的所有值,不能单独使用,同样不能与固定值匹配。

例:检索出所有会员入会之前出版的图书:

select * from t_book

where fyearpublished<all

(select fyearofjoin from t_reader);

注意:如果匹配的集合为空,也就是子查询没有返回任何数据的时候,不论与什么比较运算符搭配使用all的返回值将永远是true。

4、exists运算符:

这个是单目运算符,不与列匹配,也不要求匹配的集合是单列。exists是用来检查每一行是否匹配子查询,可以认为exists就是用来测试子查询结果是否为空的,如果结果集为空则匹配结果为false,否则匹配结果为true。

例:测试是否存在山东省的读者:

select * from t_book where exists

(select * from t_reader where fprovince='ShanDong');

例:检索在1950年以前出版的图书的图书类别:

select * from t_category where exists

(select * from t_book

where t_book.fcategoryid=t_category.fid and t_book.fyearpublished<1950);

五、子查询在其他类型sql语句中的应用:

1、在insert语句中的应用:

例:insert into t_readerfavorite(fcategoryid,freaderid)

//为t_reader表中每一个读者都在t_readerfavorite表中创建一条fcategoryid等于1的记录

select 1,fid from t_reader

where not exists

(select * from t_readerfavorite where t_readerfavorite.fcategoryid=1 and t_readerfavorite.freaderid=t_reader.fid);

2、在update语句中的应用:

例:将所有同类书本数超过3本的图书的出版日期更新为2005:

update t_book b1

set b1.fyearpublished=2005

where(select count(*) from t_book b2 where b1.fcategoryid=b2.fcategoryid)>3;

3、在delete语句中的应用:

例:将所有同类书本数超过3本的图书删除:

delete from t_book b1

where(select count(*) from t_book b2 where b1.fcategoryid=b2.fcategoryid)>3;

sql子查询的更多相关文章

  1. sql子查询 嵌套SELECT语句

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

  2. SQL子查询/嵌套查询

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

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

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

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

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

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

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

  6. SQL 子查询 EXISTS 和 NOT EXISTS

    MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT … FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据,放到子查 ...

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

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

  8. SQL查询优化思维即SQL子查询

    一. 什么叫子查询 定义及分类 子查询又称内部查询,而包含子查询的语句称之外部查询(又称主查询).所有的子查询可以分为两类,即相关子查询和非相关子查询. 非相关子查询是独立于外部查询的子查询,子查询总 ...

  9. PL/SQL 子查询

    一.概述 在一个SQL语句中嵌套另一个SQL语句成为子查询.包括单行子查询,多行子查询,多列子查询. 注意,当在DDL语句中引用子查询时,可以带有Order By子句:但是当在where子句.Set子 ...

随机推荐

  1. 一起学Linux04之Linux文件基本属性

    Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定. 为了介绍文件属性,首 ...

  2. ORA-00600[17059]错误

    ORA-00600[17059] ORA-00600[17059]错误大部分都是因为高版本导致,对于本库的分析:因为该库的 shared pool老化比较频繁,到我介入的时候,发现相关该类此sql已经 ...

  3. Java学习笔记22(Date类、DateFormat类)

    Date,时间和日期类,这里讲util包中的而不是sql包中的 Date:表示特定的时间瞬间,精确到毫秒(1000毫秒=1秒) 时间和日期的操作都基于毫秒值 时间原点:1970年1月1日,0时0分0秒 ...

  4. spark 1.6 完全分布式平台搭建

    软件环境: scala-2.11.4.tgz spark-1.6.2-bin-hadoop2.6.tgz 操作步骤: 一.  安装scala 1. 解压scala (tar –zxvf  filena ...

  5. 【读书笔记】【深入理解ES6】#9-JavaScript中的类

    大多数面向对象的编程语言都支持类和类继承的特性,而JavaScript却不支持这些特性,只能通过其他方法定义并关联多个相似的对象.这个状态一直从ECMAScript 1持续到ECMAScript 5. ...

  6. flask WTForms源码分析及自定义WTForms

    首先我们来创建一个From类 from wtforms.form import Form from wtforms import StringField from wtforms.validators ...

  7. Mac搭建cocos2dx+Android studio开发环境以及AnySDK的集成

    配置环境: mac osx 10.12.6 cocos2dx 3.14 Android studio 2.3 目标: 在mac上配置cocos Android开发环境,接入AnySDK 配置: 1.安 ...

  8. SpringBoot中出现的错误

    1.Field boy in com.huhu.SpringDemo.HelloController required a bean of type 'com.huhu.SpringBean.Boy' ...

  9. 树莓派搭建WEB服务器

    树莓派搭建WEB的教程网上有许多,但感觉每一篇都有一些问题,这次我将网上的教程汇总,并亲身实践,将注意的问题都写进去,方便新手学习! 目录:1,安装nginx+sqlite+php5打造轻量级服务器, ...

  10. HDU 2438 Turn the corner(三分查找)

    托一个学弟的福,学了一下他的最简便三分写法,然后找了一道三分的题验证了下,AC了一题,写法确实方便,还是我太弱了,漫漫AC路!各路大神,以后你们有啥好的简便写法可以在博客下方留个言或私信我,谢谢了! ...