数据

当前位置:永利皇宫463登录 > 数据 > Server数据库基础笔记,数据库基础笔记分享

Server数据库基础笔记,数据库基础笔记分享

来源:http://www.makebuLuo.com 作者:永利皇宫463登录 时间:2019-09-12 14:31

前言

前言

开发银行和小憩SQL Server服务两种样式

正文是私家学习SQL Server 数据库时的早年笔记的横盘,内容珍视是对数据库的骨干增加和删除改查的SQL语句操作自律,视图,存款和储蓄进程,触发器的核心精通。

本文是私人民居房学习SQL Server 数据库时的过去笔记的整治,内容入眼是对数据库的着力增加和删除改查的SQL语句操作封锁,视图,存款和储蓄进程,触发器的中坚领悟。

  1. 后台运维服务

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

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

Computer—>右键—>管理—>服务和应用程序—>服务—>sql server(MSSQLSE卡宴VEXC90)

正文

正文

  1. SQL Server配置管理器运维服务

1.子查询

1.主键:

伊始—>安装路线—>配置工具—>sql server配置管理器

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

主键的效劳:保障表中的每条数据的独一性
性子: 主键不可能再一次 不可能为空
分类:
逻辑主键:采用为表中加进的那多少个“自动编号”列也许“GUID”列为主键(未有实际工作上的意思)的主键 (建议接纳逻辑主键)
业务主键:选用表中这么些在事情中有实际意义的列作为主键
》》》》》》》》》选拔主键的宗旨,选怎么的列作为主键《《《《《《《《《
1》主键,建议采取那多少个一般不会被修改的列
2》选拔单列,不选拔多列(不用组合主键)
3》选择那么些轻便列(整数列(自动编号))

  1. 在运营窗口中央银行任务令运维和终止服务

--把另外一个询问的结果作为当下询问的规范化来行使。
--子查询中=、!= 、< 、> 、<= 、>=之后只可以回去单个值,假设多少个值就能报错
--化解办法 能够用in 代替
select * from Student
where tbage in(select tbage from Student where tbname=3)

 

Windows(键)+r

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

2.char(),nchar(),varchar()之间的不同

启动SQL Server服务:net start mssqlserver

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

》》》》》》》》》char(10)与varchar(10)的区别《《《《《《《《《
char(10) 固定长度,表示在数据库中储存的时候占用12个字节的上空,假如超越十二个则报错,就算远远不足十二个则用空格补全。
varchar(10) 可变长度,表示该列最多能够储存12个字节,倘若实在存款和储蓄缺乏11个字节,则会在仓库储存的时候自动估测计算一下其实的存放个数,而动态的改观长度。【节省空间】

停止SAL Server服务:net stop mssqlserver

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

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

SQL Server的身份验证情势

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

char(10) 能够积存10个假名大概5个汉字。 用来积累数据的时候,意大利语站1个字节,中文站2个字节。

  1. 身份验证情势有二种:Windows身份验证和SQL Server身份验证
  2. 铺排身份验证方式(常见难点:18456,18470)步骤:

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

nchar(10) 表示能够积攒十个字母或12个汉字,因为种种字符都以根据unicode方法来囤积的。当使用nchar(10),来存款和储蓄数据的时候无论存款和储蓄的是中文依旧丹麦语都以各个字符占2个。

(1)       对象财富管理器中单击右键—>安全性—>配献身份验证格局

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

 

(2)       修改sa登录密码—>直接找安全性—>登入名—>sa—>右键—>属性

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

3. 创办数据库

(3)       启用sa账户—>直接找安全性—>登陆名—>sa—>右键—>属性—>状态—>启用

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

--创立一个数据库
create database School

(4)       重新起动服务—>对象能源管理器上单击右键—>重新开动

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

--删除数据库
drop database School

利用SQL语句创设数据库

2.连表查询

--创立数据库的时候,钦定一些数据库的相干参数。
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
)

USE maste--当前针对的操作的数据库

--查询全部学员的人名、年龄及所在班级 (班级在另三个表中)
--当四个列在分裂的表中时,要跨表查询,所以一般可以运用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(只询问五个表中都一些数据)

--切换数据库
use school
go

GO

--》》》full join 是查询全数的数据(未有的为空)

4. 创建表

CREATE DATABASE E_Market

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

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

ON P劲客IMAEscortY  --主文件组

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

--删除表
drop table Class

