本文是个人学习SQL Server 数据库时的以往笔记的

时间:2019-09-26 14:23来源:快三在线投注平台数据库
前言 正文是私家学习SQL Server 数据库时的陈年笔记的股盘的整理,内容根本是对数据库的基本 增加和删除改查的SQL语句操作 和 自律,视图,存款和储蓄进程,触发器 的中坚驾驭。

前言

正文是私家学习SQL Server 数据库时的陈年笔记的股盘的整理,内容根本是对数据库的基本增加和删除改查的SQL语句操作自律,视图,存款和储蓄进程,触发器的中坚驾驭。

注:内容比较基础,适合入门者对SQL Server 数据库的刺探!!!

正文

1.子查询

--把二个查询结果作为另外三个查询的查询源
select * from (select * from Student where tbage between 3 and 5)
as ct where tbname=5 --ct是新创的表名

--把其他一个询问的结果作为当前查询的原则来采纳。
--子查询中=、!= 、< 、> 、<= 、>=之后只可以回去单个值,若是三个值就能报错
--化解办法 能够用in 替代
select * from Student
where tbage in(select tbage from Student where tbname=3)

select * from Student
where tbage=(select tbage from Student where tbname=3)

》》》》》》子查询分页《《《《《《

--1》展现第一页的多少
--分页查询的时候首先是将数据排序
select * from Student order by id desc

--2》第一页 显示5条数据
select Top 5 * from Student order by id desc

--3》第二页
select top 5 * from Student
where id not in (select top 5 * from Student order by id desc)
order by id desc

--4》第三页
select top 5 * from Student
where id not in (select top (2*5) * from Student order by id desc)
order by id desc

》》》开窗函数分页《《《

--第七页数据 每页5条数据
--over属于开窗函数

select * from
(
select * ,row_number() over( order by id desc) as paixu from Student
) as tbl
where tbl.paixu between 6*5+1 and 7*5

2.连表查询

--查询全部学员的全名、年龄及所在班级 (班级在另三个表中)
--当多个列在差异的表中时,要跨表查询,所以一般能够动用inner join
--tc ts是对表名起的外号
select
ts.tsname,
ts.tsage,
tc.tclassname
from TblStudent as ts
inner join TblClass as tc on ts.tsclassid=tc.tclassid(只询问四个表中皆有的数据)

--》》》full join 是询问全体的数码(未有的为空)

---子查询写法
select
tsname,
tsage,
班级名称=(select tclassname from TblClass where TblClass.tclassid=TblStudent.tsclassid)
from TblStudent

--查询学生姓名、年龄、班级及成绩(战绩属于第三张表)
select
ts.tsname,
ts.tsage,
tc.tclasssname,
tscore.tenglish,
tscore.tmath
from TblStudent as ts
inner join TblClass as tc on ts.tsclassid=tc.tclassid 
inner join TblScore as tscore on tscore.tsid=ts.tsid

 

--》》》左外联接(中国左翼小说家联盟接)

--查询未有参预考试的上学的儿童的真名与数码
--把左表(left join 关键字左侧的表)中的全体笔录都展现出来,对于那多少个在右表中能找到相配的记录,展现对应十分数据,对于这一个右表中找不到特别的记录彰显为null
select
ts.tsid,
ts.tsname,
TblScore.*
from TblStudent as ts
left outer join TblSore.tsid=ts.tsid   --outer能够不写

--》》》右外过渡
--代表要将右表(right join 左侧的表)中的全数数据都展现,左表中只体现那个相称的数额。

select
ts.tsid,
ts.tsname,
TblScore.*
from TblStudent as ts
right outer join TblSore.tsid=ts.tsid

--右外联与左外联都是先将特出的数量找到,然后再将那个没有匹配的数目增加进去,(注意:不是一起查询出来的,有前后相继顺序)

