Having clause question maybe
HAVING is for filtering on aggregated results. You could use it to solve your problem if you rewrite it slightly so it's filtering on the number of times a DISC_NAME has a result from your joins which has GRADE=1. For this aggregate, you'd be grouping by the DISC_NAME and you can count matches with a case when
select d.disc_name
from students s
    ,disciplines d
    ,grades g
where g.id= s.id
and   g.kod_disc = d.disc_id
group by d.disc_name
having sum(case when g.grade = 2 then 1 else 0 end) = 0

(assuming the grade column comes from grades and disc_name is part of disciplines)
You could also achieve the same with an anti-join query. Here I've removed the join to students because you don't seem to use it (other than making sure the grade row belongs to a student row, which I would assume isn't necessary). I've also switched to using more modern ansi join syntax - you could use either.
select d.disc_name
from disciplines d
where not exists (select null
                  from   grades g
                  where  d.disc_id = g.disc_id
                  and    g.grade = 2
                 )