✅ 基于 T-SQL(Transact-SQL)
📌 注意:与 MySQL / PostgreSQL 语法有显著差异(如TOP、IDENTITY、系统视图等)
🔌 一、连接与基础操作
| 功能 | 命令 / 工具 |
|---|---|
| 连接本地实例 | 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 | 输入 QUIT 或 EXIT |
💡 图形工具推荐: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_AS中CI= Case Insensitive) - 字符串使用 单引号
',标识符可用 方括号[ ]转义(如[Order]是保留字)