SQL Server 数据库基础笔记分享(下)

发布时间:2018-11-15  栏目:SQL  评论:0 Comments

–》》》右外搭
–代表只要用右表(right join
右边的表)中的富有数据都来得,左表中单单展示那些匹配的数量。

流淌:内容比较基础,适合入门者对SQL
Server 数据库的摸底!!!

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

1.主键:

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

–查询年龄当20-30春中的男学生
select
fname as 姓名 from MyStudent where fage between 20 and 30 and
fgender=’男’

–4.刑满释放资源
deallocate cur_Student

–查询表中数据
select * from Class

–用一漫长告句也表增加多只框
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

11.日期函数

6.仓储过程

–计算两个时刻不一
–查询90年相差今是稍稍年
select datediff(year,’1990-9-9′,getdate())

笔记不全,还求见谅!希望对而有所提高。

–查询有姓名被要包含一个‘民’字即可。
select * from MyStudent where fname like ‘%民%’

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

–查询数学成绩最高低分
select max(fMath) as 数学成绩最高分 from MyStudent
select min(fMath) as 数学成绩低分 from MyStudent

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

 

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

–将Class表中之数据备份到Student表中
–这种写法会将Class表中之所有数据插入到Student表中
–前提是Student表不存,如果这表存在则报错。
select * into Student from Class

后记

select
–distinct / top 之类的重要字
fgender as 性别, –5》选择列
count(*) as 人数
from MyStudent –1》先从表中拿到数量
where fage>30
–2》从MyStudent的多寡遭到筛选产生富有年龄超过30东之甭管之信
group by fgender –3》按照性别分组,分完组得到一个初的结果集
having count(*)>500
–4》基于分组以后的结果集,然后还筛选,筛选出那些组中记录大于500之组
order by 人数 asc –6》最后将显示出来的结果排序

–查询学生姓名、年龄、班级以及成绩(成绩属于第三张表)
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

》》》》》》》》》char(10)与nchar(10)的区别《《《《《《《《《

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

–将年也19寒暑的又性别为0的口之全名两度★改呢☆
update Class set ClassName =replace (tname,’★’,’☆’) where tage=19 and
tgender=0

–在视图中之询问语句,必须也各一样列创建一个列名
create view vw2
as
select
tsname,
case
when tsage>13 and tsage<=16 then ‘少年’
when tsage>50 then ‘老年’
else ‘青壮年’
end as 称呼
from TblStudent

–null值与其它数据运算后获得的要null值。
update MyStudent set fage=fage+1 where fid=1

4.声明变量和祭

–insert into…values.. 这种写法每次只能插入一长数据

–输出值
exec usp_Add 100,230

–创建表
create table Class
(
ClassId int identity(1,1) primary key,
ClassName varchar(50) not null,
ClassDesc varchar(50) not null
)

–1》显示第一页的多寡
–分页查询的早晚首先是将数据排序
select * from Student order by id desc

–查询有fmath为非null的值
select * from MyStudent where fMath is not null

–在视图中未能够利用order by语句。除非:另外还指定了top 或for xml
–错误
create view vw3
as
select * from TblStudent order by tsage desc

9.null 问题

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

–having是group
by的规格对分组后底数量进行筛(与where类似,都是筛选,只不过having是故来罗分组后的组的)
select
classid as 班级号,
count(*) as 班级人数
from TblStudent
where fgender=’男’
group by classid
having count(*)>2

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

–统计出mystudent表中,男女同学的个数

–删除一个囤积过程
drop proc usp_Add

–创建一个数据库
create database School

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

》》》》》》》》》删除重复数据就保留一修(id最小之一模一样修)《《《《《《《《《
》》》》》》》》》删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留出rowid最小之记录 《《《《《《《《《
delete from people
where peopleName in (select peopleName from people group by peopleName
having count(peopleName) > 1)
and peopleId not in (select min(peopleId) from people group by
peopleName having count(peopleName)>1)

