数据库原理及编程

孙建伶,林怀忠 数据库原理与应用 高等教育出版社 2006




★数据库原理
数据库技术具有数据结构化,低冗余,大容量,高共享,可靠,安全和独立性高等特点。
E-R模型主要用于数据库需求分析,关系模型主要用于数据库设计和实现。
E-R图包括实体,属性和联系,分别用矩形,椭圆和菱形表示。


概念模型:ER
               /层次模型    \ 指针,过程性
结构/逻辑模型:|网状模型    / 
               \关系模型      主键、外键,非过程性
DBMS包括两部分:存储管理器和查询处理器。


SQL共3个版本,SQL-86也称为SQL1,SQL-89是其扩展版;SQL-92也称为SQL2,是目前使用最为广泛的标准;最新标准是SQL-99,也称为SQL3。
SQL的特点:陈述式而非过程式;面向集合而非面向记录;数据定义、控制和操纵一体化;支持数据库三级模式结构。
SQL中的视图对应于外模式,基本表对应于模式,索引及其他存储参数则对应于内模式。
DD数据词典是存储三级结构描述(即元数据)的DB。
SQL完整性控制包括:实体完整性(主键)、参照完整性(外键)、用户定义完整性(校验、断言、触发器)。


审计是指用审计踪迹(trail)记录对数据库的重要更新及执行更新的用户与更新发生的时间。即使是管理员也无权将审计记录删除,从而防止了管理员的恶意操作。审计不是SQL2标准的内容。
嵌入式SQL分为静态SQL和动态SQL两种模式。


范式的简要理解:若X上的属性值相等,则Y上的属性值必相等,则称X确定Y,或Y依赖于X。若X确定Y,且没有X的真子集可以确定Y,则称Y对X完全函数依赖,否则称为部分函数依赖。若一个关系完全函数依赖于某个属性或属性组合,则称其为码/候选码/关键字/候选关键字。若候选码多于一个,则选定其中一个作为主码/主关键字。包含在任一个码中的属性都是主属性,反之是非主属性。
1NF--消除非主属性对码的部分函数依赖-->2NF--消除非主属性对码的传递函数依赖-->3NF--消除主属性对码的部分和传递函数依赖-->BCNF--消除非平凡且非函数依赖的多值依赖-->4NF
从模式分解的角度来看,总可以在满足无损连接并保持依赖的前提下得到3NF。规范化理论是数据库设计的理论指南和工具。但是,在实际应用中,并非规范化程度越高,模式就越好。因为降低冗余可能也会降低性能。


面向对象数据库可以支持关系数据库无法构造的一些数据类型。
分布式数据库具有位置,分片和复制的透明性。
数据仓库是一个面向主题的,集成的,时变的,非易失的数据集合,它适合于联机分析处理OLAP,用于数据的分析决策方面。数据挖掘是从大量的,不完全的,有噪声的,模糊的,随机的数据中,提取隐含在其中的,潜在有用的信息和知识的过程。




★数据库控制
1.并发控制
事务特性ACID
原子性:事务的操作序列要么全做要么全不做。
一致性:是数据库从一个一致性状态变到另一个一致性状态。
隔离性:不能被其他事务干扰。
永久性:一旦提交,改变就是永久的。
处理并发控制主要是采用封锁技术。
一级封锁协议:修改数据前加X锁,事务结束才可以释放。防止丢失修改。
二级封锁协议:一级封锁协议加上读数据前加S锁,读完即可释放。防止丢失修改,防止读脏数据。
三级封锁协议:一级封锁协议加上读数据前加S锁,事务结束才可以释放。防止丢失修改,防止读脏数据,保证可重复读。
两段锁协议:所有事务必须分两个阶段对数据项加锁和解锁。保证并发调度是可串行化的,但可能发生死锁。
封锁粒度越小则并发性越高,但开销越大。
死锁的解决办法有预防法和死锁的解除法。前者如顺序申请法,一次申请法等。后者需要有死锁检测程序和解锁程序。
2.数据库恢复
1)事务故障的恢复
是由系统自动完成的,对用户是透明的。主要步骤是从尾至头扫描日志文件并对更新操作执行逆操作。
2)系统故障的恢复
在重新启动时自动完成,不需要用户的干预。主要步骤是扫描日志文件,对故障发生前已经提交的事务按日志中顺序正向进行重做处理(有些更新操作没有写入数据库);对故障发生前尚未完成的事务按日志中顺序逆向进行撤销处理。
3)介质故障与病毒破坏的恢复
恢复步骤为:首先装入最新的数据库后备副本;然后扫描日志文件,对故障发生前已经提交的事务按日志中顺序正向进行重做处理。
4)具有检查点的恢复技术
具体的维护过程是:首先将日志缓冲写回日志文件;在日志文件中写入一个检查点记录,记录此时正在执行的事务;然后将数据缓冲写回数据库;把检查点在日志文件中的地址写入重新开始文件。
由于在检查点之前提交的事务已经把更新被写入数据库,所以就不必再进行重做处理。




