当前位置: 首页 > news >正文

数据库局部变量,全局变量,流程控制

前言

知识点什么时候用?
@局部变量调试脚本、存储过程参数、临时存值
@@全局变量获取执行状态、错误处理
IF/WHILE条件判断、批量数据处理
视图简化复杂查询、统一查询逻辑
索引加快查询速度
函数封装可复用的计算逻辑
存储过程封装复杂业务、批量操作

一SQL局部变量@变量

1.是什么

  • @开头,是你自己在 SQL 脚本里定义的 “临时小盒子”
  • 只能在当前这一段 SQL 里用,GO之后就失效了
  • 作用:存一个值,后面反复用,避免到处写死数字 / 字符串

2.三步使用语法

-- ① 定义变量:DECLARE @变量名 数据类型 DECLARE @stuId INT; -- 存数字 DECLARE @stuName NVARCHAR(20); -- 存中文/字符串 -- ② 给变量赋值:两种方式 SET @stuId = 1; -- 方式1:SET赋值(推荐) SELECT @stuName = '张三'; -- 方式2:SELECT赋值 -- ③ 使用变量:直接写在SQL里 SELECT * FROM Student WHERE id = @stuId AND name = @stuName;

3.常用场景

  • 调试时,把条件统一改成变量,改一次全生效
  • 存储过程里接收参数
  • 把查询结果临时存起来,给后面的语句用

二SQL全局变量@@

1.是什么

  • @@开头,系统自带的变量,不用你定义
  • 用来获取数据库的状态、执行信息,直接就能用

2.最常用的4个

-- ① @@IDENTITY:获取刚插入数据的自增ID INSERT INTO Student(name) VALUES('李四'); DECLARE @newId INT = @@IDENTITY; -- 拿到刚插入的ID -- ② @@ROWCOUNT:上一条SQL影响了多少行 UPDATE Student SET age=20 WHERE id=1; PRINT '更新了' + CAST(@@ROWCOUNT AS NVARCHAR) + '行'; -- ③ @@ERROR:上一条SQL的错误码(0=没出错) DELETE FROM Student WHERE id=999; IF @@ERROR <> 0 PRINT '删除出错了!'; -- ④ @@VERSION:查看SQL Server版本 SELECT @@VERSION;

三流程控制:IF/While

1.是什么

让SQL脚本 会思考,会循环 ,像C#一样写逻辑

2.IF条件判断

IF (条件) BEGIN -- 条件成立时执行的代码(多条语句必须加BEGIN...END) PRINT '条件成立'; END ELSE BEGIN PRINT '条件不成立'; END

示例:根据分数判断是否及格

DECLARE @score INT = 85; IF @score >= 60 BEGIN PRINT '及格了!'; SELECT * FROM Student WHERE score = @score; END ELSE BEGIN PRINT '不及格,需要补考'; END

3.While循环

WHILE (循环条件) BEGIN -- 循环体,每次执行的代码 -- 注意:一定要有跳出条件,不然会死循环 IF 条件满足 BREAK; -- 跳出循环 END

示例:批量删除旧日志(分批删,不锁表)

DECLARE @batchSize INT = 1000; -- 每次删1000条 WHILE 1=1 -- 死循环,靠里面的BREAK退出 BEGIN -- 每次删1000条 DELETE TOP (@batchSize) FROM Logs WHERE CreateTime < '2023-01-01'; -- 如果这次没删到数据,说明删完了,退出循环 IF @@ROWCOUNT = 0 BREAK; END PRINT '删除完成';

四视图

1.是什么

  • 一张 “虚拟表”,本质是一条存起来的SELECT语句
  • 每次查询视图,就会自动执行这条 SQL
  • 索引视图是它的特殊形式,会把结果物理存起来

2.基础创建语法

-- 普通视图 CREATE VIEW v_student_score AS SELECT s.id, s.name, sc.score FROM Student s JOIN Score sc ON s.id = sc.stuId; -- 使用视图:和普通表一样查 SELECT * FROM v_student_score WHERE score > 90;

3.索引视图

-- 必须加WITH SCHEMABINDING,且只能用INNER JOIN CREATE VIEW v_student_score_index WITH SCHEMABINDING AS SELECT s.id, s.name, sc.score FROM dbo.Student s INNER JOIN dbo.Score sc ON s.id = sc.stuId; GO -- 创建聚集索引,视图数据会物理存储 CREATE UNIQUE CLUSTERED INDEX idx_v ON v_student_score_index(id);

五索引

1.是什么

  • 给表加的 “目录”,加快查询速度
  • 就像书本的目录,不用逐页翻,直接定位到内容

2.最常用的索引语法

