Presentation is loading. Please wait.

Presentation is loading. Please wait.

Matthew P. Johnson, OCL2, CISDD CUNY, January 20051 OCL2 Oracle 10g: SQL & PL/SQL Session #5 Matthew P. Johnson CISDD, CUNY January, 2005.

Similar presentations


Presentation on theme: "Matthew P. Johnson, OCL2, CISDD CUNY, January 20051 OCL2 Oracle 10g: SQL & PL/SQL Session #5 Matthew P. Johnson CISDD, CUNY January, 2005."— Presentation transcript:

1 Matthew P. Johnson, OCL2, CISDD CUNY, January 20051 OCL2 Oracle 10g: SQL & PL/SQL Session #5 Matthew P. Johnson CISDD, CUNY January, 2005

2 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 2 Live examples Examples from sqlzoo.netsqlzoo.net Q: produce a list of employees and their bosses  What if no boss? Or no subordinate? Joins on emp, emp man:  Comma-based  Inner  Natural  Cross  Outer – left, right, full

3 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 3 More live examples Inner joins require an ON clause  Like a where clause  Arbitrary boolean expression  If always true (1=1), reduces to cross join New compar op: BETWEEN  a between 5 and 10  a >= 5 and a <= 10 Q: produce a list of employees with their salary grades  emp, salgrade

4 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 4 Null/logic review TRUE AND UNKNOWN = ? TRUE OR UNKNOWN = ? UNKNOWN OR UNKNOWN = ? X = NULL = ?

5 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 5 INTERSECT and EXCEPT (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 WHERE EXISTS(SELECT * FROM S WHERE R.A=S.A and R.B=S.B) SELECT R.A, R.B FROM R WHERE 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) (SELECT R.A, R.B FROM R) EXCEPT (SELECT S.A, S.B FROM S) SELECT R.A, R.B FROM R WHERE NOT EXISTS(SELECT * FROM S WHERE R.A=S.A and R.B=S.B) SELECT R.A, R.B FROM R WHERE NOT EXISTS(SELECT * FROM S WHERE R.A=S.A and R.B=S.B) If R, S have no duplicates, then can write without subqueries (HOW?)

6 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 6 Agenda More SQL 1. Grouping & aggregation 2. Modifications 3. Defining schemata 4. Views

7 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 7 Grouping & Aggregation In SQL:  aggregation operators in SELECT,  Grouping in GROUP BY clause Recall aggregation operators:  sum, avg, min, max, count strings, numbers, dates  Each applies to scalars  Count also applies to row: count(*)  Can DISTINCT inside aggregation op: count(DISTINCT x) Grouping: group rows that agree on single value  Each group becomes one row in result

8 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 8 Straight aggregation In R.A.  sum(x)  total (R) In SQL: Just put the aggregation op in SELECT NB: aggreg. ops applied to each non-null val  count(x) counts the number of nun-null vals in field x  Use count(*) to count the number of rows SELECT SUM(x) AS total FROM R SELECT SUM(x) AS total FROM R

9 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 9 Straight Aggregation example COUNT applies to duplicates, unless otherwise stated: Better: Can we say: SELECT Count(category) FROM Product WHERE year > 1995 SELECT Count(category) FROM Product WHERE year > 1995 SELECT Count(DISTINCT category) FROM Product WHERE year > 1995 SELECT Count(DISTINCT category) FROM Product WHERE year > 1995 same as Count(*), except excludes nulls SELECT category, Count(category) FROM Product WHERE year > 1995 SELECT category, Count(category) FROM Product WHERE year > 1995

10 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 10 Straight Aggregation example Purchase(product, date, price, quantity) Q: Find total sales for the entire database: Q: Find total sales of bagels: SELECT SUM(price * quantity) FROM Purchase SELECT SUM(price * quantity) FROM Purchase SELECT SUM(price * quantity) FROM Purchase WHERE product = ‘bagel’ SELECT SUM(price * quantity) FROM Purchase WHERE product = ‘bagel’