–右外联和左外联都是预先拿匹配的数码找到,然后又用那些没有匹配的数额增长进去,(注意:不是一同查询出来的,有先后顺序)

–删除数据库
drop database School

–查询所有学员的姓名、年龄和所在班级 (班级在其它一个表中)
–当大抵独列在不同之表中时,要跨表查询,所以一般可以运用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(只询问两个说明中都有的数据)

–请查询有学生说明中有数学成就为null的人口的音
–null在数据库被代表unknow(不晓得),判断一个价是否为null,也就无可知为此=或者<>来判定
select * from MyStudent where fMath=null 错误(不返外数据)

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

–为Class表中插入多漫漫数
–重复数据未还插入,union关键字本身就具备去丢还的意
–union | union all (重复插入)
insert into Class
select ‘大三’,’三年’ union
select ‘三五’,’间谍’ union
select ‘一一’,’多久’ union
select ‘六七’,’得到’

–插入数据
insert into Teacher values(‘网名好’,’12352536′,’Wjifdfji@qq.com’)

select
fgender as 性别, –这时,count(*)统计的是每一样组的记录条数,
不是总条数
count(*) as 人数
from MyStudent group by fgender –先执行group by语句子分组,分完组在统计每
组个数。 分出来几独组,那么count(*)就统 计几次

局部临时表:表名以#也初步。只当目前对话中中,不可知跨越连访问。如果直白在一连会话中开创,则当前接连断开后去除,如果是当蕴藏过程遭到开创的,则存储过程执行了后删除

前言

–创建一个囤过程计算两只数之以及
create procedure usp_Add
@num1 int,
@num2 int
as
begin
print @num1+@num2
end

–分数评级
–90以上 优秀
–80以上 良好
–70以上 中
–70以下 差
select chengji,
评级=
case
when shuxue>=90 then ‘优秀’
when shuxue>=80 then ‘良好’
when shuxue>=70 then ‘中’
else ‘差’
end
from Student

–查询没有参加考试的生的真名及号码
–把左表(left join
关键字左边的表)中的全方位记录都来得出来,对于那些当右表中能够找到匹配的笔录,显示对许配合数据,对于那些右表中找不交相当的记录显示也null
select
ts.tsid,
ts.tsname,
TblScore.*
from TblStudent as ts
left outer join TblSore.tsid=ts.tsid   –outer可以无写

 

–提交事务
commit transaction

》》》》》》》》》语句执行各个《《《《《《《《《

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

5.update 数据

–2.1.1拿游标向后动一长
fetch next from cur_Student

nchar(10)
表示可储存10个假名或10单汉字,因为每个字符都是据unicode方法来囤积的。当用nchar(10),来存储数据的下无论存储的凡华语还是英文都是每个字符占2独。

–》》》全局变量
print @@language
print @@version
print ‘aaa’+100
–通过判断@@error变量中是否非也0,就可判断上亦然长长的sql语句执行是否出错了
–如果@@error为0,表示达成同一漫长sql语句执行没有出错,如果@@error不为0,则意味达成一致条sql语句出错了。
print@@error

select
最高分=(select max(fMath) as 数学成绩最高分 from MyStudent),
低于分=(select min(fMath) as 数学成绩低分 from MyStudent),
平均分=(select avg(fMath) as 平均分 from MyStudent)

作业有四个特性:原子性 一致性 隔离性 持久性
原子性:对于数据修改,要么全都执行,要么全都不履
一致性:当数码就时,数据必须处于相同状态
隔离性:对数码开展改动的兼具并发事务时彼此隔离的。这标志工作必须是独立的,它不应允以另外方法凭让要影响其它事情
永久性:事务完成后,他对数据库的改动被永远保持,事务日志能够保障业务之永久性

char(10) 可以储存10只假名或5独汉字。
用来囤积数据的上,英文站1个字节,中文站2个字节。

–为EmpName增加一个唯一约束
alter table Class add constraint UQ_Class_EmpName unique(EmpName)

8.聚合函数

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

4. 创建表

正文

