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.5 使用子查询 - 图1

图 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.5 使用子查询 - 图2

图 5.30 查询产品价格在最大值和最小值之间的数据