I already have my data imported, problem is my SELECT statements aren't yielding the results I'm looking for. I specifically need all the Block Group multipolygons that are inside a Zip Code multipolygon so that all of the zip code is covered and no Block Group leaves the boundaries of the zip code.
Blue = Zip Code
Red = Block Group
&& -- bounding box
select blockgroups.the_geom
from blockgroups, zips
where zips.zip = '92656' AND zips.the_geom && blockgroups.the_geom;

ST_Contains
select blockgroups.the_geom
from blockgroups, zips
where zips.zip = '92656' AND zips.the_geom && blockgroups.the_geom
AND ST_Contains(zips.the_geom,blockgroups.the_geom);

ST_Within
select blockgroups.the_geom
from blockgroups, zips
where zips.zip = '92656' AND blockgroups.the_geom && zips.the_geom
AND ST_Within(blockgroups.the_geom, zips.the_geom);

ST_Intersects
select blockgroups.the_geom
from blockgroups, zips
where zips.zip = '92656' AND blockgroups.the_geom && zips.the_geom
AND ST_Intersects(blockgroups.the_geom,zips.the_geom);

ST_Within + ST_Centroid
select blockgroups.the_geom
from blockgroups, zips
where zips.zip = '92656' AND blockgroups.the_geom && zips.the_geom
AND ST_Within(ST_Centroid(blockgroups.the_geom),zips.the_geom);

If block group multipolygon does leave the boundary of the zip code, I would like it to be cut by the zip code boundary, resulting in a fully covered zip code by block groups.
@mapBaker had a good idea but still not exactly what I want. Using the centroid preserves the block group shapes, but still doesn't cover the entire zip boundary. Added screenshots of ST_Intersects and ST_Within + ST_Centroid