11 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 11 Straight grouping Group rows together by field values Produces one row for each group  I.e., by each (combin. of) grouped val(s)  Don’t select non-grouped fields Reduces to DISTINCT selections: SELECT product FROM Purchase GROUP BY product SELECT product FROM Purchase GROUP BY product SELECT DISTINCT product FROM Purchase SELECT DISTINCT product FROM Purchase

12 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 12 Grouping & aggregation Sometimes want to group and compute aggregations by group  Aggreg. op applied to rows in group, not all rows in table Q: How many sales of each product? SELECT product, count(*) AS numSales FROM cia GROUP BY product SELECT product, count(*) AS numSales FROM cia GROUP BY product

13 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 13 Evaluation of G&A Evaluation steps: Compute the FROM-WHERE part as usual to obtain a table with all attributes in R 1,…,R n Group by the attributes a 1,…,a k Compute the aggregates in C 2 and keep only groups satisfying C 2 Compute aggregates in S and return the result SELECTS FROMR 1,…,R n WHEREC 1 GROUP BYa 1,…,a k HAVINGC 2 SELECTS FROMR 1,…,R n WHEREC 1 GROUP BYa 1,…,a k HAVINGC 2

14 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 14 G & A for constructed relations Can do the same thing for larger, non-atomic relations Scenario:  Movie(title,year,producerSsn,length)  MovieExec(name,ssn,netWorth) Q: How many mins. of film did each producer make?  What happens to non-producer movie-execs? SELECT name, sum(length) AS total FROM Movie, MovieExec WHERE producerSsn = ssn GROUP BY name SELECT name, sum(length) AS total FROM Movie, MovieExec WHERE producerSsn = ssn GROUP BY name

15 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 15 Illustrated G&A example Usually want aggregations on certain parts of the relation Purchase(product, date, price, quantity) Find total sales after 10/18 per product that sold > $20: SELECT product, SUM(price*quantity) AS TotalSales FROM Purchase WHERE date > DATE ’10-18-2003’ GROUP BY product SELECT product, SUM(price*quantity) AS TotalSales FROM Purchase WHERE date > DATE ’10-18-2003’ GROUP BY product

16 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 16 Illustrated G&A example Purchase

17 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 17 First compute the FROM-WHERE clauses (date > DATE ’10-18-2003’) then GROUP BY product: Illustrated G&A example

18 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 18 SELECT product, SUM(price*quantity) AS TotalSales FROM Purchase WHERE d date > DATE ’10-18-2003’ GROUP BY product SELECT product, SUM(price*quantity) AS TotalSales FROM Purchase WHERE d date > DATE ’10-18-2003’ GROUP BY product Finally, aggregate: Illustrated G&A example

19 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 19 Illustrated G&A example GROUP BY may be reduced to (maybe more complicated) subquery SELECT product, Sum(price*quantity) AS TotalSales FROM Purchase WHERE date > DATE ’10-18-2003’ GROUP BY product SELECT product, Sum(price*quantity) AS TotalSales FROM Purchase WHERE date > DATE ’10-18-2003’ GROUP BY product SELECT DISTINCT x.product, (SELECT Sum(y.price*y.quantity) FROM Purchase y WHERE x.product = y.product AND y.date > DATE ’10-18-2003’) AS TotalSales FROM Purchase x WHERE x.date > DATE ’10-18-2003’ SELECT DISTINCT x.product, (SELECT Sum(y.price*y.quantity) FROM Purchase y WHERE x.product = y.product AND y.date > DATE ’10-18-2003’) AS TotalSales FROM Purchase x WHERE x.date > DATE ’10-18-2003’

20 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 20 SELECT product, Sum(price * quantity) AS SumSales Max(quantity) AS MaxQuantity FROM Purchase GROUP BY product SELECT product, Sum(price * quantity) AS SumSales Max(quantity) AS MaxQuantity FROM Purchase GROUP BY product For every product, what is the total sales and max quantity sold? Another example

21 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 21 Live group by e.g. Q: How many people (immediate subordinates) does each manager manage? Join emp with self… If want non-managers, do outer join…

