MySQL连接查询用法
MySQL连接查询用法
引言
业务数据分散在用户表、订单表、商品表中,要一次性取出用户姓名加订单金额,就要用JOIN把多张表按关联字段拼起来。分清内连接和外连接,是写对多表查询的关键。
内连接 INNER JOIN
只保留两表匹配上的行:
SELECT u.name, o.amount, o.order_no
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
没有订单的用户不会出现,没有对应用户的订单也不会出现。
左连接 LEFT JOIN
以左表为主,左表全部保留,右表匹配不上补NULL:
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
每个用户都列出来,没下单的用户amount显示NULL,常用于统计哪些用户没购买。
右连接 RIGHT JOIN
以右表为主,和左连接方向相反,实际项目多数统一用LEFT JOIN,可读性更好。
多表连接示例
SELECT u.name, p.title, o.amount
FROM orders o
INNER JOIN users u ON o.user_id = u.id
INNER JOIN products p ON o.product_id = p.id
WHERE o.status = 1
ORDER BY o.create_time DESC;
注意事项
- 关联字段类型要一致,避免隐式转换导致索引失效;
- ON写连接条件,WHERE过滤结果,别把连接条件误放WHERE导致LEFT JOIN变内连接;
- 大表JOIN先确认关联字段有索引;
- 多表查询用表别名,字段加别名前缀避免歧义;
- 不建议无关联条件的多表笛卡尔积。
总结
INNER JOIN取交集,LEFT JOIN保留左表全部。写多表查询先确定以哪张表为主,连接条件放ON,过滤条件放WHERE,关联字段建索引,避免隐式转换和笛卡尔积。