SQL Server 实用教程
本教程将带你一步步掌握SQL Server,从安装配置到高级查询,再到管理和性能优化。

第一部分:基础入门
第一章:SQL Server 简介
-
什么是SQL Server?
- SQL Server是由Microsoft开发的关系型数据库管理系统,它使用标准的SQL语言进行数据查询、插入、更新和删除。
- 它不仅仅是一个数据库引擎,还包含了商业智能、数据分析和报表等一系列强大的工具和服务。
-
核心组件
- SQL Server Database Engine: 核心服务,负责存储、处理和保护数据,这是我们最常打交道的一部分。
- SQL Server Management Studio (SSMS): 主要的管理工具,用于编写和执行T-SQL代码、管理数据库、查看性能等。
- SQL Server Integration Services (SSIS): 企业级数据集成、转换和迁移平台。
- SQL Server Analysis Services (SSAS): 用于在线分析处理和数据挖掘。
- SQL Server Reporting Services (SSRS): 用于创建和管理报表。
-
版本选择
- SQL Server Express: 免费版,功能有限,适合学习和小型应用,有数据库大小和内存使用的限制。
- Developer Edition: 功能与Enterprise版完全相同,但仅用于开发和测试,不能用于生产环境,对学习者和开发者来说是最好的选择。
- Standard / Enterprise Edition: 商业版,功能更强大,适用于生产环境,需要付费许可证。
第二章:安装与配置
-
下载
(图片来源网络,侵删)- 访问 Microsoft SQL Server Evaluation Center 下载你需要的版本(推荐Developer版)。
-
安装步骤
- 运行安装程序,选择“基本”或“自定义”安装。
- 基本安装: 适合新手,会自动选择默认配置。
- 自定义安装: 适合有经验的用户,可以更精细地控制组件和路径。
- 关键步骤:
- 产品密钥: 如果是Express版,无需密钥;Developer版,选择“具有免费许可的 developer edition”。
- 功能选择: 至少勾选
Database Engine Services和SQL Server Management Studio (SSMS)。 - 服务器配置: 设置服务账户和身份验证模式。
- 身份验证模式:
- Windows 身份验证: 默认模式,只能使用Windows登录账户访问SQL Server,更安全。
- 混合模式: 同时支持Windows身份验证和SQL Server身份验证(即用户名和密码),你需要为
sa账户设置一个强密码。
-
连接与验证
- 安装完成后,打开 SQL Server Management Studio (SSMS)。
- 在连接窗口中,输入服务器名称(通常是你的机器名或
localhost),选择身份验证模式(如果是混合模式,输入用户名sa和你设置的密码),点击“连接”。
第二部分:核心概念与T-SQL
第三章:数据库与表
- 数据库: 一个存储数据的容器。
- 表: 数据库中存储数据的结构化对象,由行和列组成。
- 主键: 表中唯一标识每一行记录的列或列组合,不能为空且必须唯一。
- 外键: 用于在两个表之间建立链接,确保数据的引用完整性,一个表的外键是另一个表的主键。
第四章:T-SQL 基础语法
T-SQL是SQL Server的查询语言,是标准SQL的超集。
数据定义语言
用于创建、修改和删除数据库对象。

