助您搞懂 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 (...);  -- 表名前加 #

九、数据类型的差异 

类型 Oracle MySQL SQL Server
字符串类型 VARCHAR2, CHAR VARCHAR, TEXT VARCHAR, NVARCHAR
数字类型 NUMBER INT, DECIMAL INT, FLOAT, DECIMAL
日期类型 DATE, TIMESTAMP DATETIME, DATE DATETIME, 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;

你可能感兴趣的:(server+SQL,数据库,oracle,mysql,sql,SQLserver,db)