MySQL 子查询
时间:2019-02-04 12:52:26 来源:igfitidea点击:
本MySQL教程将说明了如何在MySQL中使用子查询。
什么是MySQL中的子查询?
在MySQL中,子查询是查询中的查询。您可以在SQL语句中创建子查询。这些子查询可以驻留在WHERE子句,FROM子句或者SELECT子句中。
说明
- 在MySQL中,子查询也称为"内部查询"或"内部选择"。
- 在MySQL中,包含子查询的主查询也称为"外部查询"或者"外部选择"。
在WHERE子句的子查询
通常,子查询可以在WHERE子句中找到。这些子查询也称为嵌套子查询(nested subquery)。
例如:
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语句的子查询部分是:
(SELECT a.site_name FROM address_book a WHERE a.address_book_id < 50);
这个子查询从address_book表中查找所有address_book_id小于50的site_name值。然后子查询通过IN条件被用来过滤主查询的结果。
该子查询还可以写成内部联接:
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)。
例如:
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子句中创建了一个子查询:
(SELECT site_name, SUM(file_size) AS total_size FROM pages GROUP BY site_name) subquery1
该子查询使用了subquery1作为别名。这样就可以引用子查询中的字段名称。
在SELECT子句中使用子查询
当要使用聚合函数(例如SUM,COUNT,MIN,MAX或AVG函数)进行计算时,通常会使用这些函数,但又不想将聚合函数应用到主查询,那么通常就会使用到子查询。
例如:
SELECT p1.site_name, (SELECT MAX(file_size) FROM pages p2 WHERE p1.site_id = p2.site_id) subquery2 FROM pages p1;
在此示例中,我们在SELECT子句中创建了一个子查询,如下所示:
(SELECT MAX(file_size) FROM pages p2 WHERE p1.site_id = p2.site_id) subquery2
子查询中使用了名称subquery2作为别名。因此可以使用子查询中的字段名称。
要在SELECT子句中放置子查询,子查询必须返回单个值。这也是为什么在子查询中通常使用聚合函数(例如SUM,COUNT,MIN,MAX或AVG函数)的原因。