mysql join on用法(MySQL 中的各种 JOIN)

2024-07-20 06:46:58 6

mysql join on用法(MySQL 中的各种 JOIN)

本文目录

MySQL 中的各种 JOIN

本文主要介绍 SQL 标准中定义的各种连接的意义和区别,例如,交叉连接( CROSS JOIN )、内连接( INNER JOIN )、外连接( OUTER JOIN )、自然连接( NATURAL JOIN )等,并结合例子讲解这些连接在 MySQL 中的语法和表现。

从网上的资料看, JOIN 更多翻译为连接,本文中凡是出现中文“连接”的地方都是指 JOIN 。

本文中用到的所有例子涉及两张表—— customers 用户表和 orders 订单表,其中订单表中的 cust_id 字段表示用户的唯一 ID,也就是用户表的主键 cust_id 。两张表的数据如下:

注:两张表都经过了简化,实际业务中这两张表肯定还包括其他字段。

英文维基百科 JOIN 词条 对连接的定义如下:

翻译过来就是,“连接可以根据一张(自连接)或多张表中的共同值将这些表的列数据合并为一个新的结果集,标准 SQL 定义了五种连接:内连接、左外连接、右外连接、全外连接和交叉连接。”

也就是说,连接是 SQL 标准中定义的一种组合多张表的方式,当然一张表自身也可以和自身组合,称为自连接。连接后得到的结果集的每一列其实都来自用于连接的多张表,不同的连接类型只是区分了这些列具体从哪张表里来,列里填充的是什么数据。

其实英文维基百科的 JOIN 词条已经把各种连接的类型解释地非常清楚了,非常值得去看一下。

我们来看一下 SQL 标准中定义的各种连接类型,理解各种连接最好的方法就是把需要连接的表想象成集合,并画出可以反映集合的交与并的情况的图——韦恩图,例如下图就画出了 SQL 中定义的几种主要连接。

请先仔细查看一下图中的内容,你可以从中归纳出几种连接类型呢?

虽然图中画了 7 种集合的交并情况,但是总结起来,主要是两种连接类型在起作用——内连接( INNER JOIN )和外连接( OUTER JOIN ),其中外连接又分为了左外连接( LEFT OUTER JOIN )、右外连接( RIGHT OUTER JOIN )和全外连接( FULL OUTER JOIN )。

下面先简单介绍一下 SQL 标准中各种连接的定义,然后在「MySQL 中的连接」一节再用例子来演示 MySQL 中支持的各种连接。

连接既然是用来合并多张表的,那么要定义一个连接就必须指定需要连接的表,并指定可选的连接条件。例如,一个典型的 SQL 连接语句如下:

我们用表 A 和表 B 指代需要连接的两张表,经过 内连接 后得到的结果集 包含所有满足 连接条件 的数据;而经过 外连接 后得到的数据集 不仅 包含满足 连接条件 的数据,还包含其他数据,具体的差别是:

在上面「SQL 标准定义的主要连接」一图中并没有列出交叉连接,交叉连接会对连接的两张表做笛卡尔积,也就是连接后的数据集中的行是由第一张表中的每一行与第二张表中的每一行配对而成的,而不管它们 逻辑上 是否可以搭配在一起。假设交叉连接的两张表分别有 m 和 n 行数据,那么交叉连接后的数据集就包含 m 乘以 n 行数据。

连接根据连接的条件不同,又可以区分为等值连接和非等值连接,「SQL 标准定义的主要连接」图中画出的连接的连接条件都是比较两个字段是否相等,它们都是等值连接。

自然连接是等值连接的一种特殊形式,自然连接会自动选取需要连接的两张表中字段名相同的 所有 列做相等比较,而不需要再指定连接条件了。

注:以下内容全部基于 MySQL 5.7 版本,所有例子只保证在 MySQL 5.7 上是可以正确执行的。

MySQL 中支持的连接类型和关键字如下:

上面的表示方法摘自 MySQL 5.7 版本 官方文档 ,其中 | 表示两者皆可出现, 表示的是可选的, {} 表示的是必选的,例如 NATURAL LEFT JOIN 和 NATURAL JOIN 都是合法的。

