在 SQL 中,USING
?是一種用于簡化?JOIN
?操作的語法糖,它允許你明確指定連接表時所依據的列名。與傳統的?ON
?子句相比,USING
?提供了更簡潔的語法
1. 基本語法與作用
table1 JOIN table2 USING (column_name);
將?table1
?和?table2
?中?column_name
?值相同的行連接在一起
例:假設有兩個表:Orders
(包含?order_id
,?cust_id
)和?OrderItems
(包含?item_id
,?order_id
,?product
)
使用?ON
?子句:
SELECT * FROM Orders JOIN OrderItems ON Orders.order_id = OrderItems.order_id;
使用?USING
?子句:
SELECT * FROM Orders JOIN OrderItems USING (order_id);
2.?USING
?的核心特性
2.1 自動去重重復列
當使用?USING
?時,結果集中只會包含一個?column_name
(即連接列)。而使用?ON
?時,連接列會在結果中出現兩次(來自兩個表)。
使用 USING 的結果:order_id | cust_id | item_id | product
----------------------------------------
1001 | 1 | 2001 | iPhone使用 ON 的結果:Orders.order_id | OrderItems.order_id | cust_id | item_id | product
-----------------------------------------------------------------------
1001 | 1001 | 1 | 2001 | iPhone
2.2 與?GROUP BY
、ORDER BY
?結合使用
當在?GROUP BY
?或?ORDER BY
?中引用連接列時,無需指定表名,直接使用列名即可。
SELECT order_id, COUNT(*)
FROM Orders
JOIN OrderItems USING (order_id)
GROUP BY order_id; -- 直接使用 order_id,無需表名前綴
2.3 與?SELECT
?結合使用
在?SELECT
?列表中引用連接列時,不能使用表名前綴(否則會報錯)。
3. 多列?USING
USING
?可以同時指定多個連接列,用逗號分隔:
table1 JOIN table2 USING (col1, col2, ...);
例:
假設?Employees
?和?Departments
?表通過?dept_id
?和?location
?兩個列關聯:
SELECT *
FROM Employees
JOIN Departments USING (dept_id, location);
使用?USING
?的注意事項
- 連接列必須存在于兩個表中:如果某個表中不存在?
USING
?指定的列,會導致語法錯誤。 - 數據類型必須兼容:兩個表的連接列數據類型必須一致,否則可能導致隱式類型轉換或錯誤。
- 避免在子查詢中重命名連接列:如果子查詢中對連接列使用了別名(如?
SELECT order_num AS oid ...
),USING
?將無法匹配。
?