SQL中子查询的执行顺序

Nik*_*hra 0 sql

SELECT customerid, 
(SELECT COUNT(*)
FROM orders
WHERE customers.customerid = orders.customerid) as total_orders
FROM customers
Run Code Online (Sandbox Code Playgroud)

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

请在此处查找数据库:

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

Gor*_*off 6

您的查询是:

SELECT c.customerid, 
       (SELECT COUNT(*)
        FROM orders o
        WHERE c.customerid = o.customerid
       ) as total_orders
FROM customers c;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

  • @argo - 套用 Joop 的话,具体执行的内容取决于 DBMS。SQL 是一种“声明式”语言,而不是一种“命令式”语言。在 SQL 中,您编写一个表达式来解释需要解决的逻辑问题,然后将其转换为要在可用硬件上执行的“计划”*(可能是一个线程、一个核心、一个 CPU) 、多个 cpu 甚至机器集群)*。你可以认为区别在于,SQL 是你需要求解的代数公式,计划是用于求解它的算法。RDBMS 之间的差异很大。 (3认同)