Você está na página 1de 55

RELATIONAL ALGEBRA (III)

Prof. Sin-Min LEE Department of Computer Science

Unary Relational Operations: SELECT and PROJECT


The

PROJECT Operation Sequences of Operations and the RENAME Operation The SELECT Operation

Relational Algebra Operations from Set Theory


The

UNION, INTERSECTION, and MINUS Operations The CARTESIAN PRODUCT (or CROSS PRODUCT) Operation

Binary Relational Operations: JOIN and DIVISION


The

JOIN Operation The EQUIJOIN and NATURAL JOIN Variations of JOIN A Complete Set of Relational Algebra Operations The DIVISION Operation

Additional Relational Operations


Aggregate

Functions and Grouping Recursive Closure Operations OUTER JOIN Operations The OUTER JOIN Operation

SPECIAL RELATIONAL OPERATORS


The following operators are peculiar to relations:

- Join operators There are several kind of join operators. We only consider three of these here (others will be considered when we discuss null values): - (1) Condition Joins - (2) Equijoins - (3) Natural Joins
- Division

JOIN OPERATORS
Condition Joins: - Defined as a cross-product followed by a selection: R c S = c(R S) ( is called the bow-tie) where c is the condition. - Example: Given the sample relational instances S1 and R1

The condition join S S1.sid<R1.sid R1 yields

JOIN OPERATORS
Condition Joins: - Defined as a cross-product followed by a selection: R c S = c(R S) ( is called the bow-tie) where c is the condition. - Example: Given the sample relational instances S1 and R1

The condition join S S1.sid<R1.sid R1 yields

Equijoin:
Special case of the condition join where the join condition consists solely of equalities between two fields in R and S connected by the logical AND operator (). Example: Given the two sample relational instances S1 and R1

The operator S1

R.sid=Ssid

R1

yields

Natural Join
- Special case of equijoin where equalities are implicitly specified on all fields having the same name in R and S. - The condition c is now left out, so that the bow tie operator by itself signifies a natural join. - N. B. If the two relations have no attributes in common, the natural join is simply the cross-product.

DIVISION
- The division operator is used for queries which involve the all qualifier such as Find the names of sailors who have reserved all boats. - The division operator is a bit tricky to explain, and perhaps best approached through examples as will be done here.

EXAMPLES OF DIVISION

DIVISION
Interpretation of the division operation A/B: - Divide the attributes of A into 2 sets: A1 and A2. - Divide the attributes of B into 2 sets: B2 and B3. - Where the sets A2 and B2 have the same attributes. - For each set of values in B2: - Search in A2 for the sets of rows (having the same A1 values) whose A2 values (taken together) form a set which is the same as the set of B2s. - For all the set of rows in A which satisfy the above search, pick out their A1 values and put them in the answer.

DIVISION
Example: Find the names of sailors who have reserved all boats: (1) A = sid,bid(Reserves). A1 = sid(Reserves) A2 = bid(Reserves) (2) B2 = bid(Boats) B3 is the rest of B. Thus, B2 ={101, 102, 103, 104} (3) Find the rows of A such that their A.sid is the same and their combined A.bid is the set B2. Thus we find A1 = {22} (4) Get the set of A2 corresponding to A1: A2 = {Dustin}

FORMAL DEFINITION OF DIVISION

The formal definition of division is as follows:


A/B = x(A) - x((x(A) B) A)

EXAMPLES OF ALGEBRA QUERIES


In the rest of this chapter we shall illustrate queries using the following new instances S3 of sailors, R2 of Reserves and B1 of boats.

QUERY Q1
Given the relational instances:

(Q1) Find the names of sailors who have reserved boat 103 sname((bid=103 Reserves) Sailors)

The answer is thus the following relational instance


{<Dustin>, <Lubber>, <Horatio>}

QUERY Q1 (contd)
There are of course several ways to express Q1 in relational algebra. Here is another:

sname(bid=103(Reserves Sailors)) Which of these expressions should we use?


That is a question of optimization. Indeed, when we describe how to state queries in SQL, we can leave it to the optimizer in the DBMS to select the nest approach.

QUERY Q2
(Q2) Find the names of sailors who have reserved a red boat.

sname((color=redBoats) Reserves Sailors)

QUERY Q3
(Q3) Find the colors of boats reserved by Lubber.

color((sname=LubberSailors)Sailors Reserves Boats)

QUERY Q4
(Q4) Find the names of Sailors who have reserved at least one boat

sname(Sailors Reserves)

QUERY Q5
(Q5) Find the names of sailors who have reserved a red or a green boat.

(Tempboats, (color=redBoats) (color=greenBoats)) sname(Tempboats Reserves Sailors)

QUERY Q6
(Q6) Find the names of Sailors who have reserved a red and a
green boat. It seems tempting to use the expression used in Q5, replacing simply by . However, this wont work, for such an expression is requesting the names of sailors who have requested a boat that is both red and green! The correct expression is as follows: (Tempred, sid((color=redBoats) Reserves)) (Tempgreen, sid((color=greenBoats) Reserves)) sname ((Tempred Tempgreen) Sailors)

QUERY Q7
(Q7) Find the names of sailors who have reserved at least two boats.

(Reservations, sid,sname,bid(Sailors Reserves))

(Reservationpairs(1sid1, 2sname, 3bid1, 4sid2,


5sname, 6bid2), ReservationsReservations) sname1(sid1=sid2)(bid1bid2)Reservationpairs)

QUERY 8
(Q8) Find the sids of sailors with age over 20 who have not reserved a red boat.

sid(age>20Sailors) - sid((color=redBoats) Reserves Sailors)

QUERY 9
(Q) Find the names of sailors who have reserved all boats.

(Tempsids, (sid,bidReserves) / (bidBoats))


sname(Tempsids Sailors

QUERY Q10
(Q10) Find the names of sailors who have reserved all boats called Interlake.

(Tempsids, (sid,bidReserves)/(bid(bname=InterlakeBoats)))
sname(Tempsids Sailors)

Natural

Join

- combines , , - very commonly used Natural Join forms the cross product of its two arguments, does a selection to enforce equality of columns with the same name and removes duplicate columns. Eg: show all transactions done by account owner Bob

owner=Bob (account JOIN transaction)

Rename operation
What if you need to access the same relation twice in a query? eg. person(ss#, name, mother_ss#, father_ss#)
Find the name of Bobs mother needs the person table to be accessed twice.

The operation x (r) evaluates to a second logical copy of relation r renamed to x.

Rename operation (contd)


eg:

mother.name ( ( mother (person))

JOIN mother.ss# = person.mother_ss#


(s name=Bob (person)))

Você também pode gostar