Download presentation
Presentation is loading. Please wait.
Published bySharlene Mathews Modified over 8 years ago
1
CS 3630 Database Design and Implementation
2
Joins Retrieve data from two or more tables Join Conditions PK and FK (Natural Join) Other attributes (Theta Join) Based on Cartesian Product Implementation Nested loops Optimization 2
3
Tables Schemas Assignment 7 3
4
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 4
5
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.* 5
6
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 6
7
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 use the new style! 7
8
Joins: New Style -- Distinctive or Unique Select Distinct Guest.* From Guest Join Booking on Guest.Guest_no = Booking.Guest_no; -- Duplicate records Select Guest.* From Guest Join Booking on Guest.Guest_no = Booking.Guest_no; 8
9
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; Pause -- 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 9
10
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 Heading “Guest Name” Col address format a21 10
11
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 11
12
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; 12
13
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 13
14
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, Guest_name, Date_from; 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, Guest_no; 14
15
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? 15
16
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 only? 16
17
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? 17
18
Current Year with Assumption -- For each hotel, display Hotel number with hotel name -- and number of bookings of the hotel for this year. -- Assume no booking is longer than 1 year. Select H.Hotel_No, 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; 18
19
Be Careful about And/Or -- For each hotel, display Hotel number with hotel name -- and number of bookings of the hotel for this year. -- Assume no booking is longer than 1 year. Select H.Hotel_No, 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; -- and ((to_char(Date_From, 'yyyy') = to_char(SysDate, 'yyyy')) -- or -- (to_char(Date_To, 'yyyy') = to_char(SysDate, 'yyyy'))) 19
20
Join and Where -- For each hotel, display Hotel number with hotel name -- and number of bookings of the hotel for this year. -- Assume no booking is longer than 1 year. Select H.Hotel_No, name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Where 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 -- Same result for the query -- But one is Join condition -- the other is selection condition -- We should do it this way! 20
21
Current Year without Assumption -- For each hotel, display Hotel number with hotel name -- and number of bookings of the hotel for this year. -- No assumptions: booking could be longer than one year. Select H.Hotel_No, name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Where 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; 21
22
Current Year without Assumption -- For each hotel, display Hotel number with hotel name -- and number of bookings of the hotel for this year. -- No assumptions. Select H.Hotel_No, name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Where 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’ -- Not ‘yyyy’ -- Not ‘mm yyyy’ 22
23
Group By and Having -- For each hotel with at least 3 bookings this -- year, display Hotel number with the name and the number -- of bookings of the hotel this year. -- With assumption Select H.Hotel_no, name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Where 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; 23
24
Group By and Having -- For each hotel with more than 5 bookings, -- display Hotel number with name and the number -- of bookings of the hotel. Select H.Hotel_No, name, count(*) From Hotel H Join Booking B on H.Hotel_no = B.Hotel_no Group by H.Hotel_No, name Having Count(*) > 5; 24
25
Schedule Assignment 9: Join Due Friday, April 22 Quiz 4 Wednesday, April 27 Join Assignment 9 25
26
Project PhaseTwo List all names on the first page! Due Monday, April 11, by 5 PM Upload to D2L 26
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.