22 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 22 HAVING clauses Sometimes we want to limit which tuples may be grouped Q: How many mins. of film did each rich producer (i.e., netWorth > 10000000) make? Q: Is HAVING necessary here? A: No, could just add rich req. to SELECT SELECT name, sum(length) AS total FROM Movie, MovieExec WHERE producerSsn = ssn GROUP BY name HAVING netWorth > 10000000 SELECT name, sum(length) AS total FROM Movie, MovieExec WHERE producerSsn = ssn GROUP BY name HAVING netWorth > 10000000

23 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 23 HAVING clauses Sometimes we want to limit which tuples may be grouped, based on properties of the group Q: How many mins. of film did each old producer (i.e., started before 1930) make? SELECT name, sum(length) AS total FROM Movie, MovieExec WHERE producerSsn = ssn GROUP BY name HAVING min(year) < 1930 SELECT name, sum(length) AS total FROM Movie, MovieExec WHERE producerSsn = ssn GROUP BY name HAVING min(year) < 1930

24 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 24 General form of G&A S = may contain attributes As and/or any aggregates but no other attributes C1 = condition on the attributes in R 1,…,R n C2 = condition on aggregations or attributes from As Why? NB: “Any attribute of relations in the FROM clause may be aggregated in the HAVING clause, but only those attributes that are in the GROUP BY list may appear unaggregated in the HAVING clause (the same rule as for the SELECT clause)” (Ullman, p283). SELECTS FROMR1,…,Rn WHEREC1 GROUP BYAs HAVINGC2 Why?

25 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 25 Live example Q: produce list of bosses and underling- counts, for bosses with >1 underling Just add HAVING clause…

26 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 26 More A&G Examples Web pages, and their authors: Author(login,name) Document(url, title) Wrote(login,url) Mentions(url,word)

27 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 27 Web page examples Find all authors who wrote at least 10 documents Author(login,name), Wrote(login,url) Attempt 1: with nested queries SELECT DISTINCT Author.name FROM Author WHERE count(SELECT Wrote.url FROM Wrote WHERE Author.login=Wrote.login) > 10 SELECT DISTINCT Author.name FROM Author WHERE count(SELECT Wrote.url FROM Wrote WHERE Author.login=Wrote.login) > 10 Bad!

28 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 28 Web page examples Find all authors who wrote at least 10 documents: Attempt 2: Simplify with GROUP BY SELECT Author.name FROM Author, Wrote WHERE Author.login=Wrote.login GROUP BY Author.name HAVING count(wrote.url) > 10 SELECT Author.name FROM Author, Wrote WHERE Author.login=Wrote.login GROUP BY Author.name HAVING count(wrote.url) > 10 Good! No need for DISTINCT: get for free from GROUP BY

29 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 29 Web page examples Find all authors who have a vocabulary over 10000 words: SELECT Author.name FROM Author, Wrote, Mentions WHERE Author.login=Wrote.login AND Wrote.url=Mentions.url GROUP BY Author.name HAVING count(distinct Mentions.word) > 10000 SELECT Author.name FROM Author, Wrote, Mentions WHERE Author.login=Wrote.login AND Wrote.url=Mentions.url GROUP BY Author.name HAVING count(distinct Mentions.word) > 10000 Author(login,name), Wrote(login,url), Mentions(url, world)

30 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 30 Summary: SQL queries Only SELECT, FROM required Can’t have HAVING without GROUP BY Can have GROUP BY without HAVING Any clauses must appear in this order: SELECT L FROM Rs WHERE s GROUP BY L2 HAVING s2 ORDER BY L3 SELECT L FROM Rs WHERE s GROUP BY L2 HAVING s2 ORDER BY L3

31 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 31 New topic: Modifications Three kinds of modifications 1. Insertions 2. Deletions 3. Updates Sometimes “update” used as a synonym for “modification”

