内连接和外连接 & 驱动表

概念

https://mp.weixin.qq.com/s/b6l1bUpEaNtVZtX0cbdEEg

多表查询

在这里插入图片描述

内连接和外连接是关系型数据库中常用的连接(Join)操作,用于在多个表之间建立关联关系。驱动表(Driving Table)是在连接操作中起到驱动作用的表,用于决定连接结果的基准。

  1. 内连接(Inner Join):内连接是根据两个表之间的匹配条件,返回两个表中满足条件的交集结果。在内连接中,只有在连接条件匹配的情况下,才会返回行。驱动表通常是指在内连接中拥有更小数据集的表,用于驱动连接操作。它确定了连接操作的基准。

  2. 外连接(Outer Join):外连接是根据两个表之间的匹配条件,返回满足条件的交集结果以及未匹配的行。外连接分为左外连接(Left Outer Join)和右外连接(Right Outer Join)。左外连接以驱动表为基准,返回驱动表的所有行以及与之匹配的关联表的行,未匹配的关联表行用空值填充。右外连接则以关联表为基准,返回关联表的所有行以及与之匹配的驱动表的行,未匹配的驱动表行用空值填充。

驱动表在连接操作中起到重要的作用,它决定了连接操作的起点和连接结果的基准。通常,选择驱动表时可以考虑数据量较小或筛选条件较为精确的表作为驱动表,以提高连接操作的效率。

需要注意的是,内连接和外连接可以根据具体的业务需求和数据关系来选择使用。使用内连接可以获取满足连接条件的交集数据,而使用外连接可以获取交集数据以及未匹配的行。正确选择连接类型和驱动表是设计和

举例

实例表

以下是 Customers(客户表)和 Orders(订单表)的创建语句示例,假设它们之间通过共享的列 “CustomerID” 进行关联:

Customers 表创建语句:

CREATE TABLE Customers (
  ID INT PRIMARY KEY,
  CustomerName VARCHAR(255),
  Email VARCHAR(255)
);

Orders 表创建语句:

CREATE TABLE Orders (
  ID INT PRIMARY KEY,
  OrderID INT,
  OrderDate DATE,
  CustomerID INT,
  FOREIGN KEY (CustomerID) REFERENCES Customers(ID)
);

在上面的示例中,Customers 表包含了 ID、CustomerName 和 Email 列,其中 ID 列被定义为主键。Orders 表包含了 ID、OrderID、OrderDate 和 CustomerID 列,其中 ID 列被定义为主键,CustomerID 列被定义为外键,引用了 Customers 表的 ID 列。

通过上述创建语句,可以创建 Customers 表和 Orders 表,并建立它们之间的关联关系。请注意,具体的创建语句可能会根据数据库管理系统的不同而有所差异,上述示例仅作为一种通用的创建表的示例。在实际使用时,请根据具体的数据库管理系统和表结构设计进行相应的调整。

创建表只是定义了表的结构,要向表中插入数据,可以使用 INSERT INTO 语句。以下是向 Customers 表和 Orders 表插入示例数据的示例:

向 Customers 表插入数据的示例:

INSERT INTO Customers (ID, CustomerName, Email)
VALUES (1, 'John', 'john@example.com');

INSERT INTO Customers (ID, CustomerName, Email)
VALUES (2, 'Mary', 'mary@example.com');

INSERT INTO Customers (ID, CustomerName, Email)
VALUES (3, 'David', 'david@example.com');

向 Orders 表插入数据的示例:

INSERT INTO Orders (ID, OrderID, OrderDate, CustomerID)
VALUES (1, 1001, '2023-06-01', 1);

INSERT INTO Orders (ID, OrderID, OrderDate, CustomerID)
VALUES (2, 1002, '2023-06-02', 2);

INSERT INTO Orders (ID, OrderID, OrderDate, CustomerID)
VALUES (3, 1003, '2023-06-03', 3);

通过执行上述 INSERT INTO 语句,可以将示例数据插入到 Customers 表和 Orders 表中。请根据实际需求和表结构进行适当调整,确保插入的数据符合表定义的约束条件。

注意:在执行插入语句时,要确保数据库连接已经建立,并选择正确的数据库进行操作。具体的插入语句和数据内容也可以根据需要进行修改和扩展。

内连接

内连接(Inner Join)和外连接(Outer Join)是关系型数据库中用于联接两个或多个表的操作。

内连接是基于两个表之间的共享值进行联接,只返回两个表中符合联接条件的行。内连接返回的结果集只包含满足连接条件的行

下面是一个内连接的示例:

假设有两个表:Customers(客户表)和 Orders(订单表),它们之间通过共享的列 “CustomerID” 进行关联。

Customers 表:

+----+----------+
| ID | Customer |
+----+----------+
|  1 | John     |
|  2 | Mary     |
|  3 | David    |
+----+----------+

Orders 表:

+----+---------+------------+
| ID | OrderID | OrderDate  |
+----+---------+------------+
|  1 |  1001   | 2023-06-01 |
|  2 |  1002   | 2023-06-02 |
|  3 |  1003   | 2023-06-03 |
+----+---------+------------+

通过以下 SQL 查询可以实现 Customers 表和 Orders 表的内连接:

