English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете, как использовать перекрестное соединение SQL для извлечения данных из двух таблиц.
Если при соединении двух таблиц не указать условия соединения, то база данных объединит каждую строку первой таблицы с каждой строкой второй таблицы. Это соединение называется перекрестным соединением или кардинальным произведением. Ниже приведена Вендиановская диаграмма, показывающая, как работает перекрестное соединение.
Чтобы лучше понять это, давайте посмотрим на следующее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 | Управление | | 2 | Tony Montana | 2002-07-15 | Управление | | 3 | Sarah Connor | 2005-10-18 | Управление | | 4 | Rick Deckard | 2007-01-03 | Управление | | 5 | Martin Blank | 2008-06-24 | Управление | | 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. Поэтому, если вы не уверены, что хотите использовать кардинальный продукт, не используйте перекрестное соединение.