5.5 使用子查询
什么是子查询?子查询就是嵌套查询,它是嵌套在另外一个语句中的SELECT语句。为什么会出现这种情况呢?主要原因是在很多情况下,WHERE后面的条件不是一个确切的值或表达式,而是另外一个查询语句的查询结果。子查询不仅仅出现在SELECT语句中,也会出现在DELETE和UPDATE语句中,它本质上是WHERE后的一个条件表达式。
出现这种情况的一个原因就是数据库设计导致的,但这种设计绝大部分是没有问题的。为了避免出现冗余数据,也为了避免出现不一致的数据,这么设计是完全正确的。例如,产品表PRODUCTINFO中的“产品类型编码”(category)字段引用了产品类型编码表(categoryinfo)的主键。假如知道产品类型,想检索该类型的产品具体包含了哪些产品,这时就不得不使用子查询。因为PRODUCTINFO表中没有“产品类型名称”字段,只有“产品类型编码”。
5.5.1 子查询返回单行
子查询允许返回单行数据,也允许返回多行数据。如果返回的是单行数据(不管是普通查询还是分组查询),那么这是逻辑上最简单的子查询嵌套查询语句。它和在WHERE条件中使用单一或多个条件限制的操作方法一致。
【示例28】单一条件子查询
要求查询产品类型为"MP3"的产品名称和产品价格。脚本如下:
SELECT productname,productprice FROM productinfo
WHERE CATEGORY=(SELECT categoryid FROM categoryinfo WHERE categoryname='MP3');
【执行效果】
执行效果见图5.29。
图 5.29 查询产品类型为MP3的产品
【示例29】多个条件子查询
查询出产品价格在最大值和最小值之间的产品,不包含两端的值。脚本如下:
SELECT productname,productprice FROM productinfo
WHERE productprice>(SELECT MIN(productprice)FROM productinfo)
AND productprice<(SELECT MAX(productprice)FROM productinfo)
【执行效果】
执行效果见图5.30。
图 5.30 查询产品价格在最大值和最小值之间的数据