11
1 CALIFORNIA STATE UNIVERSITY, SACRAMENTO College of Business Administration Nancy Tsai MIS 150 Database Management Systems for Business Chapter 6 SQL: Data Manipulation Hotel (hotelno , hotelname, city) Room (roomno , hotelno , type, price) Booking (hotelno , guestno , datefrom , dateto, roomno ) Guest (guestno , guestname, guestaddress) Simple Queries 7. List full details of all hotels. The Hotel table contains all the information related to the hotel so we can use “select” without any where condition to get the answer. SELECT * FROM hotel; 8. List all details of all hotels in London. The Hotel table contains all the information required for the report so we can use “select” with a where condition (London) to get the answer. SELECT * FROM hotel WHERE city = 'London'; 9. List the names and addresses of all guests in London, alphabetically ordered by name. The Guest table contains all the information required for the report so we can use “select” with a where condition to get the answer and order the output by guest name. SELECT guestname, guestaddress FROM guest WHERE guestaddress like ‘London’ ORDER BY guestname; 10. List all double or family rooms with a price below $40. 00 per night, in ascending order of price.

Chapter 6 Solution 12 s

Embed Size (px)

Citation preview

Page 1: Chapter 6 Solution 12 s

1

CALIFORNIA STATE UNIVERSITY, SACRAMENTO

College of Business Administration

Nancy Tsai

MIS 150 – Database Management Systems for Business

Chapter 6 – SQL: Data Manipulation

Hotel (hotelno, hotelname, city)

Room (roomno, hotelno, type, price)

Booking (hotelno, guestno, datefrom, dateto, roomno)

Guest (guestno, guestname, guestaddress)

Simple Queries

7. List full details of all hotels.

The Hotel table contains all the information related to the hotel so we can use “select” without

any where condition to get the answer.

SELECT *

FROM hotel;

8. List all details of all hotels in London.

The Hotel table contains all the information required for the report so we can use “select” with a

where condition (London) to get the answer.

SELECT *

FROM hotel

WHERE city = 'London';

9. List the names and addresses of all guests in London, alphabetically ordered by name.

The Guest table contains all the information required for the report so we can use “select” with a

where condition to get the answer and order the output by guest name.

SELECT guestname, guestaddress

FROM guest

WHERE guestaddress like ‘London’

ORDER BY guestname;

10. List all double or family rooms with a price below $40. 00 per night, in ascending order of

price.

Page 2: Chapter 6 Solution 12 s

2

The Room table contains all the information related to the room so we can use “select” to get the

records that satisfies the two where conditions and order the output by price.

SELECT *

FROM room

WHERE price < 40 AND type IN ('Double', 'Family')

ORDER BY price;

11. List the bookings for which no dateto has been specified.

The Booking table contains all the information related to the booking so we can use “select” to

get the records that satisfies one where condition (null).

SELECT *

FROM booking

WHERE dateto IS NULL;

Aggregate Functions

12. How many hotels are there?

We can use the “count” function on hetelno (the primary key) of the Hotel table to get the

answer. We can also use the “*” to count the number of rows in the Hotel relation since there is

no duplication of hotel in the Hotel relation

SELECT COUNT(hotelno)

FROM hotel;

Or

SELECT COUNT(*)

FROM hotel;

13. What is the average price of a room?

We can use the average function on price in the Room table to get the answer.

SELECT AVG(price)

FROM room;

14. What is the total revenue per night from all double rooms?

We can use the “sum” function on price in the Room table with a where condition to get the

answer.

SELECT SUM(price)

Page 3: Chapter 6 Solution 12 s

3

FROM room

WHERE type = 'Double';

15. How many different guests have made bookings for August?

We need to use the “count” function with “distinct” and where condition for the Booking table to

get the answer. We use “distinct” to eliminate any duplicated guest number.

SELECT COUNT (DISTINCT guestno)

FROM booking

