01p SQL
01p SQL
2014-2015
In this practical, you will execute all the SQL statements you wrote in Tutorial 04 and 05 in PostgreSQL, an
open-source relational database. For PostgreSQL documentation, please see postgresql.org/docs/
Step 2: Connect to the database server PostgreSQL using username and password 'postgres'.
Step 3: Right-click on Databases and create a new database, 'hotel_db'.
Step 4: Use the Query Tool to execute SQL statements (given below) to create, populate and query the
hotel, room, guest and booking tables. These SQL statements were discussed in Tutorial 04 and 05.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create and populate 'hotel' table
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
INSERT INTO hotel VALUES ('H001', 'The Oberoi', 'Pointe aux Piments');
INSERT INTO hotel VALUES ('H002', 'Constance Le Prince', 'Flacq');
INSERT INTO hotel VALUES ('H003', 'LUX Le Morne', 'Le Morne');
INSERT INTO hotel VALUES ('H004', 'LUX Grand Gaube', 'Grand Gaube');
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create and populate 'room' table
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create and populate 'guest' table
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
INSERT INTO guest VALUES ('G001', 'John White', '5, St James st., London, UK');
INSERT INTO guest VALUES ('G002', 'Emilie Villiers', '6, rue Teresa, Paris, France');
INSERT INTO guest VALUES ('G003', 'Sunita Jain', '15, Delhi road, Mumbai, India');
INSERT INTO guest VALUES ('G004', 'Jean Jacques', '30, rue Pima, Port-Mathurin, Rodrigues');
INSERT INTO guest VALUES ('G005', 'Susan Brand', '8, Oxford st., Melbourne, Australia');
INSERT INTO guest VALUES ('G006', 'Julie Lee', '5, St David st., Manchester, UK');
INSERT INTO guest VALUES ('G007', 'Tom Jones', '44, Halloween st., London, UK');
INSERT INTO guest VALUES ('G008', 'Paul MacCartney', '5, St James st., Liverpool, UK');
INSERT INTO guest VALUES ('G009', 'John Smith', '16, Aberdeen road, Leeds, UK');
INSERT INTO guest VALUES ('G010', 'Jenny Brown', '10, rue Stanislas, Nancy, France');
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create and populate 'booking' table
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create a separate table with the same structure as the Booking table to hold
-- archive records.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Using the INSERT statement, copy the records from the Booking table to the
-- archive table relating to bookings before 1 November 2014.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Delete all bookings before 1 November 2014 from the Booking table.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create a view containing the hotel name and the names of the guests
-- staying at the hotel.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create a view containing the account for each guest at 'LUX Le Morne' hotel.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Give the users Manager and Director full access to HotelData view,
-- with the privilege to pass the access on to other users.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Give the users Manager and Director full access to BookingOutToday view,
-- with the privilege to pass the access on to other users.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Give the user Accounts SELECT access to these views.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Now revoke the access from this user.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List full details of all hotels.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT *
FROM Hotel;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List full details of all hotels in 'Flacq'.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT *
FROM Hotel
WHERE city = 'Flacq';
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the names and addresses of all guests living in London,
-- alphabetically ordered by name.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List all double or family rooms with a price below 95.00 per night,
-- in ascending order of price. SOLUTION 1
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT *
FROM Room
WHERE price < 95
AND (type = 'Double'
OR type = 'Family')
ORDER BY price;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List all double or family rooms with a price below 40.00 per night,
-- in ascending order of price. SOLUTION 2
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT *
FROM Room
WHERE price < 95
AND type IN ('Double', 'Family')
ORDER BY price;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the bookings for which no dateTo has been specified.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT *
FROM Booking
WHERE dateTo IS NULL;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- How many hotels are there?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT COUNT(*)
FROM Hotel;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the average price of a room?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT AVG(price)
FROM Room;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the total revenue per night from all double rooms?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT SUM(price)
FROM Room
WHERE type = 'Double';
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- How many different guests have made bookings for November 2014?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the price and type of all rooms at 'The Oberoi' Hotel. SOLUTION 1
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the price and type of all rooms at 'The Oberoi' Hotel. SOLUTION 2
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List all guests currently staying at 'The Oberoi' Hotel. SOLUTION 1
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
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 = 'The Oberoi'
)
);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List all guests currently staying at 'The Oberoi' Hotel. SOLUTION 2
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the details of all rooms at 'The Oberoi' Hotel, including the name of
-- the guest staying in the room, if the room is occupied.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT r.*
FROM Room r, Guest g, Booking b, Hotel h
WHERE hotelName= 'The Oberoi'
AND dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE
AND h.hotelNo = r.hotelNo
AND h.hotelNo = b.hotelNo
AND r.hotelNo = b.hotelNo
AND g.guestNo = b.guestNo
AND r.roomNo = b.roomNo;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the total income from bookings for 'The Oberoi' Hotel today?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT SUM(price)
FROM Booking b, Room r, Hotel h
WHERE (dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE)
AND hotelName = 'The Oberoi'
AND h.hotelNo = r.hotelNo
AND h.hotelNo = b.hotelNo
AND r.hotelNo = b.hotelNo
AND r.roomNo = b.roomNo ;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the rooms that are currently unoccupied at 'The Oberoi' Hotel.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT *
FROM Room r, Hotel h
WHERE h.hotelNo = r.hotelNo
AND h.hotelName = 'The Oberoi'
AND roomNo NOT IN
(SELECT roomNo
FROM Booking b, Hotel hh
WHERE (dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE)
AND b.hotelNo = hh.hotelNo
AND hh.hotelName = 'The Oberoi'
);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the lost income from unoccupied rooms at the Grosvenor Hotel?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT SUM(price)
FROM Room r, Hotel h
WHERE h.hotelNo = r.hotelNo
AND h.hotelName = 'The Oberoi'
AND roomNo NOT IN
(SELECT roomNo
FROM Booking b, Hotel hh
WHERE (dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE)
AND b.hotelNo = hh.hotelNo
AND hh.hotelName = 'The Oberoi'
);
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the number of rooms in each hotel.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the number of rooms in each hotel in 'Flacq'.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the average number of bookings for each hotel in August?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT AVG(temp.X)
FROM
( SELECT hotelNo, COUNT(hotelNo) AS X
FROM Booking b
WHERE (dateFrom <= '2014-11-01'
AND dateTo >= '2014-11-01')
OR (dateFrom >= '2014-11-01'
AND dateFrom <= '2014-11-30')
GROUP BY hotelNo
) AS temp;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the most commonly booked room type for each hotel in 'Flacq'?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
SELECT temp.type
FROM
( SELECT r.type, COUNT(type) AS X
FROM Booking b, Hotel h, Room r
WHERE h.hotelNo = r.hotelNo
AND h.hotelNo = b.hotelNo
AND r.hotelNo = b.hotelNo
AND r.roomNo = b.roomNo
AND h.city = 'Flacq'
GROUP BY r.type
ORDER BY X DESC
) AS temp
LIMIT 1;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the lost income from unoccupied rooms at each hotel today?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Update the price of all rooms by 0.5%.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
UPDATE Room
SET price = price*0.05;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --