数据库学习

两个应用程序交互:
外部:
文件 数据库 注册表 环境变量
内部方式:
共享内存 管道/套结字

1数据库系统:
是指在计算机系统中引入数据库后的系统。一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员和用户构成
数据库的特点:
特点一:数据的结构化(数据库与文件系统的根本区别)
特点二:数据的共享性高,冗余度低,易扩充
特点三:数据独立性高
特点四:数据由DBMS统一管理和控制

安全性保护
完整性检查
并发控制
数据库恢复

2模型:
层次数据模型
		层次数据模型本身比较简单。
		查询效率高,性能优于关系模型,不低于网状模型。
		层次数据模型提供了良好的完整性支持
网状数据模型
		能够更为直接地描述现实世界。
		具有良好的性能,存取效率较高。
关系数据模型
		能够更为直接地描述现实世界。
 		具有良好的性能,存取效率较高。
面向对象数据模型

3E-R图建立概念模型
实体型:矩形
属性:椭圆,用无向边将其与相应的实体连接起来
联系:菱形,用无向边将其与相应的实体连接起来,同时表明联系的类型(1:1,1:n或m:n)

4数据模型三要素:
数据结构   数据操作   数据的约束条件

5概念:
数据模式中的型和值
	型(Type):对某一类数据的结构和属性的说明
	值(Value):是型的一个具体赋值
模式(Schema)
	数据库逻辑结构和特征的描述
	是型的描述
	反映的是数据的结构及其联系
	模式是相对稳定的
模式的一个实例(Instance)
	模式的一个具体值
	反映数据库某一时刻的状态
	同一个模式可以有很多实例
	实例随数据库中的数据的更新而变动
外模式(External Schema)
	外模式又称为用户模式,是数据库用户和数据库系统的接口,是数据库用户的数据视图(View),是数据库用户可以看见和使用的局部数据的逻辑结构和特征的描述
模式(Schema)
	模式是所有数据库用户的公共数据视图,是数据库中全部数据的逻辑结构和特征的描述。
内模式(Internal Schema)
	内模式又称为存储模式(Storage Schema),数据库物理结构和存储方式的描述,是数据在数据库内部的表示方式。
	
外模式/模式映象
	通过外模式与模式之间的映象把描述局部逻辑结构的外模式与描述全局逻辑结构的模式联系起来。
模式/内模式映象
	通过模式与内模式之间的映象把描述全局逻辑结构的模式与描述物理结构的内模式联系起来
	
关系数据库的形式化定义:
笛卡尔积:
D1×D2×…×Dn={(d1,d2,…,dn)|di?Di,i=1,2,…n}

超码(Super Key):任意一个候选码的超集。
候选码(Candidate Key):能唯一标识元组的属性(组)。
主码(Primary Key):多个候选码中选定一个作主码。
主属性(Prime Attribute):候选码中的诸属性。
非主属性(Non-Key Attribute):不出现在任何候选码中的属性

基本关系(基本表)--------数据库中的表
查询表--------------------------查询结果集
视图----------------------------多个表导出(虚表)

参照完整性:
外码(Foreign key)
参照关系(Referencing Relation)
被参照关系(Referenced Relation)

F是基本关系R的一个或一组属性。
	F不是关系R的码。
	F与基本关系S的主码Ks相对应。
	则称F是基本关系R的外码
外码取值:
	1)空(NULL);尚未分配具体的值
	2)目标关系中存在的值;
	*表内属性间的参照也要有存在的值;



6.集合运算符:并 差 交
专门的关系运算符:
广义笛卡尔积
选择:给定条件,选择符合条件的元组;(行的集合)
投影:投影:从关系中选出若干列构成新的关系(列的运算)
	投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
连接:
	等值连接:A=B
	自然连接:取消重复列
	连接中舍弃的元组也进行保留的连接叫做外连接
	连接中舍弃的元组也保留的连接叫做外连接
	保留左边关系的叫做左外连接(left outer join)
	同理(right out join)
	
	
除:
	同时从行和列的角度进行处理.


 逻辑运算符
 ~ 非
	与
	或
	
处理:
	查询只选修C2和C4课程的学生学号。
	R1:至少选修了C2和C4课程的学生学号。
	R2:选修了C2和C4以外其他课的学生学号。
	R = R1 –R2
	
求解R1:至少选修了C2和C4课程的学生学号
方法一:集合运算:选C2的学生与选C4的学生的交集
方法二:除法运算:设K={C2,C4}
方法三:连接运算


7.SQL语言
主要数据文件(*.MDF)(每个数据库一个)
次要数据文件(*.NDF)(每个数据库多个)
事务日志(*.LDF)(每个数据库一个)

