当前位置: 首页 > news >正文

Oracle新老SQL写法对比

Oracle 的“老写法”本质上是ANSI SQL:1989 / SQL-92 之前的风格,在金融、电信、银行系统里非常常见。下面按类型 + 示例 + 现代等价写法 + 踩坑点给你系统梳理一遍,和你刚才那条 SQL 属于同一个“时代产物”。


一、隐式连接(Implicit JOIN)✅ 你刚遇到的

老写法

SELECT*FROMEMP E,DEPT DWHEREE.DEPTNO=D.DEPTNO;

新写法

SELECT*FROMEMP EJOINDEPT DONE.DEPTNO=D.DEPTNO;

📌本质:逗号 = CROSS JOIN,WHERE = 过滤条件
📌风险:少写一个条件就变笛卡尔积


二、(+)外连接(Oracle 独有)

这是 Oracle 最著名的“老古董”。

左外连接(老)

SELECTE.ENAME,D.DNAMEFROMEMP E,DEPT DWHEREE.DEPTNO=D.DEPTNO(+);

左外连接(新)

SELECTE.ENAME,D.DNAMEFROMEMP ELEFTJOINDEPT DONE.DEPTNO=D.DEPTNO;

右外连接(老)

SELECTE.ENAME,D.DNAMEFROMEMP E,DEPT DWHEREE.DEPTNO(+)=D.DEPTNO;

规则口诀(非常重要)

(+)写在“补空的一边”

❌ 不支持:

  • 全外连接FULL OUTER JOIN
  • 多个OR条件
  • 自连接 +(+)

✅ Oracle 官方建议:12c 以后尽量不用(+)


三、DECODE替代 CASE(老牌条件表达式)

老写法

SELECTDECODE(SEX,'1','男','2','女','未知')ASSEX_DESCFROMEMP;

新写法

SELECTCASESEXWHEN'1'THEN'男'WHEN'2'THEN'女'ELSE'未知'ENDASSEX_DESCFROMEMP;

📌DECODE是 Oracle 私有函数
📌CASE是 ANSI 标准,可读性强


四、NVLvsCOALESCE

老写法

SELECTNVL(COMM,0)FROMEMP;

新写法

SELECTCOALESCE(COMM,0)FROMEMP;
对比项NVLCOALESCE
标准Oracle 私有ANSI SQL
参数个数2 个≥2 个
短路求值

📌COALESCE更安全,尤其跨数据库


五、SYSDATE+ 数字 = 日期运算(老习惯)

老写法

SELECTSYSDATE+1FROMDUAL;-- 明天SELECTSYSDATE-1/24FROMDUAL;-- 一小时前

新写法(更语义化)

SELECTSYSDATE+INTERVAL'1'DAYFROMDUAL;SELECTSYSDATE-INTERVAL'1'HOURFROMDUAL;

📌 老写法在金融计息、账期计算中极常见
📌 新写法可读性更好,但性能没差别


六、ROWNUM分页(经典老写法)

老写法

SELECT*FROM(SELECTA.*,ROWNUM RNFROM(SELECT*FROMEMPORDERBYHIREDATEDESC)AWHEREROWNUM<=20)WHERERN>10;

新写法(12c+)

SELECT*FROMEMPORDERBYHIREDATEDESCOFFSET10ROWSFETCHNEXT10ROWSONLY;

📌ROWNUM是 Oracle 特有
📌OFFSET / FETCH是 ANSI SQL


七、SELECT COUNT(*) INTO V_CNT FROM ... WHERE ROWNUM=1

老写法(判断是否存在)

SELECTCOUNT(*)INTOV_CNTFROMEMPWHEREDEPTNO=10ANDROWNUM=1;

新写法

SELECT1INTOV_FLAGFROMEMPWHEREDEPTNO=10FETCHFIRST1ROWSONLY;

📌 老写法是为了性能优化(找到一条就停)


八、EXISTS里的SELECT 1(老习惯)

老写法

SELECT*FROMEMP EWHEREEXISTS(SELECT1FROMDEPT DWHERED.DEPTNO=E.DEPTNO);

说明

  • SELECT 1是历史习惯
  • Oracle 实际不关心 SELECT 列表
  • SELECT NULL也一样

📌 这是“老派写法”,不是错误


九、||字符串拼接(Oracle 传统)

老写法

SELECT'A'||'B'FROMDUAL;

