Now that I have a couple minutes, I can expand on my previous comment. ST_Union() in PostGIS and the Union tool in QGIS do different things, despite the similar names. ST_Union() is similar to the Dissolve tool in QGIS, in that it will eliminate boundaries of adjacent features and/or group single features with the same attribute values into Multi* features.
I believe what you are looking for is the ST_Intersection() of the overlapping geometries.
To make things more confusing, I think you will want to use the PostgreSQL operator UNION, which will append your selected geometries and other attributes from your two tables into the same column.
So I think the answer you're looking for is something like this (updated to more accurately answer your original question and your follow-up comment):
WITH cte as (
SELECT nsg, NULL as ffh, ST_Area(geom) as area, geom
SELECT NULL as nsg, ffh, ST_Area(geom) as area, geom
SELECT nsg, ffh, area, geom
FROM (SELECT nsg, ffh, ST_Area(ST_Intersection(a.geom, b.geom)) as area,
ST_Intersection(a.geom, b.geom) as geom
FROM p_gaiac.shape1 as a
JOIN p_gaiac.shape2 as b ON ST_Intersects(a.geom, b.geom)) c
SELECT ROW_NUMBER () OVER () as new_id, nsg, ffh, area, geom
By placing the main query within a CTE, you can then assign a new unique ID to the whole set, which will allow you to bring it into QGIS to view. By placing NULL placeholders in columns for which the original table does not have, you are able then to populate both the columns in the third select statement, which you will want for the overlapping areas. You can expand on this to include more columns from your original tables as necessary, by using the NULL placeholder.