您的位置:首页 > 数据库

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

2013-05-21 13:23 267 查看
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现在不想写了,后面有更新可能会写上.....
--署名:黄飘龙


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现在不想写了,后面有更新可能会写上.....
--署名:黄飘龙
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: