博客
关于我
第十章: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/

    你可能感兴趣的文章
    Python函数只返回第一个值而不是数据框
    查看>>
    Python+SQL实战:京东用户行为数据分析案例解析(上)
    查看>>
    Python+SQL实战:京东用户行为数据分析案例解析(下)
    查看>>
    PYTHON+Twisted+sqlanydb=ABORT()
    查看>>
    Python函数之返回值、作用域和局部变量
    查看>>
    Python+统计学 | 探索常用的数据分析统计分布
    查看>>
    python, selenium中用于切换帧的函数
    查看>>
    python函数
    查看>>
    python----线程、进程、协程的区别及多线程详解
    查看>>
    python---5
    查看>>
    python---使用celery分布式系统异步发送短信(云通讯)来验证登录
    查看>>
    python--003--百分号字符串拼接、format
    查看>>
    Python--10、线程
    查看>>
    Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
    查看>>
    python--基本代码规范
    查看>>
    Python--抽象类接口类
    查看>>
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>