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

    你可能感兴趣的文章
    Python3.12 解决conda环境libstdc++版本过低问题
    查看>>
    python3.2批量查询IP地址区域
    查看>>
    Python3.5中协程和未来/任务之间的区别?
    查看>>
    python3.5实现socket通讯(TCP)
    查看>>
    python3.6 ubuntu部署nginx、 uwsgi、 django
    查看>>
    Python3.6.3中,functools似乎不能用
    查看>>
    python3.6.5+cuda9+cudnn7.1+win10+tensorflow-gpu1.9.0下载配置
    查看>>
    python3.6使用pickle序列化class
    查看>>
    python3.6入门到高阶(全栈) day027 网络通信协议 osi七层模型
    查看>>
    Python3.6属性错误:模块‘;异步没有属性‘;运行‘;
    查看>>
    python3.6版本中的python-weka-wrapper安装失败,错误代码为%1
    查看>>
    Python3.7安装cv2踩过的坑
    查看>>
    python写txt文件
    查看>>
    python关于sorted排序函数详细解析 附实战代码(全)
    查看>>
    python3.8调用m文件,调用matlab
    查看>>
    python3.9新特性_Python 3.9 新特性速览
    查看>>
    Python3.x:遍历select下拉框获取value值
    查看>>
    python360百科_11月编程排行榜:Python超过Java成第二
    查看>>
    Python关于Paginator分页函数详细解析 附实战代码
    查看>>
    python3、ipython3、setup-tools、pip等环境搭建详细总结
    查看>>