--》》》练习:查询全部学生(加入和未到位的试验)的学习者姓名、年龄、战表,若无参预考试突显缺考,如果小于english大概math 小于60分显示不如格
select
ts.tsname,
ts.tsage,
tscore.tsid,
case
when tscore.tenglish is null then '缺考'
else convert(varchar(10),tscore.tenglish)
end as 葡萄牙语战绩,
case
when tscore.tmath id null then '缺考'
else convert (varchar(10),tscore.tmath)
end as 数学成绩,
是还是不是报名考试=
case
when tscore.tscoreid is null then '是'
else '否'
end
from TblStudent as ts
left join TblScore as tscore on ts.tsid=tscore.tsid

3.视图

视图本身并不存款和储蓄数据,只是存款和储蓄的查询语句,假诺把切实地工作表中的数据修改后,则透过视图查询到的结果也变了。

视图的指标是有助于查询,所以一般情状下无法对视图举行增加和删除改查

--在视图中的查询语句,必得为每一列创设三个列名
create view vw2
as
select
tsname,
case
when tsage>13 and tsage<=16 then '少年'
when tsage>50 then '老年'
else '青壮年'
end as 称呼
from TblStudent

--在视图中不能运用order by语句。除非:其他还点名了top 或for xml
--错误
create view vw3
as
select * from TblStudent order by tsage desc

--正确
create view vw3
as
select top 3 * from TblStudent order by tsage desc

4.扬言变量与运用

--》》》局地变量
--注解变量
declare @name varchar(10)
declare @age int

--赋值
set @name='yhz'
set @age=17

--输出值
print @name
print @age

--使用set与select为变量赋值的区分
declare @rcount int
set @rcount=(select count(*) from TblStudent)
print @rcount

declare @rcount int
select @rcount=count(*) from TblStudent
print @rcount

--》》》全局变量
print @@language
print @@version
print 'aaa'+100
--通过推断@@error变量中是否不为0,就能够判明上一条sql语句执行是或不是出错了
--就算@@error为0,表示上一条sql语句实践没出错,要是@@error不为0,则意味着上一条sql语句出错了。
print@@error

--》》》通过while计算1-100里面有着奇数的和

--申明变量并开始化

declare @sum int=0
declare @i int =1
while @i<=100
begin
if @i%2<>0
begin
set @sum=@sum+@i
end
end
print @sum

5.事务

事务有多少个属性:原子性 一致性 隔开性 悠久性
原子性:对于数据修改,要么全都实践,要么全都不推行
一致性:当数码变成时,数据必得处于同样状态
隔断性:对数码进行修改的有所并发事务时互相隔绝的。那声明专门的学问必须是单独的,它不应以其它措施注重于或影响别的事情
恒久性:事务实现后,他对数据库的更动被永恒保持,事务日志能够保持专门的学业的永久性

--张开专门的职业
begin transaction

--提交事务
commit transaction

--回滚事务
rollback transaction

--账户A给账户B转账 当一方出标题时,多少个语句都不进行
begin tran
declare @sum int=0
update bank set balance =balance-1000 where cid='0001'
set @sum=@sum+@@error
update banl set balance =balance+1000 where cid='0002'
set @sum=@sum+@@error

if @sum<>0
begin
rollback tran
print '回滚'
end
else
begin
commit tran
print '提交了'
end

6.仓库储存进程

--创造五个自定义的存款和储蓄进程
create proc usp_HelloWorld
as
begin
print 'hello world'
end

--输出存款和储蓄进度
exec usp_HelloWorld

--创立一个积存进度计算五个数的和
create procedure usp_Add
@num1 int,
@num2 int
as
begin
print @num1+@num2
end

--输出值
exec usp_Add 100,230

--存款和储蓄进度中的参数的难点
--存款和储蓄进度借使有参数,则调用的时候必得为参数赋值
exec usp_Add --不传参数则报错

--次之个参数假使客户不传,则有一个默许值
create procedure usp_Add
@num1 int,
@num2 int 1000 --为存款和储蓄进程的参数设置暗中同意值
as
begin
print @num1+@num2
end