–语句执行顺序
from > where > group by > having > select > order by

–删除数据
–sql
server中之触发器是表级触发器,无论去多少行抑插多少行,只触发一样不良
–是依语句来点的,每次执行同样不善话,触发一糟糕触发器
delete from Teacher where tcid>18

–查询班级之阳同学的食指过2之音讯

–》》》局部变量
–声明变量
declare @name varchar(10)
declare @age int

正文

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

–查询一个日子的特定部分
select year(getdate())
select datepart(year,getdate())

–回滚事务
rollback transaction

10.分组group by

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

–删除表
drop table Class

–3.停歇游标
close cur_Student

7.极查询,模糊查询

流动:内容比较基础,适合入门者对SQL
Server 数据库的问询!!!

3. 创数据库

2.连表查询

–查询所有姓赵的校友 (通配符%意味着:任意多只随机字符)
select * from MyStudent where fname like ‘赵%’

–存储过程遭到的参数的题目
–存储过程要发参数,则调用的时要也参数赋值
exec usp_Add –不传参数则报错

正确 select * from MyStudent where fMath is null

–输出值
print @name
print @age

6.剔除数据

–》》》左外联接(左联接)

–查询数学没有过关的学习者的学号
select
fid as 学号,
fmath as 分数
from MyStudent where fmath<60

–》》》练习:查询所有学员(参加与不到场的考)的生姓名、年龄、成绩,如果没参加考试显示缺考,如果小于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

–为Class表中插入数据
insert into Class(ClassName,ClsDesc)values(‘大三’,’三年’);

–次个参数如果用户不传染,则发出一个默认值
create procedure usp_Add
@num1 int,
@num2 int 1000 –为存储过程的参数设置默认值
as
begin
print @num1+@num2
end

–切换数据库
use school
go

视图本身并无存储数据,只是存储的询问语句,如果管真正表中的多寡修改后,则经过视图查询及之结果吗易了。

主键的打算:保证表中的各国条数的唯一性
特色: 主键不能够重复 不能够吧空
分类:
逻辑主键:选择啊表中长的那些“自动编号”列或者“GUID”列为主键(没有实际业务上的意思)的主键
(建议采取逻辑主键)
业务主键:选择表中那些在作业中来实际意义的列作为主键
》》》》》》》》》选择主键的政策,选哪些的列作为主键《《《《《《《《《
1》主键,建议选择那些一般不会见吃修改的排列
2》选择单列,不挑多排列(不用做主键)
3》选择那些简单列(整数列(自动编号))

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

2.char(),nchar(),varchar()之间的区分

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

后记

–创建一个自定义的仓储过程
create proc usp_HelloWorld
as
begin
print ‘hello world’
end

–查询有姓名中隐含‘民’或‘用’的同室
–通配符[]:表示中括号被之随意独字符,只挑一个配合
–通配符 ^a :表示除了a这个字符都执行。
select * from MyStudent where fname like ‘%[民用]%’

本文是私家学习SQL Server 数据库时之陈年笔记的重整,内容重点是针对数据库的着力增删改查的SQL语句操作封锁,视图,存储过程,触发器的主导了解。

–创建数据库的时刻,指定一些数据库的相干参数。
create database School
on primary –主数据文件
(
name=’School’,
size=10mb,
filename=’c:school.mdf’,
filegrowth=10%,
maxsize=100mb
)
log on –日志文件
(
name=’School_log’,
filename=’c:school.ldf’,
size=5mb,
filegrowth=5mb,
maxsize=50mb
)

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

–将装有年龄低于20东之人之春秋还改变成为19(tage是Class表后加属性)
update Class set tage=19 where tage<20

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

正文是个人学习SQL Server 数据库时的早年笔记的重整,内容要是针对数据库的基本增删改查的SQL语句操作格,视图,存储过程,触发器的中心了解。

–也年加一个反省约,年龄必须在1—120寒暑间(包含)
alter table Class add constraint CK_Class_EmpAge check(EmpAge>=0
and EmpAge<=120)

