✅ 基于 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]
是保留字)