聚 集 运 算 ( a g g r e g a t i o n    o p e r a t i o n ) G 通 常 的 形 式 如 下 : 聚集运算(aggregation\;operation)\mathcal{G}通常的形式如下: 聚集运算(aggregationoperation)G通常的形式如下:
G 1 , G 2 , . . . , G n G F 1 ( A 1 ) , F 2 ( A 2 ) , . . . , F m ( A m ) ( E ) _{G_1, G_2, ..., G_n}\mathcal{G}_{F_1(A_1), F_2(A_2), ..., F_m(A_m)}(E) G1,G2,...,GnGF1(A1),F2(A2),...,Fm(Am)(E)
其 中 E 是 任 意 关 系 代 数 表 达 式 ( 或 者 说 是 一 个 关 系 ) , G 1 , G 2 , . . . , G n 是 用 于 分 组 的 一 系 列 属 性 ; 每 个 F i 是 一 个 聚 集 函 数 , 每 个 A i 是 一 个 属 性 名 。 运 算 含 义 如 下 , 表 达 式 E 的 结 果 中 元 组 以 如 下 方 式 被 分 成 若 干 组 其中E是任意关系代数表达式(或者说是一个关系),G_1, G_2, ..., G_n是用于分组的一系列属性;\\每个F_i是一个聚集函数,每个A_i是一个属性名。运算含义如下,表达式E的结果中元组以如下\\方式被分成若干组 其中E是任意关系代数表达式(或者说是一个关系),G1,G2,...,Gn是用于分组的一系列属性;每个Fi是一个聚集函数,每个Ai是一个属性名。运算含义如下,表达式E的结果中元组以如下方式被分成若干组
(1)同一组中所有元组在 G 1 , G 2 , . . . , G n G_1, G_2, ..., G_n G1,G2,...,Gn上的值相同;
(2)不同组中元组在 G 1 , G 2 , . . . , G n G_1, G_2, ..., G_n G1,G2,...,Gn上的值不同。
写 成 S Q L 查 询 语 句 的 形 式 : 写成SQL查询语句的形式: 写成SQL查询语句的形式:
select G 1 , G 2 , . . . , G n , F 1 ( A 1 ) , F 2 ( A 2 ) , . . . , F m ( A m ) G_1, G_2, ..., G_n, F_1(A_1), F_2(A_2), ..., F_m(A_m) G1,G2,...,Gn,F1(A1),F2(A2),...,Fm(Am)
from E E E
group by G 1 , G 2 , . . . , G n G_1, G_2, ..., G_n G1,G2,...,Gn
所
以
最
后
得
到
的
关
系
模
式
为
(
G
1
,
G
2
,
.
.
.
,
G
n
,
F
1
(
A
1
)
,
F
2
(
A
2
)
,
.
.
.
,
F
m
(
A
m
)
)
。
通
常
采
用
更
名
运
算
为
这
个
模
式
更
改
新
的
关
系
名
以
及
属
性
名
,
然
后
再
使
用
自
然
连
接
或
θ
连
接
进
行
筛
选
得
到
目
标
元
组
。
考
虑
以
下
关
系
数
据
库
,
分
别
给
出
下
列
查
询
的
关
系
代
数
表
达
式
:
所以最后得到的关系模式为(G_1, G_2, ..., G_n, F_1(A_1), F_2(A_2), ..., F_m(A_m))。\\ 通常采用更名运算为这个模式更改新的关系名以及属性名,然后再使用自然连接或\theta连接\\进行筛选得到目标元组。\\ 考虑以下关系数据库,分别给出下列查询的关系代数表达式:
所以最后得到的关系模式为(G1,G2,...,Gn,F1(A1),F2(A2),...,Fm(Am))。通常采用更名运算为这个模式更改新的关系名以及属性名,然后再使用自然连接或θ连接进行筛选得到目标元组。考虑以下关系数据库,分别给出下列查询的关系代数表达式:
(
1
)
找
出
员
工
最
多
的
公
司
。
先
分
组
聚
集
得
到
每
个
公
司
的
员
工
数
目
(
模
式
:
公
司
名
称
,
员
工
数
目
)
:
t
1
←
ρ
r
1
(
c
o
m
p
a
n
y
_
n
a
m
e
,
e
m
p
l
o
y
e
e
_
c
o
u
n
t
)
(
c
o
m
p
n
a
y
_
n
a
m
e
G
c
o
u
n
t
(
p
e
r
s
o
n
a
l
_
n
a
m
e
)
(
w
o
r
k
s
)
)
再
聚
集
得
到
员
工
数
目
最
多
的
公
司
(
模
式
:
员
工
数
目
,
而
且
该
模
式
只
有
一
个
元
组
)
:
t
2
←
ρ
r
2
(
e
m
p
l
o
y
e
e
_
c
o
u
n
t
)
(
G
m
a
x
(
e
m
p
l
o
y
e
e
l
_
c
o
u
n
t
)
(
t
2
)
)
最
后
做
自
然
连
接
过
滤
筛
选
出
员
工
最
多
的
公
司
名
称
:
Π
c
o
m
p
a
y
_
n
a
m
e
(
t
1
⋈
t
2
)
(1)找出员工最多的公司。\\ 先分组聚集得到每个公司的员工数目(模式:公司名称,员工数目):\\ t_1\leftarrow \rho_{r_1(company\_name, employee\_count)}(_{compnay\_name}\mathcal{G}_{count(personal\_name)}(works))\\ 再聚集得到员工数目最多的公司(模式:员工数目,而且该模式只有一个元组):\\ t_2\leftarrow \rho_{r_2(employee\_count)}(\mathcal{G}_{max(employeel\_count)}(t_2))\\ 最后做自然连接过滤筛选出员工最多的公司名称:\\ \Pi_{compay\_name}(t_1\bowtie t_2)
(1)找出员工最多的公司。先分组聚集得到每个公司的员工数目(模式:公司名称,员工数目):t1←ρr1(company_name,employee_count)(compnay_nameGcount(personal_name)(works))再聚集得到员工数目最多的公司(模式:员工数目,而且该模式只有一个元组):t2←ρr2(employee_count)(Gmax(employeel_count)(t2))最后做自然连接过滤筛选出员工最多的公司名称:Πcompay_name(t1⋈t2)
( 2 ) 找 出 工 资 最 少 的 员 工 所 在 公 司 。 先 聚 集 得 到 工 资 最 少 的 员 工 ( 模 式 : 工 资 , 而 且 该 模 式 只 有 一 个 元 组 ) : t 1 ← ρ r 1 ( s a l a r y ) ( G m i n ( s a l a r y ) ( w o r k s ) ) 再 做 自 然 连 接 过 滤 筛 选 得 到 工 资 最 少 的 员 工 所 在 的 公 司 名 称 : Π c o m p a n y _ n a m e ( t 1 ⋈ w o r k s ) (2)找出工资最少的员工所在公司。\\ 先聚集得到工资最少的员工(模式:工资,而且该模式只有一个元组):\\ t_1\leftarrow \rho_{r_1(salary)}(\mathcal{G}_{min(salary)}(works))\\ 再做自然连接过滤筛选得到工资最少的员工所在的公司名称:\\ \Pi_{company\_name}(t_1\bowtie works) (2)找出工资最少的员工所在公司。先聚集得到工资最少的员工(模式:工资,而且该模式只有一个元组):t1←ρr1(salary)(Gmin(salary)(works))再做自然连接过滤筛选得到工资最少的员工所在的公司名称:Πcompany_name(t1⋈works)
( 3 ) 找 出 人 均 工 资 F i r s t    B a n k    C o r p o r a t i o n 人 均 工 资 高 的 公 司 。 先 聚 集 得 到 F i r s t    B a n k    C o r p o r a t i o n 的 人 均 工 资 ( 模 式 : 工 资 , 而 且 该 模 式 只 有 一 个 元 组 ) t 1 ← ρ r 1 ( s a l a r y ) ( G a v g ( s a l a r y ) ( σ c o m p a n y _ n a m e = " F i r s t    B a n k    C o r p o r a t i o n " ( w o r k s ) ) ) 再 做 θ 连 接 过 滤 筛 选 得 到 工 资 最 少 的 员 工 所 在 的 公 司 名 称 : Π c o m p a n y _ n a m e ( w o r k s ⋈ w o r k s . s a l a r y > t 1 . s a l a r y t 1 ) (3)找出人均工资First\; Bank\; Corporation人均工资高的公司。\\ 先聚集得到First\; Bank\; Corporation的人均工资(模式:工资,而且该模式只有一个元组)\\ t_1\leftarrow \rho_{r_1(salary)}(\mathcal{G}_{avg(salary)}(\sigma_{company\_name="First\; Bank\; Corporation"}(works)))\\ 再做\theta连接过滤筛选得到工资最少的员工所在的公司名称:\\ \Pi_{company\_name}(works\bowtie_{works.salary>t_1.salary}t_1) (3)找出人均工资FirstBankCorporation人均工资高的公司。先聚集得到FirstBankCorporation的人均工资(模式:工资,而且该模式只有一个元组)t1←ρr1(salary)(Gavg(salary)(σcompany_name="FirstBankCorporation"(works)))再做θ连接过滤筛选得到工资最少的员工所在的公司名称:Πcompany_name(works⋈works.salary>t1.salaryt1)