English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL CROSS JOIN 语句

在本教程中,您将学习如何使用SQL交叉联接从两个表中获取数据。

使用交叉联接

如果在连接两个表时未指定连接条件,则数据库系统会将第一个表的每一行与第二个表的每一行合并。这种连接称为交叉连接或笛卡尔乘积。下面的维恩图说明了交叉联接的工作方式。

为了容易理解这一点,让我们来看看下面employeesdepartments表。

+--------+--------------+------------+---------+
| 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 | Administración   |
|       2 | Servicio al Cliente |
|       3 | Finanzas          |
|       4 | Recursos Humanos  |
|       5 | Ventas            |
+---------+------------------+
表: 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 | Administración   |
|      2 | Tony Montana | 2002-07-15 | Administración   |
|      3 | Sarah Connor | 2005-10-18 | Administración   |
|      4 | Rick Deckard | 2007-01-03 | Administración   |
|      5 | Martin Blank | 2008-06-24 | Administración   |
|      1 | Ethan Hunt   | 2001-05-01 | Servicio al Cliente |
|      2 | Tony Montana | 2002-07-15 | Servicio al Cliente |
|      3 | Sarah Connor | 2005-10-18 | Servicio al Cliente |
|      4 | Rick Deckard | 2007-01-03 | Servicio al Cliente |
|      5 | Martin Blank | 2008-06-24 | Servicio al Cliente |
|      1 | Ethan Hunt   | 2001-05-01 | Finanzas          |
|      2 | Tony Montana | 2002-07-15 | Finanzas          |
|      3 | Sarah Connor | 2005-10-18 | Finanzas          |
|      4 | Rick Deckard | 2007-01-03 | Finanzas          |
|      5 | Martin Blank | 2008-06-24 | Finanzas          |
|      1 | Ethan Hunt   | 2001-05-01 | Recursos Humanos  |
|      2 | Tony Montana | 2002-07-15 | Recursos Humanos  |
|      3 | Sarah Connor | 2005-10-18 | Recursos Humanos  |
|      4 | Rick Deckard | 2007-01-03 | Recursos Humanos  |
|      5 | Martin Blank | 2008-06-24 | Recursos Humanos  |
|      1 | Ethan Hunt   | 2001-05-01 | Ventas            |
|      2 | Tony Montana | 2002-07-15 | Ventas            |
|      3 | Sarah Connor | 2005-10-18 | Ventas            |
|      4 | Rick Deckard | 2007-01-03 | Ventas            |
|      5 | Martin Blank | 2008-06-24 | Ventas            |
+--------+--------------+------------+------------------+

Como puede ver, el efecto del cruce de uniones es inferior al descrito en los capítulos anteriores. Debido a que la consulta no especifica las condiciones de conexión, cada fila de la tabla employees se combina con cada fila de la tabla departments. Por lo tanto, no utilice el cruce de uniones a menos que esté seguro de que desea usar el producto cartesiano.