二、第二章 Transact-SQL 编程:
1.简介:T-SQL语言用于管理SQL Sserver数据库引擎实例,创建和管理数据库对象,以及插入、检索、修改和删除数据;满足国际标准:支持:变量的定义、输出、逻辑控制语句,称为T-SQL 编程;
2.变量:可以存储数据值的对象
1)局部变量:
a)概念:用户自定义的变量,作用范围仅在程序内部;
b)声明语法:declare @变量名 变量类型,@变量名 变量类型….
c)赋值语法:select @局部变量 = 变量值
d)赋值语法:set @局部变量=变量值
e)作用:保存临时数据、传递数据;
f)提示:使用print 进行打印:print ‘dd’
2)全局变量:
a)概念:SQL Server 系统内部使用的变量,作用范围任何程序随时调用;不是用户的程序定义的,他们是在服务器级定义的,只能使用预先说明及定义的全局变量;
b)使用方式:引用全局变量必须以@@开头
c)例子:@@error ,该变量的含义:返回执行上一个T-SQL语句的错误号;
3)输出语句:
a)概念:T-SQL支持输出语句,用于输出处理的数据结果;
b)语法1:print 变量或表达式
c)语法2:select 变量或表达式
d)提示注意:print 命令想客户端返回一个结果的字符串信息,如果变量值不是字符串的必须转换为字符串:
e)字符串转换语法:convert(转换后的类型,变量)
f)例如:print ‘’+convert(varchar(10),@@IDENTITY)
4)逻辑控制语句
a)If-else:if 条件表达式 begin end else begin end ; 注:begin…end 相当于java中的{}
b)While…continue…break:
语法:while<条件表达式>
Begin
<命令行或语句块>
[Break]
[continue]
[语句块]
End
c)Case:语法如下
Case
When <条件表达式> then <运算式>
When <条件表达式> then <运算式>
Else <运算式>
End
d)批处理:包含一个或多个T-SQL语句的组,从应用程序一次性的发送到SQL Server执行;批处理被编译成一个可执行单元,称为执行计划,执行计划中的语句每次执行一条;Go 关键字标识这批处理的结束;
三、第三章 SQL 高级查询
1.简介:高级查询技术包括:嵌套子查询、聚合技术、排序函数、集合运算符和公式表达式;
2.嵌套子查询:
1)子查询简介:任何使用表达式的地方都可以使用子查询;子查询也称为内部查询或内部选择,包含子查询的语句称为外部查询或外部选择;
2)子查询的特点和优势:
a)使用灵活:可以作为条件、临时表、列进行使用;
b)降低SQL语句的复杂度,提高SQL语句的可读性;
3)子查询作为条件使用:
a)提示:在查询条件中使用, > < = 符号后的子查询的结果只能有一个值;
4)子查询作为临时表使用:
5)子查询作为列使用:
6)使用in 和 not in 完成子查询:
a)In 和 not in 通常在where 子句中使用,在in 和 not in 后接的子查询中,可以有多个值出现;
7)使用exists 和not exists 完成子查询:
a)概念:exists 和 not exists 表示存在和不存在的意思;
b)用法:在语句中判断exists 后接的子句是否存在;
8)使用some any all 进行子查询:
a)提示:在SQL 中 some any all 后面必须跟的是子查询;
b)All:表示的是能够满足all所接的子查询中的所有值才成立;即:大于最大值
c)Any:至少大于一个值,即:大于最小值;
3.聚合技术:
1)使用COMPUTE 和 COMPUTE BY 进行汇总查询
a)优势:查看明细,查看汇总;
b)理论:使用COMPUTE 进行汇总计算后的查询得到两个结果集,第一个结果集返回查询语句前面的明细,后一个结果集返回汇总的结果;
c)COMPUTE 子句需要的信息:
A.可选BY 关键字,它基于每一列计算指定的行聚合;
B.行聚合函数名称;sum avg min max count
C.要对其执行行聚合函数的列;
d)例如:select * from stumarks order by subject compute avg(score) by (subject) 分组汇总;
e)注意:在使用COMPUTE BY 进行分组计算时要注意COMPUTE BY 的分组依据要与主查询的排序(ORDER BY) 对应;
4.排序函数:
1)起因:在应用程序中需要对查询结果进行排序并且需要给出排序的序号;
2)ROW_NUMBER函数:
a)特点:没有并列编号,不跳空编号;
b)例子:select ROW_NUMBER() over(order by score desc)as 排名,s1.name,s2.score from stuinfo s1,marks s2 where s1.id = s2.id and ss2.subject=’java’
3)RANK 函数:
a)特点:有并列编号,有跳空编号;
4)DENSE_RANK 函数:
a)特点:有并列编号,不跳空;
5)使用PARTITION BY 分组子句:
a)用法:和排序函数联合使用,进行分组;
b)例子:select ROW_NUMBER() over(partition by s2.subject order by score desc)as 排名,s1.name,s2.score from stuinfo s1,marks s2 where s1.id = s2.id and ss2.subject=’java’
6)公式表达式:CET
a)由来:查询过程中需要一些中间表,这些表会被反复的使用;解决这一问题使用公式表达式;
b)用法:可以将公式表达式视为临时结果集;
c)语法:WITH expression_name(列,列)
As
(
查询语句;
)
Select * from expression_name
Go
d)注意:只有在查询定义中为所有结果列提供了不同的名称时,列名称列表才是时可选的;
5)创建索引:
a)语法:create [unique][clustered | nonclustered] index index_name on table_name(column_name) [with fillfactor=x]
b)参数说明:[unique] 创建唯一索引; clustered 聚集索引,反之;
c)用法:select * from t_name with(index=IX_score) where……
d)注意:其实索引创建后并不需要使用,系统会自动优化查询;
e)适合创建索引的列:某列频繁的被用于数据搜索时,或者该列用于对数据进行排序时可以创建成索引;
f)不适合创建索引的列:列中仅有几个不同的值,或者表中仅包含几行值;例如:性别列
2.视图:
1)概念:视图是一个虚拟的数据表;没有真实的数据在视图中存储;
2)创建视图准则:
a)遵循命名规范;
b)视图嵌套不超过32层;
c)规则和default定义不能与视图关联;
d)定义视图的查询中不能包含:compute by 子句,into 关键字
e)不能包含order by 子句,除非在select 语句中有一个top子句;
3)语法:create view view_name(别名,查询列对应的名称) as <查询语句>
4)加密视图:create view view_name with ENCRYPTION as 语句 go
b)注意:创建触发器的时候必须是批处理的第一条语句;
c)Set nocount on 不显示T-SQL 语句的影响记录行数;
5)Update类型触发器:
a)用途:主要是获取更新的数值,判断该数值是否满足一些特殊的约束;
b)特点:系统中执行两次操作,先删除,后增加;
6)Delete 类型触发器:
a)用途:可以用来对表删除之前进行备份;
b)使用知识点:insert into 新表 select * from 旧表
c)Select * into 新表 from 旧表
7)列级触发器:
a)用途:用来检测用户是否对某些列进行了修改;
b)用法:在update类型触发器中,使用update(列名)函数进行判断;
8)INSTEAD OF 类型的触发器:
a)与After类型触发器的区别:After触发器是对表进行操作后触发的,而instead of 类型触发器并不执行定义的操作,而是仅执行触发器本身的内容;
b)创建语法:
Create trigger trigger_name
On table_name
With encryption
Instead of update/delete/insert
As
T-SQL语句
Go
c)用法:例如删除两个各表中有主外键关系的数据时;
d)特点:使用instead of 触发器,可以直接删除主表中的数据,并且自动的删除从表中的数据,通过触发器达到级联更新的效果;