先决条件
要遵循并完全理解本教程,您需要具备以下条件:
- 弧型
- SQL基础知识
什么是子查询?
子查询是嵌套在另一个 SQL 查询中的 SQL 查询。它们帮助查询为WHERE子句创建条件以过滤行并对它们执行操作。子查询可以使用SELECT,INSERT,UPDATE,和DELETE语句。
WHERE 子句中的子查询示例
我们希望在交易金额大于 1,000 元的数据库中获取用户。对于我们的示例,我们将有两个表,分别是users和transactions存储用户和交易信息。
我们可以编写一个查询,从transactions表中提取金额超过 1,000 美元的所有行,然后将其用作另一个查询的条件,该查询将users根据第一个查询的结果从表中提取行。
查询将如下所示:
SELECT *
FROM users
WHERE id IN
(SELECT user_id
FROM transactions
WHERE amount > 1000);
子查询的优点
- 与连接相比,子查询通过将它们构建为独立的部分来提高查询可读性。
- 易于理解和维护子查询。
- 子查询可以替代复杂的连接和联合。
子查询的缺点
- 子查询不能在同一个 SQL 语句中修改一个表并从同一个表中进行选择。
- 子查询是一项开销很大的任务,因此使用连接操作会更快。
运行子查询练习
我们将探索一些使用 Arctype 的示例,我们将在其中展示子查询并了解它们是如何在应用程序中构建和使用的。
我们需要创建一个我们将在本教程中使用的数据库。为方便起见,我创建了一个包含 SQL 文件的GitHub Gist,用于构建我们的数据库模式并将虚拟数据插入其中。要使用它,我们需要执行以下操作:
- 使用 Arctype 连接到我们的数据库。
- 导航到 Arctype 中的查询选项卡并创建一个新查询。
- 粘贴并运行Gist 中的create.sql 文件以创建模式。
- 再次导航到查询选项卡以创建新查询。
- 粘贴并运行Gist 中的insert.sql 文件,用虚拟数据填充数据库。
使用子查询选择数据
让我们编写一个查询来从BUYER表中引用的SKU_DATA表中选择所有行。在 Arctype 中创建一个新查询并执行以下代码:
SELECT *
FROM BUYER
WHERE BuyerName IN
(SELECT BUYER
FROM SKU_DATA);
在上面的代码中,我们创建了一个内部查询,该查询BUYER从SKU_DATA表中选择列,然后使用它作为条件从BUYER表中选择具有相同BuyerName列值的行。
使用子查询更新数据
让我们编写一个查询,将2016 年销售的所有商品Price的ORDER_ITEM表中列的值增加10%。在 Arctype 中创建一个新查询并执行以下代码:
UPDATE ORDER_ITEM
SET Price=Price*1.1
WHERE SKU IN
(SELECT SKU
FROM CATALOG_SKU_2016);
在上面的代码中,我们创建了一个内部查询,它SKU从CATALOG_SKU_2016表中选择列来过滤我们应该在ORDER_ITEM表中更新的行。
使用子查询删除数据
我们将编写一个子查询,从INVENTORY存储在小于 130,000 平方英尺的仓库中的表中删除所有记录。查询将如下所示:
DELETE
FROM INVENTORY
WHERE WarehouseID IN
(SELECT WarehouseID
FROM WAREHOUSE
WHERE SquareFeet < 130000);
使用嵌套子查询
也可以在另一个子查询中包含子查询。下面是一个例子:
SELECT *
FROM CATALOG_SKU_2017
WHERE SKU IN
(
SELECT SKU
FROM INVENTORY
WHERE WarehouseID IN
(
SELECT WarehouseID
FROM WAREHOUSE
WHERE SquareFeet > 130000
)
);
在此示例中,我们从CATALOG_SKU_2017存储在平方英尺大于 130,000 的仓库中的表中选择了所有行。