菜单

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

2019年1月14日 - sqlite

–查询所有学员的全名、年龄及所在班级 (班级在另一个表中)
–当五个列在不同的表中时,要跨表查询,所以一般可以行使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(只询问四个表中都局部数据)

10.分组group by

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

–查询出姓名中假诺包含一个‘民’字即可。
select * from MyStudent where fname like ‘%民%’

–提交事务
commit transaction

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

–创制一个仓储过程总括多少个数的和
create procedure usp_Add
@num1 int,
@num2 int
as
begin
print @num1+@num2
end

7.标准查询,模糊查询

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

 

–把其它一个询问的结果作为当前查询的条件来利用。
–子查询中=、!= 、< 、> 、<=
、>=之后只好回去单个值,假若三个值就会报错
–解决办法 能够用in 代替
select * from Student
where tbage in(select tbage from Student where tbname=3)

11.日期函数

1.子查询

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

–输出值
print @name
print @age

–统计七个时间差
–查询90年距今是有点年
select datediff(year,’1990-9-9′,getdate())

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

–删除表
drop table Class

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的信息

作业有六个属性:原子性 一致性 隔离性 持久性
原子性:对于数据修改,要么全都执行,要么全都不实施
一致性:当数码形成时,数据必须处于同一状态
隔离性:对数码举办改动的富有并发事务时互相隔离的。这标志工作必须是独立的,它不应以任何措施看重于或影响其他工作
永久性:事务完成后,他对数据库的改动被永久保持,事务日志可以保持工作的永久性

–总结出mystudent表中,男女同校的个数

后记

nchar(10)
表示可以储存10个假名或10个汉字,因为各样字符都是比照unicode方法来储存的。当使用nchar(10),来囤积数据的时候无论存储的是粤语如故英文都是每个字符占2个。

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

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

笔记不全,还请见谅!希望对你有所进步。

–null值与任何数据运算后取得的仍然null值。
update MyStudent set fage=fage+1 where fid=1

–》》》全局变量
print @@language
print @@version
print ‘aaa’+100
–通过判断@@error变量中是不是不为0,就足以看清上一条sql语句执行是否出错了
–即使@@error为0,表示上一条sql语句执行没出错,假使@@error不为0,则意味着上一条sql语句出错了。
print@@error

–将有着年龄小于20岁的人的年龄都改成19(tage是Class表后加属性)
update Class set tage=19 where tage<20

前言

–查询所有姓赵的同窗 (通配符%象征:任意两个随机字符)
select * from MyStudent where fname like ‘赵%’

–2.打开游标
open cur_Student

–查询年龄在20-30岁之间的男学生
select
fname as 姓名 from MyStudent where fage between 20 and 30 and
fgender=’男’

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

9.null 问题

4.注脚变量与行使

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》最终把呈现出来的结果排序

7.触发器

delete from Class –删除所有数据 自动编号没有过来到默认值
可以按照条件来删除
truncate table Class –重新安装了自行编号
删除只好一遍性都清空,不可以按照规则来删除
清除速度(性能)比delete语句快的多

–扩张外键约束,表Class中有一列EmpDeptId引用Student表中的DeptId
alter table Class add EmpDeptId int not null
alter table Student add constraint PK_manbetx网页手机登录版,Student_DeptId primary
key(DeptId)

1.主键:

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

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

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

》》》》》》》》》char(10)与varchar(10)的区别《《《《《《《《《
char(10)
固定长度,表示在数据库中贮存的时候占用10个字节的上空,假使超出10个则报错,假设不够10个则用空格补全。
varchar(10)
可变长度,表示该列最多可以储存10个字节,假设实在存储不够10个字节,则会在仓储的时候自动测算一下实在的蕴藏个数,而动态的改观长度。【节省空间】

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

–删除数据库
drop database School

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

前言

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

8.聚合函数

一对临时表:表名以#为起头。只在此时此刻对话中行之有效,不可能跨连接访问。即便直白在连年会话中开创,则当前一连断开后去除,假诺是在仓储过程中创立的,则存储过程进行完毕后去除

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

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

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

正文

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

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

char(10) 能够储存10个假名或者5个汉字。
用来囤积数据的时候,英文站1个字节,闽南语站2个字节。

–》》》局部变量
–注解变量
declare @name varchar(10)
declare @age int

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

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

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

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

6.去除数据

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

主键的功效:保证表中的每条数据的唯一性
特色: 主键不可以重新 无法为空
分类:
逻辑主键:选拔为表中追加的那多少个“自动编号”列或者“GUID”列为主键(没有实际工作上的意义)的主键
(提议利用逻辑主键)
政工主键:选取表中这多少个在工作中有实际意义的列作为主键
》》》》》》》》》采用主键的方针,选什么样的列作为主键《《《《《《《《《
1》主键,指出选用那一个一般不会被改动的列
2》接纳单列,不采纳多列(不用组合主键)
3》采取这一个简单列(整数列(自动编号))

–存储过程中的参数的问题
–存储过程假使有参数,则调用的时候必须为参数赋值
exec usp_Add –不传参数则报错

4. 创建表

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

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

–》》》通过while总结1-100里边所有奇数的和

