分为两种:关系数据库:建立在关系模型基础上的数据库 SqlServer MySQL Oracle Access
非关系数据库:不同点:不使用SQL作为查询语言。
数据库系统:数据库和数据库管理系统组成。
SQL Server身份验证 登录名(sa) 密码:sql2016!!!!
数据库:文件和文件组 组成。
2.数据库文件
3.文件组:是数据库文件的一种逻辑管理单位,它将数据库文件分成不同的文件组,方便对文件的分配和管理。分为两种类型
设计原则:1)文件只能是一个文件组的成员。
2)文件或文件组不能由一个以上的数据库使用
3)数据和日志信息不能属于同一个文件或文件组。
4)日志不能作为文件组的一部分。
数值型: 8 4 2 1
1)整型数据类型:bigint int smallint tinyint
二进制数据类型 bit binary varbinary(n) varbinary(max) image
字符型:
日期型:datetime 精确度高,
date 存储日期
time 存储时间
其他类型 uniqueidentifier guid 全球唯一标识符。
标识列:标识种子 第一条记录标识列的值 100 增量 3
删除了数据,再插入,就会出现不连续 缺点
2.创建主键 联合主键 唯一标识
创建一个主键,同时自动创建了一个聚集索引
3.创建外键
外键:一般在两个表之间要建立关联时候,创建一个列创建为外键,它在另一个表必须是主键
外键:DeptId UserInfos 外键表
DeptInfos 主键表
两个表一旦建立外键关系,外键表里的对应的外键列,它的值必须是它对应的主键表里的主键值,不如果你想插入一个不存在 的值,你是插入不进去的。
一个表里可以有多个外键,也可以没有,一个表只能有一个主键,也可以没主键,但一般都会设置一个主键。
1.约束定义:规定表中的数据规则。如果存在违反约束的数据行为,行为就会被阻止。
在什么时候可以创建约束呢?使用软件创建,创建表之后,
使用脚本创建表:可以在创建的过程中,也可以在创建后再来建立约束。
2.分类
主键 Primary Key约束 唯一性、非空,不能修改
外键 Foreign Key约束 加强两个表的一列或多列数据之间的连接的。 先建立主表的主键,然后再定义从表中的外键。只有主表中的主键才能被从表用来作为外键使用。主表限制了从表更新和插入的操作。当删除主表中的某条数据,应该是先删除从表中相关的数据,再删除主表。
Unique约束 唯一性约束 确保表中的一列数据没有相同的值。与主键约束相似,但又不同。主键只能有一个,但一个表中可以定义多个唯一约束。唯一键可以为NULL,但主键不可以
Check约束:通过逻辑表达式来判断数据的有效性,用来限制输入一列或多列的值的范围。
Default约束:默认值约束。用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果没有设置默认值,系统就会默认为NULL。
master:系统数据库,它记录了SQL Server系统的所有系统级信息,还记录了所有其他数据库的存在,数据库文件的位置,SQL Server的初始化信息。
use master
go
create database 数据库名
on primary
(
--主要数据文件的设置
name=
filename
size
filegrowth
)
log on
(
--日志文件的设置
name
filename
size
filegrowth
)
go
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 进行修改
--添加一列 ProRemark
alter table ProductInfos add ProRemark nvarchar(max) null
--删除一列 ProRemark
alter table ProductInfos drop column ProRemark
--修改一列
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 --表数据清空,恢复到初始化,标识列也恢复
第十四节: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 列名,列名 结合聚合函数,根据一列或多个列对结果集进行分组。
分类:内连接 外连接 全连接 交叉连接。
外连接分类:左外连接、右外连接 全外连接 简称为:左连接 右连接 全连接
连接:内连接、外连接(左连接、右连接、全连接)、交叉连接
全连接: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
标准视图与分区视图 都不允许删除修改里面的数据,会影响基础表
索引视图 删除了,对应的基础表数据也被删除了,慎用 。
分类:系统存储过程: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触发器分为两种:
inserted deleted:插入表 删除表
逻辑表也是虚表,系统在内存中创建的,不会存储到数据库中,只读的,读取但不能修改数据。结构与操作的表相同。触发器执行过程中存在,并且可以访问,工作完成之后,这两张表会被自动删除。
对表的操作 inserted deleted
insert 存放插入的数据 无
update 存放更新后的数据 存放更新前的数据
delete 无 存放被删除的数据
inserted 存放插入或更新后的数据
deteted 存放更新前或删除的数据
触发器执行过程中,都是可以访问的,提交之前,是不是可以撤消呢----事务的回滚? 可以
触发器是一个特殊的事务,一些检查,设置条件,如何不满足,可以回滚。
第三十节:触发器--after ---insert update触发器