The SQL NATURAL keyword is a prefix that can be placed in front of JOIN types (INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, CROSS) to create an implicit equijoin. When NATURAL is present, the database engine automatically discovers all columns that share the same unqualified name in both tables and builds an equality predicate for each of them, eliminating the need for explicit ON or USING clauses. The result set keeps only one copy of each matched column, preventing duplicate name conflicts.Because every shared column becomes part of the join condition, NATURAL can be concise but also dangerous: a new column with a reused name or a schema refactor can silently change query semantics or produce zero-row results. NATURAL is defined in the SQL standard, but some vendors (notably SQL Server) do not implement it. When supported, it behaves identically inside explicit transactions and respects the chosen join type (e.g., NATURAL LEFT JOIN will still return unmatched left rows).
JOIN, NATURAL JOIN, INNER JOIN, USING clause, LEFT JOIN, RIGHT JOIN, FULL JOIN
SQL-92 standard (widespread support added in later vendor versions)
USING requires you to enumerate the columns that make up the join predicate, giving explicit control. NATURAL JOIN deduces the list automatically, which is shorter to write but easier to break when schemas change.
Yes. After the join, only a single instance of each matched column remains in the result set, avoiding duplicate names like customer_id and customer_id.
No. NATURAL JOIN already defines its own join condition. Combining it with ON or USING will raise a syntax error.
SQL Server and Snowflake are notable databases that omit NATURAL from their SQL dialects. PostgreSQL, MySQL, Oracle, and SQLite do support it.