← 前一天目录后一天 →

每日科普 · 2026-11-03 周二

考研 408 × 求职面试

知识点 · 数据库系统 · 进阶

关系演算:元组关系演算与域关系演算

关系代数偏过程式,告诉系统先选择、再投影或连接;关系演算偏声明式,只描述结果应满足什么条件。 1. 元组关系演算:以元组变量为基本单位,表达式形如 {t | P(t)}。t 代表整行元组,可用 t[A] 或 t.A 取属性值,谓词中可出现 ∃、∀、∧、∨、¬。 2. 域关系演算:以域变量为基本单位,表达式形如 {<x1,...,xn> | P(x1,...,xn)}。变量取某属性域中的值,用 R(x,y) 表示由这些域值构成的元组属于 R。 3. 区别与联系:元组变量粒度是整行,域变量粒度是列值;两者在安全条件下均与关系代数等价。安全表达式用于避免产生无限结果。

每日一题 · 数据库系统

关系演算:元组关系演算与域关系演算

关于元组关系演算与域关系演算,下列说法错误的是( ) A. 元组关系演算以元组变量为基本单位 B. 域关系演算以属性域中的值为变量 C. 安全条件下,两者均可与关系代数等价 D. 元组演算表达式 {t | P(t)} 中的 t 只能表示一个属性值

解析

答案:D。解析:元组变量 t 代表整个元组(行),t.A 才取某个属性值;域变量才表示属性域中的单个值。A、B、C 均正确。容易混淆整行与列值的变量粒度,以及忽略安全条件导致无限关系。本题核心是区分元组演算与域演算的变量单位及等价性。

面试小贴士 · 数据库系统

关系演算:元组关系演算与域关系演算

面试常问两者与关系代数区别、变量粒度、安全表达式和等价性。答:关系演算声明式,元组变量代表整行,域变量代表列值;在安全条件下与关系代数等价。易错:混淆 t.A 与域变量、忽略安全约束、投影顺序写错。

代码实现 · C++

代码示例

#include <iostream>
#include <vector>
using namespace std;
struct Emp { int id; int age; int salary; };
int main() {
    vector<Emp> R = {{1,25,6000},{2,30,4500},{3,35,8000}};
    // 元组关系演算:筛选工资>5000的整行元组
    vector<Emp> tupleRes;
    for (auto &t : R) if (t.salary > 5000) tupleRes.push_back(t);
    // 域关系演算:存在工资>5000,仅投影出id域
    vector<int> domainRes;
    for (auto &t : R) if (t.salary > 5000) domainRes.push_back(t.id);
    cout << 'T' << ':';
    for (auto &t : tupleRes) cout << ' ' << t.id << ',' << t.age << ',' << t.salary;
    cout << endl << 'D' << ':';
    for (auto &n : domainRes) cout << ' ' << n;
    return 0;
}
← 前一天目录后一天 →