摘要:在本教程中,您将学习如何使用 MySQL INNER JOIN
子句根据联接条件从多个表中选择数据。
MySQL INNER JOIN
子句简介
INNER JOIN
将一个表中的每一行与其他表中的每一行进行匹配,并允许您查询包含两个表中的列的行。
INNER JOIN
是SELECT
语句的可选子句。它紧接在FROM
子句之后出现。以下是INNER JOIN
子句的语法:
SELECT
select_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
...;
Code language: SQL (Structured Query Language) (sql)
在这个语法中:
- 首先,指定
FROM
子句 (t1
) 中出现的主表。 - 其次,指定将与主表连接的表,该表出现在
INNER JOIN
子句中(t2
、t3
、...)。 - 第三,在
INNER JOIN
子句的ON
关键字后指定连接条件。连接条件指定主表和INNER JOIN
子句中出现的表之间的行匹配规则。
假设您要连接两个表t1
和t2
。
以下语句说明如何使用INNER JOIN
子句连接两个表t1
和t2
:
SELECT
select_list
FROM
t1
INNER JOIN t2 ON join_condition;
Code language: SQL (Structured Query Language) (sql)
INNER JOIN
子句根据连接条件将t1
表中的每一行与t2
表中的每一行进行比较。
如果两个表中的行导致连接条件计算为TRUE
,则INNER JOIN
将创建一个新行,其列包含表中行的所有列,并将该新行包含在结果集中。否则, INNER JOIN
将忽略这些行。
如果表之间没有行导致连接条件计算为TRUE
,则INNER JOIN
返回空结果集。当您连接 2 个以上的表时,也会应用此逻辑。
下面的维恩图说明了INNER JOIN
子句的工作原理:

MySQL INNER JOIN
示例
让我们看看示例数据库中的products
和productlines
表。

在此图中,表products
列productLine
引用表productlines
的列productline
。 products
表中的productLine
列称为外键列。
通常,您联接具有外键关系的表,例如productlines
和products
表。
假设你想得到:
productCode
和products
表中的productName
。-
productlines
表中产品线的textDescription
。
为此,您需要使用INNER JOIN
子句根据productline
线列中的值匹配行,从两个表中选择数据,如下所示:
SELECT
productCode,
productName,
textDescription
FROM
products t1
INNER JOIN productlines t2
ON t1.productline = t2.productline;
Code language: SQL (Structured Query Language) (sql)
由于两个表的连接列具有相同的名称productline
,因此您可以使用USING
语法:
SELECT
productCode,
productName,
textDescription
FROM
products
INNER JOIN productlines USING (productline);
Code language: SQL (Structured Query Language) (sql)
查询返回相同的结果集。然而, USING
语法更短、更清晰。
MySQL INNER JOIN
与GROUP BY
子句示例
请参阅以下orders
和orderdetails
表:

此查询使用INNER JOIN
子句和GROUP BY
子句从orders
和orderdetails
表中返回订单号、订单状态和总销售额:
SELECT
t1.orderNumber,
t1.status,
SUM(quantityOrdered * priceEach) total
FROM
orders t1
INNER JOIN orderdetails t2
ON t1.orderNumber = t2.orderNumber
GROUP BY orderNumber;
Code language: SQL (Structured Query Language) (sql)

同样,以下查询使用INNER JOIN
和USING
语法:
SELECT
orderNumber,
status,
SUM(quantityOrdered * priceEach) total
FROM
orders
INNER JOIN orderdetails USING (orderNumber)
GROUP BY orderNumber;
Code language: SQL (Structured Query Language) (sql)
MySQL INNER JOIN
– 连接三个表示例
请参阅以下products
、 orders
和orderdetails
表:

此查询使用两个INNER JOIN
子句来连接三个表: orders
、 orderdetails
和products
:
SELECT
orderNumber,
orderDate,
orderLineNumber,
productName,
quantityOrdered,
priceEach
FROM
orders
INNER JOIN
orderdetails USING (orderNumber)
INNER JOIN
products USING (productCode)
ORDER BY
orderNumber,
orderLineNumber;
Code language: SQL (Structured Query Language) (sql)
这张图显示了部分输出:

MySQL INNER JOIN
– 连接四个表示例
请参阅以下orders
、 orderdetails
、 customers
和products
表:

此示例使用三个INNER JOIN
子句来查询上述四个表中的数据:
SELECT
orderNumber,
orderDate,
customerName,
orderLineNumber,
productName,
quantityOrdered,
priceEach
FROM
orders
INNER JOIN orderdetails
USING (orderNumber)
INNER JOIN products
USING (productCode)
INNER JOIN customers
USING (customerNumber)
ORDER BY
orderNumber,
orderLineNumber;
Code language: SQL (Structured Query Language) (sql)

MySQL INNER JOIN
使用其他运算符
到目前为止,您已经看到连接条件使用等于运算符 (=) 来匹配行。
除了等于运算符 (=) 之外,还可以使用大于 ( >
)、小于 ( <
) 和不等于 ( <>
) 运算符等其他运算符来构成连接条件。
以下查询使用小于 ( <
) 连接来查找代码为S10_1678
的产品的销售价格,该价格低于该产品的制造商建议零售价 (MSRP)。
SELECT
orderNumber,
productName,
msrp,
priceEach
FROM
products p
INNER JOIN orderdetails o
ON p.productcode = o.productcode
AND p.msrp > o.priceEach
WHERE
p.productcode = 'S10_1678';
Code language: SQL (Structured Query Language) (sql)

在本教程中,您学习了如何使用MySQL INNER JOIN
从多个表中查询数据。