• SQL笔记-第八章,子查询


    一.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

  • 相关阅读:
    数组的完全随机排列算法
    css超出2行部分省略号...
    前端面试题精华总结
    在地址栏输入网址后页面是如何呈现的?
    document.write和innerHTML的区别
    js运算符单竖杠“|”与“||”的用法和作用介绍
    border:none与border:0的区别
    如何实现浏览器内多个标签页之间的通信?
    js 关键字 in 的使用方法
    msyql: navicat 连接时msyql遇到的问题
  • 原文地址:https://www.cnblogs.com/xieqianli/p/4245481.html
Copyright © 2020-2023  润新知