
数据时代不懂数据库的程序员就像没有锅的厨子 —— 我的 SQL Server 入门血泪史那时候 SQL Server 2019 已经发布社区版Developer Edition依然免费。虽然网上中文教程相对 MySQL 少了一些但微软官方文档出奇地好。这篇文章就是我磕磕绊绊一个月的学习笔记希望能帮到同样从零开始的你。1. 下载安装 SQL Server Developer Edition2021年初我去微软官网下载了SQL Server 2019 Developer永久免费用于开发测试。安装过程中关键几步选择“基本”或“自定义”我选了自定义。添加功能数据库引擎服务 是必须的。实例配置默认实例 MSSQLSERVER 即可。服务器配置使用默认服务账户。数据库引擎配置选择 混合身份验证模式设置 sa 账户密码并添加当前 Windows 用户为管理员。坑1如果忘了启用混合验证以后用程序连接会很麻烦。可以在安装后通过 SSMS 修改属性。2. 安装 SSMS (SQL Server Management Studio)SSMS 是 SQL Server 的图形化工具就像 Navicat 之于 MySQL。2021年最新版 SSMS 18.8 体积不小但功能强大。安装后打开用 Windows 身份验证或sa登录即可。二、第一个数据库和表创建一个名为SchoolDB的数据库然后建一张Student表。-- 创建数据库CREATEDATABASESchoolDB;GO-- 使用该数据库USESchoolDB;GO-- 创建学生表CREATETABLEStudent(StudentIDINTIDENTITY(1,1)PRIMARYKEY,Name NVARCHAR(50)NOTNULL,GenderNCHAR(1)CHECK(GenderIN(M,F)),BirthDateDATE,ScoreDECIMAL(5,2));名词解释IDENTITY(1,1)自增列从1开始每次加1。NVARCHAR存储 Unicode 字符避免中文乱码重要。CHECK 约束限定性别只能为 M 或 F。坑2如果用 VARCHAR 存中文2021年初某些排序规则下会变成乱码。所以强烈建议中文字段用 N 开头的类型NCHAR / NVARCHAR。三、数据的增删改查CRUD插入数据INSERTINTOStudent(Name,Gender,BirthDate,Score)VALUES(张三,M,2000-03-15,88.5),(李四,M,1999-07-22,92.0),(王芳,F,2001-01-10,95.5);注意字符串和日期用单引号不要用双引号SQL Server 双引号一般用于列名。查询数据-- 查询所有列SELECT*FROMStudent;-- 条件查询分数大于90的学生SELECTName,ScoreFROMStudentWHEREScore90;-- 排序SELECTName,ScoreFROMStudentORDERBYScoreDESC;更新数据⚠️ 血泪教训如果忘了写 WHERE整张表都会被更新建议先在 SELECT 中测试条件。删除数据-- 删除张三的记录DELETEFROMStudentWHEREName张三;同样忘记 WHERE 会删除整表。如果想快速清空表并用 TRUNCATE TABLE Student它效率高但不能回滚小心使用。四、常用查询技巧实用组合1. 模糊查询LIKE 和通配符-- 查找姓“王”的学生SELECT*FROMStudentWHERENameLIKE王%;2. 聚合函数 分组-- 计算男女生平均分SELECTGender,AVG(Score)ASAvgScoreFROMStudentGROUPBYGender;3. HAVING 子句分组后过滤-- 找出平均分大于90的性别组SELECTGender,AVG(Score)ASAvgScoreFROMStudentGROUPBYGenderHAVINGAVG(Score)90;4. 限制返回行数SQL Server 使用TOP而非LIMITSELECTTOP3*FROMStudentORDERBYScoreDESC;五、多表连接告别单表打天下再建一张课程表Course和选课表Enrollment演示连接。CREATETABLECourse(CourseIDINTIDENTITY(1,1)PRIMARYKEY,CourseName NVARCHAR(100));CREATETABLEEnrollment(EnrollmentIDINTIDENTITY(1,1)PRIMARYKEY,StudentIDINTFOREIGNKEYREFERENCESStudent(StudentID),CourseIDINTFOREIGNKEYREFERENCESCourse(CourseID),GradeDECIMAL(5,2));插入示例数据后查询每个学生选的课程和成绩SELECTs.Name,c.CourseName,e.GradeFROMStudent sINNERJOINEnrollment eONs.StudentIDe.StudentIDINNERJOINCourse cONe.CourseIDc.CourseID;如果有些学生没选课也想显示就用 LEFT JOIN。六、我遇到的奇葩错误希望你避开中文乱码原因用了 VARCHAR 或未在字符串前加 N。解法用 NVARCHAR 类型插入时写 N’中文内容’例如 INSERT INTO Student (Name) VALUES (N’张三’)。日期格式歧义’01/02/2021’ 到底指1月2日还是2月1日最佳实践使用标准化格式 ‘2021-01-02’或使用 CONVERT 明确风格。NULL 值的陷阱WHERE Score NULL 查不到任何数据因为 NULL 不等于任何值甚至不等于 NULL。正确写法WHERE Score IS NULL。忘了 GO在 SSMS 中多个批处理需要用 GO 分隔否则变量作用域混乱。七、进阶小试视图与索引视图相当于保存好的查询。CREATEVIEWv_StudentScoresASSELECTName,ScoreFROMStudentWHEREScoreISNOTNULL;索引提升查询速度。2021年初我学会了在 WHERE 和 JOIN 的列上建索引CREATEINDEXidx_student_nameONStudent(Name);不过索引不是越多越好会降低写入速度。