560 likes | 700 Views
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.
E N D
OCL4 Oracle 10g:SQL & PL/SQLSession #3 Matthew P. Johnson CISDD, CUNY June, 2005 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Agenda • Review • Lab 2 • SQL • Lab 3 • SQL • Lab 4 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
name buys Person Product price name ssn Relational Model: plus FD’s Normalization: Eliminates anomalies High-level design strategy Conceptual Model: Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
then they must also agree on the attributes B1, B2, …, Bm Functional dependencies • Definition: • Notation: • Read: Ai functionally determines Bj If two tuples agree on the attributes A1, A2, …, An A1, A2, …, An B1, B2, …, Bm Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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
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} SSN Name, Mailing-address SSN Phone Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Most important: BCNF A simple condition for removing anomalies from relations: A relation R is in BCNF if: If As Bs is a non-trivial dependency in R , then As is a superkey for R I.e.: The left side must always contain a key I.e: If a set of attributes determines other attributes, it must determine all the attributes • 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
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 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Lab 2 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Spooling • Review lab 1 • SQL Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Joins in SQL • Connect two or more tables: Product Company What is the connection between them? Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Joinbetween Productand Company 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, CompanyWHEREManufacturer=CName AND Country='Japan' AND Price <= 200 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Joins in SQL Product Company SELECT PName, PriceFROM Product, CompanyWHEREManufacturer=CName AND Country='Japan' AND Price <= 200 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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, CompanyWHEREManufacturer=CName AND Category='Gadgets' Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Joins in SQL Product Company SELECT CountryFROM Product, CompanyWHEREManufacturer=CName AND Category='Gadgets' What is the problem? What’s thesolution? Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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, ProductWHEREpersname=buyer AND product = pname AND city='Seattle' AND category='Gadgets' Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Disambiguating Attributes • Sometimes two relations have the same attr:Person(pname, address, worksfor)Company(cname, address) Whichaddress ? SELECT DISTINCT pname, addressFROM Person, CompanyWHEREworksfor = cname SELECT DISTINCT Person.pname, Company.addressFROM Person, CompanyWHEREPerson.worksfor = Company.cname Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Tuple Variables Product (pname, price, category, manufacturer) Purchase (buyer, seller, store, product) Person(persname, phoneNumber, city) Find all stores that sold at least one product that the store‘BestBuy’ also sold: SELECT DISTINCTx.store FROM Purchase AS x, Purchase AS y WHEREx.product = y.product AND y.store = 'BestBuy' Answer: (store) Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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 SELECTname FROMProduct WHEREprice > 100 SELECTProduct.name FROMProduct AS Product WHEREProduct.price > 100 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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
SQL Query Semantics SELECTa1, a2, …, ak FROMR1 AS x1, R2 AS x2, …, Rn AS xn WHEREConditions 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 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
SQL Query Semantics SELECTa1, a2, …, ak FROMR1 AS x1, R2 AS x2, …, Rn AS xn WHEREConditions 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 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
SQL e.g. • Acc(name,ssn,balance) • Q: Who has the largest balance? • Conceptually: Pname(Acc) - Pa2.name(sa2.bal < Acc.bal(Acc x ra2(Acc))) • In SQL? Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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
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' Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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 Purchase.prodnameFROM PurchaseWHERE buyerssn = Christo’s-ssn Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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.prodname FROM Purchase WHERE buyerssn = (SELECT ssn FROM Person WHERE name = 'Christo') Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Operators on subqueries • Several new operators applied to (unary) selections: • IN R • EXISTS R • UNIQUE R • s > ALL R • s > ANY R • x IN R • > is just an example op • Each expression can be negated with NOT Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Subqueries with IN • Product(name,maker), Person(name,ssn), Purchase(buyerssn,product) • Q: Find companies Martha bought products from • Strategy: • Find Martha’s ssn • Find products listed with that ssn as buyer • Find company names of those products SELECT DISTINCT Product.maker FROM Product WHERE 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
Subqueries returning relations • Equivalent to: SELECT DISTINCT Product.maker FROM Product, Purchase, People WHERE Product.name = Purchase.product AND Purchase.buyerssn = ssn AND name = 'Martha' Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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.maker FROM 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
ALL op Employees(name, job, divid, salary) Find which employees are paid more than all the programmers SELECT name FROM Employees WHERE salary > ALL (SELECT salary FROM Employees WHERE job='programmer') Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
ANY/SOME op Employees(name, job, divid, salary) Find which employees are paid more than at least one vice president SELECT name FROM Employees WHERE salary > ANY (SELECT salary FROM Employees WHERE job='VP') Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
ANY/SOME op Employees(name, job, divid, salary) Find which employees are paid more than at least one vice president SELECT name FROM Employees WHERE salary > SOME (SELECT salary FROM Employees WHERE job='VP') Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Existential/Universal Conditions Employees(name, job, divid, salary) Division(name, id, head) Find all divisions with an employee whose salary is > 100000 SELECT DISTINCT Division.name FROM Employees, Division WHERE salary > 100000 AND divid=id Existential: easy! Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Existential/Universal Conditions Employees(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
Existential/universal with IN 1. Find the other divisions: in which someone makes <= 100000 SELECT name FROM Division WHERE id IN (SELECT divid FROM Employees WHERE salary <= 100000 2. Select the divisions we didn’t find SELECT name FROM Division WHERE id NOT IN (SELECT divid FROM Employees WHERE salary <= 100000 Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Acc(name,bal,type…) • Q: Who has the largest balance? • Can we do this with subqueries? Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Correlated Queries • Last time: Acc(name,bal,type,…) • Q: Find holder of largest account SELECT name FROM Acc WHERE bal >= ALL (SELECT bal FROM Acc) Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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
Correlated Queries • Last time: Acc(name,bal,type,…) • Q2: Find holder of largest account of each type SELECT name, type FROM Acc WHERE bal >= ALL (SELECT bal FROM Acc WHERE type=type) correlation Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Correlated Queries • Last time: Acc(name,bal,type,…) • Q2: Find holder of largest account of each type • Note: • scope of variables • this can still be expressed as single SFW SELECT name, type FROM Acc a1 WHERE bal >= ALL (SELECT bal FROM Acc WHERE type=a1.type) correlation Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
EXCEPT and INTERSECT SELECT R.A, R.B FROM RWHEREEXISTS(SELECT * FROM S WHERE R.A=S.A and R.B=S.B) (SELECT R.A, R.B FROM R)INTERSECT (SELECT S.A, S.B FROM S) SELECT R.A, R.B FROM RWHERENOT EXISTS(SELECT * FROM S WHERE R.A=S.A and R.B=S.B) (SELECT R.A, R.B FROM R)EXCEPT (SELECT S.A, S.B FROM S) Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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.SID FROM Reserves R WHERE R.rating> ANY(SELECT R2.rating FROM Reserves R2 WHERE R2.sname=‘Alberto’) Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
Extended e.g. • Scenario: • Purchase(pid, seller-ssn, buyer-ssn, etc.) • Person(ssn, name, etc.) • 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
Last time: Complex RA Expressions • Scenario: • Purchase(pid, seller-ssn, buyer-ssn, etc.) • Person(ssn, name, etc.) • 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
seller-ssn=ssn pid=pid buyer-ssn=Person.ssn Complex RA Expressions Pname Person Purchase Person Product Pssn Ppid sname='Dick' sname='Gizmo' Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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) Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005
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) Matthew P. Johnson, OCL4, CISDD CUNY, Sept 2005