JOIN 関数は、2 つ以上のテーブルを結合し、結合条件とクエリ条件を満たすデータを返します。
使用方法
このトピックでは、左テーブルは JOIN キーワードの左側にあるテーブルを示し、右テーブルは JOIN キーワードの右側にあるテーブルを示します。
たとえば、次の SQL ステートメントでは、table_1 は左テーブル、table_2 は右テーブルです。
SELECT * FROM table_1 JOIN table_2 on ......;
構文
table_references join_type table_references [ ON join_condition | USING ( join_column [, ...] ) ]
table_references : {
table_name [ [ AS ] alias_name ]
| select_statement
}
join_type : {
[ INNER ] JOIN
| LEFT [ OUTER ] JOIN
| RIGHT [ OUTER ] JOIN
| CROSS JOIN
}
パラメーター
パラメーター | 必須 | 説明 |
table_references | はい | 結合するテーブルの情報。値は、テーブルの名前または SELECT ステートメントです。 左テーブルと右テーブルは、テーブルが JOIN キーワードの左側にあるか右側にあるかによって区別されます。 |
join_type | はい | JOIN 関数の種類。有効な値:
|
join_condition | はい | 2 つのテーブルを結合する基準となる列。 次の SQL ステートメントは、table_1 の col_A 列と table_2 の col_B 列を照合することで table_1 と table_2 が結合されることを示しています。
結合条件で指定された列の名前が 2 つのテーブルで同じである場合、
簡略化された SQL ステートメント:
|
JOIN アルゴリズム
Tablestore は、JOIN アクションに INDEX JOIN と HASH JOIN の 2 つのアルゴリズムを提供します。INDEX JOIN はデフォルトの JOIN アルゴリズムです。テーブルを結合する基準となる右テーブルで指定された列が INDEX JOIN を使用するための条件を満たしていない場合、システムは HASH JOIN を使用します。
INDEX JOIN (デフォルト): 左テーブルからデータを読み取り、右テーブルのインデックスまたはプライマリキーを使用して左テーブルのデータと一致する右テーブルの行を読み取り、2 つのテーブルを結合します。詳細については、INDEX JOIN を参照してください。
HASH JOIN: 左テーブルからデータを読み取ってハッシュテーブルを作成し、右テーブルからデータを読み取って右テーブルの行がハッシュテーブルのデータと一致するかどうかを判断し、2 つのテーブルを結合します。詳細については、HASH JOIN を参照してください。
INDEX JOIN
INDEX JOIN を使用するには、テーブルを結合する基準となる右テーブルで指定された列がインデックスを使用するための特定の条件を満たしていることを確認してください。左テーブルはこれらの条件の対象ではありません。
右テーブルのセカンダリインデックスまたはプライマリキーを使用して右テーブルからデータを読み取る場合、テーブルを結合する基準となる右テーブルで指定された列は、左端一致の原則に準拠する必要があります。
右テーブルの検索インデックスを使用して右テーブルからデータを読み取る場合、テーブルを結合する基準となる右テーブルで指定された列は、検索インデックスに含まれている必要があります。右テーブルに他のフィルタリング条件が指定されている場合、フィルタリング条件は、テーブルを結合する基準となる右テーブルで指定された列を含む検索インデックスにプッシュダウンできる必要があります。
結合するテーブルの行数が少ない場合、左テーブルのデータ量が小さい場合、または左テーブルのデータ量は多いがデータがフィルタリングされた後のデータ量が小さい場合は、右テーブルが INDEX JOIN を使用するための条件を満たしていれば、INDEX JOIN によって結合のパフォーマンスを向上させることができます。INDEX JOIN が使用されるシナリオでは、join_type を INNER JOIN に設定し、2 つのテーブルが INDEX JOIN を使用するための条件を満たしている場合、データ量が小さいテーブルまたはデータがフィルタリングされた後のデータ量が小さいテーブルを左テーブルに設定することをお勧めします。
HASH JOIN
Tablestore は、HASH JOIN を使用できるシナリオに制限を課しません。INDEX JOIN を使用するための条件が満たされていない場合、システムは HASH JOIN を使用します。
結合するテーブルの行数が非常に多い場合は、HASH JOIN を使用することでより良いパフォーマンスを得ることができます。
HASH JOIN が使用されるシナリオでは、join_type パラメーターを INNER JOIN に設定する場合、データ量が小さいテーブルまたはデータがフィルタリングされた後のデータ量が小さいテーブルを左テーブルに設定することをお勧めします。
推奨事項
INDEX JOIN を使用する場合は、テーブルを結合する基準となる右テーブルで指定された列がインデックスを使用するための特定の条件を満たしていることを確認してください。Tablestore は左テーブルに要件を課しません。
右テーブルのセカンダリインデックスまたはプライマリキーを使用して右テーブルからデータを読み取る場合、テーブルを結合する基準となる右テーブルで指定された列は、左端一致の原則に準拠する必要があります。
右テーブルの検索インデックスを使用して右テーブルからデータを読み取る場合、テーブルを結合する基準となる右テーブルで指定された列が検索インデックスに含まれており、右テーブルに指定されたフィルタリング条件を検索インデックスにプッシュダウンできることを確認してください。
右テーブルに多数のフィルタリング条件が指定されており、インデックスが使用されていない場合、読み取りパフォーマンスが低下します。
join_type パラメーターを INNER JOIN に設定する場合、JOIN キーワードの左側にあるテーブルは外部テーブル、JOIN キーワードの右側にあるテーブルは内部テーブルです。行数が少ないテーブルまたはデータがフィルタリングされた後の行数が少ないテーブルを、JOIN キーワードの左側にある外部テーブルとして使用することをお勧めします。
結合するテーブルの行数が少ない場合、または結合する外部テーブルの行数が少ないか、データがフィルタリングされた後の行数が少ない場合は、INDEX JOIN は HASH JOIN よりも優れたパフォーマンスを提供します。結合するテーブルのデータ量または行数が非常に多い場合、INDEX JOIN のパフォーマンスは低下します。この場合は、HASH JOIN は INDEX JOIN よりも優れたパフォーマンスを提供します。
JOIN 句が使用されている SQL ステートメントで指定されたテーブルに多数のフィルタリング条件が使用されている場合、インデックスが使用されていないと読み取りパフォーマンスが低下します。この場合は、インデックスを使用してデータ読み取り操作を高速化できます。これは、SQL ステートメントの実行速度の向上に役立つ可能性があります。
例
次の例では、orders と customers という名前の 2 つのテーブルを使用します。
SELECT * FROM orders;
+----------+-------------+------------+--------------+
| order_id | customer_id | order_date | order_amount |
+----------+-------------+------------+--------------+
| 1001 | 1 | 2023-01-01 | 50 |
| 1002 | 2 | 2023-01-02 | 80 |
| 1003 | 3 | 2023-01-03 | 180 |
| 1004 | 4 | 2023-01-04 | 220 |
| 1005 | 6 | 2023-01-05 | 250 |
+----------+-------------+------------+--------------+
SELECT * FROM customers;
+-------------+---------------+----------------+
| customer_id | customer_name | customer_phone |
+-------------+---------------+----------------+
| 1 | Alice | 11111111111 |
| 2 | Bob | 22222222222 |
| 3 | Carol | 33333333333 |
| 4 | David | 44444444444 |
| 5 | Eve | 55555555555 |
+-------------+---------------+----------------+
例 1: INNER JOIN
SELECT * FROM orders JOIN customers ON orders.customer_id = customers.customer_id;
上記の INNER JOIN ステートメントは、USING が使用されている次の SQL ステートメントと同じです。
SELECT * FROM orders JOIN customers USING(customer_id);
次の出力が返されます。
+----------+-------------+------------+--------------+-------------+---------------+----------------+ | order_id | customer_id | order_date | order_amount | customer_id | customer_name | customer_phone | +----------+-------------+------------+--------------+-------------+---------------+----------------+ | 1001 | 1 | 2023-01-01 | 50 | 1 | Alice | 11111111111 | | 1002 | 2 | 2023-01-02 | 80 | 2 | Bob | 22222222222 | | 1003 | 3 | 2023-01-03 | 180 | 3 | Carol | 33333333333 | | 1004 | 4 | 2023-01-04 | 220 | 4 | David | 44444444444 | +----------+-------------+------------+--------------+-------------+---------------+----------------+
例 2: LEFT JOIN
SELECT * FROM orders LEFT JOIN customers ON orders.customer_id = customers.customer_id;
上記の LEFT JOIN ステートメントは、USING が使用されている次の SQL ステートメントと同じです。
SELECT * FROM orders LEFT JOIN customers USING(customer_id);
次の出力が返されます。
+----------+-------------+------------+--------------+-------------+---------------+----------------+ | order_id | customer_id | order_date | order_amount | customer_id | customer_name | customer_phone | +----------+-------------+------------+--------------+-------------+---------------+----------------+ | 1001 | 1 | 2023-01-01 | 50 | 1 | Alice | 11111111111 | | 1002 | 2 | 2023-01-02 | 80 | 2 | Bob | 22222222222 | | 1003 | 3 | 2023-01-03 | 180 | 3 | Carol | 33333333333 | | 1004 | 4 | 2023-01-04 | 220 | 4 | David | 44444444444 | | 1005 | 6 | 2023-01-05 | 250 | NULL | NULL | NULL | +----------+-------------+------------+--------------+-------------+---------------+----------------+
例 3: CROSS JOIN
SELECT * FROM orders CROSS JOIN customers;
次の出力が返されます。
+----------+-------------+------------+--------------+-------------+---------------+----------------+ | order_id | customer_id | order_date | order_amount | customer_id | customer_name | customer_phone | +----------+-------------+------------+--------------+-------------+---------------+----------------+ | 1001 | 1 | 2023-01-01 | 50 | 1 | Alice | 11111111111 | | 1002 | 2 | 2023-01-02 | 80 | 1 | Alice | 11111111111 | | 1003 | 3 | 2023-01-03 | 180 | 1 | Alice | 11111111111 | | 1004 | 4 | 2023-01-04 | 220 | 1 | Alice | 11111111111 | | 1005 | 6 | 2023-01-05 | 250 | 1 | Alice | 11111111111 | | 1001 | 1 | 2023-01-01 | 50 | 2 | Bob | 22222222222 | | 1002 | 2 | 2023-01-02 | 80 | 2 | Bob | 22222222222 | | 1003 | 3 | 2023-01-03 | 180 | 2 | Bob | 22222222222 | | 1004 | 4 | 2023-01-04 | 220 | 2 | Bob | 22222222222 | | 1005 | 6 | 2023-01-05 | 250 | 2 | Bob | 22222222222 | | 1001 | 1 | 2023-01-01 | 50 | 3 | Carol | 33333333333 | | 1002 | 2 | 2023-01-02 | 80 | 3 | Carol | 33333333333 | | 1003 | 3 | 2023-01-03 | 180 | 3 | Carol | 33333333333 | | 1004 | 4 | 2023-01-04 | 220 | 3 | Carol | 33333333333 | | 1005 | 6 | 2023-01-05 | 250 | 3 | Carol | 33333333333 | | 1001 | 1 | 2023-01-01 | 50 | 4 | David | 44444444444 | | 1002 | 2 | 2023-01-02 | 80 | 4 | David | 44444444444 | | 1003 | 3 | 2023-01-03 | 180 | 4 | David | 44444444444 | | 1004 | 4 | 2023-01-04 | 220 | 4 | David | 44444444444 | | 1005 | 6 | 2023-01-05 | 250 | 4 | David | 44444444444 | | 1001 | 1 | 2023-01-01 | 50 | 5 | Eve | 55555555555 | | 1002 | 2 | 2023-01-02 | 80 | 5 | Eve | 55555555555 | | 1003 | 3 | 2023-01-03 | 180 | 5 | Eve | 55555555555 | | 1004 | 4 | 2023-01-04 | 220 | 5 | Eve | 55555555555 | | 1005 | 6 | 2023-01-05 | 250 | 5 | Eve | 55555555555 | +----------+-------------+------------+--------------+-------------+---------------+----------------+