Try something like:
SELECT CASE
WHEN marks IS NULL THEN 'Unknown'
WHEN marks <= 9 THEN '0-9'
WHEN marks <= 19 THEN '10-19'
WHEN marks <= 29 THEN '20-29'
WHEN marks <= 39 THEN '30-39'
WHEN marks <= 49 THEN '40-49'
WHEN marks <= 59 THEN '50-59'
WHEN marks <= 69 THEN '60-69'
WHEN marks <= 79 THEN '70-79'
WHEN marks <= 89 THEN '80-89'
WHEN marks <= 100 THEN '90-100'
ELSE 'Over 100'
END "Bucket",
COUNT(*) "Number of results"
FROM
testTable
GROUP BY CASE
WHEN marks IS NULL THEN 'Unknown'
WHEN marks <= 9 THEN '0-9'
WHEN marks <= 19 THEN '10-19'
WHEN marks <= 29 THEN '20-29'
WHEN marks <= 39 THEN '30-39'
WHEN marks <= 49 THEN '40-49'
WHEN marks <= 59 THEN '50-59'
WHEN marks <= 69 THEN '60-69'
WHEN marks <= 79 THEN '70-79'
WHEN marks <= 89 THEN '80-89'
WHEN marks <= 100 THEN '90-100'
ELSE 'Over 100'
END
ORDER BY
MIN(marks);
To explain the CASE statement here (as best I can, better people may edit), I always like to put in a NULL option as it can sometimes catch errors in your query. The remaining WHEN statements should be self-explanatory and you can use them to suit your needs. The name "Bucket" is just what your column will be called in the final output so again you can change that as you like. The second column must be an aggregate query, such as COUNT in order for a CASE statement to make sense.
You must repeat the CASE statement, except your name for it, in the GROUP BY statement.