First of all, here are answers to a couple of exercises that were stated inline in the body of the chapter. The first asked what the difference was, given our usual sample data, between the expressions P JOIN (S{CITY}) and (P JOIN S){CITY}. *Answer:* The first yields full part details (PNO, PNAME, COLOR, WEIGHT, and CITY) for parts in the same city as at least one supplier, the second yields just CITY values for those same parts (speaking a trifle loosely in both cases).

The second exercise asked what the difference was between an equijoin and a natural join. *Answer:* Let the relations to be joined be *r1* and *r2*, and assume for simplicity that *r1* and *r2* have just one common attribute, *A*. Before we can perform the equijoin, then, we need to do some renaming. For definiteness, suppose we apply the renaming to *r2*, to yield *r3* = *r2* RENAME {*A* AS *B*}. Then the equijoin is defined to be equal to (*r1* TIMES *r3*) WHERE *A* = *B*. Note in particular that *A* and *B* are both attributes of the result, and every tuple in that result will have the same value for those two attributes. Projecting attribute *B* away from that result yields the natural join *r1* JOIN *r2*.

6.1 a. The result has duplicate column names (as well as left to right column ordering). b. The result has left to right column ordering. c. The result has an unnamed column (as well as left to right column ordering). d. The result has duplicate rows (even though the SELECT clause explicitly specifies S.SNO, not SP.SNO, and SNO values are ...

Start Free Trial

No credit card required