No one has provided an answer about the USING(...)
syntax yet.
While these two queries are equivalent logically, and also from the perspective of most modern optimisers:
SELECT * FROM a, b WHERE a.id = b.id
SELECT * FROM a JOIN b ON a.id = b.id
This one has a slightly different semantics:
SELECT * FROM a JOIN b USING (id)
Assuming the following schema:
CREATE TABLE a (id int, a1 int, a2 int);
CREATE TABLE b (id int, b1 int, b2 int);
The first two queries will have their asterisks expanded to:
SELECT a.id, a.a1, a.a2, b.id, b.a1, b.a2 FROM ...
Whereas the third query will have its asterisk expanded to:
SELECT coalesce(a.id, b.id) AS id, a.a1, a.a2, b.a1, b.a2 FROM ...
This is quite different for various reasons, including:
- The number of projected columns is now 5 instead of 6. This could get in the way when you use
UNION
or other set operations. Which you probably don't, with an asterisk.
- There is no longer a qualified (and duplicate)
a.id
or b.id
column, only an id
column. While PostgreSQL still allows for qualifying references to id
(e.g. when needing to disambiguate them), Oracle for example doesn't.
- As a consequence, in the third query with the
USING(...)
syntax, projecting a.*
or b.*
is no longer possible in Oracle.
USING
keyword for equi joins isn't supported in SQL Server.USING
keyword is used to tell the query batch, which database to use for firing the queries in the batch. – Paulita