–向Class表中插入多条数据
–重复数据不另行插入,union关键字本身就拥有去掉重复的意趣
–union | union all (重复插入)
insert into Class
select ‘大三’,’三年’ union
select ‘三五’,’间谍’ union
select ‘一一’,’多久’ union
select ‘六七’,’得到’

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

–insert into…values.. 这种写法每趟只好插入一条数据

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

–创造一个数据库
create database School

–》》》训练:查询所有学员(插足和未到庭的试验)的学童姓名、年龄、成绩,假如没有参与考试展现缺考,即使小于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. 成立数据库

全局临时表:表名以##为伊始。两个会话可共享全局临时表。当创立全局临时表的对话断开,并且没有用户正在访问全局临时表时删除

–将年龄为19岁的还要性别为0的人的全名两边★改为☆
update Class set ClassName =replace (tname,’★’,’☆’) where tage=19 and
tgender=0

–》》》右外对接
–表示要将右表(right join
右侧的表)中的所有数据都映现,左表中只映现那一个匹配的数量。

 

视图本身并不存储数据,只是存储的询问语句,假使把真实表中的多少修改后,则经过视图查询到的结果也变了。

 

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

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

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

–创设数据库的时候,指定一些数据库的有关参数。
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
)

–3.关闭游标
close cur_Student

 

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

》》》》》》》》》删除重复数据只保留一条(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)

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

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

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

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

正文是个人学习SQL Server 数据库时的陈年笔记的重整,内容重假如对数据库的中心增删改查的SQL语句操作封锁,视图,存储过程,触发器的骨干了然。

–语句执行各种
from > where > group by > having > select > order by

8.游标

正文是私有学习SQL Server 数据库时的过去笔记的整理,内容紧如果对数据库的主导增删改查的SQL语句操作自律,视图,存储过程,触发器的骨干精通。

5.事务

–请查询出学生表中享有数学成就为null的人的信息
–null在数据库中代表unknow(不清楚),判断一个值是否为null,也就不可能用=或者<>来判定
select * from MyStudent where fMath=null 错误(不回去任何数据)

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

–请查询出所有入职一年以上的员工音讯
select * from TblStudent
where dateadd(year,1,tsday)<getdate()

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

 

–删除一个仓储过程
drop proc usp_Add

5.update 数据

–回滚事务
rollback transaction

–向一个曾经存在的表中插入数据,数据的来源是Class表
insert into Student(ClassName,ClsDesc)
select ClassName,ClsDesc from Class

–打开工作
begin transaction

正文

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

–查询出姓名中富含‘民’或‘用’的同校
–通配符[]:表示中括号中的任意个字符,只选一个配合
–通配符 ^a :表示除了a这一个字符都行。
select * from MyStudent where fname like ‘%[民用]%’

 

后记

–在视图中不可能动用order by语句。除非:另外还点名了top 或for xml
–错误
create view vw3
as
select * from TblStudent order by tsage desc

正确 select * from MyStudent where fMath is null

–一条语句删除几个约束,约束名用 逗号 隔开
alter table Class drop constraint
PK_Student_DeptId,
FK_Class_Student,
CK_Class_EmpAge

–将Class表中的数据备份到Student表中
–那种写法会将Class表中的所有数据插入到Student表中
–前提是Student表不设有,假使这一个表存在则报错。
select * into Student from Class

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

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

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

》》》》》》》》》语句执行各类《《《《《《《《《

–4.自由资源
deallocate cur_Student

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

–输出存储过程
exec usp_HelloWorld

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

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

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

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

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

尽量防止在触发器中执行耗时操作,因为触发器会与sql语句认为在同一个作业中(事务不收场,就不可能自由锁)

–切换数据库
use school
go

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

–having是group
by的基准对分组后的数额举行筛选(与where类似,都是筛选,只然则having是用来筛选分组后的组的)
select
classid as 班级号,
count(*) as 班级人数
from TblStudent
where fgender=’男’
group by classid
having count(*)>2

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

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

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

–查询表中多少
select * from Class

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

–扩展一列(扩大一列EmpAddr varchar(1000))
alter table Class Add EmpAddr varchar(1000)

–输出值
exec usp_Add 100,230

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

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

–右外联与左外联都是先将配合的数量找到,然后再将这多少个并未匹配的数目增长进去,(注意:不是一起查询出来的,有先后顺序)

–2.1.1将游标向后移动一条
fetch next from cur_Student

–查询没有参加考试的学生的姓名与号码
–把左表(left join
关键字左侧的表)中的全体记录都显示出来,对于这多少个在右表中能找到匹配的记录,突显对应配合数据,对于这多少个右表中找不到非常的记录突显为null
select
ts.tsid,
ts.tsname,
TblScore.*
from TblStudent as ts
left outer join TblSore.tsid=ts.tsid   –outer可以不写

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

10.(补充)约束

视图的目标是便于查询,所以一般景观下不可能对视图举办增删改查

2.连表查询

3.视图

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

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

–用一条语句为表扩大两个约束
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

 

–注脚变量并起头化

6.存储过程

–为岁数扩展一个检查约束,年龄必须在1—120岁以内(包含)
alter table Class add constraint CK_Class_EmpAge check(EmpAge>=0
and EmpAge<=120)

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

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

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图