SELECT Customers.Customer, Orders.OrderID, Orders.OrderDate
FROM Customers
INNER JOIN Orders
ON Customers.ID = Orders.ID;

结果集将只返回符合连接条件的行,即两个表中 “ID” 列的值相等的行:

+----------+---------+------------+
| Customer | OrderID | OrderDate  |
+----------+---------+------------+
| John     |  1001   | 2023-06-01 |
| Mary     |  1002   | 2023-06-02 |
| David    |  1003   | 2023-06-03 |
+----------+---------+------------+

外连接

外连接用于返回两个表中满足联接条件的所有行,同时还会包含不满足联接条件的行。外连接分为左外连接、右外连接和全外连接,具体选择取决于联接的方向和需求。

以下是一个左外连接的示例:

假设有两个表:Customers(客户表)和 Orders(订单表),它们之间通过共享的列 “CustomerID” 进行关联。

Customers 表:

+----+----------+
| ID | Customer |
+----+----------+
|  1 | John     |
|  2 | Mary     |
|  3 | David    |
+----+----------+

Orders 表:

+----+---------+------------+
| ID | OrderID | OrderDate  |
+----+---------+------------+
|  1 |  1001   | 2023-06-01 |
|  4 |  1004   | 2023-06-04 |
+----+---------+------------+

通过以下 SQL 查询可以实现 Customers 表和 Orders 表的左外连接:

SELECT Customers.Customer, Orders.OrderID, Orders.OrderDate
FROM Customers
LEFT JOIN Orders
ON Customers.ID = Orders.ID;

结果集将返回符合连接条件的行,以及 Customers 表中不满足连接

右外连接

右外连接(Right Outer Join)是一种外连接类型,它返回右表中满足连接条件的所有行以及左表中符合条件的行(如果有匹配)。右外连接从右表开始,将右表的所有行与左表进行联接。

以下是一个右外连接的示例:

假设有两个表:Customers(客户表)和 Orders(订单表),它们之间通过共享的列 “CustomerID” 进行关联。

Customers 表:

+----+----------+
| ID | Customer |
+----+----------+
|  1 | John     |
|  2 | Mary     |
|  3 | David    |
+----+----------+

Orders 表:

+----+---------+------------+
| ID | OrderID | OrderDate  |
+----+---------+------------+
|  1 |  1001   | 2023-06-01 |
|  4 |  1004   | 2023-06-04 |
+----+---------+------------+

通过以下 SQL 查询可以实现 Customers 表和 Orders 表的右外连接:

SELECT Customers.Customer, Orders.OrderID, Orders.OrderDate
FROM Customers
RIGHT JOIN Orders
ON Customers.ID = Orders.ID;

结果集将返回右表 Orders 中满足连接条件的行,以及左表 Customers 中符合条件的行(如果有匹配):

+----------+---------+------------+
| Customer | OrderID | OrderDate  |
+----------+---------+------------+
| John     |  1001   | 2023-06-01 |
| NULL     |   1004  | 2023-06-04 |
+----------+---------+------------+

在上面的示例中,右外连接返回了右表 Orders 中的所有行,并将符合连接条件的左表 Customers 中的行进行了联接。对于 Orders 表中没有匹配的行,结果集中对应的 Customers 列显示为 NULL。

需要注意的是,右外连接与左外连接是对称的,可以根据具体需求选择使用左外连接还是右外连接。

全外连接

全外连接(Full Outer Join)是一种外连接类型,它返回左表和右表中满足连接条件的所有行,并包括左表和右表中不满足连接条件的行。

以下是一个全外连接的示例:

假设有两个表:Customers(客户表)和 Orders(订单表),它们之间通过共享的列 “CustomerID” 进行关联。

Customers 表:

+----+----------+
| ID | Customer |
+----+----------+
|  1 | John     |
|  2 | Mary     |
|  3 | David    |
+----+----------+

Orders 表:

+----+---------+------------+
| ID | OrderID | OrderDate  |
+----+---------+------------+
|  1 |  1001   | 2023-06-01 |
|  4 |  1004   | 2023-06-04 |
+----+---------+------------+

通过以下 SQL 查询可以实现 Customers 表和 Orders 表的全外连接:

SELECT Customers.Customer, Orders.OrderID, Orders.OrderDate
FROM Customers
FULL OUTER JOIN Orders
ON Customers.ID = Orders.ID;

结果集将返回左表 Customers 和右表 Orders 中满足连接条件的行,以及左表和右表中不满足连接条件的行:

+----------+---------+------------+
| Customer | OrderID | OrderDate  |
+----------+---------+------------+
| John     |  1001   | 2023-06-01 |
| Mary     |  NULL   | NULL       |
| David    |  NULL   | NULL       |
| NULL     |  1004   | 2023-06-04 |
+----------+---------+------------+

在上面的示例中,全外连接返回了左表 Customers 和右表 Orders 中的所有行,以及左表和右表中不满足连接条件的行。如果某个表中没有与另一个表匹配的行,则对应的列显示为 NULL。

需要注意的是,全外连接的支持在不同的数据库管理系统中可能会有所差异。在某些数据库管理系统中,可能需要使用其他方式来实现全外连接,如使用 UNION 操作符来组合左外连接和右外连接的结果。请根据具体的数据库管理系统和语法规则进行相应的调整。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值