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中避免列错误

如果连接具有相同列名称的多个表,则必须使用表限定符引用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列匹配行来从两个表中查询选择数据,如下所示:

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子句从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

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

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

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

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. Java-jacob-文件转HTML

    Java-jacob-文件转HTML: 下载jacob的jar包,然后举个例子. public static final int WORD_HTML = 8; public static final ...

  2. AutoCAD 凸度(bulge)的概念及使用WPF函数画图

    前言  凸度(bulge)是AutoCAD 中一个非常重要的概念,凸度控制着两点之间弧度大小,弧度的方向.各种复杂的图像有可能就是成百上千的弧线组成的.从AutoCAD中导出的数据也有该值,一般的形式 ...

  3. Mysql的变量一览

    Server System Variables(系统变量) MySQL系统变量(system variables)是指MySQL实例的各种系统变量,实际上是一些系统参数,用于初始化或设定数据库对系统资 ...

  4. 函数调用的区别:_cdecl以及_stdcall

    一.概念1)_stdcall调用   _stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,由调用者完成压栈操作,被调函数自身在返回前清空堆栈.   WIN32 Api都采用_ ...

  5. 后台MemoryStream图片流用ajax接收乱码问题

    MemoryStream ms = new MemoryStream(); //要先把二进制流进行编码,再传输,解决乱码问题 Convert.ToBase64String(ms.ToArray()); ...

  6. 【PostMan】1、Postman 发送json格式请求

    Postman 是一个用来测试Web API的Chrome 外挂软件,可由google store 免费取得并安装于Chrome里,对于有在开发Web API的开发者相当有用,省掉不少写测试页面呼叫的 ...

  7. GBK与UTF-8的区别

    GBK的文字编码是双字节来表示的,即不论中.英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1. 至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节) ...

  8. 乐字节-Java8新特性之Date API

    上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...

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

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

  10. NIO学习笔记四 :SocketChannel 和 ServerSocketChannel

    Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器. ...