SELECT s.* FROM Students s
JOIN StudentExam se
ON s.StID=se.StID
WHERE se.ExamName<>'SQL Server'
is definitely NOT the query to be used to retrieve:
The students that has not taken "SQL Server" exam
in the given data architecture...
It is a query to get:
The students that has taken an exam that is NOT "SQL Server".
And it successfully delivers the expected result.
What if there are students that has not taken ANY exams ?
So, I don't think this is a pitfall of "<>" operator at all !
The query should be in the final form that the author suggests to begin with....