Условие
Какого типа JOIN не существует в PostgreSQL?
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
- CROSS JOIN
- UPPER JOIN
Решение
Несуществующий — UPPER JOIN (такого оператора нет ни в стандарте SQL, ни в одной СУБД). Это вопрос-проверка на внимательность.
Существующие в PostgreSQL JOIN'ы
| Тип | Что делает | Синоним |
|---|---|---|
INNER JOIN |
Только совпадения | JOIN |
LEFT [OUTER] JOIN |
Все из левой + совпадения справа | LEFT JOIN |
RIGHT [OUTER] JOIN |
Все из правой + совпадения слева | RIGHT JOIN |
FULL [OUTER] JOIN |
Все строки обеих сторон | — |
CROSS JOIN |
Декартово произведение | Через , |
LATERAL JOIN |
Подзапрос видит колонки слева | — |
NATURAL JOIN |
По колонкам с одинаковыми именами | (не рекомендуется) |
SELF JOIN |
Не тип, а способ — JOIN таблицы с самой собой | — |
SEMI JOIN |
Не явный — реализуется через EXISTS |
— |
ANTI JOIN |
Не явный — NOT EXISTS / LEFT JOIN ... IS NULL |
— |
LATERAL JOIN — менее известный
Подзапрос справа может ссылаться на колонки слева:
SELECT u.id, top_orders.*
FROM users u,
LATERAL (
SELECT * FROM orders o
WHERE o.user_id = u.id -- ссылка на u.id
ORDER BY total DESC
LIMIT 3
) top_orders;Такого нет в MySQL до 8.0.14 (там LATERAL через подзапросы).
NATURAL JOIN — почему избегают
SELECT * FROM a NATURAL JOIN b;
-- неявно соединит по всем общим именам колонокОпасно: если в обеих таблицах добавили колонку с одинаковым именем, JOIN молча изменит поведение. Используйте JOIN ... USING (col) или JOIN ... ON.
Подводные камни
SEMI JOINиANTI JOIN— это термины из теории, в SQL пишутся черезEXISTS/NOT EXISTS.OUTERвLEFT/RIGHT/FULL— необязательное ключевое слово;LEFT JOIN=LEFT OUTER JOIN.UPPER JOIN— не существует; вопрос на внимательность.STRAIGHT_JOIN— есть в MySQL (форсит порядок), нет в PostgreSQL.
Эталонный ответ
UPPER JOIN — такого оператора в SQL не существует. В PostgreSQL есть: INNER, LEFT, RIGHT, FULL OUTER, CROSS, LATERAL, NATURAL.