★sql语句
1.类型
CHAR 字符
VARCHAR 可变长字符 
BIT 位 
INT/INTEGER 整型 
NUMERIC 数字 
REAL 浮点数 
DOUBLE 浮点数 
DATE 日期 
TIME 时间 
TIMESTAMP 时间戳,日期+时间
INTERVAL 间隔


2.核心动词,集函数和约束关键词
数据查询:SELECT
数据定义:CREATE,DROP,ALTER
数据操作:INSERT,UPDATE,DELETE
数据控制:GRANT,REVOKE


COUNT|SUM|AVG|MAX|MIN([DISTINCT] <列名>)


NOT NULL 非空  
PRIMARY KEY 主键
CHECK 约束条件
UNIQUE 唯一
DEFAULT 默认值
FOREIGN KEY 外键   
REFERENCES 索引  
ON DELETE 删除时动作  
ON UPDATE 更新时动作


3.语句
(1)CREATE TABLE <表名>(<列名> <数据类型> [列级完整性约束条件], 
                       <列名> <数据类型> [列级完整性约束条件],
                        ..., 
                       [表级完整性约束条件]);
(2)ALTER TABLE <表名>
   [ADD <新列名> <数据类型> [完整性约束条件]]
   [DROP <完整性约束名>]
   [MODIFY <列名> <数据类型>];
(3)DROP TABLE <表名>;
(4)CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
   ON <表名> (<列名> [ASC|DESC], <列名> [ASC|DESC], ...);
(5)DROP INDEX <索引名>;
(6)CREATE VIEW <视图名>[(<列名>, <列名>, ...)]
   AS <子查询>
   [WITH CHECK OPTION]
(7)DROP VIEW <视图名>;
(8)INSERT INTO <表名> [(<列名>, <列名>, ...)]
               VALUES (<值>, <值>, ...)|<子查询>;
(9)UPDATE <表名>
   SET <列名>=<值>, <列名>=<值>, ...
   [WHERE <条件>];
(10)DELETE FROM <表名>
    [WHERE <条件>];
(11)SELECT [DISTINCT] <目标列表达式> [别名], <目标列表达式> [别名], ...
    FROM <表名> [别名], <表名> [别名], ...
    [WHERE <条件>]
    [GROUP BY <列名> [HAVING <条件>]]
    [ORDER BY <列名> [ASC|DESC]];
    其中,条件可以是如下表达式:
    <列名> =|<>|<|>|<=|>= ALL|SOME|ANY (<值>, <值>, ...)|(<子查询>)
    <列名> [NOT] BETWEEN <列名>|<值>|<子查询> AND <列名>|<值>|<子查询>
    <列名> [NOT] IN (<值>, <值>, ...)|(<子查询>)
    [NOT] EXISTS <子查询>
(12)GRANT <权限>,<权限>, ...
    [ON <对象类型> <对象名>]
    TO <用户>, <用户>, ...
    [WITH GRANT OPTION];
(13)REVOKE <权限>,<权限>, ...
    [ON <对象类型> <对象名>]
    FROM <用户>, <用户>, ...


