简介:这是一份面向数据库初学者与SQL Server入门者的系统性学习笔记,帮助读者快速掌握关系型数据库核心概念与SQL Server管理实践。内容覆盖数据库对象操作(CREATE/DROP/ALTER)、C/S架构原理、系统数据库功能(master/model/tempdb等)、文件存储结构(.mdf/.ndf/.ldf)、权限管理(用户/角色/GRANT/REVOKE)及完整性约束(主键/外键/DEFAULT/CHECK/UNIQUE)等关键知识点,并结合实体-关系模型、数据类型规范、建表语法细节等理论夯实基础。资源为1个499KB的Word文档(.doc),排版清晰、术语准确、要点凝练,适合作为课堂补充、自学提纲或考前速查手册。目前已有442人学习下载,内容完整覆盖SQL Server安装后必学的管理逻辑与SQL语句实操要点,便于分模块精读与反复回顾。
1. SQL Server 学习笔记:不是“背命令手册”,而是帮你把数据管明白的第一张地图
你有没有过这种感觉:
明明在 Excel 里删一列只要点一下右键,可一到数据库里,光是“怎么把一张表建出来”就卡住——查了三篇教程,有的说必须写CREATE TABLE,有的说要先建数据库再建表,还有的突然冒出个master、model、tempdb……你盯着屏幕发呆:这到底是谁家的厨房?锅碗瓢盆都摆好了,可连火在哪都不知道。
SQL Server 学习笔记,就是专为这种“刚摸到门把手却不敢拧”的新手准备的入门地图。它不假设你懂服务器、不预设你会写代码、也不要求你先啃完《数据库系统概论》——它从你最熟悉的场景出发:比如“我要存一批商品信息,有名称、类别、价格、库存”,然后手把手带你走完从装软件→建库→建表→插数据→查数据→改数据→加约束防出错这一整条真实动线。它不是教你怎么当 DBA(数据库管理员),而是让你第一次就敢在自己的电脑上,亲手让一行数据真正“落进硬盘里”,而不是飘在教程截图里。适合所有想用数据做事的人:运营要查用户复购率、财务要核对多张单据、学生要做课程设计、转行者想拿下第一份数据分析岗——只要你需要让数据“听话、不乱、找得快”,这份笔记就是你今天能打开、明天就能跑通的起点。
2. 先搞懂一个核心概念:SQL Server 不是“软件”,而是一套“数据管家系统”
很多人一上来就猛敲CREATE DATABASE,结果报错:“无法连接到服务器”。不是命令错了,是还没看清这个系统的“家在哪里”。SQL Server 的本质,是一套客户端-服务器(C/S)架构的数据管家系统——它由两部分组成:
- 服务端(SQL Server Database Engine):真正干活的“管家本管”,常年在后台默默运行,负责存数据、查数据、锁数据、备份数据。它不长图形界面,你甚至看不到它,但它才是数据真正的“房东”。
- 客户端(SQL Server Management Studio,简称 SSMS):你每天面对的“管家助手”,带图形界面,是你和管家沟通的“电话+笔记本”。你写的每一条
SELECT、INSERT,都是通过它传给后台管家的指令。
提示:就像你用微信(客户端)给朋友(服务端)发消息,朋友手机没开微信或没联网,消息就发不出去。SSMS 连不上 SQL Server,90% 的原因是“管家没上岗”——服务没启动,或你连错了地址。
2.1 为什么必须分清“服务端”和“客户端”?——避坑第一步
新手最容易栽的第一个跟头,就是把“装了 SSMS”当成“装好了 SQL Server”。其实:
- SSMS 是免费下载的图形工具(类似记事本),只负责“说话”;
- SQL Server 服务端才是核心引擎,需单独安装(有免费版 Express),它才是真正“存数据”的程序。
如果你只装了 SSMS,就像买了个高级对讲机,但没配发射塔——按破键盘也收不到回音。
2.2 第一次启动:确认“管家”已在岗
打开 Windows 搜索栏,输入services.msc→ 回车 → 找到名为SQL Server (MSSQLSERVER)或SQL Server (SQLEXPRESS)的服务(名字后缀取决于你安装时选的实例名):
- 如果状态是“正在运行”→ 管家已上岗,可以继续;
- 如果是“已停止”→ 右键它 → 选择“启动”;
- 如果根本找不到这个名字 → 说明 SQL Server 服务端没装,需先去官网下载安装 SQL Server Express(免费版),安装时务必勾选“数据库引擎服务”。
注意:安装过程中会提示设置“混合模式身份验证”并让你设一个sa 密码(不是 Windows 密码!)。请务必记牢这个密码——它是你登录数据库的“总钥匙”,丢了就得重装。我第一次学时就因没记密码,重装三次才敢动手建第一个表。
2.3 连接管家:用 SSMS 拨通第一通“数据电话”
- 打开 SSMS(如果没装,去微软官网搜 “SQL Server Management Studio 下载”,选最新免费版);
- 在“连接到服务器”窗口:
- 服务器类型:选“数据库引擎”(别选 Reporting Services 或 Analysis Services);
- 服务器名称:填
.(英文句号)或(local)或localhost—— 这三个词在本机都代表“连我自己的管家”;如果你安装时自定义了实例名(比如叫
MYDB),这里就填.\MYDB; - 身份验证:选“SQL Server 身份验证”;
- 登录名:填
sa; - 密码:填你安装时设的那个 sa 密码;
- 点击“连接”。
✅ 成功标志:左上角出现绿色小箭头,对象资源管理器里展开“数据库”节点,能看到master、model、tempdb、msdb四个系统库——这就是管家给你备好的“空房间”,下一步,我们就给自己建一个专属房间:MyFirstDB。
2.4 动手建第一个数据库:三步走,不碰复杂参数
现在,我们不用记任何文件路径、增长大小——用最简方式建库,聚焦“数据落哪”这个核心问题:
-- 在 SSMS 的查询窗口中,粘贴并执行以下语句: CREATE DATABASE MyFirstDB;执行后,刷新“数据库”节点,你会看到新出现的MyFirstDB。就这么简单?对。因为:
- SQL Server 默认会为你创建一个主数据文件(
.mdf)和一个日志文件(.ldf),放在系统默认路径下; - 它自动分配初始大小(通常几 MB),并设置自动增长(遇到空间不足时自己扩容);
- 新手阶段,你完全不需要关心“文件放 C 盘还是 D 盘”“日志文件最大多少 G”——这些是后期优化的事,不是入门门槛。
类比:就像租公寓,中介说“您看中这套就行,水电燃气已开通,家具按标准配置”,你不用第一天就问“电表型号是多少、燃气管道直径几厘米”。先住进去,再慢慢调细节。
2.5 验证成果:切换到你的库,看看“地盘”是否生效
建库只是划了块地,你还得“搬进去住”。在 SSMS 中:
- 右键刚建的
MyFirstDB→ 选“新建查询”(这一步很关键!确保后续所有操作都在这个库里进行); - 或手动执行:
USE MyFirstDB; GO执行后,查询窗口左上角会显示当前数据库名MyFirstDB。此时,你所有建表、插数据的操作,都会落在这个库里,不会误伤master等系统库——这是新手保命操作,务必养成习惯。
3. 从零建第一张表:不是背语法,而是理解“数据怎么被组织”
建表,是 SQL Server 里最常做、也最容易翻车的操作。很多教程一上来就甩出CREATE TABLE全参数语法,新手看得头皮发麻。其实,建表的核心就三件事:起个名字、列几列、定个主键。其他全是锦上添花。我们用一个真实场景来拆解:
场景:你要记录公司员工信息,至少需要“工号、姓名、部门、入职日期、薪资”。
3.1 表的本质:一张电子表格的“严格版”
Excel 表格里,你可以随便在 A1 写“张三”,B1 写“销售部”,C1 写“2023-01-01”,D1 写“8000”——没人拦你。但数据库不行。它要求:
- 每一列必须提前声明“能存什么类型的数据”(比如“入职日期”只能存日期,不能存“昨天”或“下周二”);
- 每一行必须能被唯一识别(否则你改“张三”的工资,系统不知道改的是哪个张三);
- 同一列里不能混存不同类型(比如“薪资”列里不能既有数字
8000,又有文字面议)。
这就是为什么建表前,你要想清楚:
| 列名 | 你想存什么? | 数据类型建议 | 为什么? |
|---|---|---|---|
emp_id | 工号(唯一标识) | VARCHAR(10) | 工号可能是字母+数字组合(如EMP001),用字符型更安全 |
emp_name | 姓名 | NVARCHAR(50) | N开头支持中文,50 字足够长 |
dept_name | 部门 | NVARCHAR(30) | 同上,部门名一般不超 30 字 |
hire_date | 入职日期 | DATE | 专门存日期,系统能自动校验2023-02-30是非法日期 |
salary | 薪资 | DECIMAL(10,2) | DECIMAL精确存钱,10 位总长(含小数点后 2 位),避免浮点误差 |
提示:
NVARCHAR比VARCHAR多一个N,表示 Unicode 编码,能正确存中文、日文等;DECIMAL(10,2)意思是总共 10 位数字,小数点后占 2 位(如9999999.99),比MONEY类型更通用、更可控。
3.2 写出第一张表:用最简语法,跑通全流程
在刚才MyFirstDB的查询窗口中,执行:
-- 创建员工表 CREATE TABLE employees ( emp_id VARCHAR(10) PRIMARY KEY, emp_name NVARCHAR(50), dept_name NVARCHAR(30), hire_date DATE, salary DECIMAL(10,2) );✅ 执行成功后,刷新MyFirstDB→ “表”节点,你会看到新出现的employees。点开它,还能看到五列的结构——这就是你的第一张“数据骨架”。
关键解释:
PRIMARY KEY是主键约束,它自动实现三件事:① 这列值不能为空(NOT NULL);② 这列值不能重复(UNIQUE);③ 系统会自动为它建一个簇索引(让数据物理存储按工号排序,查得更快)。- 没写
NOT NULL?没关系,PRIMARY KEY已经包办了。新手阶段,主键就是你最该优先加的“安全带”。
3.3 插入第一行数据:验证表是否真能“装东西”
建好表,不代表它能存数据。我们插一行试试:
-- 插入第一条员工记录 INSERT INTO employees (emp_id, emp_name, dept_name, hire_date, salary) VALUES ('EMP001', '张三', '技术部', '2023-01-15', 8500.00);✅ 执行后,下方消息栏显示“1 行受影响”,说明成功了。
🔍 验证:执行查询语句看看:
SELECT * FROM employees;你会看到完整的一行数据。恭喜,你的数据第一次真正“落库”了!
3.4 常见问题排查:新手建表必踩的 4 个坑
现象 1:执行CREATE TABLE报错 “对象名 ‘employees’ 已存在”
→ 原因:你之前建过同名表,SQL Server 不允许重名。
→ 解决:删掉旧表再建(开发环境安全操作):
DROP TABLE IF EXISTS employees; -- 先删旧表(SQL Server 2016+ 支持) CREATE TABLE employees (...); -- 再建新表现象 2:INSERT报错 “列名或所提供值的数目与表定义不匹配”
→ 原因:INSERT语句中列名数量(5 个)和VALUES中值的数量(5 个)必须严格一致,且顺序要对应。
→ 解决:检查括号内列名和值是否一一对应;新手建议永远显式写出列名(如示例),不要省略成INSERT INTO employees VALUES (...)——后者依赖列顺序,极易出错。
现象 3:插入中文显示为??或乱码
→ 原因:列类型用了VARCHAR(非 Unicode),或数据库排序规则不支持中文。
→ 解决:建表时所有中文列一律用NVARCHAR(如NVARCHAR(50)),字符串值用N'张三'(前面加N):
INSERT INTO employees VALUES (N'EMP002', N'李四', N'市场部', '2023-02-20', 7200.00);现象 4:INSERT报错 “将截断字符串或二进制数据”
→ 原因:插入的字符串长度超过列定义(如emp_name NVARCHAR(10)却插了 12 个字)。
→ 解决:要么缩短数据,要么修改列宽:
ALTER TABLE employees ALTER COLUMN emp_name NVARCHAR(20);(注意:ALTER COLUMN会锁表,生产环境慎用;新手练习无妨)
4. 让数据“自己守规矩”:约束不是枷锁,而是你的后悔药
没有约束的表,就像没装刹车的自行车——跑得快,但一歪就翻。SQL Server 提供多种约束,让数据在入库时就自动校验,省得你事后大海捞针。新手先掌握这 3 种最实用的:
4.1 主键约束(PRIMARY KEY):给每一行发“身份证号”
我们已经用过它(emp_id VARCHAR(10) PRIMARY KEY)。它的作用远不止“设个唯一标识”:
- ✅ 强制
emp_id列不能为NULL(空值); - ✅ 强制
emp_id值全表唯一(插第二个EMP001会直接报错); - ✅ 自动创建簇索引,大幅提升按
emp_id查询的速度(比如查WHERE emp_id = 'EMP001')。
类比:就像给每个员工发工牌,工牌号(
emp_id)必须印清楚、不能涂改、不能重复——HR 录入时系统就拦住错误,而不是等月底发工资才发现两个“张三”工号一样。
4.2 非空约束(NOT NULL):告诉系统“这个字段必须填”
有些字段业务上绝对不能空,比如员工姓名、入职日期。如果建表时没设,后期可能存入一堆NULL,导致统计出错(比如算平均薪资时,NULL不参与计算,但你可能以为漏了人)。
修改已有表,加非空约束:
-- 先确保现有数据没有 NULL(否则加约束会失败) UPDATE employees SET emp_name = '未知' WHERE emp_name IS NULL; -- 再加约束 ALTER TABLE employees ALTER COLUMN emp_name NVARCHAR(50) NOT NULL;✅ 加完后,再执行:
INSERT INTO employees (emp_id, dept_name, hire_date, salary) VALUES ('EMP003', '行政部', '2023-03-10', 5000.00);就会报错:“列emp_name不能为 Null”,强制你补全信息。
4.3 检查约束(CHECK):给数据加一道“业务逻辑门禁”
比如:薪资不能为负数,入职日期不能是未来。这些规则,靠人盯不如靠系统拦。
给salary加非负检查:
ALTER TABLE employees ADD CONSTRAINT chk_salary_positive CHECK (salary >= 0);✅ 加完后,执行:
INSERT INTO employees VALUES ('EMP004', '王五', '财务部', '2023-04-01', -5000.00);立刻报错:“违反了 CHECK 约束chk_salary_positive”,数据被拒之门外。
血泪经验:我第一次给客户建订单表,忘了加
order_amount > 0检查,结果测试时手滑输了个-100,后面所有报表都少算了一笔“负收入”,排查两小时才发现是约束漏了。从此,凡是有业务含义的数字、日期、状态字段,我必加CHECK。
4.4 唯一约束(UNIQUE):防止“重名不重号”
主键保证“工号唯一”,但业务上可能还要求“手机号唯一”“邮箱唯一”。这时用UNIQUE:
-- 给手机号加唯一约束(假设你新增了 phone 列) ALTER TABLE employees ADD phone VARCHAR(15); ALTER TABLE employees ADD CONSTRAINT uk_phone UNIQUE (phone);✅ 此时,即使emp_id不同,也不能插入两个相同手机号——系统自动拦截。
4.5 外键约束(FOREIGN KEY):让两张表“绑在一起”,数据不脱节
这是关系型数据库的灵魂。比如:员工属于部门,部门信息存在另一张departments表里。外键确保:
- 你不能给员工填一个不存在的部门 ID;
- 你不能删除一个还有员工归属的部门(除非先清空员工)。
先建部门表:
CREATE TABLE departments ( dept_id INT PRIMARY KEY, dept_name NVARCHAR(30) NOT NULL ); -- 插入几个部门 INSERT INTO departments VALUES (1, '技术部'), (2, '市场部'), (3, '财务部');再修改员工表,关联部门:
-- 1. 先加 dept_id 列 ALTER TABLE employees ADD dept_id INT; -- 2. 加外键约束,指向 departments 表的 dept_id ALTER TABLE employees ADD CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id);✅ 加完后:
- 插入员工时,
dept_id必须是departments表里已有的值(如1,2,3),填4就报错; - 删除
departments中dept_id=1的“技术部”前,必须先把所有dept_id=1的员工改掉或删掉,否则报错。
这就是“参照完整性”——它让数据之间保持逻辑一致,避免出现“员工在技术部,但技术部已不存在”这种玄学状态。
5. 查数据不是“SELECT *”,而是学会用 WHERE 精准定位
建好表、插好数据、加好约束,下一步就是“找数据”。新手常犯的错是:一上来就SELECT * FROM employees,结果几百行刷屏,根本找不到想要的。真正的查询,是带着问题去问数据库。
5.1 WHERE 子句:你的“数据过滤器”
WHERE是查询的灵魂,它决定“我要看哪些行”。记住口诀:WHERE 后面跟条件,条件之间用 AND/OR 连接,字符串用单引号,数字不用。
常用条件示例:
-- 查所有技术部员工 SELECT * FROM employees WHERE dept_name = N'技术部'; -- 查薪资高于 8000 的员工(注意:数字不加引号!) SELECT emp_name, salary FROM employees WHERE salary > 8000; -- 查 2023 年入职的员工(日期比较,用标准格式) SELECT * FROM employees WHERE hire_date >= '2023-01-01' AND hire_date < '2024-01-01'; -- 查姓名包含“张”的员工(模糊查询,% 是通配符) SELECT * FROM employees WHERE emp_name LIKE N'%张%';注意:
LIKE中的%表示“任意多个字符”,_表示“一个字符”。N'%张%'的N不能少,否则中文可能匹配失败。
5.2 排序与限制:让结果“按你需要的样子排好队”
查出来的数据默认无序。用ORDER BY排序,TOP限制行数:
-- 按薪资降序排,只看前 3 名 SELECT TOP 3 emp_name, salary FROM employees ORDER BY salary DESC; -- 按部门升序、薪资降序(先排部门,部门内再按薪资排) SELECT * FROM employees ORDER BY dept_name ASC, salary DESC;5.3 多表查询:用 JOIN 把分散的信息“拼起来”
现实中的数据从来不在一张表里。比如要查“员工姓名+所属部门名称”,而部门名在departments表里。这时用JOIN:
-- INNER JOIN:只返回两边都有匹配的行(最常用) SELECT e.emp_name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id = d.dept_id; -- LEFT JOIN:返回 employees 表所有行,即使 dept_id 在 departments 里找不到(此时 dept_name 为 NULL) SELECT e.emp_name, d.dept_name FROM employees e LEFT JOIN departments d ON e.dept_id = d.dept_id;关键点:
e和d是表的别名,让语句更简洁;ON后面是关联条件(e.dept_id = d.dept_id),不是WHERE。
5.4 常见问题排查:查询总为空?先查这 3 个地方
现象 1:SELECT * FROM employees有数据,但WHERE dept_name = '技术部'查不到
→ 原因:中文字符集问题,或字段里存了空格/不可见字符。
→ 解决:用LEN()和DATALENGTH()查长度,用LTRIM(RTRIM())去空格:
SELECT emp_name, dept_name, LEN(dept_name), DATALENGTH(dept_name) FROM employees WHERE emp_name = N'张三';如果LEN返回 4 但DATALENGTH返回 8,说明是双字节字符(正常);如果LEN返回 4 但DATALENGTH返回 5,说明末尾有空格。
现象 2:JOIN结果行数远超预期(比如员工表 10 行,部门表 5 行,结果却有 50 行)
→ 原因:关联条件写错,导致笛卡尔积(每行员工配每行部门)。
→ 解决:先单独查SELECT COUNT(*) FROM employees和SELECT COUNT(*) FROM departments,再查SELECT COUNT(*) FROM employees e JOIN departments d ON 1=1(故意写错条件),对比数量。确认ON条件是否准确引用了外键列。
现象 3:LIKE '%张%'查不到带“张”的姓名
→ 原因:没加N前缀,或字段类型是VARCHAR(非 Unicode)。
→ 解决:统一用NVARCHAR建表,查询时加N:WHERE emp_name LIKE N'%张%'。
6. 下一步学什么?从“能跑通”到“敢用好”的三步跃迁路径
学到这里,你已经能独立完成:安装 SQL Server + 连接 SSMS + 建库建表 + 插数据 + 加约束 + 写基础查询。这不是“学完了”,而是“真正入门了”——你拿到了一把能打开数据世界大门的钥匙。接下来,别急着扎进存储过程或事务隔离级别,先稳扎稳打走好这三步,让能力真正长在自己身上:
6.1 第一步:把“建表”变成肌肉记忆——每天建一张新表,练 7 天
目标:不查文档,5 分钟内建出符合业务需求的表。
- 第 1 天:建“客户表”(客户ID、姓名、手机号、注册日期、等级);
- 第 2 天:建“订单表”(订单ID、客户ID、下单时间、总金额),并加外键关联客户表;
- 第 3 天:建“订单明细表”(明细ID、订单ID、商品名、数量、单价),加外键关联订单表;
- ……
每天建完,立刻用INSERT插 3 行测试数据,再用SELECT验证。重点练: PRIMARY KEY、NOT NULL、CHECK的组合使用;VARCHAR/NVARCHAR、INT、DECIMAL、DATE的选型直觉;ALTER TABLE修改列和加约束的熟练度。
从那以后我每次接到新需求,第一反应不是打开文档,而是打开 SSMS 新建查询窗口,先手写
CREATE TABLE。哪怕需求还不全,先搭出骨架,再逐步填肉——这让我少画 80% 的 ER 图,沟通效率翻倍。
6.2 第二步:把“查数据”变成条件反射——用真实问题驱动练习
别再刷“100 道 SQL 题”,用你工作/生活中真问题练:
- 如果你是电商运营:查“近 7 天下单但未付款的客户列表”;
- 如果你是 HR:查“各部门平均薪资,排除试用期员工”;
- 如果你是学生:查“选修了‘数据库原理’且成绩 > 85 的学生姓名和学号”。
每道题,强制自己写三遍:
- 第一遍:只用
SELECT+WHERE+ORDER BY; - 第二遍:加上
JOIN关联必要表; - 第三遍:加上
GROUP BY+ 聚合函数(COUNT、AVG、SUM);
然后对比结果,看哪一步卡住了——卡在JOIN?回去重练关联逻辑;卡在GROUP BY?就专注练分组聚合。
6.3 第三步:建立“防翻车清单”,把血泪教训变成日常习惯
我把前两年踩过的坑,浓缩成一张贴在显示器边的纸,每天写 SQL 前扫一眼:
| 操作类型 | 必检项 | 为什么? |
|---|---|---|
| 建表 | 主键加了吗?中文列用NVARCHAR了吗?数字用DECIMAL了吗? | 避免后期改结构锁表、中文乱码、钱算不准 |
| 插数据 | INSERT是否显式写了列名?字符串值前加N了吗?数字没加引号吧? | 防止列顺序错、中文存乱、数字变字符串 |
| 查数据 | WHERE条件写对表名和列名了吗?JOIN的ON条件是外键关联吗?LIKE加N了吗? | 防止查空、笛卡尔积、中文匹配失败 |
| 改数据 | UPDATE/DELETE前,是否先用SELECT验证WHERE条件?是否加了BEGIN TRAN? | 防止误更新整张表,有ROLLBACK后悔药 |
从那以后我每次执行
UPDATE或DELETE,都强制走一遍:SELECT * FROM 表 WHERE 条件→ 确认行数和内容 →BEGIN TRAN→UPDATE/DELETE→SELECT验证 →COMMIT或ROLLBACK。三年没删过一次生产数据。希望帮到你。
本文还有配套的精品资源,点击获取