数据定义
CREATE,DROP,ALTER
数据查询
SELECT
数据更新
INSERT,UPDATE,DELETE
数据控制
GRANT,REVOKE

//创建数据库
CREATE DATABASE student
ON PRIMARY
(name = student1_dat,
filename = 'c:\student1_dat.mdf',
size =10, maxsize = 50, filegrowth = 15%),
FILEGROUP studentGroup1
(name = student1Fil_dat,
filename = 'c:\student11Fildt.ndf',
size =10, maxsize = 50, filegrowth = 5),
(name = student2Fil_dat,
filename = 'c:\student12Fildt.ndf',
size =10, maxsize = 50, filegrowth = 5)
log on
(name = 'student_log',
filename = 'c:\studentlog.ldf',
size = 5MB, maxsize=25MB, filegrowth = 5MB)


数据库的删除
DROP DATABASEstudent

数据库的修改
ALTER DATABASE student

//数据类型
char
定长字符数据(非Unicode字符)1 ~8000字符
varchar
变长字符数据(非Unicode字符) 1 ~8000字符
nchar
定长字符数数据(Unicode字符) 1 ~4000字符
nvarchar
变长字符数据数据(Unicode字符) 1 ~4000字符
整数类型 字节数 符号 范围
bitint 8BYTE 有 -2^63~2^63-1
int 4BYTE 有 -2^31~2^31-1
smallint 2BYTE 有 -2^15~2^15-1
tinyint 1BYTE 无 0 ~255
bit 1BIT 无 1/0

//创建表
CREATE TABLE 

//完整性约束
Primary key, Foreign key,Unique, Not null, default value

not null ,unique 可以替换为 primary key

CREATE TABLE SC (
Sno CHAR(5)  primary key,
Cno CHAR(3) ,
Grade int ,
PRIMARY KEY(Sno, Cno) ,
FOREIGN KEY(Sno) REFERENCESS(Sno),
FOREIGN KEY(Cno) REFERENCESC(Cno)
)


//ALTER使用
向Student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD Scome DATETIME;
注:不论基本表中原来是否已有数据,新增加的列一律为空
将年龄的数据类型改为半字长整数。
ALTER TABLE Student ALTER column Sage SMALLINT;
删除学生姓名必须取唯一值的约束。
ALTER TABLE Student DROP constraint IX_sname

删除Student表
DROP TABLEStudent;

索引的定义
索引的定义CREATE INDEX

CREATE [UNIQUE] [CLUSTER/NONCLUSTERED] INDEX
<索引名> ON <表名>(<列名>,[<次序>][,<列名>
[<次序>]]…)
次序:ASC 升序   DESC 降序
UNIQUE :每个索引值只对应一个唯一的数据记录
CLUSTER:-索引项的顺序与表中物理顺序一致,聚集索引的
最低一级(叶级)包含实际的数据行;
-实质对表中记录依列名进行排序,
-在一个基本表上最多只能建立一个聚簇索引
-更新时要重排序。

无索引的查询:顺序依次遍历表中的每行


为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC);

在Student表的Sname(姓名)列上建立一个聚簇索引,
而且Student表中的记录将按照Sname值的升序存放。
CREATE CLUSTERINDEX Stusname ON Student(Sname);


索引的删除
索引的删除DROP INDEX
语法格式:
DROP INDEX <索引名>


 insert into 表名  values (值)
   insert into user_wfx  values(1,'wfx','123456',20,'女');
   insert into user_wfx(id,name,pass,age)values(2,'zhangsan','123',23)
 update
   update 表名   set  修改列名=值
   update user_wfx set  pass='111111'
   update user_wfx set  pass='123456' where id=1
delete
   delete  from 表名
   delete  from  user_wfx
   delete  from  user_wfx where name='wfx'
	
	



8查询分类
1. 单表查询
2. 连接查询
3. 嵌套查询
4. 集合查询

单表查询:
查询全体学生的学号与姓名。
SELECT Sno,Sname FROM Student
[例2] 查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept FROM Student;
[例3] 查询全体学生的详细记录。
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或SELECT *--表示将表中的列全部按序输出
FROM Student;

