Something simple like this will at least check (2) and (3). It won't check (1) but that should be done at entry (only allow unique student/answer combinations).
select student, if((count(*)>1) and (max(answer)>7), 'INVALID', 'Valid') as Result
from data1
group by student
https://dbfiddle.uk/d-QSR_4l
student
Result
100
Valid
101
INVALID
If you really want to check (1) you can do it with a sub-select with count on total number of answers and total number of unique answers.
Something like:
select student, if((sum(cnt)<>count(*)) or ((count(*)>1) and (max(answer)>7)), 'INVALID', 'Valid') as Result
from
(
select student, answer, count(*) as cnt
from data1
group by student, answer
) as sub
group by student
https://dbfiddle.uk/B3JmU1_S
student
Result
100
Valid
101
INVALID
102
INVALID
103
Valid
104
INVALID