🗃️ SQL Server 速查手册(T-SQL 快速参考)

✅ 基于 T-SQL(Transact-SQL)
📌 注意:与 MySQL / PostgreSQL 语法有显著差异(如 TOPIDENTITY、系统视图等)

🔌 一、连接与基础操作

功能命令 / 工具
连接本地实例sql sqlcmd -S . -U sa -P 'password'
连接命名实例sql sqlcmd -S .\SQLEXPRESS -U user -P pass
使用 Windows 身份验证sql sqlcmd -S . -E
查看版本sql SELECT @@VERSION;
查看当前数据库sql SELECT DB_NAME();
切换数据库sql USE [DatabaseName];
退出 sqlcmd输入 QUITEXIT
💡 图形工具推荐:SQL Server Management Studio (SSMS)Azure Data Studio

🗃️ 二、数据库(Database)操作

功能T-SQL 命令
列出所有数据库sql SELECT name FROM sys.databases;
创建数据库sql CREATE DATABASE MyDB;
创建带文件路径的库(可选)sql CREATE DATABASE MyDB ON (NAME = 'MyDB_Data', FILENAME = 'C:\Data\MyDB.mdf') LOG ON (NAME = 'MyDB_Log', FILENAME = 'C:\Log\MyDB.ldf');
删除数据库sql DROP DATABASE MyDB;
备份数据库sql BACKUP DATABASE MyDB TO DISK = 'C:\Backup\MyDB.bak';
还原数据库sql RESTORE DATABASE MyDB FROM DISK = 'C:\Backup\MyDB.bak' WITH REPLACE;
查看数据库状态sql SELECT name, state_desc FROM sys.databases;
⚠️ Azure SQL Database 不支持 BACKUP DATABASE,需用 自动备份导出为 BACPAC

📋 三、表(Table)操作

功能T-SQL 命令
列出当前库所有用户表sql SELECT name FROM sys.tables;
查看表结构sql EXEC sp_columns 'TableName'; -- 或 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableName';
创建表(含自增主键)sql CREATE TABLE Users ( Id INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(100) NOT NULL, Email VARCHAR(255) UNIQUE );
删除表sql DROP TABLE Users;
清空表(保留结构)sql TRUNCATE TABLE Users;
修改表结构(添加列)sql ALTER TABLE Users ADD Age INT;
修改列类型sql ALTER TABLE Users ALTER COLUMN Name NVARCHAR(200);
删除列sql ALTER TABLE Users DROP COLUMN Age;
重命名表sql EXEC sp_rename 'OldName', 'NewName';
重命名列sql EXEC sp_rename 'TableName.OldCol', 'NewCol', 'COLUMN';
💡 SQL Server 使用 IDENTITY 实现自增,而非 AUTO_INCREMENT

📊 四、数据操作(DML)

功能T-SQL 命令
插入数据sql INSERT INTO Users (Name, Email) VALUES ('Alice', 'alice@example.com');
插入多行sql INSERT INTO Users (Name, Email) VALUES ('Bob', 'bob@example.com'), ('Carol', 'carol@example.com');
查询(带 TOP)sql SELECT TOP 10 * FROM Users; -- 等价于 LIMIT
条件查询sql SELECT * FROM Users WHERE Age > 18;
排序sql SELECT * FROM Users ORDER BY Name ASC;
分页(SQL Server 2012+)sql SELECT * FROM Users ORDER BY Id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
更新sql UPDATE Users SET Age = 30 WHERE Name = 'Alice';
删除sql DELETE FROM Users WHERE Age < 18;
合并(UPSERT)sql MERGE Users AS target USING (VALUES ('Alice', 'alice@x.com')) AS source (Name, Email) ON target.Name = source.Name WHEN MATCHED THEN UPDATE SET Email = source.Email WHEN NOT MATCHED THEN INSERT (Name, Email) VALUES (source.Name, source.Email);

🔍 五、索引与约束

功能T-SQL 命令
创建索引sql CREATE INDEX IX_Users_Name ON Users (Name);
创建唯一索引sql CREATE UNIQUE INDEX UX_Users_Email ON Users (Email);
删除索引sql DROP INDEX IX_Users_Name ON Users;
添加主键sql ALTER TABLE Users ADD CONSTRAINT PK_Users PRIMARY KEY (Id);
添加外键sql ALTER TABLE Orders ADD CONSTRAINT FK_Orders_Users FOREIGN KEY (UserId) REFERENCES Users(Id);
查看索引sql EXEC sp_helpindex 'Users';