可以看到,除了全外连接( FULL OUTER JOIN )以外, MySQL 基本支持了 SQL 标准中定义的各种连接。在 MySQL 中全外连接可以通过 UNION 合并的方式做到,当然前提是你知道自己为什么需要这么做,具体参见: Full Out Join in MySQL 。

MySQL 语法中还支持一个并不在 SQL 标准中的 STRAIGHT_JOIN ,它在 表现上 和内连接或者交叉连接并无区别,只是一种给 MySQL 优化器的一个提示, STRAIGHT_JOIN 提示 MySQL 按照语句中表的顺序加载表,只有在你明确清楚 MySQL 服务器对你的 JOIN 语句做了负优化的时候才可能用到它。

还有一点需要说明的是,根据 官方文档 ,在 MySQL 中, JOIN 、 CROSS JOIN 和 INNER JOIN 实现的功能是一致的,它们在语法上是等价的。从语义上来说, CROSS JOIN 特指无条件的连接(没有指定 ON 条件的 JOIN 或者没有指定 WHERE 连接条件的多表 SELECT ), INNER JOIN 特指有条件的连接(指定了 ON 条件的 JOIN 或者指定了 WHERE 连接条件的多表 SELECT )。当然,如果你非要写 ... CROSS JOIN ... ON ... 这样的语法,也是可以执行的,虽然写着交叉连接,实际上执行的是内连接。

下面我们就用例子来看一看 MySQL 中支持的几种连接的例子。

注:下面的例子都没有指定 ORDER BY 子句,返回结果的顺序可能会因为数据插入顺序的不同而略有不同。

MySQL 的交叉连接或内连接有两种写法,一种是使用 JOIN 并用 ON 或者 USING 子句指定连接条件的写法,一种是普通的 SELECT 多表,并且用 WHERE 子句指定连接的键的写法。

下面的例子是一个交叉连接:

上面的写法等价于:

当然,第二种写法中如果将 CROSS JOIN 替换成 JOIN 或者 INNER JOIN 也是可以正确执行的。上面两条语句的执行结果如下:

可以看到共返回了 30 行结果,是两张表的笛卡尔积。

一个内连接的例子如下:

上面的写法等价于:

在连接条件比较的字段相同的情况下,还可以改用 USING 关键字,上面的写法等价于:

上面三条语句的返回结果如下:

可以看到只返回了符合连接条件 customers.cust_id = orders.cust_id 的 6 行结果,结果的含义是所有有订单的用户和他们的订单。

左外连接和右外连接的例子如下,其中的 OUTER 关键字可以省略:

其中右外连接的返回与内连接的返回是一致的(思考一下为什么),左外连接的返回结果如下:

可以看到一共返回了 8 行数据,其中最后两行数据对应的 order_id 的值为 NULL ,结果的含义是所有用户的订单,不管这些用户是否已经有订单存在了。

根据前面介绍的自然连接的定义,自然连接会自动用参与连接的两张表中 字段名相同 的列做等值比较,由于例子中的 customers 和 orders 表只有一列名称相同,我们可以用自然连接的语法写一个与上面的内连接的例子表现行为一样的语句如下:

可以看到,使用自然连接就不能再用 ON 子句指定连接条件了,因为这完全是多余的。

当然,自然连接同样支持左外连接和右外连接。

下面用一个 customers 表自连接的例子再来说明一下自然连接,语句如下:

因为是自连接,因此必须使用 AS 指定别名,否则 MySQL 无法区分“两个” customers 表,运行的结果如下:

可以看到结果集和 customers 表完全一致,大家可以思考一下为什么结果是这样的。

文章之前也提到了,MySQL 还支持一种 SQL 标准中没有定义的“方言”, STRAIGHT_JOIN , STRAIGHT_JOIN 支持带 ON 子句的内连接和不带 ON 子句的交叉连接,我们来看一个 STRAIGHT_JOIN 版本的内连接的例子:

返回结果与前面内连接的例子是一致的,如下:

STRAIGHT_JOIN 的表现和 JOIN 是完全一致的,它只是一种给 MySQL 优化器的提示,使得 MySQL 始终按照语句中表的顺序读取表(上面的例子中,MySQL 在执行时一定会先读取 customers 表,再读取 orders 表),而不会做改变读取表的顺序的优化。关于 MySQL 优化器的话题这里不做展开,需要说明的是除非你非常清楚你在做什么,否则不推荐直接使用 STRAIGHT_JOIN 。