32 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 32 Insertions General form: Missing attribute  NULL (or other default value) INSERT INTO R(A1,…., An) VALUES (v1,…., vn) INSERT INTO Purchase(buyer, seller, product, store) VALUES (‘Joe’, ‘Fred’, ‘wakeup-clock-espresso-machine’, ‘The Sharper Image’) INSERT INTO Purchase(buyer, seller, product, store) VALUES (‘Joe’, ‘Fred’, ‘wakeup-clock-espresso-machine’, ‘The Sharper Image’) Example: Insert a new purchase to the database:

33 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 33 Insertions If we’re sure we have all values in the right order, can just say: Only do this if you’re sure of order in which the table fields were defined INSERT INTO R VALUES (v1,…., vn) INSERT INTO Purchase VALUES (‘Joe’, ‘Fred’, ‘wakeup-clock-espresso-machine’, ‘The Sharper Image’) INSERT INTO Purchase VALUES (‘Joe’, ‘Fred’, ‘wakeup-clock-espresso-machine’, ‘The Sharper Image’)

34 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 34 Insertions Can insert the result of a query; Scenario:  Product(name, etc.)  Purchase(buyerssn, prodName, etc.)  Maybe some purchases name missing products   add those to the Product table  Subquery replaces VALUES INSERT INTO R(As) (query) INSERT INTO R(As) (query)

35 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 35 Insertion example Premise: data corruption  lose some Product data  every product referred to in Purchase should exist in Product, but some are missing namelistPricecategory gizmo100gadgets prodNamebuyerName cameraJohn gizmoSmith cameraSmith Product Product(name, listPrice, category) Purchase(prodName, buyerName, price) Product(name, listPrice, category) Purchase(prodName, buyerName, price) Purchase

36 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 36 Insertion example namelistPricecategory gizmo100Gadgets cameraNULL INSERT INTO Product(name) SELECT prodName FROM Purchase WHERE prodName NOT IN (SELECT name FROM Product) INSERT INTO Product(name) SELECT prodName FROM Purchase WHERE prodName NOT IN (SELECT name FROM Product) namelistPricecategory gizmo100gadgets ProductProduct’ prodNamebuyerName cameraJohn gizmoSmith cameraSmith Purchase cameraNULL Q: Or do we get: A: Depends on implementation!

37 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 37 Deletions General form: Example: Q: How do you delete just one row with SQL simpliciter? A: You can’t! Although Oracle has the ROWID pseudo-field… As usual, WHERE can contain subqueries DELETE FROM PURCHASE WHERE seller = ‘Joe’ AND product = ‘Brooklyn Bridge’ DELETE FROM PURCHASE WHERE seller = ‘Joe’ AND product = ‘Brooklyn Bridge’ DELETE FROM Table WHERE condition DELETE FROM Table WHERE condition

38 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 38 Updates General form: Example: As usual, WHERE can contain subqueries UPDATE Product SET field1 = value1, field2 = value2 WHERE condition UPDATE Product SET field1 = value1, field2 = value2 WHERE condition UPDATE Product SET price = price/2 WHERE Product.name IN (SELECT product FROM Purchase WHERE Date = DATE‘Oct, 25, 1999’); UPDATE Product SET price = price/2 WHERE Product.name IN (SELECT product FROM Purchase WHERE Date = DATE‘Oct, 25, 1999’);

39 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 39 New topic: Defining schemata So far, have done queries and data manipulation Now doing data definition Recall data types:  INT or INTEGER (variant: SHORTINT)  FLOAT or REAL: floating-point numbers DOUBLE PRECISION: DECIMAL(n,d):  E.g. decimal(5,2): five decimal digits, with the decimal point two positions from the right: e.g. 123.45  DATE and TIME  Character strings Fixed length: CHAR(n) Variable length: VARCHAR(n)

40 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 40 Creating tables Form: Example: CREATE TABLE Table-name ( field field-type, … field field-type ) CREATE TABLE Table-name ( field field-type, … field field-type ) No comma! CREATE TABLE People ( nameVARCHAR(30), ssnCHAR(9), ageSHORTINT, cityVARCHAR(30), genderBIT(1), BirthdateDATE ) CREATE TABLE People ( nameVARCHAR(30), ssnCHAR(9), ageSHORTINT, cityVARCHAR(30), genderBIT(1), BirthdateDATE ) Not supported in Oracle

