SQL Server 2022 从零安装到 T-SQL 实战入门教程

发布时间:2026/8/14 2:01:50
SQL Server 2022 从零安装到 T-SQL 实战入门教程 1. 从零到一为什么选择SQL Server作为你的第一个数据库如果你正准备踏入后端开发、数据分析或者任何需要处理结构化数据的领域那么学会使用一个数据库管理系统DBMS几乎是你的必修课。在众多选择中微软的SQL Server以其与Windows生态的深度集成、强大的企业级功能如高可用性、商业智能和相对友好的图形化管理工具成为了许多开发者和IT管理员特别是Windows环境下的首选。对于初学者而言它提供了一个从安装、配置到编写SQL语句的完整、可视化的学习路径这比一开始就面对命令行界面的数据库要友好得多。很多人第一次接触数据库时会被各种概念吓到实例、服务、数据库、表、T-SQL……感觉无从下手。这个教程的目的就是帮你把这些抽象的概念通过一次完整的、手把手的实操变成你电脑里一个可以真实连接、查询和操作的“数据仓库”。我们将从最基础的安装SQL Server 2022开始一步步配置好图形化管理工具SQL Server Management Studio (SSMS)最后深入到编写你的第一条乃至一系列实用的SQL语句。整个过程我会穿插我这些年从新手到老手踩过的坑和总结的经验让你少走弯路。2. 环境准备与SQL Server 2022的安装详解安装是万里长征的第一步也是最容易出问题的一步。很多人在这里遇到“安装失败”、“无法启动服务”就放弃了。其实只要遵循正确的步骤并理解其背后的逻辑安装可以非常顺利。2.1 安装前的关键决策版本与组件选择首先你需要从微软官网下载SQL Server 2022的安装程序。对于学习和开发我们绝对选择Developer版本。这个版本包含了企业版的所有功能但仅授权用于开发、测试和演示不能用于生产环境而且它是完全免费的。这是微软给开发者的福利一定要用起来。运行安装中心后你会看到几个安装类型选项。这里我强烈建议选择“自定义”安装而不是“基本”。虽然“基本”更简单但它会安装一个命名实例如MSSQLSERVER并且很多配置选项是默认的不利于你理解SQL Server的架构。自定义安装允许你清晰地看到并选择每一个组件。在功能选择界面你会看到一长串列表。对于初学者我们聚焦核心数据库引擎服务这是核心中的核心负责存储、处理和保护数据的服务。必须勾选。SQL Server 复制可选用于数据库之间的数据同步初期学习可以不选。机器学习服务和语言扩展可选如果你未来想用R或Python在数据库内做分析可以勾选但会显著增加安装时间和复杂度建议初次安装不选。客户端连接工具这包括了一些命令行工具建议勾选。文档和示例对于学习非常有帮助建议勾选。管理工具 - 基本和管理工具 - 完整这里就包含了我们后面要用的SQL Server Management Studio (SSMS)。但请注意新版的安装程序可能不包含SSMS需要你单独下载安装。这是一个常见的坑。最稳妥的做法是先通过自定义安装完成数据库引擎的安装然后再去微软官网单独下载并安装最新版的SSMS。我们稍后会详细讲。2.2 实例配置与服务账户理解数据库的“运行身份”接下来是关键的“实例配置”。你可以把它理解为一台电脑上可以安装多个“独立的”SQL Server软件。默认实例的名称是MSSQLSERVER使用默认的1433端口。如果你想在一台机器上安装多个不同版本的SQL Server比如同时有2019和2022用于测试就需要使用“命名实例”比如SQL2022。注意对于绝大多数单机学习环境选择“默认实例”即可这样在连接时直接使用计算机名或localhost就能连上更简单。然后是“服务器配置”这里设置服务账户。Windows服务都需要一个账户身份来运行。默认会使用NT Service\MSSQLSERVER这类虚拟账户它具有运行所需的最小权限相对安全。对于学习环境保持默认即可。但你需要知道如果未来遇到“服务启动失败”的问题很可能就是账户权限不足这时可以考虑将其改为具有更高权限的本地系统账户或域账户生产环境需谨慎。2.3 数据库引擎配置设置身份验证模式这是安装过程中最重要的一步直接关系到你以后如何登录数据库。身份验证模式务必选择“混合模式SQL Server身份验证和Windows身份验证”。如果只选Windows身份验证那么你只能使用当前的Windows账户登录在很多开发工具和远程连接场景下会非常不便。选择混合模式你才能设置我们熟悉的“用户名”和“密码”。指定SQL Server管理员你需要在这里为内置的sasystem administrator账户设置一个强密码。请务必记住这个密码这是数据库的最高权限账户。同时安装程序会自动将当前Windows用户添加为管理员这意味着你也可以用Windows账户登录。数据目录这里可以修改数据库文件.mdf,.ldf的默认存放路径。我个人的习惯是不会放在C盘系统盘而是专门指定一个空间较大的数据盘如D:\SQLData这样即使重装系统数据也能得以保留前提是备份了数据库文件。点击安装等待进度条完成。如果一切顺利你会看到“安装成功”的提示。但先别急着关检查一下服务是否真的启动了。按Win R输入services.msc在服务列表里找到SQL Server (MSSQLSERVER)查看其状态是否为“正在运行”。3. 安装与配置SQL Server Management Studio (SSMS)数据库引擎安装好了就像一个没有操作系统的电脑我们需要一个图形化的界面来管理它这就是SSMS。它是一个功能极其强大的集成环境用于访问、配置、管理和开发SQL Server的所有组件。3.1 独立下载与安装SSMS正如前面提到的SQL Server 2022的安装包可能不包含SSMS你需要单独去微软官网搜索“SQL Server Management Studio”进行下载。安装SSMS的过程非常简单基本上就是一路“下一步”。安装完成后你可以在开始菜单找到它。首次启动SSMS会弹出“连接到服务器”的对话框。这就是你登录数据库的入口。服务器类型选择“数据库引擎”。服务器名称如果你安装的是默认实例这里可以输入localhost、.一个点、(local)或者你的计算机名。它们都代表本机。我习惯用.最简洁。身份验证这里我们第一次登录可以使用“Windows身份验证”因为它使用了你当前Windows账户的权限无需密码。点击“连接”。如果连接成功你会进入SSMS的主界面。对象资源管理器窗口会显示你的服务器节点展开后能看到“数据库”、“安全性”、“管理”等文件夹。恭喜你你已经成功踏入了SQL Server的大门。3.2 使用SQL Server身份验证登录为了测试我们安装时设置的混合模式我们需要用sa账户登录一次。在SSMS中点击“文件”-“断开与对象资源管理器的连接”。然后点击“文件”-“连接对象资源管理器”。在服务器名称处同样输入.。身份验证选择“SQL Server身份验证”。登录名输入sa密码输入你安装时设置的密码。你可以勾选“记住密码”方便下次登录但要注意安全。点击“连接”。如果也能成功连接说明混合模式配置完全正确。以后在应用程序如Java、Python、.NET程序中连接数据库时使用的就是这种“SQL Server身份验证”模式需要提供服务器地址、用户名和密码。4. 初识T-SQL从创建数据库到基础查询连接上服务器后我们面对的是一个空的“数据库”文件夹。就像你要管理文件需要先有一个硬盘分区和文件夹一样我们需要先创建一个属于自己的数据库。4.1 创建你的第一个数据库与表在SSMS中有图形化操作和编写SQL语句两种方式。作为教程我们必须从SQL语句开始这是理解和操作数据库的根本。右键点击“数据库”文件夹选择“新建数据库”。在弹出的窗口中你可以在“数据库名称”处输入MyFirstDB其他选项暂时保持默认点击“确定”。这样你就通过图形界面创建了一个数据库。但更重要的是SSMS在点击“确定”前可以点击左上角的“脚本”按钮它会将你要执行的图形操作生成对应的SQL语句。对于这次创建生成的脚本类似于CREATE DATABASE [MyFirstDB] CONTAINMENT NONE ON PRIMARY ( NAME NMyFirstDB, FILENAME NC:\Program Files\...\MyFirstDB.mdf , SIZE 8192KB , FILEGROWTH 65536KB ) LOG ON ( NAME NMyFirstDB_log, FILENAME NC:\Program Files\...\MyFirstDB_log.ldf , SIZE 8192KB , FILEGROWTH 65536KB ) GO这条CREATE DATABASE语句就是T-SQLTransact-SQLSQL Server的SQL方言的命令。我们暂时不需要理解FILEGROWTH这些细节但要知道核心是CREATE DATABASE [数据库名]。接下来我们需要在这个数据库中创建表来存储数据。在对象资源管理器中展开MyFirstDB右键“表”选择“新建表”。我们设计一个简单的Students学生表。在图形界面中我们添加几列StudentID(int类型主键非空)Name(nvarchar(50)类型非空)Age(int类型允许为空)Major(nvarchar(100)类型允许为空)设计完后按CtrlS保存表名输入Students。同样在保存前查看“脚本”你会看到生成的CREATE TABLE语句USE [MyFirstDB] GO CREATE TABLE [dbo].[Students]( [StudentID] [int] NOT NULL PRIMARY KEY, [Name] [nvarchar](50) NOT NULL, [Age] [int] NULL, [Major] [nvarchar](100) NULL ) GO这条语句的意思是使用MyFirstDB数据库然后创建一个名为Students的表包含四个字段并指定StudentID为主键。4.2 数据的增删改查CRUD实战表建好了里面是空的。我们现在来学习最核心的四条SQL语句INSERT, SELECT, UPDATE, DELETE。首先点击SSMS工具栏上的“新建查询”按钮这会打开一个新的SQL脚本编辑器窗口并且默认连接到你当前选择的数据库可以在工具栏下拉框确认是否是MyFirstDB。1. 插入数据 (INSERT):-- 插入一条完整记录 INSERT INTO Students (StudentID, Name, Age, Major) VALUES (1, N张三, 20, N计算机科学); -- 插入一条只包含非空字段的记录Age和Major为NULL INSERT INTO Students (StudentID, Name) VALUES (2, N李四); -- 一次性插入多条记录 INSERT INTO Students (StudentID, Name, Age, Major) VALUES (3, N王五, 22, N软件工程), (4, N赵六, 21, N数据科学), (5, N钱七, 19, NULL);执行后你可以右键Students表选择“选择前1000行”就能看到插入的数据。注意nvarchar类型前的N是为了正确存储Unicode字符如中文这是一个好习惯。2. 查询数据 (SELECT):-- 查询所有列所有行 SELECT * FROM Students; -- 查询指定列 SELECT StudentID, Name, Major FROM Students; -- 带条件的查询 (WHERE子句) SELECT * FROM Students WHERE Age 20; SELECT * FROM Students WHERE Major IS NOT NULL; -- 对结果排序 (ORDER BY) SELECT * FROM Students ORDER BY Age DESC; -- 按年龄降序 -- 模糊查询 (LIKE) SELECT * FROM Students WHERE Name LIKE N张%; -- 查找姓张的学生3. 更新数据 (UPDATE):-- 将StudentID为2的学生的年龄更新为21 UPDATE Students SET Age 21 WHERE StudentID 2; -- 将所有学生的年龄增加1岁慎用因为没有WHERE条件会更新所有行 UPDATE Students SET Age Age 1;4. 删除数据 (DELETE):-- 删除StudentID为5的学生记录 DELETE FROM Students WHERE StudentID 5; -- 删除所有记录清空表但表结构还在 DELETE FROM Students; -- 更彻底的清空表重置自增标识等速度更快但无法回滚 TRUNCATE TABLE Students;重要经验UPDATE和DELETE语句务必加上WHERE条件除非你非常确定要操作所有行。在生产环境中在执行这类“危险”操作前先写一个对应的SELECT语句验证WHERE条件是否准确是一个必须养成的好习惯。例如想删除Age为NULL的记录先执行SELECT * FROM Students WHERE Age IS NULL;看看结果对不对再改成DELETE。5. 深入SQL查询连接、聚合与子查询掌握了基本的CRUD你已经可以处理单表的大部分操作。但数据库的强大之处在于处理多个关联表之间的复杂查询。5.1 多表连接JOIN查询我们再创建一个Courses课程表和StudentCourses学生选课表来模拟典型的多对多关系。CREATE TABLE Courses ( CourseID int NOT NULL PRIMARY KEY, CourseName nvarchar(100) NOT NULL ); CREATE TABLE StudentCourses ( StudentID int NOT NULL, CourseID int NOT NULL, Score decimal(5,2) NULL, -- 成绩允许为空 PRIMARY KEY (StudentID, CourseID), -- 联合主键 FOREIGN KEY (StudentID) REFERENCES Students(StudentID), -- 外键约束 FOREIGN KEY (CourseID) REFERENCES Courses(CourseID) );插入一些测试数据后问题来了如何查询“张三”选修了哪些课程这就需要使用JOIN。最常用的是INNER JOIN内连接它只返回两个表中匹配的行。SELECT s.Name, c.CourseName, sc.Score FROM Students s INNER JOIN StudentCourses sc ON s.StudentID sc.StudentID INNER JOIN Courses c ON sc.CourseID c.CourseID WHERE s.Name N张三;这条语句的逻辑是从Students表别名s出发通过StudentID与StudentCourses表别名sc连接再通过CourseID与Courses表别名c连接最后筛选出名字是“张三”的记录。除了INNER JOIN还有LEFT JOIN左连接返回左表JOIN关键字前的表的所有行即使右表没有匹配。右表无匹配则用NULL填充。RIGHT JOIN右连接与左连接相反。FULL OUTER JOIN全外连接返回左右两表的所有行不匹配的侧用NULL填充。5.2 聚合函数与分组GROUP BY我们经常需要统计信息比如每门课程的平均分、最高分、最低分或者每个专业有多少学生。这就需要聚合函数和GROUP BY子句。-- 统计每门课程的平均分、最高分、最低分和选课人数 SELECT c.CourseName, AVG(sc.Score) AS AvgScore, -- 平均分 MAX(sc.Score) AS MaxScore, -- 最高分 MIN(sc.Score) AS MinScore, -- 最低分 COUNT(sc.StudentID) AS StudentCount -- 学生人数 FROM Courses c LEFT JOIN StudentCourses sc ON c.CourseID sc.CourseID GROUP BY c.CourseName; -- 统计每个专业的学生人数并只显示人数大于1的专业 SELECT Major, COUNT(StudentID) AS StudentCount FROM Students WHERE Major IS NOT NULL -- 先过滤掉专业为NULL的学生 GROUP BY Major HAVING COUNT(StudentID) 1; -- HAVING子句对分组后的结果进行过滤这里的关键是理解WHERE和HAVING的区别WHERE在分组前过滤行HAVING在分组后过滤组。5.3 子查询的灵活运用子查询就是嵌套在其他SQL语句中的查询。它非常灵活常用于WHERE条件或SELECT字段列表中。-- 1. 在WHERE中使用子查询查询选修了“数据库原理”这门课的所有学生 SELECT s.Name FROM Students s WHERE s.StudentID IN ( SELECT sc.StudentID FROM StudentCourses sc INNER JOIN Courses c ON sc.CourseID c.CourseID WHERE c.CourseName N数据库原理 ); -- 2. 在SELECT中使用标量子查询查询每个学生及其选修的课程数量 SELECT s.Name, (SELECT COUNT(*) FROM StudentCourses sc WHERE sc.StudentID s.StudentID) AS CourseCount FROM Students s; -- 3. 派生表在FROM中使用子查询将子查询结果作为一个临时表参与连接 SELECT * FROM Students s INNER JOIN ( SELECT StudentID, AVG(Score) as AvgScore FROM StudentCourses GROUP BY StudentID ) AS sc_avg ON s.StudentID sc_avg.StudentID WHERE sc_avg.AvgScore 80;子查询的写法往往可以有多种等价形式例如第一个例子也可以用JOIN来实现。选择哪种方式取决于可读性和性能对于简单的关联JOIN通常更直观对于复杂的条件判断子查询可能更清晰。6. 进阶主题索引、事务与常见问题排查当你开始处理大量数据或构建复杂应用时以下几个概念就变得至关重要。6.1 索引为什么你的查询突然变慢了随着表中数据量增长SELECT ... WHERE ...查询可能会越来越慢。索引就像一本书的目录它能帮助数据库引擎快速定位到所需的数据行而不用逐行扫描整个表全表扫描。-- 在Students表的Name列上创建一个非聚集索引 CREATE INDEX IX_Students_Name ON Students (Name); -- 在StudentCourses表上创建一个覆盖索引包含常用于查询的列 CREATE INDEX IX_StudentCourses_Cover ON StudentCourses (StudentID, CourseID) INCLUDE (Score); -- INCLUDE包含的列只存储在索引叶节点不参与排序但能被查询直接读取创建索引的黄金法则是为经常出现在WHERE、JOIN条件和ORDER BY子句中的列创建索引。但索引并非越多越好因为索引会占用存储空间并在数据插入、更新、删除时带来额外的维护开销。你需要权衡查询性能提升与写操作成本。6.2 事务保证数据操作的“原子性”事务是将一系列数据库操作作为一个不可分割的单元来执行的机制。它遵循ACID原则原子性、一致性、隔离性、持久性。一个经典的例子是银行转账从A账户扣钱和向B账户加钱必须同时成功或同时失败。BEGIN TRANSACTION; -- 开始一个事务 BEGIN TRY UPDATE Accounts SET Balance Balance - 100 WHERE AccountID A; -- 模拟一个可能失败的操作 -- 1/0; -- 如果取消注释会引发除零错误事务回滚 UPDATE Accounts SET Balance Balance 100 WHERE AccountID B; COMMIT TRANSACTION; -- 提交事务所有更改永久生效 PRINT 转账成功; END TRY BEGIN CATCH ROLLBACK TRANSACTION; -- 回滚事务撤销所有未提交的更改 PRINT 转账失败已回滚。错误信息 ERROR_MESSAGE(); END CATCH使用BEGIN TRANSACTION,COMMIT,ROLLBACK可以显式控制事务。在SSMS中默认每个单独的SQL语句就是一个隐式事务。理解事务对于开发可靠的应用至关重要。6.3 安装与连接中的常见“坑”及排查即使按照教程操作你也可能遇到问题。这里分享几个高频问题的排查思路安装失败提示“无法启动服务”或“性能计数器”错误原因可能是之前安装的SQL Server残留文件、Windows Installer缓存问题或系统性能计数器损坏。解决彻底卸载旧版本并使用微软的官方清理工具SQLServerUninstallScript或类似工具清理注册表和文件残留。以管理员身份运行安装程序。对于计数器错误可以尝试在命令行管理员运行lodctr /R重建性能计数器。使用sa账户或SQL Server身份验证无法连接原因安装时未启用混合模式或者sa账户被禁用。解决先用Windows身份验证登录SSMS。在对象资源管理器中右键服务器实例 - “属性” - “安全性”确认“服务器身份验证”已设置为“SQL Server和Windows身份验证模式”。展开“安全性”-“登录名”找到sa账户右键“属性”。在“常规”页确认未勾选“登录已禁用”在“状态”页确认“登录”已启用。远程计算机无法连接原因默认情况下SQL Server可能只允许本地连接且防火墙阻止了1433端口。解决使用SSMSWindows身份验证登录打开“SQL Server配置管理器”。展开“SQL Server网络配置”-“实例名的协议”确保“TCP/IP”已启用。右键“TCP/IP”-“属性”在“IP地址”选项卡中找到“IPAll”将“TCP端口”设置为1433或你指定的端口。在Windows防火墙中添加入站规则允许sqlservr.exe程序或1433端口。执行查询时出现“死锁”错误原因两个或多个事务互相等待对方释放锁资源导致都无法继续执行。排查在SSMS中可以通过“活动监视器”右键服务器实例-“活动监视器”查看“进程”和“等待任务”找到阻塞的源头。优化方案包括保持事务简短、按相同顺序访问资源、使用适当的索引减少锁的持有范围和时间、在读取频繁且不要求绝对最新数据的场景下考虑使用WITH (NOLOCK)提示需谨慎可能读到脏数据。掌握这些基础之后你已经具备了使用SQL Server进行日常开发和数据操作的能力。真正的熟练来自于不断的实践尝试创建更复杂的表结构编写更精巧的查询并利用SSMS的“执行计划”功能来分析你的查询语句看看索引是否被有效利用这是性能调优的起点。数据库的世界很深但每一步扎实的学习都会让你在数据处理上更加得心应手。

相关新闻