TOP

SQL 第 9 课. 子查询

到目前为止,我们一直使用简单的查询和单个 SELECT 语句从数据库获取数据。然而,尽管如此,更多时候我们需要选择满足很多条件的数据,而这里就离不开高级查询。为此,在 SQL 中存在子查询或嵌套查询,其中一个 SELECT 语句嵌套在另一个语句中。

子查询是嵌套在另一个 SELECT、SELECT...INTO、INSERT...INTO、DELETE、UPDATE 内或另一个子查询内的 SELECT 语句。

子查询文本必须用括号括起来。通常使用子查询来代替连接表 (JOIN)。


1.使用子查询进行过滤

DBMS Access 中使用的数据库表是关系表,即所有表都可以通过公共字段相互链接。假设我们将数据存储在两个不同的表中,并且需要根据另一个表中的数据来选择其中一个表中的数据。为此,我们将在数据库中创建另一个表。例如,表 Sellers 包含有关供应商的信息:

现在我们有两个表 - Sumproduct 和 Sellers,它们具有相同的字段 City。假设我们需要计算仅在加拿大就销售了多少产品。子查询将帮助我们做到这一点。因此,首先,让我们为位于加拿大的城市样本编写一个查询:

Run SQLSELECT City 
FROM Sellers 
WHERE Country = 'Canada'

现在让我们将此数据传递给以下查询,该查询将从 Sumproduct 表中选择数据:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN ('Montreal','Toronto')

我们还可以将这两个请求合二为一。因此,一个输出数据的请求将是主请求,而第二个传递输入数据的请求将是辅助请求(子查询)。要插入子查询,我们将使用结构 WHERE ... IN (...),该结构已在 高级过滤 部分中讨论:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN (SELECT City 
               FROM Sellers 
               WHERE Country = 'Canada')

我们可以看到,我们获得了与两个单独查询相同的数据。同样,我们可以通过多次嵌套子查询来增加查询的嵌套深度。

2、使用子查询作为结算字段

我们还可以使用子查询作为计算字段。例如,我们使用以下查询来显示每个卖家的已售产品数量:

Run SQLSELECT Seller_name, (SELECT SUM(Quantity) 
                     FROM Sumproduct 
                     WHERE Sellers.City = Sumproduct.City) AS Qty 
FROM Sellers

第一个语句 SELECT 显示两列 - Seller_name 和 Qty。字段 Qty 是计算出来的,它是子查询执行的结果,用圆括号括起来。该子查询对 Seller_name 字段中的每条记录执行一次,由于选择了四个卖家名称,因此总共执行四次。

另外,在子查询中,WHERE 子句执行联接功能,因为在 WHERE 的帮助下,我们使用列的全名 (Table.Field) 通过 City 字段联接两个表。