400 likes | 496 Views
Schedule. Today: Subqueries, Grouping and Aggregation. Read Sections 6.3-6.4. Next Modifications, Schemas, Views. Read Sections 6.5-6.7. After that Constraints. Read Sections 7.1-7.3, 7.4.1. Union, Intersection, Difference.
E N D
Schedule • Today: • Subqueries, Grouping and Aggregation. • Read Sections 6.3-6.4. • Next • Modifications, Schemas, Views. • Read Sections 6.5-6.7. • After that • Constraints. • Read Sections 7.1-7.3, 7.4.1. Holliday - coen 178
Union, Intersection, Difference “(subquery) UNION (subquery)” produces the union of the two relations. • Similarly for INTERSECT, and EXCEPT = set difference. • But: in Oracle set difference is MINUS, not EXCEPT. Example Find the drinkers and beers such that the drinker likes the beer and frequents a bar that serves it. Likes(drinker, beer) Sells(bar, beer, price) Frequents(drinker, bar) (SELECT * FROM Likes) INTERSECT (SELECT drinker, beer FROM Sells, Frequents WHERE Frequents.bar = Sells.bar); Holliday - coen 178
Forcing Set Semantics • Default for select-from-where is bag; default for union, intersection, and difference is set. • Force set semantics with DISTINCT after SELECT. Find the different prices charged for beers. Sells(bar, beer, price) SELECT DISTINCT price FROM Sells; Holliday - coen 178
Forcing Bag Semantics • Force bag semantics with ALL • In the case of set operations, duplicates are automatically eliminated. To retain duplicates, useunion all, intersect all, and except all. Holliday - coen 178
More on Bags • There may be duplicate tuples in the results of SQL queries. To determine the number of duplicate tuples in the result. 1. If there are c1 copies of a tuple t1 in r and t1 satisfies the predicate P, then there will be c1 copies of t1 in select * from r where P • If there are c1 copies of a tuple t1 in r, then there will be c1 copies of select A from t1 in select A from r • If there are c1 copies of a tuple t1 in r and c2 copies of t2 in s, then there will be c1* c2 copies of the tuple t1.t2 in select * from r, s Holliday - coen 178
How many tuples? select * r= from s where C = 3 select B from r select B s= from r, s select B select A from r, s from r,s where C = 3 where A=C Holliday - coen 178
Forcing Set Semantics with DISTINCT select distinct B r= from r select distinct B from r, s s= select distinct C from s Holliday - coen 178
A B 1 a 2 a C 2 3 3 How many tuples? (C=3)(s)r= B(r) B(rs)s= B (C=3)(rs) A (C=3)(rs) Holliday - coen 178
Exercise: Use set operations to- • Find all customers who have both a loan and an account. • Find all customers who have an account but no loan. Depositor = (customer-name, account#) Borrower = (customer-name, loan#) Holliday - coen 178
Answers (select customer-name from Depositor) intersect (select customer-name from Borrower) (select customer-name from Depositor) except (select customer-name from Borrower) Holliday - coen 178
Join-Based Expressions A number of forms are provided. • Can be used either stand-alone (in place of a select-from-where) or to define a relation in the FROM-clause. R NATURAL JOIN S (delete duplicate attribute) R JOIN S ONcondition (cross product + ) e.g., condition:R.B=S.B R CROSS JOIN S (cross product) R OUTER JOIN S • Outerjoin can be modified by: 1. Optional NATURAL in front. 2. Optional ON condition at end. 3. Optional LEFT, RIGHT, or FULL (default) before OUTER. • LEFT = pad (with NULL) dangling tuples of R only; RIGHT = pad dangling tuples of S only. Holliday - coen 178
D A B B C Smith a 101 101 35 b Jones 103 102 24 Johnson b 104 103 65 Join Exercise R = S = What is R natural join S? (no second B) Holliday - coen 178
D A B B C Smith a 101 101 35 b Jones 103 102 24 Johnson b 104 103 65 Outer Join Exercise R = S = What is R natural left outer join S? Holliday - coen 178
D A B B C Smith a 101 101 35 b Jones 103 102 24 Johnson b 104 103 65 Outer Join Exercise R = S = What is R natural right outer join S? Holliday - coen 178
D A B B C Smith a 101 101 35 b Jones 103 102 24 Johnson b 104 103 65 Full Outer Join Exercise R = S = What is R natural full outer join S? Holliday - coen 178
D A B B C Smith a 101 101 35 b Jones 103 102 24 Johnson b 104 103 65 Outer Join Exercise R = S = R left outer join S on R.B=S.B Holliday - coen 178
Aggregations Sum, avg, min, max, and count apply to attributes (columns). Also, count(*) applies to tuples. Use these in lists following SELECT. (also having) Output has only one tuple Sells(bar,beer,price) Find the average price of Bud. SELECT AVG(price) FROM Sells WHERE beer = 'Bud'; Holliday - coen 178
Eliminating DuplicatesBefore Aggregation Find the number of different prices at which Bud is sold. Sells(bar, beer, price) SELECT COUNT(DISTINCT price) FROM Sells WHERE beer = 'Bud'; • DISTINCT may be used in any aggregation, but typically only makes sense with COUNT. Holliday - coen 178
Example Using AVG • Find the average account balance at the Oakland branch. Account = (branch-name,account#,balance) select avg(balance) from Account where branch-name = "Oakland“ What does the result look like? Holliday - coen 178
Example Using AVG • Find the average account balance at the Oakland branch of accounts over $3000. • Account = (branch-name, account#, balance) select avg(balance) from Account where branch-name = "Oakland“ and balance>3000 Holliday - coen 178
Grouping Follow select-from-where by GROUP BY and a list of attributes. • The relation that is the result of the FROM and WHERE clauses is grouped according to the values of these attributes, and aggregations take place only within a group. Example:Find the average sales price for each beer. Sells(bar, beer, price) SELECT beer, AVG(price) FROM Sells GROUP BY beer; Holliday - coen 178
Avg sales price for each beer SELECT beer, AVG(price) FROM Sells GROUP BY beer; Holliday - coen 178
Example Find, for each drinker, the average price of Bud at the bars they frequent. Sells(bar, beer, price) Frequents(drinker, bar) SELECT drinker, AVG(price) FROM Frequents, Sells WHERE beer = 'Bud' AND Frequents.bar = Sells.bar GROUP BY drinker; Holliday - coen 178
When Grouping… • Note: grouping occurs after the cross product in FROM and the condition in the WHERE is performed. • When rows (tuples) are grouped, one line of output is produced for each group. Holliday - coen 178
Restriction on SELECT Lists With Aggregation • If any aggregation is used, then each element of a SELECT clause must either be aggregated or appear in a group-by clause (if a where clause is present). • The following might seem a tempting way to find the bar that sells Bud the cheapest: Sells(bar, beer, price) SELECT bar, MIN(price) FROM Sells WHERE beer = 'Bud'; • But it is illegal in most SQL implementations. Holliday - coen 178
HAVING Clauses HAVING clauses are selections on groups, just as WHERE clauses are selections on tuples. • Condition can use the tuple variables or relations in the FROM and their attributes, just like the WHERE can. • But the tuple variables range only over the group. • And the attribute better make sense within a group; i.e., be one of the grouping attributes. Holliday - coen 178
Example Find the average price of those beers that are either served in at least 3 bars or manufactured by Anheuser-Busch. Beers(name, manf) Sells(bar, beer, price) SELECT beer, AVG(price) FROM Sells GROUP BY beer HAVING COUNT(*) >= 3 OR beer IN ( SELECT name FROM Beers WHERE manf = 'Anheuser-Busch' ); Holliday - coen 178
Before we go on.. • How do we find the bar that sells Bud the cheapest? Sells(bar, beer, price) Select bar From Sells Where beer = ‘Bud’ and price = (select min(price) from Sells where beer = ‘Bud’ ) Holliday - coen 178
Alternatively SELECT bar FROM Sells WHERE beer = ‘Bud’ and price <= ALL( SELECT price FROM Sells WHERE beer = ‘Bud’); Holliday - coen 178
Database Modifications • So far, we have looked at queries that ask about the current state of the database (instance). • We use similar syntax to make changes to the database. • Modification = insert + delete + update. Holliday - coen 178
DB Insert Insertion of a Tuple INSERT INTO relation VALUES (list of values). • Inserts the tuple = list of values, associating values with attributes in the order the attributes were declared. • Forget the order? List the attributes as arguments of the relation. Example Likes(drinker, beer) Insert the fact that Sally likes Bud. INSERT INTO Likes(drinker, beer) VALUES('Sally', 'Bud'); Holliday - coen 178
Insertion of the Result of a Query INSERT INTO relation (subquery). Example Create a (unary) table of all Sally's buddies, i.e., the people who frequent bars that Sally also frequents. Frequents(drinker, bar) CREATE TABLE Buddies( name char(30) ); INSERT INTO Buddies (SELECT DISTINCT d2.drinker FROM Frequents d1, Frequents d2 WHERE d1.drinker = 'Sally' AND d2.drinker <> 'Sally' AND d1.bar = d2.bar ); Holliday - coen 178
Deletion DELETE FROM relation WHERE condition. • Deletes all tuples satisfying the condition from the named relation. • Sally no longer likes Bud. Likes(drinker, beer) DELETE FROM Likes WHERE drinker = 'Sally' AND beer = 'Bud'; • Make the Likes relation empty. DELETE FROM Likes; Holliday - coen 178
Example • Delete all beers for which there is another beer by the same manufacturer. Beers(name,manf) DELETE FROM Beers b WHERE EXISTS (SELECT name FROM Beers WHERE manf = b.manf AND name <> b.name ); • Note alias for relation from which deletion occurs. • Subquery evaluated once for each row of b Holliday - coen 178
Semantics is tricky. If A.B. makes Bud and BudLite (only), does deletion of Bud make BudLite not satisfy the condition? • SQL semantics: all conditions in modifications must be evaluated by the system before any changes due to that command occur. • In Bud/Budlite example, we would first identify both beers as targets, and then delete both. Holliday - coen 178
More on Delete • Oracle 8i does not allow complex conditions in the where clause. • You can only delete from one table at a time. Delete all accounts at every branch located in Fremont. delete from Account where branch-name in (select branch-name from Branch where branch-city="Fremont" ) Holliday - coen 178
Updates UPDATE relation SET list of assignments WHEREcondition Example Drinker Fred's phone number is now 555-1212. Drinkers(name, addr, phone) UPDATE Drinkers SET phone = '555-1212' WHERE name = 'Fred'; Holliday - coen 178
Example - Update Make $4 the maximum price for beer. Updates many tuples at once. Sells(bar, beer, price) UPDATE Sells SET price = 4.00 WHERE price > 4.00; Holliday - coen 178
Review/Quiz select branch-name, avg(balance) from Account where account# > 5000 group by branch-name havingavg(balance) > 2000 Holliday - coen 178
Answer • If both a where clause and a having command are present, the where clause is done first. Holliday - coen 178