一.SELECT列表中的标量子查询

查询每种书籍类型中的最早出版的书籍。在SQL 查询中,需要将一本书籍的出版年份与该类型的所有书籍的出版年份进行比较,并且仅仅在它们匹配时,才返回一个记录

SELECT T_Category.FId, T_Book. FName,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
)

二.集合运算符与子查询

标量子查询对子查询的要求非常高,而很多情况下查询结果并不能做为标量子查询。如果子查询是多行多列的表子查询,那么可以将其看成一个临时的数据表 使用,而如果子查询是多行单列的表子查询,这样的子查询的结果集其实是一个集合,SQL 提供了对这样的集合进行操作的运算符,包括IN、ANY、ALL以及EXISTS等

1.IN 运算符

SELECT * FROM T_Reader
WHERE FYearOfJoin IN
(
select FYearPublished FROM T_Book
)

2.ANY和SOME 运算符

SELECT * FROM T_Reader
WHERE FYearOfJoin =ANY
(
select FYearPublished FROM T_Book
)

也就是说“=ANY”等价于IN 运算符,而“<>ANY”则等价于NOT IN 运算符。除了等于运算符,ANY 运算符还可以和大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等比较运算符共同使用。比如下面的SQL 语句用于检索在任何一个会员出生之前出版的图书:
SELECT * FROM T_Book
WHERE FYearPublished<ANY
(
SELECT FYearOfBirth FROM T_Reader
)

3.ALL运算符

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

SELECT * FROM T_Book
WHERE FYearPublished<ALL
(
SELECT FYearOfJoin FROM T_Reader
)

3.EXISTS运算符

和IN、ANY、ALL等运算符不同,EXISTS运算符是单目运算符,它不与列匹配,因此它也不要求待匹配的集合是单列的。EXISTS运算符用 来检查每一行是否匹配子查询,可以认为EXISTS就是用来测试子查询的结果是否为空,如果结果集为空则匹配结果为false,否则匹配结果为true。

SELECT * FROM T_Book
WHERE EXISTS
(
SELECT * FROM T_Reader
WHERE FProvince=’ShanDong’
)

这句SQL 语句对T_Book 表中的每行数据进行匹配,测试是否存在山东省的读者,因为系统中存在山东省的读者,所以这个SQL语句将检索出所有的图书。

SELECT * FROM T_Category
WHERE EXISTS
(
SELECT * FROM T_Book
WHERE T_Book. FCategoryId = T_Category.FId
AND T_Book. FYearPublished<1950
)

在EXISTS后的子查询中,SQL对T_Category表中的每一行数据到子查询中进行匹配,测试T_Book 表中是否存在FCategoryId 字段值等于当前类别主键值且出版年份在1950 年之前的书籍。

三.在其他类型SQL语句中的子查询应用

1.子查询在INSERT语句中的应用

整表插入

INSERT INTO T_ReaderFavorite2(FCategoryId,FReaderId)
SELECT FCategoryId,FReaderId FROM T_ReaderFavorite

INSERT INTO T_ReaderFavorite(FCategoryId,FReaderId)
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 语句中的应用

UPDATE T_Book b1
SET b1.FYearPublished=2005
WHERE
(
SELECT COUNT(*) FROM T_Book b2
WHERE b1. FCategoryId=b2. FCategoryId
)>3

3.子查询在DELETE 语句中的应用

DELETE FROM T_Book b1
WHERE
(
SELECT COUNT(*) FROM T_Book b2
WHERE b1. FCategoryId=b2. FCategoryId
)>3

