在 Oracle 中,连接查询(JOIN) 的连接类型及其性能对比

返回两个表中满足连接条件的记录。
SELECT *FROM table1 t1JOIN table2 t2 ON t1.id = t2.id;
特点:
, 和 WHERE),默认是内连接。返回左表的全部记录,如果右表中没有匹配的记录,则右表列为 NULL。
SELECT *FROM table1 t1LEFT JOIN table2 t2 ON t1.id = t2.id;
返回右表的全部记录,左表没有匹配记录的列为 NULL。
SELECT *FROM table1 t1RIGHT JOIN table2 t2 ON t1.id = t2.id;
返回两个表中的全部记录,没有匹配的部分列为 NULL。
SELECT *FROM table1 t1FULL OUTER JOIN table2 t2 ON t1.id = t2.id;
同一个表连接自身。
SELECT a.name, b.nameFROM employee aJOIN employee b ON a.manager_id = b.id;
返回两个表的笛卡尔积(每个表1条记录,两表组合1×1条记录)。
SELECT *FROM table1CROSS JOIN table2;
SELECT *FROM table1 t1, table2 t2WHERE t1.id = t2.id(+);-- 等价于 LEFT JOIN
| 连接类型 | 行数大小关系 | 匹配情况 | 性能 | 优化建议 |
|---|---|---|---|---|
| INNER JOIN | 常见,性能最好 | 有匹配 | 高效 | 使用索引字段连接 |
| LEFT JOIN | 左大右小 | 不一定匹配 | 中等 | 尽量加过滤条件 |
| RIGHT JOIN | 左小右大 | 不一定匹配 | 中等 | 同上,尽量避免 |
| FULL OUTER JOIN | 大数据慎用 | 不一定匹配 | 低效 | 避免在大数据量上使用 |
| CROSS JOIN | 小表可用,谨慎使用 | 无条件连接 | 最低 | 通常不推荐 |
| SELF JOIN | 中等 | 有匹配 | 中等 | 注意表别名 |
INNER JOIN 优于 OUTER JOINOUTER JOIN 多用于有缺失数据容忍时建议使用如下命令查看连接执行方式:
EXPLAIN PLAN FOR SELECT ...FROM ...WHERE ...;SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
| 算法 | 特点 | 适用情况 |
|---|---|---|
| Nested Loop Join | 一条一条查找 | 小表驱动大表,有索引时最佳 |
| Hash Join | 建立哈希表进行匹配 | 大表连接,大量数据无索引时 |
| Merge Join | 对两个表排序再合并 | 连接列已排序或排序开销可接受 |
SELECT o.order_id, c.customer_name, p.product_nameFROM orders oJOIN customers c ON o.customer_id = c.customer_idJOIN products p ON o.product_id = p.product_idWHERE o.order_date >= SYSDATE - 30;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。