Skip to content

一、SQL Server 基础操作速查

安装与启动

Windows 安装

shell
# 下载 SQL Server Express 版本
# 运行安装程序,选择基本安装类型

# 启动 SQL Server 服务
net start MSSQLSERVER

# 停止 SQL Server 服务
net stop MSSQLSERVER

# 重启 SQL Server 服务
net restart MSSQLSERVER

Linux 安装

shell
# 添加 Microsoft 源
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list | sudo tee /etc/apt/sources.list.d/mssql-server.list

# 安装 SQL Server
sudo apt update
sudo apt install mssql-server

# 配置 SQL Server
sudo /opt/mssql/bin/mssql-conf setup

# 启动服务
sudo systemctl start mssql-server
sudo systemctl enable mssql-server

连接与认证

使用 sqlcmd 连接

shell
# 连接默认实例
sqlcmd -S localhost -U sa -P 'YourPassword'

# 连接命名实例
sqlcmd -S localhost\INSTANCE_NAME -U sa -P 'YourPassword'

# 连接指定数据库
sqlcmd -S localhost -U sa -P 'YourPassword' -d database_name

# 使用 Windows 身份验证
sqlcmd -S localhost -E

使用 SSMS 连接

服务器类型: 数据库引擎
服务器名称: localhost 或 localhost\INSTANCE_NAME
身份验证: Windows 身份验证 或 SQL Server 身份验证
用户名: sa
密码: YourPassword

数据库操作

创建与删除

sql
-- 创建数据库
CREATE DATABASE database_name;

-- 创建数据库(指定文件)
CREATE DATABASE database_name
ON PRIMARY (
  NAME = database_name_dat,
  FILENAME = 'C:\data\database_name.mdf',
  SIZE = 10MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB
)
LOG ON (
  NAME = database_name_log,
  FILENAME = 'C:\data\database_name_log.ldf',
  SIZE = 5MB,
  MAXSIZE = 50MB,
  FILEGROWTH = 2MB
);

-- 删除数据库
DROP DATABASE database_name;

-- 查看所有数据库
SELECT name FROM sys.databases;

-- 查看数据库详细信息
EXEC sp_helpdb database_name;

数据库备份与恢复

sql
-- 完整备份
BACKUP DATABASE database_name
TO DISK = 'C:\backup\database_name.bak'
WITH FORMAT, NAME = 'Full Backup';

-- 差异备份
BACKUP DATABASE database_name
TO DISK = 'C:\backup\database_name_diff.bak'
WITH DIFFERENTIAL, FORMAT;

-- 事务日志备份
BACKUP LOG database_name
TO DISK = 'C:\backup\database_name_log.trn'
WITH FORMAT;

-- 恢复数据库
RESTORE DATABASE database_name
FROM DISK = 'C:\backup\database_name.bak'
WITH REPLACE;

-- 恢复到特定时间点
RESTORE DATABASE database_name
FROM DISK = 'C:\backup\database_name.bak'
WITH STOPAT = '2026-08-26T12:00:00';

表操作

创建表

sql
CREATE TABLE users (
  id INT IDENTITY(1,1) PRIMARY KEY,
  username NVARCHAR(50) NOT NULL UNIQUE,
  email NVARCHAR(100),
  created_at DATETIME DEFAULT GETDATE()
);

查看表结构

sql
-- 查看表结构
EXEC sp_columns table_name;

-- 查看表约束
EXEC sp_pkeys table_name;

-- 查看所有表
SELECT * FROM INFORMATION_SCHEMA.TABLES;

-- 查看列信息
SELECT column_name, data_type, is_nullable
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_name';

修改表

sql
-- 添加列
ALTER TABLE table_name ADD column_name data_type;

-- 修改列类型
ALTER TABLE table_name ALTER COLUMN column_name new_type;

-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;

-- 重命名表
EXEC sp_rename 'old_name', 'new_name';

-- 重命名列
EXEC sp_rename 'table_name.old_column', 'new_column', 'COLUMN';

数据操作

插入数据

sql
-- 插入单行
INSERT INTO users (username, email) VALUES ('john', 'john@example.com');

