Join syntax that matches columns by name automatically (NATURAL JOIN) or by an explicit shared column list (JOIN ... USING), avoiding repeated column references.

A shorthand for ON when the join column has the same name in both tables, producing cleaner output with a single shared column instead of duplicates. Only works when the column names match exactly; falls back to ON for mismatched names.

Compatibility

Show:
Database System Support Status Since Version Notes
MySQL ✓ Supported 5.0 Both NATURAL JOIN and USING are supported. NATURAL JOIN matches all columns with identical names; USING matches on the specified list. The joined column appears once in SELECT *.
PostgreSQL ✓ Supported 7.4 Full support for both. USING produces a merged column in the output; NATURAL JOIN is effectively shorthand for USING all common column names.
SQL Server ✗ Not Supported Neither NATURAL JOIN nor USING is supported. Use explicit ON clauses. This is a deliberate omission — Microsoft considers NATURAL JOIN ambiguity-prone.
Oracle ✓ Supported 9i Both NATURAL JOIN and USING supported. A known gotcha: NATURAL JOIN silently breaks if a column with a matching name is added to either table later.
SQLite ✓ Supported 3.0.0 NATURAL JOIN and USING are both supported. NATURAL JOIN is parsed but its behavior on ambiguous schemas can be unpredictable — USING is the safer choice.

Details

SQL Server is the only engine here that rejects both NATURAL JOIN and USING entirely, requiring explicit ON syntax. NATURAL JOIN is universally considered risky in production schemas: any future column added to either table with a name matching a column in the other table silently changes join behavior. USING is safer since the join column is explicit, but it still produces a single merged output column (not two), which can surprise applications expecting column aliases. For maximum portability and least-surprise semantics, ON is recommended for production code.

Standard Syntax

-- USING SELECT * FROM orders JOIN customers USING (customer_id); -- NATURAL JOIN SELECT * FROM orders NATURAL JOIN customers;

Version Support

MySQL: Since 5.0 PostgreSQL: Since 7.4 SQL Server: Not supported Oracle: Since 9i SQLite: Since 3.0.0

Per-Database Syntax & Notes

MySQL

Both NATURAL JOIN and USING are supported. NATURAL JOIN matches all columns with identical names; USING matches on the specified list. The joined column appears once in SELECT *.

SELECT * FROM orders JOIN customers USING (customer_id); SELECT * FROM orders NATURAL JOIN customers;

PostgreSQL

Full support for both. USING produces a merged column in the output; NATURAL JOIN is effectively shorthand for USING all common column names.

SELECT * FROM orders JOIN customers USING (customer_id); SELECT * FROM orders NATURAL JOIN customers;

Oracle

Both NATURAL JOIN and USING supported. A known gotcha: NATURAL JOIN silently breaks if a column with a matching name is added to either table later.

SELECT * FROM orders JOIN customers USING (customer_id); SELECT * FROM orders NATURAL JOIN customers;

SQLite

NATURAL JOIN and USING are both supported. NATURAL JOIN is parsed but its behavior on ambiguous schemas can be unpredictable — USING is the safer choice.

SELECT * FROM orders JOIN customers USING (customer_id);