Appearance
一、SQL Server 基础操作速查
安装与启动
Windows 安装
shell
# 下载 SQL Server Express 版本
# 运行安装程序,选择基本安装类型
# 启动 SQL Server 服务
net start MSSQLSERVER
# 停止 SQL Server 服务
net stop MSSQLSERVER
# 重启 SQL Server 服务
net restart MSSQLSERVERLinux 安装
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;