SQL Server 开发综合教程
本教程旨在帮助您从零开始,系统性地学习 SQL Server 的开发技能,成为一名合格的 SQL Server 开发工程师。

第一部分:入门基础
这个阶段的目标是理解数据库的基本概念,并掌握最核心的查询语言 T-SQL。
模块 1:数据库与 SQL Server 简介
-
什么是数据库?
- 定义:一个有组织的数据集合。
- 数据库管理系统:用于管理数据库的软件(如 SQL Server, MySQL, Oracle)。
- 关系型数据库:基于关系模型,使用表、行和列来组织数据(SQL Server 是关系型数据库)。
-
SQL Server 是什么?
- 由微软开发的关系型数据库管理系统。
- 核心组件:
- SQL Server Database Engine:核心服务,负责存储、处理和保护数据。
- SQL Server Management Studio (SSMS):图形化管理工具,用于编写和执行 T-SQL、管理数据库对象。
- Transact-SQL (T-SQL):SQL Server 的增强版 SQL 语言,用于与数据库交互。
-
安装与配置
(图片来源网络,侵删)- 下载:从 Microsoft 官网下载 SQL Server Developer Edition(免费,功能齐全,适合开发学习)。
- 安装:运行安装程序,选择“基本”或“自定义”安装,对于初学者,“基本”模式通常足够。
- 配置:设置身份验证模式(推荐使用 混合模式,同时允许 Windows 身份验证和 SQL Server 身份验证,并设置一个
sa密码)。 - 连接:安装完成后,启动 SQL Server Management Studio (SSMS),使用服务器名称、身份验证和密码连接到你的数据库实例。
模块 2:T-SQL 基础查询
这是所有数据库操作的核心,必须熟练掌握。
-
核心概念
- 表:数据的二维结构,由行和列组成。
- 行:表中的一条记录。
- 列:记录中的一个字段/属性。
- 主键:唯一标识表中每一行的列或列组合,不能为空且必须唯一。
-
最核心的语句:
SELECT- 语法:
SELECT column1, column2, ... FROM table_name;
- 查询所有列:
SELECT * FROM Employees;
- 查询特定列:
SELECT FirstName, LastName FROM Employees;
- 语法:
-
数据过滤:
WHERE子句
(图片来源网络,侵删)- 语法:
SELECT column1, column2 FROM table_name WHERE condition;
- 常用运算符:
- (等于), 或
<>(不等于) >(大于),<(小于),>=(大于等于),<=(小于等于)AND,OR(逻辑与、或)BETWEEN ... AND ...(在...之间)IN (value1, value2, ...)(在列表中)LIKE(模式匹配)'A%'以 A 开头'%a'以 a 结尾'%a%'包含 a'A_'以 A 开头且后跟任意一个字符
IS NULL,IS NOT NULL(判断空值)
- (等于), 或
- 语法:
-
排序结果:
ORDER BY子句- 语法:
SELECT column1, column2 FROM table_name WHERE condition ORDER BY column1 ASC|DESC; -- ASC 升序 (默认), DESC 降序
- 多列排序:
ORDER BY LastName ASC, FirstName DESC;
- 语法:
-
聚合函数
COUNT(): 计算行数。SUM(): 计算数值总和。AVG(): 计算平均值。MAX(): 查找最大值。MIN(): 查找最小值。
-
分组数据:
GROUP BY子句- 通常与聚合函数一起使用,将结果按一个或多个列进行分组。
- 语法:
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE condition GROUP BY column_name;
- 示例:计算每个部门的员工数。
SELECT DepartmentID, COUNT(EmployeeID) AS NumberOfEmployees FROM Employees GROUP BY DepartmentID;
-
过滤分组:
HAVING子句WHERE用于过滤行,HAVING用于过滤分组。- 语法:
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE condition GROUP BY column_name HAVING aggregate_function condition;
- 示例:找出员工数超过 10 人的部门。
SELECT DepartmentID, COUNT(EmployeeID) AS EmployeeCount FROM Employees GROUP BY DepartmentID HAVING COUNT(EmployeeID) > 10;
第二部分:T-SQL 编程进阶
掌握了基础查询后,我们需要学习如何用 T-SQL 编写更复杂的程序逻辑。
模块 3:数据操作
-
插入数据:
INSERT INTO-- 插入完整行 INSERT INTO Employees (FirstName, LastName, HireDate) VALUES ('John', 'Doe', '2025-01-15'); -- 插入部分列 INSERT INTO Employees (FirstName, LastName) VALUES ('Jane', 'Smith'); -
更新数据:
UPDATE- ⚠️ 警告:务必先使用
WHERE子句,否则会更新整个表!UPDATE Employees SET HireDate = '2025-02-20' WHERE EmployeeID = 2;
- ⚠️ 警告:务必先使用
-
删除数据:
DELETE- ⚠️ 警告:务必先使用
WHERE子句,否则会删除整个表的所有数据!DELETE FROM Employees WHERE EmployeeID = 3;
- ⚠️ 警告:务必先使用
模块 4:多表查询
现实世界中,数据通常分布在多个相互关联的表中。
-
连接
INNER JOIN(内连接):返回两个表中连接字段相匹配的行。SELECT E.FirstName, E.LastName, D.DepartmentName FROM Employees AS E INNER JOIN Departments AS D ON E.DepartmentID = D.DepartmentID;
LEFT JOIN(左连接):返回左表的所有行,以及右表中匹配的行,如果右表没有匹配,则结果中右表的列为NULL。SELECT E.FirstName, D.DepartmentName FROM Employees AS E LEFT JOIN Departments AS D ON E.DepartmentID = D.DepartmentID;
RIGHT JOIN(右连接):与LEFT JOIN相反,返回右表的所有行。FULL OUTER JOIN(全外连接):返回左右两表的所有行,无论是否匹配。
-
集合运算
UNION: 合并两个SELECT语句的结果,并自动去除重复行。UNION ALL: 合并结果,但不去除重复行(性能更好)。INTERSECT: 返回两个SELECT语句的结果中都存在的行。EXCEPT: 返回存在于第一个SELECT语句结果中但不存在于第二个中的行。
模块 5:T-SQL 编程对象
-
变量
- 使用
DECLARE声明,使用SET或SELECT赋值。DECLARE @EmployeeCount INT; SET @EmployeeCount = (SELECT COUNT(*) FROM Employees); PRINT 'Total Employees: ' + CAST(@EmployeeCount AS VARCHAR(10));
- 使用
-
流程控制
BEGIN...END: 定义一个代码块。IF...ELSE: 条件判断。WHILE: 循环。CASE: 表达式,实现类似 switch-case 的逻辑。SELECT FirstName, Salary, CASE WHEN Salary > 100000 THEN 'High' WHEN Salary > 50000 THEN 'Medium' ELSE 'Low' END AS SalaryLevel FROM Employees;
-
事务
-
确保一组数据库操作要么全部成功,要么全部失败,保证数据的一致性。
-
语法:
BEGIN TRANSACTION; -- 开始事务 -- 执行 SQL 语句 UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1; UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 2; -- 检查是否成功 IF @@ERROR = 0 COMMIT TRANSACTION; -- 提交事务 ELSE ROLLBACK TRANSACTION; -- 回滚事务
-
-
存储过程
- 预编译的、可重用的 T-SQL 代码集合,用于封装业务逻辑。
- 创建:
CREATE PROCEDURE GetEmployeesByDepartment @DepartmentID INT AS BEGIN SELECT * FROM Employees WHERE DepartmentID = @DepartmentID; END; - 执行:
EXEC GetEmployeesByDepartment @DepartmentID = 5;
-
用户定义函数
-
接受参数、执行操作并返回结果的例程。
-
标量函数:返回一个单一的值(如字符串、数字)。
-
表值函数:返回一个表结果集。
-- 创建一个表值函数 CREATE FUNCTION dbo.GetEmployeesByDepartment_FN (@DepartmentID INT) RETURNS TABLE AS RETURN ( SELECT * FROM Employees WHERE DepartmentID = @DepartmentID ); -- 使用函数 SELECT * FROM dbo.GetEmployeesByDepartment_FN(5);
-
第三部分:数据库设计与高级主题
模块 6:数据库设计范式
- 第一范式 (1NF):确保列是原子的,不可再分。
- 第二范式 (2NF):在满足 1NF 的基础上,非主键列必须完全依赖于整个主键(针对复合主键)。
- 第三范式 (3NF):在满足 2NF 的基础上,非主键列之间不能有传递依赖。
- 反范式化:为了查询性能,有意识地违反范式,增加数据冗余。
模块 7:索引
- 是什么:一种数据结构,用于快速查找和检索数据,类似书的目录。
- 为什么需要:极大地提高
WHERE、JOIN、ORDER BY子句的查询速度。 - 类型:
- 聚集索引:表数据的物理存储顺序,一个表只能有一个聚集索引。
- 非聚集索引:一个指向数据行的指针,一个表可以有多个非聚集索引。
- 创建索引:
CREATE INDEX IX_Employees_LastName ON Employees(LastName);
模块 8:视图
- 是什么:一个虚拟的表,其结果集由存储的查询定义。
- 为什么需要:
- 简化复杂的查询。
- 提供数据安全,隐藏底层表的敏感列。
- 提供数据独立性,应用程序不依赖于底层表结构。
- 创建视图:
CREATE VIEW v_EmployeeDepartment AS SELECT E.FirstName, E.LastName, D.DepartmentName FROM Employees AS E INNER JOIN Departments AS D ON E.DepartmentID = D.DepartmentID;
第四部分:学习路径与资源推荐
学习路径建议
-
新手入门 (1-2周)
- 目标:安装环境,理解数据库基本概念,熟练掌握
SELECT,INSERT,UPDATE,DELETE和JOIN。 - 实践:创建一个简单的数据库(如
School),建几张表(Students,Courses,Enrollments),并不断练习查询它们。
- 目标:安装环境,理解数据库基本概念,熟练掌握
-
T-SQL 编程 (2-3周)
- 目标:掌握变量、流程控制、事务、存储过程和函数。
- 实践:为你的
School数据库创建一些存储过程,AddStudent,EnrollStudent,使用事务确保数据一致性。
-
进阶与优化 (持续学习)
- 目标:学习数据库设计、索引、视图、执行计划分析。
- 实践:分析你的查询性能,为频繁查询的列创建索引,学习如何使用 SSMS 的“执行计划”工具来优化慢查询。
-
高级主题 (可选)
- 目标:学习 SQL Server 的高级功能,如 XML/JSON 处理、窗口函数、CLR 集成、复制、高可用性等。
推荐资源
- 官方文档 (首选):Microsoft Learn - SQL Server
内容权威、准确、更新及时,是学习任何 Microsoft 技术的最好起点。
- 在线课程:
- Udemy: 搜索 "SQL Server for Developers" 或 "T-SQL",推荐讲师如 Ben Snaidero, Jag Reehal。
- Coursera / edX: 提供来自知名大学的系统性数据库课程。
- Bilibili / YouTube: 有大量免费的中文和英文视频教程。
- 书籍:
- 《SQL Server 2025 T-SQL Fundamentals》 (Ben Forta): 经典入门书籍,非常适合初学者。
- 《Microsoft SQL Server 2012 T-SQL Fundamentals》 (Itzik Ben-Gan): Itzik Ben-Gan 是 T-SQL 大师,他的书非常深入。
- 社区:
- Stack Overflow: 当你遇到具体问题时,这里是寻找答案的最佳地方。
- SQL Server Central: 一个非常活跃的 SQL Server 社区,有大量文章、论坛和问答。
祝您学习顺利,早日成为 SQL Server 开发专家!
