These are all programming paradigms; they describe the "style"
used to build the structure and elements of a computer program.
Imperative programming is typically contrasted with declarative
programming because they are mutually-exclusive (you won't find any
programming languages that are both imperative and declarative), in
the same way that you won't find any languages that have both a
structured paradigm and a non-structured paradigm. The main
difference between the two is that imperative programming describes
how a result is to be achieved without specifying what is to be
achieved, whereas declarative programming describes what is to be
achieved without specifying how it is to be achieved.
Another key difference is that imperative programming makes
extensive use of changing-state and mutable data whereas
declarative programming does not. Put simply, there are no
assignment operations or side-effects in declarative
programming.
Given that the object-oriented programming (OOP) paradigm is
based upon objects with member methods that can mutate the object's
attributes, OOP is based upon the imperative paradigm.
The functional programming paradigm is not to be confused with
function calls which are based upon the procedural programming
paradigm, which is itself based upon the structured programming
paradigm, both of which are imperative. By "functional" we really
mean mathematical functions, which are declarative. Although there
are some imperative languages that do allow a type of functional
programming style, at best they are a grey area because of the
side-effects.
Logical programming is also declarative and is based on
relations.