MYSQL表连接(十一)INNER JOIN

时间:2022-09-15 22:44:56

MySQL INNER JOIN(内连接)子句

MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并可以查询这两个表中的字段。

MySQL INNER JOIN子句是SELECT语句的可选部分。它紧接在FROM之后。

在使用MySQL INNER JOIN子句之前,必须指定以下条件:

  • 首先,必须指定出现在FROM子句中的主表。
  • 其次,您需要指定要与主表联接的表,该主表出现在INNER JOIN子句中。理论上,您可以连接具有多个表的表。但是,为了更好的查询性能,您应该限制要加入的表的数量。
  • 第三,您需要指定连接条件或连接谓词。连接条件的关键字ONINNER JOIN语句之后。连接条件是用于在主表和其他表之间匹配行的条件。

MySQL INNER JOIN子句的语法如下:

SELECT column_list FROM t1 INNER JOIN t2 ON join_condition1 INNER JOIN t3 ON join_condition2 ... WHERE where_conditions;

下图说明了MySQL INNER JOIN子句如何工作。结果集中的行必须出现在两个表T1和T2中。

MYSQL表连接(十一)INNER JOIN

INNER JOIN子句连接两个表T1和T2,对于T1表中的每一行,MySQL INNER JOIN子句将它与T2表的每一行进行比较,以检查它们是否都满足连接条件。当连接条件匹配时,它将返回合并两个表T1和T2表中的列的行。请注意,两个表T1和T2表中的行必须基于连接条件进行匹配。如果未找到匹配项,则查询将返回空结果集。如果我们连接两个以上的表,这个逻辑也适用。

避免在MySQL INNER JOIN中出现歧义错误的列

如果连接多个表,这些表中列名有相同,则在 SELECT 子句中必须使用表限定符指示是对应的列,以避免不明确的列错误。

例如,如果 SELECT 子句中的 T1 和 T2 表都一个列名为 C ,那么必须参考使用表修饰词 T1.C 或 T2.C 指定 C 列(举个例子:高一年级的一班和二班都有一个同学叫小明,年级大会上老师直接喊小明,显然不太适合,应该指明是一班的小明还是二班的小明)。

如果,我是说万一,一个牛逼的数据库管理员创建一个很长很长的表名称为:there-are-veryvery-longtable-name,为了节省输入表名称的时间,您可以在查询中使用表的别名。例如,可以给 there-are-veryvery-longtable-name 表一个别名为 T ,并指它的列 T.column 代替 there-are-veryvery-longtable-name.column。


MySQL INNER JOIN子句示例

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

MYSQL表连接(十一)INNER JOIN

现在,如果你想得到

  • 从 product 表中读取产品代码(product_code 字段)和产品名称(product_name 字段);
  • 从 productlines 表中读取分类名称(textDescription字段)

那么我们需要从 product 表中的 productline 字段,以及 category 表的 productline 字段进行比较,并选择两个表相匹配的行记录:

SELECT productCode, productName, textDescription FROM products T1 INNER JOIN productlines T2 ON T1.productline = T2.productline;

结果如下:

MYSQL表连接(十一)INNER JOIN


MySQL INNER JOIN与GROUP BY子句

请参阅以下ordersorderdetails表。

MYSQL表连接(十一)INNER JOIN

我们可以使用 INNER JOIN 子句与 GROUP BY子句及从 order 表和 order_detail 表是查询得到订单号,订单状态和总销量:

SELECT T1.orderNumber, STATUS, SUM(quantityOrdered * priceEach) total FROM orders AS T1 INNER JOIN orderdetails AS T2 ON T1.orderNumber = T2.orderNumber GROUP BY orderNumber;

结果如图所示:

MYSQL表连接(十一)INNER JOIN