This document contains the instructions and questions for a Database Management Systems midterm exam. It includes 6 multiple part questions testing various SQL skills like writing queries to retrieve information from several sample databases with different schemas. The questions cover topics like joins, aggregation, subqueries, and relational algebra.
This document contains the instructions and questions for a Database Management Systems midterm exam. It includes 6 multiple part questions testing various SQL skills like writing queries to retrieve information from several sample databases with different schemas. The questions cover topics like joins, aggregation, subqueries, and relational algebra.
This document contains the instructions and questions for a Database Management Systems midterm exam. It includes 6 multiple part questions testing various SQL skills like writing queries to retrieve information from several sample databases with different schemas. The questions cover topics like joins, aggregation, subqueries, and relational algebra.
This document contains the instructions and questions for a Database Management Systems midterm exam. It includes 6 multiple part questions testing various SQL skills like writing queries to retrieve information from several sample databases with different schemas. The questions cover topics like joins, aggregation, subqueries, and relational algebra.
Course Code: CMP-370 Course Title: Database Management System Maximum Time: 90 Minutes Maximum Marks: 70
Instructions
Read questions carefully before solving. Solve the questions on provided blank space under each question. Understanding of the questions is part of examination. So, none of your queries will be entertained in the examinations hall. If there is any ambiguity in the paper, benefit will be given to the students. Paper has 8 pages including title page.
Question # 1 2 3 4 5 6 Total Total Marks 20 10 10 10 20 70 Marks Obtained
Examiner Signature: Marks Out of 35:
DO NOT OPEN UNTIL YOU ARE TOLD TO DO SO Sheet No.: Invigilator Sign: Date: 2
Question 1: (Marks 20) The boat reservations database has the following schema: sailor: sname (string), rating (integer) boat: bname (string), color (string), rating (integer) reservation: sname (string), bname (string), weekday (string) The rating attribute for boats indicates the minimum rating required of a sailor reserving the boat. In addition, the following hold: sname is the primary key of sailor (so every sailor has just one rating); bname is the primary key of boat (so every boat has just one color and one rating); bname is a foreign key in the reservation relation, referencing relation boat (so every bname in reservation occurs in boat, but the converse need not be true) sname is a foreign key in the reservation relation, referencing relation sailor (so every sname in reservation occurs in sailor, but the converse need not be true) Here is one example instance given in Figure 1 over the above schema:
Figure 1: Database instance for Question 1 Write the following queries in SQL (of course, the queries must work on all data, not just the sample one):
a) (3 points) List all boats reserved on Wednesday and their color.
select distinct reservation.bname, color from reservation, boat where reservation.bname = boat.bname and reservation.weekday = Wednesday
b) (3 points) List all pairs of sailors who have reserved boats on the same day.
select distinct x.sname, y.sname from reservation x, reservation y where x.weekday = y.weekday
3
c) (5 points) List the days appearing in the reservation relation for which only red boats are reserved.
select distinct weekday from reservation where weekday not in (select r.weekday from reservation r, boat b where r.bname = b.bname and b.color < > red)
d) (4 points) For each day, list the number of red boats reserved on that day.
select r.weekday, count(distinct r.bname) as number from reservation r, boat b where r.bname = b.bname and b.color = red group by weekday
e) (5 points) For each day of the week occurring in the reservation relation, list the average rating of sailors having reserved boats that day.
select weekday, avg(rating) from sailor, reservation where sailor.sname = reservation.sname group by weekday
Question 2: (Marks 10)
Consider the following relations: Emp(eno, ename, title, city) Proj(pno, pname, budget, city) Works(eno, pno, resp, dur) Pay(title, salary) where the primary keys are underlined, and Emp.title is a foreign key to Pay.title, Works.eno is a foreign key to Emp.eno, and Works.pno is a foreign key to Proj.pno. For each part of this question (considered independently of the other parts), write a single SQL statement that accomplishes the given requirements.
a) (3 points) For each city, how many projects are located in that city and what is the total budget over all projects in the city?
SELECT city , count (pno) AS totproj , sum ( budget ) AS totbudget FROM Proj GROUP BY city
b) (3 points) List all projects located in Lahore and include for each one the number of persons working on the project. 4
SELECT Proj.pno , count (* ) FROM Proj LEFT OUTER JOIN Works ON ( Proj.pno=Works.pno ) WHERE city=`Lahore ` GROUP BY Proj.pno , pname
c) (4 points) Formulate the following SQL query in relational algebra. This is expressed over the same schema as above. SELECT pname , budget FROM Proj , Works , Emp WHERE title =`Programmer ` AND Works.eno = Emp.eno AND Works.pno = Proj.pno
*pname,budget (Proj ./ Works ./ (-- title=`Programmer' Emp)) You can put the selection outside all of the joins if you wish; that would work too: *pname,budget (--title=`Programmer'(Proj ./ Works ./ Emp)) Question 3: (Marks 10)
Consider the instance of the Sailors relation given in Figure 2 where the key is underlined. Show the results of the following query.
Figure 2: Database instance for Question 3
a) (5 points) SELECT S.sid FROM Sailors S WHERE S.rating >= ALL (SELECT S2.rating FROM Sailors S2 )
Note: The result that is returned is a table. You need to specify the column title.
Sid 58 71
b) (5 points) 5
SELECT S.rating , AVG( S.age ) AS average FROM Sailors S GROUP BY S.rating HAVING 1 < (SELECT COUNT(*) FROM SAILORS S2 WHERE S.rating = S2.rating )
Note: The result that is returned is a table. You need to specify the column title.