基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
JOIN 子句
更新时间:2024-08-12 17:38:50
描述
JOIN 子句用于表的联接。
数据库中的联接语句用于将数据库中的两个或多个表根据联接条件组合起来。由"联接"生成的集合, 可以被保存为表,或者当成表来使用。联接语句的含义是把两张表的属性通过它们的值组合在一起。
语法
table_references:
table_reference [, table_reference ...]
table_reference:
table_factor
| joined_table
table_factor:
table_name [partition_option]
[[AS] alias] [index_hint_list]
| table_subquery [AS] alias
| ( table_references )
joined_table:
table_reference [NATURAL] [[INNER] | CROSS] JOIN table_factor [join_condition]
| table_reference outer_join_type JOIN table_factor join_condition
partition_option:
PARTITION (partition_name_list)
join_condition:
ON expression
| USING (join_column_list)
join_column_list:
column_name [, column_name ...]
outer_join_type:
[NATURAL] {LEFT | RIGHT | FULL} [OUTER]
index_hint_list:
index_hint [, index_hint ...]
index_hint:
{USE | FORCE | IGNORE} {KEY | INDEX}
[FOR {JOIN | ORDER BY | GROUP BY}] (index_list)
index_list:
index_name [, index_name ...]
参数解释
| 参数 | 描述 |
|---|---|
| PARTITION (partition_name_list) | 指定表的分区进行联接。 |
| NATURAL | 进行自然联接。 NATURAL JOIN 会自动使用相同的列进行联接。 |
| [INNER] JOIN | 进行内联接。 在没有指定联接条件时,INNER JOIN 与逗号(,)是等价的,它们都会使用指定的表产生一个笛卡尔积。 注意 逗号(,)作为操作符,优先级小于 INNER JOIN、CROSS JOIN、LEFT JOIN 等,因此如果将逗号与其他联接关键字混合使用,可能会导致 ON 子句的条件错误。 |
| CROSS JOIN | OceanBase 数据库 MySQL 模式中,CROSS JOIN 与 JOIN、INNER JOIN 是等价的。 |
| LEFT [OUTER] JOIN | 进行左外联接,左表的一行未在右表中找到的时候,就在右表自动填充 NULL。 |
| RIGHT [OUTER] JOIN | 进行右外联接,右表的一行未在左表中找到的时候,就在左表自动填充 NULL。 |
| FULL [OUTER] JOIN | 进行外联接,左表或者右表找不匹配行的时候都会自动填充 NULL。 |
| column_name | 用于连接的列名。 |
| index_hint | 进行查询是否使用指定的索引。
|
| ON expression | 返回重复列的联接条件,适用于使用不同名称的列作为联接条件。 |
| USING (join_column_list) | 不返回重复列的联接条件,仅限于联接的表使用相同名称的列作为联接条件。 |
示例
以如下表 a 与表 b 为例。

对表
a与表b进行内联接。obclient> SELECT * FROM a JOIN b ON a.ID=b.ID; +------+------+------+------+ | id | name | id | num | +------+------+------+------+ | 1 | A | 1 | 100 | | 3 | A | 3 | 75 | +------+------+------+------+ 2 rows in set对表
a与表b进行交叉联接。obclient> SELECT * FROM a CROSS JOIN b ON a.id=b.id; +------+------+------+------+ | id | name | id | num | +------+------+------+------+ | 1 | A | 1 | 100 | | 3 | A | 3 | 75 | +------+------+------+------+ 2 rows in set对表
a与表b进行自然联接。obclient> SELECT * FROM a NATURAL JOIN b; Empty set对表
a与表b进行左外联接。obclient> SELECT * FROM a LEFT JOIN b USING(ID); +------+------+------+ | id | name | num | +------+------+------+ | 1 | A | 100 | | 2 | B | NULL | | 3 | A | 75 | +------+------+------+ 3 rows in set对表
a与表b进行右外联接。obclient> SELECT * FROM a RIGHT JOIN b USING(ID); +------+------+------+ | id | num | name | +------+------+------+ | 1 | 100 | A | | 3 | 75 | A | | 4 | 50 | NULL | +------+------+------+ 3 rows in set对表
a与表b进行全联接。obclient> SELECT * FROM a FULL JOIN b USING(ID); +------+------+------+ | id | name | num | +------+------+------+ | 1 | A | 100 | | 2 | B | NULL | | 3 | A | 75 | | 4 | NULL | 50 | +------+------+------+ 4 rows in set