sql是结构化查询语言的通用标准,几乎所有关系型数据库都支持其基础语法,而oracle作为甲骨文公司推出的商用数据库,在遵循sql标准的基础上扩展了大量自有语法,两者在实际使用中差异较为明显。

基础查询语法的差异
基础的SELECT查询语句两者核心逻辑一致,但在部分细节上有区别。比如oracle中可以使用DUAL伪表执行无表查询,而标准sql不需要伪表支持。
-- oracle无表查询示例 SELECT 1+1 FROM DUAL; -- 标准sql无表查询示例 SELECT 1+1;
分页语法的差异
分页是查询中常用的功能,标准sql通常使用LIMIT关键字实现,而oracle没有LIMIT语法,需要使用ROWNUM伪列配合子查询实现。
-- 标准sql分页,查询第11到20条数据
SELECT * FROM user_table LIMIT 10 OFFSET 10;
-- oracle分页,查询第11到20条数据
SELECT * FROM (
SELECT t.*, ROWNUM rn FROM (
SELECT * FROM user_table ORDER BY id
) t WHERE ROWNUM <= 20
) WHERE rn >= 11;
函数使用的差异
两者内置函数的命名和用法差异较大,以下是常见函数的对比:
| 功能 | 标准sql | Oracle |
|---|---|---|
| 获取当前时间 | NOW() | SYSDATE |
| 字符串拼接 | CONCAT(str1, str2) 或 || | CONCAT(str1, str2) 或 || |
| 空值处理 | COALESCE(col, default_val) | NVL(col, default_val) |
| 日期格式化 | DATE_FORMAT(date, format) | TO_CHAR(date, format) |
事务提交的差异
标准sql默认开启自动提交事务,执行DML语句后会自动提交,而oracle默认是手动提交事务,执行DML语句后需要显式执行COMMIT才能生效,否则断开连接后操作会回滚。
-- oracle中插入数据后需要手动提交 INSERT INTO user_table (id, name) VALUES (1, '张三'); COMMIT; -- 标准sql中插入数据会自动提交,不需要额外操作 INSERT INTO user_table (id, name) VALUES (1, '张三');
存储过程语法的差异
标准sql的存储过程语法相对简单,而oracle的存储过程基于PL_SQL语言,语法结构更复杂,支持更多高级特性。
-- oracle存储过程示例
CREATE OR REPLACE PROCEDURE update_user_name(
p_id IN NUMBER,
p_name IN VARCHAR2
) AS
BEGIN
UPDATE user_table SET name = p_name WHERE id = p_id;
COMMIT;
END update_user_name;
-- 标准sql存储过程示例(以MySQL为例)
DELIMITER //
CREATE PROCEDURE update_user_name(
IN p_id INT,
IN p_name VARCHAR(50)
)
BEGIN
UPDATE user_table SET name = p_name WHERE id = p_id;
END //
DELIMITER ;
字符串与日期处理的差异
oracle对日期和字符串的类型校验更严格,日期字符串需要使用TO_DATE函数转换,而标准sql可以直接使用字符串赋值给日期类型字段。
-- oracle插入日期需要转换
INSERT INTO order_table (id, order_date) VALUES (1, TO_DATE('2024-01-01', 'YYYY-MM-DD'));
-- 标准sql插入日期可以直接使用字符串
INSERT INTO order_table (id, order_date) VALUES (1, '2024-01-01');
除了上述差异外,oracle还支持包、触发器、游标等更多高级特性,这些在标准sql中要么没有对应语法,要么实现方式完全不同。开发者在实际使用中需要根据使用的数据库类型选择对应的语法,避免出现语句不兼容的问题。