一、数据库连接
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;
GO
SQL 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_INCREMENT
SQL 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_INCREMENT
SQL 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(增删改查)和事务控制上的核心思想基本一致,掌握这些语法映射后,大多数日常开发工作都可以快速适应。

1197

被折叠的 条评论
为什么被折叠?



