博客
关于我
第十章:SQL Server2019数据库之多行子查询
阅读量:114 次
发布时间:2019-02-26

本文共 2173 字,大约阅读时间需要 7 分钟。

学前必备知识

本章将介绍多行子查询的核心操作符及其应用,包括 IN、NOT IN、EXISTS、NOT EXISTS、ALL、ANY 和 SOME 等操作符。


一、IN 和 NOT IN 操作符的多行子查询

IN 子查询用于在外层查询和子查询之间建立关联,判断某个属性列是否存在于子查询结果中。IN 子查询的返回值可以是零个或多个值,而外层查询会基于子查询的结果进行筛选。

IN 子查询的使用步骤

  • 执行内部子查询:子查询返回一个结果集。
  • 外层查询基于子查询结果进行筛选:IN 子查询的结果用于与外层查询的列进行比较,返回匹配的记录。
  • 示例

    【示例01】

    获取 tb_book 图书表和 tb_book_author 作者表中具有相同部门的作者所写的图书信息。
    SQL 语句:

    SELECT * FROM tb_book  WHERE book_sort IN(SELECT tb_author_department FROM tb_book_author WHERE tb_book.book_sort = tb_book_author.tb_author_department)  ORDER BY book_price;

    NOT IN 子查询

    NOT IN 子查询用于排除子查询结果中的值。与 IN 子查询类似,NOT IN 子查询也用于在外层查询和子查询之间建立关联,但会排除子查询结果中的值。

    【示例02】

    查询 tb_book 图书表中不在 tb_book_author 作者表中的部门的图书信息。
    SQL 语句:

    SELECT * FROM tb_book  WHERE book_sort NOT IN(SELECT tb_author_department FROM tb_book_author);

    小结:NOT IN 子查询在性能上可能较慢,但在理解和编写 SQL 语句时更直观。可以通过外连接替代 NOT IN 子查询以提高性能。


    二、EXISTS 和 NOT EXISTS 操作符

    EXISTS 和 NOT EXISTS 操作符用于判断子查询结果是否存在。EXISTS 返回 TRUE,若子查询结果非空;NOT EXISTS 返回 TRUE,若子查询结果为空。

    EXITS 子查询的使用

  • 关键字位置:EXISTS 通常直接放在外层查询的 WHERE 子句后面。
  • 子查询的选择列表:子查询的选择列表通常使用 *,因为只需要判断数据行的存在性,而不是具体的值。
  • 示例

    【示例03】

    获取 tb_book 图书表和 tb_book_author 作者表中具有相同部门的作者所写的图书信息。
    SQL 语句:

    SELECT * FROM tb_book  WHERE EXISTS(SELECT * FROM tb_book_author WHERE book_sort = tb_book_author.tb_author_department)  ORDER BY book_price;

    NOT EXISTS 子查询

    NOT EXISTS 子查询用于排除子查询结果中的值。与 EXITS 子查询类似,但返回 TRUE 时表示子查询结果为空。

    【示例04】

    获取 tb_book 图书表与 tb_book_author 作者表中相同部门以外的图书信息。
    SQL 语句:

    SELECT * FROM tb_book  WHERE NOT EXISTS(SELECT tb_author_department FROM tb_book_author WHERE book_sort = tb_book_author.tb_author_department)  ORDER BY book_price;

    三、量词实现多行子查询

    量词包括 ALL、ANY 和 SOME,用于将比较运算符左边的单值与子查询返回的多行结果集进行比较。

    1. 使用量词实现多行查询

    量词允许将比较运算符左边的单值与子查询返回的多行结果集进行比较。

    【示例05】

    查询 goods 表中同类商品中售价高于平均售价的商品信息。
    SQL 语句:

    SELECT cat_id, goods_name, shop_price FROM goods  WHERE shop_price < ALL(SELECT AVG(shop_price) FROM goods GROUP BY cat_id);

    2. 使用 ALL 操作符

    ALL 操作符用于比较子查询返回结果集中的所有值。

    • &lt;ALL>:左边值小于子查询结果中的最小值。
    • &gt;ALL>:左边值大于子查询结果中的最大值。
    • =ALL>:无效操作符。

    【示例06】

    查询 goods 表中商品售价比平均售价高的商品信息。
    SQL 语句:

    SELECT cat_id, goods_name, shop_price FROM goods  WHERE shop_price > ANY(SELECT AVG(shop_price) FROM goods GROUP BY cat_id);

    总结:量词(ALL、ANY、SOME)允许将比较运算符左边的单值与子查询返回的多行结果集进行比较,适用于多行子查询场景。

    转载地址:http://qcik.baihongyu.com/

    你可能感兴趣的文章
    poj 3264(简单线段树)
    查看>>
    Qt笔记——布局管理三件套分割窗口、停靠窗口和堆栈窗口
    查看>>
    poj 3277 线段树
    查看>>
    POJ 3349 Snowflake Snow Snowflakes
    查看>>
    POJ 3411 DFS
    查看>>
    poj 3422 Kaka's Matrix Travels (费用流 + 拆点)
    查看>>
    Qt笔记——官方文档全局定义(二)Functions函数
    查看>>
    POJ 3468 A Simple Problem with Integers
    查看>>
    poj 3468 A Simple Problem with Integers 降维线段树
    查看>>
    poj 3468 A Simple Problem with Integers(线段树 插线问线)
    查看>>
    poj 3485 区间选点
    查看>>
    poj 3518 Prime Gap
    查看>>
    poj 3539 Elevator——同余类bfs
    查看>>
    Qt笔记——官方文档全局定义(三)Macros宏
    查看>>
    poj 3628 Bookshelf 2
    查看>>
    Qt笔记——官方文档全局定义(一)Types数据类型
    查看>>
    POJ 3670 DP LIS?
    查看>>
    POJ 3683 Priest John's Busiest Day (算竞进阶习题)
    查看>>
    POJ 3988 Selecting courses
    查看>>
    POJ 4020 NEERC John's inversion 贪心+归并求逆序对
    查看>>