41 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 41 Default Values Specify defaults when creating table: The default default: NULL CREATE TABLE People ( nameVARCHAR(30), ssnCHAR(9), ageSHORTINTDEFAULT 100, cityVARCHAR(30)DEFAULT ‘New York’, genderBIT(1), BirthdateDATEDEFAULT DATE ‘0000-00’00’, ) CREATE TABLE People ( nameVARCHAR(30), ssnCHAR(9), ageSHORTINTDEFAULT 100, cityVARCHAR(30)DEFAULT ‘New York’, genderBIT(1), BirthdateDATEDEFAULT DATE ‘0000-00’00’, )

42 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 42 Deleting and modifying schemata Delete data, indices, schema: Delete data and indices: Either way, use EXTREME CAUTION! Add or delete attributes: ALTER TABLE Person ADD phone CHAR(12); ALTER TABLE Person DROP age; ALTER TABLE Person ADD phone CHAR(12); ALTER TABLE Person DROP age; Q: What’s put in the new fields? DROP TABLE Person TRUNCATE TABLE Person

43 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 43 New topic: Indices Very important speeding up query processing Index on field(s) = data structure that makes searches/comparisons on those fields fast Suppose we have a relation Person (name, age, city) Sequential scan of the whole Person file may take a very long time SELECT * FROM Person WHERE name = ‘Waksal’ SELECT * FROM Person WHERE name = ‘Waksal’

44 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 44 Creating Indices Syntax: Here: No searching by name is much faster How much faster? Log-time, say Base-what? Doesn’t matter, but say 2 If all New Yorkers, #comparisons: 8000000  log 2 (8000000) ~= 23 (i.e., 2 23 ~= 8000000) CREATE INDEX nameIndex ON Person(name) CREATE INDEX index-name ON R(field(s))

45 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 45 How do indices work? What the data structure?  Different possibilities 1 st intuition: index on field f is an ordered list of all values in the table’s f field  each item has address (“rowid”) of its row Where do we get the ordered list? 2 nd intuition: put all f values in a BST  searching BST take log time (why?) DBMSs actually use a variant: B+Tree  See Ullman’s book or data structures texts…

46 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 46 Creating Indices Indexes can be useful in range queries too: CREATE INDEX ageIndex ON Person (age) SELECT * FROM Person WHERE age > 25

47 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 47 Using indices Indices can be created on multiple attributes: Helps in: And in: But not in: SELECT * FROM Person WHERE age = 55 AND city = ‘Seattle’ SELECT * FROM Person WHERE city = ‘Seattle’ CREATE INDEX doubleindex ON Person (age, city) SELECT * FROM Person WHERE age = 55 Idea: our sorted list is sorted on age;city, not city;age Q: In Movie tbl, should index be on year;title or title;year?

48 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 48 The Index Selection Problem Big Q: Why not just indexes all the fields?  how does the list/B+Tree stay up to date? We are given a workload: a set of SQL queries and their frequencies Q is: What indices should we build to speed up the workload? A:  Attributes in FROM/WHERE clauses  favor an index  Attributes in INSERT/UPDATE clauses  discourage an index  In Oracle: your primary key fields get indexed automatically (why?)

49 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 49 New topic: Views Stored relations physically exist and persist Views are relations that don’t  in some texts, “table” = stored relation = “base table” Basically names/references given to queries  maybe a relevant subset of a table Employee(ssn, name, department, project, salary) Payroll has access to Employee, others only to Developers CREATE VIEW Developers AS SELECT name, project FROM Employee WHERE department = “Development” CREATE VIEW Developers AS SELECT name, project FROM Employee WHERE department = “Development”

50 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 50 A Different View Person(name, city) Purchase(buyer, seller, product, store) Product(name, maker, category) We have a new virtual table: Seattle-view(buyer, seller, product, store) CREATE VIEW Seattle-view AS SELECT buyer, seller, product, store FROM Person, Purchase WHERE Person.city = ‘Seattle’ AND Person.name = Purchase.buyer CREATE VIEW Seattle-view AS SELECT buyer, seller, product, store FROM Person, Purchase WHERE Person.city = ‘Seattle’ AND Person.name = Purchase.buyer

