MySQL doesn't permit you to CAST('01' AS INT). It expects instead a SIGNED or UNSIGNED.
SELECT `01` FROM perf WHERE year = '2013' order by CAST(`01` AS SIGNED) LIMIT 3
Review the MySQL docs on CAST() for full details.
mysql> SELECT CAST('01' AS SIGNED); +----------------------+ | CAST('01' AS SIGNED) | +----------------------+ | 1 | +----------------------+ 1 row in set (0.00 sec)
To force the non-numeric strings to be sorted last, you will need to apply a CASE in the ORDER BY which assigns them an absurdly high value. The condition should test that the value in 01 is not equal to 0, and when cast to a SIGNED the result is not 0, owing to the fact that non-numeric strings will cast to zero.
If those conditions are not met, the string is assumed to be non-numeric, and given a value of 999999999 in the ORDER BY, which pushes them to the end. They're subsequently ordered by name.
SELECT * FROM perf WHERE year = '2013' ORDER BY CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE 999999999 END, name LIMIT 3
http://sqlfiddle.com/#!2/846e2/6
To make these sort descending, use an absurdly low value (negative) instead of a high value
CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE -999999999 END DESC,
ORDER BY ... DESC?