Machine code is directly executable by a CPU, without any other preprocessing. In the case of physical CPUs, it is almost never human-readable.
Assembly is a human-readable representation of machine language. I say "representation" because there's a 1-to-1 correspondence between an Assembly program and its assembled version. Contrast to C/++, where the same program can be compiled to many different programs, depending on compiler options and implementation details.
There is no single Assembly language; every CPU architecture has its own Assembly language. x86 Assembly is the particular Assembly language used by the x86 architecture. There's two main flavors: Intel syntax and AT&T syntax. In Intel syntax mov eax, 0
assigns 0 to register eax. The equivalent in AT&T syntax is mov 0, eax
Many assemblers ever within the same architecture, may tweak the finer points of the syntax, such as the various addressing methods, or how to declare data.