(

 

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

NAME=’E_Market_data’,--逻辑文件名

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

--insert into...values.. 这种写法每趟只可以插入一条数据

--物理文件名

--查询未有插手考试的学员的全名与数码
--把左表(left join 关键字侧边包车型客车表)中的全体笔录都来得出来,对于这么些在右表中能找到相称的笔录,展现对应非凡数据,对于那个右表中找不到十三分的记录展现为null
select
ts.tsid,
ts.tsname,
TblScore.*
from TblStudent as ts
left outer join TblSore.tsid=ts.tsid   --outer能够不写

--向Class表中插入多条数据
--重复数据不另行插入,union关键字笔者就有所去掉重复的野趣
--union | union all (重复插入)
insert into Class
select '大三','三年' union
select '三五','间谍' union
select '一一','多久' union
select '六七','得到'

FILENAME=’H:projectE_Market_data.mdf’,

--》》》右外对接
--代表要将右表(right join 左边的表)中的全数数据都来得,左表中只呈现那一个相配的数据。

--将Class表中的数据备份到Student表中
--这种写法会将Class表中的全体数据插入到Student表中
--前提是Student表不设有,假若这几个表存在则报错。
select * into Student from Class

SIZE=5MB,--开头大小

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

--向八个已经存在的表中插入数据,数据的源于是Class表
insert into Student(ClassName,ClsDesc)
select ClassName,ClsDesc from Class

MAXSIZE=100MB,--最大容积

--右外联与左外联都以先将协作的多寡找到,然后再将那三个没有相称的数据增进进去,(注意:不是手拉手查询出来的,有前后相继顺序)

 

FILEGROWHE=15%--增长率

--》》》练习:查询全部学生(参与和未到位的考试)的学习者姓名、年龄、成绩,若无参与考试突显缺考,假诺小于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 斯洛伐克共和国(The Slovak Republic)语成绩,
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

--查询表中多少
select * from Class

)

3.视图

5.update 数据

LOG ON  --日志文件

视图本人并不存款和储蓄数据,只是存款和储蓄的查询语句,若是把下马看花表中的数目修改后,则经过视图查询到的结果也变了。

--将兼具年龄低于20岁的人的年龄都改成19(tage是Class表后加属性)
update Class set tage=19 where tage<20

(

视图的目标是造福查询,所以一般景况下不能够对视图实行增加和删除改查

--将年龄为19岁的同不常间性别为0的人的全名两侧★改为☆
update Class set ClassName =replace (tname,'★','☆') where tage=19 and tgender=0

NAME=’E_Market_log’,

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

6.刨除数据

FILENAME=’H:projectE_Market_log.ldf’,

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

delete from Class --删除全部数据 自动编号未有回复到暗许值 能够依照准绳来删除
truncate table Class --重新安装了活动编号 删除只可以一回性都清空,不可能依赖标准来删除 清除速度(质量)比delete语句快的多

SIZE=5MB,

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

delete from Class where tage=19 or tage is null --删除19岁照旧空值

    FILEGROWTH=0—未运维自动增长

4.表明变量与利用

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

)

--》》》局地变量
--评释变量
declare @name varchar(10)
declare @age int

 

GO

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

7.标准查询,模糊查询

SELECT *FROM sysdatabases  --查询数据库

--输出值
print @name
print @age

--查询数学未有合格的学生的学号
select
fid as 学号,
fmath as 分数
from MyStudent where fmath<60

利用SQL语句删除数据库

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

--查询年龄在20-29周岁时期的男学生
select
fname as 姓名 from MyStudent where fage between 20 and 30 and fgender='男'

--删除二个称谓为E_马克et的数据库

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

--查询班级id 1 2 3 的全部学生
select * from MyStudent where classid in (1,2,3)

DROP DATABASE E_Market

--》》》全局变量
print @@language
print @@version
print 'aaa'+100
--通过判定@@error变量中是还是不是不为0,就能够判别上一条sql语句试行是不是出错了
--若是@@error为0,表示上一条sql语句施行没出错,假诺@@error不为0,则代表上一条sql语句出错了。
print@@error

--查询全体姓赵的同校 (通配符%意味:大肆八个随机字符)
select * from MyStudent where fname like '赵%'

--检查想要删除的数据库是否留存

--》》》通过while总括1-100里边有着奇数的和

--查询出姓名中只要包罗三个‘民’字就能够。
select * from MyStudent where fname like '%民%'

IF EXISTS(SELECT * FROM sysdatabases WHERE name=’ E_Market’)

