一、数据库连接
MySQL
mysql -uroot -p切换数据库
USE test;查看数据库
SHOW DATABASES;查看当前数据库
SELECT DATABASE();SQL Server
连接一般使用:
SSMS(SQL Server Management Studio)
Azure Data Studio
sqlcmd
切换数据库
USE test; GO查看数据库
SELECT name FROM sys.databases;查看当前数据库
SELECT DB_NAME();二、创建数据库
MySQL
CREATE DATABASE test;删除
DROP DATABASE test;SQL Server
CREATE DATABASE test; GO删除
DROP DATABASE test; GOSQL Server 通常使用
GO作为批处理结束符。
GO 不是 SQL 语句,而是客户端命令。
三、查看表
MySQL
查看所有表
SHOW TABLES;查看建表语句
SHOW CREATE TABLE user;查看字段
DESC user;SQL Server
查看所有表
SELECT * FROM sys.tables;或者
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES;查看字段
sp_help user;或者
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='user';四、创建表
MySQL
CREATE TABLE user( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT );SQL Server
CREATE TABLE [user]( id INT PRIMARY KEY IDENTITY(1,1), name VARCHAR(50), age INT );最大的区别:
MySQL
AUTO_INCREMENTSQL Server
IDENTITY(1,1)表示
起始值 = 1 步长 = 1五、插入数据
两者基本一致
INSERT INTO user(name,age) VALUES('Tom',18);批量插入
INSERT INTO user(name,age) VALUES ('Tom',18), ('Lucy',20), ('Jack',25);六、查询
查询全部
两者一样
SELECT * FROM user;条件查询
SELECT * FROM user WHERE age>20;一样。
排序
SELECT * FROM user ORDER BY age DESC;一样。
去重
SELECT DISTINCT age FROM user;一样。
分组
SELECT age, COUNT(*) FROM user GROUP BY age;一样。
七、分页
这是最大的区别之一。
MySQL
SELECT * FROM user LIMIT 10;前10条。
分页
SELECT * FROM user LIMIT 20,10;表示
跳过20条 取10条SQL Server(2012+)
SELECT * FROM user ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;必须有
ORDER BY否则不能分页。
SQL Server 老版本(2008)
SELECT TOP 10 * FROM user;前10条。
八、修改数据
一样
UPDATE user SET age=30 WHERE id=1;九、删除数据
一样
DELETE FROM user WHERE id=1;清空表
MySQL
TRUNCATE TABLE user;SQL Server
TRUNCATE TABLE user;也一样。
十、自增ID
MySQL
AUTO_INCREMENTSQL Server
IDENTITY(1,1)查看最后插入ID
MySQL
SELECT LAST_INSERT_ID();SQL Server
SELECT SCOPE_IDENTITY();十一、字符串拼接
MySQL
SELECT CONCAT(first_name,last_name);SQL Server
SELECT first_name + last_name;或者
SELECT CONCAT(first_name,last_name);SQL Server 2012 后也支持 CONCAT。
十二、判断空值
MySQL
IFNULL(name,'未知')SQL Server
ISNULL(name,'未知')或者
COALESCE(name,'未知')十三、条件判断
MySQL
IF(age>18,'成年','未成年')SQL Server
没有 IF 函数。
使用
CASE WHEN age>18 THEN '成年' ELSE '未成年' END实际上
SQL Server 更推荐 CASE。
十四、日期函数
当前时间
MySQL
NOW()SQL Server
GETDATE()今天
MySQL
CURDATE()SQL Server
CAST(GETDATE() AS DATE)增加一天
MySQL
DATE_ADD(NOW(),INTERVAL 1 DAY)SQL Server
DATEADD(DAY,1,GETDATE())日期差
MySQL
DATEDIFF(date1,date2)SQL Server
DATEDIFF(DAY,date1,date2)SQL Server 必须指定单位。
十五、字符串长度
MySQL
LENGTH(name)字节数
字符数
CHAR_LENGTH(name)SQL Server
LEN(name)注意
SQL Server
LEN() 不会统计尾部空格十六、修改字段
MySQL
ALTER TABLE user ADD phone VARCHAR(20);SQL Server
一样
ALTER TABLE user ADD phone VARCHAR(20);删除字段
ALTER TABLE user DROP COLUMN phone;一样。
十七、事务
MySQL
START TRANSACTION; UPDATE account SET money=money-100 WHERE id=1; UPDATE account SET money=money+100 WHERE id=2; COMMIT;回滚
ROLLBACK;SQL Server
BEGIN TRANSACTION; UPDATE account SET money=money-100 WHERE id=1; UPDATE account SET money=money+100 WHERE id=2; COMMIT TRANSACTION;回滚
ROLLBACK TRANSACTION;十八、变量
MySQL
SET @name='Tom'; SELECT @name;SQL Server
DECLARE @name VARCHAR(20); SET @name='Tom'; SELECT @name;十九、注释
两者一致
单行
-- 注释多行
/* 注释 */二十、常见数据类型对比
| 类型 | MySQL | SQL Server |
|---|---|---|
| 整数 | INT | INT |
| 大整数 | BIGINT | BIGINT |
| 小整数 | SMALLINT | SMALLINT |
| 布尔 | BOOLEAN(实际为 TINYINT(1)) | BIT |
| 浮点 | FLOAT、DOUBLE | FLOAT、REAL |
| 定点 | DECIMAL | DECIMAL、NUMERIC |
| 字符串 | VARCHAR | VARCHAR、NVARCHAR |
| 长文本 | TEXT | VARCHAR(MAX)、NVARCHAR(MAX) |
| 日期 | DATE | DATE |
| 日期时间 | DATETIME、TIMESTAMP | DATETIME、DATETIME2 |
| 二进制 | BLOB | VARBINARY(MAX) |
| JSON | JSON | NVARCHAR + JSON 函数(2016+)或 JSON 支持 |
二十一、常用语法差异速查
| 功能 | MySQL | SQL Server |
|---|---|---|
| 自增主键 | AUTO_INCREMENT | IDENTITY(1,1) |
| 查看前 N 条 | LIMIT 10 | TOP 10 |
| 分页 | LIMIT offset,count | OFFSET ... FETCH |
| 当前时间 | NOW() | GETDATE() |
| 空值处理 | IFNULL() | ISNULL() |
| 条件表达式 | IF() | CASE WHEN |
| 字符串拼接 | CONCAT() | +或CONCAT() |
| 最后插入 ID | LAST_INSERT_ID() | SCOPE_IDENTITY() |
| 开启事务 | START TRANSACTION | BEGIN TRANSACTION |
| 批处理结束 | 无 | GO(客户端命令) |
总结
对于熟悉 MySQL 的开发者来说,迁移到 SQL Server 时主要需要关注以下几个差异:
自增列:
AUTO_INCREMENT→IDENTITY(1,1)分页查询:
LIMIT→OFFSET ... FETCH(或旧版TOP)内置函数:如
NOW()→GETDATE()、IFNULL()→ISNULL()、IF()→CASE变量声明:SQL Server 需要使用
DECLARE显式声明变量。批处理分隔符:
GO是客户端批处理命令,不属于 SQL 标准,常见于 SSMS 和sqlcmd。
整体而言,两者在 DDL(建表)、DML(增删改查)和事务控制上的核心思想基本一致,掌握这些语法映射后,大多数日常开发工作都可以快速适应。