4.说明
在HAVING子句中的条件是针对整个组而言,因此通常使用聚集函数。在进行分组之后,在投影列表中只可直接引用那些出现在分组语句中的属性,对于其他属性,只能出现在聚集函数中。同样的规则也适用于HAVING子句。
子查询除不能使用ORDER BY子句外,与普通的查询语句并无不同。子查询中可以引用来自于父查询的属性,但反过来,父查询中不可以引用子查询中的属性。
视图只是存储了一个查询语句,故每次显示时总是重新查询而更新结果。只有行列视图才可以被更新。视图作用:以不同视角看数据;方便逻辑重组;便于机密数据的保护。


5.Transact-SQL简述
Transact-SQL是Microsoft SQL Server中使用的扩展SQL语言。支持程序特性,如变量的声明,if等流程控制语句以及更多的函数,如算术函数和字符串函数等。
SELECT子句支持"TOP n [PERCENT]"关键字,表示指定只从查询结果集中输出前 n 行。n 是介于 0 和 4294967295 之间的整数。如果还指定了 PERCENT,则只从结果集中输出前百分之 n 行。当指定时带 PERCENT 时,n 必须是介于 0 和 100 之间的整数。
细微差别和扩展:使用+作为字符串串联符号。LIKE中匹配字符可以是%,_,[]和[^]。COMPUTE子句可以独立计算一些值,并和查询结果并行显示。#与##均可创建临时表,前者是局部临时表,后者是全局临时表。使用“@变量名”来声明(DECLARE)和使用(SET或=)变量。以GO为结束标识进行批处理。使用BEGIN...END来标识一个整体语句块,通常用于IF...ELSE或WHILE语句中。
创建触发器语法:
CREATE TRIGGER 触发器名
ON {表|视图}
{FOR|AFTER|INSTEAD OF} {INSERT[,][UPDATE][,][DELETE]}
AS
[{IF UPDATE(列名)}[(AND|OR) UPDATE(列名)]]
SQL语句
创建事务语法:
BEGIN TRANSACTION 单元名称
SQL语句
SAVE TRANSACTION 保存点名称
SQL语句
ROLLBACK TRANSACTION 单元名称|保存点名称
SQL语句
COMMIT TRANSACTION 单元名称


6.PL/SQL简述
PL/SQL是Oracle中使用的扩展SQL语言。支持程序特性,如变量的声明,if等流程控制语句以及更多的函数。


7.经典SQL题解析

背景:

S表(学生表):S#(学生学号)
C表(课程表):C#(课程号),TEACHER(老师姓名),CNAME(课程名称)
CS表(选课表):S#(学生学号),C#(课程号)


1)检索至少选修两门课程的学生的学号。

SELECT X.S#
FROM CS AS X, CS AS Y
WHERE X.S#=Y.S# AND X.C#<>Y.C#;


2)检索至少选修了LIU老师所授的一门课程的学生的学号。
分析:原题==“检索这个学生所上课程中,LIU老师所教授的课程”的结果不为空;

 

SELECT S#
FROM S
WHERE EXISTS
(SELECT *
FROM CS,C
WHERE CS.S#=S.S# AND CS.C#=C.C# AND C.TEACHER='LIU');

 

 

select distinct a.S#
from CS as a, C as b
where a.C# = b.C# and b.TEACHER='LIU';

 


3)检索全部学生都选修的课程的课程名。
分析:原题==“检索没有选修这门课程的学生”的结果为空;
      引号命题==“检索CS中这个学生的选修该课程的记录”的结果为空;

