SQL关系代数查询

SQL关系代数查询,sql,relational-algebra,Sql,Relational Algebra,我这里完全是空白 我有一个有两个关系的模式。一个是贷款,它具有贷款编号、分行名称和金额等属性。第二个关系是借款人,其属性为客户名称和贷款编号。这两个关系通过贷款编号连接 如果我想找到余额小于10000的所有客户的姓名,我将如何以关系代数形式编写查询 出于好奇,作为一个基本的SQL查询,我该怎么做呢。我相信SQL应该是相对简单的。。。类似以下内容可能就足够了: SELECT b.customer-name, SUM(l.amount) FROM borrower b JOIN l

我这里完全是空白

我有一个有两个关系的模式。一个是贷款,它具有贷款编号、分行名称和金额等属性。第二个关系是借款人,其属性为客户名称和贷款编号。这两个关系通过贷款编号连接

如果我想找到余额小于10000的所有客户的姓名,我将如何以关系代数形式编写查询


出于好奇,作为一个基本的SQL查询,我该怎么做呢。

我相信SQL应该是相对简单的。。。类似以下内容可能就足够了:

SELECT 
  b.customer-name,
  SUM(l.amount)
FROM
  borrower b
  JOIN loan l
    ON b.loan-number = l.loan-number
GROUP BY
  b.customer-name
HAVING
  SUM(l.amount) < 10000
选择
b、 客户名称,
金额(l.金额)
从…起
借款人b
联合贷款公司
关于b.贷款编号=l.贷款编号
分组
b、 客户名称
有
金额(l.金额)<10000

研究关系代数的8个主要算子:限制、投影、笛卡尔积、连接、并、交、集差和除

回答你的问题:

loan(loan_number, branch_name, amount)
borrower(customer_name, loan_number)
执行两个关系的自然连接,应用限制(余额小于10000),然后使用投影显示名称。下面的两个关系代数表达式都可以回答您的问题

两个表达式的计算结果均为以下SQL查询:

select customer_name
from borrower b, loan l
where b.loan_number=l.loan_number and amount>10000;

免责声明:我对关系代数不太熟悉

SQL可以很快被视为使用隐式内部联接,然后使用loan上的筛选器。金额:

SELECT customer-name
FROM Borrower, Loan
WHERE Customer.loan-number = Loan.loan-number
 AND Loan.amount > 10000
然后将其转换为关系代数,记住以下符号是唯一需要的符号:

选择操作(σ):-识别一组元组,它是关系的一部分,并仅提取这些元组。select操作选择满足给定谓词或条件的元组

项目操作(π):-返回其参数关系,其中某些属性被忽略

 Π customer-name (σ Borrower.loan-number=Loan.loan-number (σ Loan.amount>10000 (Borrower X Loan)))

请不要建议隐式连接。它们是SQL反模式。任何人都不应该学习这种很久以前就被替换过的语法。@HLGEM您的评论让我有点困惑-这个实例中的自然连接只是两个具有公共值的表之间的连接(自然连接的结果是R和S中所有元组的组合的集合,它们在公共属性名上相等). 这不是连接两个表然后指定连接where子句的做法,我认为这就是你所指的?根据严格关系代数,当使用连接符号而不使用谓词时,这意味着一个自然连接-但是在使用SQL时需要显式地将其放入-摘自《connolly&begg数据库系统》一书。@bhs你是对的。自然连接是公共属性上两个关系之间的连接,即外键到主键关系中涉及的属性。如果我错了,请纠正我,但是如果您使用的是带有谓词(或θ连接)的自然连接符号,则必须使用匹配属性重命名两个关系才能匹配它们?(例如,关系A具有属性id、名称,关系B具有属性id、颜色。将B重命名为id2,并在θ连接上使用id=id2)请参阅。