诚之和:在SQL中如何使用 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 的仓库中的表中选择了所有行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45378258

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值