数据库的基本原理回顾
DDL:数据定义
DML:数据操纵
DCL:数据控制语言集成在一起(权限控制,完整性控制)
关系数据库的标准语言--SQL(Structured Query Language),ANSI解释为Standard Query Language。
SQL是一种高度的非过程化语言(仅有What,不问How)。
交互式和嵌入式两种使用方式,统一的语法结构
语言简洁,易学易用
完成核心功能只有9个动词:
数据查询: SELECT
数据定义: CREATE,DROP,ALTER
数据操纵: INSERT,DELETE,UPDATE
数据控制: GRANT,REVOKE
SQL数据定义功能
定义和修改基本表(定义模式):
CREATE TABLE
DROP TABLE
ALTER TABLE
定义视图(定义外模式):
CREATE VIEW
DROP VIEW
定义索引(定义内模式):
CREATE INDEX
DROP INDEX
说明:视图是从基本表导出的虚表,索引依赖于基本表,SQL没有修改视图和索引的操作,可通过先删除,再创建达此目的。
基本表的定义和修改
1,定义:基本格式为
CREATE TABLE 表名(列名1 类型 [列级完整性约束]
[,列名2 类型 [列级完整性约束]…);
CREATE TABLE S( S# CHAR(3) NOT NULL UNIQUE,
SN CHAR(15),
SD CHAR(15),)
其中,NOT NULL---不允许取空值,UNIQUE---取值唯一
SQL支持空值的概念。允许空值的列未输入数据时系统自动置为空值。
SQL支持的数据类型随系统不同而有所差异。
2,修改基本表
增加列:
ALTER TABLE 表名 ADD 列名 类型 [完整性约束]; (不支持NOT NULL选择)
例如:ALTER TABLE S ADD SD INT;
修改列
ALTER TABLE 表名 MODIFY 列名 类型;
例如:ALTER TABLE S MODIFY SD CHAR(20);
删除完整性约束
ALTER TABLE 表名 DROP 完整性约束名;
注意:不能删除列,新增列的值一律为空值,
可增加列宽,但一般不能减小列宽,修改可能会破坏已有数据。
在定义基本表时要考虑充分。
3,删除
DROP TABLE 表名;
注意:删除基本表时,表中的数据、建立在表上的索引和视图将一并被删除,因此应格外小心。
4,索引的建立和删除
由DBA或表的属主进行,存取数据时由系统自动选取合适的索引作为存取路径,用户不必也不能选择索引。
5,创建索引
CREATE [ UNIQUE ] [CLUSTER] INDEX 索引名
ON 表名(列名 ASC/DESC,列名 ASC/DESC)…;
其中ASC为升序,DESC为降序。
如 CREATE UNIQUE INDEX XSNO ON S(S#);
CREATE UNIQUE INDEX SCNO
ON SC(SNO ASC,CNO DESC);
6,删除索引
DROP INDEX 索引名;
SQL数据操纵----查询
查询是数据库的核心操作。SQL仅提供了唯一的语句SELECT,其使用方式灵活,功能非常丰富。
SELECT [ALL | DISTINCT] * | 目标列
FROM 基本表(或视图)
[ WHERE 条件表达式 ]
[ GROUP BY 列名1 [ HAVING 内部函数表达式 ] ]
[ ORDER BY 列名2 ASC/DESC ];
其中,上面的语句中,”*“代表全部字段,“❘”相当于投影
From 后面的语句,表示被查询的表。
Where 表示选择/连接。
Having 表示:满足条件的组才输出。
ASC/DESC:表示对查询结果的排序。
1,简单查询
例如1:求选修了课程的学生学号
SELECT DISTINCT S#
FROM SC;
//从结果中去掉重复的元组
例2:SELECT的后面可以是表达式。
如求计算机系学生的学号和出生年份:
SELECT S#,'Birthday:’,2000-SA
FROM S
WHERE SD='CS’;
例3:连续范围查询,使用BETWEEN (NOT BETWEEN)
SELECT S#,SA
FROM S
WHERE SA BETWEEN 20 AND 22;
//即求20到22岁之间的学生学号和年龄
例4:离散范围查询,使用 IN (NOT IN)
SELECT * //星号表示无投影
FROM S
WHERE SD IN ('MA’,'CS’); //相当于若干'OR’的缩写
// SD='MA’ OR SD='CS’
例5:模糊查询,使用 LIKE (NOT LIKE)
SELECT *
FROM S
WHERE SN LIKE '%清%’; //查姓名中有'清’字的学生
DB2中,下划线 '_’表示匹配任何单个字符
百分号'%’表示匹配任何字符串
其它语言中, 常用 '?’
常用 '*’
例6: 涉及空值的查询 , IS NULL (IS NOT NULL)
SELECT S#, C# FROM SC
WHERE G IS NULL ;
2,连接查询:涉及至少两个表的查询
SQL中没有专门的JOIN命令,而是靠SELECT语句中的
WHERE子句来达到连接运算的目的,因此更加灵活、简便。
用来连接两个表的条件称为连接条件或连接谓词。
注意:在多个表中出现的列名,必须用表名限定,仅在一个表中出现的属性,可省略表名。
SELECT S.S#, SN, G //此处,必须要用表名限定,因为此列名在多个表中出现了。
FROM S, SC
WHERE S.S#=SC.S#
AND SC.C#='C1’;
3,使用外连接查询时
求每个学生选修的课程及成绩。
SELECT S.S#, SN, C#, G
FROM S, SC
WHERE S.S# = SC.S#(*) ; //有些数据库系统用+ , 有些将*放在=前后,*=、=* 。
4,嵌套查询(子查询)--SELECT-FROM-WHERE 查询块嵌入另一个查询块中
(1)嵌套查询由内向外处理
(2)SQL允许多层嵌套
(3)嵌套查询中最常用的
谓词是IN
(4)嵌套查询层次分明、
容易理解
5,UNION查询
(1)用UNION查询时,每个子查询选择的目标列必须相同,
但所基于的表可以不同
(2)UNION查询实际上是将几个子查询的结果合并在一起
(3)UNION查询时自动去掉重复的行
(4)可以通过将各子查询的限制条件合并而将UNION查询
变成一个单一查询
库函数(聚集函数)
COUNT 统计一列中的(NOT NULL)值的个数
COUNT(*) 计算记录个数
SUM 对一列求和
AVG 对一列求平均值
MAX 对一列求最大值
MIN 对一列求最小值
将表按列的值分组,列的值相同的分在一组,产生一个结果行。GROUP BY常
和库函数一起使用,用于分组统计。
WHERE是选择记录的条件;
HAVING是选择分组的条件且必须和GROUP BY一起使用。
库函数只能作用于HAVING和目标列,而不能用于WHERE。
SQL数据操纵----数据更新
1,插入数据
插入单个元组
INSERT
INTO 表名 [(字段名 [,字段名 ] … ]
VALUES (常量 [,常量] … ] ;
例1:插入一条选课记录(S1,C5)。
INSERT
INTO SC(S#,C#)
VALUES('S1’,'C1’);
说明:
★ 当在INTO后面仅指定部分属性列时,插入记录后其它列的值为空值;
★ 如果INTO后面没有指定属性列,则必须按表列的定义次序为每个列指定一个值;
★ 具有NOT NULL属性的列,必须指定值。
2,修改数据
UPDATE 表名
SET 列名 = 表达式[,列名 = 表达式]…
[WHERE 条件];
说明:
★ 当省略WHERE子句时,修改表中所有记录,否则仅修改满足条件的记录;
★ 条件也可以使用子查询。
3,删除数据:
DELETE
FROM 表名
[ WHERE 条件 ];
只能删除表记录,不删除表结构。无条件时,删除全部记录,仅剩一个空表;有条件时删除满足条件的记录。
为物理删除命令。
删除表结构用DROP TABLE。
4,更新操作与数据库的一致性
增、删、改操作只能对一个表操作,可能会造成数据的不一致性。
例如:
删除“物理”课程的全部信息,需使用两个操作实现,删除C表的课程记录和删除SC表的选课记录。若在完成第一个操作后发生意外,致使第二个操作未能实现,则造成数据库的不一致。因为SC中的物理课程号还存在,而被参照的C表中已没有该课程号的课程了。所以应保证这两个操作要么全做,要么全不做,为此,在数据库系统中引入了事物的概念。
为保证数据的一致性,大型数据库系统一般都提供若干策略:
删除主表(被参照表)中的数据时
(1)自动删除参照表中的相应数据;
(2)检查参照表中是否有数据参照,若有则拒绝删除。
向参照表中插入数据时
检查所有被参照表中是否有被参照的信息,若没有则拒绝插入。
修改主表中的被参照字段
检查参照表中是否有数据参照,若有则拒绝修改。
SQL数据控制功能
数据控制功能包括事物管理功能和数据保护功能。即 数据的安全性、完整性、事务控制、并发控制和恢复功能。
一、授权
1、机制:大的DBMS中有一个超级用户DBA,其他用户能否存在、对某类数据具有何种操作权力是由DBA决定的,系统提供授权机制。执行过程为:
(1)用数据控制语言把授权决定告知系统;
(2)系统把授权的结果存入数据字典;
(3)当用户提出 操作请求时,系统根据授权情况进行检查,
以决定是否执行。
2、权力的授予与收回
授予:
GRANT 权力 [,权力 ] … [ ON 对象类型 对象名 ] //若干权力和操作对象
TO 用户名 [,用户名] … //获得权力的对象
[ WITH GRANT OPTION ]; //有此项,被授权用户可再授权给其他用户
收回:
REVOKE 权力 [,权力 ] … [ ON 对象类型 对象名 ]
FROM 用户名 [,用户名] …;
数据库的属主、表的属主、数据库对象的属主在他创建的对象上具有一切可能的权力,其他用户得不到主人的授权就不能在该对象上操作;
· SQL的授权机制十分灵活,各种系统又作了适当的补充,
使用十分方便;
¸ SQL的安全性控制除了上述授权机制外,还可设置口令进一步保密。
嵌入式SQL
一、SQL的使用方式
1、交互式:在终端上每输入一条SQL语句,系统立即执行,然后等待用户输入下一条语句。
2、自编程式:在实际的DMBS中,都对SQL进行了扩充,增加了条件、循环等控制语句,并提供编程机制。如SYBASE中,用户可以编写存储过程并调用它。
3、嵌入式(嵌入到某种主语言中使用):
宿主语言负责:运算、处理、流程控制等
SQL负责:数据库操作
二、嵌入式SQL使用时的问题
必须解决和主语言相互配合、连接等问题
1、标识SQL语句
用前缀,如EXEC SQL或$等,标记SQL语句的开始;
用END-EXEC或分号';’等标记SQL语句的结束。
SQL语句标识是通知主语言的预编译程序将SQL语句转化为等价的主语言语句,然后再由编译程序形成目标代码
2、SQL语句与主语言之间的通信
(1)通过SQL通信区(SQLCA)将SQL语句的执行状态传递给主语言。 SQLCA是一个数据结构,其中有一个重要变量SQLCODE,存放SQL语句是否执行成功的信息,每执行一个SQL语句,主语言都应测试该变量。
(2)SQL语句中可使用主语言的程序变量(叫主变量),但要加前缀标志,一般用冒号':’。
(3)SQL语句和主语言的数据交换一般通过字段变量和主变量进行,但两者数据类型要匹配.
(4)一个SQL语句可以产生一组记录,而主语言一次只能处理一个记录,为此需协调两种方式:
办法:用游标(Cursor),有的叫位置指针
(5)通常用CONNECT语句来连接(申请使用)数据库
关系系统及其查询优化
一、关系系统的定义
1、关系模型:
数据结构: 关系(二维表)
数据操纵: 关系代数(或关系演算)
完整性约束:实体完整性、参照完整性、用户定义的完整性
2、关系系统的定义
* 关系系统是关系数据库系统的简称
* 从概念上讲,支持关系模型的系统称为关系系统。
* 按最小要求定义关系系统:
一个系统称为关系系统,当且仅当
(1)支持关系数据结构;
(2)支持选择、投影和连接运算。 对运算不要求定义任何物理存取路径。
关系上完备的系统:
支持关系结构,
支持所有的关系代数操作
如:SYBASE、ORACLE、DB2
全关系系统:支持关系模型的所有特征
如:SYBASE、ORACLE、DB2等系统已接近这个目标
三、全关系系统的十二条基本准则
基础(准则 0):关系型DBMS必须能完全通过它的关系能力来管理数据库
//在关系一级上支持数据的插入、删除、修改,没有任何操作必须通过非关系的能力才能实现。
准则1:信息准则。逻辑上可用一种方法(表中的值)来表示所有信息。
//用户数据、元数据、索引、应用元数据统一用表格来表示
好处:u 提高用户生产率
u 便于DBA维护数据库
u 便于与其它软件接口
关系系统的查询优化
关系数据语言只需用户指出“干什么”,不必指出“怎么干”,为什么能做到这一点?
一个重要原因就是系统能自动进行查询优化。
查询优化的总目标:
选择有效的策略,求得给定的关系表达式的值
事物管理--数据库恢复技术
作为一个完善的DBMS,应该提供统一的数据保护功
能来保证数据的安全可靠和正确有效!
数据保护也叫数据控制,主要包括:
数据库恢复,并发控制,数据的安全性,数据的完整性。
1,事务(transaction)
一个数据库操作序列(主要是更新操作),是数据库应用程序的基本逻辑单元。 这些操作要么都做,要么都不做,是一个不可分割的执行单位。
事务标记:
BEGIN TRANSACTION (事务开始)
COMMIT (事务提交:事务完成了其包含的所有活动,正常结束) 或
ROLLBACK(事务回滚(中止):撤消已做的所有操作,回到事务开始时的状态)
2,事务应具有的性质
1)原子性(Atomicity):事务执行时的不可分割性,即事务所包含的活动要么都做,要么都不做。
若事务因故障而中止,则要设法消除该事务所产生的影响,使数据库恢复到该事务执行前的状态。
(2)一致性(Consistency):事务对数据库的作用应使数据库从一个一致状态到另一个一致状态。
(3)隔离性(Isolation):
多事务并发执行,应向各事务独立执行一样,不能相互干扰。一个正在执行的事务其中间结果不能为其它事务所访问。
4)持久性(Durability): 一旦事务提交,不论执行何种操作或发生何种故障,都不应对该事务的执行结果有任何影响。(能恢复)
(5)可串行性(Serializability):并发控制正确性的标准用户程序在逻辑上是正确的,它在串行执行时没有问题;
当多个事务并发执行时,可以等价于一个串行执行序列。
3、事务管理任务
事务管理的任务就是要保证事务满足上述性质。使事务不具有上述性质的因素可能是:
(1)事务在运行过程中被强行终止;
(2)多个事务并行运行时,不同事务的操作交叉执行
因此事物管理又分为两个方面:
恢复:保证事务在故障时满足上述性质的技术。
并发控制:保证事务在并发执行时满足上述性质的技术。
