-
-
-
- |
-
- Получение всех данных из левой таблицы, соединённых с соответствующими
- данными из правой:
- ```sql
- SELECT поля_таблиц
- FROM левая_таблица LEFT JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
- ```
- |
-
-
-
-
- |
-
- Получение всех данных из правой таблицы, соединённых с соответствующими
- данными из левой:
- ```sql
- SELECT поля_таблиц
- FROM левая_таблица RIGHT JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
- ```
- |
-
-
-
-
- |
-
- Получение данных, относящихся только к левой таблице:
- ```sql
- SELECT поля_таблиц
- FROM левая_таблица LEFT JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
- WHERE правая_таблица.ключ IS NULL
- ```
- |
-
-
-
-
- |
-
- Получение данных, относящихся только к правой таблице:
- ```sql
- SELECT поля_таблиц
- FROM левая_таблица RIGHT JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
- WHERE левая_таблица.ключ IS NULL
- ```
- |
-
-
-
-
- |
-
- Получение данных, относящихся как к левой, так и к правой таблице:
- ```sql
- SELECT поля_таблиц
- FROM левая_таблица INNER JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
- ```
- |
-
-
-
-
- |
-
- Получение всех данных, относящихся к левой и правой таблицам, а также их
- внутреннему соединению:
-
-
+**PostgreSQL**
```sql
-SELECT поля_таблиц
-FROM левая_таблица
- FULL OUTER JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
+SELECT Timepair.id "timepair.id", start_pair, end_pair,
+ Schedule.id "schedule.id", date, class, number_pair, teacher, subject, classroom
+FROM Timepair
+ FULL OUTER JOIN Schedule ON Schedule.number_pair = Timepair.id;
```
-
+На данных этой базы результат совпадёт с левым соединением — те же 43 строки: непарные строки здесь есть только слева.
-
+**MySQL**
+
+MySQL не поддерживает `FULL OUTER JOIN`, но тот же результат можно собрать вручную: взять левое соединение и добавить к нему строки правой таблицы, которым не нашлось пары.
```sql
SELECT поля_таблиц
FROM левая_таблица
-LEFT JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
+ LEFT JOIN правая_таблица ON правая_таблица.ключ = левая_таблица.ключ
UNION ALL
SELECT поля_таблиц
FROM левая_таблица
-RIGHT JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
-WHERE левая_таблица.ключ IS NULL
-```
-
-
-
- |
-
-
-
-
- |
-
- Получение данных, не относящихся к левой и правой таблицам одновременно
- (обратное INNER JOIN):
-
-
-
-```sql
-SELECT поля_таблиц
-FROM левая_таблица
- FULL OUTER JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
-WHERE левая_таблица.ключ IS NULL
- OR правая_таблица.ключ IS NULL
+ RIGHT JOIN правая_таблица ON правая_таблица.ключ = левая_таблица.ключ
+WHERE левая_таблица.ключ IS NULL;
```
-
-
-
+Условие во второй части обязательно: без него совпавшие строки попали бы в результат дважды.
-```sql
-SELECT поля_таблиц
-FROM левая_таблица
-LEFT JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
-WHERE правая_таблица.ключ IS NULL
+## Все виды соединений таблиц
-UNION ALL
+| Вид соединения | Результат | Строк в примере |
+| ----------------- | -------------------------- | --------------: |
+| `LEFT JOIN` | Все строки левой таблицы | 4 |
+| `INNER JOIN` | Только совпавшие строки | 3 |
+| `RIGHT JOIN` | Все строки правой таблицы | 4 |
+| `FULL JOIN` | Все строки обеих таблиц | 5 |
+| `LEFT ANTI JOIN` | Левая таблица без пары | 1 |
+| `RIGHT ANTI JOIN` | Правая таблица без пары | 1 |
+| `FULL ANTI JOIN` | Всё, кроме совпавших строк | 2 |
-SELECT поля_таблиц
-FROM левая_таблица
-RIGHT JOIN правая_таблица
- ON правая_таблица.ключ = левая_таблица.ключ
-WHERE левая_таблица.ключ IS NULL
-```
+Давайте проверим себя. В левой таблице 8 строк. Сколько строк вернёт `LEFT JOIN` с правой таблицей?
-
+1. **Правильный ответ:** Восемь или больше — зависит от того, сколько пар нашлось — Каждая строка левой таблицы обязательно попадёт в результат, но строка, у которой в правой таблице несколько пар, даст несколько строк.
- |
-
-
+2. Ровно восемь: левое соединение возвращает все строки левой таблицы — Все восемь строк действительно попадут в результат, но строка с несколькими парами размножится — строк станет больше восьми.
-