Student(ID, name, address, GPA, sizeHS) // ID is key Campus(location, enrollment, rank) // location is key Apply(ID, location, date, major, decision) // (ID,location) is key
Campus
" returns all tuples in Campus relation.
Relational algebra operators used to combine, filter, etc. the relations:
(Example: Students with GPA > 3.7 and sizeHS < 1000)
(Example: Applications to S.C. geology major)
** General case: σC(R)
where C
can include attribute names, constants,
comparisons (=
, <
, etc.), and connectives
(AND, OR, NOT
)
π eliminates columns while σ eliminates rows.
To do both, combine ("compose") operators:
(Example: name and address of Students with GPA > 3.7 and sizeHS < 1000)
σ produces a relation, π operates on that relation.
** General case: πA1, A2, ..., Am(E)
where E is any expression producing a relation
Question: Is it ever useful to compose two projection operators?
Example: πenrollment(πlocation, enrollment(Campus))
Question: Is it ever useful to compose two selection operators?
Example: σsizeHS < 1000(σGPA > 3.7(Student))
Schema of result is schema(Campus)
∪ schema(Apply)
Formally: R1 × R2 = {t | t = <t1,t2> and t1 ∈ R1 and t2 ∈ R2}
Question: Looks odd to glue unrelated tuples together. Why use it?
(Example: Names and addresses of all students with GPA > 3.7 who applied to CS major and were rejected)
Question: Can we write it in a different way?
(Show schema of Campus JOIN Apply)
(Example: Names and addresses of all students with GPA > 3.7 who applied to CS major and were rejected)
(Example: Names and addresses of all students with GPA > 3.7 who applied to CS major at campus with enrollment < 15,000 and were rejected)
** General case:
Need to be careful -- suppose we have:
Student(ID, name, address, GPA, sizeHS) Campus(name, enrollment, rank)"
Student JOIN Campus
" doesn't make sense.
Student(ID, name, address, GPA, sizeHS) OutofStateStudent(ID, name, address, GPA, sizeHS, state) ForeignStudent(ID, name, address, GPA, country)
(Example: List name and address of all students)
Question: Can we do it with cross-products or joins?
For union operator:
Student(ID, name, address, GPA, sizeHS) // ID is key Campus(location, enrollment, rank) // location is key Apply(ID, location, date, major, decision) // (ID,location) is key(Example: Find ID's of all students who didn't apply anywhere)
Question: What if want name of students?
For difference operator:
Student(ID, name, address) Parent(child-ID, parent-name)(Example: Print list of all student and parent names)
(Example: Find names of all pairs of students who live at same address)
** General case: ρR(A1, A2, ..., Am)(E) or ρR(E)
E ::= R | σC(E) | &piA1, A2, ..., An(E) | E1 × E2 | E1 ∪ E2 | E1 - E2 | ρR(A1, A2, ..., Am)(E)Abbreviations:
| E1 JOIN E2 | E1 JOINC E2 | E1 ∩ E2 | TempName(A1, A2, ..., Ak) := E