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
子句衔接两个表:t1
和t2
,我们来简化上面的语法。
SELECT column_list
FROM t1
INNER JOIN t2 ON join_condition;
SQL
对t1
表中的每行,INNER JOIN
子句将它与t2
表的每行进行比拟,以检讨它们是不是都满足衔接条件。当满足衔接条件时,INNER JOIN
将返回由t1
和t2
表中的列组成的新行。
请注意,t1
和t2
表中的行必需依据衔接条件进行匹配。如果找不到匹配项,查询将返回一个空成果集。当衔接超过2
个表时,也运用此逻辑。
以下维恩图解释了INNER JOIN
子句的工作原理。成果集中的行必需涌现在两个表中:t1
和t2
,如两个圆的交叉部份所示 -
在MySQL INNER JOIN中避免列毛病
如果衔接具有雷同列名称的多个表,则必需应用表限定符援用SELECT
和ON
子句的列,以免列毛病。
例如,如果t1
和t2
表都具着名为c
的一个雷同列名,则必需在SELECT
和ON
子句中应用表限定符,如应用t1.c
或t2.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
表中的productCode
和productName
列的值。 - 获得
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
子句从orders
和orderdetails
表中获得定单号,定单状况和总出售额,以下所示:
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