MySQL 子查询


本MySQL教程将说明了如何在MySQL中使用子查询。

什么是MySQL中的子查询?

在MySQL中,子查询是查询中的查询。您可以在SQL语句中创建子查询。这些子查询可以驻留在WHERE子句,FROM子句或者SELECT子句中。

说明

  • 在MySQL中,子查询也称为"内部查询"或"内部选择"。
  • 在MySQL中,包含子查询的主查询也称为"外部查询"或者"外部选择"。

在WHERE子句的子查询

通常,子查询可以在WHERE子句中找到。这些子查询也称为嵌套子查询(nested subquery)。

例如:

1
2
3
4
5
6
SELECT c.contact_id, c.last_name
FROM contacts c
WHERE c.site_name IN
(SELECT a.site_name
FROM address_book a
WHERE a.address_book_id < 50);

上面的SELECT语句的子查询部分是:

1
2
3
(SELECT a.site_name
FROM address_book a
WHERE a.address_book_id < 50);

这个子查询从address_book表中查找所有address_book_id小于50的site_name值。然后子查询通过IN条件被用来过滤主查询的结果。

该子查询还可以写成内部联接

1
2
3
4
5
SELECT c.contact_id, c.last_name
FROM contacts c
INNER JOIN address_book a
ON c.site_name = a.site_name
WHERE a.address_book_id < 50;

使用内部联接比使用子查询效率更高。不过,请务必注意,并非所有子查询都可以使用JOIN进行重写。

在FROM子句中使用子查询

也可以在FROM子句中找到子查询。这些称为内联视图(inline views)。

例如:

1
2
3
4
5
6
SELECT contacts.last_name, subquery1.total_size
FROM contacts,
(SELECT site_name, SUM(file_size) AS total_size
FROM pages
GROUP BY site_name) subquery1
WHERE subquery1.site_name = contacts.site_name;

在此示例中,我们在FROM子句中创建了一个子查询:

1
2
3
(SELECT site_name, SUM(file_size) AS total_size
FROM pages
GROUP BY site_name) subquery1

该子查询使用了subquery1作为别名。这样就可以引用子查询中的字段名称。

在SELECT子句中使用子查询

当要使用聚合函数(例如SUM,COUNT,MIN,MAX或AVG函数)进行计算时,通常会使用这些函数,但又不想将聚合函数应用到主查询,那么通常就会使用到子查询。

例如:

1
2
3
4
5
SELECT p1.site_name,
(SELECT MAX(file_size)
FROM pages p2
WHERE p1.site_id = p2.site_id) subquery2
FROM pages p1;

在此示例中,我们在SELECT子句中创建了一个子查询,如下所示:

1
2
3
(SELECT MAX(file_size)
FROM pages p2
WHERE p1.site_id = p2.site_id) subquery2

子查询中使用了名称subquery2作为别名。因此可以使用子查询中的字段名称。

要在SELECT子句中放置子查询,子查询必须返回单个值。这也是为什么在子查询中通常使用聚合函数(例如SUM,COUNT,MIN,MAX或AVG函数)的原因。


原文链接:https://codingdict.com/