–请查询有具有入职一年以上之员工信息
select * from TblStudent
where dateadd(year,1,tsday)<getdate()

尽量避免在触发器中尽耗时操作,因为触发器会和sql语句认为以跟一个作业中(事务不结,就无法自由锁)

》》》》》》》》》char(10)与varchar(10)的区别《《《《《《《《《
char(10)
固定长度,表示在数据库被储存的时刻占用10只字节的长空,如果超出10独则报错,如果无足够10个则就此空格补全。
varchar(10)
可更换长,表示该列最多足储存10个字节,如果实在存储不足够10单字节,则会于囤的时刻自动计算一下实际上的蕴藏个数,而动态的变更长度。【节省空间】

–同漫长告词删除多独约束,约束名用 逗号 隔开
alter table Class drop constraint
PK_Student_DeptId,
FK_Class_Student,
CK_Class_EmpAge

delete from Class –删除所有数据 自动编号没有过来至默认值
可以根据标准来删除
truncate table Class –重新安了自动编号
删除只能一次性还清空,不能够依据规则来删除
清除速度(性能)比delete语句快的大都

–增加一排列(增加一列EmpAddr varchar(1000))
alter table Class Add EmpAddr varchar(1000)

–于一个早就是的表中插入数据,数据的起源是Class表
insert into Student(ClassName,ClsDesc)
select ClassName,ClsDesc from Class

视图的目的是好查询,所以一般情况下非克对视图进行增删改查

 

–创建插入数据触发器
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

–输出所有数据中通话时间最丰富之5久记下。
select top 5
*,’通话时增长(秒)’=datediff(second,Startdatetime,Enddatetime) from
Calltecords order by datediff(second,Stardatetime,enddatetime) desc

–创建分页存储过程
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

下篇分享视图、触发器等,分页查询、子查询、连表查询等

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

–查询班级id 1 2 3 的装有学生
select * from MyStudent where classid in (1,2,3)

–输出存储过程
exec usp_HelloWorld

–查询有姓赵的同窗,并且姓名字数是3独
–通配符 _ :表示任意的么字符。
select * from MyStudent where fname like ‘赵__’
select * from MyStudent where fname like ‘赵%’ and len(fname)=3

–为EmpId增加一个主键约束
alter table Class add constraint PK_Class_EmpId primary key(EmpId)

delete from Class where tage=19 or tage is null –删除19寒暑或者空值

–》》》通过while计算1-100中有奇数的与

–平均分(计算平均分的时候针对空值不处理)
select avg(fMath) as 平均分 from MyStudent

–把另外一个查询的结果当当下询问的基准来行使。
–子查询中=、!= 、< 、> 、<=
、>=之后只能回到单个值,如果多独价值就是见面报错
–解决办法 可以就此in 代替
select * from Student
where tbage in(select tbage from Student where tbname=3)

 

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

–求数据记录中之到底条数(总人数)
select count(*) as 班级总人数 from MyStudent

–将一个询问结果作另外一个询问的查询源
select * from (select * from Student where tbage between 3 and 5)
as ct where tbname=5 –ct是新创建的表名

 

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

–声明变量并初始化

–1.概念游标
declare cur_Student cursor fast_forward for select * from Student

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

1.子查询

大局临时表:表名以##为初步。多独会说话不过共享全局临时表。当创建全局临时表的对话断开,并且没有用户正在访问全局临时表时删除

前言

7.触发器

8.游标

10.(补充)约束

–账户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

–》》》full join 是查询所有的数据(没有的为空)

3.视图

5.事务

 

9.(补充)全局临时表,局部临时表

–2.开拓游标
open cur_Student

–也性增加一个默认约束,默认为男
alter table Class add constraint DF_Class_EmpGender default(‘男’) for
EmpGender

–打开工作
begin transaction

 

–赋值
set @name=’yhz’
set @age=17

–第七页数据 每页5久数
–over属于开窗函数

留下评论

网站地图xml地图