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.