mysql join语法解析

news/2024/10/8 21:11:27/文章来源:https://www.cnblogs.com/arnozhang/p/18452553

 


MySQL 支持以下 JOIN 语法用于 SELECT 语句和多表 DELETE 和 UPDATE 语句中的 table_references 部分:

table_references:

查询中涉及的一个或多个表的引用,可以是简单表名或 JOIN 表达式的组合。

escaped_table_reference [, escaped_table_reference] ...

escaped_table_reference:

带有特定语法的表引用,可能包含外部连接(OUTER JOIN)的标记。

{ table_reference | { OJ table_reference } }

table_reference:

{ table_factor | joined_table }

table_factor:

表的基本引用,可以是实际表、子查询或派生表。

{tbl_name [PARTITION (partition_names)][[AS] alias] [index_hint_list]| [LATERAL] table_subquery [AS] alias [(col_list)]| ( table_references )
}

joined_table:

由两个或多个表通过 JOIN 语法组合而成的表。

{table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification| table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}

join_specification:

指定如何连接表的条件。

ON search_condition | USING (join_column_list)

join_column_list:

column_name[, column_name] ...

index_hint_list:

给优化器的提示,指示使用特定索引来提高查询性能。

index_hint[ index_hint] ...

index_hint:

单个索引提示,包括使用、忽略或强制特定索引。

USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
| {IGNORE|FORCE} {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)

index_list:

一个或多个索引的名称列表,通常在 index_hint 中使用。

index_name [, index_name] ...

其他说明:

表引用也称为连接表达式。当表引用指向分区表时,可以包含 PARTITION 子句,包括用逗号分隔的分区、子分区或两者。这个选项跟在表名之后,位于任何别名声明之前。这个选项的效果是仅从列出的分区或子分区中选择行。未在列表中命名的分区或子分区将被忽略。

与标准 SQL 相比,MySQL 在 table_factor 的语法上进行了扩展。标准只接受 table_reference,而不接受一对括号内的列表。这种扩展是保守的,如果将 table_reference 项目列表中的每个逗号视为等同于内连接。例如:

SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

等价于:

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

在 MySQL 中,JOINCROSS JOININNER JOIN 是语法等价的(可以互换使用)。在标准 SQL 中,它们并不等价。INNER JOIN 使用 ON 子句,而 CROSS JOIN 则在其他情况下使用。

通常,在仅包含内连接操作的连接表达式中,可以忽略括号。MySQL 还支持嵌套连接。

可以指定索引提示,以影响 MySQL 优化器如何使用索引。优化器提示和 optimizer_switch 系统变量是影响优化器使用索引的其他方式。

编写连接时需要考虑的常见因素:

可以使用 tbl_name AS alias_nametbl_name alias_name 来为表引用取别名:

SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;

table_subquery 也称为派生表或 FROM 子句中的子查询。这样的子查询必须包含别名,以为子查询结果提供表名,并可以选择性地在括号中包含列名列表。以下是一个简单示例:

SELECT * FROM (SELECT 1, 2, 3) AS t1;

在单个连接中可以引用的表的最大数量为 61。这包括通过将派生表和视图合并到外部查询块中处理的连接。

在没有连接条件的情况下,INNER JOIN 和逗号(,)在语义上是等价的:两者在指定表之间产生笛卡尔积(即,第一个表中的每一行都与第二个表中的每一行连接)。

然而,逗号运算符的优先级低于 INNER JOINCROSS JOINLEFT JOIN 等。如果在有连接条件的情况下将逗号连接与其他连接类型混合使用,则可能会发生“Unknown column 'col_name' in 'on clause'”错误。

有关处理此问题的信息将在本节后面提供。

注意事项:

ON 中使用的 search_condition 是可以在 WHERE 子句中使用的任何条件表达式。通常,ON 子句用于指定如何连接表的条件,而 WHERE 子句限制包含在结果集中的行。

如果在 LEFT JOIN 中右表没有匹配的行,则使用所有列设置为 NULL 的行作为右表。可以利用这一点找到在一个表中没有对应行的行:

SELECT left_tbl.*
FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
WHERE right_tbl.id IS NULL;

这个示例找到了所有在 left_tbl 中具有 id 值但在 right_tbl 中不存在的行(即,所有在 left_tbl 中没有对应行的行)。

USING(join_column_list) 子句命名必须存在于两个表中的列的列表。如果表 a 和 b 都包含列 c1、c2 和 c3,以下连接比较两个表中对应的列:

a LEFT JOIN b USING (c1, c2, c3)

两个表的 NATURAL [LEFT] JOIN 定义为在语义上等价于 INNER JOINLEFT JOIN,使用列出所有在两个表中都存在的列的 USING 子句。

RIGHT JOIN 的工作方式与 LEFT JOIN 类似。为了保持代码在不同数据库间的可移植性,建议使用 LEFT JOIN 而不是 RIGHT JOIN

{ OJ ... } 语法在连接语法描述中仅用于与 ODBC 的兼容性。语法中的大括号应写成字面意义;它们不是在语法描述中使用的元语法。

SELECT left_tbl.*
FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id }
WHERE right_tbl.id IS NULL;

可以在 { OJ ... } 中使用其他类型的连接,如 INNER JOINRIGHT OUTER JOIN。这有助于与某些第三方应用程序的兼容性,但不是官方的 ODBC 语法。

STRAIGHT_JOINJOIN 类似,但左表始终在右表之前读取。这可以用于少数(很少)情况下,连接优化器以次优顺序处理表。

连接示例:

