===== Relational Algebra 2 =====
**Union** Operator: Problem with × (cross product) and ⋈ (natural joins) is that they try to match tuples (rows) form the relations (tables). Here, we combine the information vertically.
πcName College ∪ πsName Student gives:
Stanford
Susan
Cornell
Mary
John
...
**Difference** operator
IDs of students who didn't apply anywhere
πsID Student - πsID Apply
IDs **and names** of those students
πsName (( πsID Student - πsID Apply ) ⋈ Student )
**Intersection** operator
Names that are both a college name and a student name:
πcNameCollege ∩ πsName Student
Intersection doesn't add expressive power.
E1 ∩ E2 ≣ E1 - ( E1 - E2 )
And if the schema is the same between E1 and E2, then
E1 ∩ E2 ≣ E1 ⋈ E2
**Rename** Operator ("ρ" rho)
- ρR(A1,...,An)(E) <- General Form
- ρR(E)
- ρA1,...,An(E)
ρc(name)(πcNameCollege) ∪ ρc(name)(πsName Student)
Rename is used for disambiguation in "self-joins"
**Pairs** of colleges in same state: Stanford, Berkeley; Berlekey, UCLA; ...
σs1 = s2 (ρc1(n1,s1,e1)( College ) × ρc2(n2,s2,e2)( College ) )
or
ρc1(n1,s,e1)( College ) ⋈ ρc2(n2,s,e2)( College )
This would give us Stanford, Stanford and Berkeley, Berkeley. So add...
σs1 != s2( ρc1(n1,s,e1)( College ) ⋈ ρc2(n2,s,e2)( College ) )
We'll still get Stanford, Berkeley and Berkeley, Stanford. So change...
σs1 < s2( ρc1(n1,s,e1)( College ) ⋈ ρc2(n2,s,e2)( College ) )
Clever, eh?