无来源查询是什么
不写 FROM 也能执行 SELECT:给常量求值,或在不碰任何表的前提下验证函数与参数的实际行为。时区、字符集、隐式转换、日期函数的结果在不同实例上经常不一样,用一条无表查询就能当场看到真实结果,比翻文档更快。MySQL 与 PostgreSQL 都支持省略 FROM,MySQL 还兼容 Oracle 的 FROM DUAL 写法,PostgreSQL 写了会直接报关系不存在,Oracle 则强制要求 FROM DUAL。
基本信息
| MySQL 8.0 | SELECT 1 + 1; 可直接执行,也支持 FROM DUAL |
|---|---|
| PostgreSQL | 省略 FROM;写 FROM DUAL 报 relation "dual" does not exist |
| Oracle | 必须写 FROM DUAL,省略 FROM 会报错 |
| SQL Server | 可直接 SELECT 1,无需 FROM |
| 常见用途 | 常量计算、函数与参数验证、连接池探活 |
典型使用场景
- 连接池探活:执行 SELECT 1 确认连接可用,不读任何业务数据
- 验证时区:对比 NOW() 与 UTC_TIMESTAMP(),确认会话时区偏移
- 验证函数边界行为:四舍五入规则、截断、空值处理
- 确认实例参数:查看 sql_mode、时区、版本,排查环境差异
- 计算表达式:不需要建表就能算出结果,用于核对业务公式
常用验证语句
常用验证语句
SELECT 1 + 1 AS two; # 常量计算,不依赖任何表
SELECT NOW() AS local_ts, # 会话时区下的当前时间
UTC_TIMESTAMP() AS utc_ts; # 与上一列对比即知时区偏移
SELECT VERSION() AS db_version; # 确认实例版本,排查版本差异
SELECT @@sql_mode AS sql_mode; # 关键参数,影响分组合法性与严格模式
SELECT 0.1 + 0.2 AS f; # 浮点精度行为演示跨库写法对照
跨库写法对照
# MySQL 兼容 Oracle 风格
SELECT 1 + 1 FROM DUAL;
-- PostgreSQL:必须省略 FROM,写 FROM DUAL 会报错
SELECT 1 + 1;
SELECT current_setting('TimeZone') AS tz; -- 确认会话时区
SELECT EXTRACT(EPOCH FROM now()) AS unix_ts; -- 无表查询里使用函数平台写法对照
| 平台 | 能否省略 FROM | FROM DUAL |
|---|---|---|
| MySQL 8.0 | 可以 | 兼容支持 |
| PostgreSQL | 可以 | 不支持,报 relation "dual" does not exist |
| Oracle | 不可以 | 必须写 |
| SQL Server | 可以 | 不需要 |
NOW() 在同一语句内的结果是一致的:MySQL 取语句开始时刻,PostgreSQL 取事务开始时刻。需要「函数实际执行瞬间」的时间时应使用 SYSDATE() 这类特例函数,但业务里不应依赖这种差异。
无表查询只返回一行,适合验证单个表达式的求值结果;要造多行数据可以用 PostgreSQL 的 generate_series(1, 10) 或 MySQL 8 的递归 CTE,同样不需要真实业务表。
探活 SQL 越简单越好:SELECT 1 即可,不要把 NOW()、RAND() 之类带状态或消耗资源的函数写进高频探活语句,以免探活本身变成额外负载。