match any of sq2. Since 100 already does not match 40, the expression evaluates to true immediately, regardless of the 100's matching. It may be more easily readable to use SOME in a case such as this: SELECT * FROM sq1 WHERE num <> SOME (SELECT * FROM sq2); +------+ | num | +------+ | 100 | +------+ URL: https://mariadb.com/kb/en/subqueries-and-any/https://mariadb.com/kb/en/subqueries-and-any/