Question: I wanted to run a simple query to throw up all the rows of `Table1` where a principal column value is not present in a column in another table (`Table2`).

I tried using:

```
SELECT * FROM Table1 WHERE Table1.principal NOT IN Table2.principal

```

This is instead throwing a syntax error. Google search led me to forums where people were saying that MySQL does not support `NOT IN` and something extremely complex needs to be used. Is this true? Or am I making a horrendous mistake?

Answer: 
The subquery option has already been answered, but note that in many cases a `LEFT JOIN` can be a faster way to do this:

```
SELECT table1.*
FROM table1 LEFT JOIN table2 ON table2.principal=table1.principal
WHERE table2.principal IS NULL

```

If you want to check multiple tables to make sure it's not present in any of the tables (like in SRKR's comment), you can use this:

```
SELECT table1.*
FROM table1
LEFT JOIN table2 ON table2.name=table1.name
LEFT JOIN table3 ON table3.name=table1.name
WHERE table2.name IS NULL AND table3.name IS NULL

```
Be carefull `NOT IN` is not an alias for `<> ANY`, but for `<> ALL`!

<http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html>

```
SELECT c FROM t1 LEFT JOIN t2 USING (c) WHERE t2.c IS NULL

```

cant' be replaced by

```
SELECT c FROM t1 WHERE c NOT IN (SELECT c FROM t2)

```

You must use 

```
SELECT c FROM t1 WHERE c <> ANY (SELECT c FROM t2)

```