--注脚变量并开首化

--查询全数姓赵的同学,而且姓名字数是3个
--通配符 _ :表示任性的单个字符。
select * from MyStudent where fname like '赵__'
select * from MyStudent where fname like '赵%' and len(fname)=3

DROP DATABASE E_Market

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

--查询出姓名中带有‘民’或‘用’的校友
--通配符[]:表示中括号中的任性个字符,只选贰个极度
--通配符 ^a :表示除了a这几个字符都行。
select * from MyStudent where fname like '%[民用]%'

动用SQL语句创立登陆名及为顾客赋予权力

5.事务

8.聚合函数

--创设登入名

业务有八个属性:原子性 一致性 隔开性 持久性
原子性:对于数据修改,要么全都实行,要么全都不实践
一致性:当数码变成时,数据必得处于同样状态
隔开性:对数码进行修改的具备并发事务时相互隔断的。那标记职业必须是独自的,它不应以其余格局依赖于或影响别的事情
永世性:事务实现后,他对数据库的改造被长久保持,事务日志能够保障职业的永恒性

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

USE master

--展开专门的学业
begin transaction

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

GO

--提交事务
commit transaction

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

CREATE LOGIN pbMaster WITH PASSWORD=’123456’

--回滚事务
rollback transaction

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

GO

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

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

--成立数据库客商

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

9.null 问题

USE E_Market

6.存款和储蓄进度

--请查询出学生表中全体数学成就为null的人的新闻
--null在数据库中意味unknow(不清楚),判定贰个值是或不是为null,也就不可能用=恐怕<>来判定
select * from MyStudent where fMath=null 错误(不回去任何数据)

GO

--创设八个自定义的蕴藏进度
create proc usp_HelloWorld
as
begin
print 'hello world'
end

正确 select * from MyStudent where fMath is null

CREATE USER MasterDBUser FOR LOGIN pbMaster

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

--查询全部fmath为非null的值
select * from MyStudent where fMath is not null

GO

--成立贰个存款和储蓄过程总括四个数的和
create procedure usp_Add
@num1 int,
@num2 int
as
begin
print @num1+@num2
end

--null值与别的数据运算后获取的恐怕null值。
update MyStudent set fage=fage+1 where fid=1

--为MasterDBUser赋予查看、新增、修改的操作权限

--输出值
exec usp_Add 100,230

10.分组group by

USER E_Market

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

--总计出mystudent表中,男女同校的个数

GO

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

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

CRANT SELECT,INSERT,UPDATE ON UserInfo TO MasterDBUser

--创立分页存款和储蓄进程
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

--查询班级的男同学的人口超过2的消息

GO

--删除三个囤积进度
drop proc usp_Add

--having是group by的尺度对分组后的数目进行筛选(与where类似,都是筛选,只可是having是用来筛选分组后的组的)
select
classid as 班级号,
count(*) as 班级人数
from TblStudent
where fgender='男'
group by classid
having count(*)>2

--将UPDATE权限进行回收

7.触发器

》》》》》》》》》语句推行各样《《《《《《《《《

USER E_Market

尽量幸免在触发器中实践耗费时间操作,因为触发器会与sql语句认为在同二个事务中(事务不收场,就不可能自由锁)

select
--distinct / top 之类的主要性字
fgender as 性别, --5》选择列
count(*) as 人数
from MyStudent --1》先从表中获得数量
where fage>30 --2》从MyStudent的数码中筛选出装有年龄大于二十八虚岁的任的音讯
group by fgender --3》遵照性别分组,分完组得到一个新的结果集
having count(*)>500 --4》基于分组以往的结果集,然后再筛选,筛选出那些组中记录大于500的组
order by 人数 asc --6》最终把展现出来的结果排序

GO

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

--语句试行种种
from > where > group by > having > select > order by

REVOKE UPDATE ON UserInfo TO MasterDBUser

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

11.日期函数

GO

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

--请查询出全数入职一年以上的职员和工人新闻
select * from TblStudent
where dateadd(year,1,tsday)<getdate()

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

--总括多个小时差
--查询90年到现在是稍稍年
select datediff(year,'1990-9-9',getdate())

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

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

8.游标

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

--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

后记

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

 

本文由永利皇宫463登录发布于数据,转载请注明出处:Server数据库基础笔记,数据库基础笔记分享

关键词:

上一篇:没有了

下一篇:事务处理,中的回滚