MySQL INNER JOIN子句介绍

MySQL INNER JOIN子句介绍

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

INNER JOIN子句是SELECT语句的可选部分,它出现在FROM子句之后。

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

  • 首先,在FROM子句中指定主表。
  • 其次,表中要连接的主表应该出现在INNER JOIN子句中。理论上说,可以连接多个其他表。 但是,为了获得更好的性能,应该限制要连接的表的数量(最好不要超过三个表)。
  • 第三,连接条件或连接谓词。连接条件出现在INNER JOIN子句的ON关键字之后。连接条件是将主表中的行与其他表中的行进行匹配的规则。

INNER JOIN子句的语法如下:

1SELECT column_list 2FROM t1 3INNER JOIN t2 ON join_condition1 4INNER JOIN t3 ON join_condition2 5... 6WHERE where_conditions; 7SQL

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

1SELECT column_list 2FROM t1 3INNER JOIN t2 ON join_condition; 4SQL

对于t1表中的每一行,INNER JOIN子句将它与t2表的每一行进行比较,以检查它们是否都满足连接条件。当满足连接条件时,INNER JOIN将返回由t1t2表中的列组成的新行。

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

以下维恩图说明了INNER JOIN子句的工作原理。结果集中的行必须出现在两个表中:t1t2,如两个圆的交叉部分所示 -

img

在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 图如下所示 -

img

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

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

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

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

1SELECT 2 productCode, 3 productName, 4 textDescription 5FROM 6 products t1 7 INNER JOIN 8 productlines t2 ON t1.productline = t2.productline; 9SQL

执行上面查询,得到下面的结果(部分)-

img

由于两个表的连接列是使用相同一个列:productline,因此可以使用以下语法:

1SELECT 2 productCode, 3 productName, 4 textDescription 5FROM 6 products 7 INNER JOIN 8 productlines USING (productline); 9SQL

上面语句返回相同的结果集,但是使用此语法,不必使用表的别名。

MySQL INNER JOIN GROUP BY子句

请参阅以下订单和订单详细表,orders表和orderdetails表的结构如下所示 -

img

可以使用具有GROUP BY子句的INNER JOIN子句从ordersorderdetails表中获取订单号,订单状态和总销售额,如下所示:

1SELECT 2 T1.orderNumber, 3 status, 4 SUM(quantityOrdered * priceEach) total 5FROM 6 orders AS T1 7 INNER JOIN 8 orderdetails AS T2 ON T1.orderNumber = T2.orderNumber 9GROUP BY orderNumber; 10SQL

执行上面查询,结果如下所示(部分) -

img

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

1SELECT 2 orderNumber, 3 status, 4 SUM(quantityOrdered * priceEach) total 5FROM 6 orders 7 INNER JOIN 8 orderdetails USING (orderNumber) 9GROUP BY orderNumber; 10SQL

MySQL INNER JOIN使用等于以外的运算符

到目前为止,您已经看到连接谓词使用相等的运算符(=)来匹配行。但是也可以使用大于(>),小于(<)和不等于(<>)运算符的其他运算符来形成连接谓词。

以下查询使用少于(<)连接来查找低于代码为S10_1678的产品的销售价格的制造商建议零售价(MSRP)的所有产品。

1SELECT 2 orderNumber, 3 productName, 4 msrp, 5 priceEach 6FROM 7 products p 8 INNER JOIN 9 orderdetails o ON p.productcode = o.productcode 10 AND p.msrp > o.priceEach 11WHERE 12 p.productcode = 'S10_1678'; 13SQL

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

1mysql> SELECT 2 orderNumber, 3 productName, 4 msrp, 5 priceEach 6FROM 7 products p 8 INNER JOIN 9 orderdetails o ON p.productcode = o.productcode 10 AND p.msrp > o.priceEach 11WHERE 12 p.productcode = 'S10_1678'; 13+-------------+---------------------------------------+------+-----------+ 14| orderNumber | productName | msrp | priceEach | 15+-------------+---------------------------------------+------+-----------+ 16| 10107 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 81.35 | 17| 10121 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 86.13 | 18| 10134 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 90.92 | 19| 10145 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 76.56 | 20| 10159 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 81.35 | 21| 10168 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 94.74 | 22| 10399 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 77.52 | 23| 10403 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 85.17 | 24... ... 25| 10417 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 79.43 | 26+-------------+---------------------------------------+------+-----------+ 2726 rows in set

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0