445 words
2 minutes
SQL 系列(六):函数与语法差异

AI 智能总结

数据库 6 函数与语法差异#

三大数据库SQL标准语法互通,但内置函数、分页、主键自增、序列存在大量不兼容场景,跨库开发极易踩坑,本节汇总高频差异与示例代码。

一、分页语法(最经典语法鸿沟)#

-- MySQL LIMIT
SELECT * FROM t_user LIMIT 0,10;
-- SQLServer TOP(简易分页)
SELECT TOP 10 * FROM t_user;
-- Oracle ROWNUM 分页
SELECT * FROM (SELECT t.*,ROWNUM rn FROM t_user t) WHERE rn <=10;

二、自增主键 & 序列实现#

MySQL#

依靠 AUTO_INCREMENT,表内置自增,无独立序列对象

CREATE TABLE t_user(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32)
);

SQLServer#

使用 IDENTITY(起始值,步长)

CREATE TABLE t_user(
id INT PRIMARY KEY IDENTITY(1,1),
name VARCHAR(32)
);

Oracle#

没有自增属性,必须通过序列(Sequence)实现

CREATE SEQUENCE seq_user_id START WITH 1 INCREMENT BY 1;
INSERT INTO t_user(id,name) VALUES(seq_user_id.NEXTVAL,'test');

三、常用函数方言对比#

1. 字符串函数#

需求MySQLOracleSQLServer
字符串拼接CONCAT(a,b)a
获取子串SUBSTRING()SUBSTR()SUBSTRING()
获取长度LENGTH()LENGTH()LEN()
-- 拼接示例
SELECT CONCAT('hello','sql'); -- MySQL、SQLServer
SELECT 'hello'||'sql' FROM DUAL; -- Oracle

2. 日期函数#

-- 获取当前时间
SELECT NOW(); -- MySQL
SELECT SYSDATE FROM DUAL; -- Oracle
SELECT GETDATE(); -- SQLServer
-- 日期格式化
DATE_FORMAT(now(),'%Y-%m-%d'); -- MySQL
TO_CHAR(SYSDATE,'yyyy-mm-dd'); -- Oracle
CONVERT(VARCHAR,GETDATE(),23); -- SQLServer

3. 数值函数#

取绝对值:ABS() 三库通用;
随机数:

SELECT RAND(); -- MySQL
SELECT DBMS_RANDOM.VALUE FROM DUAL; -- Oracle
SELECT RAND(); -- SQLServer

四、其他隐性语法差异#

  1. 虚表:Oracle 查询必须带 FROM DUAL;MySQL、SQLServer 不需要;
  2. 字符串引号:都支持单引号;Oracle 双引号代表标识符;
  3. 空值处理函数
-- MySQL
IFNULL(col,'默认值')
-- Oracle
NVL(col,'默认值')
-- SQLServer
ISNULL(col,'默认值')

五、开发建议#

  1. 跨库项目尽量封装统一工具层,隔离分页、主键生成逻辑;
  2. 优先使用标准SQL,少用数据库私有函数;
  3. 分页、日期格式化、空值替换是移植时最高发的报错点。
SQL 系列(六):函数与语法差异
https://fuwari.vercel.app/posts/sql-series/sql-06-functions/
Author
Zero02
Published at
2025-05-06
License
CC BY-NC-SA 4.0