实现mysql内连接、外连接和全连接

1. 概述

在进行数据库查询时,我们经常需要使用连接操作来关联多张表的数据。MySQL提供了多种连接方式,包括内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN)和全连接(FULL JOIN)。本文将详细介绍每种连接的使用方法和示例代码,并使用表格和序列图展示整个流程。

2. 内连接(INNER JOIN)

内连接用于获取两个表中满足连接条件的公共记录。使用内连接时,两个表中的匹配行才会被返回。

2.1 内连接示例

假设我们有两个表,一个是"users"表,存储了用户的信息,包括用户ID和用户名;另一个是"orders"表,存储了用户的订单信息,包括订单ID和订单金额。我们希望查询出每个订单对应的用户名。

首先,我们创建这两张表:

CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50)
);

CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(8, 2)
);

然后,插入一些测试数据:

INSERT INTO users (id, username) VALUES (1, 'Alice');
INSERT INTO users (id, username) VALUES (2, 'Bob');

INSERT INTO orders (id, user_id, amount) VALUES (1, 1, 100.00);
INSERT INTO orders (id, user_id, amount) VALUES (2, 2, 200.00);

最后,执行内连接查询,获取每个订单对应的用户名:

SELECT orders.id, users.username
FROM orders
INNER JOIN users
ON orders.user_id = users.id;

2.2 内连接流程图

下面是内连接的流程图示例:

sequenceDiagram
    participant A as orders
    participant B as users
    participant C as result
    
    A ->> B: 查询 orders.user_id 和 users.id
    B -->> C: 返回匹配的结果

3. 外连接(LEFT JOIN、RIGHT JOIN)

外连接用于获取两个表中所有的记录,同时根据连接条件获取匹配的记录。如果某个表的记录在另一个表中没有匹配的记录,那么该表的记录也会被返回。

3.1 左外连接示例

左外连接会返回左表(左侧表)的所有记录,以及满足连接条件的右表(右侧表)的匹配记录。如果右表中没有匹配的记录,那么将返回NULL值。

继续以上述"users"表和"orders"表为例,我们希望查询出每个用户的订单信息,即使用户没有订单。

执行左外连接查询:

SELECT users.username, orders.id, orders.amount
FROM users
LEFT JOIN orders
ON users.id = orders.user_id;

3.2 左外连接流程图

下面是左外连接的流程图示例:

sequenceDiagram
    participant A as users
    participant B as orders
    participant C as result
    
    A ->> B: 查询 users.id 和 orders.user_id
    B -->> C: 返回匹配的结果,如果users.id没有匹配的orders.user_id,返回NULL值

3.3 右外连接示例

右外连接与左外连接类似,不同之处在于左表和右表的角色互换。即返回右表的所有记录,以及满足连接条件的左表的匹配记录。

执行右外连接查询:

SELECT users.username, orders.id, orders.amount
FROM users
RIGHT JOIN orders
ON users.id = orders.user_id;

3.4 右外连接流程图

下面是右外连接的流程图示例:

sequenceDiagram
    participant A as users
    participant B as orders
    participant C as result
    
    A ->> B: 查询 users.id 和 orders.user_id
    B -->> C: 返回匹配的结果,如果orders.user_id没有匹配的users.id,返回NULL值

4. 全连接(FULL JOIN)

全连接返回两个表中的所有记录,无论是否满足连接条件。如果某个表在另一个表中没有匹配的记录,那么该表的记录也会被返回。

4.1