跳到主要内容

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 中读取分区 p0p1 的数据。

      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:表示采样比例,单位为 %,可以使用 INTEGERDECIMAL 类型。

      • 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 JOINCROSS JOINLEFT JOIN 等,因此如果将逗号与其他联接关键字混合使用,可能会导致 ON 子句的条件错误。

      • CROSS JOIN:seekdb中,CROSS JOINJOININNER 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)

相关文档