数据库期末复习
2. 关系模式介绍
2.1 关系数据库的结构
- 关系数据库由表的集合构成,每个表有唯一的名字。
- 在关系模型的术语中,关系用来指代表, 而元组用来指代行。属性指代的是表的列。
- 关系实例(relation instance)指代的是一个关系的特定实例,也就是所包含的一组特定的行。
- 对于表中的每个属性,都有一个允许取值的集合,称为该属性的域(domain)。
- 表中所有属性的值都必须的原子的(即不可再分的)。
- 每个域中都包含null(表示空的、不存在的)。
- 关系:两个集合的笛卡尔积的任意子集叫做关系。
2.2 数据库模式
- 数据库模式:数据库的逻辑设计
- 数据库实例:给定时刻数据库中数据的一个快照
- 关系的概念对应编程语言中变量的概念,而关系模式对应编程语言中类型定义的概念。
- R = ( A 1 , A 2 , … , A n ) R = (A1, A2, …, An ) R=(A1,A2,…,An)`就是一个关系模式,我们使用大写字母开头 的名字来代表关系模式如,Instructor_schema = (ID, name, dept_name, salary),用小写字母开头的名字来代表关系,如 instructor (Instructor _schema)
2.3 码(key)
- 一个元组的属性值必须是能够唯一区分元组的。即一个关系中没有两个元组在所有属性的取值上相同。
- 超码(superkey)是一个或多个属性的集合,这些属性的集合可以使我们在一个关系中唯一的标识一个元组。
- 如果K是一个超码,那么K的任意超集也都是超码。
- 如果K是一个超码,且它的任意真子集都不能称为超码,那么称K是候选码(candidate key)
- 候选码可能有多个。
- 主码(primary key)代表被数据库设计者选中的,主要用来在一个关系中区分不同元组的候选码。
- 一个关系模式(如r1)可能在它的属性中包含另一个关系模式(r2)的主码。这个属性在r1上被称为参照r2的外码。
- 参照完整性约束:要求在参照关系中任意元组在特定属性上的取值必然等于被参照关系中某个元组在特定属性上的取值。
2.4 模式图
- 一个含有主码和外码依赖的数据库模式可以用模式图(schema diagram)表示。
2.6 关系运算
- 最常用的关系运算是从单个关系(如instructor)中选出一些满足特定谓语(如salary>85000)的特殊元组,其结果是一个新关系,它是原始关系的一个子集。
- 另一个常用的运算是从一个关系中选出特定的属性(列)。其结果是一个只包含那些被选择属性的新关系。
- 连接运算可以通过一些方式把分别来自两个关系的元组对合并成单个元组。
- 关系代数提供了一组运算,他们以一个或多个关系作为输入,返回一个关系作为输出。
3.SQL
1. 数据类型:
- char(n):固定长度的字符串,用户指定长度。
- varchar(n):可变长度的字符串,用户指定最大长度n。等价于全称character varying。
- Int:整数类型。
- smallInt:小整数类型。
- numeric(p, d):定点数,精度由用户指定。这个数有p位数字(加上一个符号位)。其中d位数字在小数点右边。
- real, double precision:浮点数与双精度浮点数。
- float(n):精度至少为n位的浮点数。
2. 建表结构:
create table instructor(
ID char(5),
name varchar(20),
dept_name varchar(20),
salary numeric(8,2)
primaey key (ID)
);
3. 指定主键
create table instructor(
ID char(5) primary key,
name varchar(20),
dept_name varchar(20),
salary numeric(8,2)
);
或
create table instructor(
ID char(5) constraint PK_1 primary key,
name varchar(20),
dept_name varchar(20),
salary numeric(8,2)
primaey key (ID)
);
主键如有多个属性值则
create table instructor(
ID char(5),
name varchar(20),
dept_name varchar(20),
salary numeric(8,2)
primaey key (ID, name, salary)
);
4. 指定外码
create table instructor(
ID char(5),
name varchar(20),
dept_name varchar(20) references department,
salary numeric(8,2)
);
或
create table instructor(
ID char(5),
name varchar(20),
dept_name varchar(20),
salary numeric(8,2),
foreign key(dept_name) references department
);
5. 删除表
//从数据库中删除一个关系,连数据库模式一并删除
drop table instructor
6. 删除表中内容
//仅删除表中内容
delete from instructor
7. 为现有关系添加属性
alter table instructor add varchar(20) address
关系中所有元组的新增属性的值都为null。
8. 从现有关系中删去属性
alter instructor drop address
9. 单关系查询
select name
from instructor
上面的代码即为从instructor中查询所有的name,有时候我们想要删掉重复,可加入关键词distinct,例如
select distinct name
from instructor
select子句还可带有算术表达式,例如
select ID, name, dept_name, salary*1.1
from instructor
上面这段代码会返回一个与insructor一样的关系,只是salary属性是原来的1.1倍,注意原关系并不发生改变。
where子句允许我们只需选出那些在from子句的结果关系中满足特定谓词的元组。例如
select name
from instructor
where dept_name = 'Comp.Sci' and salary > 70000;
**上面这段代码意为找出所有在Computer Science系并且工资超过70000的教师的名字。**
10. 多关系查询
select name, instructor. dept_name, building
from instructor, department
where instructor.dept_name = department.dept_name;
上述代码的意图是“找出所有教师的姓名,以及他们所在系的名称和系所在建筑的名称。”
注:1、dept_name属性既出现在instructor关系中,也出现在department中,关系名被用作前缀来说明我们是用的是哪个属性。2、尽管子句是以select,from,where的次序写出,但是实际运算的顺序是from,where,select。即先求出from选中的关系的笛卡尔积,这个笛卡尔积有大量无效的元组,然后where子句中的位于可用来限制笛卡尔积所建立的组合,最后输出select子句中指定的属性。
11. 自然连接(natural join)
自然连接运算作用于两个关系,并产生一个关系作为结果。自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对。所以对于查询“大学中所有讲授课程的教师,找出他们的姓名以及所讲述的所有课程标识”,我们可以这么写
select name, course_id
from instructor natural join teaches
为了避免不必要的相等属性带来的危险,我们还可以使用自然连接的另一种构造形式
select name, title
from (instructor natural join teaches) join course using(course_id);
注:join…using…运算中需要给定一个属性名列表,其两个输入都必须具有指定名称的属性。(using用来指定需要相同的是哪个属性)
12. 更名运算
我们并不总能直接使用属性名。原因在于首先,from子句中的两个关系可能存在同名的属性。其次,如果在select子句中使用了算术表达式,那么属性就没有名字。因此,我们可以使用old-name as new-name的语法来改变结果中属性的名字
select name as instructor_name, course_id
from instructor, teaches
where instructor.ID = teaches.ID;
重命名还可以把一个长的关系名替换成短的,这样在查询的其他地方使用时就会方便。例如
select T.name , S.course_id
from instructor as T, teaches as S
where T.ID = S.ID;
重命名的另一个重要原因是为了适用于需要比较同一个关系中元组的情况。为此我们需要把一个关系与他自身进行笛卡尔积运算,如果不重命名就不可能把一个元组与另一个区分开来。例如我们要查询“满足条件的所有教师的名字,他们的工资至少比Biology系的某一个教师的工资要高”
select distinct T.name
from instructor as T, instructor as S
where T.ID = S.ID;
T、S准确的说是被声明为instructor的别名。在SQL标准中被称作相关名称(correlation name),但也经常被称为表别名(table alias),或相关变量(correlation variable),或者 元组变量(tuple variable)
13. 排列元组的显示次序
order by子句可以让查询结果按排列顺序显示,例如
select name
from instructor
where dept_name = 'Physics'
order by name;
该段代码可以按字母序列出Physics系的所有教师名字。
order by语句默认使用升序,要使用降序可以用desc来表示,或者使用asc来明确是升序。假设我们想按salary的降序列出整个instructor关系,如果有工资相同的,则按姓名升序排列,则表示如下:
select *
from instructor
order by salary desc, name asc;
14. where子句谓语
SQL提供betwenn比较运算符来说明一个值是小于或等于某个值,同时大于或等于某个值。如果我们想找出工资在90000美元和100000美元之间的教师的名字,可以这样写: