some reasons the calling code may not have access to the values: 1. database defaults. 2. non-integer primary key. 3. computed values. 4. batch inserts, where its easier to just insert then scan out the fields especially when combined with the 3 other issues above. returning is really just a generalized form of last row id. I find it very useful from expressing the intent. yes I could write two queries but I also could just write one that does what I want, and generally the tooling already supports scanning results back out of the query. I see it as a QOL improvements while developing beyond performance the performance benefits it provides in typical client/server environments. Once you have it, you start reaching for it in a bunch of contexts.