不同RDBMS的SQL语法差异及Mode教程兼容数据库咨询
SQL语法在不同RDBMS中的差异:MySQL vs T-SQL vs PL/SQL
刚啃完Mode的MySQL SQL教程,想拓展到其他关系型数据库?我来帮你理清楚不同RDBMS之间的语法差异,尤其是你重点关注的MS SQL Server(T-SQL)和Oracle(PL/SQL),顺便告诉你哪些数据库能直接复用你已经学的知识。
一、通用SQL基础:大部分RDBMS都一致的内容
先放个定心丸:Mode教程里教的核心SQL基础,在绝大多数RDBMS里都是通用的,因为它们都遵循ANSI SQL标准:
- 基础查询结构:
SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY这些核心子句,写法完全一致。 - 常用聚合函数:
COUNT()、SUM()、AVG()、MAX()、MIN(),还有LIKE、IN、BETWEEN、JOIN(内连接、外连接)这些操作符,几乎没有区别。
二、核心差异:MySQL vs T-SQL vs PL/SQL
接下来是你关心的具体差异,主要集中在函数、日期处理、分页、高级特性这些方面:
1. 字符串拼接
- MySQL:默认用
CONCAT()函数,比如SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;;也可以开启参数后用||,但不如CONCAT()常用。 - T-SQL:传统用
+运算符,比如SELECT first_name + ' ' + last_name AS full_name FROM users;;SQL Server 2012及以后也支持CONCAT()函数。 - Oracle:默认用
||运算符,比如SELECT first_name || ' ' || last_name AS full_name FROM users;,也支持CONCAT()但只能传两个参数。
2. 日期时间处理
- MySQL:用
NOW()获取当前时间,DATE_ADD()/DATE_SUB()做日期加减,比如SELECT DATE_ADD(created_at, INTERVAL 7 DAY) AS next_week FROM orders; - T-SQL:用
GETDATE()或SYSDATETIME()获取当前时间,DATEADD()函数统一处理加减,比如SELECT DATEADD(DAY, 7, created_at) AS next_week FROM orders; - Oracle:用
SYSDATE获取当前时间,日期加减直接用算术运算(比如加7就是7天后),月份加减用ADD_MONTHS(),比如SELECT created_at + 7 AS next_week FROM orders;
3. 分页查询
- MySQL:简洁的
LIMIT ... OFFSET,比如SELECT * FROM products LIMIT 10 OFFSET 20;(取第21-30条) - T-SQL:SQL Server 2012+用
OFFSET ... FETCH NEXT,比如SELECT * FROM products ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;;旧版本需要用TOP结合子查询实现。 - Oracle:12c以前用
ROWNUM(必须嵌套子查询排序),比如SELECT * FROM (SELECT * FROM products ORDER BY id) WHERE ROWNUM <=10;;12c及以后支持FETCH FIRST ... ROWS ONLY,写法和MySQL更接近。
4. 变量与高级编程特性
- MySQL:变量声明用
SET @var_name = 10;,存储过程/函数语法相对简单,功能偏向基础。 - T-SQL:变量需要先声明类型,比如
DECLARE @count INT; SET @count = 10;,存储过程支持TRY...CATCH异常处理、事务控制等更严谨的功能,还有TABLE变量这类实用特性。 - Oracle:PL/SQL是完整的块级编程语言,变量声明在
DECLARE块,存储过程/函数支持包、触发器、面向对象特性,功能复杂度远高于前两者,适合企业级复杂业务逻辑。
5. 数据类型细节
- MySQL:有特有的
ENUM、SET类型,DATETIME存日期+时间,DATE只存日期。 - T-SQL:用
NVARCHAR支持Unicode字符,SMALLDATETIME精度更低但占用空间小,还有TABLE变量类型可以临时存结果集。 - Oracle:用
NUMBER替代整数/小数类型,VARCHAR2替代VARCHAR(Oracle推荐用这个),DATE类型默认包含日期+时间,TIMESTAMP支持更高精度的时间戳。
三、哪些RDBMS可大部分复用Mode教程的语法?
如果不想重新学一套语法,这些数据库可以直接复用你在Mode中学的MySQL知识:
- MariaDB:MySQL的官方分支,几乎100%兼容MySQL语法,Mode教程里的内容直接照搬就行,连一些高级特性都完全一致。
- PostgreSQL:基础SQL语法和MySQL高度重合,比如
LIMIT分页、JOIN写法、聚合函数都一样;只有少数函数(比如字符串拼接默认用||)需要调整,核心查询逻辑完全通用。 - SQLite:轻量级嵌入式数据库,基础查询、排序、分组、连接这些内容和MySQL几乎没区别,适合快速原型测试,不过高级功能(比如存储过程、复杂函数)支持有限。
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

