数据库(SQLServer)
时间:2021-07-01 10:21:17
帮助过:27人阅读
DataBase
按照一定数据结构来组织、存储和管理数据的仓库。存储在一起的相关数据的集合。
数据库管理系统:DataBase Management System DBMS
为管理数据库而设计的一个电脑软件
关系数据库:建立在关系模型基础上的数据库 Sqlserver、MySQL、Oracle、Access
非关系型数据库:不同点:不使用SQL作为查询语言。Redis、MongoDB
数据库系统:数据库和数据库管理系统组成。
二、创建数据库
方式:工具创建数据库和脚本创建数据库
服务器名称:local / .
/ 127.0.
0.0 /远程:服务器Ip,端口号
身份验证:windows身份验证(不需要账号密码)
SQL server身份验证(需要登录名和密码登录)
注意:需要设置角色权限:sysadmin
创建数据库的过程:右击数据库节点,选择新建数据库,设置数据库名称,路径,点击确定
数据库的组成:文件的形式
数据库:文件和文件组组成。
数据库文件:
主要数据文件:存放数据和数据库的初始化信息。每个数据库有且只有一个主要数据文件。
.mdf 扩展名。
次要数据文件:存放除了主要数据文件以外的所有数据的文件。.ndf 扩展名。
次要数据文件不是必须的,可以没有,可以是一个,也可以是多个。
事务日志文件:存放用于恢复数据库的所有日志信息。每个数据库至少要有一个日志文件,也可
以有多个。默认 .ldf 扩展名。
文件组:数据库文件的一种逻辑管理单位,它将数据库文件分成不同的文件组,方便对文件的分
配和管理。分为两种类型:
主文件组:Primary 主要数据文件和没有明确指派给其他文件组的文件。
用户自定义文件组:Create DataBase或alter database语句中,fileGroup关键字指定的文件
组。
设计原则:文件只能是一个文件组的成员。
文件或文件组不能由一个以上的数据库使用。
数据和日志信息不能属于同一个文件或文件组。
日志不能作为文件组的一部分。
数据库常用对象:
表:包含数据库中所有数据的对象,行和列组成,用于组织和存储数据。
字段:表中的列,一个表可以有多个列,自己的属性:数据类型,大小(长度)
视图:表(虚拟表)一张或多张表中导出的表,用户查看数据的一种方式,结构和数据是建立在
对表的查询基础之上的。
索引:为了给用户提供一种快速访问数据的途径,索引是依赖于表而建立,检索数据时,不用对
整个表进行扫描,可以快速找到所需的数据。
存储过程:是一组为了完成特定功能的SQL语句的集合(可以有查询、插入、修改、删除),编
译后,存储在数据库中。
触发器:在数据库中,属于用户定义的SQL事务命令集合,针对于表来说,当对表执行增删改操
作时,命令就会自动触发而去执行。
约束:对数据表的列,进行的一种限制,可以更好的规范表中的列。
缺省值:对表中的列可以指定一个默认值,当进行插入时,没有为这个列插入值,插入默认值
数据类型分类:
数值型:
整型数据类型:bigint(8字节)、
int(4字节)、samllint(2字节)、
tinyint(1字节、
0-255)
浮点型:float 近似数值,存在精度损失 、
real 近似数值float(
24)、
decimal 精确数值,不存在精度损失decimal(
18,
2)
货币类型:smallmoney(4字节)、
money(8字节)精确到万分之一
二进制类型:bit binary varbinary(n)
varbinary(
max)
image
字符型:
Character 字符串:
char 固定长度 最多8000个字符
varchar(n) 可边长度字符串 最多8000个字符,中文可能会乱码
varchar(
max) 可变长度字符串 最多1073741824个字符
text 可变长度字符串 最多2GB字符
Unicode 字符串:有中文信息用nvarchar(n)比较好
nchar(n) 固定长度的Unicode数据,最多4000个字符
nvarchar(n) 可变长度的Unicode数据,最多4000个字符
nvarchar(
max) 可变长度的Unicode数据,最多536870912个字符
ntext 可变长度的UNicode数据,最多2GB字符数据
---固定长度不足的话,其余位置用空格补足
---前面带n,存储中文汉字或数字,长度都是1,存储大小2个字节,不带n,英文或数字,就是1个字节,中文就是两个字节
日期型:
datetime 精确度高,8字节
datetine2 精度更高,100纳秒,6-8字节
smalldatetime 精度1分钟 事件范围小,4字节
date 存储的日期,没有时分秒,3字节
time 存储时间
timestamp 时间戳
其他类型:
uniqueidentifier guid 全球唯一标识符
三、创建表及主外键
一个表中,会存很多条记录,需要一个列唯一标识一条数据,
主键:可以提高查询速度
什么样的列能设置为主键:值不能重复、不能为空
什么叫标识列:标识列不能手动插入,插入时,自动生成,列类型必须是不带小数的数值型整型
标识列:标识种子(第一条标识列的值) 增量每增加一条数据自增的量
联合主键:两个或者多个列唯一标识
创建一个主键,同时自动创建一个聚集索引
外键:一般在两个表之间要建立关联的时候
一个表可以有多个外键,也可以没有,只能有一个主键,也可以没主键
一个列创建为外键,,它在另一个表必须是主键
有外键字段的表叫外键表,另外一个表是主键表
两个表一旦建立外键关系,外键表里对应的外键列,它的值必须是它对应的主键表里的主键值,
插入主键表里不存在的值,插入不进去
四、约束
定义:规定表中的数据规则。如果输入的数据存在违反约束的数据行为就会被阻止
在什么时候创建约束?
创建表之后,使用脚本创建;在创建表的过程中,使用软件创建也可以在创建表之后建立约束。
分类:
主键约束:Primary Key约束 唯一性、非空、不能修改
外键约束:Foreign Key约束 加强两个表的一列或多列数据之间的连接的
当删除主表中的某种数据,应该先删除从表中相关的数据,再删除主表
Unique约束:唯一性约束、确保表中的一列数据没有相同的值,与主键约束相似,但又不同。主
键只能有一个,但一个表中可以定义多个唯一约束
check约束:通过逻辑表达式来判断数据的有效性,来限制输入一列或多列值的范围。
Default约束:默认值约束用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值
赋给该列,如果没有设置默认值,系统默认为null
五、数据库脚本
用于创建数据库对象的语句集合。
T-SQL:Transact
-SQL 基于SQL(Structured Query Language)结构化查询语言,用于应用程
序和数据库之间沟通的编程语言。Sql Server 支持的脚本语言。
SQL语言:一种有目的的编程语言,用于存取数据、查询、更新和管理关系数据库,高级的非过
程化的编程语言。
作用:可以完成移植,一台服务器到另一台服务器的数据移植。提高数据的访问效率,完成对数
据的相关处理。
SQL语言分类:
DQL 数据查询语言:select 列
from 表名
where 条件
DML 数据操纵语言:insert 插入
insert into 表名(列,列,...)
values (对应的值,对应的值)
update 更新
update 表名
set 列名
=值,列名
=值
where 条件
delete 删除
delete from 表名
where 条件
DDL 数据定义语言:创建数据库及其对象Create/Alter/Drop Database/Table/View/Proc/Index
DCL 数据控制语言:用来授予/回收访问数据库的特权,对数据库实行监视等,
commit 提交
rollback 回滚
grant 授权
创建脚本:
master:系统数据库,它记录了SQL Server系统所有系统级信息,还记录了所有其他数据库的
存,数据库文件的位置,SQL Server的初始化信息
创建数据库:use master
--选择要操作的数据库
go -- 批处理命令
--创建数据库
create database TestNewBase
---数据库名称
on primary -- 主文件组
(
name=‘TestNewBase_data‘,
--数据库主要数据文件的逻辑名
filename
=‘绝对路径\TestNewBase.mdf‘,
--主要数据文件的路径(绝对路径)
size
=5MB,
--数据库主要文件的初始大小
filegrowth
=1MB,
--文件的增量
)
log on --创建日志文件
(
name=‘TestNewBase_log‘,
--数据库日志文件的逻辑名
filename
=‘绝对路径\TestNewBase_log.ldf‘,
--日志文件的路径
size
=1MB,
--数据库日志文件的初始大小
filegrowth
=10%,
--日志文件的增量
)
go
删除数据库:
drop database TestNewBase
go
脚本创建表:
--数据定义语言
use TestBase
go
create table ProductInfos
(
Id int identity(
1001,
1)
primary key not null,
--标识种子,增量
ProNo
varchar(
50)
not null,
ProName nvarchar(
50)
not null,
TypeId int not null,
Price decimal(
18,
2)
null,
ProCount int default (
5)
null --5是默认值
)
go
--删除表
drop table 表名
--表结构全部删掉
truncate table 表名
--删除表数据
go
--修改表,添加一列
alter table 表名
add 列名
nvarchar(
50)
null
--删除一列
alter table 表名
drop column 列名
--修改一列
alter table 表名
alter column 列名
nvarchar(
max)
not null
--修改列名 --一般慎用
exec sp_rename
‘表名.列名‘,
‘新列名‘,
‘column‘ --系统自带的存储过程
--在创建表的过程中创建约束
create table ProductInfos
(
Id int identity(
1001,
1)
primary key not null,
--标识种子,增量
ProNo
varchar(
50)
unique not null,
ProName nvarchar(
50)
not null,
TypeId int not null foreign key references 主键表名 (TypeId),
Price decimal(
18,
2)
check(Price<1000) default (0.00) null,
ProCount int default (
5)
null --5是默认值
)
主键约束:primary key
外键约束:foreign key references 主表名 (主键列名)
唯一约束:unique约束
check约束:check(Price
<1000)
default约束:默认值约束
--建表完成后创建约束
主键约束:
alter table 表名
add constraint 约束名(PK_...)
primary key(列名)
外键约束:
alter table 表名
add constraint 约束名(FK_...)
foreign key(列名)
references 主键表(主键)
唯一约束:
alter table 表名
add constraint 约束名(IX_...)
unique(列名,列名...)
check约束:
alter table 表名
add constraint 约束名(CK_...)
check(Price
<1000)
default约束:
alter table 表名
add constraint 约束名(DF_...)
default (
10)
for 列名
对表的操作:
插入操作:单条插入、多条插入、克隆表数据
单条数据插入:
insert into 表名 (列名,列名)
values (值1,值2)
insert 表名 (列名,列名)
select 值1,值2
多条数据插入:union(去重)
union all(允许重复,效率高)
insert into 表名 (列名)
values (值1),(值2),(值3)
insert into 表名 (列名1,列名2,列名3)
select a,b,c
union
select d,e,f
union
select d,e,f
union
克隆数据:将一张表的数据复制到另外一张表
insert into 目标表(目标列)
select 源列
from 源表
select 源列
into 目标表
from 源表
----目标表之前不存在,执行时自动创建
更新操作:
update 表名
set 列名1
=“值1”,列名2
=“值2”
where 条件
删除操作:delete,
update,insert可以回滚,可以恢复,每条都记录日志,truncate不能恢复
删除数据:delete from 表名,不加条件会删除全部数据,基本都要加where条件
重置数据:truncate table 表名,标识列初始化,效率比delete高,不记录日志,不激活触发器
删除表:drop table 表名
查询操作:
--查询所有数据,*代表所有列
select * from Table
--查询部分列的数据
select 列1,列2
from Table
--列命别名-三种方式列名1 as 别名1,列名2 别名2,别名3=列名3
select 列名1
as 别名1,列名2 别名2,别名3
=列名3
from Table
--排序---主键默认有排序功能,升序 asc;降序:desc
select * from Table order by col1
desc,col2
asc
order by永远放在最后
where 条件
order by col
desc
模糊查询:select col1,col2
from Table where col1
like ...
like SQL提供了4种匹配模式:
1.
% 0个或多个
select * from Table where col
like ‘%ad%‘、
like ‘a%‘、
like ‘%d‘(效率不高)
2._ 匹配单个字符,限制表达式的字符长度
select * from Table where col
like ‘u_er‘四个下划线就是为四个字符的数据
3.
[] 范围匹配,括号中所有字符中的一个
select * from Table where col
like ‘ad[m|n|p]in‘---括号内的匹配,可以不带竖线
select * from Table where col
like ‘ad[m-p]in‘---括号内范围匹配
4.
[^] 不在括号中的所有字符之内的单个字符
select * from Table where col
like ‘ad[^abc]in‘---不在abc范围内的其他的
范围查询:
前面多少条、百分比
select top 10 * from Table
select top 50 percent * from Table
比较运算符:>、
<、
>=、
<=、
<>
in()/not in()
select * from Table where col
in (a,b,c)
select * from Table where col
not in (a,b,c)
select * from Table1
where col1
in (
select col1
from Table2)
between and 等价于>=and<=
select * from Table where col
between a
and b
聚合函数:
五种聚合函数:count 记录个数、
sum 求和、
avg 求平均、
max 最大值、
min 最小值
对一组值执行计算并返回单一的值
经常与select中的group by一起使用
--select count(1) 伪造列
select count(
1) record
from Table、
count(
1)效率比count(
*)效率高
--统计一个表的记录数
--sum 求和 相加
select sum(col)
from table
--agv 求平均
select agv(col)
from table
--max 最大值
select max(col)
from table
--min 最小值
select min(col)
from table
分组查询:select...where ...group by...order by...
--select 出现列名,必须出现在group by 之后或包含在聚合函数中
select col,
count(
1) 用户数
from table group by col
having col
>1(分组后的筛选条件)
连接查询:
根据两个或多个表之间的关系,从这些表中查询数据,实现多表查询
分类:内连接、外连接、全连接、交叉连接
内连接:inner join 使用比较运算符
=、
>、
<、
>=、
<=、
<>进行表间的比较,查询与条件相匹配
的数据。
select col1,col2,col3
from table1 a
inner join table2 b
on a.col
=b.col
where col2
>20
隐式:select col1,col2,col3
from table1 a,table2 b
where a.col
=b.col
and col2
>20
外连接:左外连接、右外连接、全外连接;简称:左连接,右连接,全连接
左连接:left join...
on...返回左边表的所有行,右表中如果没有匹配上,对应的列就显示NULL
右连接:right join...
on...返回右边表所有行,左边如果没有匹配上,对应的列显示NULL
全连接:full join...
on...返回左表和右表中所有的行,当某一行在另一个表中没有匹配,另一个表
中的列返回NULL
交叉连接:cross join 笛卡尔积(两个表行数相乘) 不可以带on,可以带where
如果不带where子句时,返回被连接的两个表的笛卡尔积,返回的行数时两个表行数
的乘积。
带where子句:等价于inner join 返回的是匹配的数据
类型转换函数:
convert函数:convert(类型,表达式)
日期转换:select convert(
varchar(
10),
getdate(),
126)
cast函数:cast(表达式
as 类型)
字符串操作函数:
--返回字符串中指定的字串出现的开始位置
select CHARINDEX(
‘bc‘,
‘abcdbc‘)
--2 索引从1开始
--返回字符串中指定的字串出现的开始位置 子串前后必须带%
select PATINDEX(
‘%bc%‘,
‘abcdbc‘)
--2
--大小写转换
select upper(
‘abcde‘)
--ABCDE-----小写转换大写
select lower(
‘ABCDE‘)
--abcde------大写转换小写
--取长度
select len(
‘ABC‘)
---3
--去空格
select LTRIM(
‘ ABC ‘)
--去左边的空格
select RTRIM(
‘ ABC ‘)
--去右边的空格
--取子串
select LEFT(
‘abcdefgh‘,
4)
--abcd 返回字符串从左边起4个字符
select RIGHT(
‘abcdefgh‘,
3)
--fgh 返回字符串从右边起3个字符
select SUBSTRING(
‘abcdef‘,
3,
4)
--cdef 返回字符串从第3个开始取4个字符
select REPLICATE(
‘abc‘,
4)
--abcabcabcabc 将指定字符串重复4次返回重复的字符串
select REVERSE(
‘abcdef‘)
--fedcba 将指定字符串翻转
select REPLACE(
‘abcdefg‘,
‘cd‘,
‘ss‘)
-- 将cd换成ss
select STUFF(
‘abcdefg‘,
2,
3,
‘tt‘)
--attefg 2是从第二个位置开始,3是被替换的字符数量
索引:
索引的作用:数据的查询 处理速度--应用系统成败的标准。最普遍---优化方式-提高系统性能。
索引是什么:书
-目录 ,快速的定位要查找的数据,而不必取扫描整个表。加快查询速度
索引的缺点:占用存储空间,索引并不是越多越好,索引并不总是能提供系统性能的。
索引的目的:更加快速高效的查询数据,减少系统的响应时间。
索引分为聚集索引和非聚集索引
聚集索引:Clustered 逻辑顺序与物理顺序是一致的
---主键--最多只能有一个,可以没有
非聚集索引:
NonClustered 逻辑顺序与物理顺序并不是一致的
---唯一索引
非聚集索引比聚集索引的效率要低。
如果需要多个列上建立索引,这些列建立组合索引。
列:小数据类型的,访问速度特别快,索引是看不见的,创建了索引,查询大数据时,具有优势
脚本创建索引:
--不指定,默认是非聚集索引
create clustered index 索引名
---这是聚集索引
on 表名(列名)
with (drop_existing
=on)
---on-先删除原来的,create一个新的;off不删除,提
示错误,索引已存在
create unique nonclustered index 索引名
on 表名(列名)
with
(drop_existing=on,pad_index
=on,
fillfactor=50,ignore_dup_key
=on)
fillfactor---指定创建索引时,每个索引页的数据占索引页大小的百分比(读写的操作比例)
读写比例:
100:
1 100
读小于写:50-70
读写各一半:80-90
复合索引:多个列上建立的索引
create nonclustered ---复合索引
index 索引名
on 表名(列名1,列名2)
with (drop_existing
=on)
视图:
虚拟表,由一个或多个表通过查询而定义的,将查询定义保存起来,实际不包括数据。
与表的区别:表存储数据的地方,视图存储的是查询语句。(索引视图除外,具体化了)
作用:简化查询,增加数据的保密性,安全性上得到保证。
缺点:只是简化查询,并不提高查询速度,增加了维护成本
分类:
标准视图:存储查询定义,没有存储数据
索引视图:被具体化了的视图创建了索引,显著提供查询性能,聚集了很多行的查询,不太适合 、 经常更新基本数据集
分区视图:一台或堕胎服务器间水平连接一组成员表的分区数据
脚本创建视图:
标准视图:
create view 视图名
as
select col1,col2,col3,a.col4
from A a
inner join B b
on a.col
=b.col
使用视图跟使用表一样
索引视图:查询语句不能出现select *,必须写字段名,表名要加架构dbo
create view 视图名
with schemabinding
as
select col1,col2,col3,a.col4
from A a
inner join B b
on a.col
=b.col
使用视图跟使用表一样
索引视图创建唯一聚集索引,适合多行数据的情况
数据是真实存在,删除视图里的数据,基础表里的数据也被删除
索引视图不要取删除和修改数据
给索引视图添加唯一约束
create unique clistered
index 索引名
on 视图名(列名)
分区视图:
create view 视图名
as
select * from TableA
union all------------------union all 不去重
select * from TableB
TableA和TableB的表结构相同
分区视图会将两张表的数据结合在一起
标准视图和分区视图的数据无法删除,索引视图的数据可以被删除,实际表数据也会被删除
存储过程:
为了完成特定功能的一个或一组SQL语句集合。经编译后存储在服务器端的数据库中,可以利用
存储过程来加速对SQL语句的执行。调用名称,传入参数,执行来完成特定功能。
分类:系统存储过程、自定义存储过程。
系统存储过程:
master数据库中,其他数据库中可以直接调用,并且不必在前面加上数据库名,创建数据库时,
这些系统存储过程在新的数据库中自动创建。
自定义存储过程:用户自己创建、特性功能而创建。可以传入参数,也可以有返回值,表明存储
过程执行是否成功。里面可以只是一个操作,也可以包括多个。
执行:execute/exce 存储过程名 参数列表(多个参数,以逗号隔开)
优点:提供应用程序的通用性和可移植性。多次调用,而不必重新再去编写,维护人员可以随时
修改。
可以更有效的管理数据库权限。
提高执行SQL的速度。
减轻服务器的负担。
缺点:专门维护它,占用数据库空间。
语法:create proc 存储过程名
@UserId int,
@UserName varchar(
50)
AS
BEGIN
declare @time datetime
set @time = getdate()
insert into table(UserId ,UserName,CreateTime)
values (
@UserId ,
@UserName,
@time)
END
GO
修改存储过程alter proc 存储过程名
删除存储过程drop proc 存储过程名
使用:exec 存储过程名
‘参数1‘,
‘参数2‘来执行带参数的存储过程
update select --------关联表的修改操作
UPDATE b
SET b.HospitalDelegateName
=a.HosName
FROM TE.BAS_HospitalDelegate a
INNER JOIN TE.BAS_ApplyItem b
ON a.HosCode
=b.HospitalDelegate
WHERE b.HospitalDelegate
IS NOT NULL AND b.HospitalDelegateName
IS NULL AND b.HospitalDelegate
<>‘‘
数据库(SQLServer)
标签:乱码 关系模型 最小 概念 两种 float 信息 cross 检索