功能点 | 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;