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;
假设使用inner join
子句连接两个表:t1
和t2
,我们来简化上面的语法。
select column_list from t1 inner join t2 on join_condition;
对于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示例
下面来看看中的产品(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;
执行上面查询,得到下面的结果(部分)-
由于两个表的连接列是使用相同一个列:productline
,因此可以使用以下语法:
select productcode, productname, textdescription from products inner join productlines using (productline);
上面语句返回相同的结果集,但是使用此语法,不必使用表的别名。
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;
执行上面查询,结果如下所示(部分) -
类似地,以下语句查询与上述得到结果相同:
select ordernumber, status, sum(quantityordered * priceeach) total from orders inner join orderdetails using (ordernumber) group by ordernumber;
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> 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
在本教程中,您已经学会了如何使用mysql inner join
来查询来自多个表中的数据。
参考博客 https://www.yiibai.com/mysql/inner-join.html