Объединение таблиц с помощью операторов JOIN
В отсутствие более подробного обучающего документа, вот простой пример трех основных типов JOIN, с которыми можно поэкспериментировать, чтобы увидеть, что делают разные типы объединений:
CREATE TABLE t1 ( a INT ); CREATE TABLE t2 ( b INT ); INSERT INTO t1 VALUES (1), (2), (3); INSERT INTO t2 VALUES (2), (4); SELECT * FROM t1 INNER JOIN t2 ON t1.a = t2.b; SELECT * FROM t1 CROSS JOIN t2; SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b; SELECT * FROM t2 LEFT JOIN t1 ON t1.a = t2.b;
Два первых запроса SELECT (к сожалению) часто записываются в устаревшей форме:
SELECT * FROM t1, t2 WHERE t1.a = t2.b; SELECT * FROM t1, t2;
Из этого видно, что внутреннее соединение (INNER JOIN) создает результат, содержащий только строки, у которых есть соответствие в обеих таблицах (t1 и t2) для заданного условия объединения.
Внешнее соединение (CROSS JOIN) создаёт результат, в котором каждая строка каждой таблицы объединяется с каждой строкой другой таблицы; это также называется декартовым произведением. В MariaDB ключевое слово CROSS можно опустить, так как оно ничего не делает. Любое соединение без условия ON является CROSS JOIN.
Левое соединение (LEFT JOIN) — это внешнее соединение, которое создаёт результат со всеми строками из таблицы слева (t1); значения столбцов в другой таблице (t2) зависят от того, найдено ли соответствие. Если соответствие не найдено, все столбцы этой таблицы устанавливаются в NULL для этой строки.
Правое соединение (RIGHT JOIN) аналогично левому соединению, но его результат содержит все строки из правой таблицы, а столбцы левой таблицы заполняются NULL, когда это необходимо.
Объединения (JOIN) могут быть объединены для чтения данных из трёх или более таблиц.
Вот вывод различных запросов SELECT, указанных выше:
SELECT * FROM t1 INNER JOIN t2 ON t1.a = t2.b; ------ ------ | a | b | ------ ------ | 2 | 2 | ------ ------ 1 row in set (0.00 sec) SELECT * FROM t1 CROSS JOIN t2; ------ ------ | a | b | ------ ------ | 1 | 2 | | 2 | 2 | | 3 | 2 | | 1 | 4 | | 2 | 4 | | 3 | 4 | ------ ------ 6 rows in set (0.00 sec) SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b; ------ ------ | a | b | ------ ------ | 1 | NULL | | 2 | 2 | | 3 | NULL | ------ ------ 3 rows in set (0.00 sec) SELECT * FROM t2 LEFT JOIN t1 ON t1.a = t2.b; ------ ------ | b | a | ------ ------ | 2 | 2 | | 4 | NULL | ------ ------ 2 rows in set (0.00 sec)
Это должно дать вам более глубокое понимание того, как работают операторы JOIN!
Другие ссылки
См. также
- Более сложные JOIN
- Запятая против JOIN
- http://www.keithjbrown.co.uk/vworks/mysql/mysql_p5.shtml - Хороший учебник. Часть 5 посвящена объединениям.
Первоначальная версия этой статьи была скопирована с разрешения с http://hashmysql.org/wiki/Introduction_to_Joins 05.10.2012.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/joining-tables-with-join-clauses/