mssql数据库基本语句总结(2)

  1 use cstn
  2 go
  3 --建立一个check约束
  4 alter table Student add constraint CK_Studetn_tSAge check(tsage between 0 and 100)
  5 go 
  6 
  7 --对貂禅的年龄进行修改
  8 update Student set tSAge=19 where tSId=9
  9 go 
 10 
 11 --select语句的执行过程
 12 select tsgender,count(1)--5从分完组的并经过筛选的结果中,取得能够得到列,构成新的结果集
 13 from student            --1从表中取结果集合
 14 where tsage>18          --2对集合内容进行筛选,得到新的结果集
 15 group by tsgender       --3对结果集进行分组  
 16 having count(*)>1       --4对分组后的结果进行筛选
 17 order by count(*) desc  --6最后对结果进行排列得到游标(非集合的结果,如果有top等就能从新变成集合)
 18 go
 19 --通配符 :_通配单个字符,%通配多个字符,^非通配符,[]选一通配符,在中括号中选一个匹配,带有转意的功能如[%],[[]等
 20 select * from Student
 21 go 
 22 --增加几列为后通配符做对比(一条语句加入多行信息写法)
 23 insert into Student(tsid,tsname,tsage)
 24 select 11,N'关飞',28
 25 select 11,N'关飞飞',28
 26 select 11,N'关飞飞云',28
 27 select 11,N'关%飞云',28
 28 --修改下主键某个值
 29 set identity_insert student on
 30 insert into  student(tid,tsid,tsname,tsage) values(21,11,N'关雨关%羽',28)
 31 set identity_insert student off
 32 go --????更新不了找原因???——>答案:不能update语句,但是能insert与语句而且要标明要插入的列的列明!!!!
 33 
 34 --事物回滚后主键自增2,不管有没有出错。
 35 begin tran 
 36 begin try
 37 insert into Student(tsid,tsname,tsage)
 38 select 11,N'关飞关',28 union all
 39 select 11,N'关飞飞',28 union all
 40 select 11,N'关飞飞云',28 union all
 41 select 11,N'关%飞云',28
 42 end try
 43 begin catch 
 44 commit
 45 end catch
 46 insert into student values (11,N'关雨_关%羽',28,N'')--测试主键是否自增,结果有
 47 go
 48 --通配符来选则对比
 49 select *from Student where tSName like N'关_'
 50 select *from Student where tSName like N'关__'
 51 select *from Student where tSName like N'关%'
 52 select *from Student where tSName like N'关[%]%'
 53 go 
 54 
 55 select * from Student
 56 go
 57 --局部临时表#表名,全局临时表##表名+两种表的插入方法
 58 select * into ##stu from student where tsgender=N''--表不存在插入表方法,*也可以用你要插入的字段代替
 59 go
 60 select* from ##stu 
 61 go
 62 insert into ##stu --!!!这种插入是插入的表头,不是接着表末尾插入的!!!!!且是要已经存在的表才可以这么插入表
 63 select tsid,tsage,tsname from student where tsgender=N'' order by tsid desc
 64 go
 65 drop table ##stu
 66 go
 67 
 68 --创建一个视图(!!!!注:在视图的查询语句中必须为每一列创建一个列明,如果列没有列名的话!!!!)
 69 create view vw1
 70 as
 71 select 
 72 *,
 73 case 
 74     when tsage>20 and tsage<25 then N'青少年'
 75     when tsage>=25 then N'成年了'
 76     when tsage<=20 then N'小屁孩'
 77     else N'没人要啦'
 78 end  -----没有给列取名字,所以报错,此时没有取名的列不作为视图的一部分,!!!此时没有报错的列一起生成了视图!!!!
 79 from Student
 80 go
 81 --修改视图时候用alter关键字代替create
 82 alter view vw1
 83 as
 84 select 
 85 *,
 86 case 
 87     when tsage>20 and tsage<25 then N'青少年'
 88     when tsage>=25 then N'成年了'
 89     when tsage<=20 then N'小屁孩'
 90     else N'没人要啦'
 91 end  as 称呼-----给列取名字,不报错了
 92 from Student
 93 go
 94 
 95 select * from vw1
 96 go
 97 
 98 --创建一个存储过程
 99 --(优点1.提前在数据编译好的,所以速度比较快2.提高系统安全性,防止spl注入攻击3.降低了网络流量,代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。4.允许模块化程序设计,类似方法复用)
100 --(缺点1.代码可读性差,相当难维护2.很多存储过程不支持面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,从而无法形成通用的可支持复用的业务逻辑框架。3.可移植性差,使用存储过程封装业务逻辑限制了应用程序的可移植性。这里不详细说明。。。)
101 create proc  usp_insert_stu 
102 @id int,
103 @name nvarchar(10),
104 @age int=45,
105 @gender nchar(2)=N''
106 as
107 begin 
108 insert into student values(@id,@name,@age,@gender)
109 end
110 go
111 --修改存储过程
112 alter proc  usp_insert_stu 
113 @id int,
114 @name nvarchar(10),
115 @age int=45,
116 @gender nchar(2)=N''
117 as
118 begin 
119 insert into student values(@id,@name,@age,@gender)
120 end
121 go
122 --执行一个存储过程
123 exec usp_insert_stu 12,N'黄忠6'
124 go
125 --删除一个存储过程
126 drop proc usp_insert_stu
127 go
128 select * from student
129 delete from student where tid>22
130 --总结视图和存储过程:1.视图和存储过程都是有as语法的2.视图一定不能有begin end,而存储过程可有可无,但是建议写上3.要修改时候两者直接把creat改为alter即可,这是其他语句(除了触发器!如下)所没有的特点!!!
131 
132 
133 
134 --和视图和存储过程有相似语法的——触发器
135 select *into ##test from student--1创建一个测试用的临时表导入student数据
136 truncate table ##test--2删除数据达到仅保留表结构的特点
137 --创建一个触发器(和事件类比,执行delete update 或者insert后(after或者代替(instead of))触发某个事件(那个看关键字用哪个)
138 go
139 create trigger tri_Student_delete_after 
140 on student after  delete 
141 as
142 begin
143       insert into ##test
144     select tid,tsid,tsname,tsage from deleted
145 end
146 go
147 
148 --修改下触发器的语法create 改为 alter即可
149 alter trigger tri_Student_delete_after 
150 on student after  delete 
151 as
152 begin
153     set identity_insert ##test on
154       insert into ##test(tid,tsid,tsname,tsage) 
155     select tid,tsid,tsname,tsage from deleted
156 end
157 --测试下delete的触发器
158 delete from student where tid>22
159 select * from #test
160 --删除一个触发器
161 drop trigger tri_Student_delete_after 
162 --触发器小小总结:1.触发器里头不要有太复杂的代码,因为触发器没有结束事件就没有结束。2.在修改或者创建触发器的时候要么单独执行要么在语句开头加个go,(表示上一个语句的结束(不准确的说法啊~确切的说是go之前是作为一个代码段发给数据库操作的)),因为create trigger和alter trigger语句必须是查询批次中第一句~~!!!!
163 
164 --游标的使用(效率低下,最好不要用)========(在视图,子查询,内联函数,派生表中只能是集合不能是游标)=====不解释
165 --自己看书去吧,游标cursor内容和级联jion现在不想写了,后面有更新可能会写上.....
166 --署名:黄飘龙

use cstn
go
--建立一个check约束
alter table Student add constraint CK_Studetn_tSAge check(tsage between 0 and 100)
go

--对貂禅的年龄进行修改
update Student set tSAge=19 where tSId=9
go

--select语句的执行过程
select tsgender,count(1)--5从分完组的并经过筛选的结果中,取得能够得到列,构成新的结果集
from student            --1从表中取结果集合
where tsage>18          --2对集合内容进行筛选,得到新的结果集
group by tsgender       --3对结果集进行分组 
having count(*)>1       --4对分组后的结果进行筛选
order by count(*) desc  --6最后对结果进行排列得到游标(非集合的结果,如果有top等就能从新变成集合)
go
--通配符 :_通配单个字符,%通配多个字符,^非通配符,[]选一通配符,在中括号中选一个匹配,带有转意的功能如[%],[[]等
select * from Student
go
--增加几列为后通配符做对比(一条语句加入多行信息写法)
insert into Student(tsid,tsname,tsage)
select 11,N'关飞',28
select 11,N'关飞飞',28
select 11,N'关飞飞云',28
select 11,N'关%飞云',28
--修改下主键某个值
set identity_insert student on
insert into  student(tid,tsid,tsname,tsage) values(21,11,N'关雨关%羽',28)
set identity_insert student off
go --????更新不了找原因???——>答案:不能update语句,但是能insert与语句而且要标明要插入的列的列明!!!!

--事物回滚后主键自增2,不管有没有出错。
begin tran
begin try
insert into Student(tsid,tsname,tsage)
select 11,N'关飞关',28 union all
select 11,N'关飞飞',28 union all
select 11,N'关飞飞云',28 union all
select 11,N'关%飞云',28
end try
begin catch
commit
end catch
insert into student values (11,N'关雨_关%羽',28,N'男')--测试主键是否自增,结果有
go
--通配符来选则对比
select *from Student where tSName like N'关_'
select *from Student where tSName like N'关__'
select *from Student where tSName like N'关%'
select *from Student where tSName like N'关[%]%'
go

select * from Student
go
--局部临时表#表名,全局临时表##表名+两种表的插入方法
select * into ##stu from student where tsgender=N'男'--表不存在插入表方法,*也可以用你要插入的字段代替
go
select* from ##stu
go
insert into ##stu --!!!这种插入是插入的表头,不是接着表末尾插入的!!!!!且是要已经存在的表才可以这么插入表
select tsid,tsage,tsname from student where tsgender=N'女' order by tsid desc
go
drop table ##stu
go

--创建一个视图(!!!!注:在视图的查询语句中必须为每一列创建一个列明,如果列没有列名的话!!!!)
create view vw1
as
select
*,
case
 when tsage>20 and tsage<25 then N'青少年'
    when tsage>=25 then N'成年了'
    when tsage<=20 then N'小屁孩'
 else N'没人要啦'
end  -----没有给列取名字,所以报错,此时没有取名的列不作为视图的一部分,!!!此时没有报错的列一起生成了视图!!!!
from Student
go
--修改视图时候用alter关键字代替create
alter view vw1
as
select
*,
case
 when tsage>20 and tsage<25 then N'青少年'
    when tsage>=25 then N'成年了'
    when tsage<=20 then N'小屁孩'
 else N'没人要啦'
end  as 称呼-----给列取名字,不报错了
from Student
go

select * from vw1
go

--创建一个存储过程
--(优点1.提前在数据编译好的,所以速度比较快2.提高系统安全性,防止spl注入攻击3.降低了网络流量,代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。4.允许模块化程序设计,类似方法复用)
--(缺点1.代码可读性差,相当难维护2.很多存储过程不支持面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,从而无法形成通用的可支持复用的业务逻辑框架。3.可移植性差,使用存储过程封装业务逻辑限制了应用程序的可移植性。这里不详细说明。。。)
create proc  usp_insert_stu
@id int,
@name nvarchar(10),
@age int=45,
@gender nchar(2)=N'男'
as
begin
insert into student values(@id,@name,@age,@gender)
end
go
--修改存储过程
alter proc  usp_insert_stu
@id int,
@name nvarchar(10),
@age int=45,
@gender nchar(2)=N'女'
as
begin
insert into student values(@id,@name,@age,@gender)
end
go
--执行一个存储过程
exec usp_insert_stu 12,N'黄忠6'
go
--删除一个存储过程
drop proc usp_insert_stu
go
select * from student
delete from student where tid>22
--总结视图和存储过程:1.视图和存储过程都是有as语法的2.视图一定不能有begin end,而存储过程可有可无,但是建议写上3.要修改时候两者直接把creat改为alter即可,这是其他语句(除了触发器!如下)所没有的特点!!!

--和视图和存储过程有相似语法的——触发器
select *into ##test from student--1创建一个测试用的临时表导入student数据
truncate table ##test--2删除数据达到仅保留表结构的特点
--创建一个触发器(和事件类比,执行delete update 或者insert后(after或者代替(instead of))触发某个事件(那个看关键字用哪个)
go
create trigger tri_Student_delete_after
on student after  delete
as
begin
   insert into ##test
    select tid,tsid,tsname,tsage from deleted
end
go

--修改下触发器的语法create 改为 alter即可
alter trigger tri_Student_delete_after
on student after  delete
as
begin
    set identity_insert ##test on
   insert into ##test(tid,tsid,tsname,tsage)
    select tid,tsid,tsname,tsage from deleted
end
--测试下delete的触发器
delete from student where tid>22
select * from #test
--删除一个触发器
drop trigger tri_Student_delete_after
--触发器小小总结:1.触发器里头不要有太复杂的代码,因为触发器没有结束事件就没有结束。2.在修改或者创建触发器的时候要么单独执行要么在语句开头加个go,(表示上一个语句的结束(不准确的说法啊~确切的说是go之前是作为一个代码段发给数据库操作的)),因为create trigger和alter trigger语句必须是查询批次中第一句~~!!!!

--游标的使用(效率低下,最好不要用)========(在视图,子查询,内联函数,派生表中只能是集合不能是游标)=====不解释
--自己看书去吧,游标cursor内容和级联jion现在不想写了,后面有更新可能会写上.....
--署名:黄飘龙

原文地址:https://www.cnblogs.com/holong2003/p/3090574.html