Assignment 3 Solution I. (a) Retrieve the names of employees in department 5 who work more than 10 hours per week on the 'ProductX' project. SELECT LNAME, FNAME FROM EMPLOYEE, WORKS_ON, PROJECT WHERE DNO=5 AND SSN=ESSN AND PNO=PNUMBER AND PNAME='ProductX' AND HOURS>10; Another possible SQL query uses nesting as follows: SELECT LNAME, FNAME FROM EMPLOYEE WHERE DNO=5 AND SSN IN ( SELECT ESSN FROM WORKS_ON WHERE HOURS>10 AND PNO IN ( SELECT PNUMBER FROM PROJECT WHERE PNAME='ProductX' ) ); (b) List the names of employees who have a dependent with the same first name as themselves. SELECT LNAME, FNAME FROM EMPLOYEE, DEPENDENT WHERE SSN=ESSN AND FNAME=DEPENDENT_NAME; Another possible SQL query uses nesting as follows: SELECT LNAME, FNAME FROM EMPLOYEE WHERE EXISTS ( SELECT * FROM DEPENDENT WHERE FNAME=DEPENDENT_NAME AND SSN=ESSN ); (c) Find the names of employees that are directly supervised by 'Franklin Wong'. SELECT E.LNAME, E.FNAME FROM EMPLOYEE E, EMPLOYEE S WHERE S.FNAME='Franklin' AND S.LNAME='Wong' AND E.SUPERSSN=S.SSN; Another possible SQL query uses nesting as follows: SELECT LNAME, FNAME FROM EMPLOYEE WHERE SUPERSSN IN ( SELECT SSN FROM EMPLOYEE WHERE FNAME='Franklin' AND LNAME='Wong' ); (d) For each project, list the project name and the total hours per week (by all employees) spent on that project. SELECT PNAME, SUM (HOURS) FROM PROJECT, WORKS_ON WHERE PNUMBER=PNO GROUP BY PNAME; (e) Retrieve the names of employees who work on every project. SELECT LNAME, FNAME FROM EMPLOYEE WHERE NOT EXISTS ( SELECT PNUMBER FROM PROJECT WHERE NOT EXISTS ( SELECT * FROM WORKS_ON WHERE PNUMBER=PNO AND ESSN=SSN ) ); (f) For each department, retrieve the department name, and the average salary of employees working in that department. SELECT DNAME, AVG (SALARY) FROM DEPARTMENT, EMPLOYEE WHERE DNUMBER=DNO GROUP BY DNAME (g) Retrieve the average salary of all female employees. SELECT AVG (SALARY) FROM EMPLOYEE WHERE SEX='F'; (h) List the last names of department managers who have no dependents. SELECT LNAME, FNAME FROM EMPLOYEE WHERE EXISTS ( SELECT * FROM DEPARTMENT WHERE SSN=MGRSSN ) AND NOT EXISTS ( SELECT * FROM DEPENDENT WHERE SSN=ESSN ); II. CREATE TABLE Hotel (hotelNo CHAR(4) NOT NULL, hotelName VARCHAR(30) NOT NULL, city VARCHAR(30) NOT NULL, CONSTRAINT pk1 PRIMARY KEY (hotelNo)); CREATE TABLE Room ( roomNo CHAR(4) NOT NULL, hotelNo CHAR(4) NOT NULL, type CHAR(1) NOT NULL, price DECIMAL(4,2) NOT NULL, CONSTRAINT pk2 PRIMARY KEY (roomNo, hotelNo), CONSTRAINT ck1 CHECK (roomNo BETWEEN 1 and 100), CONSTRAINT fk1 FOREIGN KEY (hotelNo) REFERENCES Hotel ON UPDATE CASCADE ON DELETE CASCADE); CREATE TABLE Guest (guestNo CHAR(4) NOT NULL, guestName VARCHAR(50) NOT NULL, guestAddress VARCHAR(60) NOT NULL, CONSTRAINT pk3 PRIMARY KEY (guestNo)); CREATE TABLE Booking (hotelNo CHAR(4) NOT NULL, guestNo CHAR(4) NOT NULL, dateFrom DATE NOT NULL, dateTo DATE NOT NULL, roomNo CHAR(4) NOT NULL, CONSTRAINT pk4 PRIMARY KEY (hotelNo, guestNo, dateFrom), CONSTRAINT fk2 FOREIGN KEY (hotelNo) REFERENCES Hotel ON UPDATE CASCADE ON DELETE NO ACTION, CONSTRAINT fk3 FOREIGN KEY (guestNo) REFERENCES Guest ON UPDATE CASCADE ON DELETE NO ACTION, CONSTRAINT fk4 FOREIGN KEY (roomNo) REFERENCES Room ON UPDATE CASCADE ON DELETE NO ACTION); III. (a) List all hotels. Hotel (b) List all single rooms with a price below $200 per night. σtype=‘S’ Λ price < 20(Room) (c) List the names and cities of all guests. ΠguestName, guestAddress(Guest) (d) List the price and type of all rooms at the Grosvenor Hotel. Πprice, type(Room hotelNo (σhotelName = ‘Grosvenor Hotel’(Hotel))) (e) List all guests currently staying at the Grosvenor Hotel. R1 = Booking Answer = Guest (σ hotelName = ‘Grosvenor Hotel’ (σdateFROM ≤ (Hotel)) ’06-18-11’ ∧ dateTo ≥ ’06-18-11’ (assuming today’s date is June 18th, 2011 ( R1)) IV. a. Insert rows into each of these tables. INSERT INTO Hotel VALUES (‘H111’, ‘Hilton Hotel’, ‘Washington’); INSERT INTO Room VALUES (‘1’, ‘H111’, ‘S’, 72.00); b. Update the price of all rooms by 5%. UPDATE Room SET price = price*1.05; c. List full details of all hotels in London. SELECT * FROM Hotel WHERE city = ‘London’; d. List the names and addresses of all guests living in London, alphabetically ordered by name. SELECT guestName, guestAddress FROM Guest WHERE address LIKE ‘%Washington%’ ORDER BY guestName; Strictly speaking, this would also find rows with an address like: ‘10 Washington Avenue, New York’. e. How many hotels are there? SELECT COUNT(*) FROM Hotel; f. What is the average price of a room? SELECT AVG(price) FROM Room; g. List the price and type of all rooms at the Grosvenor Hotel. SELECT price, type FROM Room WHERE hotelNo = (SELECT hotelNo FROM Hotel WHERE hotelName = ‘Grosvenor’); h. What is the total revenue per night from all double rooms? SELECT SUM(price) FROM Room WHERE type = ‘D’; (soln to I is similar to g) j. List all guests currently staying at the Hilton Hotel. SELECT * FROM Guest WHERE guestNo = (SELECT guestNo FROM Booking WHERE dateFrom <= CURRENT_DATE AND dateTo >= CURRENT_DATE AND hotelNo = (SELECT hotelNo FROM Hotel WHERE hotelName = ‘Hilton’)); k. What is the total income from bookings for the Hilton Hotel today? SELECT SUM(price) FROM Booking b, Room r, Hotel h WHERE (dateFrom <= CURRENT_DATE AND dateTo >= CURRENT_DATE) AND r.hotelNo = h.hotelNo AND r.roomNo = b.roomNo AND hotelName = ‘Hilton ’; l. What is the lost income from unoccupied rooms at the Hilton Hotel? SELECT SUM(price) FROM Room r WHERE roomNo NOT IN (SELECT roomNo FROM Booking b, Hotel h WHERE (dateFrom <= CURRENT_DATE AND dateTo >= CURRENT_DATE) AND b.hotelNo = h.hotelNo AND hotelName = ‘Hilton Hotel’); m. List the number of rooms in each hotel. SELECT hotelNo, COUNT(roomNo) AS count FROM Room GROUP BY hotelNo; n. List the number of rooms in each hotel in Washington. SELECT hotelNo, COUNT(roomNo) AS count FROM Room r, Hotel h WHERE r.hotelNo = h.hotelNo AND city = ‘Washington’ GROUP BY hotelNo; o. What is the average number of bookings for each hotel in August? SELECT AVG(X) FROM (SELECT hotelNo, COUNT(hotelNo) AS X FROM Booking b WHERE (dateFrom <= DATE’2010-08-01’ AND dateTo >= DATE’2010-08-01’) OR (dateFrom >= DATE’2010-08-01’ AND dateFrom <= DATE’2010-08-31’) GROUP BY hotelNo); p. What is the most commonly booked room type for each hotel in Washington? SELECT MAX(X) FROM (SELECT type, COUNT(type) AS X FROM Booking b, Hotel h, Room r WHERE r.roomNo = b.roomNo AND b.hotelNo = h.hotelNo AND city = ‘Washington’ GROUP BY type);