1. at runs jobs at a given time. batch runs jobs "when system load levels permit" [1]. nq runs jobs in sequence with no regard to the system's load average.
2. at and batch have 52 built-in queues: a-z and A-Z. Any directory can be a queue for nq.
3. You can follow the output of an nq queue tail-style with fq.
4. The syntax is different. at and batch take whole scripts from the standard input or a file; nq takes a single command as its command line arguments.
5. nq doesn't rely on a daemon. It's an admirably simple design. Jobs are just flock()-ed output files in a directory.