WHERE (datefrom <= ‘8/31/year’ AND dateto >= ‘8/1/year’);

Subqueries and Joins

16. List the price and type of all rooms at the Grosvenor Hotel.

We need the information from Room table and Hotel table for the Grosvenor as the hotel name.

Therefore, we use “select” to required column names by joining the Room table and Hotel table

and the hotel name equal to Grosvenor.

SELECT price, type

FROM room, hotel

WHERE hotel.hotelno = room.hotelno AND hotelname = 'Grosvenor';

17. List all guests currently staying at the Grosvenor Hotel.

We need Hotel table for the Grosvenor, Booking table for the currently staying, and Guest table

for the guest information. Therefore, we join these three tables together with date condition

(currently staying ) and hotel condition (Grosvenor) for the answer.

SELECT (guestno, guestname, guestaddress)

FROM guest, booking, hotel

WHERE guest.guestno =booking.guestno AND hotel.hotelno = booking.hotelno

AND (datefrom <= ‘SYSTEM DATE’ AND dateto >= ‘SYSTEM DATE’)

AND hotelname = ‘Grosvenor’;

Or, we can use a row subquery and a scalar subquery. First, we use a simple select statement to

get the hotel number of the Grosvenor from the Hotel table in the most inner query. Second, we

use a simple select statement to get a list of guest numbers who are currently staying in the hotel

number equal to the Grosvenor from the Booking table in the middle query. Third, we use

another select statement to get every column names from Guest table for the guest number is in

the middle query.

SELECT *

FROM guest

WHERE guestno IN

Page 4: Chapter 6 Solution 12 s

4

(SELECT guestno

FROM booking

WHERE datefrom <= ‘SYSTEM DATE’

AND dateto >= ‘SYSTEM DATE’ AND

hotelno =

(SELECT hotelno

FROM hotel

WHERE hotelname = ‘Grosvenor’));

18. List the details of all rooms at the Grosvenor Hotel, including the name of the guest staying

in the room, if the room is occupied.

We get every room in the Grosvenor hotel by joining hotel and room tables. We get every room

with a guest not by joining hotel, room, book and guest tables for Grosvenor hotel. We then left

outer join the every room in the Grosvenor hotel with a guest in the room of the Grosvenor hotel

to get the final answer.

