A semi-join between two tables returns rows from the first table where one or more matches are found in the second table. The difference between a semi-join and a conventional join is that rows in the first table will be returned at most once. Even if the second table contains two matches for a row in the first table, only one copy of the row will be returned. Semi-joins are written using the EXISTS or IN constructs.
An anti-join is the opposite of a semi-join and is written using the NOT EXISTS or NOT IN constructs.
There's a pretty good write-up [here] (http://www.dbspecialists.com/files/presentations/semijoins.html) on semi/anti joins.