Essentially everything I’ve discussed in this chapter so far maps very directly into the relational calculus. Let’s look at a simple example—a relational calculus representation of the query “Get supplier number and status for suppliers in Paris who supply part P2.” Here first for comparison purposes is an algebraic formulation:

( S WHERE CITY = 'Paris' ) { SNO , STATUS } MATCHING ( SP WHERE PNO = 'P2' )

And here’s a relational calculus equivalent:

RANGEVAR SX RANGES OVER S ; RANGEVAR SPX RANGES OVER SP ; { SX.SNO , SX.STATUS } WHERE SX.CITY = 'Paris' AND EXISTS SPX ( SPX.SNO = SX.SNO AND SPX.PNO = 'P2' )

*Explanation:*

The first two lines are definitions, defining SX and SPX to be

*range variables*that range over S and SP, respectively. What those definitions mean is that, at any given time, permitted values of SX are tuples in the relation that’s the value of relvar S at that time; likewise, permitted values of SPX are tuples in the relation that’s the value of relvar SP at that time.The remaining lines are the actual query. Observe that they take the following generic form:

WHERE`proto tuple`

`predicate`

This expression overall is the relational calculus version of a relational expression (i.e., an expression that denotes a relation), and it evaluates to a relation containing every possible value of the proto tuple for which the predicate evaluates to TRUE, and no other tuples. (The term

*proto tuple*, standing for “prototype tuple,” is apt but nonstandard; in fact, a ...

Start Free Trial

No credit card required