你能理解上面的语句是在检索什么数据吗?

本文主要介绍了 SQL 标准里定义的各种连接的概念,以及 MySQL 中的实现,并通过各种例子来介绍了这些连接的区别。这些连接不一定都能在实际开发中用到,但是做到心中有知识也还是很有必要的。

那么,现在再回忆一下,什么是内连接、外连接、自连接、等值连接和自然连接?他们的区别是什么?

最后,给大家留一个思考题,为什么 MySQL 中没有左外连接或者右外连接版本的 STRAIGHT_JOIN ?

mysql中join连接查询问题

你应该这样:

select  GROUP_CONCAT(stu.name),sum(scores.score) from scores join stu on scores.name_id=stu.id;

Mysq可不会智能到自动揣摩你的心思把其他字段合并起来。

另外,上述用法也只能在Mysql中有效,其他数据库中是要出错的,因为按照SQL标准,含有聚合函数的查询语句只能包含聚合字段以及GROUP by后面定义的字段,不能包含其他字段的,所以Mysql实际上属于犯规了

mysql 根据id,a join b on a.id=b.id ,为什么a中没有匹配的记录也会出现

你的语句写错了,应该是:select t1. id,t2. id from test t1 join test2 t2 on t1.id=t2.id;或者使用右连接语句也行:select t1. id,t2. id from test t1 right join test2 t2 on t1.id=t2.id;

mysql关联left join条件on和where条件的区别及结合coalesce函数

leftjoin条件on和where条件的区别:on中的条件关联,一表数据不满足条件时会显示空值。where则输出两表完全满足条件数据。coalesce函数表示可以返回参数中的第一个非空表达式,当你有N个参数时选取第一个非空值(从左到右)。

什么是mysql左链接查询 如何使用

一般所说的左连接,外连接是指左外连接,右外连接。做个简单的测试你看吧。先说左外连接和右外连接: SQL》select * from t1;ID NAME---------- --------------------1 aaa2 bbb SQL》select * from t2;ID AGE---------- ----------1 203 30左外连接: SQL》select * from t1 left join t2 on t1.id=t2.id;ID NAME ID AGE---------- -------------------- ---------- ----------1 aaa 1 202 bbb右外连接: SQL》select * from t1 right join t2 on t1.id=t2.id;ID NAME ID AGE---------- -------------------- ---------- ----------1 aaa 1 203 30从上面的显示你可以看出:左外连接是以左边的表为基准。通俗的讲,先将左边的表全部显示出来,然后右边的表id与左边表id相同的记录就“拼接”上去,比如说id为1的记录。如果没有匹配的id,比如说t1中id为2的t2中就没有。那边就以null显示。右外连接过程正好相反。再看内连接: SQL》select * from t1 inner join t2 on t1.id=t2.id;ID NAME ID AGE---------- -------------------- ---------- ----------1 aaa 1 20看到没有? 只有一条记录。内连接就是只取出符合过滤条件的记录 也就是t1.id=t2.id 那么符合t1.id=t2.id的记录只有id=1这一条,所以只显示一条。 不像外连接,是将你作为基准的表(左外连接就是左边表为基准,右外连接就是右边表为基准)的所有行都显示出来。

mysql里面 left join on 和 普通多表查询 有啥区别 我感觉区别不大 能否通俗点解释下

表a 记录 有 a1 a2表b 记录 a1普通的 之 普通的知显示 a1a left join b 会显示 a1 a2 left join 2个表 即使 左边的那个表里有 而右边的表里没有 也显示出来

mysql join on用法(MySQL 中的各种 JOIN)

本文编辑:admin

更多文章:


最基本的表格制作方法(如何制作一张表格)

最基本的表格制作方法(如何制作一张表格)

本文目录如何制作一张表格表格的制作方法电脑word表格制作教程如何制作一张表格Microsoft Word 提供了几种创建表格 (表格:表格由一行或多行单元格组成,用于显示数字和其他项以便快速引用和分析。表格中的项被组织为行和列。)的方法。

