DISTINCT has nothing to do with sets -- you can ask for a subset of fields from "unique" rows that have duplicate tuples -- nothing violates SQL.
DISTINCT is evil because it's a very poor workaround to GROUP BY. It doesn't do anything differently, but it can easily be misconstrued as a function call - I've seen it many times on this forum. You're allowed to write "SELECT DISTINCT *" with a GROUP BY clause -- that's just evil.
As for tables allowing duplicates, that up to you, the DBA, when you inserted the record -- if you choose a truly UNIQUE value, with a unique constraint, you won't get so-called duplicates.