--单表查询
Select [ ALL|DISTINCT ]<输出属性列表>
From <一个或多个数据库表或视图>
[Where <查询条件> ]
[Group By <分组条件>[HAVING <条件表达式>] ]
[Order By <结果排序> [ASC|DESC]

--消除结果中取值重复的行:DISTINCT

--确定范围 BETWEEN AND,NOT BETWEEN AND
--多重条件 AND,OR(AND优先级高于OR)
--空值     IS NULL,IS NOT NULL
--字符匹配 LIKE,NOT LIKE
--确定集合 IN,NOT IN


--逻辑运算符AND——与、OR——或、NOT——非
select * from student where sage>18 AND sdept =‘cs’
select * from student where sage>18 OR sdept=‘cs’
select * from student where NOT sage>18
--(4)范围运算符——BETWEEN …. AND …
select * from student where sage between 19 and 23
select * from student where sage not between 19 and 23

Select * from student where sdept IN (‘IS’,’MA’,’CS’)




Select * from student where sname LIKE ‘刘__‘
Select * from student where sname LIKE ‘刘%‘
select * from sc where grade ISNULL --不能使用等号代替

--排序
order by: asc或者desc,缺省值为升序
select sno,grade from sc where cno='3' order by grade desc
select * from student order by sdept,sage desc



--统计信息
count( [distinct | all] *) 统计元组个数
count( [distinct | all] <列名>) 统计一列中值的个数
sum( [distinct | all] <列名>)列值总和
avg( [distinct | all] <列名>)列值平均值
max( [distinct | all] <列名>)列值中最大
min( [distinct | all] <列名>) 列值中最小元组个数

SELECT COUNT(DISTINCT Sno) FROM SC

GROUP BY 对查询结果分组
值相等的为一组,常与集函数一起使用。
HAVING 条件只能作用组
WHERE 作用于表、视图
例求各个课程号及相应的选课人数
select cno,count(sno) from sc group by cno
例查询学号在95001到95100之间的选修了2门以上课程的学生学号。
select sno from sc
where sno between 95001 and 95100 group by sno having count(*)>2


--连接查询
等值连接/自然连接/非等值连接
自身连接
外连接
复合条件连接

SELECT Student.*, SC.*
FROM Student, SC
WHERE Student.Sno = SC.Sno;//等值连接
或
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student, SC
WHERE Student.Sno = SC.Sno;//自然连接

自身连接(INNER JOIN)--一个表与其自己进行连接的查询
例:查询每门课的间接选修课。
Select a.cno,b.cpno from course a,course b Where a.cpno=b.cno

--自身连接  输入课程的前导课程的前导课程.
select a.cno,b.cpno
from C a,C b
where  a.cpno=b.cno

--外连接
Select student.sno, sname,ssex,sage,sdept,cno,grade
from student LEFT OUT JOIN sc
On student.sno = sc.sno

/*
LEFT  JOIN或LEFT OUTER JOIN     
左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。       
2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN     
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。       
3)FULL  JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 
*/
--左外连接
Select s.sno, sname,ssex,sage,sdep,cno,grade
from s left join sc
on s.SNO=sc.sno

--连接查询
--复合条件连接--WHERE子句中含多个连接条件
--[例] 查询选修2号课程且成绩在90分以上的所有学生的学号、姓名。
SELECT Student.Sno, student.Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno AND SC.Cno= '2' AND  
SC.Grade > 90;

--嵌套查询
Select sname --外层查询/父查询
from student
where sno IN
(select sno --内层查询/子查询
from sc
where cno=‘2’)
--@@子查询的SELECT:不能使用ORDER BY子句

有些嵌套查询可以用连接查询实现,有些是不可以
采用不相关子查询的效率要优于连接查询。

--嵌套查询–带有ANY/ALL谓词的子查询
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY(SELECT Sage
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS '


SELECT Sname,Sage --效率更高
FROM Student
WHERE Sage <
(SELECT MAX(Sage)
FROM Student
WHERE Sdept= ' IS ')


--含有 EXISTS
SELECT Sname
FROM Student
WHERE EXISTS
( SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno= '1');

--集合查询
并操作(UNION)
交操作(INTERSECT)
差操作(EXCEPT)

SELECT Sno
FROM SC
WHERE Cno='1'
UNION
SELECT Sno
FROM SC
WHERE Cno= '2'

--数据库的安全性
自主存取控制(DAC)与强制存取控制(MAC)
授权(Authentication)与回收(GRANT&REVOKE)
数据库角色

数据库安全性控制常用方法
	用户标识和鉴定
	存取控制
			自主存取控制方法(DAC)
			通过GRANT和REVOKE语句实现;
			GRANT INSERT
			ON TABLE SC
			TO U5
			WITH GRANT OPTION
			
			REVOKE UPDATE(Sno)
			ON TABLE Student
			FROM U4;
	强制存取控制(MAC)
	(1)每一个数据对象被标以一定的密级
	(2)每一个用户也被授予某一个级别的许可证
	(3)对于任意一个对象,只有具有合法许可证的用户才可以存取
	仅当主体的许可证级别大于或等于客体的密级时,该主体
	才能读取相应的客体
	(2)仅当主体的许可证级别等于客体的密级时,该主体才能写
	相应的客体
	共同点:禁止了拥有高许可证级别的主体更新低密级的数据对象

	视图
	把要保密的数据对无权存取这些数据的用户隐藏起来,
	对数据提供一定程度的安全保护
	
1)先建立计算机系学生的视图CS_Student
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept=‘CS’;
2)在视图上进一步定义存取权限
GRANT SELECT
ON CS_Student
TO 王平;
GRANT ALL PRIVILIGES
ON CS_Student
TO 张;
	审计
	启用一个专用的审计日志(Audit Log)
	用途:将用户对数据库的所有操作记录在上面
	-DBA可以利用审计日志中的追踪信息找出非法存取数据的人
	-C2以上安全级别的DBMS必须具有审计功能
	数据加密

	规则1:任何查询至少要涉及N(N足够大)个以上的记录
	规则2:任意两个查询的相交数据项不能超过M个
	规则3:任一用户的查询次数不能超过1+(N-2)/M
	