2024年7月1日 06:03

谁给提供几个网页设计、网页制作、酷站欣赏的网站?数据库设计,网站是酷站欣赏网站(就是把网页截图,然后分类)请看详细 (问题看似复杂,其实很简单

谁给提供几个网页设计、网页制作、酷站欣赏的网站?数据库设计,网站是酷站欣赏网站(就是把网页截图,然后分类)请看详细 (问题看似复杂,其实很简单

本文目录谁给提供几个网页设计、网页制作、酷站欣赏的网站数据库设计,网站是酷站欣赏网站(就是把网页截图,然后分类)请看详细 (问题看似复杂,其实很简单谁给提供几个网页设计、网页制作、酷站欣赏的网站酷站欣赏: 八只熊酷站:www.8bears.

2024年1月7日 21:00

fseek fp 20l 2(函数调用语句:fgets(buf,n,fp)中,buf,n,fp的含义分别是什么)

fseek fp 20l 2(函数调用语句:fgets(buf,n,fp)中,buf,n,fp的含义分别是什么)

本文目录函数调用语句:fgets(buf,n,fp)中,buf,n,fp的含义分别是什么c语言fseek函数变量问题函数调用语句:fgets(buf,n,fp)中,buf,n,fp的含义分别是什么2.有下列语句:fgets(buf,n,fp

2024年7月18日 10:26

excel函数公式身份证号提取年龄(excel身份证号提取年龄公式)

excel函数公式身份证号提取年龄(excel身份证号提取年龄公式)

各位老铁们好,相信很多人对excel函数公式身份证号提取年龄都不是特别的了解,因此呢,今天就来为大家分享下关于excel函数公式身份证号提取年龄以及excel身份证号提取年龄公式的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看

2024年6月30日 04:06

match是什么意思英语翻译(比赛用英语怎么说)

match是什么意思英语翻译(比赛用英语怎么说)

本文目录比赛用英语怎么说英语中match是什么意思火柴英文是什么match中文是什么意思match的汉语翻译match是什么意思中文game和match有什么区别matches什么意思中文翻译翻译match比赛用英语怎么说“比赛”英语说法:

2024年5月20日 23:45

很好用却很少人用的单词(学了多年的英语,你用过了吗)

很好用却很少人用的单词(学了多年的英语,你用过了吗)

本文目录学了多年的英语,你用过了吗有没有好用的英语app,免费的2019考研英语单词书哪个好学了多年的英语,你用过了吗感谢邀请!本人学习英语不是为了考试,纯粹是自己的爱好,以前学习的时候是学中用,用中学,为了练习口语曾经对着镜子面向墙壁练习

2023年8月26日 08:00

eval函数也称为评估函数(评估函数eval(’“1+2“’)的执行结果是:)

eval函数也称为评估函数(评估函数eval(’“1+2“’)的执行结果是:)

本文目录评估函数eval(’“1+2“’)的执行结果是:matlab中的eval是什么意思eval()函数是什么意思评估函数eval(’“1+2“’)的执行结果是:评估函数eval(’"1+2"’)的执行结果是: A.1+2 B.

2024年5月1日 01:10

lazyload(怎样使用lazyload延时加载js和css)

lazyload(怎样使用lazyload延时加载js和css)

其实lazyload的问题并不复杂,但是又很多的朋友都不太了解怎样使用lazyload延时加载js和css,因此呢,今天小编就来为大家分享lazyload的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录怎样使用l

2024年8月10日 01:40

status monitor(怎么关闭EPSON STATUS MONITOR 3)

status monitor(怎么关闭EPSON STATUS MONITOR 3)

本文目录怎么关闭EPSON STATUS MONITOR 3打印时出现epson status monitor 3已停止工作电脑开机时出现monitor status是什么意思电脑显示弄到了电视上面,怎么弄回来status monitor是

2024年7月24日 03:52

sqlserver收缩数据库(如何减小SqlServer数据库文件大小)

sqlserver收缩数据库(如何减小SqlServer数据库文件大小)

本篇文章给大家谈谈sqlserver收缩数据库,以及如何减小SqlServer数据库文件大小对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录

2024年9月3日 10:35

苹果cms海螺模板(海螺模板控制器不存在)

苹果cms海螺模板(海螺模板控制器不存在)

各位老铁们好,相信很多人对苹果cms海螺模板都不是特别的了解,因此呢,今天就来为大家分享下关于苹果cms海螺模板以及海螺模板控制器不存在的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录海螺模板控制器不存在海螺模板

2024年8月20日 16:45

discovery怎么读(探索英文怎么念)

discovery怎么读(探索英文怎么念)

本文目录探索英文怎么念找到发现的英语单词是什么discovery 的音标[dɪ’skʌvəri] 中的k是发什么音呢 我听有道里面读“嘎我瑞“discovery怎么断写discovery怎么读探索英文怎么念quest 英     n. 探索

2024年7月24日 09:28

myeclipse怎么新建项目(怎样用myeclipse创建一个jsp的项目)

myeclipse怎么新建项目(怎样用myeclipse创建一个jsp的项目)

本文目录怎样用myeclipse创建一个jsp的项目myeclipse为什么新建web project时没反应 点过以后没有任何反应myeclipse新建maven项目myeclipse如何创建struts项目myeclipse8.5怎么创

2024年7月2日 11:45

plc模拟编程软件怎么下载(台达plc如何下载编程软件)

plc模拟编程软件怎么下载(台达plc如何下载编程软件)

本文目录台达plc如何下载编程软件三菱plc软件和仿真软件到哪里下载哪里可以下载plc编程软件台达plc如何下载编程软件打开浏览器,搜索台达的官网,并打开。在“服务于支持”-“下载中心”。左侧根据你的需要选择分类,右侧选择“软件”,然后点“

2024年3月16日 21:40

服务启动后停止 某些服务(“本地计算机上的Windows Search服务启动后停止”怎么解决啊)

服务启动后停止 某些服务(“本地计算机上的Windows Search服务启动后停止”怎么解决啊)

本文目录“本地计算机上的Windows Search服务启动后停止”怎么解决啊计算机上的 Windows media player network sharing service服务启动后停止.本地计算机上的windows defedner

2024年7月13日 04:34

myeclipse怎么新建项目(myeclipse为什么新建web project时没反应 点过以后没有任何反应)

myeclipse怎么新建项目(myeclipse为什么新建web project时没反应 点过以后没有任何反应)

本文目录myeclipse为什么新建web project时没反应 点过以后没有任何反应MyEclipse 5.5.1 GA怎么新建项目和类用MyEclipse怎么创建一个 windows应用程序myeclipse8.5怎么创建java项目

2024年7月7日 08:13

指针函数和函数指针(感觉c++函数,指针太难,想先学python,不知各位大佬怎么看)

指针函数和函数指针(感觉c++函数,指针太难,想先学python,不知各位大佬怎么看)

本文目录感觉c++函数,指针太难,想先学python,不知各位大佬怎么看C语言中指针问题感觉c++函数,指针太难,想先学python,不知各位大佬怎么看作为一名IT行业的从业者,同时也在使用Python从事机器学习方面的开发,所以我来回答一

2023年5月15日 13:40

如何使用腾讯会议上课(停课5天怎么使用腾讯会议上课)

如何使用腾讯会议上课(停课5天怎么使用腾讯会议上课)

本文目录停课5天怎么使用腾讯会议上课腾讯会议怎么上课怎么用腾讯会议上网课手机腾讯会议怎么给学生讲课平板如何使用腾讯会议上课如何用腾讯会议上课怎么用腾讯会议在课堂上讲课老师怎么用手机腾讯会议上课停课5天怎么使用腾讯会议上课课前准备工作1、下载

2024年7月10日 15:36

decode函数用法python(为什么python decode每效果)

decode函数用法python(为什么python decode每效果)

本文目录为什么python decode每效果是否有Python库函数试图猜测某些字节的字符编码decode和nvl的用法decode 用法为什么python decode每效果decode()方法使用注册编码的编解码器的字符串进行解码。它

2023年10月30日 10:00

powerful名词形式(you are so power)

powerful名词形式(you are so power)

各位老铁们,大家好,今天由我来为大家分享powerful名词形式,以及you are so power的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目

2024年7月24日 03:10

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1730
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1155
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1152
标签列表

热门搜索