MySQL INNER JOIN子句介绍

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

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

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

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

INNER JOIN子句的语法如下:

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

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

  1. SELECT column_list
  2. FROM t1
  3. 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列匹配行来从两个表中查询选择数据,如下所示:

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

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

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

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

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

MySQL INNER JOIN GROUP BY子句

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

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

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

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

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

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

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

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

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

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

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

  1. mysql> SELECT
  2. orderNumber,
  3. productName,
  4. msrp,
  5. priceEach
  6. FROM
  7. products p
  8. INNER JOIN
  9. orderdetails o ON p.productcode = o.productcode
  10. AND p.msrp > o.priceEach
  11. WHERE
  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 10159 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 81.35 |
  20. | 10168 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 94.74 |
  21. | 10399 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 77.52 |
  22. | 10403 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 85.17 |
  23. ... ...
  24. | 10417 | 1969 Harley Davidson Ultimate Chopper | 95.7 | 79.43 |
  25. +-------------+---------------------------------------+------+-----------+
  26. 26 rows in set
Shell

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

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

MySQL内连接(INNER JOIN)的更多相关文章

  1. MySQL内连接和外连接

    INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右连接): 与 LEF ...

  2. mysql学习笔记(七)—— MySQL内连接和外连接

        MySQL内连接(inner join on) MySQL的内连接使用inner join on,它的效果跟使用where是一样的,如果联结的是两个表,那么需要左右的条件或者说字段是需要完全匹 ...

  3. 内连接INNER JOIN(三十四)

    内连接INNER JOIN 一.连接 MySQL的SELECT语句.多表更新.多表删除语句中支持JOIN操作. 语法结构 二.数据表参照 table_reference tbl_name [[AS] ...

  4. 详解MySQL 内连接、外连接、左连接、右连接

    建表语句: CREATE TABLE `a_table` ( `a_id` ) DEFAULT NULL, `a_name` ) DEFAULT NULL, `a_part` ) DEFAULT NU ...

  5. EntityFramework 使用Linq处理内连接(inner join)、外链接(left/right outer join)、多表查询

    场景:在实际的项目中使用EntityFramework都会遇到使用Ef处理连接查询的问题,这里做一些小例子如何通过Linq语法处理内连接(inner join).外连接(left/right oute ...

  6. mysql内连接、左连接、右连接

    内连接(INNER JOIN)(典型的连接运算,使用像   =   或   <>   之类的比较运算符).包括相等连接和自然连接. 内连接使用比较运算符根据每个表共有的列的值匹配两个表中的 ...

  7. mysql内连接(inner join 找两个表的交集)、左连接(left join 交集并且左表所有)、右连接(right join 交集并且右表所有)、全连接(mysql不支持)

    用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接.外连接( 左(外)连接.右(外)连接.全(外)连接). MySQL版 ...

  8. mysql 内连接 左连接 右连接 外连接

    mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | ...

  9. MySQL 内连接与外连接

    1.内连接 MySQL中,join,cross join,inner join 是等价的. 2.外连接 2.1 左外连接 left join 2.2 右外连接  right join 3.连接条件 使 ...

  10. 【MySQL】MySQL内连接,左连接,右连接查询

    概念 INNER JOIN(内连接):获取两个表中字段匹配关系的记录.也就是只会返回共有的内容. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右 ...

随机推荐

  1. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

  2. [转]ui-grid User can't select the row by clicking the select checkbox available in the respective row when enableFullRowSelection : true"

    本文转自:https://github.com/angular-ui/ui-grid/issues/5239 Try this style to enable checkbox selection: ...

  3. IdentityServer4关于多客户端和API的最佳实践【含多类型客户端和API资源,以及客户端分组实践】【下】

    经过前两篇文章你已经知道了关于服务器搭建和客户端接入相关的基本资料,本文主要讲述整个授权系统所服务的对象,以ProtectApi资源为演示 目标: 1)实现多资源服务器针对请求的token校验,接入I ...

  4. (白话理解)CAS机制

    (白话理解)CAS机制 通过一段对话我们来了解cas用意 示例程序:启动两个线程,每个线程中让静态变量count循环累加100次. 最终输出的count结果是什么呢?一定会是200吗? 加了同步锁之后 ...

  5. log4j.appender.file.DatePattern

    DailyRollingFileAppender是日志记录软件包Log4J中的一个Appender,它能够按一定的频度滚动日志记录文件. 我们可以按下面的方式配置DailyRollingFileApp ...

  6. 性能监控(2)–linux下的vmstat命令

    vmstat它可以统计CPU.内存使用情况.swap使用情况等信息.它还可以指定采样周期和次数.

  7. What are the differences between struct and class in C++?

    Question: This question was already asked in the context of C#/.Net. Now I'd like to learn the diffe ...

  8. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

  9. 【读书笔记】iOS-分类与协议

    分类与协议是Object-C特有概念,分类(Category)可以认为是一种继承性的扩展,而协议(Protocol)可以理解为Java中的Interface(接口)或者C++的纯虚类. 参考资料:&l ...

  10. 从零开始学习html(五)与浏览者交互,表单标签——下

    六.使用下拉列表框进行多选 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type ...