У мене є 2 таких таблиці:
> 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 піклується про першу таблицю, яку ви їй надаєте, і не дуже хвилює другу, тому ви завжди отримуєте рядки з першої таблиці, навіть якщо у другій немає відповідного рядка:
> 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.
ПРАВО ПРИЄДНАЙТЕ лише про другу таблицю
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
, що і ми бачили в розділі «ВЛІТНЕ ПРИЄДНАННЯ».
Аналогічно:
> 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, 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 )