温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

子查询在oracle用法相同吗

发布时间:2026-10-16 15:39:49 来源:亿速云 阅读:84 作者:小樊 栏目:数据库

总体来说,Oracle 中的子查询(Subquery)在“概念和基本用法”上与其他关系型数据库(如 MySQL、SQL Server、PostgreSQL)是相似的,但在“语法细节、支持程度和某些特性”上存在差异。

下面分点说明:


一、相同的部分(通用用法)

以下子查询写法在 Oracle 和其他数据库中基本一致:

1. WHERE 中的子查询

SELECT *
FROM emp
WHERE deptno = (
    SELECT deptno
    FROM dept
    WHERE dname = 'SALES'
);

2. FROM 中的子查询(内联视图)

SELECT d.deptno, d.cnt
FROM (
    SELECT deptno, COUNT(*) cnt
    FROM emp
    GROUP BY deptno
) d;

3. EXISTS / NOT EXISTS

SELECT *
FROM emp e
WHERE EXISTS (
    SELECT 1
    FROM dept d
    WHERE d.deptno = e.deptno
);

二、Oracle 中“不同或特有”的地方

1. 分页子查询(典型 Oracle 风格)

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;

2. 关联子查询 + 分析函数(Oracle 很强)

Oracle 对子查询结合分析函数支持非常好:

SELECT *
FROM (
    SELECT e.*,
           RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) rk
    FROM emp e
)
WHERE rk = 1;

3. WITH 子句(CTE)

Oracle 很早支持 WITH:

WITH dept_cnt AS (
    SELECT deptno, COUNT(*) c
    FROM emp
    GROUP BY deptno
)
SELECT * FROM dept_cnt;

12c 支持 WITH FUNCTION,可定义局部函数(其他库少有)


4. 单行 vs 多行子查询限制更严格

Oracle 对以下情况会直接报错:

-- 错误示例
SELECT *
FROM emp
WHERE deptno = (SELECT deptno FROM dept);
-- ORA-01427: single-row subquery returns more than one row

必须用 IN 或 EXISTS。


5. 某些数据库支持但 Oracle 不支持

  • ❌ Oracle 不支持 SELECT col = (子查询) 这种赋值式写法(SQL Server 风格)
  • ❌ Oracle 子查询中不能直接用 ORDER BY(除非有 ROWNUM 或分析函数)

三、结论

✅ 用法“思想相同”:子查询位置、逻辑关系一致
⚠️ 语法细节不同:分页、限制、错误提示、特有写法

如果你有 具体 SQL(如 MySQL → Oracle 转换),可以直接发出来,我可以帮你改写并说明差异。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手