🔐 六、用户与权限(Security)

功能T-SQL 命令
创建登录(服务器级)sql CREATE LOGIN [app_user] WITH PASSWORD = 'StrongPass!';
创建数据库用户sql USE MyDB; CREATE USER [app_user] FOR LOGIN [app_user];
授予权限sql GRANT SELECT, INSERT ON Users TO [app_user];
撤销权限sql REVOKE INSERT ON Users FROM [app_user];
查看用户权限sql EXEC sp_helprotect @username = 'app_user';
角色管理sql ALTER ROLE db_datareader ADD MEMBER [app_user];
💡 SQL Server 权限模型:Login(服务器) → User(数据库) → Role/Permission

🧩 七、编程对象(视图 / 存储过程 / 函数 / 触发器)

对象示例
创建视图sql CREATE VIEW v_ActiveUsers AS SELECT Id, Name FROM Users WHERE Active = 1;
创建存储过程sql CREATE PROCEDURE GetUsers @MinAge INT AS BEGIN SELECT * FROM Users WHERE Age >= @MinAge; END;
调用:sql EXEC GetUsers @MinAge = 18;
创建标量函数sql CREATE FUNCTION dbo.AddOne(@x INT) RETURNS INT AS BEGIN RETURN @x + 1; END;
创建触发器sql CREATE TRIGGER tr_User_Insert ON Users AFTER INSERT AS BEGIN INSERT INTO UserLog SELECT Id, GETDATE() FROM inserted; END;
查看定义sql EXEC sp_helptext 'GetUsers';
💡 inserted / deleted 是 SQL Server 触发器中的虚拟表

🛠️ 八、系统视图与诊断

功能命令
查看当前会话sql SELECT * FROM sys.dm_exec_sessions WHERE session_id = @@SPID;
查看所有连接sql SELECT * FROM sys.dm_exec_connections;
查看正在运行的请求sql SELECT * FROM sys.dm_exec_requests;
终止会话sql KILL 54;
查看阻塞sql SELECT * FROM sys.dm_os_waiting_tasks WHERE blocking_session_id IS NOT NULL;
查看锁sql SELECT * FROM sys.dm_tran_locks;
查看执行计划(实际)在 SSMS 中点击 “Include Actual Execution Plan”
查看执行计划(文本)sql SET STATISTICS IO ON; SET STATISTICS TIME ON; SELECT * FROM Users;
查看错误日志sql EXEC xp_readerrorlog;

💾 九、备份与恢复(仅适用于本地/VM SQL Server)

操作命令
完整备份sql BACKUP DATABASE MyDB TO DISK = 'D:\Backup\MyDB.bak';
差异备份sql BACKUP DATABASE MyDB TO DISK = 'D:\Backup\MyDB_diff.bak' WITH DIFFERENTIAL;
日志备份(完整恢复模式)sql BACKUP LOG MyDB TO DISK = 'D:\Backup\MyDB_log.trn';
还原完整备份sql RESTORE DATABASE MyDB FROM DISK = 'D:\Backup\MyDB.bak' WITH REPLACE, RECOVERY;
还原到时间点sql RESTORE DATABASE MyDB FROM DISK = '...bak' WITH NORECOVERY; RESTORE LOG MyDB FROM DISK = '...trn' WITH STOPAT = '2025-10-01 14:30:00', RECOVERY;
⚠️ Azure SQL Database 使用 自动备份 + 时间点还原(PITR),无需手动 BACKUP

📌 十、常用系统函数与全局变量

类别示例
字符串LEN(), SUBSTRING(), CONCAT(), ISNULL(col, 'default')
日期GETDATE(), SYSDATETIME(), DATEADD(day, 1, GETDATE()), DATEDIFF(day, d1, d2)
聚合COUNT(), SUM(), AVG(), MIN(), MAX()
全局变量@@IDENTITY, @@ROWCOUNT, @@ERROR, @@VERSION, @@SPID
条件逻辑CASE WHEN ... THEN ... ELSE ... END

提示

  • SQL Server 默认不区分大小写(取决于排序规则,如 SQL_Latin1_General_CP1_CI_ASCI = Case Insensitive)
  • 字符串使用 单引号 ',标识符可用 方括号 [ ] 转义(如 [Order] 是保留字)

添加新评论