SELECT * FROM table1, table2;SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;SELECT * FROM table1 LEFT JOIN table2 USING (id);SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
LEFT JOIN table3 ON table2.id = table3.id;

自然连接和使用 USING 的连接,包括外连接变体,根据 SQL:2003 标准进行处理:

NATURAL 连接的冗余列不会出现。考虑以下一组语句:

CREATE TABLE t1 (i INT, j INT);
CREATE TABLE t2 (k INT, j INT);
INSERT INTO t1 VALUES(1, 1);
INSERT INTO t2 VALUES(1, 1);
SELECT * FROM t1 NATURAL JOIN t2;
SELECT * FROM t1 JOIN t2 USING (j);

在第一个 SELECT 语句中,列 j 在两个表中都出现,因此成为连接列,因此根据标准 SQL,它应该只出现一次,而不是两次。类似地,在第二个 SELECT 语句中,列 j 在 USING 子句中命名,应该只出现一次,而

不是两次。

因此,语句产生的输出为:

+------+------+------+
| j    | i    | k    |
+------+------+------+
|    1 |    1 |    1 |
+------+------+------+

冗余列的消除和列的排序按照...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/810200.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tableau修改行和列的颜色

1.修改颜色 1.1 在列上右键点击设置格式1.2 修改列和角2.逆时针、由里及外依次设置格式在直条上右键

论文《Learning Properties of Ordered and Disordered Materials from Multi-fidelity Data》中的代码实现

github地址:https://github.com/materialsvirtuallab/megnet/tree/master/multifidelity#issues介绍:当前的存储库利用了由同一作者开发的现有MEGNET软件包,并将MEGNET功能扩展到多保真数据集的建模。该存储库将共享公开发布的多保真带隙数据,并展示了运行多保真数据集的模…

Tableau双轴

1.添加度量到行2.添加分类到列3.拖动度量到左侧利润字段处放开

Tableau文本表、直条、散点图、折线图、

1文本表 两次双击选中两个维度2.直条 两次双击依次分别选中一个度量和维度3.散点图 两次双击选中两个度量4.折线图 两次双击依次分别选中一个日期和一个度量

Unity Shader-渲染队列,ZTest,ZWrite,Early-Z

本文介绍了Unity中的渲染队列,包括不透明和半透明物体的渲染顺序,以及如何自定义渲染队列。深度测试(ZTest)和深度写入(ZWrite)的概念被详细解释,同时探讨了Early-Z技术在优化渲染效率中的作用。此外,还提到了Alpha Test在移动设备上的性能问题。 摘要由CSDN通过智能技…

电力系统的负荷损失和潮流计算matlab仿真,对比最高度数,最高介数以及最高关键度等节点攻击

1.课题概述节点攻击是指针对电力系统中某个或多个节点进行的攻击,其目的是破坏电力系统的稳定性和安全性。节点攻击可以分为最高度数攻击、最高介数攻击和最高关键度攻击等。在本课题中,将模拟这四种攻击方式,对比电力系统的停电规模。2.系统仿真结果 3.核心程序与模型 版本…

CMake 属性之目标属性

CMake 可以通过属性来存储信息。它就像是一个变量,但它被附加到一些其他的实体上,像是一个目录或者是一个目标。例如一个全局的属性可以是一个有用的非缓存的全局变量。 在 CMake 的众多属性中,目标属性 ( Target Properties ) 扮演着尤为重要的角色,它们直接关联到最终生成…

模板测试

模板测试(Stencil Test)是3D渲染中的一种技术,它根据预设条件比较参考值与模板缓冲区的值来决定片段是否进行下一步深度测试。本文介绍了模板测试的条件判断公式、语法,包括命令、比较函数,以及更新操作的各种关键字,如Keep、Zero等。并通过穿透效果的例子展示了模板测试…

CH57X/CH58X/CH59X 加PA应用

一、前言在有些时候产品需要做到更远的距离在原来的基础上加上PA放大芯片来实现广播或者连接距离上的提升。 PA是Power Amplifier的简称,中文名称为功率放大器,简称“功放”,指在给定失真率条件下,能产生最大功率输出以驱动某一负载的放大器。对于射频通信系统,PA负责发射通道…

csp-s 模拟 8

难度 ★★★★☆csp-s模拟8 T1 score and rank 特殊性质,题意转换 妙妙题 对于 \(S\) 小于等于 \(0\) 的情况答案显然是所有大于等于 \(S\) 的个数。 现在讨论 \(S\) 大于 \(0\) 的情况。 先对序列做一个前缀和,题目要求即是让所有值减去前缀最小值小于 \(S\) 考虑有一段连续…

C#联合Visionpro编程学习记录,视觉中需要考虑旋转中心工况的计算方法探讨

一、考虑旋转中心的工况解法, 1,视觉中引导定位或者对位贴合时,机械手或者xyzr轴上手爪中心和末端轴中心不同轴时,就要考虑旋转中心问题; 2,如果设备的CT要求没有很苛刻,可以采用2次拍照的方案解决,1次拍照后纠偏角度,然后在纠正角度后的位置2次拍照纠正x、y偏差;看下…

海外模组联网非常难?不往忘了APN配置…

​除了中国之外,国外的4G信号都比较差劲。 做海外的设备,如果忽视了射频的信号质量,肯定是要吃大亏的! 所以,海外模组的联网问题,会比国内要多不少。 客户在实际应用中或多或少都会遇到:网络相关问题:例如:连不上网,APN不会配置,APN没有配置,当地信号差… 软件升级…