欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL内连接(INNER JOIN)

程序员文章站 2023-08-23 13:13:59
MySQL INNER JOIN子句介绍 MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录。 INNER JOIN子句是SELECT语句的可选部分,它出现在FROM子句之后。 在使用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)

在mysql inner join中避免列错误

如果连接具有相同列名称的多个表,则必须使用表限定符引用selecton子句的列,以避免列错误。

例如,如果t1t2表都具有名为c的一个相同列名,则必须在selecton子句中使用表限定符,如使用t1.ct2.c指定引用是那个表中的c列。

为了节省书写表限定符的时间,可以在查询中使用表别名。 例如,可以长名称verylonglonglong_tablename表使用表别名,并使用t.column引用其列,而不是使用verylonglonglong_tablename.column,但是如果喜欢书写或使用这么长的表名称,那么也应该允许你的开发伙伴骂你几句类似:傻逼~等这样的话mysql inner join示例

下面来看看中的产品(products)和产品线(productlines)表。它们的 er 图如下所示 -

MySQL内连接(INNER JOIN)

在上面图中,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

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

MySQL内连接(INNER JOIN)

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

select 
    productcode, 
    productname, 
    textdescription
from
    products
        inner join
    productlines using (productline);
sql

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

mysql inner join group by子句

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

MySQL内连接(INNER JOIN)

可以使用具有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

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

MySQL内连接(INNER JOIN)

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

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
shell

在本教程中,您已经学会了如何使用mysql inner join来查询来自多个表中的数据。

 

参考博客   https://www.yiibai.com/mysql/inner-join.html