Yeah, I think that's a fair way to start thinking about them. But Lisp macros, to extend your example, are more like if you could generate the SQL using SQL. Which sounds like a totally horrible thing actually. :) But with Lisp it makes much more sense because lisp programs are lists. If SQL programs were tables, then it'd be a better fit...
You'd have to stretch the analogy to not only generating SQL with SQL, but extending SQL with SQL, to create constructs that weren't even possible to write in SQL before you extended it.