Skip to main content

通过实例说明MySQL内部连接

MySQL内部连接子句简介

内部联接将一个表中的每一行与其他表中的每一行相匹配,并允许您查询包含两个表中的列的行。

内部联接是SELECT语句的可选子句。它出现在FROM子句之后。以下是内部连接子句的语法:

SELECT
select_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
...;

在这种语法中:

假设您想要联接两个表t1和t2。

下面的语句说明了如何使用内部join子句连接两个表t1和t2:

SELECT 
select_list
FROM
t1
INNER JOIN t2 ON join_condition;

内部JOIN子句根据连接条件将t1表中的每一行与t2表中的每一行进行比较。

如果两个表中的行都导致联接条件的计算结果为TRUE,则内部联接将创建一个新行,该新行的列包含表中所有行的列,并将该新行包含在结果集中。否则,内部联接只会忽略行。

如果表之间没有行导致联接条件的计算结果为TRUE,则内部联接将返回一个空结果集。当您连接两个以上的表时,也会应用此逻辑。

下面的维恩图说明了内部连接子句的工作原理:

MySQL INNER JOIN Venn Diagram

MySQL内部连接示例

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

products productlines tables

在该图中,表products具有引用表productlines的列productLine的列productLine。表products中的productLine列称为外键列。

通常,可以连接具有外键关系的表,如productlines和products表。

假设你想得到:

为此,需要根据productline列中的值,使用以下内部JOIN子句匹配行,从而从两个表中选择数据:

SELECT 
productCode,
productName,
textDescription
FROM
products t1
INNER JOIN productlines t2
ON t1.productline = t2.productline;

<img class=“alignnone wp-image-4995 size full”title=“MySQL内部连接-产品数据示例”src=”https://www.mysqltutorial.org/wp-content/uploads/2011/05/MySQL-INNER-JOIN-Products-Data-Example.jpg“alt=“MySQL内部连接-产品数据示例”width=“627”height=“132”srcset=”https://www.mysqltutorial.org/wp-content/uploads/2011/05/MySQL-INNER-JOIN-Products-Data-Example.jpg627w,https://www.mysqltutorial.org/wp-content/uploads/2011/05/MySQL-INNER-JOIN-Products-Data-Example-300x63.jpg300w“尺寸=(最大宽度:627px)100vw,627px”/>

由于两个表的联接列具有相同的名称productline,因此可以使用以下语法:

SELECT 
productCode,
productName,
textDescription
FROM
products
INNER JOIN productlines USING (productline);

查询返回相同的结果集。然而,使用的语法要短得多,更简洁。

MySQL内部连接与GROUP BY子句示例

请参见以下订单和订单详细信息表:

orders orderdetails table

此查询使用带有GROUP BY子句的内部JOIN子句从orders和ORDERDDETAILS表返回订单号、订单状态和总销售额:

SELECT 
t1.orderNumber,
t1.status,
SUM(quantityOrdered * priceEach) total
FROM
orders t1
INNER JOIN orderdetails t2
ON t1.orderNumber = t2.orderNumber
GROUP BY orderNumber;

MysQL INNER JOIN with GROUP BY clause

类似地,以下查询使用内部联接和USING语法:

SELECT 
orderNumber,
status,
SUM(quantityOrdered * priceEach) total
FROM
orders
INNER JOIN orderdetails USING (orderNumber)
GROUP BY orderNumber;

MySQL内部联接——联接三个表示例

请参见以下产品、订单和订单详细信息表:

此查询使用两个内部联接子句联接三个表: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;

此图显示了部分输出:

MySQL Inner Join - join three tables example

MySQL内部联接——联接四个表示例

请参见以下订单、订单详情、客户和产品表:

orders orderdetails products customers tables

本例使用三个内部联接子句从上述四个表中查询数据:

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;

MySQL Inner Join - join four tables example

MySQL内部连接使用其他运算符

到目前为止,您已经看到连接条件使用相等运算符(=)来匹配行。

除了相等运算符(=),还可以使用其他运算符,例如大于(>)、小于(<)和不等于(\<>)运算符来形成联接条件。

以下查询使用小于(<)联接查找代码为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';

MySQL INNER JOIN - not-equal join example

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