Presentation is loading. Please wait.

Presentation is loading. Please wait.

Project Phase I Phase II Due Monday, April 15 Groups 1.

Similar presentations


Presentation on theme: "Project Phase I Phase II Due Monday, April 15 Groups 1."— Presentation transcript:

1 Project Phase I Phase II Due Monday, April 15 Groups 1

2 Joins Retrieve data from two or more tables Common Attributes PK and FK Other attributes Based on Cartesian Product Implementation Nested loops Optimization 2

3 Joins List all guests who have at least one booking. (We keep all guests even they don’t have any bookings.) -- Which table(s)? -- Guest (Guest_no, Guest_Name, Address) -- PK: Guest_no -- Booking (HoteL_no, Guest_no,...) -- PK: Hotel_no, Guest_No, Date_From -- FK: Guest_no references Guest Select Guest.* From Guest, Booking Where Guest.Guest_no = Booking.Guest_no; -- Run in Oracle -- Duplicate records 3

4 Joins List all guests who have at least one booking. Select Guest.* From Guest, Booking Where Guest.Guest_no = Booking.Guest_no; Why duplicate records? For every g in Guest For every b in Booking If g.Guest_no = b.Guest_no Then Select g.* 4

5 Joins List all guests who have at least one booking. Remove duplicate records! Select Distinct Guest.* From Guest, Booking Where Guest.Guest_no = Booking.Guest_no; -- Could use Unique 5

6 Joins: New Style Select Distinct Guest.* From Guest Join Booking on Guest.Guest_no = Booking.Guest_no; Select Distinct Guest.* From Guest, Booking Where Guest.Guest_no = Booking.Guest_no; We should use the new style! 6

7 Using Short Table Names List all guests who have at least one booking. Select Distinct G.* From Guest G Join Booking B on G.Guest_no = B.Guest_no; -- Cannot use the original table name any more Select Distinct Guest.* From Guest G Join Booking B on Guest.Guest_no = B.Guest_no ERROR at line 1: ORA-00904: "GUEST"."GUEST_NO": invalid identifier 7

8 Joins List all guests who have at least one booking with the details of each booking. -- No need for Distinct -- All columns from both tables Select * From Guest G Join Booking B on G.Guest_no = B.Guest_no; Set linesize 100 Col Guest_name Format a14 Col address format a21 8

9 Joins What if no common attribute is specified? Select G.* From Guest G, Booking B; -- Where G.Guest_no = B.Guest_no; -- Cartesian product! Select Distinct G.* From Guest G Join Booking B; -- on G.Guest_no = B.Guest_no; ERROR at line 3: ORA-00905: missing keyword 9

10 Join not on PK/FK List all guests who are in a city where there is also a hotel. Assuming Address is City. Select Distinct G.* From Guest G Join Hotel H on G.Address = H.Address; 10

11 Joins: Three Tables List Hotel name, guest name and date_from for all bookings, sorted by hotel_no in ascending order and then by guest_no in descending order. Which tables? Hotel Name: Hotel Guest Name: Guest Date_From : Booking Select H.name, G.Guest_name, Date_from From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Join Guest G on G.Guest_no = B.Guest_no Order By H.Hotel_No, G.Guest_no desc; -- H.Hotel_No, G.Guest_no not selected 11

12 Joins: Three Tables -- List Hotel name, guest name and date_from -- for all bookings. -- Sort the result Select H.name, G.Guest_name, Date_from From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Join Guest G on G.Guest_no = B.Guest_no Order By H.name, G.Guest_name, Date_from; -- Sort by name Select H.name, G.Guest_name, Date_from From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Join Guest G on G.Guest_no = B.Guest_no Order By H.Hotel_No, G.Guest_no; -- Sort by Hotel_No 12

13 Joins with Group By -- For each hotel, display Hotel name and number of -- bookings of the hotel. -- Tables: -- Hotel, Booking Select name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Group by H.Hotel_No; -- Will it work? 13

14 Joins with Group By -- For each hotel, display Hotel name and number of -- bookings of the hotel. -- Tables: -- Hotel, Booking -- Must also Group by name Select name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Group by H.Hotel_No, name; -- What if group by name? 14

15 Joins with Group By -- For each hotel, display Hotel name and -- number of bookings of the hotel. Select name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Group by H.Hotel_No, name; // Missing hotels without bookings // How to display a zero for such hotels? 15

16 Current Year with Assumption -- For each hotel, display Hotel name and -- number of bookings of the hotel for this year. -- Assume no booking is longer than 1 year. Select name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no and ((to_char(Date_From, 'yyyy') = to_char(SysDate, 'yyyy')) or (to_char(Date_To, 'yyyy') = to_char(SysDate, 'yyyy'))) Group by H.Hotel_No, name; -- could use where after join condition -- they are the same 16

17 Current Year without Assumption -- For each hotel, display Hotel name and -- number of bookings of the hotel for this year. -- No assumptions. Select name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no and ((to_char(Date_From, 'yyyy') = to_char(SysDate, 'yyyy')) or (to_char(Date_To, 'yyyy') = to_char(SysDate, 'yyyy')) or ((to_char(Date_From, 'yyyy') < to_char(SysDate, 'yyyy')) and (to_char(Date_To, 'yyyy') > to_char(SysDate, 'yyyy')))) Group by H.Hotel_No, name; 17

18 Current Year without Assumption -- For each hotel, display Hotel name and -- number of bookings of the hotel for this year. -- No assumptions. Select name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no and to_char(Date_From, 'yyyy') <= to_char(SysDate, 'yyyy') and to_char(Date_To, 'yyyy') >= to_char(SysDate, 'yyyy') Group by H.Hotel_No, name; -- How to make it work for the current month? -- use ‘yyyy mm’ instead of ‘yyyy’ 18

19 Group By and Having -- For each hotel with at least 3 bookings this -- year, display Hotel name and the number of -- bookings of the hotel this year. -- With assumption Select name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no and (to_char(sysDate, 'yyyy') = to_char(date_to, 'yyyy') or to_char(sysDate, 'yyyy') = to_char(date_from,'yyyy')) Group by H.Hotel_No, name Having Count(*) >= 3; 19

20 Group By and Having -- For each hotel with more than 5 bookings, -- display Hotel name and the number of -- bookings of the hotel. Select name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Group by H.Hotel_No, name Having Count(*) > 5; 20

21 Schedule Assignment 9: Join Due Wednesday, April 24 Quiz 3 Friday, April 19 No Join Assignment 7 & 8 21


Download ppt "Project Phase I Phase II Due Monday, April 15 Groups 1."

Similar presentations


Ads by Google