领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

技术栈:SQL server数据库教程第八集

nixiaole 2025-08-01 20:03:12 知识剖析 5 ℃

1,Hi各位读者朋友们大家好,本期继续介绍SQL server,在上一期主要介绍的T-sql编程,本期给大家介绍变量和运算符,

2,首先介绍变量之局部变量,在SQL Server 2019中,变量分为局部变量和全局变量两种类型,特点:使用@符号作为前缀(如@VariableName),必须使用DECLARE语句显式声明,只在声明它们的批处理、存储过程或函数中有效,作用域限于当前会话;

声明语法:

DECLARE @VariableName DataType [= InitialValue];

赋值方式:

SET @VariableName = Value;  -- 推荐用于简单赋值
-- 或
SELECT @VariableName = ColumnName FROM TableName WHERE...  -- 从查询结果赋值

示例:

DECLARE @EmployeeCount INT;
DECLARE @CurrentDate DATETIME = GETDATE();
-- 赋值
SET @EmployeeCount = (SELECT COUNT(*) FROM Employees);
-- 从查询结果赋值
DECLARE @MaxSalary DECIMAL(10,2);
SELECT @MaxSalary = MAX(Salary) FROM Employees;

3,接下来介绍全局变量,全局变量的特点:使用@@符号作为前缀(如@@VariableName),由SQL Server系统预定义和维护,提供有关SQL Server系统和当前会话的信息,用户不能自定义全局变量;

常用全局变量:

全局变量

描述

@@ROWCOUNT

返回受上一语句影响的行数

@@ERROR

返回最后执行的T-SQL语句的错误号

@@IDENTITY

返回最后插入的标识值

@@TRANCOUNT

返回当前连接的活动事务数

@@VERSION

返回SQL Server的版本信息

@@SPID

返回当前用户进程的服务器进程ID

@@SERVERNAME

返回运行SQL Server的本地服务器名称

@@LANGUAGE

返回当前使用的语言名称

示例:

-- 检查上一条语句影响的行数
DELETE FROM Employees WHERE DepartmentID = 3;
PRINT '删除的行数: ' + CAST(@@ROWCOUNT AS VARCHAR);
-- 获取最后插入的标识值
INSERT INTO Orders (CustomerID, OrderDate) VALUES (1, GETDATE());
PRINT '新订单ID: ' + CAST(@@IDENTITY AS VARCHAR);
-- 检查错误状态
BEGIN TRY
    -- 可能出错的代码
END TRY
BEGIN CATCH
    PRINT '错误号: ' + CAST(@@ERROR AS VARCHAR);
END CATCH

结合以上局部变量和全局变量的对比:

特性

局部变量

全局变量

前缀

@

@@

声明

需要DECLARE

系统预定义

作用域

当前批处理/过程

整个会话

可自定义

生命周期

批处理/过程执行期间

会话期间

用途

存储临时数据

提供系统信息

4,下面介绍运算符,首先介绍算术运算符:

运算符

描述

示例

+

加法

SET @Total = @A + @B

-

减法

SET @Diff = @X - @Y

*

乘法

SET @Area = @Length * @Width

/

除法

SET @Avg = @Total / @Count

%

取模

SET @Remainder = @Num % 2

declare @num1 int;
declare @num2 int;
set @num1=12;
set @num2=10;


--数字相加
select @num1+@num2




declare @str1 nvarchar(10);
declare @str2 nvarchar(10);
set @str1='xzhu';
set @str2='chengxu';


--字符串相加+
select @str1+@str2
--字符串数字相加需要类型转换
select @str2+ convert(varchar(10),@num1)
--数字相减
select @num1-@num2
--数字相乘
select @num1 * @num2
--数字相除
select @num1 / @num2
--数字取余
select @num1 % @num2

比较运算符:


运算符

描述

示例

=

等于

IF @Status = 1

<>

不等于

WHERE DeptID <> 5

>

大于

HAVING COUNT(*) > 10

<

小于

IF @Age < 18

>=

大于等于

WHILE @Counter >= 0

<=

小于等于

CASE WHEN Price <= 100


逻辑运算符:


运算符

描述

示例

AND

逻辑与

WHERE Active=1 AND Age>30

OR

逻辑或

IF @Error OR @Warning

NOT

逻辑非

WHERE NOT Deleted

IN

值列表匹配

WHERE ID IN (1,3,5)

BETWEEN

范围匹配

WHERE Salary BETWEEN 5000 AND 10000

LIKE

模式匹配

WHERE Name LIKE '张%'

IS NULL

空值判断

WHERE Phone IS NULL


综合应用示例:

-- 计算员工奖金
DECLARE @BaseSalary DECIMAL(10,2) = 5000.00;
DECLARE @PerformanceRating INT = 85;
DECLARE @Bonus DECIMAL(10,2);
DECLARE @FinalSalary DECIMAL(10,2);
-- 使用复合运算符
SET @Bonus = @BaseSalary * 0.1;  -- 基础奖金10%
-- 绩效加成
IF @PerformanceRating BETWEEN 80 AND 89
    SET @Bonus *= 1.2;  -- 良好绩效增加20%
ELSE IF @PerformanceRating >= 90
    SET @Bonus *= 1.5;  -- 优秀绩效增加50%
-- 计算最终薪资
SET @FinalSalary = @BaseSalary + @Bonus;
-- 输出结果
PRINT CONCAT('基本工资: ', @BaseSalary);
PRINT CONCAT('绩效评级: ', @PerformanceRating);
PRINT CONCAT('奖金金额: ', @Bonus);
PRINT CONCAT('最终薪资: ', @FinalSalary);
PRINT CONCAT('影响行数: ', @@ROWCOUNT);

5,实战训练

变量命名:使用有意义的名称(如@EmployeeCount而非@a)遵循一致的命名约定(如驼峰式或下划线式)

类型选择:

-- 精确数值
DECLARE @Price DECIMAL(10,2) = 99.99;
-- 大文本数据
DECLARE @Description NVARCHAR(MAX);
-- 日期时间
DECLARE @Created DATETIME2(7) = SYSUTCDATETIME();

NULL处理:

-- 安全处理NULL值
DECLARE @Commission DECIMAL(10,2) = ISNULL(@InputCommission, 0);
-- 使用COALESCE处理多个可能NULL的值
DECLARE @DisplayName NVARCHAR(100) = COALESCE(@NickName, @FirstName, 'N/A');

运算符优先级:括号 > 算术 > 比较 > 逻辑,复杂表达式始终使用括号明确优先级

性能考虑:避免在WHERE子句中对变量使用函数,表变量适用于小数据集,大数据集考虑临时表,掌握这些变量和运算符的使用方法,可以显著提高T-SQL编程的效率和代码质量。

Tags:

最近发表
标签列表