Oracle 26ai 的 SQL 语言增强特性

Oracle 26ai 的SQL 语言增强特性详细示例:

1. GROUP BY ALL 语法

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

sql 复制代码
-- 传统写法:需要显式列出所有非聚合列
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 子句(窗口函数过滤)

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

sql 复制代码
-- 传统写法:需要子查询或 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,替代手动生成或调用外部函数。

sql 复制代码
-- 生成单个 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 列表中的别名或位置号进行分组,更简洁。

sql 复制代码
-- 传统写法:重复表达式或使用列名
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 子句(命名列插入)

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

sql 复制代码
-- 传统写法:必须按列定义顺序,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;

相关推荐
java_logo15 分钟前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
广州灵眸科技有限公司8 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒10 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手10 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学11 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh12 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD14 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo14 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
TlSfoward15 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php