SELECT CNAME
FROM C
WHERE NOT EXISTS
(SELECT *
FROM S
WHERE NOT EXISTS
(SELECT *
CS
WHERE CS.S#=S.S# AND CS.C#=C.C#));

 

select c.CNAME
from
(select C# as x, count(distinct S#) as y from CS group by C#) as a, (select count(*) as x from S) as b, C as c
where a.x=c.C# and a.y=b.x;


4)检索选修了LIU老师所授的全部课程的学生的学号
分析:原题==“检索是LIU老师的课程,并且该学生没有选修的课程”的结果为空;
      引号命题==检索是LIU老师的课程,“并且该学生选修了这门课程”的结果为空;

SELECT S#
FROM S
WHERE NOT EXISTS
(SELECT
FROM C
WHERE TEACHER='LIU'
AND NOT EXISTS
(SELECT *
FROM CS
WHERE CS.S#=S.S# AND CS.C#=C.C#));


5)检索选修了学号为S6的学生所选修的所有课程的学生的学号。
分析:原题==“检索是S6所选的课程,并且该学生没有选的课程”的结果为空;
      引号命题==检索是S6所选的课程,“并且该学生选修了这门课程”的结果为空;

SELECT S.S#
FROM S
WHERE NOT EXISTS
(SELECT *
FROM CS AS X
WHERE X.S#='S6'
AND NOT EXISTS
(SELECT *
FROM CS AS Y
WHERE Y.S#=S.S# AND Y.C#=X.C#));



★各种数据库访问技术的联系与区别
一、ODBC 
ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。 
应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。 


二、OLE DB
OLE DB(OLEDB)是微软的战略性的通向不同的数据源的低级应用程序接口。OLE DB不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的结构化问题语言(SQL)能力,还具有面向其他非SQL数据类型的通路。 作为微软的组件对象模型(COM)的一种设计,OLE DB是一组读写数据的方法(在过去可能被称为渠道)。OLE DB中的对象主要包括数据源对象、阶段对象、命令对象和行组对象。使用OLE DB的应用程序会用到如下的请求序列: 初始化OLE 连接到数据源 发出命令 处理结果 释放数据源对象并停止初始化OLE 
OLE DB标准中定义的新概念----OLE DB将传统的数据库系统划分为多个逻辑组件,这些组件之间相对独立又相互通信。这种组件模型中的各个部分被冠以不同的名称:数据提供者(Data Provider)。 提供数据存储的软件组件,小到普通的文本文件、大到主机上的复杂数据库,或者电子邮件存储,都是数据提供者的例子。有的文档把这些软件组件的开发商也称为数据提供者。
我们要开启如Access 数据库中的数据,必须用ADO.NET 透过OLE DB 来开启。ADO.NET 利用OLE DB 来取得数据,这是因为OLE DB 了解如何和许多种数据源作沟通,所以对OLE DB有相当程度的了解是很重要的。 


三、ADO 
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。 
ADO被设计来继承微软早期的数据访问对象层,包括RDO (Remote Data Objects) 和DAO(Data Access Objects)。ADO在1996年冬被发布。


四、DAO
DAO(Database Access Object)使用Microsoft Jet数据库引擎来访问数据库。Microsoft Jet为象Access和Visual Basic这样的产品提供了数据引擎。
一般地讲,DAO类提供了比ODBC类更广泛的支持。一方面,只要有ODBC驱动程序,使用Microsoft Jet的DAO就可以访问ODBC数据源。另一方面,由于DAO是基于Microsoft Jet引擎的,因而在访问Access数据库(即*.MDB文件)时具有很好的性能。 


五、DAO类与ODBC类相似点
二者都支持对各种ODBC数据源的访问。虽然二者使用的数据引擎不同,但都可以满足用户编写独立于DBMS的应用程序的要求。 
DAO提供了与ODBC功能相似的MFC类。例如,DAO的CDaoDatabase类对应ODBC的CDatabase类,CDaoRecordset对应CRecordset,CDaoRecordView对应CRecordView,CDaoException对应CDBException。这些对应的类功能相似,它们的大部分成员函数都是相同的。 
AppWizard和ClassWizard对使用DAO和ODBC对象的应用程序提供了类似的支持。 
由于DAO和ODBC类的许多方面都比较相似,因此只要用户掌握了ODBC,就很容易学会使用DAO。实际上,用户可以很轻松地把数据库应用程序从ODBC移植到DAO。


六、JDBC
JDBC(Java DataBase Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

 

七、MyBatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object)映射成数据库中的记录。

 

★SQL注入和如何避免

一、常见SQL注入的方法

例如,执行以下输入:

'or 1 = 1 --

二、如何防止SQL注入

最优方法:预编译语句(又称为参数化查询)。例如:JDBC中的PreparedStatement,MyBatis的#{}(注:${}仍然会有SQL注入风险)。

存储过程。

过滤或者转义特殊字符。

限定输入的范围或者内容格式。比如,username限定为5-20个字符,只能由大小写字母、数字和下划线组成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小白杂货铺

打赏是一种友谊,让我们更亲密。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值