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
您的查询是:
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)
| 归档时间: |
|
| 查看次数: |
3263 次 |
| 最近记录: |