sql - 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
解决方案
您的查询是:
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
推荐阅读
- c++ - 如何通过 vcpkg 从网络共享文件夹安装库?
- python - 如何制作这种条形图,将列表交易分组为 12 组条形?
- firebase - firestore 中的 serverTimestamp() 返回 ServerTimestampTransform
- php - 从 laravel 5.8 中的文本框中获取值
- android - 运行 Kotlin 单元和 UI 测试时,1 或 2 个新测试总是失败
- sql-server - select from @variable 如何在 from 之后使用变量
- python - 为什么二维数组只取最后两个输入整数?
- php - 如何在 Symfony 的控制器中包含 php 代码?
- reactjs - 我可以将函数(并获取其 ReturnType)传递给通用 TypeScript 类型吗?
- python - 推断时测量 keras/tf 上的层执行时间的最佳方法是什么?