Photo by Lorem Ipsum
445 words
2 minutes
SQL 系列(六):函数与语法差异
SQL 教程
Posts in this series (10)AI 智能总结
数据库 6 函数与语法差异
三大数据库SQL标准语法互通,但内置函数、分页、主键自增、序列存在大量不兼容场景,跨库开发极易踩坑,本节汇总高频差异与示例代码。
一、分页语法(最经典语法鸿沟)
-- MySQL LIMITSELECT * 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. 字符串函数
| 需求 | MySQL | Oracle | SQLServer |
|---|---|---|---|
| 字符串拼接 | CONCAT(a,b) | a | |
| 获取子串 | SUBSTRING() | SUBSTR() | SUBSTRING() |
| 获取长度 | LENGTH() | LENGTH() | LEN() |
-- 拼接示例SELECT CONCAT('hello','sql'); -- MySQL、SQLServerSELECT 'hello'||'sql' FROM DUAL; -- Oracle2. 日期函数
-- 获取当前时间SELECT NOW(); -- MySQLSELECT SYSDATE FROM DUAL; -- OracleSELECT GETDATE(); -- SQLServer
-- 日期格式化DATE_FORMAT(now(),'%Y-%m-%d'); -- MySQLTO_CHAR(SYSDATE,'yyyy-mm-dd'); -- OracleCONVERT(VARCHAR,GETDATE(),23); -- SQLServer3. 数值函数
取绝对值:ABS() 三库通用;
随机数:
SELECT RAND(); -- MySQLSELECT DBMS_RANDOM.VALUE FROM DUAL; -- OracleSELECT RAND(); -- SQLServer四、其他隐性语法差异
- 虚表:Oracle 查询必须带
FROM DUAL;MySQL、SQLServer 不需要; - 字符串引号:都支持单引号;Oracle 双引号代表标识符;
- 空值处理函数
-- MySQLIFNULL(col,'默认值')-- OracleNVL(col,'默认值')-- SQLServerISNULL(col,'默认值')五、开发建议
- 跨库项目尽量封装统一工具层,隔离分页、主键生成逻辑;
- 优先使用标准SQL,少用数据库私有函数;
- 分页、日期格式化、空值替换是移植时最高发的报错点。
SQL 系列(六):函数与语法差异
https://fuwari.vercel.app/posts/sql-series/sql-06-functions/