数据库(SQLServer)
Posted 任磊5
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库(SQLServer)相关的知识,希望对你有一定的参考价值。
一、数据库的概念 数据库: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)的主要内容,如果未能解决你的问题,请参考以下文章