I will echo what others have said regarding "select *" retrieving a list of columns as part of the request handling. By contrast, you can also select columns by ordinal, which saves even more time since the RDBMS engine doesn't even need to look up the column to determine the position of the column to retrieve. I find this highly useful for aggregate queries.
For example: select count(1) from ... versus select count(*) from ...
In this example, the RDBMS only needs to know that it needs the count of the first column, and ZING, it's off. In the (unfortunately) more common select count(*), the RDBMS retrieves a list of all the columns, and then verifies each row to determine if it's valid for counting (as opposed to validating the 1st column only).
This works great most of the time. I'm pretty sure most DB systems count NULL values in the count, but you should watch out for this and verify before assuming.
YMMV, void where prohibited, etc.!