--成立分页存款和储蓄进程
create proc usp_PageBum
@pageSize int, --每页呈现的数据
@pageIndex int --第几页
as
begin
select * from (select *,row_number()over (order by CityID asc)as num from S_City )as s
where s.num between (@pageIndex -1)*@pageSize +1 and @pageIndex *@pageSize
end
--查询第5页内容每页呈现10条数据
exec usp_PageBum 10,5

--删除二个仓库储存进程
drop proc usp_Add

7.触发器

尽量幸免在触发器中施行耗费时间操作,因为触发器会与sql语句认为在同一个政工中(事务不了事,就不恐怕自由锁)

--成立插入数据触发器
create trigger tri_Teacher_insert_after
on Teacher after insert
as
begin
declare @id int
declare @name varchar(10)
declare @phone int
declare @mail varchar(50)
select @id=tcid,@name=tcname,@phone=tcphone,@mail=tcmail from inserted

print @id
print @name
print @phone
print @mail
end

--插入数据
insert into Teacher values('网名好','12352536','Wjifdfji@qq.com')

--创建删除数据触发器
--不能够有主键
create trigger tri_Teacher_after
on Teacher after delete
as
begin
insert into TeacherBak
select * from deleted
end

--删除数据
--sql server中的触发器是表级触发器,无论删除多少行依旧插入多少行,只触发一回
--是按语句来触发的,每便施行二次讲话,触发一回触发器
delete from Teacher where tcid>18

8.游标

--1.定义游标
declare cur_Student cursor fast_forward for select * from Student

--2.张开游标
open cur_Student

--2.1 对游标的操作
--将每条数据读取并出口

--2.1.1将游标向后活动一条
fetch next from cur_Student

--将游标循环向后活动,直到最后
while @@fetch_status=0
begin
fetch next from cur_Student
end

--3.关门游标
close cur_Student

--4.获释财富
deallocate cur_Student

9.(补充)全局有的时候表,局地不经常表

局地一时表:表名以#为始发。只在最近对话中有效,不可能跨连接待上访谈。若是直白在一而再会话中开创,则当前连接断开后删除,假诺是在蕴藏进程中创立的,则存款和储蓄进程举办达成后删除

大局不经常表:表名以##为始发。多个会话可分享全局偶尔表。当创立全局有的时候表的对话断开,并且未有客户正在访谈全局不时表时删除

10.(补充)约束

--删除一列(EmpAddress列)
alter table Class drop column EmpAddress

--扩大一列(增添一列EmpAddr varchar(一千))
alter table Class Add EmpAddr varchar(1000)

--修改一下Emp 的数据类型(varchar(200))
alter table Class alter column Emp varchar(200)

--为EmpId扩张三个主键约束
alter table Class add constraint PK_Class_EmpId primary key(EmpId)

--为EmpName增添贰个独一约束
alter table Class add constraint UQ_Class_EmpName unique(EmpName)

--为性别扩充三个默许约束,默以为男
alter table Class add constraint DF_Class_EmpGender default('男') for EmpGender

--为岁数扩充三个检查约束,年龄必需在1—120岁以内(包涵)
alter table Class add constraint CK_Class_EmpAge check(EmpAge>=0 and EmpAge<=120)

--扩大外键约束,表Class中有一列EmpDeptId引用Student表中的DeptId
alter table Class add EmpDeptId int not null
alter table Student add constraint PK_Student_DeptId primary key(DeptId)

alter table Class add constraint FK_Class_Student foreign key(EmpDeptId)
references Student(DeptId)

--一条语句删除四个约束,约束名用 逗号 隔断
alter table Class drop constraint
PK_Student_DeptId,
FK_Class_Student,
CK_Class_EmpAge

--用一条语句为表增添多少个约束
alter table Class add
constraint PK_Student_DeptId primary key(DeptId),
constraint CK_Class_EmpAge check(EmpAge>=0 and EmpAge<=120),
add constraint DF_Class_EmpGender default('男') for EmpGender

后记

笔记不全,还请见谅!希望对您有所提升。

 

编辑:快三在线投注平台数据库 本文来源:本文是个人学习SQL Server 数据库时的以往笔记的

关键词:

  • 上一篇:没有了
  • 下一篇:没有了