Oracle 26ai的SQL语言增强特性

 更新时间:2026年04月09日 11:03:11   作者:Leon-Ning Liu  
本文主要介绍了 Oracle 26ai的SQL语言增强特性,包括GROUP BY ALL自动分组、QUALIFY子句直接过滤窗口函数结果、UUID()生成标准UUID、GROUP BY支持列别名或位置编号、非位置INSERT通过列名指定插入值,感兴趣的可以了解一下

1. GROUP BY ALL 语法

用途:自动按 SELECT 列表中所有非聚合列分组,无需显式列出所有列。

-- 传统写法:需要显式列出所有非聚合列
SELECT department_id, job_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id, job_id;
-- 26ai 新写法:使用 GROUP BY ALL 自动包含所有非聚合列
SELECT department_id, job_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY ALL;

适用场景:当 SELECT 列表有很多列时,简化代码并避免遗漏。

2. QUALIFY 子句(窗口函数过滤)

用途:直接过滤窗口函数的结果,无需嵌套子查询。

-- 传统写法:需要子查询或 CTE
WITH ranked AS (
    SELECT employee_id, first_name, salary,
           RANK() OVER (ORDER BY salary DESC) AS salary_rank
    FROM employees
)
SELECT * FROM ranked WHERE salary_rank <= 5;
-- 26ai 新写法:使用 QUALIFY 直接过滤
SELECT employee_id, first_name, salary,
       RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees
QUALIFY salary_rank <= 5;
-- 另一个示例:查找每个部门工资前 3 的员工
SELECT department_id, first_name, salary,
       ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rn
FROM employees
QUALIFY rn <= 3;

3. UUID() 函数(RFC 9562 版本 4)

用途:生成标准 UUID,替代手动生成或调用外部函数。

-- 生成单个 UUID
SELECT UUID() FROM dual;
-- 结果示例:550e8400-e29b-41d4-a716-446655440000
-- 插入数据时自动生成 UUID
CREATE TABLE users (
    user_id RAW(16) DEFAULT UUID() PRIMARY KEY,
    username VARCHAR2(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (username) VALUES ('zhangsan');
-- user_id 自动填充为 UUID
-- 批量生成 UUID
SELECT UUID() AS id, first_name 
FROM employees 
WHERE department_id = 10;

4. GROUP BY 支持列别名或位置编号

用途:使用 SELECT 列表中的别名或位置号进行分组,更简洁。

-- 传统写法:重复表达式或使用列名
SELECT SUBSTR(hire_date, 1, 4) AS hire_year, COUNT(*) AS cnt
FROM employees
GROUP BY SUBSTR(hire_date, 1, 4);
-- 26ai 新写法:使用列别名
SELECT SUBSTR(hire_date, 1, 4) AS hire_year, COUNT(*) AS cnt
FROM employees
GROUP BY hire_year;
-- 使用位置编号(从 1 开始)
SELECT department_id, job_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY 1, 2;  -- 按第 1 列(department_id)和第 2 列(job_id)分组
-- 混合使用别名和位置编号
SELECT department_id, job_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY 1, job_id;  -- 位置 1 和别名混用

5. 非位置 INSERT 子句(命名列插入)

用途:通过列名而非位置指定插入值,顺序无关,更清晰。

-- 传统写法:必须按列定义顺序,VALUES 顺序必须与列列表一致
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id)
VALUES (207, 'John', 'Smith', 'jsmith', SYSDATE, 'IT_PROG');
-- 26ai 新写法:命名列插入,可以任意顺序指定
INSERT INTO employees (
    employee_id => 207,
    last_name => 'Smith',
    first_name => 'John',
    job_id => 'IT_PROG',
    email => 'jsmith',
    hire_date => SYSDATE
);
-- 批量插入时更清晰
INSERT ALL
    INTO employees (employee_id => 208, last_name => 'Wang', first_name => 'Wei', job_id => 'SA_REP')
    INTO employees (employee_id => 209, first_name => 'Li', last_name => 'Hua', job_id => 'MK_MAN')
SELECT 1 FROM dual;

到此这篇关于Oracle 26ai的SQL语言增强特性的文章就介绍到这了,更多相关Oracle 26ai增强特性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Oracle 监听器密码设置方法(LISTENER)

    Oracle 监听器密码设置方法(LISTENER)

    在缺省的情况下,任意用户不需要使用任何密码即通过lsnrctl 工具对Oracle Listener进行操作或关闭,从而造成任意新的会话都将无法建立连接
    2016-09-09
  • oracle多表简单查询实例代码

    oracle多表简单查询实例代码

    当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询,下面这篇文章主要给大家介绍了关于oracle多表简单查询的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • oracle 存储过程加密的方法

    oracle 存储过程加密的方法

    oracle 存储过程的加密方法小结
    2008-12-12
  • Oracle中实现一次插入多条数据详细代码举例

    Oracle中实现一次插入多条数据详细代码举例

    公司的项目,有个功能每次使用需要向数据库插入很多数据,这里给大家总结下,这篇文章主要给大家介绍了Oracle中实现一次插入多条数据的相关资料,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • Oracle建表与创建序列详细实例

    Oracle建表与创建序列详细实例

    在oracle中sequence就是所谓的序列号,每次取的时候它会自动增长,通常用在须要按序列号排序的地方,下面这篇文章主要给大家介绍了关于Oracle建表与创建序列的相关资料,需要的朋友可以参考下
    2023-06-06
  • Oracle磁盘排序问题从定位到解决的完整实操指南

    Oracle磁盘排序问题从定位到解决的完整实操指南

    在Oracle数据库运维中,磁盘排序是高频出现的性能问题,不仅会占用大量临时表空间,还会拖慢SQL执行效率,甚至引发数据库整体响应迟缓,本文结合一线运维经验,梳理出发现问题,定位源头,分析原因,优化解决,长期预防的全流程排查方法,需要的朋友可以参考下
    2026-03-03
  • oracle sql执行过程(流程图)

    oracle sql执行过程(流程图)

    本篇文章是对oracle sql执行过程进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Oracle表空间的创建、使用、重命名与删除方法

    Oracle表空间的创建、使用、重命名与删除方法

    表空间是Oracle数据库中的一个重要概念,它是一组物理文件,用于存储数据库对象,如表、索引等,在使用Oracle数据库时,通常需要创建表空间来存放数据,本文介绍了Oracle表空间的创建、使用、重命名与删除方法
    2024-03-03
  • Oracle密码文件的使用和维护

    Oracle密码文件的使用和维护

    Oracle密码文件的使用和维护...
    2007-03-03
  • oracle分区使用详解

    oracle分区使用详解

    刚刚和公司的一个大佬讨论了一下数据采集的表结构,打算按月分表,按天分区,下面通过实例代码给大家介绍oracle分区使用的相关操作,感兴趣的朋友一起看看吧
    2025-06-06

最新评论