I was unhappy with the accepted answer because its ORDER BY didn't actually work. Sizes would be sorted by their first digit, with no accounting for the unit size. As a result, something like '60 kB' would show as "more" than '59 MB', both of which were less than '8192 bytes'. I ended up using that answer to feed data into a CTE which then calculated out the size in MB for each table, creating a single standard to sort upon.
WITH size_query AS ( SELECT table_schema || '.' || table_name AS table_full_name, pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS SIZE, CAST(REGEXP_REPLACE(pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')), '[a-zA-Z\s]', '', 'g') AS NUMERIC) AS SIZE_NUMBER_ONLY FROM information_schema.tables ) SELECT table_full_name, SIZE AS long_form_size, CASE WHEN SIZE LIKE '%' THEN ROUND(SIZE_NUMBER_ONLY / 1000 / 1000, 4) WHEN SIZE LIKE '%kB' THEN ROUND(SIZE_NUMBER_ONLY / 1000, 4) WHEN SIZE LIKE '%MB' THEN SIZE_NUMBER_ONLY WHEN SIZE LIKE '%GB' THEN SIZE_NUMBER_ONLY * 1000 WHEN SIZE LIKE '%TB' THEN SIZE_NUMBER_ONLY * 1000 * 1000 END AS SORTABLE_SIZE_IN_MB FROM size_query ORDER BY 3 DESC
Rounding to 4 decimal places makes sure that if you have small tables (measured in Bytes) that they're distinguishable from a table that is truly empty (0 Bytes). This query let me search easily through a PostgreSQL database where I knew the items of interest would be in very large tables.
I'm sure there's a little easier way to do that (especially the CASE statement), but this was readable to other data analysts I was working with, and it works.