--完整性
--将SC表中的Sno,Cno属性组定义为码
--在表级定义主码
CREATE TABLE SC
( 
	Sno CHAR(9) NOT NULL,
	Cno CHAR(4) NOT NULL,
	Grade SMALLINT,
	PRIMARY KEY (Sno,Cno) /*只能在表级定义主码*/
);


--参照完整性
定义SC中的参照完整性
CREATE TABLE SC
( 
	Sno CHAR(9) NOT NULL,
	Cno CHAR(4) NOT NULL,
	Grade SMALLINT,
	PRIMARY KEY (Sno,Cno),/*在表级定义实体完整性*/
	FOREIGN KEY (Sno) REFERENCES Student(Sno),
	/*在表级定义参照完整性*/
	FOREIGN KEY (Cno) REFERENCES Course(Cno)
	/*在表级定义参照完整性*/
);


--参照完整性违约处理
1. 拒绝(NO ACTION)执行:不允许该操作,一般是默认策略。
2. 级联(CASCADE)操作:
当删除或者修改被参照表(Student)造成与参照表(SC)的
不一致,则删除或者修改参照表中的所有不一致的数据。
3. 设置为空值(SET-NULL):
1)当删除或者修改被参照表(Student)造成与
参照表(专业表)的不一致,则将参照表中的所有
不一致的数据设置为空值。
2)对于参照完整性,除了应该定义外码,还应定义
外码列是否允许空值(S表与SC表)



--参照完整性检查与违约处理实例
CREATE TABLE SC
( 
	Sno CHAR(10) NOT NULL,
	Cno CHAR(10) NOT NULL,
	Grade SMALLINT,
	PRIMARY KEY(Sno,Cno),
	FOREIGN KEY (Sno) REFERENCES Student(Sno)
	ON DELETE CASCADE /*级联删除SC表中相应的元组*/
	ON UPDATE CASCADE,/*级联更新SC表中相应的元组*/
	FOREIGN KEY (Cno) REFERENCES Course(Cno)
	ON DELETE NO ACTION
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
ON UPDATE CASCADE
/*当更新course表中的cno时,级联更新SC表中相应的元组*/
);


--自定义完整性
CREATE TABLE Student
( 
	Sno CHAR(9) PRIMARY KEY,
	Sname CHAR(8) NOT NULL,
	/*姓名不能为空值*/
	SIdNo CHAR(18) UNIQUE,
	/*身份证号是唯一的*/
	Ssex CHAR(2)
	CHECK (Ssex IN (‘男’,‘女’)),
	/*性别属性Ssex只允许取'男'或'女' */
	Sage SMALLINT,
	Sdept CHAR(20)
);

--
CREATE TABLE Student
(
	Sno CHAR(9),
	Sname CHAR(8) NOT NULL,
	Ssex CHAR(2),
	Sage SMALLINT,
	Sdept CHAR(20),
	PRIMARY KEY (Sno),
	CHECK (Ssex='女' OR
	Sname NOT LIKE 'Ms.%')
/*定义了元组中Sname和Ssex两个
属性值之间的约束条件*/
);


--完整性约束命名子句   可以灵活地增加,删除一个完整性约束条件
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]