-- 创建数据库
CREATE DATABASE MySchool;
GO -- GO是批处理分隔符,表示前面的命令执行完毕
-- 使用数据库
USE MySchool;
GO
-- 创建表
CREATE TABLE Students (
StudentID INT PRIMARY KEY, -- 主键
Name NVARCHAR(50) NOT NULL, -- 非空
Age INT,
EnrollmentDate DATE
);
CREATE TABLE Courses (
CourseID INT PRIMARY KEY,
CourseName NVARCHAR(100) NOT NULL,
Credits INT
);
-- 创建关联表(多对多关系)
CREATE TABLE Enrollments (
EnrollmentID INT PRIMARY KEY,
StudentID INT FOREIGN KEY REFERENCES Students(StudentID), -- 外键
CourseID INT FOREIGN KEY REFERENCES Courses(CourseID), -- 外键
Grade DECIMAL(4, 2)
);
数据操作语言
用于操作表中的数据。
-- 插入数据
INSERT INTO Students (StudentID, Name, Age, EnrollmentDate)
VALUES (1, '张三', 20, '2025-09-01'),
(2, '李四', 21, '2025-09-01');
INSERT INTO Courses (CourseID, CourseName, Credits)
VALUES (101, '数据库原理', 4),
(102, '计算机网络', 3);
-- 查询数据
-- SELECT ... FROM ... WHERE
SELECT * FROM Students;
SELECT Name, Age FROM Students WHERE Age > 20;
-- 更新数据
UPDATE Students
SET Age = 22
WHERE Name = '张三';
-- 删除数据
DELETE FROM Students
WHERE StudentID = 2;
数据查询语言
这是最核心、最常用的部分。
-- 基础查询 SELECT StudentID, Name FROM Students; -- 使用WHERE子句过滤 SELECT * FROM Students WHERE EnrollmentDate > '2025-01-01'; -- 使用ORDER BY排序 SELECT * FROM Students ORDER BY Age DESC; -- DESC降序, ASC升序(默认) -- 使用聚合函数 SELECT COUNT(*) AS TotalStudents FROM Students; SELECT AVG(Age) AS AverageAge FROM Students; -- 使用GROUP BY分组 SELECT COUNT(*) AS StudentCount, Department FROM Students GROUP BY Department; -- 使用HAVING过滤分组 SELECT Department, AVG(Age) AS AvgAge FROM Students GROUP BY Department HAVING AVG(Age) > 20;
多表连接
当数据分布在多个表中时,使用连接来获取关联数据。
-- 内连接: 只返回两个表中匹配的行
SELECT
S.Name AS StudentName,
C.CourseName
FROM Students AS S
INNER JOIN Enrollments AS E ON S.StudentID = E.StudentID
INNER JOIN Courses AS C ON E.CourseID = C.CourseID;
-- 左连接: 返回左表的所有行,以及右表中匹配的行,如果右表没有匹配,则结果中右表的列为NULL。
SELECT
S.Name AS StudentName,
C.CourseName
FROM Students AS S
LEFT JOIN Enrollments AS E ON S.StudentID = E.StudentID
LEFT JOIN Courses AS C ON E.CourseID = C.CourseID;
-- 这个查询可以找出所有没有选课的学生
-- 右连接: 与左连接相反,返回右表的所有行。
第三部分:进阶主题
第五章:视图
视图是一个虚拟表,其结果集由存储的查询定义,它不存储数据,而是动态生成。
- 用途: 简化复杂查询、隐藏数据复杂性、提供数据安全层。
-- 创建视图
CREATE VIEW v_StudentCourseInfo
AS
SELECT
S.Name AS StudentName,
C.CourseName,
E.Grade
FROM Students AS S
INNER JOIN Enrollments AS E ON S.StudentID = E.StudentID
INNER JOIN Courses AS C ON E.CourseID = C.CourseID;
-- 使用视图
SELECT * FROM v_StudentCourseInfo WHERE Grade > 90;
第六章:存储过程
存储过程是一组为了完成特定功能的预编译SQL语句集合,可以接受参数和返回结果。
- 优点: 提高性能、减少网络流量、增强安全性、代码重用。
-- 创建存储过程
CREATE PROCEDURE sp_GetStudentByAge
@MinAge INT,
@MaxAge INT
AS
BEGIN
SELECT * FROM Students WHERE Age BETWEEN @MinAge AND @MaxAge;
END;
GO
-- 执行存储过程
EXEC sp_GetStudentByAge @MinAge = 19, @MaxAge = 21;
第七章:事务
事务是一个工作单元,它确保一组数据库操作要么全部成功,要么全部失败回滚。
- ACID特性:
- 原子性: 事务不可分割。
- 一致性: 事务使数据库从一个有效状态转变为另一个有效状态。
- 隔离性: 并发事务之间不会互相干扰。
- 持久性: 一旦事务提交,其结果就是永久的。
BEGIN TRANSACTION; -- 开始事务
BEGIN TRY
-- 执行多个操作
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;
UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 2;
COMMIT TRANSACTION; -- 如果所有操作都成功,提交事务
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION; -- 如果发生错误,回滚所有操作
PRINT '事务已回滚';
END CATCH
第四部分:管理与优化
第八章:索引
索引是提高数据库查询性能的关键,它类似于书籍的目录,可以帮助数据库引擎快速定位数据。
- 聚集索引: 数据行的物理顺序与索引的顺序相同,一个表只能有一个聚集索引。
- 非聚集索引: 索引的顺序与数据行的物理顺序不同,一个表可以有多个非聚集索引。
-- 创建聚集索引 (通常在主键上自动创建) CREATE CLUSTERED INDEX IX_Students_Name ON Students(Name); -- 创建非聚集索引 CREATE NONCLUSTERED INDEX IX_Students_Age ON Students(Age);
注意: 索引虽然能加速查询,但会降低INSERT、UPDATE、DELETE的速度,并占用存储空间,只为经常用于查询条件的列创建索引。
第九章:执行计划
执行计划是SQL Server引擎执行查询的详细步骤,它是优化查询性能最重要的工具。
- 如何查看: 在SSMS中,右键点击查询,选择“显示实际的执行计划”或“包括实际的执行计划”。
- 如何阅读:
- 关注 成本:哪个操作消耗了最多的资源。
- 寻找 警告图标 (黄色三角形或红色感叹号),如“缺少索引”、“键查找”等。
- 理解操作符:如
Clustered Index Scan(全表扫描,性能差)、Index Seek(索引查找,性能好)。
第十章:常用函数
- 字符串函数:
LEN(),SUBSTRING(),REPLACE(),LOWER(),UPPER() - 日期函数:
GETDATE(),DATEADD(),DATEDIFF(),YEAR(),MONTH() - 转换函数:
CAST()(严格),CONVERT()(更灵活,可指定样式) - 条件函数:
IIF()(简单的if-then-else),CASE(多条件分支)
SELECT
Name,
CASE
WHEN Age < 20 THEN '青年'
WHEN Age BETWEEN 20 AND 25 THEN '壮年'
ELSE '其他'
END AS AgeGroup
FROM Students;
第五部分:最佳实践与总结
- 命名规范: 使用清晰、一致的命名规则(如
PascalCase或snake_case)。 - 注释: 为复杂的SQL代码和存储过程添加注释。
- 参数化查询: 在应用程序中,始终使用参数化查询或存储过程来防止SQL注入攻击。
- 最小权限原则: 为数据库用户授予完成其任务所需的最小权限。
- 定期备份: 制定并执行可靠的数据库备份策略(完整备份、差异备份、事务日志备份)。
- 监控性能: 定期检查慢查询和资源使用情况,利用执行计划进行优化。
学习资源推荐
- 官方文档: Microsoft Learn - SQL Server (最权威、最全面)
- 在线课程: Coursera, Udemy, 慕课网等平台上有大量SQL Server课程。
- 社区: Stack Overflow, CSDN, 博客园等。
这份教程为你提供了一个学习SQL Server的完整框架,从现在开始,动手安装、创建数据库、编写查询,在实践中不断加深理解,你很快就能成为一名SQL Server高手!
