Domain Types: char(n) varchar(n) int number(p,d) float(n) Timestamp Table create table instructor ( ID char(5), name varchar(20) not null, dept_name varchar(20), salary numeric(8,2)); insert into instructor values (‘10211’, ’Smith’, ’Biology’, 66000); A relational schema R is in first normal form if the domains of all attributes of R are atomic Functional Dependency dept_name -> building, budget K is a superkey for relation schema R if and only if K -> R K is a candidate key for R if and only if K -> R, and for no α K, α -> R A functional dependency is trivial if it is satisfied by all instances of a relation Boyce Codd Normal Form Aggregate Functions avg: average value min: minimum value max: maximum value sum: sum of values count: number of values Joins Views create view departments_total_salary(dept_name, total_salary) as select dept_name, sum (salary) from instructor group by dept_name; Constraints on Single Relation not null primary key unique check (P), where P is a predicate Decomposing into BCNF Third Normal Form 1. SELECT DISTINCT id, name FROM takes NATURAL JOIN student WHERE course_id='CS-101' AND grade = 'A' AND id IN (SELECT id FROM takes WHERE course_id='CS-319' AND grade = 'A'); 2. SELECT DISTINCT id, name FROM takes NATURAL JOIN student WHERE course_id='CS-319' AND grade = 'A' AND id IN (SELECT id FROM takes WHERE course_id='CS-101') AND id NOT IN (SELECT id FROM takes WHERE course_id='CS-101' AND grade = 'A'); 3. SELECT DISTINCT id FROM takes GROUP BY id, course_id HAVING count(*) > 1 4. SELECT id, sum( points * credits ) / sum( credits ) AS gpa FROM course NATURAL JOIN takes NATURAL JOIN gradepoint GROUP BY id 6. SELECT id FROM student AS s WHERE ( SELECT max( points ) FROM takes NATURAL JOIN gradepoint WHERE id = s.id AND course_id = 'CS-101') > ( SELECT max( points ) FROM takes NATURAL JOIN gradepoint WHERE id = s.id AND course_id = 'CS-347') 7. SELECT id FROM student s WHERE NOT EXISTS( SELECT points FROM takes NATURAL JOIN gradepoint WHERE id = s.id AND points < 3.7) -- Use ALL in WHERE: SELECT id FROM student s WHERE 3.7 <= ALL ( SELECT points FROM takes NATURAL JOIN gradepoint WHERE id = s.id) 8. SELECT DISTINCT course_id FROM section s WHERE course_id IN ( SELECT course_id FROM section WHERE year = s.year +1 9. SELECT id, name FROM instructor as I WHERE ((SELECT COUNT(*) FROM teaches WHERE ID = I.ID) = (SELECT COUNT(*) FROM course WHERE dept_name = 'Comp Sci')) 11. SELECT title, year FROM tvseries WHERE (title, year) NOT IN (SELECT title, year FROM watches) 12. SELECT DISTINCT course.course_id, ID FROM course LEFT OUTER JOIN teaches ON course.course_id = teaches.course_id