SQL应用与开发:(七)数据操作 查 (三)使用子查询访问和修改

3.使用子查询访问和修改数据

子查询和连接查询一样提供了使用单个查询访问多个表中的数据的方法。子查询在其他结果的基础上提供一种有效地方式来表示WHERE子句的条件。子查询是一个SELECT语句,它定义在SELECT、INSERT、UPDATE或DELECT语句或者另一个子查询中。子查询的SELECT语句可与外部查询指向不同的表。

嵌套的子查询或嵌套的SELECT语句是指包含一个或多个子查询的SELECT语句。子查询可嵌套在外部的SELECT、INSERT、UPDATE或DELECT语句的WHERE或HAVING子句或其他子查询内。如果嵌套了多层,则总是首先评估最内层的查询。子查询也成为内查询,也可以嵌套任意数量的子查询。任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。

3.1返回多行的子查询

子查询是在SELECT语句中的WHERE子句实现的,可以把WHERE子句中的子查询分成两类:返回多行的子查询和只返回一个值的子查询。

3.1.1使用IN关键字

可以使用IN关键字来判断一个表中指定列的值是否包含在已定义的列表中,或者在另一个表中。在前一种情况下,可以指定列名、IN关键字和用来指定列进行比较的值列表;在后一种情况下,可以指定列名、IN关键字和引用另外一个表的子查询。

举例来说,从数据库”销售管理系统“中,查询(没有)接待过顾客的业务员的相关信息。

SELECT 业务员姓名,家庭住址,电话

FROM 业务员信息

WHERE 业务员编号 (NOT)IN

( SELECT 所属业务员编号

FROM 客户信息 )

3.1.2使用EXISTS关键字

在一些情况下,只需要返回一个真值或者假值。EXISTS关键字只注重子查询是否返回行。如果子查询返回一个或多个行,那么EXISTS便返回为真,否则为假。子查询必须是一个真实的值,它用来比较不同表中两列的值。

使用EXISTS关键字引入一个子查询时,就相当于进行一次是否存在的测试。它的作用是在WHERE子句中测试子查询返回的行是否存在。EXISITS子查询实际上不产生任何数据,它只返回TRUE或FALSE。

举例来说,,在数据库”销售管理系统“中,查询”供应商信息“表中,”供应商编号“为1006的供应商所提供的商品的相关信息。

SELECT 商品名称,产地,单价

FROM 商品信息

WHERE EXISITS

(SELECT *

FROM 供应商信息

WHERE 供应商编号=商品信息.供应商编号

AND 供应商编号=1006)

NOT EXISTS和EXISTS相反,如果子查询没有返回行,则满足NOT EXISTS中的WHERE子句,即在子查询返回行时,NOT EXISTS查询成功。

举例来说,在”珠宝销售系统“中,查询在”销售信息“中没有提供珠宝并且其所在城市不是北京市的珠宝商的相关信息,并按”珠宝商所在城市“进行排序。

SELECT 珠宝商姓名,珠宝商地址,珠宝商所在城市,电话

FROM 珠宝商信息

WHERE NOT EXISTS

(SELECT *

FROM 销售信息

WHERE 珠宝商编号=珠宝商信息.珠宝商编号

)

AND 珠宝商所在城市<>’北京市’

ORDER BY 珠宝商所在城市

3.1.3使用比较运算符

子查询可以由一个比较运算符引入。与使用关键字IN引入的子查询一样,由比较运算符与一些关键字引入的子查询返回一个值列表。

SQL支持的在子查询中使用到的比较运算符有ANY、SOME和ALL。ANY和SOME关键字只注重是否有返回值满足搜索条件,它们的含义相同,可以相互替换使用。ALL关键字只注重是否所有的返回值都满足搜索条件。

举例来说,在数据库”销售管理系统“的”出库单明细信息“表中,查询”出库商品金额“大于任意一个”入库单明细信息“表中”入库商品金额“高于10000的出库单的相关信息。

SELECT *

FROM 出库单明细信息

WHERE 出库单商品金额 > ANY

(SELECT 入库商品金额

FROM 入库单明细信息

WHERE 入库商品金额 > 10000)

为了方便学习两者使用情况,我们进行对比学习,下面就举一个相同的例子,在数据库”销售管理系统“的”出库单明细信息“表中,查询”出库商品金额“大于所有”入库单明细信息“表中”入库 商品金额“低于10000的出库单的相关信息。

SELECT *

FROM 出库单明细信息

WHERE 出库单商品金额 > ALL

(SELECT 入库商品金额

FROM 入库单明细信息

WHERE 入库商品金额 < 10000)

3.2返回单个值的子查询

这样的子查询只返回一个值,然后将一列值与单个子查询返回的值进行比较,这时可以使用比较运算符。

由未修改的比较运算符(后面不跟ANY或ALL的比较运算符)引入的子查询必须返回单个值而不是值列表。

举例来说,在”珠宝销售系统“中,查询与”消费者编号“为27的消费者同处一个城市的珠宝商相关信息,要求以列”珠宝商姓名“、”珠宝商地址“、”珠宝商所在城市“和”电话“的形式返回查询结果。

SELECT 珠宝商姓名,珠宝商地址,珠宝山所在城市,电话

FROM 珠宝商信息

WHERE 珠宝商所在城市=

(SELECT 消费者所在城市

FROM 顾客信息

WHERE 消费者编号=27

)

由于聚集函数可以返回一个单值,所以可以在子好擦寻中包含聚集函数。

举例来说,在数据库”销售管理系统“中的”商品信息“表中,查询单价大于平均价格的商品的相关信息。要求以列”商品名称“、”产地“和”单价“的形式返回查询结果。

SELECT 商品名称,产地,单价

FROM 商品信息

WHERE 单价>

(SELECT AVG(单价)

FROM 商品信息

)

3.3使用相关子查询

时光的消化是这样的缓慢。虽然这也仅仅是无处可说的委屈。而不是痛苦。

SQL应用与开发:(七)数据操作 查 (三)使用子查询访问和修改

相关文章:

你感兴趣的文章:

标签云: