There is no connection between these two tables, so a join won't really get what you need. If everything goes into a single result set, you need to UNION them together. Note that when doing a union, you get one set of columns, and you can't mix datatypes within a column (no concern here since all your data are FLOATs). Here's an example starting point:
...

Let me help you to understand how a "standard" index works.
Most databases indexes are just B-Trees (not to confuse with a binary tree). Simply speaking, when you query an indexed column, a binary search will be performed. A binary search performs generally in O(log(n)) and thus you can find individual rows quite fast, even if there are many of them. The ...

select c.classid,
c.classname,
count(case when s.status = 'failed' then 1 end) as no_of_failed,
count(case when s.status = 'passed' then 1 end) as no_of_passed
from class c
left join students s on c.classid = s.classid
where c.schedule = 'MWF'
group by c.classiid, c.classname;
This exploits the fact that aggregate functions will ...

You're correct: FULLTEXT search didn't hit InnoDB until MySQL 5.6. This leaves you with a few options:
Update to MySQL 5.6 and use a FULLTEXT index
Change the contract of your function to only allow prefix searches; that is, 'term%'. It will fulfill many use cases while saving your DB.
Convert to a MyISAM table, or create a spare MyISAM table that you can ...