There are four big reasons that select * is a bad thing:
-
The most significant practical reason is that it forces the user to magically know the order in which columns will be returned. It's better to be explicit, which also protects you against the table changing, which segues nicely into...
-
If a column name you're using changes, it's better to catch it early (at the point of the SQL call) rather than when you're trying to use the column that no longer exists (or has had its name changed, etc.)
-
Listing the column names makes your code far more self-documented, and so probably more readable.
-
If you're transferring over a network (or even if you aren't), columns you don't need are just waste.