1.内连接
✅ 目标:理解两个表之间的匹配关系。
sql
SELECT u.id, u.name, o.id AS order_id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
建议练法:
-
用最小数据表(5~10 行)
-
手画出笛卡尔积(所有组合)
-
观察
ON
条件如何过滤结果
💡 你可以自己造几个 CSV 小表,然后用 SQLite 或 MySQL 本地跑。
2.LEFT / RIGHT JOIN
✅ 目标:理解"以谁为主表"的差别。
sql
SELECT u.id, u.name, o.id AS order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
想一想:
-
如果用户没下单,会不会出现在结果里?
-
order_id 是 NULL 吗?
👉 画图理解最有效。
3.子查询与分步骤查询
✅ 目标:会用子查询当作"中间结果表"。
sql
SELECT player_id
FROM Activity
WHERE event_date = (
SELECT MIN(event_date)
FROM Activity a2
WHERE a2.player_id = Activity.player_id
);
练法:
-
先独立执行子查询
-
看返回什么
-
再嵌入主查询看联动效果
4.窗口函数
✅ 目标:在不分组的情况下,对行做排名或累计。
sql
SELECT player_id, event_date,
RANK() OVER (PARTITION BY player_id ORDER BY event_date) AS rank
FROM Activity;
可以用来:
-
排名(RANK, ROW_NUMBER)
-
累计求和(SUM() OVER ...)
-
环比增长(LAG/LEAD)
5.环境
