特性 | Oracle | PostgreSQL | MySQL |
---|---|---|---|
基础JOIN类型 | 支持INNER/LEFT/RIGHT/FULL OUTER | 同Oracle,且支持CROSS JOIN | 支持INNER/LEFT/RIGHT,FULL需用UNION模拟 |
横向连接(LATERAL) | 不支持 | ✅ 支持,可结合子查询动态引用外层字段 | ❌ 不支持 |
自然连接(NATURAL) | ✅ 支持,但易引发歧义(慎用) | ✅ 支持 | ✅ 支持 |
分区连接 | ✅ PARTITION BY优化大表关联 | ❌ 不支持 | ❌ 不支持 |
示例:横向连接(仅PostgreSQL支持)
-- 每篇文章关联其最新的3条评论
SELECT a.title, c.content
FROM articles a
LEFTJOINLATERAL (
SELECT*FROM comments
WHERE article_id = a.id
ORDERBY created_at DESC
LIMIT 3
) c ONtrue;
Oracle:
自动选择HASH JOIN
或NESTED LOOP
,支持并行执行(PARALLEL
提示)。
SELECT /*+ PARALLEL(e 4) */ e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;
PostgreSQL:
支持HASH JOIN
和MERGE JOIN
,可手动设置优化器开关(SET enable_nestloop = off;
)。
MySQL:
8.0+默认使用Hash Join
,但复杂查询仍可能退化为嵌套循环,需通过索引优化。
场景 | Oracle | PostgreSQL | MySQL |
---|---|---|---|
关联子查询 | ✅ 优化器自动重写为JOIN | ✅ 支持,性能良好 | ❗ 5.7以下性能差,需手动优化为JOIN |
IN子查询 | ✅ 支持,可结合索引 | ✅ 支持 | ✅ 8.0+支持物化优化 |
EXISTS子查询 | ✅ 通常比IN更快 | ✅ 同Oracle | ✅ 性能优于IN |
示例:关联子查询优化(Oracle vs MySQL)
-- Oracle自动优化
SELECT name FROM employees e
WHERE EXISTS (SELECT 1 FROM sales WHERE emp_id = e.id);
-- MySQL需手动改写为JOIN
SELECT e.name
FROM employees e
JOIN sales s ON e.id = s.emp_id
GROUP BY e.id;
Oracle/PostgreSQL: 支持递归CTE,适用于层次化查询(如组织架构树)。
WITH RECURSIVE dept_tree AS (
SELECT id, name, parent_id FROM departments WHERE parent_id IS NULL
UNION ALL
SELECT d.id, d.name, d.parent_id
FROM departments d
JOIN dept_tree dt ON d.parent_id = dt.id
)
SELECT * FROM dept_tree;
MySQL:
8.0+支持CTE,但递归深度有限(默认1000层),需调整参数cte_max_recursion_depth
。
函数/功能 | Oracle | PostgreSQL | MySQL |
---|---|---|---|
ROW_NUMBER() | ✅ | ✅ | ✅ 8.0+ |
RANK()/DENSE_RANK() | ✅ | ✅ | ✅ 8.0+ |
LEAD()/LAG() | ✅ | ✅ | ✅ 8.0+ |
窗口帧(RANGE) | ✅ | ✅ | ❌ 仅支持ROWS |
动态窗口 | ✅ RANGE INTERVAL | ✅ | ❌ |
示例:计算累计销售额(Oracle/PostgreSQL)
SELECT order_date, revenue,
SUM(revenue) OVER (ORDER BY order_date RANGE BETWEEN INTERVAL '7' DAY PRECEDING AND CURRENT ROW) AS rolling_7d
FROM sales;
Oracle:
独有的MODEL
子句,支持电子表格式计算。
SELECT year, product, sales
FROM sales_data
MODEL
PARTITION BY (product)
DIMENSION BY (year)
MEASURES (sales)
RULES (sales[2025] = sales[2024] * 1.1);
PostgreSQL:
支持FILTER
子句聚合,优化条件统计。
SELECT department,
COUNT(*) FILTER (WHERE salary > 10000) AS high_earners
FROM employees
GROUP BY department;
JOIN优化对比:
EXPLAIN ANALYZE
结果。SELECT u.name, o.order_id, p.product_name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id
WHERE u.country =
'IT咸鱼';
窗口函数应用:
需求场景 | 推荐数据库 | 理由 |
---|---|---|
复杂JOIN+地理数据 | PostgreSQL | 支持PostGIS和LATERAL JOIN |
海量数据+企业级事务 | Oracle | 高并发优化和分区特性 |
简单查询+快速开发 | MySQL | 轻量级、易部署 |
实时分析+窗口函数 | PostgreSQL/Oracle | 功能全面,支持动态窗口 |
通过本日学习,您已掌握三种数据库在高级查询中的核心差异。第三天我们将深入探讨索引优化、锁机制与并发控制的对比!