(SELECT r.hotelno, r.roomno, r.type, r.price

FROM hotel h, room r

WHERE h.hotelname ='Grosvenor’ AND h.hotelno = r.hotelno)

LEFT JOIN

(SELECT r.hotelno, r.roomno, r.type, r.price, g.guestname

FROM hotel h, room r, booking b, guest g

WHERE h.name = ‘Grosvenor’ AND

(b.datefrom <= ‘SYSTEM DATE’ AND b.dateto >= ‘SYSTEM DATE’) AND

h.hotelno = r.hotelno AND r.hotelno = b.hotelno AND

r.roomno = b.roomno AND b.guestno = g.guestno)

ON r.roomno = b.roomno;

19. What is the total income from bookings for the Grosvenor Hotel today?

We need Hotel table for the Grosvenor, Booking table for the currently staying, and Room table

for the income (price) information. Therefore, we join these three tables together with date

condition (currently staying) and hotel condition (Grosvenor) for the answer. Note that room has

two column names as its primary key. Therefore, we need two joins for joining Room table and

Booking table.

SELECT SUM(price)

FROM booking b, room r, hotel h

WHERE (b.datefrom <= ‘SYSTEM DATE’ AND b.dateto >= ‘SYSTEM DATE’)

AND r.hotelno = h.hotelno AND r.hotelno = b.hotelno AND r.roomno = b.roomno AND

h.hotelname = ‘Grosvenor’;

20. List the rooms which are currently unoccupied at the Grosvenor Hotel.

We use a select statement to get a list of the occupied room number (currently having a gust

staying in the room) of the Grosvenor by joining the Hotel table and Booking table with a

Page 5: Chapter 6 Solution 12 s

5

currently booking condition and Grosvenor condition in the inner query. Second, we use another

select statement to get unoccupied room by getting every room in the Grosvenor that is not in

the room number list with a guest generated from the inner query.

SELECT (r.hotelno, r.roomno, r.type, r.price)

FROM room r, hotel h

WHERE r.hotelno = h.hotelno AND h.hotelname = 'Grosvenor’

AND roomno NOT IN

(SELECT roomno

FROM booking b, hotel h

WHERE (datefrom <= ‘SYSTEM DATE’ AND dateto >= ‘SYSTEM DATE’)

AND b.hotelno=h.hotelno AND hotelname = 'Grosvenor');

Or we use a select statement to get a list of the occupied room (currently having a gust staying in

the room) of the Grosvenor by joining the Hotel table, Room table and Booking table with a

currently booking condition and Grosvenor condition in the inner query. Second, we use another

select statement to get unoccupied room by getting every room in the Grosvenor that does not

exist in the booked rooms with a guest generated from the inner query.

SELECT (r.hotelno, r.roomno, r.type, r.price)

FROM room r, hotel h

WHERE r.hotelno = h.hotelno AND h.hotelname = 'Grosvenor’

AND NOT EXISTS

(SELECT *

FROM booking b

WHERE (datefrom <= ‘SYSTEM DATE’ AND dateto >= ‘SYSTEM DATE’)

AND r.hotelno=b.hotelno AND r.roomno=b.roomno AND r.hotelno=h.hotelno

AND hotelname = 'Grosvenor');

21. What is the lost income from unoccupied rooms at the Grosvenor Hotel?

We use a select statement to get a list of the occupied room number (currently having a gust

staying in the room) of the Grosvenor by joining the Hotel table and Booking table with a

currently booking condition and Grosvenor condition in the inner query. Second, we use another

select statement to get unoccupied room by getting every room in the Grosvenor that is not in

the room number list with a guest generated from the inner query. Finally, we get the total of the

price for these unoccupied rooms.

SELECT SUM(price)

FROM room r, hotel h

WHERE r.hotelno = h.hotelno AND h.hotelname = 'Grosvenor’

AND roomno NOT IN

(SELECT roomno FROM booking b, hotel h

WHERE (datefrom <= ‘SYSTEM DATE’ AND dateto >= ‘SYSTEM DATE’)

AND b.hotelno = h.hotelno AND h.hotelname = 'Grosvenor');

Page 6: Chapter 6 Solution 12 s

6

Or we use a select statement to get a list of the occupied room (currently having a gust staying in

the room) of the Grosvenor by joining the Hotel table, Room table and Booking table with a

currently booking condition and Grosvenor condition in the inner query. Second, we use another

select statement to get unoccupied room by getting every room in the Grosvenor that does not

exist in the booked rooms with a guest generated from the inner query. Finally, we get the total

of the price for these unoccupied rooms.

SELECT SUM(price)

FROM room r, hotel h

WHERE r.hotelno = h.hotelno AND h.hotelname = 'Grosvenor’

AND NOT EXISTS

(SELECT * FROM booking b

WHERE (datefrom <= ‘SYSTEM DATE’AND dateto >= ‘SYSTEM DATE’)

AND b.hotelno = h.hotelno AND r.hotelno=b.hotelno AND r.roomno=b.roomno

AND h.hotelname = 'Grosvenor');

Grouping

22. List the number of rooms in each hotel.

We only need the Room table since it has the every hotel with its associated room information.

We use a select statement with a “count” function and group by the hotel number to get the

answer.

SELECT hotelno, COUNT(roomno)

FROM room

GROUP BY hotelno;

23. List the number of room in each hotel in London.

We need the Room table for number of rooms and Hotel table for hotels located in Landon. We

use a select statement with a count function, a join condition, a hotel location condition, and a

group by the hotel number to get the answer.

SELECT r.hotelno, COUNT(roomno)

FROM room r, hotel h

WHERE r.hotelno=h.hotelno AND city = 'London'

GROUP BY r.hotelno;

24. What is the average number of bookings for each hotel in August?

We use Booking table to calculate the total bookings for each hotel by using a select statement

with total function, an August staying condition, and a group by the hotel number. We then

divide the total bookings by 31 days of August to get the final answer

SELECT hotelno, COUNT(hotelno)/31

Page 7: Chapter 6 Solution 12 s

7

FROM booking

WHERE (datefrom <= ‘8/31/year’ AND dateto >= ‘8/1/year’)

GROUP BY hotelno;

25. What is the most commonly booked room type for all hotels in London?

We need the Booking table for the booked room information, Room table for the type

information, and Hotel table for the London city. We use a select statement to join these three

tables together with a count function, join conditions, and city of London condition in order to

generate the each type with its number of booking in the two subquerys (red or blue color). We

use “WHERE y = (SELECT MAX(y) FROM” to get the maximum number of booking among

all the types from the blue subquery. Then, we can select more than one type having the

maximum number of booking for the solution from the red subquery that has the maximum

number of booking from the blue subquery

SELECT type, y

FROM

(SELECT type, COUNT(type) AS y

FROM booking b, hotel h, room r

WHERE r.roomno = b.roomno AND r.hotelno = b.hotelno AND b.hotelno = h.hotelno

AND city = 'London'

GROUP BY type)

WHERE y = (SELECT MAX(y)

FROM

(SELECT type, COUNT(type) AS y

FROM booking b, hotel h, room r

WHERE r.roomno = b.roomno AND r.hotelno = b.hotelno AND b.hotelno = h.hotelno AND

AND city = 'London'

GROUP BY type);

Subquery output table

Type Count(type)

T 200

D 500

Q 180

K 150

F 500

S 50

Assume that red and blue subquerys will generate the subquery output table since the SQL

statements are identical in both subquerys. The ”WHERE y = (SELECT MAX(y)

FROM” will generate maximum 500 without the type. We select the type and y that has the

maximum 500 from the red subquery (containing every type with its number of booked rooms as

shown in the subquery output table). The final output table is show below.

Page 8: Chapter 6 Solution 12 s

8

Final output table

Type y

D 500

F 500

26. What is the lost income from unoccupied rooms at each hotel today?

We use a select statement to get a list of the occupied room (currently having a gust staying in

the room) of every hotel by joining the Hotel table, Room table and Booking table with a

currently booking condition and group by hotel number in the inner query. Second, we use

another select statement to get unoccupied room by getting every room in each hotel that does

not exist in the booked rooms with a guest generated from the inner query. Finally, we get the

total of the price for these unoccupied rooms for each hotel.

SELECT r.hotelno, SUM(price)

FROM room r

WHERE NOT EXISTS

(SELECT *

FROM booking b

WHERE r.roomno = b.roomno AND r.hotelno = b.hotelno AND

(datefrom <= ‘SYSTEM DATE’ AND dateto >= ‘SYSTEM DATE’))

GROUP BY hotelno;

Populating tables

27. Insert rows into each of these tables.

We use insert statement to input the values into the Hotel table and Room table. You can do the

other two tables.

INSERT INTO hotel

VALUES (‘h11’, ‘hilton’, ‘sacramento’);

INSERT INTO room

VALUES (‘hr1111’, ‘h11’, ‘single’, 120);

28. Update the price of all room by 5%.

UPDATE room

SET price = price*1.05;

Employee (empNo, fName, lName, address, DOB, sex, position, deptNo)

Department (deptNo, deptName, mgrEmpNo)

Project (projNo, projName, deptNo)

WorksOn (empNo, projNo, dateWorked, hoursWorked)

Page 9: Chapter 6 Solution 12 s

9

29. List all employees in alphabetical order of surname, and then first name.

We use a select statement with an order by for the Employee table to get the answer. Or, we can

use * to replace every column name of the Emplyee table.

SELECT (empNo, fName, lName, address, DOB, sex, position, deptNo)

FROM employee

ORDER BY lName, fName;

Or

SELECT *

FROM employee

ORDER BY lName, fName;

30. List all the details of employees who are female.

We use a select statement with female condition for the Employee table to get the answer. Or,

we can use * to replace every column name of the Emplyee table.

SELECT (empNo, fName, lName, address, DOB, sex, position, deptNo)

FROM employee

WHERE sex = ‘female’;

Or

SELECT *

FROM employee

WHERE sex = ‘female’;

31. List the names and addresses of all employees who are Managers.

We use a select statement with manger condition for the Employee table to get the required

column names.

SELECT (fName, lName, address)

FROM employee

WHERE position = ‘Manager’;

32. Produce a list of the names and addresses of all employees who work for the IT department.

We use a select statement with department name condition and join condition for the Employee

table and Department table to get the required column names.

SELECT (fName, lName, address)

FROM employee e, department, d

Page 10: Chapter 6 Solution 12 s

10

WHERE e.depNo = d.depNo AND depName = ‘IT’;

33. Produce a complete list of all managers who are due to retire this year, in alphabetical order

of surname.

We use a select statement with a position condition, a DOB condition and ORDER BY for the

Employee table to get the answers. Or, we can use * to replace every column name of the

Emplyee table.

SELECT (empNo, fName, lName, address, DOB, sex, position, deptNo)

FROM employee

WHERE position = “manager” AND (DOB year – system year) >= 65

ORDER BY lName;

Or

SELECT *

FROM employee

WHERE position = “manager” AND (DOB –system year) >= 65

ORDER BY lName;

34. Find out how many employees are managed by “James Adams”.

We use a select statement to get a list of the department number by joining the Employee table

and Department table with a name condition and a position condition in the inner query. Second,

we use another select statement with a logical operator IN to get total number of employees

working in the same department and managed by James Adams.

SELECT COUNT(empNo)

FROM employee e

WHERE deptNo IN

(SELECT deptNo

FROM employee e,

WHERE fName = ‘James AND lName = ‘Adams’ AND position = ‘manager’);

35. Produce a report of the total hours worked by each employee, arranged in order of

department number and within department, alphabetically by employee surname.

We use a select statement to join employee table, project table, and workson table with a SUM

function, GROUP BY to get department number, employee name, employee number, and total

hours worked by each employee, and ORDER BY department number and last name of

employee.

SELECT deptNo, empNo, fName, lName, SUM(hoursWorked)

FROM employee e, project p, workson w

WHERE e.empNo = w.empNo AND w.projNo = p.projNo

Page 11: Chapter 6 Solution 12 s

11

GROUP BY (deptNo, empNo, fName, lName)

ORDER BY deptNo, lName;

36. For each project on which more than two employees worked, list the project number, project

name, and the number of employees who work on that project.

We use a select statement to join project table and workson table with a COUNT function,

GROUP BY and HAVING condition (more than two employees worked for that project) to get

project number, project name, and number of employees.

SELECT porjNo, projName, COUNT(empNo)

FROM project p, workson w

WHERE w.projNo = p.projNo

GROUP BY (deptNo, projName)

HAVING COUNT(empNo) > 2;

37. List the total number of employees in each department for those departments with more than

10 employees. Create an appropriate heading for the columns of the results table.

We use a select statement to join department table and employee table with a COUNT function,

GROUP BY and HAVING condition (more than 10 employees worked for that department) to

get department number, department name, and number of employee.

SELECT deptNo AS Department No, deptName AS Departmtne Name, COUNT(empNo) AS

No Of Employee

FROM employee e, department d

WHERE e.deptNo = d.deptNo

GROUP BY (deptNo, deptName)

HAVING COUNT(empNo) > 10;