☰
胖头鱼的技术专栏-472 26ai新特性实战:无 FROM 子句的 SELECT 语句(20261003)
2026/10/4 19:53:12 网站建设 项目流程

数据库管理472期 2026-10-03

  • 胖头鱼的技术专栏-472 26ai新特性实战:无 FROM 子句的 SELECT 语句(20261003)
    • 特性介绍
    • 语法介绍
    • 适用场景
    • 实战演示
      • 测试1:简单表达式
      • 测试2:SYSDATE, CURRENT_TIMESTAMP
      • 测试3:UUID (RAWTOHEX(SYS_GUID))
      • 测试4:算术与字符串操作
      • 测试5:DATEDIFF
      • 测试6:WITH 子句
      • 测试7:CASE 表达式
    • 总结

胖头鱼的技术专栏-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 除授权转载并标明出处外,均为“非法”抄袭

特性介绍

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

语法介绍

SELECTexpression1,expression2,...[ASalias];SELECTfunction_call();SELECT'string literal';SELECT1+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'ASgreeting;SELECT1+2+3+4+5ASsum_result;SELECT3.14159*10*10AScircle_area;

测试2:SYSDATE, CURRENT_TIMESTAMP

SELECTSYSDATEASsystem_date,CURRENT_DATEAScurrent_date_val,CURRENT_TIMESTAMPAScurrent_ts,SYSTIMESTAMPASsystem_ts;

测试3:UUID (RAWTOHEX(SYS_GUID))

SELECTRAWTOHEX(SYS_GUID())ASgenerated_uuid;

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

SELECT100*1.15ASprice_with_tax,SQRT(144)ASsquare_root,POWER(2,10)AStwo_to_tenth,ABS(-42)ASabsolute_value,MOD(17,5)ASremainder;SELECT'Oracle'||' '||'AI'||' '||'Database'ASfull_name,UPPER('hello world')ASupper_case,LOWER('HELLO WORLD')ASlower_case,SUBSTR('Hello World',1,5)ASfirst_word,LENGTH('Hello World')ASchar_length;

测试5:DATEDIFF

SELECTDATEDIFF(DAY,DATE'2025-01-01',DATE'2026-01-01')ASdays_in_year,DATEDIFF(MONTH,DATE'2025-01-01',DATE'2026-07-01')ASmonths_in_18,DATEDIFF(YEAR,DATE'2000-01-01',DATE'2026-01-01')ASyears_since_2000;SELECTDATEDIFF(DAY,TIMESTAMP'2026-01-01 00:00:00',TIMESTAMP'2026-12-31 23:59:59')ASdays_with_fraction;

测试6:WITH 子句

WITHconstantsAS(SELECT1000ASbase_price,0.08AStax_rate,20ASshipping,SYSDATEAScalc_date)SELECTbase_price,base_price*tax_rateAStax_amount,shipping,base_price+(base_price*tax_rate)+shippingAStotal_price,calc_dateFROMconstants;

测试7:CASE 表达式

SELECTCASEWHENDATEDIFF(DAY,DATE'2026-01-01',SYSDATE)>180THEN'Second half of 2026'ELSE'First half of 2026'ENDASperiod_label,TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')AScurrent_time;

总结

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

老规矩,知道写了些啥。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询