当一张表里的数据不足以满足查询需求时,就需要把多张表关联起来查询,这就是连接查询。连接查询是关系数据库中非常重要的一类能力。
内连接通常使用 INNER JOIN,也可以直接写 JOIN。
基本语法如下:
SELECT 字段列表
FROM 表1
INNER JOIN 表2 ON 表1.关联字段 = 表2.关联字段;例如查询订单及其所属用户:
SELECT orders.id, orders.amount, user.name
FROM orders
INNER JOIN user ON orders.user_id = user.id;内连接的特点是:
- 只有两张表中能匹配上的记录才会返回
- 两边没有匹配的数据不会出现在结果中
MySQL 中常见的外连接有:
LEFT JOINRIGHT JOIN
LEFT JOIN 表示返回左表全部记录,以及右表中匹配的记录。
例如:
SELECT user.id, user.name, orders.amount
FROM user
LEFT JOIN orders ON user.id = orders.user_id;即使某个用户没有订单,这个用户也会被查出来,只不过订单字段可能是 NULL。
RIGHT JOIN 则相反,返回右表全部记录以及左表匹配记录:
SELECT user.id, user.name, orders.amount
FROM user
RIGHT JOIN orders ON user.id = orders.user_id;在实际开发中,LEFT JOIN 的使用频率通常远高于 RIGHT JOIN。
有些连接不只是一个条件,还可能包含多个字段或附加筛选条件。
例如:
SELECT a.id, a.name, b.score
FROM student AS a
INNER JOIN score AS b
ON a.id = b.student_id AND b.course_id = 1;这表示:
- 先按学生 ID 关联
- 再限定课程 ID 为 1
复合条件连接适合:
- 联合业务规则匹配
- 多字段关联
- 特定业务子集关联
连接查询的核心是把表之间的关系写清楚。内连接适合查“双方都存在”的数据,外连接适合保留某一侧的全部记录,而复合条件连接则适合更复杂的业务规则。