1. 普通非聚集索引:CREATE INDEX idx_stu_name ON Student(name);

  • 目的:让按name查询变快
  • 适用场景:SELECT * FROM Student WHERE name='张三'

2. 唯一索引:CREATE UNIQUE INDEX idx_stu_phone ON Student(phone);

  • 目的:既让phone查询变快,又强制phone字段的值不能重复
  • 适用场景:手机号、身份证号这种不能重复的字段

3. 复合索引:CREATE INDEX idx_stu_age_name ON Student(age, name);

  • 目的:按age先排序,再按name排序,优化多条件查询
  • 适用场景:WHERE age=22 AND name='张三',这种查询走复合索引比两个单字段索引快得多
  • 注意:顺序很重要!(age, name)只能优化age开头的条件,反过来(name, age)就不行。

六函数

1.是什么

  • 封装好的一段 SQL 逻辑,输入参数,返回结果
  • 分为标量函数(返回单个值)和表值函数(返回一张表)

2.标量函数示例(返回单个值)

-- 创建一个函数,根据分数返回等级 CREATE FUNCTION GetScoreLevel(@score INT) RETURNS NVARCHAR(10) AS BEGIN DECLARE @level NVARCHAR(10); IF @score >= 90 SET @level = '优秀'; ELSE IF @score >= 60 SET @level = '及格'; ELSE SET @level = '不及格'; RETURN @level; END; -- 使用函数 SELECT name, dbo.GetScoreLevel(score) AS level FROM Student;

七存储过程

1.是什么

  • 把多条 SQL 语句封装成一个 “方法”,支持参数、流程控制
  • 调用一次就执行里面所有逻辑,适合复杂业务、批量操作

2.基础创建语法

-- 创建存储过程:根据学号查学生+成绩 CREATE PROCEDURE GetStudentInfo @stuId INT -- 输入参数 AS BEGIN -- 里面可以写多条SQL,支持变量、IF、WHILE SELECT * FROM Student WHERE id = @stuId; SELECT * FROM Score WHERE stuId = @stuId; END; -- 调用存储过程 EXEC GetStudentInfo @stuId = 1;

八触发器和游标

1. 触发器(Trigger)

核心特点

  • 触发时机:BEFORE/AFTER(操作前 / 操作后)
  • 触发事件:INSERTUPDATEDELETE
  • 自动执行,无参数,无返回值

实战示例(MySQL)

需求:给用户表加一个自动记录修改日志的触发器

-- 日志表 CREATE TABLE user_log( id INT PRIMARY KEY AUTO_INCREMENT, info VARCHAR(200), create_time DATETIME ); -- 用户表 CREATE TABLE user( id INT PRIMARY KEY, name VARCHAR(50) ); -- 创建触发器:当user表新增数据时,自动写日志 DELIMITER // -- 临时修改语句结束符 CREATE TRIGGER trg_user_insert AFTER INSERT ON user -- 插入后触发 FOR EACH ROW -- 每一行都触发 BEGIN INSERT INTO user_log(info, create_time) VALUES(CONCAT('新增用户:', NEW.name), NOW()); END // DELIMITER ; -- 测试:插入用户,触发器自动执行 INSERT INTO user(id, name) VALUES(1, '张三');

✅ 效果:你只插了用户表,日志表自动多了一条记录,全程不用手动调用触发器。

2. 游标(Cursor)

核心特点

  • 用于循环遍历查询结果集,逐行处理
  • 四步标准流程:声明 → 打开 → 取数据 → 关闭
  • 缺点:性能比整批 SQL 差,尽量少用

实战示例(MySQL 存储过程 + 游标)

需求:逐行读取用户表,打印每个用户名

DELIMITER // CREATE PROCEDURE proc_cursor_test() BEGIN -- 1. 声明变量 DECLARE done INT DEFAULT 0; DECLARE userName VARCHAR(50); -- 2. 声明游标 DECLARE user_cursor CURSOR FOR SELECT name FROM user; -- 3. 游标结束标记 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 4. 打开游标 OPEN user_cursor; -- 5. 循环逐行读取 read_loop: LOOP FETCH user_cursor INTO userName; -- 取一行数据 IF done = 1 THEN LEAVE read_loop; END IF; SELECT userName; -- 输出当前行(逐行处理) END LOOP; -- 6. 关闭游标 CLOSE user_cursor; END // DELIMITER ; -- 调用 CALL proc_cursor_test();

九事务

1.是什么

事务是数据库中的一个操作序列,这些操作要么全部完成,要么全部不做
换句话说,事务是保证数据库数据一致性和完整性的单位。

  • 生活类比:转账操作
    • 你从账户 A 转 100 元到账户 B,包含两个操作:
      1. A 减 100
      2. B 加 100
    • 事务保证两步要么都成功,要么都不做,不会出现 A 减了钱但 B 没收到的情况。

