Code Academy SQL表转换课程:两个查询的差异及结果不同原因咨询
两个SQL查询的差异解析(以Codecademy表转换课程常见场景为例)
既然你提到来自Codecademy的表转换课程,我先拿课程里最常让学习者困惑的JOIN类型差异场景来拆解——这也是导致结果集不同的高频原因。假设我们有两个核心表:customers(存储客户基础信息)和orders(存储客户的订单记录),下面是两个典型的对比查询:
查询1:使用LEFT JOIN
SELECT customers.customer_id, COUNT(orders.order_id) AS order_count FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id GROUP BY customers.customer_id;
查询2:使用INNER JOIN
SELECT customers.customer_id, COUNT(orders.order_id) AS order_count FROM customers JOIN orders ON customers.customer_id = orders.customer_id GROUP BY customers.customer_id;
核心差异与结果不同的原因
返回的记录范围本质不同
- 查询1用
LEFT JOIN,会返回所有客户——哪怕某个客户从未下过订单,这类客户的order_count会显示为0,因为LEFT JOIN会保留左表(customers)的全部数据,右表无匹配时填充NULL。 - 查询2用
INNER JOIN(JOIN是INNER JOIN的简写),只会返回有订单记录的客户,完全没有订单的客户会被直接过滤出结果集。
- 查询1用
聚合计算的逻辑差异
- 对于
COUNT(orders.order_id),LEFT JOIN中无匹配订单的客户对应的orders.order_id是NULL,而COUNT()函数会自动忽略NULL值,所以这类客户的计数为0。 INNER JOIN已经提前过滤掉无订单的客户,结果里的order_count必然都是大于0的有效数值。
- 对于
如果你的两个查询是其他场景(比如GROUP BY分组字段差异、WHERE与HAVING的使用区别),可以补充具体语句,但上面的JOIN差异是Codecademy表转换模块里最常见的结果不一致诱因。
内容的提问来源于stack exchange,提问作者Mendelsohn
相关产品推荐
相关产品推荐

