数据库(SQLServer) [数据库教程]

database

一、数据库的概念

数据库: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字节)精确到万分之一

二进制类型:bitbinaryvarbinary(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 插入 insertinto 表名(列,列,...)values (对应的值,对应的值)

update 更新 update 表名 set 列名=值,列名=where 条件

delete 删除 deletefrom 表名 where 条件

DDL 数据定义语言:创建数据库及其对象Create/Alter/DropDatabase/Table/View/Proc/Index

DCL 数据控制语言:用来授予/回收访问数据库的特权,对数据库实行监视等,commit 提交

rollback 回滚 grant 授权

创建脚本:

master:系统数据库,它记录了SQL Server系统所有系统级信息,还记录了所有其他数据库的

存,数据库文件的位置,SQL Server的初始化信息

创建数据库:use master --选择要操作的数据库

go-- 批处理命令

--创建数据库

createdatabase TestNewBase ---数据库名称

onprimary-- 主文件组

(

name=TestNewBase_data,--数据库主要数据文件的逻辑名

filename=绝对路径TestNewBase.mdf,--主要数据文件的路径(绝对路径)

size=5MB,--数据库主要文件的初始大小

filegrowth=1MB,--文件的增量

)

logon--创建日志文件

(

name=TestNewBase_log,--数据库日志文件的逻辑名

filename=绝对路径TestNewBase_log.ldf,--日志文件的路径

size=1MB,--数据库日志文件的初始大小

filegrowth=10%,--日志文件的增量

)

go

删除数据库:

dropdatabase TestNewBase

go

脚本创建表:

--数据定义语言

use TestBase

go

createtable ProductInfos

(

Id intidentity(1001,1) primarykeynotnull,--标识种子,增量

ProNo varchar(50) notnull,

ProName nvarchar(50) notnull

TypeId intnotnull,

Price decimal(18,2) null,

ProCount intdefault (5) null--5是默认值

)

go

--删除表

droptable 表名 --表结构全部删掉

truncatetable 表名 --删除表数据

go

--修改表,添加一列

altertable 表名 add 列名 nvarchar(50) null

--删除一列

altertable 表名 dropcolumn 列名

--修改一列

altertable 表名 altercolumn 列名 nvarchar(max) notnull

--修改列名 --一般慎用

exec sp_rename 表名.列名,新列名,column--系统自带的存储过程

--在创建表的过程中创建约束

createtable ProductInfos

(

Id intidentity(1001,1) primarykeynotnull,--标识种子,增量

ProNo varchar(50) uniquenotnull,

ProName nvarchar(50) notnull

TypeId intnotnullforeignkeyreferences 主键表名 (TypeId),

Price decimal(18,2) check(Price<1000) default (0.00) null,

ProCount intdefault (5) null--5是默认值

)

主键约束:primarykey

外键约束:foreignkeyreferences 主表名 (主键列名)

唯一约束:unique约束

check约束:check(Price<1000)

default约束:默认值约束

--建表完成后创建约束

主键约束:

altertable 表名 addconstraint 约束名(PK_...) primarykey(列名)

外键约束:

altertable 表名 addconstraint 约束名(FK_...) foreignkey(列名) references 主键表(主键)

唯一约束:

altertable 表名 addconstraint 约束名(IX_...)unique(列名,列名...)

check约束:

altertable 表名 addconstraint 约束名(CK_...)check(Price<1000)

default约束:

altertable 表名 addconstraint 约束名(DF_...)default (10) for 列名

对表的操作:

插入操作:单条插入、多条插入、克隆表数据

单条数据插入:

insertinto 表名 (列名,列名)values (值1,值2)

insert 表名 (列名,列名)select 值1,值2

多条数据插入:union(去重) unionall(允许重复,效率高)

insertinto 表名 (列名)values (值1),(值2),(值3)

insertinto 表名 (列名1,列名2,列名3) select a,b,c union

select d,e,f union

select d,e,f union

克隆数据:将一张表的数据复制到另外一张表

insertinto 目标表(目标列) select 源列 from 源表

select 源列 into 目标表 from 源表----目标表之前不存在,执行时自动创建

更新操作:

update 表名 set 列名1=“值1”,列名2=“值2” where 条件

删除操作:delete,update,insert可以回滚,可以恢复,每条都记录日志,truncate不能恢复

删除数据:deletefrom 表名,不加条件会删除全部数据,基本都要加where条件

重置数据:truncatetable 表名,标识列初始化,效率比delete高,不记录日志,不激活触发器

删除表:droptable 表名

查询操作:

--查询所有数据,*代表所有列

select*fromTable

--查询部分列的数据

select 列1,列2 fromTable

--列命别名-三种方式列名1 as 别名1,列名2 别名2,别名3=列名3

select 列名1 as 别名1,列名2 别名2,别名3=列名3 fromTable

--排序---主键默认有排序功能,升序 asc;降序:desc

select*fromTableorderby col1 desc,col2 asc

order by永远放在最后

where 条件 orderby col desc

模糊查询:select col1,col2 fromTablewhere col1 like ...

like SQL提供了4种匹配模式:

1.% 0个或多个

select*fromTablewhere col like%ad%likea%like%d(效率不高)

2._ 匹配单个字符,限制表达式的字符长度

select*fromTablewhere col likeu_er四个下划线就是为四个字符的数据

3.[] 范围匹配,括号中所有字符中的一个

select*fromTablewhere col likead[m|n|p]in---括号内的匹配,可以不带竖线

select*fromTablewhere col likead[m-p]in---括号内范围匹配

4.[^] 不在括号中的所有字符之内的单个字符

select*fromTablewhere col likead[^abc]in---不在abc范围内的其他的

范围查询:

前面多少条、百分比

selecttop10*fromTable

selecttop50percent*fromTable

比较运算符:><>=<=<>

in()/notin()

select*fromTablewhere col in (a,b,c)

select*fromTablewhere col notin (a,b,c)

select*from Table1 where col1 in (select col1 from Table2)

betweenand 等价于>=and<=

select*fromTablewhere col between a and b

聚合函数:

五种聚合函数:count 记录个数、sum 求和、avg 求平均、max 最大值、min 最小值

对一组值执行计算并返回单一的值

经常与select中的group by一起使用

--select count(1) 伪造列

selectcount(1) record fromTablecount(1)效率比count(*)效率高--统计一个表的记录数

--sum 求和 相加

selectsum(col) fromtable

--agv 求平均

select agv(col) fromtable

--max 最大值

selectmax(col) fromtable

--min 最小值

selectmin(col) fromtable

分组查询:select...where ...groupby...orderby...

--select 出现列名,必须出现在group by 之后或包含在聚合函数中

select col,count(1) 用户数 fromtablegroupby col having col>1(分组后的筛选条件)

连接查询:

根据两个或多个表之间的关系,从这些表中查询数据,实现多表查询

分类:内连接、外连接、全连接、交叉连接

内连接:innerjoin 使用比较运算符 =><>=<=<>进行表间的比较,查询与条件相匹配

的数据。

select col1,col2,col3 from table1 a innerjoin 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

外连接:左外连接、右外连接、全外连接;简称:左连接,右连接,全连接

左连接:leftjoin...on...返回左边表的所有行,右表中如果没有匹配上,对应的列就显示NULL

右连接:rightjoin...on...返回右边表所有行,左边如果没有匹配上,对应的列显示NULL

全连接:fulljoin...on...返回左表和右表中所有的行,当某一行在另一个表中没有匹配,另一个表

中的列返回NULL

交叉连接:crossjoin 笛卡尔积(两个表行数相乘) 不可以带on,可以带where

如果不带where子句时,返回被连接的两个表的笛卡尔积,返回的行数时两个表行数

的乘积。

带where子句:等价于inner join 返回的是匹配的数据

类型转换函数:

convert函数:convert(类型,表达式)

日期转换:selectconvert(varchar(10),getdate(),126)

cast函数:cast(表达式 as 类型)

字符串操作函数:

--返回字符串中指定的字串出现的开始位置

selectCHARINDEX(bc,abcdbc) --2 索引从1开始

--返回字符串中指定的字串出现的开始位置 子串前后必须带%

selectPATINDEX(%bc%,abcdbc) --2

--大小写转换

selectupper(abcde) --ABCDE-----小写转换大写

selectlower(ABCDE)--abcde------大写转换小写

--取长度

selectlen(ABC)---3

--去空格

selectLTRIM( ABC )--去左边的空格

selectRTRIM( ABC )--去右边的空格

--取子串

selectLEFT(abcdefgh,4) --abcd 返回字符串从左边起4个字符

selectRIGHT(abcdefgh,3) --fgh 返回字符串从右边起3个字符

selectSUBSTRING(abcdef,3,4)--cdef 返回字符串从第3个开始取4个字符

selectREPLICATE(abc,4)--abcabcabcabc 将指定字符串重复4次返回重复的字符串

selectREVERSE(abcdef)--fedcba 将指定字符串翻转

selectREPLACE(abcdefg,cd,ss)-- 将cd换成ss

selectSTUFF(abcdefg,2,3,tt)--attefg 2是从第二个位置开始,3是被替换的字符数量

索引:

索引的作用:数据的查询 处理速度--应用系统成败的标准。最普遍---优化方式-提高系统性能。

索引是什么:书-目录 ,快速的定位要查找的数据,而不必取扫描整个表。加快查询速度

索引的缺点:占用存储空间,索引并不是越多越好,索引并不总是能提供系统性能的。

索引的目的:更加快速高效的查询数据,减少系统的响应时间。

索引分为聚集索引和非聚集索引

聚集索引:Clustered 逻辑顺序与物理顺序是一致的---主键--最多只能有一个,可以没有

非聚集索引:NonClustered 逻辑顺序与物理顺序并不是一致的---唯一索引

非聚集索引比聚集索引的效率要低。

如果需要多个列上建立索引,这些列建立组合索引。

列:小数据类型的,访问速度特别快,索引是看不见的,创建了索引,查询大数据时,具有优势

脚本创建索引:

--不指定,默认是非聚集索引

createclusteredindex 索引名---这是聚集索引

on 表名(列名) with (drop_existing=on)---on-先删除原来的,create一个新的;off不删除,提

示错误,索引已存在

createuniquenonclusteredindex 索引名 on 表名(列名)with

(drop_existing=on,pad_index=on,fillfactor=50,ignore_dup_key=on)

fillfactor---指定创建索引时,每个索引页的数据占索引页大小的百分比(读写的操作比例)

读写比例:1001100

读小于写:50-70

读写各一半:80-90

复合索引:多个列上建立的索引

createnonclustered---复合索引

index 索引名 on 表名(列名1,列名2)with (drop_existing=on)

视图:

虚拟表,由一个或多个表通过查询而定义的,将查询定义保存起来,实际不包括数据。

与表的区别:表存储数据的地方,视图存储的是查询语句。(索引视图除外,具体化了)

作用:简化查询,增加数据的保密性,安全性上得到保证。

缺点:只是简化查询,并不提高查询速度,增加了维护成本

分类:

标准视图:存储查询定义,没有存储数据

索引视图:被具体化了的视图创建了索引,显著提供查询性能,聚集了很多行的查询,不太适合 、 经常更新基本数据集

分区视图:一台或堕胎服务器间水平连接一组成员表的分区数据

脚本创建视图:

标准视图:

createview 视图名

as

select col1,col2,col3,a.col4 from A a innerjoin B b on a.col=b.col

使用视图跟使用表一样

索引视图:查询语句不能出现select *,必须写字段名,表名要加架构dbo

createview 视图名 with schemabinding

as

select col1,col2,col3,a.col4 from A a innerjoin B b on a.col=b.col

使用视图跟使用表一样

索引视图创建唯一聚集索引,适合多行数据的情况

数据是真实存在,删除视图里的数据,基础表里的数据也被删除

索引视图不要取删除和修改数据

给索引视图添加唯一约束

createunique clistered index 索引名

on 视图名(列名)

分区视图:

createview 视图名

as

select*from TableA

unionall------------------union all 不去重

select*from TableB

TableA和TableB的表结构相同

分区视图会将两张表的数据结合在一起

标准视图和分区视图的数据无法删除,索引视图的数据可以被删除,实际表数据也会被删除

存储过程:

为了完成特定功能的一个或一组SQL语句集合。经编译后存储在服务器端的数据库中,可以利用

存储过程来加速对SQL语句的执行。调用名称,传入参数,执行来完成特定功能。

分类:系统存储过程、自定义存储过程。

系统存储过程:

master数据库中,其他数据库中可以直接调用,并且不必在前面加上数据库名,创建数据库时,

这些系统存储过程在新的数据库中自动创建。

自定义存储过程:用户自己创建、特性功能而创建。可以传入参数,也可以有返回值,表明存储

过程执行是否成功。里面可以只是一个操作,也可以包括多个。

执行:execute/exce 存储过程名 参数列表(多个参数,以逗号隔开)

优点:提供应用程序的通用性和可移植性。多次调用,而不必重新再去编写,维护人员可以随时

修改。

可以更有效的管理数据库权限。

提高执行SQL的速度。

减轻服务器的负担。

缺点:专门维护它,占用数据库空间。

语法:createproc 存储过程名

@UserIdint,

@UserNamevarchar(50)

AS

BEGIN

declare@timedatetime

set@time=getdate()

insertintotable(UserId ,UserName,CreateTime)

values (@UserId ,@UserName,@time)

END

GO

修改存储过程alter proc 存储过程名

删除存储过程drop proc 存储过程名

使用:exec 存储过程名 参数1,参数2来执行带参数的存储过程

updateselect --------关联表的修改操作

UPDATE b SET b.HospitalDelegateName=a.HosName FROM TE.BAS_HospitalDelegate a INNERJOIN TE.BAS_ApplyItem b ON a.HosCode=b.HospitalDelegate

WHERE b.HospitalDelegate ISNOTNULLAND b.HospitalDelegateName ISNULLAND b.HospitalDelegate<>‘‘

 

数据库(SQLServer)

以上是 数据库(SQLServer) [数据库教程] 的全部内容, 来源链接: utcz.com/z/534633.html

回到顶部