SQL Server 和 MySQL 基础用法对比
一、数据库连接MySQLmysql -uroot -p切换数据库USE test;查看数据库SHOW DATABASES;查看当前数据库SELECT DATABASE();SQL Server连接一般使用SSMSSQL Server Management StudioAzure Data Studiosqlcmd切换数据库USE test; GO查看数据库SELECT name FROM sys.databases;查看当前数据库SELECT DB_NAME();二、创建数据库MySQLCREATE DATABASE test;删除DROP DATABASE test;SQL ServerCREATE 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_NAMEuser;四、创建表MySQLCREATE TABLE user( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT );SQL ServerCREATE TABLE [user]( id INT PRIMARY KEY IDENTITY(1,1), name VARCHAR(50), age INT );最大的区别MySQLAUTO_INCREMENTSQL ServerIDENTITY(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 age20;一样。排序SELECT * FROM user ORDER BY age DESC;一样。去重SELECT DISTINCT age FROM user;一样。分组SELECT age, COUNT(*) FROM user GROUP BY age;一样。七、分页这是最大的区别之一。MySQLSELECT * FROM user LIMIT 10;前10条。分页SELECT * FROM user LIMIT 20,10;表示跳过20条 取10条SQL Server2012SELECT * FROM user ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;必须有ORDER BY否则不能分页。SQL Server 老版本2008SELECT TOP 10 * FROM user;前10条。八、修改数据一样UPDATE user SET age30 WHERE id1;九、删除数据一样DELETE FROM user WHERE id1;清空表MySQLTRUNCATE TABLE user;SQL ServerTRUNCATE TABLE user;也一样。十、自增IDMySQLAUTO_INCREMENTSQL ServerIDENTITY(1,1)查看最后插入IDMySQLSELECT LAST_INSERT_ID();SQL ServerSELECT SCOPE_IDENTITY();十一、字符串拼接MySQLSELECT CONCAT(first_name,last_name);SQL ServerSELECT first_name last_name;或者SELECT CONCAT(first_name,last_name);SQL Server 2012 后也支持 CONCAT。十二、判断空值MySQLIFNULL(name,未知)SQL ServerISNULL(name,未知)或者COALESCE(name,未知)十三、条件判断MySQLIF(age18,成年,未成年)SQL Server没有 IF 函数。使用CASE WHEN age18 THEN 成年 ELSE 未成年 END实际上SQL Server 更推荐 CASE。十四、日期函数当前时间MySQLNOW()SQL ServerGETDATE()今天MySQLCURDATE()SQL ServerCAST(GETDATE() AS DATE)增加一天MySQLDATE_ADD(NOW(),INTERVAL 1 DAY)SQL ServerDATEADD(DAY,1,GETDATE())日期差MySQLDATEDIFF(date1,date2)SQL ServerDATEDIFF(DAY,date1,date2)SQL Server 必须指定单位。十五、字符串长度MySQLLENGTH(name)字节数字符数CHAR_LENGTH(name)SQL ServerLEN(name)注意SQL ServerLEN() 不会统计尾部空格十六、修改字段MySQLALTER TABLE user ADD phone VARCHAR(20);SQL Server一样ALTER TABLE user ADD phone VARCHAR(20);删除字段ALTER TABLE user DROP COLUMN phone;一样。十七、事务MySQLSTART TRANSACTION; UPDATE account SET moneymoney-100 WHERE id1; UPDATE account SET moneymoney100 WHERE id2; COMMIT;回滚ROLLBACK;SQL ServerBEGIN TRANSACTION; UPDATE account SET moneymoney-100 WHERE id1; UPDATE account SET moneymoney100 WHERE id2; COMMIT TRANSACTION;回滚ROLLBACK TRANSACTION;十八、变量MySQLSET nameTom; SELECT name;SQL ServerDECLARE name VARCHAR(20); SET nameTom; SELECT name;十九、注释两者一致单行-- 注释多行/* 注释 */二十、常见数据类型对比类型MySQLSQL Server整数INTINT大整数BIGINTBIGINT小整数SMALLINTSMALLINT布尔BOOLEAN实际为 TINYINT(1)BIT浮点FLOAT、DOUBLEFLOAT、REAL定点DECIMALDECIMAL、NUMERIC字符串VARCHARVARCHAR、NVARCHAR长文本TEXTVARCHAR(MAX)、NVARCHAR(MAX)日期DATEDATE日期时间DATETIME、TIMESTAMPDATETIME、DATETIME2二进制BLOBVARBINARY(MAX)JSONJSONNVARCHAR JSON 函数2016或 JSON 支持二十一、常用语法差异速查功能MySQLSQL Server自增主键AUTO_INCREMENTIDENTITY(1,1)查看前 N 条LIMIT 10TOP 10分页LIMIT offset,countOFFSET ... FETCH当前时间NOW()GETDATE()空值处理IFNULL()ISNULL()条件表达式IF()CASE WHEN字符串拼接CONCAT()或CONCAT()最后插入 IDLAST_INSERT_ID()SCOPE_IDENTITY()开启事务START TRANSACTIONBEGIN 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增删改查和事务控制上的核心思想基本一致掌握这些语法映射后大多数日常开发工作都可以快速适应。

相关新闻