(a) Retrieve the names of employees in department 5 who work

advertisement
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);
Download