English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、SQLの交叉結合を使用して2つのテーブルからデータを取得する方法を学びます。
2つのテーブルを結合する際に結合条件を指定しない場合、データベースシステムは最初のテーブルの各行を2番目のテーブルの各行と結合します。この結合は交叉結合またはカールス・ダイヤモンド積と呼ばれます。以下のヴィーン図は交叉結合の動作を説明しています。
この概念を理解しやすくするために、以下を見てみましょう:employeesおよびdepartmentsテーブルです。
+--------+--------------+------------+---------+ | emp_id | emp_name | hire_date | dept_id | +--------+--------------+------------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 4 | | 2 | Tony Montana | 2002-07-15 | 1 | | 3 | Sarah Connor | 2005-10-18 | 5 | | 4 | Rick Deckard | 2007-01-03 | 3 | | 5 | Martin Blank | 2008-06-24 | NULL | +--------+--------------+------------+---------+ | +---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Administration | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ | |
テーブル: employees | テーブル: departments |
交叉結合の行数は、各テーブルの行数の積です。これは交叉結合操作のシンプルな例です。
SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name FROM employees AS t1 CROSS JOIN departments AS t2;
ヒント:交叉結合は、カールス・ダイヤモンド積を作成するか、あるテーブルのすべての行をもう一方のテーブルのすべての行と結合します。したがって、例えば、あるテーブルに5行を生成し、もう一方のテーブルには10行があれば、交叉結合クエリは50行、つまり5および10の積です。
上記のコマンドを実行した後、以下の結果セットが得られます:
+--------+--------------+------------+------------------+ | emp_id | emp_name | hire_date | dept_name | +--------+--------------+------------+------------------+ | 1 | Ethan Hunt | 2001-05-01 | Administration | | 2 | Tony Montana | 2002-07-15 | Administration | | 3 | Sarah Connor | 2005-10-18 | Administration | | 4 | Rick Deckard | 2007-01-03 | Administration | | 5 | Martin Blank | 2008-06-24 | Administration | | 1 | Ethan Hunt | 2001-05-01 | Customer Service | | 2 | Tony Montana | 2002-07-15 | Customer Service | | 3 | Sarah Connor | 2005-10-18 | Customer Service | | 4 | Rick Deckard | 2007-01-03 | Customer Service | | 5 | Martin Blank | 2008-06-24 | Customer Service | | 1 | Ethan Hunt | 2001-05-01 | Finance | | 2 | Tony Montana | 2002-07-15 | Finance | | 3 | Sarah Connor | 2005-10-18 | Finance | | 4 | Rick Deckard | 2007-01-03 | Finance | | 5 | Martin Blank | 2008-06-24 | Finance | | 1 | Ethan Hunt | 2001-05-01 | Human Resources | | 2 | Tony Montana | 2002-07-15 | Human Resources | | 3 | Sarah Connor | 2005-10-18 | Human Resources | | 4 | Rick Deckard | 2007-01-03 | Human Resources | | 5 | Martin Blank | 2008-06-24 | Human Resources | | 1 | Ethan Hunt | 2001-05-01 | Sales | | 2 | Tony Montana | 2002-07-15 | Sales | | 3 | Sarah Connor | 2005-10-18 | Sales | | 4 | Rick Deckard | 2007-01-03 | Sales | | 5 | Martin Blank | 2008-06-24 | Sales | +--------+--------------+------------+------------------+
ご覧の通り、クロスジョインの効果は前述の章よりも低いです。結合条件がクエリに指定されていないため、employeesテーブルの各行がdepartmentsテーブルの各行とマージされます。したがって、デカルト積を使用する予定がない場合は、クロスジョインを使用しないでください。