SQL笔记-第八章,子查询的更多相关文章

  1. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:7(子查询 判断某个字段的值是否连续)

    原文:在论坛中出现的比较难的sql问题:7(子查询 判断某个字段的值是否连续) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以 ...

  3. SQL 必知必会·笔记<9>使用子查询

    子查询(subquery),即嵌套在其他查询中的查询. 1. 利用子查询进行过滤 SELECT 语句中,子查询总是从内向外处理.示例: SELECT cust_name, cust_contact F ...

  4. Sql Server系列:子查询

    1 子查询概念 子查询是嵌套在另一个查询中的普通T-SQL查询.在有一个SELECT语句通过使用小括号创建子查询,作为另一个查询的部分数据或条件的基础. 子查询通常用于满足以下某个需求: ◊ 将一个查 ...

  5. 《MySQL必知必会学习笔记》:子查询

    子查询 在開始了解子查询之前,首先做下准备工作,建立3个表, 一个是customers表,当中包含:客户名字.客户ID.客户Tel等. 一个是orders表,当中包含:订单号.客户ID.订单时间等. ...

  6. 《mysql必知必会》笔记2(子查询、联接、组合查询、全文本搜索)

    十四:使用子查询 1:子查询是嵌套在其他查询中的查询. 2:需要列出订购TNT2的所有客户信息,需要下面几步: a:从orderitems表中检索出包含物品TNT2的所有订单号: b:根据上一步得出的 ...

  7. 分享一篇:sql语句中使用子查询,可能会引起查询的性能问题,查询时间会变长

    前段时间,做自动化适配的时候,查找需要的数据的时候,使用到了dblink,跨数据库实例进行访问,整段sql拼接再加上dblink,在plsql查询的时候,性能还不是很长时间,最多2分钟可以查到,前期调 ...

  8. sql 在not in 子查询有null值情况下经常出现的陷阱

    如果下:TempSalesPriceFixedValues表和SalesPriceFixedValues表,要求查询出在TempSalesPriceFixedValues表中且不在SalesPrice ...

  9. 7、SQL基础整理(子查询)

    子查询 (用来进行两个或以上表之间的查询) 1.首先新建一个bumen表和一个haha表,填充数据 2.利用两表进行子查询: --部门人数大于5的部门中最大年龄的人的信息--- select MAX( ...

随机推荐

  1. 【three.js详解之二】渲染器篇

    [three.js详解之二]渲染器篇   本篇文章将详细讲解three.js中渲染器(renderer)的设置方法. three.js文档中渲染器的分支如下: Renderers CanvasRend ...

  2. IE6,7 margin-bottom失效bug

    问题描述:ie6/7浏览器下,浮动元素贴近父元素的最后一行的元素(单行即指第1行)的margin-bottom值失效! 问题代码: <style type="text/css" ...

  3. SDK、MFC、QT界面生成的机制

    1.SDK进行界面设计的机制 (1)设计窗口类 (2)注册窗口类 (3)创建窗口 (4)显示及更新窗口 (5)消息循环,操作系统接收到应用程序的窗口消息,将消息投递到队列中,通过GetMessage( ...

  4. SendInput模拟Win(VK_LWIN)键的问题

    使用SendInput模拟按键,代码如下: #include "stdafx.h" #include <windows.h> #include <conio.h& ...

  5. SIFT特征提取分析(转载)

    转载自: http://blog.csdn.net/abcjennifer/article/details/7639681 SIFT(Scale-invariant feature transform ...

  6. linux之"server" directive is not allowed here in

    配置完rewrite之后重启nginx发现如下错误 "server" directive is not allowed here in* 原因是因为 外部配置的simple.con ...

  7. find命令学习

    find命令与locate命令的区别: locate: 非实时查找: 依赖于索引,而索引构建非常占用资源,索引的创建是在系统空闲时系统自动进行,可以用updatedb命令更新索引: 查找速度快: 非精 ...

  8. python request属性及方法说明

    if  request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属      性 描述 path 表示提 ...

  9. 论文笔记之:Co-saliency Detection via A Self-paced Multiple-instance Learning Framework

    Co-saliency Detection via A Self-paced Multiple-instance Learning Framework  T-PAMI  2016  摘要:Co-sal ...

  10. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...