← 前一天目录后一天 →

每日科普 · 2026-10-10 周六

考研 408 × 求职面试

知识点 · 数据库系统 · 基础

关系代数的基本运算:选择、投影、并、差与笛卡尔积

关系代数把关系看作元组的集合,基本运算有五个。 1. 选择 σ:按条件挑出满足条件的元组,相当于 SQL 的 WHERE,是水平取行。 2. 投影 π:选出指定属性列,相当于 SELECT 指定列,但要自动去掉重复元组。 3. 并 ∪:两个同目同域关系合并并去重,类似 UNION。 4. 差 −:R−S 取在 R 中但不在 S 中的元组,也要求同目同域。 5. 笛卡尔积 ×:R 的每个元组与 S 的每个元组拼接,属性数相加,元组数相乘。 注意:选择、投影是单关系运算;并、差、笛卡尔积是双关系运算。并和差必须满足相容性。其他连接、交、除可由基本运算组合。工程上分别对应 WHERE、SELECT DISTINCT、UNION、EXCEPT、CROSS JOIN。

每日一题 · 数据库系统

关系代数的基本运算:选择、投影、并、差与笛卡尔积

关系 R(A,B)={(1,2),(2,3)},下列哪个运算的结果可能因去重而减少元组数? A. 选择 B. 投影 C. 并 D. 笛卡尔积

解析

选 B。选择按条件筛选元组,只可能减少或不变,但不会因元组重复而额外减少;投影只保留部分列,不同元组投影后可能相同,关系是集合,因此必须去重,结果元组数可能减少。并会合并两个关系并去重,通常不减少原关系元组数;笛卡尔积元组数是两边元组数乘积,通常增加。注意选择是水平取行,投影是垂直取列。

面试小贴士 · 数据库系统

关系代数的基本运算:选择、投影、并、差与笛卡尔积

面试常问选择/投影区别、并差相容条件、笛卡尔积行数及 SQL 对应。答:选择取行,投影取列并去重;并差需同目同域;笛卡尔积属性相加、元组相乘。易错:σ/π混淆、投影忘去重、忽略相容性。

代码实现 · C++

代码示例

#include <bits/stdc++.h>
using namespace std;
using T=vector<int>; using R=vector<T>;
R sel(const R&r, function<bool(const T&)> f){R o; for(auto&t:r) if(f(t)) o.push_back(t); return o;}
R proj(const R&r,int c){R o; for(auto&t:r){T u{t[c]}; if(find(o.begin(),o.end(),u)==o.end()) o.push_back(u);} return o;}
R uni(const R&a,const R&b){R o=a; for(auto&t:b) if(find(o.begin(),o.end(),t)==o.end()) o.push_back(t); return o;}
R dif(const R&a,const R&b){R o; for(auto&t:a) if(find(b.begin(),b.end(),t)==b.end()) o.push_back(t); return o;}
R prod(const R&a,const R&b){R o; for(auto&x:a) for(auto&y:b){T t=x; t.insert(t.end(),y.begin(),y.end()); o.push_back(t);} return o;}
void print(const R&r){for(auto&t:r){cout<<'('; for(int i=0;i<t.size();++i){if(i)cout<<','; cout<<t[i];} cout<<')'<<' ';} cout<<endl;}
int main(){
 R a={{1,2},{2,3}}, b={{1,2},{3,4}};
 print(sel(a,[](const T&t){return t[0]==1;})); // 选择 A=1
 print(proj(a,1)); // 投影第2列并去重
 print(uni(a,b)); // 并
 print(dif(a,b)); // 差
 print(prod(a,b)); // 笛卡尔积
 return 0;
}
← 前一天目录后一天 →