2. 事务的四大特性(ACID)

事务保证数据库安全性和可靠性,核心有ACID四个特性:

特性英文含义
原子性Atomicity事务是最小操作单位,要么全做,要么全不做
一致性Consistency事务完成后,数据库从一个合法状态变到另一个合法状态
隔离性Isolation多个事务并发执行时,互不干扰
持久性Durability事务完成后,结果永久保存在数据库,即使系统崩溃也不丢失

3.事务操作语法

--1.开始事务 begin transaction --2.提交事务 commit --3.回滚事务 rollback

4.事务操作实例

假设有一个账户表 Account

CREATE TABLE Account( AccountID INT PRIMARY KEY, Balance DECIMAL(10,2) ); INSERT INTO Account VALUES (1, 1000), (2, 500);

转账示例:

BEGIN TRANSACTION; -- 从账户1扣钱 UPDATE Account SET Balance = Balance - 200 WHERE AccountID = 1; -- 给账户2加钱 UPDATE Account SET Balance = Balance + 200 WHERE AccountID = 2; -- 检查是否有异常 IF @@ERROR <> 0 ROLLBACK; -- 出错就撤销 ELSE COMMIT; -- 没问题就提交

特点

  • 如果更新账户2时出错(比如表锁住或数据异常),账户1的钱也不会减少。
  • 事务保证了原子性

5.事务隔离级别

当多个事务同时执行时,需要控制“互相看到的数据状态”。SQL Server 提供 4 种隔离级别:

隔离级别特点常见问题
Read Uncommitted可读未提交的数据脏读(看到未提交的数据)
Read Committed只能读已提交的数据防止脏读,但可发生不可重复读
Repeatable Read锁定读取的行防止不可重复读,但可能有幻读
Serializable完全锁表,严格顺序防止幻读,但性能最低
http://www.jsqmd.com/news/868612/

相关文章:

  • 为什么你的ElevenLabs江苏话输出总像“普通话+口音”?揭秘吴语连读变调(sandhi)缺失的4个隐藏参数及patch级修复方案
  • 【YOLO目标检测全栈实战】65 让YOLO开口说话:YOLO-World + 多模态大模型的端到端对话系统实战
  • WebView 被注入的隐形炸弹——远程代码执行漏洞与安全硬核加固指南
  • 终极Figma中文界面改造指南:3分钟让英文设计工具变身母语助手
  • 倚天剑术58--给PDF文件盖电子章
  • DevOps 生态介绍(五):玩转SonarQube:代码静态扫描、Bug预警、质量门禁介绍
  • 【NotebookLM效应量计算实战指南】:20年统计学专家亲授3大避坑法则与5步精准计算流程
  • 【YOLO目标检测全栈实战】66 YOLO模型部署中的“冷启动”问题:如何让模型在真实场景中快速进入状态
  • 2026新疆线缆厂家大全:新疆电缆厂家+新疆电力线缆厂家+新疆电力电缆厂家+新疆高压电缆厂家+新疆输变电线厂家汇总 - 栗子测评
  • 港口数智升级|亚控KingSCADA打造设备精细化运维平台
  • 别再死磕论文修改!paperxie 一站式解决查重 + 降 AIGC 两大难题
  • 小程序数据采集(11)- IDA Pro逆向SO层与ARM汇编寻址详解
  • cesium笔记
  • 靠谱的奥迪维修保养服务商推荐
  • 小程序生命周期
  • 2026硬包装塑胶模具厂家推荐:多穴模具定制加工厂+多腔精密模具厂家推荐盘点 - 栗子测评
  • 【NotebookLM风格一致性终极指南】:20年AI产品专家亲授3大校准框架与5步落地法
  • 2026年口碑好的惠州短视频推广高性价比公司 - 行业平台推荐
  • 《QGIS空间数据处理与高级制图》021:按属性字段融合要素
  • C++ 第十五章第十六章 案例教程 + 全课程回顾
  • 聊天服务器架构设计
  • 2026薄壁注塑模具厂家推荐:食品包装模具定制厂家指南 - 栗子测评
  • 第七章 指令微调学习(四)基于指令数据对大语言模型进行微调
  • AI 矩阵带货怎么做起来?现成系统一站式搭建落地
  • 深入了解指针(3)
  • 泰国双清包税哪家好?泰国清关哪家强?2026泰国海运清关强的公司+泰国陆运清关强的公司合集 - 栗子测评
  • Golang技术周刊 2026年第16周
  • 别再死磕修改了!paperxie 一站式搞定论文查重与降 AIGC 率,毕业党速码
  • 【编号110】64个地级市土地利用图
  • 开源fNIRS脑机接口帽技术解析与应用