FULL JOIN - полное внешнее соединение. Если для какой-либо из таблиц не нашлось строки в другой таблице, то строка все равно попадает в результат, а значения столбцов другой таблицы равны null.

Рассмотрим как работает FULL JOIN на примере. Пусть у нас есть две таблицы:

SELECT *
  FROM table1
id value
1 One
2 Two
3 Three

и

SELECT *
  FROM table2
id value
2 Two
3 Three
4 Four
5 Five

На этих данных выполним запрос

SELECT t1.id as id_1,
       t1.value as value_1,
       t2.id as id_2,
       t2.value as value_2
  FROM table1 t1
  FULL JOIN 
       table2 t2
    ON t1.id = t2.id
 ORDER BY t1.id, t2.id
id_1 value_1 id_2 value_2
1 One
2 Two 2 Two
3 Three 3 Three
4 Four
5 Five

Однако, в реализации FULL JOIN в PostgreSQL есть дефект. Например, если в условии соединения не будет условий на равенство столбцов таблиц (=), или встретится OR, то во время выполнения запроса возникнет ошибка:

FULL JOIN is only supported with merge-joinable or hash-joinable join conditions

Попробуй выполнить следующий запрос:

SELECT *
  FROM product_price pp
  FULL JOIN
       product_price ppl
    ON ppl.price < pp.price

Подробнее о дефекте можно почитать здесь.

3.7 RIGHT JOIN

3.9 Декартово произведение