MySQL 连表查询是将多个表中的数据通过共同字段关联起来进行查询的操作,主要用于获取分布在不同表中的相关数据。以下是常见的连表查询类型及示例:
只返回两个表中匹配条件的记录(交集)。
语法:
SELECT 字段列表
FROM 表1
INNER JOIN 表2
ON 表1.关联字段 = 表2.关联字段;
示例:假设存在 users 表和 orders 表,通过 user_id 关联查询用户及其订单:
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
INNER JOIN orders o
ON u.id = o.user_id;
返回左表所有记录,以及右表中匹配条件的记录(左表全部 + 交集)。
语法:
SELECT 字段列表
FROM 表1
LEFT JOIN 表2
ON 表1.关联字段 = 表2.关联字段;
示例:查询所有用户,包括没有订单的用户:
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id;
返回右表所有记录,以及左表中匹配条件的记录(右表全部 + 交集)。
语法:
SELECT 字段列表
FROM 表1
RIGHT JOIN 表2
ON 表1.关联字段 = 表2.关联字段;
示例:查询所有订单,包括没有关联用户的订单(通常不合理,仅作演示):
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
RIGHT JOIN orders o
ON u.id = o.user_id;
返回两个表中所有记录(并集),MySQL 不直接支持 FULL JOIN,可通过 UNION 模拟。
示例:查询所有用户和所有订单:
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
UNION
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
同时连接多个表,通过多个 JOIN 语句实现。
示例:关联 users、orders、products 表查询完整订单信息:
SELECT
u.name,
o.order_no,
p.product_name,
o.quantity
FROM users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id;
将表与自身进行连接,通常用于查询表中具有层级关系的数据(如部门与子部门)。
示例:查询员工及其直属领导:
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
LEFT JOIN employees m
ON e.manager_id = m.id;
-
使用表别名(如
u、o)简化语句
-
必须指定关联条件(
ON 子句),否则会产生笛卡尔积
-
优先使用
INNER JOIN 而非隐式连接(WHERE 表1.字段=表2.字段),可读性更好
-
多表连接时注意索引优化,关联字段建议建立索引
根据业务需求选择合适的连接类型,左连接和内连接是实际开发中最常用的连表查询方式。