T - SQL 概述
1. 局部变量
DECLARE @b VARCHAR(50)
SELECT @b = '测试'
PRINT @b
declare @song varchar(20)
set @song = 'Hello World'
print @song
--为多个变量一起赋值,只能用select
declare @d int,@c char(10),@a int
select @d = 1,@c = 'love',@a = 2
print @d
print @c
print @a
2. 运算符
2.1 算数运算符包括加、减、乘、除、取余(%)
注意:取余运算两边的表达式必须是整型数据。
例:求2对5取余
declare @x int,@y int,@z int
select @x = 2,@y = 5
set @z = @x % @y
print @z
2.2 比较运算符
共9个比较运算符:=, >, < , >=, <=, <>(不等于), !=(非等于), !>(非大于), !<(非小于)
其中 !=,!>,!< 不是 ANSI 标准的运算符。
2.3 逻辑运算符
运算符 | 行为 |
---|---|
ALL | 如果一个比较集中全部都是TRUE,则值为TRUE |
AND | 如果两个布尔表达式均为TRUE,则值为TRUE |
ANY | 如果一个比较集中任何一个为TRUE,则值为TRUE |
BETWEEN | 如果操作数是在某个范围内,则值为TRUE |
EXISTS | 如果子查询包含任何行,则值为TRUE |
IN | 如果操作数与一个表达式列表中的某个相等,则值为TRUE |
LIKE | 如果操作数匹配某个模式,则值为TRUE |
NOT | 对任何其他布尔运算符的值取反 |
OR | 如果任何一个布尔表达式是TRUE,则值为TRUE |
SOME | 如果一个比较集中的某些为TRUE,则值为TRUE |
--exists
--eists(select):若子查询的结果集非空时,exists()表达式返回true;子查询的结果集为空时,exists()表达式返回false。
select * from Student
where exists (select S# from Student where S# = '10')
--in
select * from Student
where S# in (select S# from SC)
当 NOT、AND 和 OR 出现在同一表达式中时,优先级时 NOT > AND > OR。
例如,3>5 or 6>3 and not 6>4=false
先计算 not 6>4=false;然后再计算 6>3 and false = false,最后计算 3>5 or false = false。
2.4 位运算符
位运算符的操作数可以是整数数据类型或二进制串数据类型(image 数据类型除外)范畴。
运算符 | 说明 |
---|---|
& | 按位 AND |
| | 按位 OR |
^ | 按位互斥 OR |
~ | 按位 NOT |
2.5 连接运算符
连接运算符 “+” 用于连接两个或两个以上的字符或二进制串、列名或者串和列的混合体,将一个串加入到另一个串的末尾。
declare @name varchar(10)
set @name = '漫威'
print '我爱的电影是' + @name
2.6 运算符优先级
当一个复杂表达式中包含有多个运算符时,运算符的优先级决定了表达式计算和比较操作的先后顺序。运算符的优先级由高到低的顺序如下:
- +(正)-(负)~(位反)
- *(乘)/(除)%(取余)
- +(加)+(字符串串联运算符)-(减)
- =、>、<、>=、<=、<>、!=、!>、!<(比较运算符)
- ^(按位异或)&(按位与)|(按位或)
- NOT
- AND
- ALL、ANY、BETWEEN、IN、LIKE、OR、SOME(逻辑运算符)
- =(赋值)
3. 通配符
匹配指定范围内或者属于方括号所指定的集合中的任意单个字符。可以在涉及模式匹配的字符串比较(比如 LIKE 和 PATINDEX)中使用这些通配符。
在 SQL 中通常用 LIKE 关键字与通配符结合起来实现模糊查询。SQL 支持的通配符如下:
通配符 | 描述 | 示例 |
---|---|---|
% | 包含零个或更多字符的任意字符 | "loving%"可以表示为:“loving”、“loving you”、“loving?” |
_(下划线) | 任何单个字符 | "loving_“可以表示为"lovingc”。后面只能再接一个字符。 |
[ ] | 指定范围([a ~ f])或集合([abcdef])中的任何单个字符 | [0 ~ 9]123 表示以 0~9 之间任意一个字符开头,以’123’结尾的字符 |
[^] | 不属于指定范围([a ~ f])或集合([abcdef])中的任何单个字符 | [^0 ~ 5]123表示不以 0~5 之间任意一个字符开头,却以’123’结尾的字符 |
4. 流程控制
4.1 BEGIN…END
BEGIN…END 语句用于将多个 Transact-SQL 语句组合为一个逻辑块。当流程控制语句必须执行一个包含两条或两条以上的 T-SQL 语句的语句块时,使用 BEGIN…END 语句。
declare @x int,@y int,@t int
set @x=1
set @y=2
begin
set @t=@x
set @x=@y
set @y=@t
end
print @x
print @y
4.2 IF
在 SQL Server 中为了控制程序的执行方向,也会像其他语言(如C语言)有顺序、选择和循环 3 种控制语句,其中 IF 就属于选择判断结构。
declare @x int
set @x = 8
if @x % 2 = 0
print '@x 偶数'
print 'end'
4.3 IF…ELSE
declare @x int,@y int
set @x = 8
set @y = -3
if @x > 0
if @y > 0
print '@x@y位于第一象限'
else
print '@x@y位于第四象限'
else
if @y > 0
print '@X@y位于第二象限'
else
print '@x@y位于第三象限'
4.4 CASE
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他'
END
--Case搜索函数
CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他'
END
select *,case
when score >= 90 then '优秀'
when score < 90 and score >= 80 then '良好'
when score < 80 and score >= 70 then '及格'
else '不及格'
end as "备注"
from SC
4.5 WHILE
WHILE 子句是 T-SQL 语句支持的循环结构。在条件为真的情况下,WHILE 子句可以循环地执行其后的一条 T-SQL 命令。如果想循环执行一组命令,则需要配合 BEGIN…END 子句使用。
declare @n int,@sum int
set @n = 1
set @sum = 0
while @n <= 10
begin
set @sum = @sum + @n
set @n = @n + 1
end
print @sum
4.6 WHILE…CONTINUE…BREAK
循环结构 WHILE 子句还可以用 CONTINUE 和 BREAK 命令控制 WHILE 循环中语句的执行。
其中,CONTINUE 命令可以让程序跳过 CONTINUE 命令之后的程序,回到 WHILE 循环的第一行命令。
BREAK 命令则让程序完全跳出循环,结束 WHILE 命令的执行。
declare @x int,@sum int
set @x = 1
set @sum = 0
while @x < 10
begin
set @x = @x + 1
if @x % 2 = 0
set @sum = @sum + @x
else
continue
end
print @sum
4.7 RETURN
RETURN 语句用于从查询或过程中无条件退出。RETURN 语句可在任何时候用于从过程、批处理或语句块中退出,位于 RETURN 之后的语句不会被执行。
declare @x int
set @x = 3
if @x > 0
print '遇到return之前'
return
print '遇到return之后'
4.8 GOTO
GOTO 命令用来改变程序执行的流程,使程序跳到标志符指定的程序行再继续执行下去。
标志符需要在其名称后面加上一个冒号":"
declare @x int
select @x = 1
loving:
print @x
select @x = @x + 1
while @x <= 3
goto loving
4.9 WAITFOR
WAITFOR 指定触发器、存储过程或事务执行的时间、时间间隔或事件;还可以用来暂时停止程序的执行,直到所设定的等待时间已过才继续执行下去。
其中,时间必须为 datetime 类型的数据,如 11:12:13,但不能包括日期。
各关键字含义如下:
DELAY:用来设定等待的时间,最多可达24小时。
TIME:用来设定等待结束的时间点。
--3秒后执行
WAITFOR DELAY '00:00:03'
PRINT 'Hello World'
--9点52分55秒执行
WAITFOR TIME '09:52:55'
PRINT 'Hello World'