Presentation is loading. Please wait.

Presentation is loading. Please wait.

CS 3630 Database Design and Implementation. Joins Retrieve data from two or more tables Join Conditions PK and FK (Natural Join) Other attributes (Theta.

Similar presentations


Presentation on theme: "CS 3630 Database Design and Implementation. Joins Retrieve data from two or more tables Join Conditions PK and FK (Natural Join) Other attributes (Theta."— Presentation transcript:

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


Download ppt "CS 3630 Database Design and Implementation. Joins Retrieve data from two or more tables Join Conditions PK and FK (Natural Join) Other attributes (Theta."

Similar presentations


Ads by Google