本文共 2173 字,大约阅读时间需要 7 分钟。
本章将介绍多行子查询的核心操作符及其应用,包括 IN、NOT IN、EXISTS、NOT EXISTS、ALL、ANY 和 SOME 等操作符。
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 子查询用于排除子查询结果中的值。与 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 返回 TRUE,若子查询结果非空;NOT EXISTS 返回 TRUE,若子查询结果为空。
*,因为只需要判断数据行的存在性,而不是具体的值。【示例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 子查询用于排除子查询结果中的值。与 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,用于将比较运算符左边的单值与子查询返回的多行结果集进行比较。
量词允许将比较运算符左边的单值与子查询返回的多行结果集进行比较。
【示例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);
ALL 操作符用于比较子查询返回结果集中的所有值。
<ALL>:左边值小于子查询结果中的最小值。>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/