-- 插入多行
INSERT INTO users (username, email) VALUES
  ('alice', 'alice@example.com'),
  ('bob', 'bob@example.com');

-- 插入查询结果
INSERT INTO users (username, email)
SELECT username, email FROM temp_users;

-- 插入并返回生成的ID
INSERT INTO users (username, email) VALUES ('john', 'john@example.com');
SELECT SCOPE_IDENTITY();

查询数据

sql
-- 基本查询
SELECT * FROM users;

-- 条件查询
SELECT * FROM users WHERE username = 'john';

-- 排序
SELECT * FROM users ORDER BY created_at DESC;

-- 分页
SELECT * FROM users ORDER BY id
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

-- 聚合函数
SELECT COUNT(*), AVG(id) FROM users;

-- 分组
SELECT username, COUNT(*) FROM users GROUP BY username;

-- 连接查询
SELECT u.username, o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

更新数据

sql
-- 更新单行
UPDATE users SET email = 'new@example.com' WHERE id = 1;

-- 更新多行
UPDATE users SET email = 'updated@example.com' WHERE username LIKE 'a%';

-- 使用 TOP 限制更新数量
UPDATE TOP (10) users SET email = 'updated@example.com';

删除数据

sql
-- 删除单行
DELETE FROM users WHERE id = 1;

-- 删除所有数据
DELETE FROM users;

-- 清空表
TRUNCATE TABLE users;

-- 使用 TOP 限制删除数量
DELETE TOP (10) FROM users;

索引操作

创建索引

sql
-- 创建非聚集索引
CREATE INDEX idx_users_email ON users(email);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_users_username ON users(username);

-- 创建复合索引
CREATE INDEX idx_users_username_email ON users(username, email);

-- 查看表索引
EXEC sp_helpindex table_name;

删除索引

sql
DROP INDEX idx_users_email ON users;

用户与权限

创建登录名

sql
-- 创建 SQL Server 登录名
CREATE LOGIN username WITH PASSWORD = 'password';

-- 创建 Windows 登录名
CREATE LOGIN [DOMAIN\username] FROM WINDOWS;

创建数据库用户

sql
-- 创建数据库用户
CREATE USER username FOR LOGIN username;

-- 创建用户映射到登录名
CREATE USER username FOR LOGIN username WITH DEFAULT_SCHEMA = dbo;

授权

sql
-- 授予数据库权限
GRANT CONNECT TO username;
GRANT SELECT, INSERT, UPDATE ON users TO username;

-- 撤销权限
REVOKE SELECT ON users FROM username;

-- 查看权限
EXEC sp_helprotect 'users';

性能优化

查看查询计划

sql
-- 启用执行计划显示
SET STATISTICS IO ON;
SET STATISTICS TIME ON;

-- 查看查询计划
SET SHOWPLAN_ALL ON;
SELECT * FROM users WHERE username = 'john';
SET SHOWPLAN_ALL OFF;

查看慢查询

sql
-- 查看长时间运行的查询
SELECT 
  session_id,
  start_time,
  status,
  command,
  text
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE DATEDIFF(minute, start_time, GETDATE()) > 5;

查看连接数

sql
-- 查看当前连接数
SELECT COUNT(*) FROM sys.dm_exec_connections;

-- 查看活动连接
SELECT 
  session_id,
  login_name,
  host_name,
  program_name,
  status
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;

常用函数

字符串函数

sql
-- 长度
SELECT LEN('hello');

-- 拼接
SELECT 'hello' + ' ' + 'world';

-- 替换
SELECT REPLACE('hello world', 'world', 'SQL Server');

-- 截取
SELECT SUBSTRING('hello world', 1, 5);

-- 大小写转换
SELECT UPPER('hello');
SELECT LOWER('HELLO');

日期函数

sql
-- 当前时间
SELECT GETDATE();
SELECT CURRENT_TIMESTAMP;

-- 日期加减
SELECT DATEADD(day, 1, GETDATE());
SELECT DATEADD(month, -1, GETDATE());

-- 日期差
SELECT DATEDIFF(day, '2026-01-01', GETDATE());

-- 日期格式化
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss');

数学函数

sql
-- 绝对值
SELECT ABS(-10);

-- 四舍五入
SELECT ROUND(3.14159, 2);

