数据库-第1-5章-概述SQL-笔记
概述
数据定义语言(DDL)
定义数据库结构和存储结构;
定义数据库中数据之间的联系;
定义数据完整性约束条件和保证完整性的触发机制等。
数据操纵语言(DML)
完成对数据库中数据的操作:插入、删除、修改;
重新组织数据库的存储结构;
完成对数据库的备份/恢复等。
数据模型的三个层次:
- 概念数据模型 也称信息模型,它是按用户的观点来对数据和信息建模。面向用户、面向现实世界的数据模型,反映现实世界的对象及其联系。
- 逻辑数据模型 它是按计算机系统的观点对数据建模。主要包括网状模型、层次模型、关系模型等。
- 物理数据模型(DBMS/OS相关) 反映数据的存储结构。
数据库的三级模式:
一、内模式(Internal Schema)
是数据物理结构和存储方式的描述;
是数据在数据库内部的表示方式,即对数据的物理结构/存储方式的描述,是低级描述,一般由DBMS提供的语言或工具完成
一个数据库只有一个内模式
二、(逻辑)模式(Schema)
模式(也称逻辑模式)
数据库中全体数据的逻辑结构和特征的描述
所有用户的公共数据视图,综合了所有用户的需求
一个数据库只有一个模式
模式的地位:是数据库系统模式结构的中间层
与数据的物理存储细节和硬件环境无关
与具体的应用程序、开发工具及高级程序设计语言无关
模式的定义,DBMS提供数据定义语言DDL来描述逻辑模式,严格定义:
数据的逻辑结构(数据项的名字、类型、取值范围等)
数据之间的联系
数据有关的安全性、完整性要求
三、外模式(External Schema)
外模式(也称子模式或用户模式)
数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
数据库用户的数据视图,是模式的子集或变形,是与某一应用有关的数据的逻辑表示
不同用户需求不同,看待数据的方式也可以不同,对数据保密的要求也可以不同,使用的程序设计语言也可以不同,因此不同用户的外模式的描述可以使不同
在三级模式中提供了两级映象,保证了数据库系统的数据独立性,既物理独立性与逻辑独立性。
保证数据的逻辑独立性
当模式改变时,数据库管理员修改有关的外模式/模式映象,使外模式保持不变
应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
保证数据的物理独立性
当数据库的存储结构改变了(例如选用了另一种存储结构),数据库管理员修改模式/内模式映象,使模式保持不变
应用程序不受影响。保证了数据与程序的物理独立性,简称数据的物理独立性。
关系数据库
D1×D2×…×Dn的子集叫作在域D1, D2, …, Dn上的关系,表示为 R(D1, D2, …, Dn)
码(键)
若关系中的某一组属性的值能唯一地标识该关系中的一个元组,则称该属性组为候选码。
候选码之一可被选作主码(Primary Key, PK),或称为主键、关键字。
主码是关系模型中的一个重要概念。每个关系必需选择一个主码,选定以后,不能随意改变。关系的元组不能重复,因此,每个关系必须有且仅有一个主码。至少关系的所有属性的组合可作为主码。
极端情况下,关系的所有属性组是这个关系的候选码,称为全码(All-key)。
外部键:设X是关系模式R(U)的一个属性集合。如果X是另一个关系模式R’(U’)的主键,则称X是R(U)关于R’(U’)的外部键,或简称外键。
关联完整性约束说明,任何关系的一个元组只能通过外部键与另一个关系中存在的元组相关联。
关系运算
基于代数的定义:关系代数
基本操作(5个):并、差、笛卡尔积、投影、选择
附加操作:交、连接、商、……
附加操作可由基本操作的组合表示
条件连接:从R×S的结果集中,选取在指定的属性集上满足θ条件的元组,组成新的关系
自然连接:从R×S的结果集中,选取在某些公共属性上具有相同值的元组,组成新的关系
除运算:设两个关系R和S的属性分别为r和s(设r>s>0),那么R除S是一个(r-s)元的元组的集合。它是满足下列条件的最大关系:其中每个元组t与S中的每个元组u组成的新元组
除运算是笛卡尔积的逆运算。
SQL
SQL语言 (Structured Query Language)
由SEQUEL发展而来
介于关系代数与元组演算
关系数据库设计
目标
满足用户的完整性和安全性要求。
动态关系至少具有第三规范形式,静态关系至少具有第一规范形式。
能够在逻辑级上高效率地支持各种数据库事务的运行。
存储空间利用率高。
关系模式的规范形式
满足这些范式条件的关系模式可以在不同程度上避免本节开始提到的冗余问题、插入问题、更新问题和删除问题。
第一范式(1NF)
设R是一个关系模式。如果R的每个属性的值域都是不可分的简单数据项的集合,则称这个关系模式为第一范式关系模式,记作1NF。第二范式(2NF)
若关系模式R是1NF,而且每一个非主属性都完全函数依赖于R的键,则R称为第二范式关系模式,记作2NF。第三范式(3NF)
如果关系模式R是2NF, 而且它的任何一个非键属性都不传递地依赖于任何候选键,则R称为第三范式关系模式,记作3NF。
传递地函数依赖定义:
设R是一个具有属性集合U的关系模式,X属于U,Y属于U,Z属于U,Y→X不成立,Z-X、Z-Y和Y-X不空。如果X→Y,Y→Z,则称Z传递地函数依赖于X。
- BCNF范式(Boyce Codd Normal Form)
设关系模式R是1NF。如果对于R的每个函数依赖X→Y,则X必为候选键,则R是BCNF范式。
每个BCNF关系模式都具有如下三个性质:
所有非键属性都完全函数依赖于每个候选键。
所有键属性都完全函数依赖于每个不包含它的候选键。
没有任何属性完全函数依赖于非键的任何一组属性。
- 第四范式关系模式
设R是一个关系模式,D是R上的多值依赖集。如果对于R的每个多值依赖X→→Y(Y-X=非空集, XY未包含R的全部属性),X都含有R的候选键,则R是第四范式关系模式,简记4NF。
(多值依赖):
设R是一个具有属性集合U的关系模式,X、Y和Z是U的子集,并且Z = U – X - Y,多值依赖X→→Y成立当且仅当对R的任一关系r,r在(X, Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。
SQL语言
SQL是结构化查询语言(Structured Query Language)的缩写,其功能包括数据查询、数据操纵、数据定义和数据控制四个部分。
数据定义
Create
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ] …
[,<表级完整性约束条件> ]);
常用完整性约束
- 主码约束: primary key (A1, …, An )
- 唯一性约束:UNIQUE
- 非空值约束:NOT NULL
- 参照完整性约束:FOREIGN KEY
|
|
Alter
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ MODIFY <列名> <数据类型> ];
<表名>:要修改的基本表
ADD子句:增加新列和新的完整性约束条件
DROP子句:删除指定的完整性约束条件
MODIFY子句:用于修改列名和数据类型
例;
alter table r drop A
ALTER TABLE Student DROP UNIQUE(Sname);
ALTER TABLE Student MODIFY Sage SMALLINT;
Drop
DROP TABLE <表名>;
基本表删除:数据、表上的索引都删除,表上的视图往往仍然保留,但无法引用
删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述
索引
建立索引
DBA或表的属主(即建立表的人)根据需要建立;
有些DBMS自动建立以下列上的索引: PRIMARY KEY;UNIQUE
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
<表名>指定要建索引的基本表名字
索引可以建立在该表的一列或多列上,各列名之间用逗号分隔
用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
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);
聚簇索引(CLUSTER子句)
- 建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致。
- 在一个基本表上最多只能建立一个聚簇索引。
- 在创建任何非聚簇索引之前创建聚簇索引。
- 聚簇索引的用途:对于某些类型的查询,可以提高查询效率。
- 聚簇索引的适用范围:经常更新的列不易建聚簇索引
删除索引
DROP INDEX <索引名>
数据查询
Select
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名>] …
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
SELECT子句:指定结果中需要显示的属性列
FROM子句:指定涉及的查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。
HAVING短语:筛选出只有满足指定条件的组。
ORDER BY子句:对查询结果表按指定列值的升序或降序排序。
DISTINCT短语的作用范围是所有目标列
SELECT子句的<目标列表达式>为表达式
- 算术表达式
- 字符串常量
- 函数
- 列别名
select的查询结果是一个关系
SELECT Sname, ‘Year of Birth: ‘, 2012-Sage, ISLOWER(Sdept)
FROM Student;
WHERE子句常用的查询条件:
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
<匹配串>:指定匹配模板。
匹配模板:固定字符串或含通配符的字符串
当匹配模板为固定字符串时
可以用 = 运算符取代 LIKE 谓词
用 != 或 < >运算符取代 NOT LIKE 谓词
ESCAPE换码符
\被指定为换码符;% (百分号) 代表任意长度(长度可以为0)的字符串;_ (下横线) 代表任意单个字符
集函数
5类主要集函数
- 计数
- COUNT([DISTINCT|ALL] *)
- COUNT([DISTINCT|ALL] <列名>)
- 计算总和
- SUM([DISTINCT|ALL] <列名>)
- 计算平均值
- AVG([DISTINCT|ALL] <列名>)
- 求最大值
- MAX([DISTINCT|ALL] <列名>)
- 求最小值
- MIN([DISTINCT|ALL] <列名>)
- DISTINCT短语:在计算时要取消指定列中的重复值
- ALL短语:不取消重复值
- 缺省值:ALL
使用GROUP BY子句分组 (细化集函数的作用对象)
未对查询结果分组,集函数将作用于整个查询结果
对查询结果分组后,集函数将分别作用于每个组
[例] 求各个课程号及相应的选课人数。
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno;
GROUP BY子句的作用对象是查询的中间结果表
分组方法:按指定的一列或多列值分组,值相等的为一组
使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数
只有满足HAVING短语指定条件的组才输出
HAVING短语与WHERE子句的区别:作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组。
HAVING短语作用于组(Group),从中选择满足条件的组。
[例] 查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数。
SELECT Sno, COUNT()
FROM SC
WHERE Grade>=90
GROUP BY Sno
HAVING COUNT()>=3;
嵌套查询
一个SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。
|
|
子查询的限制:不能使用ORDER BY子句
层层嵌套方式反映了SQL语言的结构化。
有些嵌套查询可以用连接运算替代。
嵌套查询分类:
- 不相关子查询
子查询的查询条件不依赖于父查询;
由里向外逐层处理。
每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。 - 相关子查询
子查询的查询条件依赖于父查询。
首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;
然后再取外层表的下一个元组;
重复这一过程,直至外层表全部检查完为止。
引出子查询的谓词:
带有IN谓词的子查询
带有比较运算符的子查询
带有ANY或ALL谓词的子查询
带有EXISTS谓词的子查询
EXISTS谓词
存在量词
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值”true”或逻辑假值”false”。
- 若内层查询结果非空,则返回真值;
- 若内层查询结果为空,则返回假值。
带EXISTS的子查询只返回真值或假值,给出列名无实际意义,其目标列表达式通常都用’*’。
集合查询
标准SQL直接支持的集合操作种类
- 并操作(UNION)
一般商用数据库支持的集合操作种类
- 并操作(UNION)
- 交操作(INTERSECT)
- 差操作(MINUS)
数据更新
插入数据
两种插入数据方式
插入单个元组
插入子查询结果
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … )
VALUES子句提供的值必须与INTO子句匹配
修改数据
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
删除数据
DELETE
FROM <表名>
[WHERE <条件>];
功能:删除指定表中满足WHERE子句条件的元组
WHERE子句:指定要删除的元组;缺省表示要修改表中的所有元组
数据控制(DCL)
授权:GRANT
收回权限:REVOKE
数据控制亦称为数据保护,包括数据的:
- 安全性控制
- 完整性控制
- 并发控制
- 恢复
SQL语言提供了数据控制功能,能够在一定程度上保证数据库中数据的完全性、完整性,并提供了一定的并发控制及恢复能力。
完整性
数据库的完整性是指数据库中数据的正确性与相容性。
SQL语言定义完整性约束条件
- CREATE TABLE语句
- ALTER TABLE语句
①码;
②取值唯一的列;
③参照完整性(外码);
④其他约束条件。
并发控制
并发控制: 当多个用户并发地对数据库进行操作时,对他们加以控制、协调,以保证并发操作正确执行,保持数据库的一致性。
SQL语言并发控制能力:提供事务、事务开始、事务结束、提交等概念。
恢复
恢复:当发生各种类型的故障导致数据库处于不一致状态时,将数据库恢复到一致状态的功能。
SQL语言恢复功能:提供事务回滚、重做等概念;UNDO、REDO等。
安全性
安全性:保护数据库,防止不合法的使用所造成的数据泄露和破坏。
保证数据安全性的主要措施:
- 存取控制:控制用户只能存取他有权存取的数据。
- 规定不同用户对于不同数据对象所允许执行的操作。