MySQL之使用子查询

上一篇我们总结了分组数据的相关知识,如GROUP BY子句和HAVING子句,本次我们将学习进阶内容——什么是子查询以及如何使用子查询。

1.子查询

MySQL4.1引入了对子查询的支持。SQL允许创建子查询(subquery),即嵌套在其他查询中的查询。

2.利用子查询进行过滤

(1)考虑如下示例:有三张表,orders表存储订单号、客户ID、订单日期;orderitems表存储各订单的物品;customers表存储客户信息。假设需要列出订购物品TNT2的所有客户信息,应该怎样检索呢?

(2)利用前面学习的知识,我们首先需要检索包含TNT2的所有订单的编号;然后再检索具有上述订单编号的所有客户的ID;最后检索前一步中返回的所有客户ID的客户信息:

1)检索包含TNT2的订单编号

2)检索具有订单20005和20007的客户ID

3)检索客户信息

(3)由上分析,我们使用了三个查询才将结果导出。既然本章内容我们是学习子查询的,那么一定可以使用嵌套查询将上述结果导出,语句如下:

1)为了执行上述SELECT语句,MySQL实际上必须执行3条SELECT语句。

2)列必须匹配:在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列。通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。

3)虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等。

3.作为计算字段使用子查询

使用子查询的另一方法是创建计算字段。假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。首先,要从customers表中检索客户列表;然后,对于检索出的每个客户,统计其在orders表中的订单数目。这里使用子查询语句如下:

1)其中orders列是一个计算字段,它是由圆括号中的子查询建立的。

2)子查询中的WHERE子句与前面使用的WHERE子句稍有不同,因为它使用了完全限定列名(WHERE orders.cust_id = customers.cust_id)。

3)这种类型的子查询称为相关子查询(correlated subquery,涉及外部查询的子查询)。任何时候只要列名可能有多义性,就必须使用这种语法。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注