The Relational Model
by K. Yue
1. Introduction
Example:
mysql> SELECT * FROM student;
+--------+-----------+---------+-------+-------+---------+---------+
| stuId | fname | lname | major | minor | credits | advisor |
+--------+-----------+---------+-------+-------+---------+---------+
| 100000 | Tony | Hawk | CSCI | CINF | 40 | 1011 |
| 100001 | Mary | Hawk | CSCI | CINF | 35 | 1011 |
| 100002 | David | Hawk | CSCI | ITEC | 66 | 1011 |
| 100003 | Catherine | Lim | ITEC | CINF | 20 | 1017 |
| 100004 | Larry | Johnson | ITEC | NULL | 66 | 1017 |
| 100005 | Linda | Johnson | CINF | ENGL | 13 | 1015 |
| 100006 | Lillian | Johnson | CINF | ITEC | 18 | 1015 |
| 100007 | Ben | Zico | NULL | NULL | 16 | NULL |
| 100008 | Bill | Ching | ARTS | ENGL | 90 | 1018 |
| 100009 | Linda | King | ARTS | CSCI | 125 | 1018 |
+--------+-----------+---------+-------+-------+---------+---------+
10 rows in set (0.00 sec)
Example:
+--------+-----------+---------+-------+-------+---------+---------+
| stuId | lname | fname | major | minor | credits | advisor |
+--------+-----------+---------+-------+-------+---------+---------+
| 100000 | Tony | Hawk | CSCI | CINF | 40 | 1011 |
| 100001 | Mary | Hawk | CSCI | CINF | 35 | 1011 |
| 100002 | David | Hawk | CSCI | ITEC | 66 | 1011 |
| 100003 | Catherine | Lim | ITEC | CINF | 20 | 1017 |
| 100004 | Larry | Johnson | ITEC | NULL | 66 | 1017 |
| 100005 | Linda | Johnson | CINF | ENGL | 13 | 1015 |
| 100006 | Lillian | Johnson | CINF | ITEC | 18 | 1015 |
| 100007 | Ben | Zico | NULL | NULL | 16 | 1014 |
| 100008 | Bill | Ching | ARTS | ENGL | 90 | 1018 |
| 100009 | Linda | King | ARTS | CSCI | 125 | 1018 |
+--------+-----------+---------+-------+-------+---------+---------+
and
+--------+---------+-----------+---------+---------+-------+-------+
| stuId | lname | fname | advisor | credits | major | minor |
+--------+---------+-----------+---------+---------+-------+-------+
| 100008 | Ching | Bill | 1018 | 90 | ARTS | ENGL |
| 100008 | Ching | Bill | 1018 | 90 | ARTS | ENGL |
| 100008 | Ching | Bill | 1018 | 90 | ARTS | ENGL |
| 100008 | Ching | Bill | 1018 | 90 | ARTS | ENGL |
| 100002 | Hawk | David | 1011 | 66 | CSCI | ITEC |
| 100001 | Hawk | Mary | 1011 | 35 | CSCI | CINF |
| 100000 | Hawk | Tony | 1011 | 40 | CSCI | CINF |
| 100004 | Johnson | Larry | 1017 | 66 | ITEC | NULL |
| 100006 | Johnson | Lillian | 1015 | 18 | CINF | ITEC |
| 100005 | Johnson | Linda | 1015 | 13 | CINF | ENGL |
| 100009 | King | Linda | 1018 | 125 | ARTS | CSCI |
| 100003 | Lim | Catherine | 1017 | 20 | ITEC | CINF |
| 100007 | Zico | Ben | NULL | 16 | NULL | NULL |
+--------+---------+-----------+---------+---------+-------+-------+
stores the same information.
Null values:
2. Keys
Example:
Consider:
mysql> SELECT * FROM faculty;
+-------+----------+----------+----------+---------------------+
| facId | fname | lname | deptCode | rank |
+-------+----------+----------+----------+---------------------+
| 1011 | Paul | Smith | CSCI | Professor |
| 1012 | Mary | Tran | CSCI | Associate Professor |
| 1013 | David | Love | CSCI | |
| 1014 | Sharon | Mannes | CSCI | Assistant Professor |
| 1015 | Daniel | Kim | CINF | Professor |
| 1016 | Andrew | Byre | CINF | Associate Professor |
| 1017 | Deborah | Gump | ITEC | Professor |
| 1018 | Art | Allister | ARTS | Assistant Professor |
| 1019 | Benjamin | Yu | ITEC | Lecturer |
| 1020 | Katrina | Bajaj | ENGL | Lecturer |
| 1021 | Jorginlo | Neymar | ACCT | Assistant Professor |
+-------+----------+----------+----------+---------------------+
11 rows in set (0.00 sec)
mysql> SELECT * FROM department;
+----------+------------------------------+------------+------------+
| deptCode | deptName | schoolCode | numFaculty |
+----------+------------------------------+------------+------------+
| ACCT | Accounting | BUS | 10 |
| ARTS | Arts | HSH | 5 |
| CINF | Computer Information Systems | CSE | 5 |
| CSCI | Computer Science | CSE | 12 |
| ENGL | English | HSH | 12 |
| ITEC | Information Technology | CSE | 4 |
| MATH | Mathematics | CSE | 7 |
+----------+------------------------------+------------+------------+
7 rows in set (0.00 sec)
Consider also:
mysql> SELECT * FROM enroll;
+--------+---------+-------+----------+
| stuId | classId | grade | n_alerts |
+--------+---------+-------+----------+
| 100000 | 10000 | A | 0 |
| 100001 | 10000 | NULL | NULL |
| 100002 | 10000 | B- | 3 |
| 100000 | 10001 | A | 2 |
| 100001 | 10001 | A- | 0 |
| 100000 | 10002 | B+ | 1 |
| 100002 | 10002 | B+ | 2 |
| 100000 | 10003 | C | 0 |
| 100002 | 10003 | D | 4 |
| 100004 | 10003 | A | 0 |
| 100005 | 10003 | NULL | NULL |
| 100000 | 10004 | A- | 1 |
| 100004 | 10004 | B+ | NULL |
| 100005 | 10004 | A- | 0 |
| 100006 | 10004 | C+ | NULL |
| 100005 | 10005 | A- | 0 |
| 100006 | 10005 | A | NULL |
| 100005 | 10006 | B+ | NULL |
| 100007 | 10007 | F | 4 |
| 100008 | 10007 | C- | 0 |
| 100007 | 10008 | A- | 0 |
| 100000 | 11001 | D | 4 |
+--------+---------+-------+----------+
22 rows in set (0.00 sec)
Exercise:
(1) Give a realistic example of a relation with two candidate keys. State the assumptions you have made.
More about keys:
Consider the example above. The attribute deptCode is a foreign key in the relation faculty, referencing department(deptCode)
Likewise, stuid is a foreign key in the relation Enroll: stuid references student(stuid)
Note that the student table has three foreign keys.
Example:
SELECT * FROM faculty;mysql> SELECT * FROM faculty;
+-------+----------+----------+----------+---------------------+
| facId | fname | lname | deptCode | rank |
+-------+----------+----------+----------+---------------------+
| 1011 | Paul | Smith | CSCI | Professor |
| 1012 | Mary | Tran | CSCI | Associate Professor |
| 1013 | David | Love | CSCI | NULL |
| 1014 | Sharon | Mannes | CSCI | Assistant Professor |
| 1015 | Daniel | Kim | CINF | Professor |
| 1016 | Andrew | Byre | CINF | Associate Professor |
| 1017 | Deborah | Gump | ITEC | Professor |
| 1018 | Art | Allister | ARTS | Assistant Professor |
| 1019 | Benjamin | Yu | ITEC | Lecturer |
| 1020 | Katrina | Bajaj | ENGL | Lecturer |
| 1021 | Jorginlo | Neymar | ACCT | Assistant Professor |
+-------+----------+----------+----------+---------------------+
11 rows in set (0.00 sec)
mysql> SELECT * FROM department;
+----------+------------------------------+------------+------------+
| deptCode | deptName | schoolCode | numFaculty |
+----------+------------------------------+------------+------------+
| ACCT | Accounting | BUS | 10 |
| ARTS | Arts | HSH | 5 |
| CINF | Computer Information Systems | CSE | 5 |
| CSCI | Computer Science | CSE | 12 |
| ENGL | English | HSH | 12 |
| ITEC | Information Technology | CSE | 4 |
| MATH | Mathematics | CSE | 7 |
+----------+------------------------------+------------+------------+
7 rows in set (0.00 sec)
mysql> SELECT s.fname, s.lname, s.advisor, f.`rank`
-> FROM student AS s INNER JOIN faculty AS f
-> ON (s.advisor = f.facId);
+-----------+---------+---------+---------------------+
| fname | lname | advisor | rank |
+-----------+---------+---------+---------------------+
| Tony | Hawk | 1011 | Professor |
| Mary | Hawk | 1011 | Professor |
| David | Hawk | 1011 | Professor |
| Catherine | Lim | 1017 | Professor |
| Larry | Johnson | 1017 | Professor |
| Linda | Johnson | 1015 | Professor |
| Lillian | Johnson | 1015 | Professor |
| Bill | Ching | 1018 | Assistant Professor |
| Linda | King | 1018 | Assistant Professor |
+-----------+---------+---------+---------------------+
SELECT * FROM student;
SELECT * FROM faculty;
SELECT s.fname, s.lname, s.advisor, f.`rank`
FROM student AS s INNER JOIN faculty AS f
ON (s.advisor = f.facId);
mysql> SELECT * FROM student;
+--------+-----------+---------+-------+-------+---------+---------+
| stuId | fname | lname | major | minor | credits | advisor |
+--------+-----------+---------+-------+-------+---------+---------+
| 100000 | Tony | Hawk | CSCI | CINF | 40 | 1011 |
| 100001 | Mary | Hawk | CSCI | CINF | 35 | 1011 |
| 100002 | David | Hawk | CSCI | ITEC | 66 | 1011 |
| 100003 | Catherine | Lim | ITEC | CINF | 20 | 1017 |
| 100004 | Larry | Johnson | ITEC | | 66 | 1017 |
| 100005 | Linda | Johnson | CINF | ENGL | 13 | 1015 |
| 100006 | Lillian | Johnson | CINF | ITEC | 18 | 1015 |
| 100007 | Ben | Zico | NULL | NULL | 16 | NULL |
| 100008 | Bill | Ching | ARTS | ENGL | 90 | 1018 |
| 100009 | Linda | King | ARTS | CSCI | 125 | 1018 |
+--------+-----------+---------+-------+-------+---------+---------+
10 rows in set (0.00 sec)
mysql> SELECT * FROM faculty;
+-------+----------+----------+----------+---------------------+
| facId | fname | lname | deptCode | rank |
+-------+----------+----------+----------+---------------------+
| 1011 | Paul | Smith | CSCI | Professor |
| 1012 | Mary | Tran | CSCI | Associate Professor |
| 1013 | David | Love | CSCI | |
| 1014 | Sharon | Mannes | CSCI | Assistant Professor |
| 1015 | Daniel | Kim | CINF | Professor |
| 1016 | Andrew | Byre | CINF | Associate Professor |
| 1017 | Deborah | Gump | ITEC | Professor |
| 1018 | Art | Allister | ARTS | Assistant Professor |
| 1019 | Benjamin | Yu | ITEC | Lecturer |
| 1020 | Katrina | Bajaj | ENGL | Lecturer |
| 1021 | Jorginlo | Neymar | ACCT | Assistant Professor |
+-------+----------+----------+----------+---------------------+
11 rows in set (0.00 sec)
mysql> SELECT s.fname, s.lname, s.advisor, f.`rank`
-> FROM student AS s INNER JOIN faculty AS f
-> ON (s.advisor = f.facId);
+-----------+---------+---------+---------------------+
| fname | lname | advisor | rank |
+-----------+---------+---------+---------------------+
| Tony | Hawk | 1011 | Professor |
| Mary | Hawk | 1011 | Professor |
| David | Hawk | 1011 | Professor |
| Catherine | Lim | 1017 | Professor |
| Larry | Johnson | 1017 | Professor |
| Linda | Johnson | 1015 | Professor |
| Lillian | Johnson | 1015 | Professor |
| Bill | Ching | 1018 | Assistant Professor |
| Linda | King | 1018 | Assistant Professor |
+-----------+---------+---------+---------------------+
9 rows in set (0.00 sec)