带示例的 MySQL 子查询教程
什么是子查询?
子查询是一个包含在另一个查询中的SELECT查询。内部SELECT查询通常用于确定外部SELECT查询的结果。
我们来看看子查询的语法——
MyFlix视频库的一个常见客户投诉是电影数量太少。管理层希望购买一个标题数量最少的类别的电影。
您可以使用类似以下的查询
SELECT category_name FROM categories WHERE category_id =( SELECT MIN(category_id) from movies);
它会给出一个结果
让我们看看这个查询是如何工作的
上面是**行子查询**的一种形式。在此类子查询中,内部查询只能给出 ONE 个结果。与行子查询配合使用的允许的操作符是 [=, >, =, <=, ,!=, ]
让我们看另一个例子,
假设您想要那些租借了电影但尚未归还的会员的姓名和电话号码。一旦您获得姓名和电话号码,您就可以打电话给他们进行提醒。您可以使用类似以下的查询
SELECT full_names,contact_number FROM members WHERE membership_number IN (SELECT membership_number FROM movierentals WHERE return_date IS NULL );
让我们看看这个查询是如何工作的
在这种情况下,内部查询返回多个结果。上面是Table子查询的类型。
到目前为止,我们已经看到了两个查询,现在让我们看一个三重查询的例子!!!
假设管理层希望奖励支付最高的会员。
我们可以运行类似以下的查询
Select full_names From members WHERE membership_number = (SELECT membership_number FROM payments WHERE amount_paid = (SELECT MAX(amount_paid) FROM payments));
上述查询产生以下结果——
子查询 vs 连接!
与连接相比,子查询使用简单且易于阅读。它们不像连接那样复杂
因此,它们经常被SQL初学者使用。
但是子查询存在性能问题。使用连接而不是子查询有时可以为您提供高达 500 倍的性能提升。
如果可以二选一,建议使用 JOIN 而不是子查询。
子查询应仅作为您无法使用 JOIN 操作来实现上述目标时的备选解决方案
摘要
- 子查询是嵌入在另一个查询中的查询。嵌入式查询称为内部查询,容器查询称为外部查询。
- 子查询易于使用,具有极大的灵活性,并且可以轻松分解为构成查询的单个逻辑组件,这在测试和调试查询时非常有用。
- MySQL 支持三种类型的子查询:标量子查询、行子查询和表子查询。
- 标量子查询只返回单行和单列。
- 行子查询只返回单行,但可以包含多列。
- 表子查询可以返回多行和多列。
- 子查询也可以用于 INSERT、UPDATE 和 DELETE 查询。
- 出于性能考虑,在从多个表中获取数据时,强烈建议使用 JOIN 而不是子查询。子查询应仅在有充分理由时使用。