一、引言:刚毕业只会SQL Server,不会Oracle怎么办?
对于很多刚毕业的学生来说,只要是软件方向的应该基本上都学过SQL Server,可能很多没有接触过Oracle,虽然Oracle数据库的许多概念确实非常相似,但魔鬼藏在细节中,在具体实现上存在诸多差异,这些差异可能会导致原本在SQL Server上运行良好的SQL语句在Oracle中无法工作。让初次接触Oracle的你无从下手。
本文将从实际应用角度出发,结合实际工作经验,重点介绍两种数据库在常见操作上的语法差异,帮助SQL Server用户快速掌握Oracle的核心语法。我们将从最基本的查询语句开始,一直深入到递归函数等高级特性,让你在1小时内建立起Oracle语法的整体认知框架。
另外本次只是Sql语法的讲解,默认数据库客户端和服务器环境已经搭建完成,如果不会网上有很多安装教程,如果有需要可以留言,后续我会再单独写下数据库的安装和配置。
二、相同的部分
两者都支持常见的数值类型,如整数类型(SqlServer 的 int ,Oracle 的 NUMBER )、字符类型(SqlServer 的 varchar ,Oracle 的 varchar2 )、日期类型(SqlServer 的 datetime ,Oracle 的 date )。这些基本数据类型为数据库的存储和处理提供了基础。
同时基础语法也都一样,相同部分不做过多介绍。
三、不同部分重点介绍
分页查询
分页查询是日常开发中最常用的操作之一,也是两种数据库差异最大的地方之一:
1、SQL Server使用TOP关键字实现简单分页:
SELECT TOP 10 * FROM Orders ORDER BY CreateDate DESC
2、Oracle则需要使用ROWNUM伪列,且需要三层嵌套查询实现标准分页
SELECT * FROM (
SELECT temp.*, ROWNUM RN FROM (
SELECT * FROM Orders ORDER BY CreateDate DESC
) temp WHERE ROWNUM <= 10
) WHERE RN >= 1
自增列
自增列的实现也完全不同
1、SQL Server使用IDENTITY属性:
CREATE TABLE Users (
ID INT IDENTITY(1,1) PRIMARY KEY,
Name VARCHAR(50)
)
使用的时候直接 insert into 表名(字段2,,字段3),其中字段1为自增列会自动进行插入,不需要sql中写出来
2、Oracle需要使用SEQUENCE序列对象 :
CREATE SEQUENCE seq_user START WITH 1 INCREMENT BY 1;
CREATE TABLE Users (
ID NUMBER PRIMARY KEY,
Name VARCHAR2(50)
);
--使用的时候需要主动用seq_user.NEXTVAL方式进行调用,需要写到sql中
INSERT INTO Users VALUES (seq_user.NEXTVAL, '张三');
日期函数
日期函数是日常使用频率极高的功能,两种数据库的实现差异明显:
1、获取当前时间
这种方式一定要牢牢记住,在实际工作中会有大量的实际需求用到这一函数。另外这里重点强调下oracle函数的 dual函数,这是一个空函数,目的是为了执行一个方法的时候需要保持语法一致性,所以衍生了这么一个函数。
SQL Server: SELECT GETDATE()
Oracle: SELECT SYSDATE FROM dual
dual函数的使用场景
--其主要作用是在需要返回单行单列结果,却又无需从实际数据表中获取数据时发挥功能
--执行简单计算
SELECT 1 + 2 AS result FROM DUAL; -- 输出:3
--调用系统函数
SELECT SYSDATE FROM DUAL; -- 返回当前日期和时间
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL; -- 格式化日期
SELECT LENGTH('Hello') FROM DUAL; -- 计算字符串长度,输出:5
2、日期加减
日期加减差异也很大
SQL Server直接使用加减:
SELECT DATEADD(DAY, 1, GETDATE()) -- 加1天
Oracle对日期的加减更灵活
SELECT SYSDATE + 1 FROM dual; -- 加1天
SELECT SYSDATE + 1/24 FROM dual; -- 加1小时
SELECT ADD_MONTHS(SYSDATE, 1) FROM dual; -- 加1个月
3、 日期格式化
日期格式化使用函数不一样
SQL Server: CONVERT(VARCHAR, GETDATE(), 120)
Oracle: TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')
字符串处理
1、字符串拼接
常规方式直接拼接
- SQL Server使用
+
:SELECT 'A' + 'B'
- Oracle使用
||
:SELECT 'A' || 'B' FROM dual
使用函数拼接
- SQL Server的CONCAT可以连接多个字符串:
SELECT CONCAT('A','B','C')
- Oracle的CONCAT只能连接两个字符串,多个需要嵌套,如下
-
SELECT CONCAT(CONCAT('A','B'),'C') FROM dual
2、字符串替换
- SQL Server:
SELECT REPLACE('ABCDEF','CD','XX')
- Oracle除了REPLACE外,还提供更强大的REGEXP_REPLACE
-
SELECT REGEXP_REPLACE('ABCDEF','[AC]','X') FROM dual -- 结果: XBXDEF
四、高级查询技巧
递归查询在组织架构树形菜单等场景下非常有用:
1、SQL Server使用公用表表达式(CTE):
WITH TreeCTE AS (
SELECT * FROM Catalog WHERE ID = 1
UNION ALL
SELECT c.* FROM Catalog c
JOIN TreeCTE t ON c.ParentID = t.ID
)
SELECT * FROM TreeCTE
2、Oracle使用CONNECT BY语法
SELECT * FROM Catalog
START WITH ID = 1
CONNECT BY PRIOR ID = ParentID
方向控制:
• 向下查询(父→子): CONNECT BY PRIOR ID = ParentID
• 向上查询(子→父): CONNECT BY PRIOR ParentID = ID
五、高效开发工具
高效的开发工具使你事倍功半
- SQL Server:安装客户端后自带官网工具
- Oracle:第三方强大IDE,基本上都使用PL/SQL Developer
PL/SQL Developer 是专为 Oracle 数据库开发打造的高效集成工具,以 “简捷操作 + 强大功能” 著称。它支持 PL/SQL 代码的编写、调试与优化,具备智能代码补全、语法高亮及快速错误定位功能,能大幅提升开发效率;同时集成可视化数据库对象管理、SQL 窗口调试、报表生成等模块,可轻松完成表结构设计、存储过程调试及数据导入导出等操作,且兼容多版本 Oracle 数据库,以轻量化界面与专业级开发能力,成为 Oracle 开发者的核心工具之一。
六、总结
本文只是初步简单介绍了Oracle和SlqServer的一些语法差别,也是实际工作中会遇到的,后续会继续分享更多的Oracle知识,希望能帮助初学者。