• Try it like this:

    so on the face of it, it acts as an ersatz where, cutting down the rows in the Classes table involved in the join.

    Yes, you are right, this is what it does - but it does it before the OUTER restores the rows from the Professor table, which also adds the null parts on the right. Thus the nulls are being added in, as it were, after the WHERE clause equivalent.

    Conversely, using the actual WHERE clause means that it is applied after the nulls have been added, and so it removes them.