MySQL内部联接INNER JOIN
简介:在本教程中,您将学习如何使用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从多个表中查询数据。