-- 取模
SELECT 10 % 3;

-- 随机数
SELECT RAND();

系统信息

查看版本

sql
SELECT @@VERSION;
SELECT SERVERPROPERTY('ProductVersion');
SELECT SERVERPROPERTY('ProductLevel');

查看数据库大小

sql
-- 查看数据库大小
EXEC sp_spaceused;

-- 查看表大小
EXEC sp_spaceused 'table_name';

查看活动连接

sql
-- 查看活动连接
SELECT 
  session_id,
  login_name,
  host_name,
  program_name,
  status,
  login_time
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;

紧急处理

终止查询

sql
-- 终止指定查询
KILL session_id;

-- 查找并终止长时间运行的查询
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql = @sql + 'KILL ' + CAST(session_id AS NVARCHAR) + '; '
FROM sys.dm_exec_requests
WHERE DATEDIFF(minute, start_time, GETDATE()) > 30;
EXEC sp_executesql @sql;

锁定处理

sql
-- 查看锁定
SELECT 
  request_session_id,
  resource_type,
  resource_database_id,
  resource_associated_entity_id,
  request_mode,
  request_status
FROM sys.dm_tran_locks;

-- 查看阻塞
SELECT 
  blocking_session_id,
  session_id,
  wait_type,
  wait_time,
  wait_resource
FROM sys.dm_exec_requests
WHERE blocking_session_id > 0;

-- 终止阻塞会话
KILL blocking_session_id;

日志管理

查看日志

sql
-- 查看事务日志使用情况
DBCC SQLPERF(logspace);

-- 查看日志文件信息
SELECT 
  name,
  physical_name,
  size,
  max_size,
  growth
FROM sys.master_files
WHERE type_desc = 'LOG';

日志备份与清理

sql
-- 备份事务日志
BACKUP LOG database_name
TO DISK = 'C:\backup\database_name_log.trn'
WITH FORMAT;

-- 收缩日志文件
DBCC SHRINKFILE (database_name_log, 10);

自动化任务

创建作业

sql
-- 创建作业
EXEC sp_add_job @job_name = 'Daily Backup Job';

-- 添加作业步骤
EXEC sp_add_jobstep
  @job_name = 'Daily Backup Job',
  @step_name = 'Full Backup',
  @subsystem = 'TSQL',
  @command = 'BACKUP DATABASE database_name TO DISK = ''C:\backup\daily.bak''';

-- 创建调度
EXEC sp_add_jobschedule
  @job_name = 'Daily Backup Job',
  @name = 'Daily Schedule',
  @freq_type = 4,  -- 每天
  @freq_interval = 1,
  @active_start_time = 020000;  -- 凌晨2点

-- 将作业分配给本地服务器
EXEC sp_add_jobserver @job_name = 'Daily Backup Job', @server_name = '(LOCAL)';

创建警报

sql
-- 创建警报
EXEC sp_add_alert
  @name = 'High CPU Alert',
  @message_id = 883,
  @severity = 16,
  @enabled = 1,
  @delay_between_responses = 60,
  @include_event_description_in = 1;

常用系统存储过程

sql
-- 查看服务器配置
EXEC sp_configure;

-- 查看锁信息
EXEC sp_lock;

-- 查看进程信息
EXEC sp_who;

-- 查看活动进程
EXEC sp_who2;

-- 查看表结构
EXEC sp_help 'table_name';

-- 查看视图定义
EXEC sp_helptext 'view_name';

-- 查看存储过程定义
EXEC sp_helptext 'procedure_name';

二、性能分析

sql
SELECT
    r.session_id,
    r.status,
    r.command,
    r.cpu_time,
    r.total_elapsed_time,
    r.reads,
    r.writes,
    r.logical_reads,
    r.wait_type,
    r.wait_time,
    r.blocking_session_id,
    DB_NAME(r.database_id) AS database_name,
    s.login_name,
    s.host_name,
    s.program_name,
    t.text AS sql_text
FROM sys.dm_exec_requests r
INNER JOIN sys.dm_exec_sessions s
    ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id <> @@SPID
ORDER BY r.total_elapsed_time DESC;

蜀ICP备2025150039号