首批通过分布式安全可靠测评,为关键业务系统打造
JOIN 子句
更新时间:2026-03-26 17:02:34
描述
JOIN 子句用于将两个或多个表的行联接在一起,基于这些表之间的相关列进行匹配。
权限要求
执行表联接(JOIN)时,需要当前用户至少拥有参与 JOIN 表的 SELECT 权限。有关 OceanBase 数据库权限的详细介绍,参见 MySQL 模式下的权限分类。
语法
table_references:
table_reference [, table_reference ...]
table_reference:
table_factor
| joined_table
table_factor:
table_name [PARTITION (partition_name_list)] [sample_clause [SEED(integer)]] [[AS] table_alias_name][index_hint_list]
| table_subquery [AS] table_alias_name
| (table_references)
partition_name_list:
partition_name [, partition_name ...]
sample_clause:
SAMPLE [BLOCK] [ALL | BASE | INCR] (sample_percent)
index_hint_list:
index_hint [, index_hint ...]
index_hint:
{USE | FORCE | IGNORE} {KEY | INDEX} [FOR {JOIN | ORDER BY | GROUP BY}] (index_name_list)
index_list:
index_name [, index_name ...]
table_subquery:
(select_stmt [sample_clause [SEED(integer)]])
joined_table:
table_reference [NATURAL] [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference outer_join_type JOIN table_factor join_condition
join_condition:
ON expression
| USING (join_column_list)
join_column_list:
column_name [, column_name ...]
outer_join_type:
[NATURAL] {LEFT | RIGHT | FULL} [OUTER]
参数解释
| 参数 | 描述 |
|---|---|
| table_reference | 表示表引用,可以是单个表、联接表或子查询。 |
| table_factor | 表示查询的数据源表,也可以是表子查询或者括号中的表引用。详细介绍可参见下文 table_factor。 |
| joined_table | 表示联接表。详细介绍可参见下文 joined_table。 |
table_factor
table_name [PARTITION (partition_name_list)] [sample_clause [SEED(integer)]] [[AS] table_alias_name] [index_hint_list]:指定查询的数据源表。具体如下:table_name:指定要从中检索数据的表或视图的名称。OceanBase 数据库支持使用 DBLink 来查询其他数据库中的表(table_name@dblink_name),更多有关使用 DBLink 的介绍信息,参见 通过 DBLink 访问远端数据库中的数据。说明
该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版暂不支持 DBLink 功能。
PARTITION (partition_name_list):可选项,用来指定特定分区的查询。partition_name_list:表示分区名称的列表。partition_name表示分区名称。
示例如下:
从表
tbl1中读取分区p0和p1的数据。SELECT * FROM tbl1 PARTITION(p0, p1);返回结果如下:
+------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 1 | A1 | 1 | +------+------+------+ 1 row in setsample_clause [SEED(integer)]:用来指定从表中取样的规则,即扫描一部分记录。具体如下:BLOCK:可选项,表示扫描随机数据块进行,默认为扫描随机行。ALL | BASE | INCR:可选项,表示扫描方式。具体如下:ALL:表示扫描所有数据,缺省为ALL。BASE:表示扫描基线数据。INCR:表示扫描增量数据。
sample_percent:表示采样比例,单位为%,可以使用INTEGER或DECIMAL类型。SEED(integer):可选项,用来指定随机采样的种子值,取值范围为[0,4294967295],相同的采样种子值总会返回相同的结果。
[AS] table_alias_name:可选项,指定表别名。index_hint_list:可选项,用来指定进行查询使用的索引提示列表。index_hint表示索引提示,指定对查询使用的索引。具体如下:USE | FORCE | IGNORE:USE:指示某项操作使用索引。FORCE:指示某些操作强制使用索引。IGNORE:是指某项操作不使用索引。
KEY | INDEX:指定查询中用于搜索和排序的索引。FOR {JOIN | ORDER BY | GROUP BY}:可选项,指定索引进行的操作。具体如下:FOR JOIN:指定索引进行联接。FOR ORDER BY:指定索引进行排序。FOR GROUP BY:指定索引进行分组。
index_name_list:指定要使用的索引名称列表,可以是一个或多个索引名称。多个索引名间使用英文逗号(,)分隔。index_name表示引用的索引名称。
table_subquery [AS] table_alias_name:指定子查询。更多有关子查询的介绍,参见 子查询。示例如下:
从表
tbl1中选择col1列,然后将其作为子查询命名为t1,并最终选择t1中的所有列。SELECT t1.* FROM (SELECT col1 FROM tbl1) t1;返回结果如下:
+------+ | col1 | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set
joined_table
table_reference [NATURAL] [INNER | CROSS] JOIN table_factor [join_condition]:表示内联接。它返回两个表中匹配行的交集。在这种联接中,如果没有匹配的行,则不会返回结果。具体如下:table_reference:表示表引用,可以是单个表、联接表或子查询。NATURAL:可选项,表示进行自然联接。NATURAL JOIN会自动使用相同的列进行联接。INNER | CROSS:可选项,具体如下:INNER JOIN:表示进行内联接。在没有指定联接条件时,INNER JOIN与英文逗号(,)是等价的,它们都会使用指定的表产生一个笛卡尔积。更多有关内联接的介绍,参见 INNER JOIN。注意
英文逗号(
,)作为操作符,优先级小于INNER JOIN、CROSS JOIN、LEFT JOIN等,因此如果将逗号与其他联接关键字混合使用,可能会导致ON子句的条件错误。CROSS JOIN:OceanBase 数据库 MySQL 模式中,CROSS JOIN与JOIN、INNER JOIN是等价的。
table_factor:表示要联接的表引用。详细介绍参见 table_factor。join_condition:可选项,表示联接条件。具体如下:ON expression:返回重复列的联接条件,适用于使用不同名称的列作为联接条件。可以指定任意的联接条件,不限于基于相等的条件,比如可以使用大于或者小于等条件进行联接。示例如下:
SELECT * FROM tbl1 JOIN tbl2 ON tbl1.col1 = tbl2.col1;返回结果如下:
+------+------+------+------+------+------+ | col1 | col2 | col3 | col1 | col2 | col3 | +------+------+------+------+------+------+ | 1 | A1 | 1 | 1 | A1 | 1 | | 2 | A2 | 2 | 2 | A2 | 22 | | 3 | A3 | 3 | 3 | A3 | 33 | +------+------+------+------+------+------+ 3 rows in setUSING (join_column_list):不返回重复列的联接条件,仅限于联接的表使用相同名称的列作为联接条件。示例如下:
SELECT * FROM tbl1 JOIN tbl2 USING (col1);返回结果如下:
+------+------+------+------+------+ | col1 | col2 | col3 | col2 | col3 | +------+------+------+------+------+ | 1 | A1 | 1 | A1 | 1 | | 2 | A2 | 2 | A2 | 22 | | 3 | A3 | 3 | A3 | 33 | +------+------+------+------+------+ 3 rows in set
table_reference outer_join_type JOIN table_factor join_condition:表示外联接。它返回两个表中所有行的结果,无论是否有匹配。在这种联接中,如果没有匹配的行,会用NULL填充。outer_join_type:指定外联接类型。具体如下:{LEFT | RIGHT | FULL} [OUTER] JOIN:LEFT [OUTER] JOIN:表示左外联接。左表的一行未在右表中找到的时候,就在右表自动填充NULL。更多有关左外联接的介绍,参见 LEFT JOIN。RIGHT [OUTER] JOIN:表示右外联接。右表的一行未在左表中找到的时候,就在左表自动填充NULL。更多有关右外联接的介绍,参见 RIGHT JOIN。FULL [OUTER] JOIN:表示全外联接。左表或者右表找不匹配行的时候都会自动填充NULL。更多有关全外联接的介绍,参见 FULL JOIN。
join_condition:表示联接条件。
示例如下:
从表
tbl1中选择所有列,并将其与表tbl2中的数据进行左联接,联接条件为tbl1.col1 = tbl2.col1,同时使用条件tbl1.col1 > 2来过滤出满足该条件的数据。SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.col1 = tbl2.col1 AND tbl1.col1 > 2;返回结果如下:
+------+------+------+------+------+------+ | col1 | col2 | col3 | col1 | col2 | col3 | +------+------+------+------+------+------+ | 1 | A1 | 1 | NULL | NULL | NULL | | 2 | A2 | 2 | NULL | NULL | NULL | | 3 | A3 | 3 | 3 | A3 | 33 | +------+------+------+------+------+------+ 3 rows in set