Native Relational Operations (Cont.)


Join (Cont.)

customer
cid cname city discnt
c001 TipTop Duluth 10.00
c002 Basics Dallas 12.00
c003 Allied Dallas 8.00
c004 ACME Duluth 8.00
c006 ACME Kyoto 0.00

product
pid pname city quantity price
p01 comb Dallas 111400 0.50
p02 brush Newark 203000 0.50
p03 razor Duluth 150600 1.00
p04 pen Duluth 125300 1.00
p05 pencil Dallas 221400 1.00
p06 folder Dallas 123100 2.00
p07 case Newark 100500 1.00
order3
orderno month cid aid pid qty dollar
1011 jan c001 a01 p01 1000 450.00
1012 jan c001 a01 p01 1000 450.00
1019 feb c001 a02 p02 400 180.00
1017 feb c001 a06 p03 600 540.00
1018 feb c001 a03 p04 600 540.00
1023 mar c001 a04 p05 500 450.00
1022 mar c001 a05 p06 400 720.00
1025 apr c001 a05 p07 800 720.00
1013 jan c002 a03 p03 1000 880.00
1026 may c002 a05 p03 800 704.00
1015 jan c003 a03 p05 1200 1104.00
1014 jan c003 a03 p05 1200 1104.00
1021 feb c004 a06 p01 1000 460.00
1016 jan c006 a01 p01 1000 500.00
1020 feb c006 a03 p07 600 600.00
1024 mar c006 a06 p01 800 400.00

Query: Find the names of customers who have ordered product p01.
CNP01 := (CUSTOMER ∞ ORDER where pid='p01')[cname]
CNP01
cname
Tip Top
ACME

Query: Find names of customers who order at least one product costing $0.50.
  1. Extract the product number of products that cost 50 cents.
    CHEAPS := (PRODUCT where price=0.50)[pid]
  2. Retrieve those ORDER involving 50-cent products in ORDER∞CHEAPS; then find the names of the customers who placed these ORDER by joining this intermediate result with CUSTOMER table.

    👍 ((ORDER ∞ CHEAPS) ∞ CUSTOMER)[cname], or
    👍 ((ORDER ∞ (PRODUCT where price=0.50)[pid]) ∞ CUSTOMER)[cname]
    👎 ((ORDER ∞ PRODUCT where price=0.50) ∞ CUSTOMER)[cname]