JOIN 子句
描述
JOIN 子句用于将两个或多个表的行联接在一起,基于这些表之间的相关列进行匹配。
权限要求
执行表联接(JOIN)时,需要当前用户至少拥有参与 JOIN 表的 SELECT 权限。有关 seekdb 权限的详细介绍,参见 seekdb 的权限分类。
语法
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:指定要从中检索数据的表或视图的名称。 -
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 set (0.011 sec) -
sample_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 (0.020 sec)
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:seekdb中,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 set (0.023 sec) -
USING (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 (0.025 sec)
-
-
-
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 (0.028 sec) -