1.1实体对象:客观存在的事物都是实体
1.2实体数据的存储要求:必须按照一定的分类和存储规律
1.3数据库:专门用于存储实体信息的数据集合
2.实体存储基本单元
2.1数据表(实体集合):实体信息存储的基本单元,同类实体存放在同一个表中
2.2行(一条记录):实体
列(标题,字段):属性
3.不同实体(学员表、班级表、成绩表)的存储
数据库包括数据表、存储过程、视图、函数等这些操作对象
表是不同类型的实体集合
存储方法:不同实体存放在不同的数据表中
数据库:由大量数据、表间关系、以及各种数据操作对象组合成的一个数据集合
数据库不是一个简单的数据组合场所
4.数据库管理系统
DBMS(DataBaseManagementSystem):说白了就是诸如SQLServer2008软件本身
DBMS是一个由用户使用的数据库管理软件,让用户完成对数据库数据的处理。
DBMS功能:创建数据库和操作数据库
5.应用程序
应用程序是根据用户需求开发的具有业务逻辑的管理软件:说白了就是C#写的可以增查删改的软件
应用程序发送操作命令给数据库服务器;数据库服务器响应并提供查询结果给应用程序客户端。
应用程序作用:向数据库发送请求、并显示响应结果
应用程序要求:美观、操作简单方便、能够按照业务需求完成数据处理
6.如何学习数据库
6.1学习标准的SQL语言
SQL(StructedQueryLanguage:结构化查询语言)
使用SQL语言可以完成所有数据库的操作
应用程序通过SQL语言和数据库交互
6.2针对特定的DBMS(例如SQLServer)学习管理数据库
数据导入、导出
数据备份、还原
数据库性能改进
6.3将DML嵌入高级开发语言编写应用程序
基于客户端/服务器端(C/S)的桌面应用
基于浏览器/服务器(B/S)的web应用
7.SQL与T-SQL
7.1T-SQL概念
T-SQL=Transact-SQL
T-SQL是SQL的加强版
对功能进行了扩充:如变量说明、流程控制、功能函数
7.2T-SQL的组成
7.2.1DDL:数据定义语言
——用来建立数据库、数据库对象和定义列
——CreateTable、DropTable...
7.2.2DML:数据库操作语言
——查询、插入、删除和修改数据库中的数据
——Select、Insert、Update、Delete...
7.2.3DCL:数据控制语言
——用来控制存取许可、存取权限等
——Grant、Revoke...
7.2.4变量说明、流程控制、功能函数
——定义变量、判断、分支、循环结构等
——日期函数、数学函数、字符函数、系统函数等
8.数据库服务
8.1SQLServer(MSSQLServer)
运行在服务器端的应用程序,提供数据的存储、处理和事务等
在使用DBMS客户端之前必须首先打开该服务
8.2打开与关闭
电脑应用——服务(可以用右键“我的电脑”、管理、服务和应用程序、服务、找到SQLServer——MSSQKLSERVER)启停
8.3日志文件太如何清除
8.3.1数据库右键属性——>>选项——>>恢复模式——>>由完整切换为简单
8.3.2数据库右键任务——>>收缩——>>文件——>>文件类型选择日志——>>收缩类型选择第二个——>>将MB数更改2MB——>>确定
9.客户端连接到服务器
9.1关于客户端、服务器的说明
客户端:数据库管理系统(DBMS)或C#写的应用程序
服务器端:安装的数据库服务(数据库管理的核心程序)
两者关系:客户端和服务器端可以安装的时候完全分离开,一个服务器端可以被多个客户端连接,并为其提供服务。
9.2使用windows登陆方式
Windows登陆方式只能登陆本地
只要能登陆windows操作系统就可以登陆数据库服务器
9.2.1服务器名称:根据需求可以是服务器IP地址或服务器名称
9.2.2服务器名称:格式是服务器名称\数据库实例名称,例如192.168.1.102\MES
9.2.3身份验证:选择windows身份验证
10.数据库登陆常见错误
10.1本地连接解决办法步骤:检查数据库服务是否启动
检查数据库服务器名称或IP地址是否正确(注意命名示例和默认实例,应该是安装时候选项,有的时候“.”不一定能连得上)
10.2局域网或外网连接步骤:服务器是否允许远程控制
服务是否启动、IP地址和端口号是否正确
是否有防火墙拦截
能否ping通
数据库本身问题检查
10.3如果使用IP地址和端口号连接(服务器名称:127.0.0.1,1433)
IP地址为本地地址,端口号默认1433
可以打开SqlServerConfigurationManager,SQLServer网络配置,MSSQLSERVER的协议,TCP/IP属性查找,TCP/IP必须已启用,修改端口号之后要对MSSQLSERVER服务重新启用
11.安装数据库的实例配置
实例就是数据库的名称
SQL2000时一台服务器默认情况下最多有16个实例
选择“默认实例”:就是计算机寄存器的名称
如果装了SQLServer2008,当时用的默认实例,想再装2012,就不能再使用默认实例了。
12.企业管理器与查询分析器
查询分析器里面有SQL语句,是学习的重点。
13.SQLServer验证登陆
13.1修改服务器身份验证方式:服务器右键选择属性——安全性——修改为混合验证方式
13.3开启sa账户:安全性——sa——右键属性——常规最下方状态——选择“授予”和“启用”
13.4重新启动数据库服务:右键选择服务器——重新启动
14.数据库分类
14.1系统数据库
14.1.2model:创建新用户数据库的模板数据库
14.1.3msdb:用来保存数据库备份、SQLAgent信息、DTS程序包、SQLServer任务等信息
14.1.4tempdb:存有临时对象,例如临时表格和存储过程
14.用户数据库:一般就是自己或者用户创建的数据库
15.用户数据库文件组成=数据库文件+日志文件
15.1数据文件:.mdf(主数据文件)或.ndf(次要数据文件)
15.2日志文件:.ldf
一个数据库必须、且只能包含一个mdf,但可以有多个ndf和ldf(至少有一个)
16.创建数据库
17.1【第一步】在计算机服务中先停止SQLSever(MSSQLSERVER)服务
17.2【第二步】以管理员身份复制粘贴文件
18.分离与附加数据库
18.1分离数据库
可以右键要分离的数据库——>>>任务——>>>分离——>>>打勾删除连接——>>>确定
当数据库服务运行时,SQL2003及以下无法直接移动和复制数据库文件
所谓分离数据库就是将正在使用的数据库文件解除服务的限制
execsp_detach_db@dbname=数据库名称
18.2附加数据库
可以右键”数据库“——>>>附加——>>>选择好路径,选择要附加的mdf文件——>>>确定
附加数据库就是将指定位置的数据库文件加入到数据库服务中运行
数据库只有附加后,用户才能通过DBMS操作数据
execsp_attach_db@dbname=数据库名称,
@filename1=数据库主文件物理文件路径,
@filename2=数据库日志文件物理文件文件路径
--分离数据库execsp_detach_db@dbname=StudentManageDB--附加数据库方法1execsp_attach_db@dbname=StudentManageDB,@filename1='D:\DB\StudentManageDB_data_mdf',@filename2='D:\DB\StudentManageDB_log.ldf',--附加数据库方法2execsp_attach_dbStudentManageDB,'D:\DB\StudentManageDB_data.mdf','D:\DB\StudentManageDB_log.ldf'分离与附加数据库19.SQLServer数据类型
19.1文本类型:字符数据包含任意字母、符号或数字字符的组合
char:固定长度的非Unicode字符数据,最大长度为8000个字符
varchar:可变长度的非Unicode数据,最大长度为8000个字符
text:存储文本信息,最大长度为2的31次方-1(21亿)个字符
nchar:固定长度的Unicode数据,最大长度为4000个字符
nvarchar:可变长度的Unicode数据,最大长度为4000个字符
ntext:存储可变长度的长文本,2的30次方-1(10亿)个字符
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案
注意:带n的数据类型长度是不带n的两倍。比如nchar(1)和char(2)长度相同
19.2整数类型
bigint占:用8个字节,可表示范围:-263~263-1之间的整数
int:占用4个字节,可表示范围:-231~231之间的整数
smallint:占用2个字节,可表示范围:-215~215之间的整数
tinyint占用1个字节,可表示范围:0~255之间的整数
19.3精确数字类型
decimal:-1038~1038-1之间的固定精度和小数位的数字
numeric:功能等同于decimal
写法decimal(整数,小数)和numeric(整数,小数)
默认:如果不指定位数,默认18位整数,0位小数
19.4近似数字(浮点)类型
float[(n)]表示范围:-1.79E+308~1.79E+308(1.79*10308)
n表示精度,在1-53之间取值,当n在1-24之间时,精度为7位有效数字,占用4个字节;当n在25-53之间时,精度为15位有效数字,占用8个字节
real表示范围:-3.4E+38~3.4+38占用4个字节存储空间,相当于float(24)
19.5日期类型
datetime:允许的范围1753-1-1至9999-1-1
smalldatetime:允许的范围1900-1-1至2079-6-6
格式说明:分隔符数字方式2013-08-20或08/20/2013
纯数字方式:08201013
英文数字方式:Aug20,2013
注意问题:日期在使用的使用需要使用单引号(‘’)括起来
19.6货币类型
money:货币数值介于-263与263-1之间,精确到货币单位的千分之一
smallmoney:货币数据介于-214748.3648与214748.3648之间,精确到货币单位的千分之十
19.7位单位
bit:表示“是/否”类型的数据(0,1/true、false)
19.8二进制类型
binary:固定长度的二进制数据,最大长度为8000个字节
vbinary:可变长度的二进制数据,其最大长度为8000个字节
image:可变长度的二进制数据,其最大长度为231个字节
应用场合:可存储图片
20.创建数据表
20.1建表的语法
createtable表名(字段1数据类型列的特征,字段2数据类型列的特征,......字段n数据类型列的特征)go建表的语法20.2列的特征
20.2.1是否为空(null)
在输入数据时,数据库的列允许为空可不输入数据,否则必须输入。列是否为空要紧跟数据库设计的具体要求决定,对于关键列必须禁止为空
20.2.2是否是标识列(自动编号)
20.2.3是否有默认值
如果数据表的某列在用户不输入数据的时候,希望提供一个默认的内容,比如用户不输入地址时,则默认“地址不详”
20.2.4是否为主键
主键是实体的唯一标识,保证实体不被重复。一个数据表必须有主键才有意义,否则刷新和删除实体都可能会出现异常
21.标识列的特殊说明
21.1标识列使用的意义
有时一个数据表存储的实体很难找到不重复的列作为主键列,比如学员成绩表中存储着学生的成绩,则学号也很容易重复,其他列更无法做到不重复
SQLServer提供了一个“标识列”,也叫“自动增长列”或“自动编号”,它本身没有任何具体意义,但我们也可以让它表示特定意义,比如学生成绩表中自动标识Id,不表示实体属性,但学生信息表中的StudentId也是标识列,但它表示学生实体属性(学号)
21.2标识列的使用方法
该列比必须是整数类型(int)
标识种子:标识列的起始大小
标识增量:标识列每次递增的(自动增加)值
21.3注意问题
有标识列的数据表被删除某一行时,数据库会将该行空缺,标识列不会自动填补
标识列由系统自动维护,用户既不能自己输入数据,也不能修改数值
标识列可以同时定义为主键,也可以不定义为主键,根据需求决定
22.批处理语句go...go
go是SQLServer的批处理命名,只有代码编译器才能识别并处理,编辑其他应用程序就不能使用该命令。由于每个批处理之间是独立的,因此在一个批处理出现错误时,并不会影响其他批处理SQL代码的运行
必须加go的几个地方:使用use后必须加go、判断语句必须加go、创建数据库(表)必须加go
23.1插入实行(数据行)语法
insert[into]<表名>[列名]values<值列表>
[]内容可写可不写但建议必写;<>内容必写
23.2注意事项
列名个数=对应值的个数
非值类型的数据,必须放在单引号内
数据值的类型必须与定义的字段类型一致
24.查询实体(查)
查询语法
select<列名>from<源表名>[where<查询条件>]
*表示查询所有字段
25.T-SQL中的运算符
eg.selectStudent,StudentNamefromStudenswhereAge>=22
26.更新实体(改)
语法:Update<表名>set<列名=更新值>[where<更新条件>]
updateStudentssetStudentAddress='南京路99号',PhoneNumber=‘123456’whereStudentId=10001
使用update语句时,一定要注意where条件的配合使用
27.删除实体(删)
deletefrom<表名>[where<删除条件>]
truncatetable<表名>--清空数据表
使用删除语句时,一定要注意where条件的配合使用
delete删除数据时,要求该记录不能被外键引用,删除后标识列继续增长
truncate删除数据时,要求删除的表不能有外键约束,删除后重新条件数据,删除后标识列重新编排
truncate比delete执行速度快,而且使用的系统资源和事务日志资源更少
useStudentManageDBgo--增insertintoStudents(StudentName,Gender,Birthday,Age,StudentIdNo,PhoneNumber,StudentAddress,ClassId)values('杨三少','男','1992-08-17',21,1234567890,'098-6767656','河南路988号',4)go--查select*fromStudentsselectStudentId,StudentNamefromStudentsgo--改updateStudentssetStudentAddress='南京路1号',PhoneNumber='123456'whereStudentId=10000go--删deletefromStudentswhereStudentId=10004--可删除指定一条记录truncatetableStudents--清空整个数据表,之后标识列重新计数go增删改查28.数据完整性
能确保存储在数据库中数据的准确性和一致性
28.1实体完整性(行)
例如一个数据表中必须有一列属于主键(例如学生序号,查询时也主要是根据学号查询),学生的身份证号也是唯一的,要设置唯一约束
方法:主键约束、标识列、唯一约束
28.1.1主键约束与唯一约束
添加约束的基本语法
altertable表名addconstraint约束名约束类型(选择添加约束的列名)
alter:部分修改
28.1.2约束名的取名规则推荐采用:约束类型_约束字段
主键(PrimaryKey)约束:如pk_StudentId
唯一(UniqueKey)约束:如uq_StudentIdNo
useStudentManageDBgo--创建“主键”约束primarykeyifexists(select*fromsysobjectswherename='pk_StudentId')altertableStudentsdropconstraintpk_StudentIdaltertableStudentsaddconstraintpk_StudentIdprimarykey(StudentId)go--创建唯一约束uniquekeyifexists(select*fromsysobjectswherename='uq_StudentIdNo')altertableStudentsdropconstraintuq_StudentIdNoaltertableStudentsaddconstraintuq_StudentIdNounique(StudentIdNo)go主键约束与唯一约束28.2域完整性(列)
保证实体属性值符合规范要求
方法:检查约束(例如年龄必须在20~40年龄范围内)、限制数据类型、默认值、非空约束
约束名的取名规则
检查(CheckKey)约束:如ck_Age,检查可以限制某一属性值,例如年龄必须在18至25范围内、输入密码长度必须大于6等
默认(DefaultKey)约束:如df_StudentAddress,例如当不输入具体的地址时,默认“地址不详”
保证两表中相同属性值的一致性。例如学生表中的学生的班级编号必须是班级表中的值
约束方法:外键约束
外键约束的取名规则:外键(ForeignKey)约束:如FK_ClassId
如果实现已存在数据要添加外键,必须保证学生信息表中所有学生的班级已存在于班级表中的班级ID中,才可以添加外键成功
useStudentManageDBgo--创建外键约束ifexists(select*fromsysobjectswherename='fk_classId')altertableStudentsdropconstraintfk_classIdaltertableStudentsaddconstraintfk_classIdforeignkey(ClassId)referencesStudentClass(ClassId)goselect*fromStudentsgoinsertintoStudentClass(ClassId,ClassName)values(3,'C#2班')insertintoStudentClass(ClassId,ClassName)values(2,'SQL1班')select*fromStudentClassgo外键约束29.数据完整性总结
29.1实体完整性(右键“索引/键”)
能够唯一标识表中的每一条记录
实现方式:主键(primarykey),唯一键(uniquekey),标识列(identity)
29.2域完整性(右键“CHECK约束”)
表中特定列数据的有效性,确保不会输入无效的值
实现方式:数据类型限制,缺省值(default),非空值(notnull)
29.3引用完整性(右键“关系”)
维护表间数据的有效性、完整性
实现方式:建立外键,关联另一表的主键(foreignkey)
30.数据表的使用总结
30.1主键的使用
最少性原则:尽量选择单个键作为主键
稳定性原则:尽量选择数值更新少的列作为主键
30.2外键使用
要求数据类型、数据长度必须于对应的主键表字段完全一致
添加数据时,要首先添加主键表,再添加外键表
删除数据时,要首先删除外键表数据(Students),再删除主键表数据(SyudentClass)
30.3完整性数据库创建步骤
建数据库——>>>建数据表——>>>主键约束——>>>域完整性约束——>>>外键约束
30.4插入数据的过程
验证主键、主外键关系、检查约束......——>>>插入数据成功
四部分:查询内容selectStudentId,StudentName,Gender
查询对象fromStudents
过滤条件whereGender='男'
结果排序orderbyStudentIdDESC
【查询内容】可用“*”表示所有内容,也可以只查询一列或几列,当查询几列时中间用“,”隔开列名
【查询对象】就是从哪一张表中查询
【过滤条件】可有有无where<条件表达式1and条件表达式2>
【结果排序】ASCDESC
32.使用as和=修改列名,使用+合并多列
+连接的数据类型必须兼容
+连接字符串,结果为字符串数据的拼接
+连接数值型,结果为数值型数据的和
33.检测为空的行
select*fromScoreListwhereSQLScoreisnull检测为空的行34.常量列
selectStudentName,Gender,所在学校=‘北京大学’fromstudentswhereGender='男'andAge>=23常量列35.限制行数
37.1like
使用like查询,字段中的内容并不一定要与查询内容为安全一致,只要字段中包含这些内容即可,‘%’表示通配符
selectStudentName,StudentAddressfromStudentswhereStudentAddresslike'天津%'--查询出所有学生中天津的,地址是以‘天津’开头selectStudentName,StudentAddressfromStudentswhereStudentNamelike'%小%'--查询出所有学生中名字带‘小’字的like模糊查询37.2between
把某一字段中的值在特定范围内的记录查询出来,可查询整形等值类型和日期类型
使用between时包含两个临界点的值,相当于“>=”和“<=”
select*fromScoreListwhereCSharpbetween80and90selectStudentName,BirthdayfromStudentswhereBirthdaybetween'1997-1-1'and'1999-12-31'between...and...37.3in
把某一字段中内容与所列出的查询内容列表匹配的记录查询出来
selectStudentName,Birthday,AgefromStudentswhereAgein(21,22,23)selectStudentName,Birthday,AgefromStudentswhereStudentNamein('杨三少','李四宝','王大庆')in是否在某一数组中38.聚合函数
38.1对某一列求和、对满足条件的记录总数求和
selectMAX(CSharp)asC#最高分,MIN(CSharp)asC#最低分,C#平均分=AVG(CSharp)fromScoreList最大值、最小值、平均值39.多表查询
39.1内连接查询(innerjoin...on...)
查询的结果是两个源表中严格满足连接条件的记录连接
两个表中公有数据的查询
两个表中具有主外键关系,才可以实现内连接查询
需要注意的问题:
需要连接的表(可以是Students,也可以是ScoreList)
两个表连接的条件(主外键Students.StudentId=ScoreList.StudentId)
两个表相同的字段,必须说明来自哪个表
多表连接查询:只需要使用innerjoin将多个表按连接条件连接即可
查询的结果包括两个表所有满足连接条件的记录,以及左表所有不满足条件的其他记录。这些不满足的左表记录,在结果的右边位置,会全部跳上null值
换句话说,就是左表中的要统统显示,与左表有连接的右表没有对应实体(字段)的话,该字段为NULL
39.3右外连接查询(rightouterjoin...on...)
40.groupby分组
搜集数据行到各个组中,统计函数为各个组计算统计值
41.having分组统计筛选
41.1分组统计筛选
eg.统计出C#平均分大于70的班级
使用having而不能使用where
41.2在分组结果中,去掉不符合搜索条件的各组数据行
where——>>>groupby——>>>having
42.数据库的设计
42.1需求分析
通过向客户调研,了解客户的实际需求
总结分析客户所需要的管理系统,究竟要保存、要处理哪些数据
以学员管理系统开发为背景,分析系统的基本功能:
42.2表示对象(实体)并设计对象的属性
对象(实体)映射为数据库中的数据表
对象属性映射为数据表的字段
对象应该有唯一的标识(ID)
注意:
42.3确定对象之间的映射关系
对象之间通过外键映射关系,减少数据冗余
对象之间的映射关系是通过对象唯一标识建立的
常见的映射关系有一对一、一对多、多对多
43.数据库设计合理性检验
43.1数据不能冗余
不能存在同样的数据实体,否则删除、更新时会出现异常
43.2数据库三范式原则
范式:是具有最小冗余的表结构
应用第二、第三范式时,为了保证实体之间存在必要的关系,往往需要将独立的实体和当前实体通过外键关联起来
规范化以后使用Viso软件创建数据库模型
44.三范式与数据库性能
44.1第三范式的应用后数据库的变化
44.2为了满足某种商业目的,数据库性能比规范化数据库更重要(实际需求>科学设计)