У меня есть две такие таблицы:
> SELECT * FROM table_a;
+------+------+
| id | name |
+------+------+
| 1 | row1 |
| 2 | row2 |
+------+------+
> SELECT * FROM table_b;
+------+------+------+
| id | name | aid |
+------+------+------+
| 3 | row3 | 1 |
| 4 | row4 | 1 |
| 5 | row5 | NULL |
+------+------+------+
INNER JOIN заботится об обеих таблицах
INNER JOIN заботится об обеих таблицах, поэтому вы получаете только строкуесли обе таблицы имеют одну.Если существует более одной совпадающей пары, вы получите несколько строк.
> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
+------+------+------+------+------+
Нет никакого различия для INNER JOIN, если вы измените порядок в обратном порядке, поскольку он заботится об обеих таблицах:
> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
+------+------+------+------+------+
Вы получаете те же строки, но столбцы в другом порядке, потому что мы упомянули таблицы в другом порядке.
LEFT JOIN касается только первой таблицы
LEFT JOIN заботится о первой таблице, которую вы даете, и не заботится о второй, поэтому вы всегда получаете строки из первой таблицы, даже если во второй нет соответствующей строки:
> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| 2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+
Выше вы можете видеть все строки таблицы table_a, хотя некоторые из них не совпадают ни с чем в таблице b, но не со всеми строками таблицы table_b - только те, которые соответствуют чему-то в table_a.
Если мы обратимсяпорядок таблиц LEFT JOIN ведет себя по-разному:
> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| 5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+
Теперь мы получаем все строки table_b, но только совпадающие строки table_a.
RIGHT JOIN заботится только о tВторая таблица
a RIGHT JOIN b
возвращает вам те же строки, что и b LEFT JOIN a
.Единственным отличием является порядок столбцов по умолчанию.
> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| NULL | NULL | 5 | row5 | NULL |
+------+------+------+------+------+
Это те же строки, что и table_b LEFT JOIN table_a
, который мы видели в разделе LEFT JOIN.
Аналогично:
> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| NULL | NULL | NULL | 2 | row2 |
+------+------+------+------+------+
Это те же строки, что и table_a LEFT JOIN table_b
.
Никакое объединение вообще не дает вам копий всего
Если вы пишете свои таблицы без JOINпредложение, просто разделенное запятыми, вы получаете каждую строку первой таблицы, записанную рядом с каждой строкой второй таблицы, в каждой возможной комбинации:
> SELECT * FROM table_b b, table_a;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 3 | row3 | 1 | 2 | row2 |
| 4 | row4 | 1 | 1 | row1 |
| 4 | row4 | 1 | 2 | row2 |
| 5 | row5 | NULL | 1 | row1 |
| 5 | row5 | NULL | 2 | row2 |
+------+------+------+------+------+
(Это из моего сообщения в блоге Примеры типов соединений SQL )