ITPub博客

首页 > 数据库 > Oracle > 胖头鱼的技术专栏-472 26ai新特性实战:无 FROM 子句的 SELECT 语句(20261003)

胖头鱼的技术专栏-472 26ai新特性实战:无 FROM 子句的 SELECT 语句(20261003)

原创 Oracle 作者:yhw1809 时间:2026-10-02 21:10:19 0 删除 编辑

胖头鱼的技术专栏-472 26ai新特性实战:无 FROM 子句的 SELECT 语句(20261003)

作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE
10年+数据库行业经验
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP,ITPUB认证专家
圈内拥有“总监”称号,非著 名社恐(社交恐怖分子)
全网同名:胖头鱼的鱼缸
ITPUB:yhw1809
除授权转载并标明出处外,均为“非法”抄袭

914fcc7ad57defa7868c3be1ca7fb4f5.jpg

特性介绍

Oracle AI Database 23.26.1 引入了无 FROM 子句的 SELECT 语句支持,允许开发者在不指定 FROM 子句的情况下执行 SELECT 查询。这与 PostgreSQL 和SQL Server 等数据库系统的行为保持一致,方便跨平台迁移和日常使用。

语法介绍

SELECT expression1, expression2, ... [AS alias];SELECT function_call();SELECT 'string literal';SELECT 1 + 2;

支持的操作:

  • 算术运算:SELECT 1 + 2;
  • 字符串操作:SELECT ‘Hello’ || ’ ’ || ‘World’;
  • 系统函数:SELECT SYSDATE, CURRENT_TIMESTAMP, USER;
  • 数学函数:SELECT SQRT(16), ABS(-5), POWER(2, 10);
  • 日期函数:SELECT SYSDATE + 7, ADD_MONTHS(SYSDATE, 1);
  • 类型转换:SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD’);
  • UUID 生成:SELECT RAWTOHEX(SYS_GUID());
  • 条件表达式:SELECT CASE WHEN 1=1 THEN ‘yes’ ELSE ‘no’ END;
  • 子查询因子化:WITH cte AS (…) SELECT … FROM cte;

行为细节:

  • 无 FROM 的 SELECT 只返回一行结果(类似 SELECT … FROM dual)
  • 如果在无 FROM 的 SELECT 中引用表列,会报错 ORA-00904
  • 可以与其他 SELECT 语句组合使用,如作为子查询
  • 在 WITH 子句(子查询因子化)中也可以使用无 FROM 的 SELECT

优势:

  • 简化编写:不再需要记住 FROM dual 的语法
  • 跨平台兼容:与 PostgreSQL、SQL Server、MySQL 行为一致
  • 代码简洁:减少模板代码,提高可读性
  • 迁移友好:从其他数据库迁移的应用无需修改这类查询

适用场景

  • 快速计算:在 SQL*Plus 或 SQLcl 中快速进行数学运算
  • 系统信息查询:快速查看系统日期、时间、用户信息
  • 函数测试:在不创建测试表的情况下测试函数返回值
  • 参数获取:在 PL/SQL 中使用 SELECT INTO 前验证函数输出
  • 教学演示:在培训环境中演示 SQL 表达式,无需创建示例表
  • 应用开发:在 ORM 或连接池中测试数据库连接和函数可用性

实战演示

同之前一样,使用用户NFTEST,已授权DB_DEVELOPER_ROLE角色,测试操作均在NFTEST用户下执行。

测试1:简单表达式

SELECT 'Hello World' AS greeting;
SELECT 1 + 2 + 3 + 4 + 5 AS sum_result;
SELECT 3.14159 * 10 * 10 AS circle_area;

image.png

测试2:SYSDATE, CURRENT_TIMESTAMP

SELECT
  SYSDATE            AS system_date,
  CURRENT_DATE       AS current_date_val,
  CURRENT_TIMESTAMP  AS current_ts,
  SYSTIMESTAMP       AS system_ts;

image.png

测试3:UUID (RAWTOHEX(SYS_GUID))

SELECT RAWTOHEX(SYS_GUID()) AS generated_uuid;

image.png

测试4:算术与字符串操作

SELECT
  100 * 1.15                    AS price_with_tax,
  SQRT(144)                     AS square_root,
  POWER(2, 10)                  AS two_to_tenth,
  ABS(-42)                      AS absolute_value,
  MOD(17, 5)                    AS remainder;
  
SELECT
  'Oracle' || ' ' || 'AI' || ' ' || 'Database' AS full_name,
  UPPER('hello world')                          AS upper_case,
  LOWER('HELLO WORLD')                          AS lower_case,
  SUBSTR('Hello World', 1, 5)                   AS first_word,
  LENGTH('Hello World')                         AS char_length;

image.png

测试5:DATEDIFF

SELECT
  DATEDIFF(DAY,   DATE '2025-01-01', DATE '2026-01-01') AS days_in_year,
  DATEDIFF(MONTH, DATE '2025-01-01', DATE '2026-07-01') AS months_in_18,
  DATEDIFF(YEAR,  DATE '2000-01-01', DATE '2026-01-01') AS years_since_2000;
  
SELECT
  DATEDIFF(DAY,
    TIMESTAMP '2026-01-01 00:00:00',
    TIMESTAMP '2026-12-31 23:59:59') AS days_with_fraction;

image.png

测试6:WITH 子句

WITH constants AS (  SELECT
    1000   AS base_price,
    0.08   AS tax_rate,
    20     AS shipping,
    SYSDATE AS calc_date
)
SELECT
  base_price,
  base_price * tax_rate AS tax_amount,
  shipping,
  base_price + (base_price * tax_rate) + shipping AS total_price,
  calc_dateFROM constants;

image.png

测试7:CASE 表达式

SELECT
  CASE
    WHEN DATEDIFF(DAY, DATE '2026-01-01', SYSDATE) > 180
    THEN 'Second half of 2026'
    ELSE 'First half of 2026'
  END AS period_label,
  TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS current_time;

image.png

总结

本期对 Oracle AI Database 26ai,23.26.1 版本新引入的无 FROM 子句的 SELECT 语句进行了完整介绍与实战演示。

老规矩,知道写了些啥。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31466763/viewspace-3184419/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2017-06-07

  • 博文量
    382
  • 访问量
    400318