带示例的 MySQL 子查询教程

什么是子查询?

子查询是一个包含在另一个查询中的SELECT查询。内部SELECT查询通常用于确定外部SELECT查询的结果。

我们来看看子查询的语法——

MySQL SubQuery

MyFlix视频库的一个常见客户投诉是电影数量太少。管理层希望购买一个标题数量最少的类别的电影。

您可以使用类似以下的查询

SELECT category_name FROM categories WHERE category_id =( SELECT MIN(category_id) from movies);

它会给出一个结果

MySQL SubQuery

让我们看看这个查询是如何工作的

MySQL SubQuery

上面是**行子查询**的一种形式。在此类子查询中,内部查询只能给出 ONE 个结果。与行子查询配合使用的允许的操作符是 [=, >, =, <=, ,!=, ]

让我们看另一个例子,

假设您想要那些租借了电影但尚未归还的会员的姓名和电话号码。一旦您获得姓名和电话号码,您就可以打电话给他们进行提醒。您可以使用类似以下的查询

SELECT full_names,contact_number FROM   members  WHERE  membership_number IN (SELECT membership_number FROM movierentals WHERE return_date IS NULL );


MySQL SubQuery

让我们看看这个查询是如何工作的

MySQL SubQuery

在这种情况下,内部查询返回多个结果。上面是Table子查询的类型。

到目前为止,我们已经看到了两个查询,现在让我们看一个三重查询的例子!!!

假设管理层希望奖励支付最高的会员。

我们可以运行类似以下的查询

Select full_names From members WHERE membership_number = (SELECT membership_number FROM payments WHERE amount_paid = (SELECT MAX(amount_paid) FROM payments));

上述查询产生以下结果——

MySQL SubQuery

子查询 vs 连接!

与连接相比,子查询使用简单且易于阅读。它们不像连接那样复杂

因此,它们经常被SQL初学者使用。

但是子查询存在性能问题。使用连接而不是子查询有时可以为您提供高达 500 倍的性能提升。

如果可以二选一,建议使用 JOIN 而不是子查询。


子查询应仅作为您无法使用 JOIN 操作来实现上述目标时的备选解决方案

Sub-Queries Vs Joins

摘要

  • 子查询是嵌入在另一个查询中的查询。嵌入式查询称为内部查询,容器查询称为外部查询。
  • 子查询易于使用,具有极大的灵活性,并且可以轻松分解为构成查询的单个逻辑组件,这在测试和调试查询时非常有用。
  • MySQL 支持三种类型的子查询:标量子查询、行子查询和表子查询。
  • 标量子查询只返回单行和单列。
  • 行子查询只返回单行,但可以包含多列。
  • 表子查询可以返回多行和多列。
  • 子查询也可以用于 INSERT、UPDATE 和 DELETE 查询。
  • 出于性能考虑,在从多个表中获取数据时,强烈建议使用 JOIN 而不是子查询。子查询应仅在有充分理由时使用。