总体来说,Oracle 中的子查询(Subquery)在“概念和基本用法”上与其他关系型数据库(如 MySQL、SQL Server、PostgreSQL)是相似的,但在“语法细节、支持程度和某些特性”上存在差异。
下面分点说明:
以下子查询写法在 Oracle 和其他数据库中基本一致:
SELECT *
FROM emp
WHERE deptno = (
SELECT deptno
FROM dept
WHERE dname = 'SALES'
);
SELECT d.deptno, d.cnt
FROM (
SELECT deptno, COUNT(*) cnt
FROM emp
GROUP BY deptno
) d;
SELECT *
FROM emp e
WHERE EXISTS (
SELECT 1
FROM dept d
WHERE d.deptno = e.deptno
);
Oracle 没有 LIMIT,常用 ROWNUM + 子查询:
SELECT *
FROM (
SELECT ROWNUM rn, e.*
FROM emp e
ORDER BY sal DESC
)
WHERE rn BETWEEN 1 AND 10;
Oracle 12c 以后支持
FETCH FIRST:
SELECT * FROM emp
ORDER BY sal DESC
FETCH FIRST 10 ROWS ONLY;
Oracle 对子查询结合分析函数支持非常好:
SELECT *
FROM (
SELECT e.*,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) rk
FROM emp e
)
WHERE rk = 1;
Oracle 很早支持 WITH:
WITH dept_cnt AS (
SELECT deptno, COUNT(*) c
FROM emp
GROUP BY deptno
)
SELECT * FROM dept_cnt;
12c 支持
WITH FUNCTION,可定义局部函数(其他库少有)
Oracle 对以下情况会直接报错:
-- 错误示例
SELECT *
FROM emp
WHERE deptno = (SELECT deptno FROM dept);
-- ORA-01427: single-row subquery returns more than one row
必须用 IN 或 EXISTS。
SELECT col = (子查询) 这种赋值式写法(SQL Server 风格)ORDER BY(除非有 ROWNUM 或分析函数)✅ 用法“思想相同”:子查询位置、逻辑关系一致
⚠️ 语法细节不同:分页、限制、错误提示、特有写法
如果你有 具体 SQL(如 MySQL → Oracle 转换),可以直接发出来,我可以帮你改写并说明差异。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。