51 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 51 A Different View Now we can query the view: SELECT name, store FROM Seattle-view, Product WHERE Seattle-view.product = Product.name AND Product.category = ‘shoes’ SELECT name, store FROM Seattle-view, Product WHERE Seattle-view.product = Product.name AND Product.category = ‘shoes’ CREATE VIEW Seattle-view AS SELECT buyer, seller, product, store FROM Person, Purchase WHERE Person.city = ‘Seattle’ AND Person.name = Purchase.buyer CREATE VIEW Seattle-view AS SELECT buyer, seller, product, store FROM Person, Purchase WHERE Person.city = ‘Seattle’ AND Person.name = Purchase.buyer

52 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 52 What happens when we query a view? SELECT name, Seattle-view.store FROM Seattle-view, Product WHERE Seattle-view.product = Product.name AND Product.category = ‘shoes’ SELECT name, Seattle-view.store FROM Seattle-view, Product WHERE Seattle-view.product = Product.name AND Product.category = ‘shoes’ SELECT name, Purchase.store FROM Person, Purchase, Product WHERE Person.city = ‘Seattle’ AND Person.name = Purchase.buyer AND Purchase.poduct = Product.name AND Product.category = ‘shoes’ SELECT name, Purchase.store FROM Person, Purchase, Product WHERE Person.city = ‘Seattle’ AND Person.name = Purchase.buyer AND Purchase.poduct = Product.name AND Product.category = ‘shoes’

53 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 53 Can rename view fields CREATE VIEW Seattle-view(seabuyer, seaseller, prod, store) AS SELECT buyer, seller, product, store FROM Person, Purchase WHERE Person.city = ‘Seattle’ AND Person.name = Purchase.buyer CREATE VIEW Seattle-view(seabuyer, seaseller, prod, store) AS SELECT buyer, seller, product, store FROM Person, Purchase WHERE Person.city = ‘Seattle’ AND Person.name = Purchase.buyer

54 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 54 Types of Views Views discussed here:  Used in databases  Computed only on-demand – slow at runtime  Always up to date Sometimes talk about “materialized” views  Used in data warehouses  Pre-computed offline – fast at runtime  May have stale data  Maybe more later…

55 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 55 Updating Views How can I insert a tuple into a table that doesn’t exist? Employee(ssn, name, department, project, salary) CREATE VIEW Developers AS SELECT name, project FROM Employee WHERE department = ‘Development’ CREATE VIEW Developers AS SELECT name, project FROM Employee WHERE department = ‘Development’ INSERT INTO Developers VALUES(‘Joe’, ‘Optimizer’) INSERT INTO Employee(ssn, name, department, project, salary) VALUES(NULL, ‘Joe’, NULL, ‘Optimizer’, NULL) If we make the following insertion: It becomes:

56 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 56 Non-Updatable Views Person(name, city) Purchase(buyer, seller, product, store) How can we add the following tuple to the view? (‘Seattle’, ‘Nine West’) We don’t know the name of the person who made the purchase cannot set to NULL (why?) CREATE VIEW City-Store AS SELECT Person.city, Purchase.store FROM Person, Purchase WHERE Person.name = Purchase.buyer CREATE VIEW City-Store AS SELECT Person.city, Purchase.store FROM Person, Purchase WHERE Person.name = Purchase.buyer

57 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 57 Constraints in SQL A constraint = a property that we’d like our database to hold The system will enforce the constraint by taking some actions:  forbid an update  or perform compensating updates

58 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 58 Constraints in SQL Constraints in SQL: Keys, foreign keys Attribute-level constraints Tuple-level constraints Global constraints: assertions The more complex the constraint, the harder it is to check and to enforce simplest Most complex

