数据库(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 数据查询语言:selectfrom  表名  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 Tablecount(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---指定创建索引时,每个索引页的数据占索引页大小的百分比(读写的操作比例)
读写比例:1001  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<>'' 
原文地址:https://www.cnblogs.com/renleiblog/p/13328978.html