Difference between UPSERT and MERGE?
Generally,


UPSERT is built off of INSERT
MERGE focuses on merging/synchronizing tables and provides 


conditionality (where clauses)
DELETE support.



UPSERT lacks conditionality, In PostgreSQL, you had some ability to specify conditions, by proxy of the index that was being violated, for instance

ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;
ON CONFLICT (country) DO NOTHING;


But it didn't provide the ability to specify multiple conditions nor the ability to DELETE in any condition, both of which permit a more rich set of rules making it possible to "synchronize tables with minimal work" which seems to be the goal of MERGE.

As another matter, from Peter Geoghegan's post highlighting some of the differences "SQL MERGE is quite distinct from UPSERT"


UPSERT is atomic in its insert-or-update
SQL MERGE doesn't technically require a UNIQUE INDEX.


See also


PostgreSQL patch returned 9/11
PostgreSQL 11 MERGE syntax (since removed)