CREATE TABLE Student
(
	Sno NUMERIC(6)
	CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
	Sname CHAR(20)
	CONSTRAINT C2 NOT NULL,
	Sage NUMERIC(3)
	CONSTRAINT C3 CHECK (Sage < 30),
	Ssex CHAR(2)
	CONSTRAINT C4 CHECK (Ssex IN ( '男','女')),
	CONSTRAINT StudentKey PRIMARY KEY(Sno)
);
?在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束。


--约束的添加修改
ALTER TABLE Student
DROP CONSTRAINT C1;
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999),



--主码的两个性质:
①决定性:K → U
②最小性:,使得K’→ U

--外码:关系模式R 中属性或属性组X 并非R 的码,但X 是另一个
关系模式的码,则称X 是R 的外部码(Foreign key),也称外码。



--数据库关系理论
--1NF  关系的每一个分量必须是一个不可分的数据项
消除非主属性对码的部分函数依赖

--2NF 消除非主属性对码的部分函数依赖
若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。

--3NF 消除非主属性对码的传递函数依赖

--BCNF 消除主属性对码的部分和传递依赖
每个函数依赖X→Y(Y?X) ,X必包含码,则R∈BCNF
特性:
●每个非主属性对每个码都是完全函数依赖;
●所有的主属性对每一个不包含它的码,也是完全函数依赖;
●没有任何属性完全函数依赖于非码的任何一组属性

--4NF 消除非平凡且非函数依赖的多值依赖
4NF:关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ?X),X都含有候选码,则R∈4NF。

--5NF 消除不为候选码所隐含的连接依赖

聚簇存取
建立聚簇索引后,基本表中数据也需要按指定的聚簇属性值的升序或降序存放。即聚簇索引的索引项顺序与表中元组的物理顺序一致。

聚簇的优越性
1.大大提高按聚簇属性进行查询的效率
2.节省存储空间
?聚簇的局限性
1. 聚簇只能提高某些特定应用的性能
2. 建立与维护聚簇的开销相当大

HASH存取



--存储过程:
就是一段在服务器上执行的程序。它在服务器端对数据库记录进行处理,再把结果返回给客户端。

创建一个查看某个学号的学生姓名的存储过程
CREATE PROCEDURE up_getsname
@sno int, @sname char(10) OUTPUT
AS
SELECT @sname=sname FROM s
WHERE sno = @sno


执行存储过程:
BEGIN
DECLARE @sname char(10)
EXEC up_getsname 95001, @sname OUTPUT
PRINT @sname
END


--存储过程与函数的区别
存储过程(create proc)可以拥有输入参数、输出参数、返回单个或多个结果集以及返回值。函数只能返回一个变量或者表,没有输出参数。
函数(create function)是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行,需要单独执行。


--触发器
一种特殊的存储过程,它在满足某个特定条件时
自动触发执行。它是依附于表的数据库对象。

用户希望的自定义操作
级联修改相关表
参照完整性的修改 禁止或撤消违反
比CHECK约束 更加复杂的限制

ON table|view [ WITH ENCRYPTION ]
{FOR|AFTER|INSTEAD OF} { INSERT | UPDATE | DELETE }
AS
[IF UPDATE(column) [{AND | OR} UPDATE(column)…]]
sql_statement


创建一个触发器,当插入一条记录时给出提示信息
CREATE TRIGGERs_i_trigger
ONs
FORINSERT
ASPRINT '插入了一个学生元组'
一个简单的触发器
--修改
ALTER TRIGGER s_i_trigger
ON s
FOR INSERT

AS PRINT '新插入了一个学生元组'


--2:创建一个触发器,当删除学生表的一个记录时,从选课
--表中自动删除该学生的选课信息。
CREATE TRIGGERs_d_trigger
ONs
FORDELETE
AS
BEGIN
DELETE FROM sc
WHERE sno in (SELECT sno from deleted)
PRINT ‘删除了一个学生元组以及他的选课记录‘
END


DROP TRIGGERs_i_trigge



--数据库的访问
方法一:嵌入式SQL
方法二:直接利用DBMS提供的API库
方法三:ODBC系列



方法三:ODBC系列
ODBC 比较底层
DAO 针对Access的数据库引擎
RDO 克服DAO的缺点:直接访问ODBC API
OLE DB 组件结构:SQL 数据源和非SQL 数据源
ADO VB程序员
ADO.NET .NET时代


Connection对象:主要用于建立与数据源的活动连接
2.Command对象:主要用来执行SQL语句
3.DataAdaper对象:主要用来通过Dataset处理数据
4.DataReader对象:主要用来读取数据
(快速不缓冲的顺序访问)
5. DataSet: 离线处理的核心,用来存储数据
6. DataTable: DataSet中以表的形式存储数据




你可能感兴趣的:(数据库学习)