)
核心考点局部变量与全局变量区别、SET与SELECT赋值差异、流程控制IF-ELSE、CASE WHEN、游标循环遍历数据、常用全局变量用法适配表结构Students(StudentId, Name, Age, ClassId)、ScoreList(StudentId, Score, DB)--定义局部变量同时定义两个变量类型为int declare age int,stuId int; --方式1SET赋值单变量赋值常用 set age 10; print age; --输出10 --方式2SELECT赋值可同时为多个变量赋值 select ageAge,stuIdStudentId from Students where StudentId 1001; print age; --输出查询到的学生年龄 print stuId;--输出查询到的学生ID1.2 SET与SELECT赋值差异核心考点--场景1查询结果为多条数据时 --SELECT赋值返回多条结果时取最后一条数据赋值给变量 select stuIdStudentId from Students where ClassId 2; print stuId; --输出ClassId2的最后一个学生ID --SET赋值子查询返回多条结果时直接报错SET不支持多结果赋值 --set stuId (select StudentId from Students where ClassId 3); --执行报错 --print stuId; --场景2查询结果不存在时 set stuId100; --先给变量赋值100 --SET赋值查询无结果变量被赋值为NULL set stuId (select StudentId from Students where ClassId 100); --无匹配数据 print stuId; --输出NULL --SELECT赋值查询无结果变量保留原有值不改变 select stuIdStudentId from Students where ClassId 100; --无匹配数据 print stuId; --输出100保留之前赋值的1001.3 SET与SELECT赋值核心区别必背赋值数量SET 一次只能给一个变量赋值SELECT 可同时给多个变量赋值。多结果处理SET 子查询返回多条结果时报错SELECT 返回多条结果时取最后一条赋值。无结果处理SET 无结果时变量赋值为 NULLSELECT 无结果时变量保留原有值。二、全局变量开头全局变量由SQL Server系统定义以开头用于获取系统状态、操作结果等信息用户只能读取不能修改。--1. ERROR返回上一条语句的错误码0表示无错误非0表示有错误 --delete from Students where StudentId 1000; --假设该ID不存在执行无错误 print error; --输出0无错误 --2. IDENTITY返回上一条插入语句生成的自增标识列值主键自增时常用 insert into Students values(1,29,1,1,1,2020-10-1); print identity; --输出新插入数据的StudentId自增列值 --3. ROWCOUNT返回上一条语句受影响的行数 select * from Students; print rowcount; --输出查询到的学生总条数如10条 --4. MAX_CONNECTIONS返回当前数据库允许的最大连接数 print Max_connections; --输出系统配置的最大连接数如32767 --5. SERVICENAME返回当前SQL Server服务的实例名 print 当前服务器实例 servicename; --输出当前服务器实例名称如MSSQLSERVER --6. FETCH_STATUS游标专用返回游标读取数据的状态0成功-1失败-2行不存在 --后续游标部分详细使用三、流程控制语句流程控制用于控制SQL语句的执行顺序核心包括 IF-ELSE 条件判断、CASE WHEN 条件分支适配不同业务场景的逻辑处理。3.1 IF-ELSE 条件判断用于单条件或多条件分支判断满足条件执行对应语句块支持嵌套适用于简单逻辑判断。--示例查询2班C#平均分根据平均分输出评价 declare c# int; --定义变量存储平均分 --计算2班C#平均分赋值给变量 select c# AVG(Score) from ScoreList inner join Students on ScoreList.StudentIdStudents.StudentId where ClassId 2; select c# as 平均值; --显示平均分 --IF-ELSE条件判断 if c# is Null --判断平均分是否为NULL无成绩 begin print 该班无成绩; --执行语句块1 end else if(c#80) --判断平均分是否大于80 print 该班成绩良好; --执行语句块2 else --其他情况 begin print 该班成绩稍差; --执行语句块3 end3.2 CASE WHEN 条件分支行级判断用于查询语句中对每一行数据进行条件判断返回对应结果适用于批量数据的分支处理区别于IF-ELSE的批处理判断。--示例根据成绩ScoreDB平均分为每个学生评级 select Students.StudentId, --学生ID Name, --学生姓名 --CASE WHEN 条件分支每行数据单独判断 case when(ScoreDB)/290 then A --平均分≥90评级A when(ScoreDB)/2 between 80 and 90 then B --80≤平均分90评级B when(ScoreDB)/2 between 70 and 80 then C --70≤平均分80评级C when(ScoreDB)/2 between 60 and 70 then D --60≤平均分70评级D else 不及格 --其他情况评级不及格相当于default end as 评级 --给分支结果起别名 from ScoreList inner join Students on ScoreList.StudentIdStudents.StudentId;四、游标Cursor循环遍历数据游标用于逐行读取查询结果集适用于需要对每行数据单独处理的场景如逐行打印、逐行判断核心分为6个步骤定义→打开→初始化→循环→关闭→释放。4.1 游标完整示例逐行打印成绩大于50的学生信息--定义变量接收游标读取的数据 declare a int; --成绩 declare b nvarchar(10);--姓名 declare c int; --学号 --1. 定义游标指定游标名称和关联的查询结果集 declare Curesor_my cursor for select Score , Name ,Students.StudentId from Students inner join ScoreList on ScoreList.StudentIdStudents.StudentId; --2. 打开游标启动游标准备读取数据 open Curesor_my; --3. 初始化游标指向结果集第一行将数据赋值给变量 fetch next From Curesor_my into a,b,c; --4. 循环遍历根据FETCH_STATUS判断是否读取成功0成功 while FETCH_STATUS 0 begin --逐行判断成绩大于50打印学生信息 if(a50) print 学号: convert(varchar(10),c) 姓名:b 成绩convert(varchar(10),a); --5. 拉取下一行数据为下一次循环做准备必须写否则死循环 fetch next From Curesor_my into a,b,c; end --6. 关闭游标释放游标占用的资源 close Curesor_my; --7. 释放游标彻底销毁游标释放所有相关资源 deallocate Curesor_my;4.2 游标核心说明必背FETCH_STATUS游标专用全局变量0表示读取成功-1表示读取失败/无更多行-2表示读取的行不存在。循环关键循环体内必须写fetch next否则会出现死循环一直读取第一行数据。适用场景需要逐行处理数据如逐行判断、逐行修改普通批量查询优先使用CASE WHEN或聚合函数。五、核心考点汇总必背变量区分开头为局部变量用户自定义开头为全局变量系统定义仅可读取。赋值差异SET单变量赋值、不支持多结果、无结果赋值NULLSELECT多变量赋值、多结果取最后一条、无结果保留原值。流程控制IF-ELSE用于批处理级条件判断CASE WHEN用于行级条件分支查询中使用。常用全局变量ERROR错误码、IDENTITY自增列值、ROWCOUNT受影响行数、FETCH_STATUS游标状态。游标六步骤定义→打开→初始化→循环含fetch next→关闭→释放避免死循环。六、易错踩坑点使用SET赋值时子查询返回多条结果导致语法报错应改用SELECT赋值。游标循环中忘记写fetch next导致死循环一直重复处理第一行数据。混淆IF-ELSE和CASE WHEN的使用场景在查询语句中用IF-ELSE做行级判断应改用CASE WHEN。局部变量未赋值直接使用导致查询结果异常局部变量默认值为NULL。游标使用后未关闭和释放导致资源占用影响数据库性能。七、语法速记模板--1. 局部变量定义与赋值模板 declare 变量1 类型, 变量2 类型; set 变量1 值; --单变量赋值 select 变量1字段1,变量2字段2 from 表 where 条件; --多变量赋值 --2. IF-ELSE模板 if 条件1 begin 语句块1 end else if 条件2 语句块2 else begin 语句块3 end --3. CASE WHEN模板查询中使用 select 字段1, case when 条件1 then 结果1 when 条件2 then 结果2 else 结果3 end as 别名 from 表; --4. 游标使用模板 declare 变量1 类型, 变量2 类型; declare 游标名称 cursor for select 字段1,字段2 from 表 where 条件; open 游标名称; fetch next from 游标名称 into 变量1,变量2; while FETCH_STATUS0 begin 数据处理逻辑 fetch next from 游标名称 into 变量1,变量2; end close 游标名称; deallocate 游标名称;T-SQL WHILE循环、表创建与数据修改核心考点WHILE循环语法、自增列identity使用、默认值约束、批量插入数据、循环修改数据避免死循环、TOP 1查询用法适配表结构S2(id, name)、ScoreList(StudentId, Score)一、创建表并批量插入数据WHILE循环应用通过WHILE循环批量插入数据结合自增列、默认值约束实现快速生成测试数据适用于批量造数场景。1.1 创建表S2含自增列、非空约束、默认值--创建表S2包含自增主键和默认值约束 create table S2 ( id int not null primary key identity(1,1), --自增主键identity(起始值,步长)此处从1开始每次加1 name nvarchar(10) not null default( ) --非空约束默认值为空格 )关键说明identity(1,1)自增列属性第一个参数是起始值第二个参数是步长插入数据时无需手动赋值系统自动生成唯一值。default( )默认值约束插入数据时若未指定name字段值自动赋值为空格。primary key主键约束保证id字段值唯一且非空。1.2 WHILE循环批量插入数据生成10条测试数据--定义局部变量用于控制循环次数 declare count int set count 0 --初始化变量为0 --WHILE循环条件为count 10循环执行10次 while (count 10) begin set count count 1 --循环体变量自增1避免死循环 --插入数据name字段值为“亚马尔循环次数号” insert into S2(name) values(亚马尔convert(nvarchar(10),count)号) end --查询表中数据验证插入结果 select * from S2关键说明WHILE循环语法while(循环条件) begin 循环体 end循环条件为真时持续执行循环体。循环控制必须在循环体内修改循环变量如count count 1否则会出现死循环。数据拼接亚马尔convert(nvarchar(10),count)号将整数count转为字符串与固定文本拼接。二、WHILE循环批量修改数据将低于70分的成绩改为70通过WHILE循环结合TOP 1查询逐行修改成绩表中低于70分的记录直到所有成绩都不低于70分为止。--定义局部变量接收学生ID和成绩 declare stuid int,score int --WHILE循环条件为11恒成立通过循环体内的break跳出循环 while(11) begin --TOP 1只查询第一条成绩小于70的记录赋值给变量 select top 1 stuid StudentId,score Score from ScoreList where Score 70 --判断是否还有成绩小于70的记录核心控制循环退出 if((select count(*) from ScoreList where Score 70)0) --更新操作将当前查询到的学生成绩改为70 update ScoreList set Score 70 where StudentId stuid else break --无符合条件的记录跳出循环避免死循环 end --查询成绩表验证修改结果 select * from ScoreList关键说明while(11)恒成立条件循环会一直执行必须通过break语句手动跳出否则会出现死循环。TOP 1每次只查询一条符合条件的记录避免一次性修改所有记录实现逐行修改也可直接用UPDATE批量修改此处为循环演示。循环退出条件通过count(*)判断是否还有成绩小于70的记录无则执行break跳出循环。优化建议批量修改可直接使用update ScoreList set Score70 where Score70无需循环效率更高循环仅适用于需要逐行处理的场景。三、核心考点汇总必背自增列identity(起始值,步长)插入数据时无需赋值系统自动生成常用于主键。WHILE循环语法while(条件) begin 循环体 end必须包含循环变量修改或break语句避免死循环。循环退出方式① 修改循环变量让循环条件不成立② 使用break语句强制跳出。TOP 1用法限制查询结果为第一条适用于逐行处理数据的场景。数据拼接不同类型数据拼接时需用convert函数转换类型如整数转字符串。四、易错踩坑点WHILE循环中未修改循环变量如未写count count 1或未写break语句导致死循环。自增列插入数据时手动赋值id字段导致语法报错自增列无需手动赋值。数据拼接时未转换数据类型如整数直接与字符串拼接导致报错。批量修改数据时使用循环逐行修改效率低下优先使用UPDATE批量修改。循环条件判断错误如将0写成0导致循环提前退出或无法退出。五、语法速记模板--1. 自增表创建模板 create table 表名 ( 自增字段 int not null primary key identity(起始值,步长), 其他字段 类型 约束 default(默认值) ) --2. WHILE循环批量插入模板 declare 循环变量 类型 set 循环变量 初始值 while(循环条件) begin set 循环变量 循环变量 步长 insert into 表名(字段) values(值convert(类型, 循环变量)) end --3. WHILE循环批量修改模板逐行修改 declare 变量1 类型,变量2 类型 while(11) begin select top 1 变量1字段1,变量2字段2 from 表名 where 条件 if((select count(*) from 表名 where 条件)0) update 表名 set 字段新值 where 字段1变量1 else break end --4. 批量修改优化模板替代循环效率更高 update 表名 set 字段新值 where 条件T-SQL 视图View核心考点视图的概念与特点、视图的创建与删除、视图的使用场景、视图与普通表的区别、创建视图的语法规范适配表结构Students(StudentId, StudentName, Gender, Birthday)、ScoreList(StudentId, CSharp, SqlserverDB)一、视图的核心概念必背视图是 SQL 中一种重要的数据库对象本质是存储在服务器端的查询语句查询块并非真实存在的物理表而是一张虚拟表其数据和结构都基于对一张或多张物理表的查询结果。1.1 视图的核心特点虚拟性视图本身不存储实际数据数据来源于底层的物理表基表查询视图时系统会执行视图对应的查询语句从基表中获取数据。简化查询将复杂的多表连接、筛选、排序等操作封装到视图中后续使用时只需查询视图无需重复编写复杂 SQL。数据安全可通过视图暴露基表的部分字段和数据隐藏敏感信息如学生的身份证号、联系方式提升数据安全性。使用便捷视图的查询语法与普通物理表完全一致支持筛选、排序、分页等所有普通表的查询操作。1.2 视图的基本使用示例-- 1. 直接查询视图语法与查询普通表完全一致 select * from View_1; -- 2. 对视图进行条件筛选与普通表筛选语法一致 select * from View_1 where Gender男;关键说明使用视图时无需关注其底层的查询逻辑如多表连接只需将其当作普通表操作即可简化了开发和查询流程。二、视图的创建与删除核心语法创建视图前需先判断视图是否存在若存在则删除避免重复创建报错创建视图的核心是定义视图对应的查询语句。2.1 视图创建与删除的完整示例-- 第一步判断视图是否存在存在则删除规范写法避免重复创建报错 -- sysobjects系统表存储数据库中所有对象表、视图、存储过程等的信息 -- name View_2判断是否存在名为View_2的视图 if exists (select * from sysobjects where name View_2) drop view View_2; -- 删除视图 go -- 批处理结束分隔 SQL 语句块避免语法冲突 -- 第二步创建视图 -- 语法create view 视图名 as 对应的查询语句 create view View_2 as -- 视图对应的查询语句多表连接排序限制条数 SELECT top 100 -- 限制视图只显示前100条数据 dbo.Students.StudentName, -- 学生姓名 dbo.Students.Gender, -- 学生性别 dbo.Students.Birthday, -- 学生生日 dbo.ScoreList.CSharp, -- C#成绩 dbo.ScoreList.SqlserverDB -- SQL Server成绩 FROM dbo.ScoreList INNER JOIN dbo.Students ON dbo.ScoreList.StudentId dbo.Students.StudentId -- 多表连接 order by CSharp; -- 按C#成绩排序 go -- 批处理结束 -- 第三步使用视图查询视图数据 select * from View_2;2.2 关键语法说明必背判断视图是否存在if exists (select * from sysobjects where name 视图名)sysobjects 是系统内置表用于查询数据库对象信息。删除视图drop view 视图名删除后视图对应的查询逻辑也会被清除不影响底层基表数据。创建视图语法create view 视图名 as 查询语句查询语句可以是单表查询、多表连接查询、带筛选/排序/聚合的复杂查询。go 关键字用于分隔 SQL 批处理语句确保“删除视图”和“创建视图”作为独立的批处理执行避免语法报错。top 100限制视图返回的记录条数可根据需求调整也可省略返回所有符合条件的数据。三、视图与普通物理表的区别核心考点对比项视图View普通物理表数据存储不存储实际数据数据来源于基表查询时动态获取存储实际数据占用数据库存储空间本质存储的查询语句查询块虚拟表物理存在的数据库对象真实表创建语法create view 视图名 as 查询语句create table 表名 (字段 类型 约束)使用场景简化复杂查询、隐藏敏感数据、统一数据查询口径存储原始数据是所有操作的基础修改影响修改视图定义重写查询语句不影响基表数据修改表结构或数据直接影响所有依赖该表的视图四、核心考点汇总必背视图概念虚拟表存储查询语句数据来源于基表查询语法与普通表一致。创建视图规范先判断是否存在存在则删除再创建创建语句为create view 视图名 as 查询语句。go 关键字作用分隔批处理语句避免“删除创建”视图时出现语法冲突。视图特点不存储数据、简化查询、提升数据安全、基于基表动态生成数据。视图与表的区别核心区别是是否存储实际数据视图是虚拟的表是物理的。五、易错踩坑点创建视图前未判断是否存在导致重复创建报错需先执行drop view。视图对应的查询语句存在语法错误如多表连接条件缺失导致视图创建失败。混淆视图和表的本质试图向视图中插入、修改数据部分视图支持修改但会同步修改基表数据需谨慎。创建视图时查询语句中使用了不支持的语法如变量、临时表导致创建失败视图查询语句需为普通查询语句。删除视图时误删了普通表需区分drop view和drop table。六.语法速记模板-- 1. 视图删除与创建模板规范写法 if exists (select * from sysobjects where name 视图名) drop view 视图名; go create view 视图名 as -- 视图对应的查询语句单表/多表查询、筛选、排序等 select 字段1,字段2 from 表1 inner join 表2 on 表1.关联字段表2.关联字段 where 筛选条件 order by 排序字段; go -- 2. 视图使用模板与普通表一致 select * from 视图名; -- 全量查询 select * from 视图名 where 筛选条件; -- 条件查询 select 字段1,字段2 from 视图名 order by 排序字段; -- 自定义字段排序