首页 > 解决方案 > SQL中子查询的执行顺序

问题描述

SELECT customerid, 
(SELECT COUNT(*)
FROM orders
WHERE customers.customerid = orders.customerid) as total_orders
FROM customers

谁能解释这段 SQL 代码的工作原理?根据我的说法,在这种情况下,子查询应该总是返回相同数量的行,因为总数。相同的行 customers.customerid = orders.customerid数。但它显示每个客户和他/她的总订单。导致这种情况的执行顺序是什么?

请在此处找到数据库:

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_distinct

标签: sql

解决方案


您的查询是:

SELECT c.customerid, 
       (SELECT COUNT(*)
        FROM orders o
        WHERE c.customerid = o.customerid
       ) as total_orders
FROM customers c;

(请注意,我添加了表别名并限定了所有列名。)

这是一个标量的相关子查询。它是一个标量子查询,因为它返回单个值(而不是表)。

它是相关的,因为子查询链接到外部查询。这是让你感到困惑的部分。

基本上,外部查询表示结果集将为每个客户保留一行。

子查询表示对于每个客户,结果集将计算任何给定行中客户的匹配行数。

尽管使用子查询编写查询完全没问题,但这通常会写成:

SELECT c.customerid, COUNT(o.customerid) as total_orders
FROM customers c LEFT JOIN
     orders o
     ON c.customerid = o.customerid
GROUP BY c.customerId

推荐阅读