SQL guide · Filtering
SQL ANY: True If Any Value in a Set Matches
The ANY operator compares a value against every row returned by a subquery and is true if the comparison holds for at least one of them. It is always paired with a comparison operator, as in = ANY, > ANY or <> ANY. The keyword SOME is a synonym.
The meaning depends on the operator. x = ANY (subquery) behaves exactly like x IN (subquery). x > ANY (subquery) is true when x is greater than at least one returned value, which is the same as being greater than the minimum. x < ANY (subquery) is true when x is below the maximum.
If the subquery returns no rows, ANY is false. If it contains NULLs, the result can be unknown rather than false when no non-NULL value satisfies the comparison. In practice many analysts rewrite ANY with MIN, MAX, IN or EXISTS, but ANY stays useful when the intent is clear or when passing arrays in PostgreSQL.
Basic syntax
SELECT column1
FROM table_name
WHERE column operator ANY (subquery);
-- operator is one of =, <>, <, <=, >, >=The subquery must return a single column of a compatible type. ANY and SOME are interchangeable. Beware that <> ANY means "differs from at least one", which is not the same as NOT IN. For readability, many teams add a short comment explaining the intended meaning, since readers often mistake the operator for the opposite behavior.
SQL ANY examples
Equal to any value (same as IN)
Returns products whose id appears among items in orders above 500. This is an alternative spelling of IN with a subquery.
SELECT product_id, name
FROM products
WHERE product_id = ANY (
SELECT product_id
FROM order_items
WHERE quantity > 500
);Greater than any value
Employees who earn more than at least one person in the Support department. This equals comparing against the lowest support salary.
SELECT employee_id, name, salary
FROM employees
WHERE salary > ANY (
SELECT salary
FROM employees
WHERE department = 'Support'
);Less than any value
Products priced below at least one premium item, meaning cheaper than the most expensive premium product. The comparison is with the maximum of the set.
SELECT product_id, name, price
FROM products
WHERE price < ANY (
SELECT price FROM products WHERE tier = 'premium'
);Equivalent rewrite with an aggregate
The same condition can be written with MIN, which many readers find clearer. The results are identical when the subquery has no NULLs.
SELECT employee_id, name, salary
FROM employees
WHERE salary > (
SELECT MIN(salary)
FROM employees
WHERE department = 'Support'
);Where SQL dialects differ
PostgreSQL: Supports ANY with subqueries and with arrays, for example WHERE id = ANY(ARRAY[1, 2, 3]) or = ANY($1) for a bound array parameter. SOME is accepted.
MySQL: Supports ANY and SOME with subqueries only, not arrays. Supported in versions 4.1 and later.
SQL Server: Supports ANY and SOME with subqueries returning one column. Arrays are not available; use IN with a table variable or STRING_SPLIT (2016 and later).
SQLite: Does not support ANY, SOME or ALL. Rewrite with IN, EXISTS, or MIN and MAX.
Oracle: Supports ANY and SOME with a subquery or a list of literals, such as salary > ANY (3000, 4000).
Common mistakes
- Reading
<> ANYas "not in the set". It is true if the value differs from at least one element, which is almost always true. UseNOT INor<> ALL. - Forgetting the comparison operator in front of
ANY. It cannot be used alone. - Ignoring NULL in the subquery, which can turn expected true or false results into unknown.
- Assuming SQLite supports it. Rewrite the logic with
EXISTSor aggregates there.
Related SQL guides
Need help writing the SQL?
Describe your tables and the result you want, then review the generated query against your database before running it.
Try the AI SQL generator