SQL语言学习(JOIN)
在 SQL 的 JOIN
操作中,左表(Left Table)和右表(Right Table)的区分完全取决于 FROM
和 JOIN
关键字的书写顺序
- 左表:
FROM
子句中指定的表(第一个表)。 - 右表:
JOIN
子句中指定的表(第二个表)。
在 SQL 中,JOIN
用于合并多个表的数据,根据不同的需求,主要有以下几种 JOIN
类型:
- INNER JOIN(内连接)
- LEFT JOIN(左连接)
- RIGHT JOIN(右连接)
- FULL JOIN(全连接)
- CROSS JOIN(交叉连接)
结合案例(person
和 orders
表)详细介绍它们的用法和区别。
1. INNER JOIN(内连接)
作用:返回两个表中匹配的记录(即 ON
条件成立的记录)。
特点:
- 如果某人在
person
表中存在,但在orders
表中没有订单,则不会出现在结果中。 - 反之,如果
orders
表中的订单没有对应的person
记录,也不会出现。
select p.lastname,p.firstname,o.orderno
from person p
inner join orders o on p.id_p = o.id_p;
示例结果:
适用场景:
- 只需要查询有订单的人及其订单信息。
2. LEFT JOIN(左连接)
作用:返回左表(person
)的所有记录,即使右表(orders
)没有匹配的记录。
特点:
- 如果某人在
person
表中存在,但在orders
表中没有订单,则orderno
为NULL
。 - 如果
orders
表中的订单没有对应的person
记录,则不会出现(因为左连接以左表为准)。
select p.lastname,p.firstname,o.orderno
from person p
left join orders o on p.id_p=o.id_p;
实例结果:
3. RIGHT JOIN(右连接)
作用:返回右表(orders
)的所有记录,即使左表(person
)没有匹配的记录。
特点:
- 如果
orders
表中的订单没有对应的person
记录,则lastname
和firstname
为NULL
。 - 如果某人在
person
表中存在,但没有订单,则不会出现(因为右连接以右表为准)。
select p.lastname,p.firstname,o.orderno
from person p
right join orders o on p.id_p=o.id_p;
适用场景:
- 查询所有订单及其对应的人(即使订单没有对应的人也要显示)。
4. FULL JOIN(全连接)
作用:返回左表和右表的所有记录,无论是否匹配。
特点:
- 如果某人在
person
表中存在,但在orders
表中没有订单,则orderno
为NULL
。 - 如果
orders
表中的订单没有对应的person
记录,则lastname
和firstname
为NULL
。
SELECT p.lastname, p.firstname, o.orderno
FROM person p
FULL JOIN orders o ON p.id_P = o.id_p;
适用场景:
- 查询所有人和所有订单,无论是否匹配(适用于数据对账或异常检查)。
5. CROSS JOIN(交叉连接)
作用:返回左表和右表的笛卡尔积(即所有可能的组合)。
特点:
- 不需要
ON
条件,因为它会返回person
的每一行与orders
的每一行的组合。 - 如果
person
有 3 行,orders
有 4 行,则结果有 3×4=12 行。
SELECT p.lastname, p.firstname, o.orderno
FROM person p
CROSS JOIN orders o;
一般不使用,主要用于生成测试
总结: