View
100
Download
1
Category
Preview:
DESCRIPTION
OCL4 Oracle 10g: SQL & PL/SQL Session #3. Matthew P. Johnson CISDD, CUNY June, 2005. Agenda. Review Lab 2 SQL Lab 3 SQL Lab 4. name. buys. Person. Product. price. name. ssn. Relational Model: plus FD’s. Normalization: Eliminates anomalies. High-level design strategy. - PowerPoint PPT Presentation
Citation preview
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
1
OCL4 Oracle 10g:SQL & PL/SQLSession #3
Matthew P. Johnson
CISDD, CUNY
June, 2005
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
2
Agenda Review Lab 2 SQL Lab 3 SQL Lab 4
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
3
High-level design strategy
PersonbuysProduct
name
price name ssn
Conceptual Model:
Relational Model:plus FD’s
Normalization:Eliminates anomalies
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
4
Functional dependencies Definition:
Notation: Read: Ai functionally determines Bj
If two tuples agree on the attributes
A1, A2, …, AnA1, A2, …, An
then they must also agree on the attributes
B1, B2, …, BmB1, B2, …, Bm
A1, A2, …, An B1, B2, …, BmA1, A2, …, An B1, B2, …, Bm
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
5
Typical Examples of FDs Product
name price, manufacturer
Person ssn name, age father’s/husband’s-name last-name zipcode state phone state (notwithstanding inter-state area codes)
Company name stockprice, president symbol name name symbol
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
6
Example of anomalies
Redundancy: name, maddress Update anomaly: Bill moves Delete anom.: Bill doesn’t pay bills, lose phones lose Bill! Insert anom: can’t insert someone without a (non-null) phone Underlying cause: SSN-phone is many-many Effect: partial dependency ssn name, maddress,
Whereas key = {ssn,phone}
Name SSN Mailing-address Phone
Michael 123 NY 212-111-1111
Michael 123 NY 917-111-1111
Hilary 456 DC 202-222-2222
Hilary 456 DC 914-222-2222
Bill 789 Chappaqua 914-222-2222
Bill 789 Chappaqua 212-333-3333
SSN Name, Mailing-addressSSN Name, Mailing-address SSN PhoneSSN Phone
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
7
Most important: BCNFA simple condition for removing anomalies from relations:
I.e.: The left side must always contain a keyI.e: If a set of attributes determines other attributes, it must determine all the attributes
A relation R is in BCNF if:
If As Bs is a non-trivial dependency
in R , then As is a superkey for R
A relation R is in BCNF if:
If As Bs is a non-trivial dependency
in R , then As is a superkey for R
Codd: Ted Codd, IBM researcher, inventor of relational model, 1970
Boyce: Ray Boyce, IBM researcher, helped develop SQL in the 1970s
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
8
Boyce-Codd Normal Form Name/phone example is not BCNF:
{ssn,phone} is key FD: ssn name,mailing-address holds
Violates BCNF: ssn is not a superkey
Its decomposition is BCNF Only superkeys anything else
Name SSN Mailing-address Phone
Michael 123 NY 212-111-1111
Michael 123 NY 917-111-1111
Name SSN Mailing-address
Michael 123 NY
SSN PhoneNumber
123 212-111-1111
123 917-111-1111
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
9
Lab 2
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
10
Spooling
Review lab 1
SQL
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
11
Joins in SQL Connect two or more tables:
PName Price Category Manufacturer
Gizmo $19.99 Gadgets GizmoWorks
Powergizmo $29.99 Gadgets GizmoWorks
SingleTouch $149.99 Photography Canon
MultiTouch $203.99 Household Hitachi
Product
Company CName StockPrice Country
GizmoWorks 25 USA
Canon 65 Japan
Hitachi 15 Japan
What isthe connection
betweenthem?
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
12
Joins in SQL
Product (pname, price, category, manufacturer)Company (cname, stockPrice, country)
Find all products under $200 manufactured in Japan;return their names and prices.
SELECT PName, PriceFROM Product, CompanyWHERE Manufacturer=CName AND Country='Japan' AND Price <= 200
SELECT PName, PriceFROM Product, CompanyWHERE Manufacturer=CName AND Country='Japan' AND Price <= 200
Joinbetween Product
and Company
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
13
Joins in SQL
PName Price Category Manufacturer
Gizmo $19.99 Gadgets GizmoWorks
Powergizmo $29.99 Gadgets GizmoWorks
SingleTouch $149.99 Photography Canon
MultiTouch $203.99 Household Hitachi
Product Company
Cname StockPrice Country
GizmoWorks 25 USA
Canon 65 Japan
Hitachi 15 Japan
PName Price
SingleTouch $149.99
SELECT PName, PriceFROM Product, CompanyWHERE Manufacturer=CName AND
Country='Japan' AND Price <= 200
SELECT PName, PriceFROM Product, CompanyWHERE Manufacturer=CName AND
Country='Japan' AND Price <= 200
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
14
Joins in SQL
Product (pname, price, category, manufacturer)Company (cname, stockPrice, country)
Find all countries that manufacture some product in the ‘Gadgets’ category.
SELECT CountryFROM Product, CompanyWHERE Manufacturer=CName AND Category='Gadgets'
SELECT CountryFROM Product, CompanyWHERE Manufacturer=CName AND Category='Gadgets'
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
15
Joins in SQL
Name Price Category Manufacturer
Gizmo $19.99 Gadgets GizmoWorks
Powergizmo $29.99 Gadgets GizmoWorks
SingleTouch $149.99 Photography Canon
MultiTouch $203.99 Household Hitachi
Product Company
Cname StockPrice Country
GizmoWorks 25 USA
Canon 65 Japan
Hitachi 15 Japan
Country
??
??
What is
the problem?What’s thesolution?
SELECT CountryFROM Product, CompanyWHERE Manufacturer=CName AND Category='Gadgets'
SELECT CountryFROM Product, CompanyWHERE Manufacturer=CName AND Category='Gadgets'
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
16
Joins
Product (pname, price, category, manufacturer)Purchase (buyer, seller, store, product)Person(name, phone, city)
Find names of Seattleites who bought Gadgets, and the names of the stores they bought such product from.
SELECT DISTINCT name, storeFROM Person, Purchase, ProductWHERE persname=buyer AND product = pname AND city='Seattle' AND category='Gadgets'
SELECT DISTINCT name, storeFROM Person, Purchase, ProductWHERE persname=buyer AND product = pname AND city='Seattle' AND category='Gadgets'
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
17
Disambiguating Attributes Sometimes two relations have the same attr:
Person(pname, address, worksfor)Company(cname, address)
SELECT DISTINCT pname, addressFROM Person, CompanyWHERE worksfor = cname
SELECT DISTINCT pname, addressFROM Person, CompanyWHERE worksfor = cname
SELECT DISTINCT Person.pname, Company.addressFROM Person, CompanyWHERE Person.worksfor = Company.cname
SELECT DISTINCT Person.pname, Company.addressFROM Person, CompanyWHERE Person.worksfor = Company.cname
Whichaddress ?
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
18
Tuple Variables
SELECT DISTINCT x.storeFROM Purchase AS x, Purchase AS yWHERE x.product = y.product AND y.store = 'BestBuy'
SELECT DISTINCT x.storeFROM Purchase AS x, Purchase AS yWHERE x.product = y.product AND y.store = 'BestBuy'
Find all stores that sold at least one product that the store‘BestBuy’ also sold:
Answer: (store)
Product (pname, price, category, manufacturer)Purchase (buyer, seller, store, product)Person(persname, phoneNumber, city)
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
19
Tuple Variables Tuple variables introduced automatically: Product (name, price, category, manufacturer) Becomes:
Doesn’t work when Product occurs more than once In that case the user needs to define variables explicitly
SELECT nameFROM ProductWHERE price > 100
SELECT nameFROM ProductWHERE price > 100
SELECT Product.nameFROM Product AS ProductWHERE Product.price > 100
SELECT Product.nameFROM Product AS ProductWHERE Product.price > 100
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
20
Details: Disambiguation in SQL Every selected field must be unambiguous For R(A,B),
Select A from R, R Select R1.A from R R1, R R2
Consider:
Why? * is shorthand for all fields, each must be unambiguous Select * from R R1, R R2
SQL> Select * from R, R;Select * from R, R *ERROR at line 1:ORA-00918: column ambiguously defined
SQL> Select * from R, R;Select * from R, R *ERROR at line 1:ORA-00918: column ambiguously defined
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
21
Details: Disambiguation in Oracle SQL Can rename fields by
Select name as n … Select name n …
But not by Select name=n…
Can rename relations only by … from tab t1, tab t2
Lesson: if you get errors, remove all =s, ASs
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
22
SQL Query SemanticsSELECT a1, a2, …, akFROM R1 AS x1, R2 AS x2, …, Rn AS xnWHERE Conditions
1. Nested loops:
Answer = {}for x1 in R1 do for x2 in R2 do ….. for xn in Rn do if Conditions then Answer = Answer {(a1,…,ak)}return Answer
Answer = {}for x1 in R1 do for x2 in R2 do ….. for xn in Rn do if Conditions then Answer = Answer {(a1,…,ak)}return Answer
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
23
SQL Query Semantics
SELECT a1, a2, …, akFROM R1 AS x1, R2 AS x2, …, Rn AS xnWHERE Conditions
2. Parallel assignment
Doesn’t impose any order!
Answer = {}for all assignments x1 in R1, …, xn in Rn do if Conditions then Answer = Answer {(a1,…,ak)}return Answer
Answer = {}for all assignments x1 in R1, …, xn in Rn do if Conditions then Answer = Answer {(a1,…,ak)}return Answer
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
24
SQL e.g. Acc(name,ssn,balance) Q: Who has the largest balance?
Conceptually:
name(Acc) - a2.name(a2.bal < Acc.bal(Acc x a2(Acc)))
In SQL?
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
25
New topic: Subqueries Powerful feature of SQL: one clause can
contain other SQL queries Anywhere where a value or relation is allowed
Several ways: Selection single constant (scalar) in SELECT Selection single constant (scalar) in WHERE Selection relation in WHERE Selection relation in FROM
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
26
Subquery motivation Consider standard multi-table example:
Purchase(prodname, buyerssn, etc.) Person(name, ssn, etc.) What did Christo buy?
As usual, need to AND on equality identifying ssn’s row and buyerssn’s row
SELECT Purchase.prodnameFROM Purchase, PersonWHERE buyerssn = ssn AND name = 'Christo'
SELECT Purchase.prodnameFROM Purchase, PersonWHERE buyerssn = ssn AND name = 'Christo'
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
27
Subquery motivation Purchase(prodname, buyerssn, etc.) Person(name, ssn, etc.) What did Conrad buy?
Natural intuition: Go find Conrad’s ssn Then find purchases
SELECT ssnFROM PersonWHERE name = 'Christo'
SELECT ssnFROM PersonWHERE name = 'Christo'
SELECT Purchase.prodnameFROM PurchaseWHERE buyerssn = Christo’s-ssn
SELECT Purchase.prodnameFROM PurchaseWHERE buyerssn = Christo’s-ssn
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
28
Subqueries Subquery: copy in Conrad’s selection for his ssn:
The subquery returns one value, so the = is valid If it returns more (or fewer), we get a run-time error
SELECT Purchase.prodnameFROM PurchaseWHERE buyerssn = (SELECT ssn FROM Person WHERE name = 'Christo')
SELECT Purchase.prodnameFROM PurchaseWHERE buyerssn = (SELECT ssn FROM Person WHERE name = 'Christo')
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
29
Operators on subqueries Several new operators applied to (unary)
selections:1. IN R
2. EXISTS R
3. UNIQUE R
4. s > ALL R
5. s > ANY R
6. x IN R > is just an example op Each expression can be negated with NOT
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
30
Subqueries with IN Product(name,maker), Person(name,ssn),
Purchase(buyerssn,product) Q: Find companies Martha bought products from Strategy:
1. Find Martha’s ssn2. Find products listed with that ssn as buyer3. Find company names of those products
SELECT DISTINCT Product.makerFROM ProductWHERE Product.name IN (SELECT Purchase.product FROM Purchase WHERE Purchase.buyerssn =
(SELECT ssn FROM Person
WHERE name = 'Martha'))
SELECT DISTINCT Product.makerFROM ProductWHERE Product.name IN (SELECT Purchase.product FROM Purchase WHERE Purchase.buyerssn =
(SELECT ssn FROM Person
WHERE name = 'Martha'))
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
31
Subqueries returning relations Equivalent to:
SELECT DISTINCT Product.makerFROM Product, Purchase, PeopleWHERE Product.name = Purchase.product AND Purchase.buyerssn = ssn AND name = 'Martha'
SELECT DISTINCT Product.makerFROM Product, Purchase, PeopleWHERE Product.name = Purchase.product AND Purchase.buyerssn = ssn AND name = 'Martha'
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
32
FROM subqueries Motivation for another way:
suppose we’re given Martha’s purchases Then could just cross with Products to get product makers
Substitute (named) subquery for Martha’s purchases
SELECT Product.makerFROM Product, (SELECT Purchase.product FROM Purchase WHERE Purchase.buyerssn =
(SELECT ssn FROM Person WHERE name = 'Martha')) Marthas
WHERE Product.name = Marthas.product
SELECT Product.makerFROM Product, (SELECT Purchase.product FROM Purchase WHERE Purchase.buyerssn =
(SELECT ssn FROM Person WHERE name = 'Martha')) Marthas
WHERE Product.name = Marthas.product
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
33
ALL op
Employees(name, job, divid, salary)Find which employees are paid more than all the programmers
SELECT nameFROM EmployeesWHERE salary > ALL (SELECT salary FROM Employees WHERE job='programmer')
SELECT nameFROM EmployeesWHERE salary > ALL (SELECT salary FROM Employees WHERE job='programmer')
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
34
ANY/SOME op
Employees(name, job, divid, salary)Find which employees are paid more than at least one vice president
SELECT nameFROM EmployeesWHERE salary > ANY (SELECT salary FROM Employees WHERE job='VP')
SELECT nameFROM EmployeesWHERE salary > ANY (SELECT salary FROM Employees WHERE job='VP')
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
35
ANY/SOME op
Employees(name, job, divid, salary)Find which employees are paid more than at least one vice president
SELECT nameFROM EmployeesWHERE salary > SOME (SELECT salary FROM Employees WHERE job='VP')
SELECT nameFROM EmployeesWHERE salary > SOME (SELECT salary FROM Employees WHERE job='VP')
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
36
Existential/Universal ConditionsEmployees(name, job, divid, salary)
Division(name, id, head)
Find all divisions with an employee whose salary is > 100000
Existential: easy!
SELECT DISTINCT Division.nameFROM Employees, DivisionWHERE salary > 100000 AND divid=id
SELECT DISTINCT Division.nameFROM Employees, DivisionWHERE salary > 100000 AND divid=id
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
37
Existential/Universal ConditionsEmployees(name, job, divid, salary)
Division(name, id, head)
Find all divisions in which everyone makes > 100000
Universal: hard!
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
38
Existential/universal with IN
2. Select the divisions we didn’t find
1. Find the other divisions: in which someone makes <= 100000
SELECT nameFROM DivisionWHERE id IN (SELECT divid FROM Employees WHERE salary <= 100000
SELECT nameFROM DivisionWHERE id IN (SELECT divid FROM Employees WHERE salary <= 100000
SELECT nameFROM DivisionWHERE id NOT IN (SELECT divid FROM Employees WHERE salary <= 100000
SELECT nameFROM DivisionWHERE id NOT IN (SELECT divid FROM Employees WHERE salary <= 100000
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
39
Acc(name,bal,type…) Q: Who has the largest balance?
Can we do this with subqueries?
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
40
Last time: Acc(name,bal,type,…) Q: Find holder of largest account
SELECT nameFROM AccWHERE bal >= ALL (SELECT bal FROM Acc)
SELECT nameFROM AccWHERE bal >= ALL (SELECT bal FROM Acc)
Correlated Queries
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
41
Correlated Queries So far, subquery executed once;
result used for higher query More complicated: correlated queries
“[T]he subquery… [is] evaluated many times, once for each assignment of a value to some term in the subquery that comes from a tuple variable outside the subquery” (Ullman, p286).
Q: What does this mean? A: That subqueries refer to vars from outer queries
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
42
Last time: Acc(name,bal,type,…) Q2: Find holder of largest account of each type
SELECT name, typeFROM AccWHERE bal >= ALL (SELECT bal FROM Acc WHERE type=type)
SELECT name, typeFROM AccWHERE bal >= ALL (SELECT bal FROM Acc WHERE type=type)
Correlated Queries
correlation
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
43
Last time: Acc(name,bal,type,…) Q2: Find holder of largest account of each type
Note:1. scope of variables
2. this can still be expressed as single SFW
SELECT name, typeFROM Acc a1WHERE bal >= ALL (SELECT bal FROM Acc WHERE type=a1.type)
SELECT name, typeFROM Acc a1WHERE bal >= ALL (SELECT bal FROM Acc WHERE type=a1.type)
Correlated Queries
correlation
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
44
EXCEPT and INTERSECT
(SELECT R.A, R.B FROM R) INTERSECT(SELECT S.A, S.B FROM S)
(SELECT R.A, R.B FROM R) INTERSECT(SELECT S.A, S.B FROM S)
(SELECT R.A, R.B FROM R) EXCEPT(SELECT S.A, S.B FROM S)
(SELECT R.A, R.B FROM R) EXCEPT(SELECT S.A, S.B FROM S)
SELECT R.A, R.BFROM RWHERE EXISTS(SELECT * FROM S WHERE R.A=S.A and R.B=S.B)
SELECT R.A, R.BFROM RWHERE EXISTS(SELECT * FROM S WHERE R.A=S.A and R.B=S.B)
SELECT R.A, R.BFROM RWHERE NOT EXISTS(SELECT * FROM S WHERE R.A=S.A and R.B=S.B)
SELECT R.A, R.BFROM RWHERE NOT EXISTS(SELECT * FROM S WHERE R.A=S.A and R.B=S.B)
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
45
More on Set-Comparison Operators We’ve already seen IN R, NOT IN R. Can also use EXISTS R, NOT EXISTS R Also available: op ANY R, op ALL R Find sailors whose rating is greater than that
of some sailor called Alberto: , , , , ,
SELECT R.SIDFROM Reserves RWHERE R.rating > ANY (SELECT R2.rating FROM Reserves R2 WHERE R2.sname=‘Alberto’)
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
46
Extended e.g. Scenario:
1. Purchase(pid, seller-ssn, buyer-ssn, etc.)
2. Person(ssn, name, etc.)
3. Product(pid, name, etc.)
Q: Who (give names) bought gizmos from Dick?
Where to start? Purchase uses pid, ssn, so must get them…
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
47
Last time: Complex RA Expressions Scenario:
1. Purchase(pid, seller-ssn, buyer-ssn, etc.)
2. Person(ssn, name, etc.)
3. Product(pid, name, etc.)
Q: Who (give names) bought gizmos from Dick?
Where to start? Purchase uses pid, ssn, so must get them…
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
48
Complex RA Expressions
Person Purchase Person Product
name='Dick' name='Gizmo'
pid ssn
seller-ssn=ssn
pid=pid
buyer-ssn=Person.ssn
name
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
49
Translation to SQL
We’re converting the tree on the last slide into SQL The result of the query should be the names indicated above One step at a time, we’ll make the query more complete, until
we’ve translated the English-language description to an actual SQL query
We’ll also simplify the query when possible
(the names of the people who bought gadgets from Dick)
(the names of the people who bought gadgets from Dick)
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
50
Translation to SQL
Blue type = actual SQL Black italics = description of subquery
Note: the subquery above consists of purchase records, except with the info describing the buyers attached In the results, the column header for name will be 'buyer'
SELECT DISTINCT name buyer FROM
(the info, along with buyer names, for purchases of gadgets sold by Dick)
SELECT DISTINCT name buyer FROM
(the info, along with buyer names, for purchases of gadgets sold by Dick)
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
51
Translation to SQL
Note: the subquery in this version is being given the name P2 We’re pairing our rows from Person with rows from P2
SELECT DISTINCT name buyer FROM
(SELECT *FROM Person, (the purchases of gadgets from Dick) P2
WHERE Person.ssn = P2.buyer-ssn)
SELECT DISTINCT name buyer FROM
(SELECT *FROM Person, (the purchases of gadgets from Dick) P2
WHERE Person.ssn = P2.buyer-ssn)
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
52
Translation to SQL
We simplified by combining the two SELECTs
SELECT DISTINCT name buyer
FROM Person, (the purchases of gadgets from Dick) P2
WHERE Person.ssn = P2.buyer-ssn
SELECT DISTINCT name buyer
FROM Person, (the purchases of gadgets from Dick) P2
WHERE Person.ssn = P2.buyer-ssn
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
53
Translation to SQL
P2 is still the name of the subquery It’s just been filled in with a query that contains two
subqueries Outer parentheses are bolded for clarity
SELECT DISTINCT name buyer
FROM Person, (SELECT * FROM Purchases WHERE seller-ssn = (Dick’s ssn)
AND pid = (the id of gadget)) P2
WHERE Person.ssn = P2.buyer-ssn
SELECT DISTINCT name buyer
FROM Person, (SELECT * FROM Purchases WHERE seller-ssn = (Dick’s ssn)
AND pid = (the id of gadget)) P2
WHERE Person.ssn = P2.buyer-ssn
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
54
Translation to SQL
Now the subquery to find Dick’s ssn is filled in
SELECT DISTINCT name buyer
FROM Person, (SELECT * FROM Purchases WHERE seller-ssn = (SELECT ssn FROM Person WHERE name='Dick') AND pid = (the id of gadget)) P2
WHERE Person.ssn = P2.buyer-ssn
SELECT DISTINCT name buyer
FROM Person, (SELECT * FROM Purchases WHERE seller-ssn = (SELECT ssn FROM Person WHERE name='Dick') AND pid = (the id of gadget)) P2
WHERE Person.ssn = P2.buyer-ssn
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
55
Translation to SQL
And now the subquery to find Gadget’s product id is filled in, too Note: the SQL simplified by using subqueries
Not used in relational algebra
SELECT DISTINCT name buyer
FROM Person, (SELECT * FROM Purchases WHERE seller-ssn = (SELECT ssn FROM Person WHERE name='Dick') AND pid = (SELECT pid FROM Product WHERE name='Gadget')) P2WHERE Person.ssn = P2.buyer-ssn
SELECT DISTINCT name buyer
FROM Person, (SELECT * FROM Purchases WHERE seller-ssn = (SELECT ssn FROM Person WHERE name='Dick') AND pid = (SELECT pid FROM Product WHERE name='Gadget')) P2WHERE Person.ssn = P2.buyer-ssn
Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
56
Review Examples from sqlzoo.net
SELECT LFROM R1, …, Rn
WHERE C
SELECT LFROM R1, …, Rn
WHERE C
L(C(R1 x … Rn)L(C(R1 x … Rn)
Recommended