第六章 形式化关系查询语言
6.1关系代数
基本关系运算:
-
select: σ,选择运算选出满足特定谓词的元组
例如 :
选出物理系的教职人员:
σdept_name=′Physics′(instructor)
选出物理系且工资大于80000的教职人员:
σdept_name=′Physics′∧(salary>80000)(instructor)
-
project: Π, 返回筛选属性后的集合,只显示选择的属性
例如:
选出老师的ID和name
∏id,name(instructor)
选出物理系老师的ID name salary
∏id,name,salary(σdept_name=′Physics′(instructor))
-
union: ∪ 集合的并集运算
例子:
找出开设在2009年秋季或2010年春季或二者都开的课程:
∏course_id(σsemester=′Fall′∧year=2009(section))⋃∏course_id(σsemester=′Spring′∧year=2010(section))
-
set difference: − 集合差运算,r-s 表示在r中但不在s中的元组
例子:
找出开设在2009年秋季但不在2010年春季开设的课程:
∏course_id(σsemester=′Fall′∧year=2009(section))⋃∏course_id(σsemester=′Spring′∧year=2010(section))
-
Cartesian product: x ,笛卡尔积运算
例子:
找出物理系的所有教师以及他们教授的课程
∏name,course_id(σinstructor.id=teaches.id∧deptname=′Physics′(instructor×teaches))
-
rename: ρ ,用于更名
ρx(A1,A2,...An)(E)
返回表达式E的结果并将名称改为x,并将属性名改为A1,A2,…An
附加的关系运算
-
交集运算 ∩
例如:
找出开设在2009年秋季以及2010年春季都开设的课程:
∏course_id(σsemester=′Fall′∧year=2009(section))⋂∏course_id(σsemester=′Spring′∧year=2010(section))
-
自然连接运算 ⋈
例如:
找出所有教师的姓名以及他们教授的课程id
∏name,course_id(instructor⋈teaches)
找出计算机系的老师姓名以及他们的课程名称
∏name,title(σdept_name=′Comp′(instructor⋈teaches⋈course))
一些扩展的运算操作:
可以在属性处进行基本运算:
∏id,name,salary/12(instructor)
可以使用聚类函数:
Gsum(salary)(instructor)
6.2元组关系演算
通用格式:
{t∣P(t)}
表示使所有P为真的t的元组集合
找出工资在80000美元以上的教师的ID、name、dept_name、salary:
{t∣t∈instructor∧t[salary]>80000}
找出工资大于80000美元的教师的ID
{t∣∃s∈instructor(t[ID]=s[ID]∧s[salary]>80000)}
练习题:
考虑下图所示的关系数据库,主码加了下划线。给出关系代数表达式来表达下列的每一个查询:
a.找出First Bank Corporation的所有员工姓名
∏person_name(σcompany_name=“FirstBankCorporation”(works))
b.找出First Bank Corporation所有员工的姓名和居住城市
∏person_name,city(employee⋈(σcompany_name=“FirstBankCorporation”(works)))
c.找出First Bank Corporation所有年收入在10000美元以上的员工姓名和居住的街道、城市。
∏person_name,street,city(σ(company_name=“FirstBankCorporation”∧salary>10000)works⋈employee)
d.找出所有居住地与工作的公司在同一城市的员工姓名
∏person_name(employee⋈works⋈company)
e.假设公司可以位于几个城市中。找出满足下面条件的所有公司,它位于Small Bank Corporation所位于的每一个城市。
∏company_name(company÷(∏city(σcompany_name=“SmallBankCorporation”(company))))