CS134-lecture-20210616

Relational algebra cont. #

Natural join cont #

image_2021-06-16-15-51-53

dept locsdepartmentlocations\begin{aligned} \text{dept locs} \leftarrow \text{department} * \text{locations} \end{aligned}

image_2021-06-16-15-54-39

Our natural join results in this table

image_2021-06-16-16-00-03

Common mistakes when using join #

Its common to misuse join/natural join. Consider this example, if we have 2 entities, R R and S S :

R(a,b)S(b,d,f)\begin{aligned} R(a, b) && S(b, d, f) \end{aligned}

If we want to join on b b , we can do the natural join:

RS\begin{aligned} R * S \end{aligned}

While the incorrect answer is

resultRb=bS\begin{aligned} \text{result} \leftarrow R \underset{\text{b=b}}{\bowtie} S \end{aligned}

because of ambiguity. Also, result will be a schema including 2 columns of b b .

If we wanted to get rid of f f in our joined table, we could start with a project

new s(newb, d)πb, d(S)\begin{aligned} \text{new s} (\text{newb, d}) \leftarrow \pi_\text{b, d}(S) \end{aligned}

and then get the result with a join, because the attribute names are different now:

resultRb=newbnew s\begin{aligned} \text{result} \leftarrow R \underset{\text{b=newb}}{\bowtie} \text{new s} \end{aligned}

Join selectivity #

image_2021-06-16-16-11-39

Complete set of relational operations #

image_2021-06-16-16-14-58

Example queries #

image_2021-06-16-16-15-21

research deptσdname=’Research’( department )research empsresearch deptdnumber=dnoemployeeresultπfname, lname, address( research emps )\begin{aligned} \text{research dept} &\leftarrow \sigma_\text{dname='Research'}(\text{ department }) \\ \text{research emps} &\leftarrow \text{research dept} \underset{\text{dnumber=dno}}{\bowtie} \text{employee} \\ \text{result} &\leftarrow \pi_\text{fname, lname, address}(\text{ research emps }) \end{aligned}
Include following exercise in weekly homework

Question: For every project located in “stafford”, list the project number, the controlling department number, and the department managers’s last name, address, and birthdate.

image_2021-06-10-16-56-31

stafford projectsσplocation=’stafford’( project )control deptstafford projectsdnum=dnumberdepartmentproject dept mgrcontrol deptmgrssn=ssnemployeeresultπpnumber, dnum, lname, address, bdate( projec dept mgr )\begin{aligned} \text{stafford projects} &\leftarrow \sigma_\text{plocation='stafford'}(\text{ project }) \\ \text{control dept} &\leftarrow \text{stafford projects} \underset{\text{dnum=dnumber}}{\bowtie} \text{department} \\ \text{project dept mgr} &\leftarrow \text{control dept} \underset{\text{mgrssn=ssn}}{\bowtie} \text{employee} \\ \text{result} &\leftarrow \pi_\text{pnumber, dnum, lname, address, bdate}(\text{ projec dept mgr }) \end{aligned}

image_2021-06-16-16-27-36 image_2021-06-16-16-45-57

emps with depsπessn( dependent )all empsπssn( employee )emps without depsall empsemps with depsresultπlname,fname(emps without depsemployee)\begin{aligned} \text{emps with deps} &\leftarrow \pi_\text{essn}(\text{ dependent }) \\ \text{all emps} &\leftarrow \pi_\text{ssn}(\text{ employee }) \\ \text{emps without deps} &\leftarrow \text{all emps} - \text{emps with deps} \\ \text{result} &\leftarrow \pi_\text{lname,fname} (\text{emps without deps} * \text{employee}) \end{aligned}
Note: employee and emps with deps must be union compatible to take the difference.

Another exercise with the same schema

Include following exercise in weekly homework

List the names (first name, last name) of managers who have at least one dependent.

First approach uses set operations:

mgr(ssn)πmgrssn( department )emp with dep(ssn)πessn( dependent )mgr with depsmgremp with depsresultπlname, fname(mgr with depsemployee)\begin{aligned} \text{mgr(ssn)} &\leftarrow \pi_\text{mgrssn} (\text{ department }) \\ \text{emp with dep(ssn)} &\leftarrow \pi_\text{essn} (\text{ dependent }) \\ \text{mgr with deps} &\leftarrow \text{mgr} \cap \text{emp with deps} \\ \text{result} &\leftarrow \pi_\text{lname, fname} (\text{mgr with deps} * \text{employee}) \end{aligned}

Another approach using join:

mgr depπessn(departmentmgrssn=essndependent)emp mgr depemployeessn=essnmgr depresultπfname, lname( emp mgr dep )\begin{aligned} \text{mgr dep} &\leftarrow \pi_\text{essn} (\text{department} \underset{\text{mgrssn=essn}}{\bowtie} \text{dependent}) \\ \text{emp mgr dep} &\leftarrow \text{employee} \underset{\text{ssn=essn}}{\bowtie} \text{mgr dep} \\ \text{result} &\leftarrow \pi_\text{fname, lname} (\text{ emp mgr dep }) \end{aligned}