阅读背景:

MySQL INNER JOIN子句介绍

来源:互联网 

MySQL INNER JOIN子句介绍

MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并许可从两个表中查询包括列的行记载。

INNER JOIN子句是SELECT语句的可选部份,它涌现在FROM子句以后。

在应用INNER JOIN子句之前,必需指定以下条件:

  • 首先,在FROM子句中指定主表。
  • 其次,表中要衔接的主表应当涌现在INNER JOIN子句中。理论上说,可以衔接多个其他表。 但是,为了取得更好的性状,应当限制要衔接的表的数目(最好不要超过三个表)。
  • 第三,衔接条件或衔接谓词。衔接条件涌现在INNER JOIN子句的ON症结字以后。衔接条件是将主表中的行与其他表中的行进行匹配的规矩。

INNER JOIN子句的语法以下:

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

假定应用INNER JOIN子句衔接两个表:t1t2,我们来简化上面的语法。

SELECT column_list
FROM t1
INNER JOIN t2 ON join_condition;
SQL

t1表中的每行,INNER JOIN子句将它与t2表的每行进行比拟,以检讨它们是不是都满足衔接条件。当满足衔接条件时,INNER JOIN将返回由t1t2表中的列组成的新行。

请注意,t1t2表中的行必需依据衔接条件进行匹配。如果找不到匹配项,查询将返回一个空成果集。当衔接超过2个表时,也运用此逻辑。

以下维恩图解释了INNER JOIN子句的工作原理。成果集中的行必需涌现在两个表中:t1t2,如两个圆的交叉部份所示 -

在MySQL INNER JOIN中避免列毛病

如果衔接具有雷同列名称的多个表,则必需应用表限定符援用SELECTON子句的列,以免列毛病。

例如,如果t1t2表都具着名为c的一个雷同列名,则必需在SELECTON子句中应用表限定符,如应用t1.ct2.c指定援用是那个表中的c列。

为了节俭书写表限定符的时光,可以在查询中应用表别号。 例如,可以长名称verylonglonglong_tablename表应用表别号,并应用t.column援用其列,而不是应用verylonglonglong_tablename.column,但是如果爱好书写或应用这么长的表名称,那末也应当许可你的开发火伴骂你几句相似:傻逼~等这样的话!

MySQL INNER JOIN示例

下面来看看示例数据库(yiibaidb)中的产品(products)和产品线(productlines)表。它们的 ER 图以下所示 -

在上面图中,products表中的productLine列参考援用productlines表的productline列。 products表中的productLine列称为外键列。

通常,衔接具有外键关系的表,如产品线(productlines)和产品(products)表。现在,如果想获得以下数据 -

  • 获得products表中的productCodeproductName列的值。
  • 获得productlines表产品线的描写 - textDescription列的值。

为此,须要通过应用INNER JOIN子句依据productline列匹配行来从两个表中查询选择数据,以下所示:

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

履行上面查询,得到下面的成果(部份)-

由于两个表的衔接列是应用雷同一个列:productline,因此可以应用以下语法:

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

上面语句返回雷同的成果集,但是应用此语法,没必要应用表的别号。

MySQL INNER JOIN GROUP BY子句

请参阅以下定单和定单详细表,orders表和orderdetails表的构造以下所示 -

可以应用具有GROUP BY子句的INNER JOIN子句从ordersorderdetails表中获得定单号,定单状况和总出售额,以下所示:

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

履行上面查询,成果以下所示(部份) -

相似地,以下语句查询与上述得到成果雷同:

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

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";
SQL

履行上面查询语句,得到以下输出成果 -

mysql> 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";
+-------------+---------------------------------------+------+-----------+
| orderNumber | productName                           | msrp | priceEach |
+-------------+---------------------------------------+------+-----------+
|       10107 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 81.35     |
|       10121 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 86.13     |
|       10134 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 90.92     |
|       10145 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 76.56     |
|       10159 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 81.35     |
|       10168 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 94.74     |
|       10399 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 77.52     |
|       10403 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 85.17     |
... ...
|       10417 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 79.43     |
+-------------+---------------------------------------+------+-----------+
26 rows in set

原文出自【易百教程】,原文连接:https://www.yiibai.com/mysql/inner-join.html

分享到: