第三章(T_SQL编程与高级查询)
T_SQL的简介
一、概念:
微软对SQL的扩展,具有SQL的主要特点,同时增加了变量、运算符、函数、流程控制和注释等语言元素,使其功能更加强大。
二、T_SQL的分类
1、变量声明 局部变量@ 全局变量@@
2、数据定义语言(DDL) 用来建立数据库及数据库对象 create开头
3、数据控制语言(DCL) 用来控制数据库组件的存取、许可、权限等命令
4、数据操作语言(DML) 用来操作数据库中数据的命令 eg:select、update
5、流程控制语言(FCL) 用于控制应用程序流程的语句 eg:if、 case
T_SQL中的注释
一、概念:
注释是程序代码中不执行的文本字符串
二、两种方式
1、嵌入行内的注释语句
--:该符号将注释语句与语句分开,也可以使某一行数据无效
2、块注释语句
以/*开始,*/结束
T_SQL中的批处理
10条插入语句 不加go批处理关键字的话 sql引擎 会一条一条处理(会影响效率)
加go批处理关键字的话 sql引擎 会一次性处理(提高处理效率)
变量
一、局部变量:
局部变量必须以标记@作为前缀 ,如@age
局部变量的使用也是先声明,再赋值
局部变量赋值用set或select
1、声明T_SQL局部变量
declare @变量名 变量数据类型
示例 declare @count int,@count2 int
declare @count1 int
2、为T_SQL变量赋值
set select
示例: set @count = 1 赋值只能一种
select @count = 1 赋值一般配合查询
select @name = StuName from student where StuNo = 'S25301'
3、局部变量的作用域
变量的作用域就是可以引用该变量的T_SQL语句的范围。变量的作用域从声明变量的地方开始到声明变量好的批处理或存储过程的结尾
4、局部变量的应用
作为计数器计算循环执行的次数或控制循环执行的次数
保存数据值以供控制流语句测试
保存存储过程要返回的数据值或函数返回值
二、全局变量:
局部变量必须以标记@作为前缀 ,如@age
全局变量必须以标记@ @作为前缀,如@@version
全局变量由系统定义和维护,我们只能读取,不能修改全局变量的值
全局变量都使用两个@标志作为前缀
变量 |
含义 |
@@ERROR |
最后一个T-SQL错误的错误号 |
@@IDENTITY |
最后一次插入的标识值 |
@@LANGUAGE |
当前使用的语言的名称 |
@@MAX_CONNECTIONS |
可以创建的同时连接的最大数目 |
@@ROWCOUNT |
受上一个SQL语句影响的行数 |
@@SERVERNAME |
本地服务器的名称 |
@@TRANSCOUNT |
当前连接打开的事务数 |
@@VERSION |
SQL Server的版本信息 |
输出语句
print 字符串 变量 函数 字符串表达式
T_SQL的流程控制
一、 if-else
if(判断条件)
begin
语句1
语句2
end
else
begin
语句1
语句2
end
二、case语句
-- 简单格式
select pcid,
case PCUse
when 0 then '空闲'
when 1 then '忙碌'
end as 'pcuse'
,pcnote from pcinfo
-- 搜索格式
select pcid,
case
when PCUse = 0 then '空闲'
when PCUse = 1 then '忙碌'
end as 'pcuse'
,pcnote from PCInfo
三、while语句
while (循环成立的条件)
语句xxx
[break]
[continue]
子查询
一、子查询在WHERE语句中的一般用法:
SELECT … FROM 表1 WHERE 字段1 >(子查询)
外面的查询称为父查询,括号中嵌入的查询称为子查询
UPDATE、INSERT、DELETE一起使用,语法类似于SELECT语句
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个
二、使用子查询替换表连接
一般来说,表连接都可以用子查询替换,但有的子查询却不能用表连接替换
子查询比较灵活、方便,常作为增删改查的筛选条件,适合于操纵一个表的数据
表连接更适合于查看多表的数据
EXISTS(存在)子查询
IF EXISTS (子查询)
语句
如果子查询的结果非空,即记录条数1条以上,则EXISTS (子查询)将返回真(true),否则返回假(false)
EXISTS也可以作为WHERE 语句的子查询,但一般都能用IN子查询替换
not exists 不存在
in和not in查询
eg:select * from 表名1 where stuclass(列名) in(select 表2的列 from 表名2)