笛卡尔积与条件顺序要点
- 漏写 ON 会让两张表每行都配上,产生行数 = 两表行数乘积
- CROSS JOIN 是显式笛卡尔积,正常业务极少需要
- ON 决定「怎么连」,WHERE 决定「连完留哪些」,语义不同
- LEFT JOIN 的过滤放 ON 还是 WHERE,结果可能天差地别
- INNER JOIN 时 ON 与 WHERE 过滤效果一致,可放心拆分
- 写完 JOIN 先 COUNT 一下行数,异常暴涨多半是条件丢了
笛卡尔积与条件顺序示例
-- 忘记 ON:user 每一行都和 product 每一行配对(危险!)
SELECT u.user_name, p.product_name
FROM user u
CROSS JOIN product p;
-- 正确写法:补上关联键,结果才是有意义的行
SELECT u.user_name, p.product_name
FROM user u
INNER JOIN orders o ON u.user_id = o.user_id
INNER JOIN order_item oi ON o.order_id = oi.order_id
INNER JOIN product p ON oi.product_id = p.product_id;
避坑提醒:生产环境跑多表 JOIN 前,先 SELECT COUNT(*) 看行数是否合理,暴涨几个数量级就是 ON 条件掉了。