Practical Session 3 Answers
Exercise 1
--a.
SELECT fname,lname
FROM employee AS e1
WHERE NOT EXISTS (SELECT *
FROM employee AS e2, works_on, project
WHERE e2.ssn = e1.ssn AND
works_on.essn = e2.ssn AND
works_on.pno = project.pnumber AND
pname = 'ProductZ');
--b.
SELECT DISTINCT fname,lname
FROM employee AS e1, works_on AS wo1
WHERE e1.ssn = wo1.essn AND
wo1.pno IN (SELECT pno
FROM works_on AS wo2, employee AS e2
WHERE e2.ssn = wo2.essn AND
e2.fname = 'John' AND
e2.lname = 'Smith'
);
--c.
SELECT DISTINCT pname
FROM employee AS e1, employee AS sup, works_on, project
WHERE sup.ssn = e1.superssn AND
sup.fname = 'John' AND
sup.lname = 'James' AND
works_on.essn = e1.ssn AND
project.pnumber = works_on.pno;
--d.
SELECT fname, lname
FROM employee AS e1, works_on AS wo1, project AS p1
WHERE wo1.essn = e1.ssn AND
wo1.pno = p1.pnumber AND
p1.pname = 'ProductX' AND
NOT EXISTS(SELECT *
FROM employee as e2, works_on AS wo2, project AS p2
WHERE e1.ssn = e2.ssn AND
e2.ssn = wo2.essn AND
wo2.pno = p2.pnumber AND
NOT pname = 'ProductX');
-- For a Positive example, test this one on 'ProductZ'
Exercise 2
--a.
SELECT Name, Major
FROM STUDENT
WHERE NOT EXISTS ( SELECT *
FROM GRADE_REPORT
WHERE StudentNumber= STUDENT.StudentNumber AND NOT(Grade='A'))
--b.
SELECT Name, Major
FROM STUDENT
WHERE NOT EXISTS ( SELECT *
FROM GRADE_REPORT
WHERE StudentNumber= STUDENT.StudentNumber AND Grade='A' )
Exercise 3
--a.
--The query may still be specified in SQL by using a nested query as follows (not all
--implementations may support this type of query):
SELECT DNAME, COUNT (*)
FROM DEPARTMENT, EMPLOYEE
WHERE DNUMBER=DNO AND SEX='M' AND DNO IN ( SELECT DNO
FROM EMPLOYEE
GROUP BY DNO
HAVING AVG (SALARY) > 30000 )
GROUP BY DNAME
--Result:
--DNAME DNUMBER COUNT(*)
--Research 5 3
--Administration 4 1
--Headquarters 1 1
--b.
CREATE VIEW ex_2d AS
SELECT COUNT(employee.ssn), sum(works_on.hours), department.dname
FROM project AS p1, department, employee, works_on
WHERE works_on.essn = employee.ssn AND
works_on.pno = p1.pnumber AND
p1.dnum = department.dnumber AND
(SELECT count(wo2.pno)
FROM works_on as wo2
WHERE wo2.pno = p1.pnumber) > 1
GROUP BY department.dname;