一个SQL语句它的执行顺序对于我们思考题意有着很重要的关系
题意就是:找出哪些只逛超市不买单的人(买单0元也算哦,可能是使用的是代金券吧)
看到此题关键找出两个数据 参观过的人 和 买单的人 他们的差就是白嫖的人(支付0元也算,这是个坑)
select v.customer_id,count(v.customer_id)-count(t.visit_id) count_no_trans
from visits v
left join transactions t
on v.visit_id=t.visit_id
group by v.customer_id
having count_no_trans != 0
一下是这个语句的执行顺序
FROM 子句:
首先,数据库引擎会从 Visits 表中检索数据,并将其别名为 v,以便在后续的查询中引用。
LEFT JOIN 子句:
接着,执行左连接操作,将 Visits 表中的每一行与 Transactions 表中的匹配行进行连接。这意味着从 Visits 表中获取的每个访问记录都将与 Transactions 表中的相关访问记录进行匹配。
此时会有一个临时的虚拟表,没有匹配上的值会被赋予 null,以visit表为中心(visit表中有,但transaction没有的为null)
GROUP BY 子句:
然后,根据 customer_id 列对结果集进行分组。这意味着所有具有相同 customer_id 的行将被分为一组。(左连接后的表)
与聚合语句count联合使用得出 参观者数量 和付费者数量
SELECT 子句:
最后,在分组之后,使用 SELECT 子句选择要返回的列,并对每个分组应用聚合函数 COUNT(v.customer_id),以计算每个顾客的访问次数。得出差值
HAVING 子句:
最后,使用 HAVING 子句对结果进行过滤,只保留 count_no_trans 不等于 0 的分组。
只显示白嫖者数量,付过费的不显示被过滤掉,对count的差值 = 0进行过滤