ocl4 oracle 10g: sql & pl/sql session #3

56
Matthew P. Johnson, OCL4, CISDD CUNY, S ept 2005 1 OCL4 Oracle 10g: SQL & PL/SQL Session #3 Matthew P. Johnson CISDD, CUNY June, 2005

Upload: aysha

Post on 22-Jan-2016

92 views

Category:

Documents


1 download

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

TRANSCRIPT

Page 1: OCL4 Oracle 10g: SQL & PL/SQL Session #3

Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005

1

OCL4 Oracle 10g:SQL & PL/SQLSession #3

Matthew P. Johnson

CISDD, CUNY

June, 2005

Page 2: OCL4 Oracle 10g: SQL & PL/SQL Session #3

Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005

2

Agenda Review Lab 2 SQL Lab 3 SQL Lab 4

Page 3: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 4: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 5: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 6: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 7: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 8: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 9: OCL4 Oracle 10g: SQL & PL/SQL Session #3

Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005

9

Lab 2

Page 10: OCL4 Oracle 10g: SQL & PL/SQL Session #3

Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005

10

Spooling

Review lab 1

SQL

Page 11: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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?

Page 12: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 13: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 14: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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'

Page 15: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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'

Page 16: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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'

Page 17: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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 ?

Page 18: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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)

Page 19: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 20: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 21: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 22: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 23: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 24: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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?

Page 25: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 26: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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'

Page 27: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 28: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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')

Page 29: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 30: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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'))

Page 31: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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'

Page 32: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 33: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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')

Page 34: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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')

Page 35: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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')

Page 36: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 37: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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!

Page 38: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 39: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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?

Page 40: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 41: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 42: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 43: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 44: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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)

Page 45: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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’)

Page 46: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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…

Page 47: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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…

Page 48: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 49: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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)

Page 50: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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)

Page 51: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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)

Page 52: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 53: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 54: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 55: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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

Page 56: OCL4 Oracle 10g: SQL & PL/SQL Session #3

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)