zoukankan      html  css  js  c++  java
  • 数据库(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<>'' 
  • 相关阅读:
    python 汇总
    python 异常处理、文件常用操作
    python类中super()和__init__()的区别
    百度搜索结果爬虫
    BS4爬虫实例应用-CISP
    Java类WebServer及中间件拿webshell方法总结
    建模分析之机器学习算法(附python&R代码)
    [原创]代理转发工具汇总分析
    代码审计之文件操作
    PHP自带防SQL攻击函数区别
  • 原文地址:https://www.cnblogs.com/renleiblog/p/13328978.html
Copyright © 2011-2022 走看看