Published on

11. SQLServer : 运算符

Authors

运算符的优先级

如果一个表达式中的两个运算符有相同的优先级别,则按照它们在表达式中的位置对其从左到右进行求值。 例如,在下面的 SET 语句所使用的表达式中,在加运算符之前先对减运算符进行求值。

级别运算符
1~(位非)
2*(乘)、/(除)、%(取模)
3+(正)、-(负)、+(加)、+(串联)、-(减)、&(位与)、^(位异或)、|(位或)
4=、><>=、<=、<>!=、!>!<(比较运算符)
5NOT
6AND
7ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
8=(赋值)

一元运算符

运算符含义
+(正)数值为正。
-(负)数值为负。
~(位非)返回数字的非。

集运算符

使用说明

  • UNION ALL - 包括重复行
  • UNION - 排除重复行

基本规则

  • 所有查询中的列数和列的顺序必须相同。
  • 数据类型必须兼容

算数运算符

declare @mm int =3;
declare @nn int =4;
declare @zz nvarchar(255) ='5';
select -@nn+@mm   -- 输出:-1
Set  @mm += @mm    -- 相当于: @mm = @mm + @mm 
print(@mm)  -- 输出:6
print(@mm % @nn) -- 6 % 4 

比较运算符

运算符含义
=(等于)等于
>(大于)大于
<(小于)小于
>=(大于或等于)大于等于
<=(小于或等于)小于或等于
<>(不等于)不等于
!=(不等于)不等于(非 ISO 标准)
!<(不小于)不小于(非 ISO 标准)
!>(不大于)不大于(非 ISO 标准)

字符串运算符

字符串串联

DECLARE @x VARCHAR(4000) = REPLICATE('x', 4000)
DECLARE @z VARCHAR(8000) = REPLICATE('z',8000)
DECLARE @y VARCHAR(max);
 
SET @y = '';
SET @y += @x + @z;
SELECT LEN(@y) AS Y; -- 8000

通配符-百分比字符 %

SELECT FirstName, LastName  
FROM Person.Person  
WHERE FirstName LIKE 'Dan%'; 

通配符-中括号 []

-- 返回以 m 字母开头的名称。 [n-z] 指定第二个字母必须是 n 到 z 范围内的某个字母
SELECT name FROM sys.databases
WHERE name LIKE 'm[n-z]%';

-- 查找其地址中有四位邮政编码的所有 Adventure Works 雇员的 ID 和姓名
SELECT e.BusinessEntityID, p.FirstName, p.LastName, a.PostalCode  
FROM HumanResources.Employee AS e  
INNER JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID  
INNER JOIN Person.BusinessEntityAddress AS ea ON e.BusinessEntityID = ea.BusinessEntityID  
INNER JOIN Person.Address AS a ON a.AddressID = ea.AddressID  
WHERE a.PostalCode LIKE '[0-9][0-9][0-9][0-9]';  
 

通配符-无需匹配的字符串 ^

匹配不在方括号 [^] 之间指定的范围或集合内的任何单个字符

-- 使用 [^] 运算符查找 Contact 表中名字以 Al 开头且第三个字母不是a的前5名用户
SELECT TOP 5 FirstName, LastName  
FROM Person.Person  
WHERE FirstName LIKE 'Al[^a]%';  


-- 使用 [^] 运算符来查找不以字母或数字开头的字符串
SELECT [object_id], OBJECT_NAME(object_id) AS [object_name], name, column_id 
FROM sys.columns 
WHERE name LIKE '[^0-9A-z]%';

通配符- 下划线(匹配一个字符) _

-- 返回以字母 m 开头且第三个字母为 d 的所有数据库名称
SELECT name FROM sys.databases
WHERE name LIKE 'm_d%';

-- 返回 db_owner、db_ddladmin 等固定数据库角色的名称(此时的下划线被视为通配符)
SELECT name FROM sys.database_principals
WHERE name LIKE 'db_%';

-- 过滤出以 db_ 开头的数据库角色名(转义操作)
SELECT name FROM sys.database_principals
WHERE name LIKE 'db[_]%';