5.5.2 子查询返回多行
如果子查询返回的值为多行值,那么需要用到IN关键字,此时IN的用法和前面介绍的方式一致。除此之外,也可以使用量化比较关键字SOME、ANY、ALL,这些需要配合<、<=、=、>、>=使用。它们所表示的含义如下:
❑ANY:表示满足子查询结果的任何一个。和<、<=搭配,表示小于等于列表中的最大值;而和>、>=配合时表示大于等于列表中的最小值。
❑SOME:可以认为和ANY含义相同。
❑ALL:表示满足子查询结果的所有结果。和<、<=搭配,表示小于等于列表中的最小值;而和>、>=配合时表示大于等于列表中的最大值。
【示例30】IN示例
查询产品表中产品类型为“电视”和"MP3"的数据。脚本如下:
SELECT productname,productprice FROM productinfo
WHERE CATEGORY IN
(SELECT categoryid FROM categoryinfo WHERE categoryname='电视'
OR categoryname='MP3');
【执行效果】
执行效果见图5.31。
图 5.31 使用IN操作子查询
【示例31】ANY示例
从产品表PRODUCTINFO中查询出价格低于指定价格列表中的最大值。指定的价格列表就是指产品类型编码为“0100030002”的所有产品价格。脚本如下:
SELECT productname,productprice FROM productinfo
WHERE productprice<
ANY(SELECT productprice FROM productinfo WHERE category='0100030002')
AND category<>'0100030002';
【执行效果】
执行效果见图5.32。
图 5.32 使用ANY操作子查询
【示例32】SOME示例
SELECT productname,productprice FROM productinfo
WHERE productprice=
SOME(SELECT productprice FROM productinfo WHERE category='0100030002')
AND category<>'0100030002';
SOME的用法和ANY一样,只不过ANY多用在非“=”的环境中。SOME这里表示找出和子查询中任何价格相等的产品。
执行效果这里不给出,没有符合的数据。
【示例33】ALL示例
找出比指定价格列表还低的产品数据。脚本如下:
SELECT productname,productprice FROM productinfo
WHERE productprice<
ALL(SELECT productprice FROM productinfo WHERE category='0100030002');
【执行效果】
执行效果见图5.33。
图 5.33 使用ALL操作子查询