JOIN всегда делает декартово произведение?

Нет, JOIN в PostgreSQL не всегда делает декартово произведение. JOIN - это операция, которая объединяет две или более таблицы на основе определенного условия.

В PostgreSQL существует несколько типов JOIN, которые определяют, каким образом будут соединены таблицы:

1. INNER JOIN (или просто JOIN): Этот тип JOIN возвращает только те строки, которые имеют соответствующие значения в обеих таблицах. INNER JOIN использует условие соответствия, которое определяется с помощью ключевого слова ON. Например:

SELECT *
FROM table1
JOIN table2 ON table1.id = table2.id;

2. LEFT JOIN (или LEFT OUTER JOIN): Левый JOIN возвращает все строки из левой таблицы (таблицы, указанной перед JOIN), и только соответствующие строки из правой таблицы (таблицы, указанной после JOIN). Если в правой таблице нет соответствующих строк, то возвращается NULL. Например:

SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.id;

3. RIGHT JOIN (или RIGHT OUTER JOIN): Правый JOIN возвращает все строки из правой таблицы и только соответствующие строки из левой таблицы. Если в левой таблице нет соответствующих строк, то возвращается NULL. Например:

SELECT *
FROM table1
RIGHT JOIN table2 ON table1.id = table2.id;

4. FULL JOIN (или FULL OUTER JOIN): Полное объединение возвращает все строки из обеих таблиц. Если в одной из таблиц нет соответствующих строк, то возвращается NULL. Например:

SELECT *
FROM table1
FULL JOIN table2 ON table1.id = table2.id;

Таким образом, JOIN в PostgreSQL не всегда делает декартово произведение. Вместо этого, JOIN позволяет объединять таблицы на основе определенных условий, которые могут быть заданы с помощью ON или USING. Результат выполнения JOIN зависит от типа JOIN, который был использован, и от соответствующих значений в объединяемых таблицах.