数据库管理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 语句进行了完整介绍与实战演示。
老规矩,知道写了些啥。