sqlserver数据库详解
先建立主表的主键,然后再定义从表中的外键。两个表一旦建立外键关系,外键表里的对应的外键列,它的值必须是它对应的主键表里的主键值,不如果你想插入一个不存在的值,你是插入不进去的。前面带n,存储中文汉字还是英文或数字,长度都是1,存储大小2个字节,不带n,英文或数字,就是1个长度,中文就是两个长度。3.文件组是数据库文件的一种逻辑管理单位,它将数据库文件分成不同的文件组,方便对文件的分配和管理。一个表
第一节:主要内容:
- 数据库的基础知识:基本概念、数据库组成,数据类型,数据库操作,管理。数据的支持,winform,网站,百度
- 数据库:DataBase 按照一定数据结构来组织、存储和管理数据的仓库。存储在一起的相关的数据一个集合。
- 数据库管理系统:(DataBase Management System DBMS) 为管理数据库而设计的一个电脑软件系统,
分为两种:关系数据库:建立在关系模型基础上的数据库 SqlServer MySQL Oracle Access
非关系数据库:不同点:不使用SQL作为查询语言。
数据库系统:数据库和数据库管理系统组成。
第二节:创建数据库
- 服务器名称:local . 127.0.0.1 远程:服务器Ip,端口号 (60.190.0.211,20813)
- 身份验证:windows身份验证
SQL Server身份验证 登录名(sa) 密码:sql2016!!!!
- Windows身份验证登录,安全性----登录名---右击登录名,选择新建登录名,选择SQL Server身份验证,设置登录密码,给它设置服务器角色。(权限)
- 创建数据库过程:右击数据库节点,选择新建数据库,设置数据库名称,路径,点击确定,成功创建好了数据库。
第三节:数据库:文件的形式
数据库:文件和文件组 组成。
2.数据库文件
- 1)主要数据文件 存放数据和数据库的初始化信息。每个数据库有且只能一个主要数据文件。.mdf 扩展名。
- 2)次要数据文件 可以没有。.ndf 扩展名
- 3)事务日志文件 存放用于恢复数据库的所有日志信息。每个数据库至少要有一个日志文件,也可以有多个。默认.ldf 扩展名。
3.文件组:是数据库文件的一种逻辑管理单位,它将数据库文件分成不同的文件组,方便对文件的分配和管理。分为两种类型
- 1) 主文件组 Primary 主要数据文件和没有明确指派给其他文件组的文件。
- 2) 用户自定义的文件组 Create DataBase或 alter database 语句中,fileGroup关键字指定 的文件组。
设计原则:1)文件只能是一个文件组的成员。
2)文件或文件组不能由一个以上的数据库使用
3)数据和日志信息不能属于同一个文件或文件组。
4)日志不能作为文件组的一部分。
第四节:数据库常用对象:
- 1.表 包含数据库中所有数据的对象,行和列组成 ,用于组织和存储数据。
- 2.字段 表中的列 一个表可以有多个列,自己的属性:数据类型(决定了该字段存储哪种类型的数据),大小(长度)
- 3.视图 表(虚拟表)一张或多张表中导出的表 用户查看数据的一种方式,结构和数据是建立在对表的查询基础之上的。
- 4.索引 为了给用户提供一种快速访问数据的途径,索引是依赖于表而建立,检索数据时,不用对整个表进行扫描,可以快速找到所需的数据。
- 5.存储过程 是一组为了完成特定功能的SQL语句的集合(可以有查询、插入、修改、删除),编译后, 存储在数据库中,以名称进行调用, 当调用执行时,这些操作就会被执行。
- 6.触发器 在数据库中,属于用户定义的SQL事务命令集合,针对于表来说,当对表执行增删改操作时,命令就会自动触发而去执行。
- 7.约束 对数据表的列,进行的一种限制。可以更好的规范表中的列。
- 8.缺省值 对表中的列可以指定一个默认值,当进行插入时,如果没有为 这个列插入值,那么就会自动以预先设置默认值进行自动补充。
第五节:数据类型分类:
数值型: 8 4 2 1
1)整型数据类型:bigint int smallint tinyint
- 2)浮点型:float 近似数值 存在精度损失 real 近似数值。 float(24)
- decimal 精确数值 不存在精度损失 decimal(18,2)
- 3)货币类型:money smallmoney
二进制数据类型 bit binary varbinary(n) varbinary(max) image
字符型:
- char 固定长度 8000 varchar(n) 可变长度字符串 8000
- varchar(max) 可变长度字符串 text 可变长度字符串 2GB
- unicode字符串 nchar(n) 40000 nvarchar(n) 4000 2
- nvarchar(max) varchar长度1/2
- ntext 前面带n,存储中文汉字还是英文或数字,长度都是1,存储大小2个字节,不带n,英文或数字,就是1个长度,中文就是两个长度
日期型:datetime 精确度高,
date 存储日期
time 存储时间
其他类型 uniqueidentifier guid 全球唯一标识符。
第六节:工具创建表列 数据类型是否null
- 主键:唯一标识一条数据。值 不能重复 不能为空
- 什么样的列可以设置为主键:值 不能重复 不能为空
- 什么叫标识列?一个列设置成标识列,它就不能再手动插入,插入时,自动生成的。这个列,类型必须是不带小数的数值型 整型
标识列:标识种子 第一条记录标识列的值 100 增量 3
删除了数据,再插入,就会出现不连续 缺点
2.创建主键 联合主键 唯一标识
创建一个主键,同时自动创建了一个聚集索引
3.创建外键
外键:一般在两个表之间要建立关联时候,创建一个列创建为外键,它在另一个表必须是主键
外键:DeptId UserInfos 外键表
DeptInfos 主键表
两个表一旦建立外键关系,外键表里的对应的外键列,它的值必须是它对应的主键表里的主键值,不如果你想插入一个不存在 的值,你是插入不进去的。
一个表里可以有多个外键,也可以没有,一个表只能有一个主键,也可以没主键,但一般都会设置一个主键。
第六节:约束
1.约束定义:规定表中的数据规则。如果存在违反约束的数据行为,行为就会被阻止。
在什么时候可以创建约束呢?使用软件创建,创建表之后,
使用脚本创建表:可以在创建的过程中,也可以在创建后再来建立约束。
2.分类
主键 Primary Key约束 唯一性、非空,不能修改
外键 Foreign Key约束 加强两个表的一列或多列数据之间的连接的。 先建立主表的主键,然后再定义从表中的外键。只有主表中的主键才能被从表用来作为外键使用。主表限制了从表更新和插入的操作。当删除主表中的某条数据,应该是先删除从表中相关的数据,再删除主表。
Unique约束 唯一性约束 确保表中的一列数据没有相同的值。与主键约束相似,但又不同。主键只能有一个,但一个表中可以定义多个唯一约束。唯一键可以为NULL,但主键不可以
Check约束:通过逻辑表达式来判断数据的有效性,用来限制输入一列或多列的值的范围。
Default约束:默认值约束。用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果没有设置默认值,系统就会默认为NULL。
第七节:数据库脚本:
SQL语言分类:
- 1)DQL 数据查询语言 Select 列 From 表名 where 条件
- 2)DML 数据操纵语言 Insert 插入 insert into 表名 (列,列,...) values (对应的值,对应的值)
- Update 更新 update 表名 set 列名=值, 列名=值 where 条件
- Delete 删除 delete from 表名 where 条件
- 3)DDL 数据定义语言 创建数据库及其对象 Create/Alter/Drop Database/Table/View/Proc/Index
- 4)DCL 数据控制语言 用于授予或回收访问数据库某种特权,对数据实行监视等 commit 提交 rollback 回滚 grant 授权
第八节:t-sql创建数据库。
master:系统数据库,它记录了SQL Server系统的所有系统级信息,还记录了所有其他数据库的存在,数据库文件的位置,SQL Server的初始化信息。
use master
go
create database 数据库名
on primary
(
--主要数据文件的设置
name=
filename
size
filegrowth
)
log on
(
--日志文件的设置
name
filename
size
filegrowth
)
go
第九节:t-sql创建表
1.表信息准备
产口信息表:标识列,int
编号 varchar(50)
名称 nvarchar(50)
产品类型 TypeId int
价格 decimal(18,2)
数量 int
产品类型表: 编号 TypeId int
名称 nvarchar(20)
2.脚本创建表:
同一个数据库下,不能有两张表同名
use 数据库名
go
create table 表名
(
-------- 列名 类型类型 长度 是否为空 标识列 主键 默认值,约束 ,列与列之间以逗号隔开
)
第十节:t-sql 修改表
1.直接在原来的脚本基础上进行修改
- 先把脚本代码进行修改,再删除原来的表,然后再执行创建表的脚本代码
- 这种方式,一般情况都不采用,后果很严重。除非表里数据不重要或是空表,可以使用上面这种方式。
2.alter table 进行修改
- 添加一列 : alter table 表名 add 列名 数据类型 是否为空
--添加一列 ProRemark alter table ProductInfos add ProRemark nvarchar(max) null
- 删除一列: alter table 表名 drop column 列名
--删除一列 ProRemark alter table ProductInfos drop column ProRemark
- 修改列:修改的是数据类型,是否为空,alter table 表名 alter column 列名 类型 是否为空
--修改一列 alter table ProductInfos alter column ProNo nvarchar(50) null --修改列名 一般慎用 --exec sp_rename 'ProductInfos.ProCount','Count','column'
第十一节:t-sql 创建约束
1.在创建表的过程中创建约束
主键约束 外键约束 unique约束(唯一约束) check约束 default约束 default('')
primary key foreign key references 主表名(主键列名)
2.在创建表完成后再创建约束
alter table 表名 add constraint 约束名
primary key (列名) /
foreign key(列名) references 主表(列名)/
unique (列名)/
check(逻辑表达式)
default(缺省值) for 列名
第十二节:t-sql插入数据
对表的操作:插入、更新、删除
1.单条数据插入
insert (into) 表名(列名,列名....) values (值,值....)
insert into 表名(列名,列名....) select 值,值....
2.多条插入
insert into 表名(TypeName) values ('工具类1'),
('工具类2'),
('工具类3'),
('工具类4')
union 去重 union all 允许重复 union all效率比union高
insert Test(MName,Age)
select 'fff',21 union
select 'fff',21
3.克隆表数据
--1) 目标表在数据库已经存在
insert into Test(MName) ---目标表
select TypeName from ProductType --源表
--2)目标表之前数据库中不存在,执行操作时自动创建的
select TypeName into Test2 --目标表
from ProductType --源表
第十三节:更新与删除
--更新数据 update 必用where条件
--主键不可以修改
--如果不加where条件,会把整张表的数据都修改了
update Test set MName='ssss',Age=30 where Id=5 (and | or) 条件
--数据删除 :只是删除数据,表还在; 连同表一起删除
--1)删除数据
delete from Table 不加条件,会删除整个表数据,都要加where条件 标识列 值还是接着删除前的值而自增,而不是从初始值开始
--delete语句会造成标识列的值不连续
delete from Test where Id = 20
--如果我们想删除数据,让标识列的值恢复到初始值,怎么办?
truncate table Test --表数据清空,恢复到初始化,标识列也恢复
- truncate效率比delete from Test高.
- delete每删除一条数据,都会在日志里记录.
- truncate不会记录日志,不激活触发器,
- drop truncate 是即时操作,不能rollback,
- delete update insert 事务中,可以恢复.
- 慎用truncate 一旦删除,不能恢复.
第十四节:SQL查询之单表查询
1.查询所有数据
select * from UserInfos
2.查询表的部分数据
select UserId,UserName,Age from UserInfos where 条件
3.列命别名 ---解决需要显示中文列名
--列名 as 别名 列名 别名 别名=列名
select UserId as 用户编号,UserName 用户名,年龄= Age
from UserInfos
4.排序
--主键,默认就有排序功能 从小到大 --升序 asc --降序:从大到小 desc
--不管是否有条件,还是分组,order by 永远放在最后
select UserId,UserName,Age from UserInfos
order by Age,UserId
第十五节:查询之模糊查询
模糊查询:
select UserName,Age from 表名 where UserName like ....
查询:完整查询和模糊查询
like SQL 提供4种匹配模式:
1. % 0个或多个
2._ 匹配单个字符
3.[] 范围匹配 括号中所有字符中的一个
4.[^] 不在括号中所有字符之内的单个字符
第十六节:范围查询
1.select from where 子句 条件 -- 给定范围
--1) 比较运算符 > < >= <= <>
--2)in (2,3,4) not in (2,3,4) 不在这个范围之内
--3) between and 推荐 等价于 >= and <=
2.前面多少条、百比比
top n/percent
第十七节:查询之聚合函数
聚合函数:对一组值执行计算并返回单一的值。
经常与select语句中group by结合使用。
五种聚合函数:count 记录个数
sum 求和
avg 求平均
max 最大值
min 最小值
第十八节:分组查询
select ....
where .....
group by 列名,列名 结合聚合函数,根据一列或多个列对结果集进行分组。
第十九节:连接查询之内连接
分类:内连接 外连接 全连接 交叉连接。
- 内连接:inner join 使用比较运算符 = > < >= <= <> 进行表间的比较,查询与条件相匹配的数据。
- 等值连接 结果:相匹配的数据查询出来,显示匹配出来的结果,如果没有匹配上,就没有结果。
- 显示连接 表 inner join 表 on 条件 where
- 隐式连接 select .... from 表,表 where 关联条件
第二十节:外连接
外连接分类:左外连接、右外连接 全外连接 简称为:左连接 右连接 全连接
- 左连接 left join on 返回左表的所有行,右表中没有匹配上,对应的列就显示NULL,结果:左表:所有行 右表:行数与左表相同,没有匹配上,显示NULL
- 右连接 right join on 与左连接相反,返回的右表的所有行,左表进行匹配,左表中没有匹配上的,对应的列显示NULL,结果:右表:所有行 左表:行数与右表相同,没有匹配上的,显示NULL
第二十一节:全连接 交叉连接
连接:内连接、外连接(左连接、右连接、全连接)、交叉连接
全连接:full join 全外连接 返回左表和右表中所有行,当某一行在另一个表中没有匹配,另一个表中的列返回NULL
交叉连接 cross join 迪卡尔积
如果不带where子句时,返回被连接的两个表的迪卡尔积,返回的行数是两个表行数的乘积。
带where子句,等价于inner join 返回的是匹配的数据。
第二十二节:类型转换函数
convert函数:convert(类型(长度),表达式)
cast函数 :cast(表达式 as 类型)
第二十三节:字符串操作函数
字符串操作:从一个字符串里找一个子串,位置
取子串
大小写
去空格
重复n次
顺序颠倒
替换
第二十四节:索引
1.索引的作用:数据的查询 处理速度 ---应用系统成败的标准。 最普遍---优化方式
2.索引是什么?一本书 目录 查找
索引---目录,快速的定位我们要查找的数据,而不必去扫描整个表。
---从而可以加快我们查询的速度。---提高系统的性能。
3.索引有缺点:占用存储空间,索引并不是越多越好,索引并不总是能提高系统性能的。
4.索引的目的:可以更加快速高效地查询数据,减少系统的响应时间。
索引分为:聚集索引 非聚集索引
主键 唯一索引
聚集索引:Clustered 逻辑顺序与物理顺序是一致的 最多只能有一个,可以没有
非聚集索引:NonClustered 逻辑顺序与物理顺序是并不一致的。 可以有多个,也可以没有
非聚集索引比聚集索引 效率低。
如果需要多个列上建立索引,这些列建立组合索引。
列:小数据类型的, 访问速度特别快。
索引是看不见的,但是如果你创建了索引,在查询大数据的时候,它的优势就是显而易见的。
第二十五节:脚本创建各种索引
脚本创建索引
create (unique) (clustered|nonclustered) index 索引名
on 表名(列名) --可以是多个列
with
(
)
第二十六节:视图介绍
- 视图:虚拟表 由一个或多个表通过查询而定义的 将查询定义保存起来,实际不包括数据。
- 与表的区别:表存储数据的地方,视图存储的是查询语句(索引视图除外,具体化了)
- 作用:简化查询 增加数据的保密性 安全性上得到保证
- 缺点:只是简化查询,并不提高查询速度 增加了维护成本
分类:标准视图 :存储查询定义 没有存储数据。
索引视图(被具体化了的,创建了索引,显著提高查询性能,聚合了很多行的查询,不太适合经常更新基本数据集)
分区视图:一台或多台服务器间水平连接一组成员表的分区数据。
第二十七节:脚本创建视图。
创建标准视图
create view 视图名
as
T-SQL语句
创建索引视图
create view 视图名 with schemabinding
as
select UserId,UserName,Age from dbo.UserInfos
go
创建分区视图
create view 视图名
as
select * from Test
union all
select * from Test3
go
标准视图与分区视图 都不允许删除修改里面的数据,会影响基础表
索引视图 删除了,对应的基础表数据也被删除了,慎用 。
第二十八节:存储过程介绍
- 一种为了完成特定功能的一个或一组SQL语句集合。经编译后存储在服务器端的数据库中,可以利用存储过程来加速SQL语句的执行。
- 调用名称,传入参数,执行来完成特定功能。
分类:系统存储过程:master数据库中,其他数据库中是可以直接调用,并且不必在前面加上数据库名,创建数据库时,这些系统存储过程在新的数据库中自动创建。
自定义存储过程:用户自己创建,特定功能而创建。可以传入参数,也可以有返回值,表明存储过程 执行是否成功。里面可以只是一个操作,也可以包括多个。
执行:execute / exec 存储过程名 参数列表(多个参数,以逗号隔开)
优点:1.提高应用程序的通用性和可移植性。多次调用,而不必重新再去编写,维护人员可以随时修改。
2.可以更有效的管理数据库权限。
3.提高执行SQL的速度。
4.减轻服务器的负担。
缺点:专门维护它,占用数据库空间。
它都优点和缺点,合理使用。
语法:
create proc 存储过程名
@userId int,
@userName varchar(50)
AS
BEGIN
--T-SQL语句
END
GO
第二十八节:脚本创建存储过程
1.脚本创建存储过程语法
create procedure/proc proName
--参数列表
as
begin
--SQL语句集合
end
2.创建一个简单存储过程
create/alter proc SearchUserInfoNew
as
begin
select UserId,UserName,DeptId,DeptName from vUserInfos
select * from DeptInfos
end
go
--调用执行 名称
exec SearchUserInfoNew
3.创建一个带参数的存储过程
create proc AddUserInfo
@UserName varchar(50),
@UserPwd varchar(50),
@Age int,
@DeptId int
as
begin
declare @time datetime --定义变量
select @time ='2019-11-15' --赋值
insert into UserInfos(UserName,UserPwd,CreateTime,Age,DeptId)
values (@UserName,@UserPwd,@time,@Age,@DeptId);
delete from UserInfos where UserId=17;
select * from UserInfos
end
go
--调用
exec AddUserInfo 'linglin','2345',29,1
第二十九节:触发器的介绍
触发器:一种特殊类型的存储过程。
不同:存储过程 调用名称执行
触发器的调用 通过事件触发 自动调用执行。
对表进行操作:插入、更新、删除 自动执行 触发器。如果定义对应的触发器,系统就自动调用
分类:DDL触发器 Create alter drop
DML触发器 insert update delete
DML触发器分为两种:
- after触发器 insert update delete :操作之后触发
- instead of触发器 insert update delete :不执行定义的操作,而执行的是触发器本身。
第三十节:inserted deleted
inserted deleted:插入表 删除表
逻辑表也是虚表,系统在内存中创建的,不会存储到数据库中,只读的,读取但不能修改数据。结构与操作的表相同。触发器执行过程中存在,并且可以访问,工作完成之后,这两张表会被自动删除。
对表的操作 inserted deleted
insert 存放插入的数据 无
update 存放更新后的数据 存放更新前的数据
delete 无 存放被删除的数据
inserted 存放插入或更新后的数据
deteted 存放更新前或删除的数据
触发器执行过程中,都是可以访问的,提交之前,是不是可以撤消呢----事务的回滚? 可以
触发器是一个特殊的事务,一些检查,设置条件,如何不满足,可以回滚。
第三十节:触发器--after ---insert update触发器
更多推荐
所有评论(0)