MySQL INNER JOIN

摘要在本教程中,您将学习如何使用 MySQL INNER JOIN子句根据联接条件从多个表中选择数据。

MySQL INNER JOIN子句简介

INNER JOIN将一个表中的每一行与其他表中的每一行进行匹配,并允许您查询包含两个表中的列的行。

INNER JOINSELECT语句的可选子句。它紧接在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子句中( t2t3 、...)。
  • 第三,在INNER JOIN子句的ON关键字后指定连接条件。连接条件指定主表和INNER JOIN子句中出现的表之间的行匹配规则。

假设您要连接两个表t1t2

以下语句说明如何使用INNER JOIN子句连接两个表t1t2

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 Venn Diagram

MySQL INNER JOIN示例

让我们看看示例数据库中的productsproductlines表。

产品产品线表

在此图中,表productsproductLine引用表productlines的列productlineproducts表中的productLine列称为外键列。

通常,您联接具有外键关系的表,例如productlinesproducts表。

假设你想得到:

  • 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)

试试看

MySQL INNER JOIN - Products Data Example

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

SELECT 
    productCode, 
    productName, 
    textDescription
FROM
    products
INNER JOIN productlines USING (productline);Code language: SQL (Structured Query Language) (sql)

查询返回相同的结果集。然而, USING语法更短、更清晰。

MySQL INNER JOINGROUP BY子句示例

请参阅以下ordersorderdetails表:

订单订单明细表

此查询使用INNER JOIN子句和GROUP BY子句从ordersorderdetails表中返回订单号、订单状态和总销售额:

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)

试试看

MysQL INNER JOIN with GROUP BY clause

同样,以下查询使用INNER JOINUSING语法:

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 – 连接三个表示例

请参阅以下productsordersorderdetails表:

此查询使用两个INNER JOIN子句来连接三个表: ordersorderdetailsproducts

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 - 连接三个表示例

MySQL INNER JOIN – 连接四个表示例

请参阅以下ordersorderdetailscustomersproducts表:

订单 订单详情 产品 客户表

此示例使用三个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 - 连接四个表示例

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 - not-equal join example

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

本教程有帮助吗?