59 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 59 Keys OR: CREATE TABLE Product ( name CHAR(30) PRIMARY KEY, category VARCHAR(20)) CREATE TABLE Product ( name CHAR(30) PRIMARY KEY, category VARCHAR(20)) CREATE TABLE Product ( name CHAR(30), category VARCHAR(20) PRIMARY KEY (name)) CREATE TABLE Product ( name CHAR(30), category VARCHAR(20) PRIMARY KEY (name))

60 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 60 Keys with Multiple Attributes CREATE TABLE Product ( name CHAR(30), category VARCHAR(20), price INT, PRIMARY KEY (name, category)) CREATE TABLE Product ( name CHAR(30), category VARCHAR(20), price INT, PRIMARY KEY (name, category)) NameCategoryPrice GizmoGadget10 CameraPhoto20 GizmoPhoto30 GizmoGadget40

61 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 61 Other Keys CREATE TABLE Product ( productID CHAR(10), name CHAR(30), category VARCHAR(20), price INT, PRIMARY KEY (productID), UNIQUE (name, category)) CREATE TABLE Product ( productID CHAR(10), name CHAR(30), category VARCHAR(20), price INT, PRIMARY KEY (productID), UNIQUE (name, category)) There is at most one PRIMARY KEY; there can be many UNIQUE

62 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 62 Foreign Key Constraints CREATE TABLE Purchase ( prodName CHAR(30) REFERENCES Product(name), date DATETIME) CREATE TABLE Purchase ( prodName CHAR(30) REFERENCES Product(name), date DATETIME) prodName is a foreign key to Product(name) name should be a key in Product Referential integrity constraints

63 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 63 NameCategory Gizmogadget CameraPhoto OneClickPhoto ProdNameStore GizmoWiz CameraRitz CameraWiz ProductPurchase

64 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 64 Foreign Key Constraints Or: (name, category) must be a PRIMARY KEY in its table CREATE TABLE Purchase ( prodName CHAR(30), category VARCHAR(20), date DATETIME, FOREIGN KEY (prodName, category) REFERENCES Product(name, category) CREATE TABLE Purchase ( prodName CHAR(30), category VARCHAR(20), date DATETIME, FOREIGN KEY (prodName, category) REFERENCES Product(name, category)

65 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 65 NameCategory Gizmogadget CameraPhoto OneClickPhoto ProdNameStore GizmoWiz CameraRitz CameraWiz ProductPurchase What happens during updates? Types of updates: In Purchase: insert/update In Product: delete/update

66 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 66 What happens during updates? SQL has three policies for maintaining referential integrity: Reject violating modifications (default) Cascade: after a delete/update do a delete/update Set-null set foreign-key field to NULL

67 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 67 Constraints on Attributes and Tuples Constraints on attributes: NOT NULL-- obvious meaning... CHECK condition-- any condition (except subqueries) Constraints on tuples CHECK condition

68 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 68 CREATE TABLE Purchase ( prodName CHAR(30) CHECK (prodName IN SELECT Product.name FROM Product), date DATETIME NOT NULL) CREATE TABLE Purchase ( prodName CHAR(30) CHECK (prodName IN SELECT Product.name FROM Product), date DATETIME NOT NULL) What is the difference from Foreign-Key?

69 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 69 General Assertions Supported in SQL standard: In Oracle, supported/simulated with triggers CREATE ASSERTION myAssert CHECK NOT EXISTS( SELECT Product.name FROM Product, Purchase WHERE Product.name = Purchase.prodName GROUP BY Product.name HAVING count(*) > 200) CREATE ASSERTION myAssert CHECK NOT EXISTS( SELECT Product.name FROM Product, Purchase WHERE Product.name = Purchase.prodName GROUP BY Product.name HAVING count(*) > 200)

70 Matthew P. Johnson, OCL2, CISDD CUNY, January 2005 70 Final Comments on Constraints Can give them names, and alter later We need to understand exactly when they are checked We need to understand exactly what actions are taken if they fail


Download ppt "Matthew P. Johnson, OCL2, CISDD CUNY, January 20051 OCL2 Oracle 10g: SQL & PL/SQL Session #5 Matthew P. Johnson CISDD, CUNY January, 2005."

Similar presentations


Ads by Google