MySQL内部联接INNER JOIN

时间:2019-11-20 08:52:05  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用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
...;

使用以下语法:

  • 首先,指定出现在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;

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

如果两个表中的行都导致联接条件的值为TRUE,则INNER JOIN将创建一个新行,其列包含表中所有行的列,并将此新行包括在结果集中。
否则,INNER JOIN只会忽略行。

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

下面的维恩图说明了INNER JOIN子句的工作方式:

MySQL INNER JOIN示例

让我们看一下示例数据库中的产品和产品系列表。

在此图中,表产品具有列productLine的列,该列引用表productlines的列productline。
表产品中的productLine列称为外键列。

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

假设您想获得:

  • 产品表中的productCode和productName。

  • productlines表中产品线的textDescription。

为此,您需要通过使用INNER JOIN子句基于productline列中的值来匹配行,从而从两个表中选择数据,如下所示:

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

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

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

该查询返回相同的结果集。
但是,USING语法更短,更简洁。

MySQL INNER JOIN与GROUP BY子句示例

请参阅以下订单和orderdetails表:

该查询使用带有GROUP BY子句的INNER JOIN子句从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;

同样,以下查询使用具有USING语法的INNER JOIN:

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

MySQL INNER JOIN –连接三个表的示例

请参阅以下产品,订单和订单明细表:

该查询使用两个INNER JOIN子句来连接三个表:order,orderdetails和product:

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

请参阅以下订单,订单明细,客户和产品表:

本示例使用三个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;

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';

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