助您搞懂 Oracle、MySQL 和 SQL Server 常用SQL 的语法区别。(欢迎朋友们在评论区补充)

功能点Oracle(偏企业大厂)MySQL(轻量、主流)SQL Server(微软系)
操作风格专业、规范简单、灵活接近 MySQL
常用于金融、银行、大型系统网站、电商、APP政府、企业办公系统

Oracle、MySQL 和 SQL Server 都支持标准 SQL,但它们在语法、函数、数据类型、系统对象等方面有一些差异。本文列出几类常用 SQL 语句在这三种数据库管理系统(DBMS)中的主要区别,适合快速对比:

一、拼接字符串的区别

-- Oracle
SELECT '你好' || '世界' FROM dual;

-- MySQL
SELECT CONCAT('你好', '世界');

-- SQL Server
SELECT '你好' + '世界';

二、分页查询(比如查第11到20条) 

-- Oracle 12c+
SELECT * FROM 表名 OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

-- MySQL
SELECT * FROM 表名 LIMIT 10, 10;

-- SQL Server
SELECT * FROM 表名 ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

三、自动增长的主键写法 

-- Oracle
CREATE TABLE t (
  id NUMBER GENERATED ALWAYS AS IDENTITY,
  name VARCHAR2(20)
);

-- MySQL
CREATE TABLE t (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(20)
);

-- SQL Server
CREATE TABLE t (
  id INT IDENTITY(1,1) PRIMARY KEY,
  name VARCHAR(20)
);

四、取当前时间  

-- Oracle
SELECT SYSDATE FROM dual;

-- MySQL
SELECT NOW();

-- SQL Server
SELECT GETDATE();

五、空值处理函数 

-- Oracle
SELECT NVL(name, '无名') FROM 表;

-- MySQL
SELECT IFNULL(name, '无名') FROM 表;

-- SQL Server
SELECT ISNULL(name, '无名') FROM 表;

六、字符串截取(从第2个字符起,取3个) 

-- Oracle
SELECT SUBSTR('ABCDEFG', 2, 3);  -- BCD

-- MySQL
SELECT SUBSTRING('ABCDEFG', 2, 3);  -- BCD

-- SQL Server
SELECT SUBSTRING('ABCDEFG', 2, 3);  -- BCD

七、使用某个数据库(MySQL和SQL Server有) 

-- MySQL
USE 数据库名;

-- SQL Server
USE 数据库名;

-- Oracle:不需要,登录时就选好了 schema(相当于数据库)

八、临时表写法(调试或中间表时用) 

-- Oracle
CREATE GLOBAL TEMPORARY TABLE temp1 (...);

-- MySQL
CREATE TEMPORARY TABLE temp1 (...);

-- SQL Server
CREATE TABLE #temp1 (...);  -- 表名前加 #

九、数据类型的差异 

类型OracleMySQLSQL Server
字符串类型VARCHAR2, CHARVARCHAR, TEXTVARCHAR, NVARCHAR
数字类型NUMBERINT, DECIMALINT, FLOAT, DECIMAL
日期类型DATE, TIMESTAMPDATETIME, DATEDATETIME, DATE, TIME
布尔类型没有 BOOLEAN(用 CHAR(1)BOOLEAN(本质是 tinyint)没有 BOOLEAN,用 BIT

十、IF 条件语句(逻辑判断) 

-- Oracle
SELECT CASE WHEN age > 18 THEN '成年人' ELSE '未成年' END FROM 表;

-- MySQL(还可以用 IF())
SELECT IF(age > 18, '成年人', '未成年') FROM 表;

-- SQL Server
SELECT CASE WHEN age > 18 THEN '成年人' ELSE '未成年' END FROM 表;

十一、存储过程/函数语法(写法不同) 

-- Oracle
CREATE OR REPLACE PROCEDURE myproc IS
BEGIN
  -- 操作语句
END;

-- MySQL
DELIMITER //
CREATE PROCEDURE myproc()
BEGIN
  -- 操作语句
END;
//

-- SQL Server
CREATE PROCEDURE myproc
AS
BEGIN
  -- 操作语句
END;

十二、LIMIT 以外的查询限制 

-- Oracle 旧版分页(ROWNUM)
SELECT * FROM (
  SELECT t.*, ROWNUM rn FROM 表 t WHERE ROWNUM <= 20
) WHERE rn > 10;

-- SQL Server 老版本(TOP)
SELECT TOP 10 * FROM 表;

十三、批量插入数据写法 

-- Oracle(多值插入需要 UNION)
INSERT INTO 表 (id, name)
SELECT 1, '张三' FROM dual
UNION ALL
SELECT 2, '李四' FROM dual;

-- MySQL 和 SQL Server
INSERT INTO 表 (id, name) VALUES
(1, '张三'),
(2, '李四');

十四、注释的写法

-- 单行注释

-- Oracle / MySQL / SQL Server 都支持
-- 这是注释

/* 多行注释 */
-- Oracle / MySQL / SQL Server 都支持
/*
这是多行注释
可以写很多说明
*/

十五、别名使用 AS 的区别 

-- Oracle 和 SQL Server 可以加也可以不加 AS
SELECT name AS 姓名 FROM users;
SELECT name 姓名 FROM users;

-- MySQL 建议加 AS,避免与关键字冲突
SELECT name AS 姓名 FROM users;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值