新写法(ANSI)

SELECTCONCAT('A','B')FROMDUAL;

📌||是 Oracle / PostgreSQL 风格
📌CONCAT在 MySQL / SQL Server 中更通用


十、HINT写在注释里(Oracle 特色)

老写法

SELECT/*+ INDEX(E EMP_IDX) */*FROMEMP E;

📌 注释不是注释,是优化器指令
📌 这种“伪装成注释的语法”是 Oracle 独有


十一、你这条 SQL 里还藏着的“老味儿”

结合你刚才的 SQL,其实还有这些老特征:

特征老/新
逗号 + WHERE 关联
LAG 窗口函数
多层子查询
GROUP BY 长字段拼接
无 WITH(CTE)
无 JOIN ON

十二、总结一张对照表(速查)

场景老写法新写法
内连接, + WHEREJOIN … ON
外连接(+)LEFT/RIGHT JOIN
条件分支DECODECASE
空值处理NVLCOALESCE
分页ROWNUMOFFSET/FETCH
存在判断COUNT(*)+ROWNUM=1EXISTS + FETCH

十三、给你的实战建议(很实用)

  1. 读老代码:必须会老写法
  2. 写新代码:优先用 ANSI SQL
  3. 重构老 SQL
    • 先不改逻辑
    • 只把, + WHEREJOIN ON
  4. 性能别乱动:老 SQL 很多“反直觉写法”是为性能服务的

http://www.jsqmd.com/news/1146569/

相关文章:

  • IPC机制如何调整和控制权限
  • Windows热键冲突终极解决方案:5分钟精准定位占用快捷键的程序
  • GPT训练我的第三天,明白了应该咋说满分回答!
  • LiteLLM 接入 Claude API 排障完全指南:anthropic-beta、Streaming、路由与 MCP OAuth(2026)
  • 费用报销审核和财务稽核能用AI吗?深度拆解AI Agent在企业财务自动化中的落地实践与选型指南
  • G-Helper:华硕笔记本终极轻量级控制中心,告别臃肿官方软件
  • 收藏!小白程序员必看:大模型时代如何转型全栈工程师?
  • 2026年API中转平台选型:从高并发到白盒计费的全面拆解
  • 如何快速获取百度网盘提取码:面向新手的完整指南
  • 拼多多虚拟类目自动化发货,零人工操作轻松盈利
  • 哔哩下载姬技术解析:逆向工程与平台合规的边界探索
  • 被问爆的物流降本方案!用“一盘货+分仓”,帮知名品牌降本20%+
  • 京东抢购自动化终极指南:3分钟上手JDspyder实现秒杀自由
  • 企业微信API二次开发:面对官方严苛限流,你的网关还在靠“死等”硬扛吗?
  • 258.fpga bank如果硬件上拉到了1.8v但我fpga约束成lvcmos33可以吗,说下影响
  • 问卷怎么导出SPSS最方便?2026年五大主流问卷平台格式兼容性对比
  • 全屋定制怎么规划?适配生活习惯的西宁理想家居打造方案
  • 暗黑破坏神2存档编辑器:3分钟学会自定义你的游戏体验
  • 基于yolo26的叶片病虫害检测项目
  • 5分钟掌握文档下载:kill-doc浏览器脚本让你轻松获取任何在线文档
  • 毕设项目分享 基于机器视觉的驾驶疲劳检测系统(源码+论文)
  • 解锁流媒体自由:N_m3u8DL-RE 跨平台下载解决方案的完整实践指南
  • 为什么很多企业迁移数据库,最后卡在 SQL 改写?
  • OpenClaw 自动化工具完整部署指南 Windows 与 Mac 适配教程
  • 罗氏线圈开口处靠近电流易受干扰:原因、影响与抗干扰对策
  • DBCO-PEG-silane,磺酸-Sulfo-DBCO-amine(124),二苯并环辛炔二氧化硅纳米粒介绍
  • 氟代二苯并环辛炔示踪生物正交分子与YGdBCO/YBCO-BaHfO₃复合超导薄膜的结构
  • TikTok爆款视频复刻工具推荐:2026年海外短视频AI翻拍与去重新解法
  • Keyboard Chatter Blocker终极指南:专业解决机械键盘连击问题的完整方案
  • 新型“Bad Epoll” 0Day漏洞可获取Linux服务器与Android设备的Root权限