As the writeups above explain, JCL allows batch executions of programs. A job can have one or more steps, each running a program or other JCL procedure, which will run in sequential order from the first to the last.

As McSnarf mentioned above, JCL allows conditioning the running of steps according to the return codes returned by steps which have already run.
What's this good for?
Well, let's say you have a job that runs 2 steps on a file containing code. The first step compiles the code and the second step links the compiled load module with other (NCAL) procedures. In case the compilation step didn't finish validly (syntax error for example) there's not much point in running the linkage is there?

These conditions are called 'CONDS' and are written in the EXEC cards of steps you wish to add a condition to (steps with no conds will always run).
IBM's Conds follow sone twisted logic..
Instead of the normal "if true then run" logic we're used to, IBM decided to do the opposite, so steps with conditions that resolve to true are NOT executed.

The syntax is as follows:
//STEP1 EXEC PGM=SOMEPGM,COND=(<rc>,<operator>,<stepname>)
Where rc is the return code we're checking, stepname is the step we're checking the return code of and operator is one of the following:
EQ - Equal to (==)
NE - Not equal to (!=)
LT - Less than (<)
LE - Less than or equal to (<=)
GT - Greater than (>)
GE - Greater than or equal to (>=)
NG - Not greater than (<=)
NL - Not less than (>=)

(Omitting the step name parameter from the COND will make it check the return code of every step that finished running before the current step.)

Example:
//STEP3 EXEC PGM=PROGGIE,COND=(3,LE,STEP1)

Means that step 3 won't be executed if:
3 <= STEP1
Which means STEP3 will run if 3 > STEP1 ==> STEP1 < 3.
Or in other words, STEP3 will run only if STEP1 returned a return code of less than 3.
As you see, the order of the parameters is also unconveniently backwards.
Fun stuff eh?

Cond has another format which works with the EVEN and ONLY parameters:
COND=EVEN makes it so the step will run even if any of the steps above it abended, while COND=ONLY runs the step only if a previous step has failed or abended.

Eventually, IBM realised their wrong doings with conds and implemented normal if-then-else statements in JCL which make life so much easier.
A few years too late imo..