数据库管理技术经历了三个阶段:人工管理、文件系统、数据库系统。
人工管理阶段
数据不保存应用程序管理数据数据不共享数据不具有独立性文件系统阶段
数据可以长期保存由文件系统管理数据数据共享性差,冗余度大数据独立性差数据库系统阶段
数据结构化。数据库系统实现整体数据的结构化,这是数据库的主要特征之一,也是数据库系统与文件系统的本质区别数据的共享性高、冗余度低且抑郁扩充。数据共享可以大大减少数据冗余,节约存储空间,数据共享还能避免数据之间的不相容性与不一致性数据独立性高。数据独立性包括物理独立性、逻辑独立性。物理独立性是指用户的应用程序与数据库中的物理存储是相互独立的。逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的。数据由数据库管理系统统一管理和控制。数据库管理系统还必须提供以下几个方面的数据控制功能: 数据的安全性保护:是指保护数据以防止不合法使用造成的数据泄密和破坏。数据的完整性检查:是指数据的正确性】有效性和相容性。并发控制数据库恢复根据模型应用的不同目的,可以将这些模型分为两大类:第一类是概念模型,第二类是逻辑模型和物理模型。
第一类概念模型,也称信息模型,它是按用户的观点来对数据和信息建模,主要用于数据库设计。第二类的逻辑模型主要包括层次模型、网状模型、关系模型、面向对象数据模型和对象关系数据模型、半结构化数据模型等。它是按计算机系统的观点对数据建模,主要用于数据库管理系统的实现。第二类中的物理模型是对数据最底层的抽象,它描述数据在系统内部的表示方式和存取方法,是面向计算机系统的。实体:客观存在并可相互区别的事物称为实体
属性:实体具有的某一特征称为属性码:唯一标识实体的属性集称为码实体型:具有相同属性的实体必然具有共同的特征和性质,用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。实体集:同一类型实体的集合称为实体集。联系:实体内部以及实体之间是有联系的。实体内部的联系通常是指组成实体的个属性之间的联系,实体之间的联系通常是指不同实体集之间的联系。
实体之间的联系有一对一、一对多和多对多等多种联系。概念模型的一种表示方法:实体-联系方法(Entity-Relationship approach)。该方法用 E - R 图(E - R diagram)来描述现实世界的概念模型,E - R 方法也称为 E - R 模型。
数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成。
数据结构:数据结构描述数据库组成对象以及对象之间的联系。数据操作:数据操作是指数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操作规则。数据库主要有查询和更新(包括插入、删除和修改)两大类操作。数据的完整性约束条件:数据的完整性约束条件是一组完整性规则。完整性规则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确,有效和相容。数据库领域中主要的逻辑数据模型有:
层次模型网状模型关系模型面向对象数据模型对象关系数据模型半结构化数据模型 其中层次模型和网状模型统称为格式化模型层次模型的数据结构:
有且只有一个节点没有双亲结点,这个结点称为根节点根以外的其他结点有且只有一个双亲结点 层次模型像一棵倒立的树,节点的双亲是唯一的网状模型的数据结构:
允许一个以上的结点无双亲一个结点可以有多于一个的双亲关系模型数据结构:
关系(relation):一个关系对应一张表。元组(tuple):表中的一行即为一个元祖。属性(attribute):表中的一列即为一个属性码(key):也称码键。表中的某个属性组,它可以唯一确定一个元祖。域(domain):域是一组具有相同数据类型的值的集合。属性的取值范围来自某个域。分量:元组中的一个属性值。 关系模式一般表示为:关系名(属性1,属性2,…,属性n)关系模型要求关系必须是规范化的,关系的每一个分量必须是一个不可分的数据项。数据库系统的三级模式结构是指数据库系统是由外模式、模式和内模式三机构成。
外模式:外模式也称子模式或用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。外模式通常是模式的子集,一个数据库可以有多个外模式。数据库管理系统提供外模式数据定义语言(外模式DDL)来严格地定义外模式。模式:模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。模式实际上是数据库数据在逻辑级上的视图,一个数据库只有一个模式。数据库管理系统提供模式数据定义语言(模式DDL)来严格定义模式。内模式:内模式也称存储模式,一个数据库只有一个内模式,它是数据物理结构与存储方式的描述,是数据在数据库内部的组织方式。数据库系统的三级模式是数据的三个抽象级别,他把数据的具体组织留给数据库管理系统管理,使用户能逻辑地、抽象地处理数据,而不关心数据在计算机中的具体表现方式与存储方式。为了能够在系统内部实现这三个抽象层次的联系和转换,数据库管理系统在这三级模式之间提供了两层映像:外模式 / 模式映像和模式/内模式映像。
两层映像保证了数据库系统中的数据能够具有较高的逻辑独立性和物理独立性外模式 / 模式映像:当模式改变时,有数据库管理员对各个外模式/模式映像做相应的改变,可以是外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。模式 / 内模式映像:当数据库的存储结构改变时,由数据库管理员对模式/内模式映像作相应改变,可以使模式保持不变,从而应用程序也不比改变。保证了数据与程序的物理独立性,简称数据的物理独立性。参照完整性规则:若属性(或属性组)F 是基本关系 R 的外码,它与基本关系 S 的主码 K 相对应(基本关系 R 和 S 不一定是不同的关系),则对于 R 中每个元组在 F 上的值必须:
或者取空值(F 的每个属性值均为空值)或者等于 S 中某个元组的主码值用户自定义完整性就是针对某一具体关系数据库的约束条件,它反应某一具体应用所涉及的数据必须满足的语义要求。
SQL 集数据查询、数据操纵、数据定义和数据控制功能于一体,其主要特点包括:
综合统一高度非过程化面向集合的操作方式以同一种语法结构提供多种使用方式语言简洁,易学易用支持 SQL 的关系数据库管理系统同样支持关系数据库三级模式结构。其中外模式包括若干视图和部分基本表,数据库模式包括若干基本表,内模式包括若干存储文件。
- 一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。 - 定义模式: CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
删除模式: DROP SCHEMA <模式名><CASCADE | RESTRICT>
定义基本表: CREATE TABLE <表名> (<列名><数据类型> [列级完整性约束条件] ...)
建立一个 “学生” 表 Student
CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) UNIQUE, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );数据类型 数据类型含义CHAR(n),character(n)长度为 n 的定长字符串varchar(n),charactervarying(n)最大长度为 n 的变长字符串CLOB字符串大对象BLOB二进制大对象INT, INTEGER长整数smallint短整数bigint大整数real单精度浮点数double persision双精度浮点数float(n)可选精度的浮点数boolean逻辑布尔量date时间,年月日time时间,时分秒timestamp时间戳类型interval时间间隔类型- 模式与表 CREATE TABLE “S-T”.Student(...) /* Student 所属的模式是 S-T */
修改基本表 ALTER TABLE <表名> [ADD [COLUMN] <新列名><数据结构> [完整性约束]] [DROP [COLUMN] <列名> [CASCADE | RESTRICT]] [ALTER COLUMN <列名><数据结构>];向 Student 表增加“入学时间”列,其数据类型为日期 ALTER TABLE Student ADD S_entrance DATE;
将年龄的数据类型由字符型改为整数 ALTER TABLE Student ALTER COLUMN Sage INT;
增加课程名称必须取唯一值的约束条件 ALTER TABLE Course ADD UNIQUE(Cname);
删除基本表
DROP TABLE <表名> [RESTRICT | CASCADE];删除 Student 表 DROP TABLE Student CASCADE;
建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名> ...);修改索引 ALTER INDEX <旧索引名> RENAME TO <新索引名>;
删除索引 DROP INDEX <索引名>
数据查询
SELECT [ALL | DISTINCT] <目标表达式> [,<目标表达式列表>] ... FROM <表名或视图名> [,<表名或视图名> ...] | (<SELECT 语句>) [AS] <别名> [WHERE <条件表达式>] [GROUP BY <列名 1> [HAVING <条件表达式>]] [ORDER BY <列名 2> [ASC | DESC]];查询全体学生的学号和姓名
SELECT Sno, Sname FROM Student;查询全体学生的姓名、学号、所在系。 SELECT Sname, Sno, Sdept FROM Student; 查询全部列 SELECT * FROM Student; 查询全体学生的姓名及其出生年份 SELECT Sname, 2017-Sage FROM Student; 查询全体学生的姓名、出生年份和所在系,要求用小写字母表示系名 SELECT Sname, 'Year of Brith:', 2017-Sage, LOWER(Sdept) FROM Student; 查询选修了课程的学生学号(去掉重复行) SELECT DISTINCT Sno FROM SC;查询所有年龄在 20 岁以下的学生姓名及其年龄
SELECT Sname,Sage FROM Student WHERE Sage < 20;查询考试成绩不及格的学生的学号
SELECT DISTINCT Sno FROM SC WHERE Grade < 60;查询年龄在 20 ~ 23 岁之间的学生的姓名、系别和年龄 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23; 查询年龄不在 20 ~ 23 之间的学生的姓名、系别和年龄 SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23 ;查询既不是计算机系、数学系、也不是信息系的学生的姓名和性别
SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ('CS', 'MA', 'IS');通配符 % 代表任意长度的字符串
通配符 _ 代表任意单个字符
查询学号为 201215121 的学生的详细情况
SELECT * FROM Student WHERE Sno LIKE '201215121'; 等价于 WHERE Sno = '201215121';查询所有姓刘的学生的姓名、学号和性别
SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE ‘刘%’;查询所有不是姓刘的学生的姓名、学号和性别
SELECT Sname, Sno,Ssex FROM Student WHERE Sname NOT LIKE ‘刘%‘;查询所有有成绩的学生的学号和课程号 SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL; 查询选修了3号课程的学生的学号和成绩,查询结果按分数的降序排列 SELECT Sno,Grade FROM SC WHERE Cno = ’3‘ ORDER BY Grade DESC(default ASC); 查询全体学生情况,查询结果按所在系的系号升序排序,同一系中的学生按年龄降序排序。 SELECT * FROM Student ORDER BY Sdept, Sage, DESC; 聚集函数 函数名功能COUNT([DISTINCTALL] <列名>)COUNT(*)统计元祖个数SUM([DISTINCTALL]] <列名>)AVG([DISTINCTALL]] <列名>)MAX([DISTINCTALL]] <列名>)MIN([DISTINCTALL]] <列名>)- 查询学生总数
SELECT COUNT(*) FROM Student; 查询选修了课程的学生人数 SELECT COUNT(DISTINCT Sno) FROM SC; 计算选修了一号课程的学生平均成绩 SELECT AVG(Grade) From SC WHERE Cno='1'; 查询选修1号课程的学生最高分数 SELECT MAX(Grade) FROM SC WHERE Cno='1'; 查询学生201215012选修课程的总学分数。 SELECT SUM(Ccredit) FROM SC,Course WHERE Sno='201215012' AND SC.Cno = Course.Cno; 求各个课程号及相应的选课人数 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; 查询选修了三门以上课程的学生学号 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) > 3; 查询平均成绩大于等于 90 分的学生学号和平均成绩 SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade) >= 90; 查询每个学生及其选修课的情况 SELECT Student.*, SC.* FROM Student, SC WHERE Student.Sno = SC.Sno; 查询选修 2 号课程且成绩在 90 分以上的所有学生的学号和姓名 SELECT Student.Sno, Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno = '2' AND SC.Grade > 90; 查询每个学生的学号、姓名、选修的课程名及成绩 SELECT Student.Sno, Sname, Cname, Grade FROM Student, SC, Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;