Presentation is loading. Please wait.

Presentation is loading. Please wait.

CS 405G: Introduction to Database Systems

Similar presentations


Presentation on theme: "CS 405G: Introduction to Database Systems"— Presentation transcript:

1 CS 405G: Introduction to Database Systems
SQL II Instructor: Jinze Liu

2 Review: SQL DML DML includes 4 main statements:
SELECT (query), INSERT, UPDATE and DELETE e.g: PROJECT SELECT S.name, E.cid FROM Students S, Enrolled E WHERE S.sid = E.sid AND S.age=19 JOIN SELECT

3 Example: Find sailors who have reserved a red and a green boat
Now let’s do this with a self-join SELECT R.sid FROM Boats B,Reserves R WHERE B.color = ‘red’ AND R.bid=B.bid INTERSECT WHERE B.color = ‘green’ AND R.bid=B.bid Boats bid bname color 101 Nina red 102 Pinta blue 103 Santa Maria 105 Titanic green Reserves sid bid day 1 101 9/12 2 103 9/13 105 sid 1 2 sid 1 sid 1 =

4 Find sids of sailors who’ve reserved a red and a green boat
SELECT R1.sid FROM Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE B1.color = ‘red’ AND B1.bid=R1.bid AND B2.color = ‘green’ AND B2.bid=R2.bid AND R1.sid=R2.sid Find red reserved boats Find green reserved boats Find matching green and red reserved boats bid bname color 101 Nina red 102 Pinta blue 103 Santa Maria 105 Titanic green sid bid day 1 101 9/12 2 103 9/13 105 sid 1 2 sid 1 = sid 1

5 Nested Queries The WHERE clause can itself contain an SQL query!
(Actually, so can FROM and HAVING clauses can too) e.g. Find the names of sailors who’ve reserved boat #103: Reserves SELECT S.sname FROM Sailors S WHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103) sid bid day 1 101 9/12 2 103 9/13 105 sname Bilbo Sailors First compute the set of all sailors that have reserved boat 103… sid sname rating age 1 Frodo 7 22 2 Bilbo 39 3 Sam 8 27 …and then check each the sid of each tuple in Sailors to see if it is in S1 S sid 2 S S

6 Nested Queries This nested query was uncorrelated because the subquery does not refer to anything in the enclosing query SELECT S.sname FROM Sailors S WHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103) It can be evaluated once and then checked for each tuple in enclosing query

7 Nested Queries with correlation
Nested queries can also be correlated; the subquery refers to the enclosing query SELECT S.sname FROM Sailors S WHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid=103 AND R.sid=S.sid) The subquery must be re-evaluated for each tuple in enclosing query EXISTS is a set operator that is true if result of set expression has at least one tuple

8 Nested Queries e.g. Find the names of sailors who’ve reserved boat #103: Notice that this query computes the same answer as the previous query! SELECT S.sname FROM Sailors S WHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid=103 AND R.sid=S.sid) 2 1 3 Sailors Reserves sid sname rating age 1 Frodo 7 22 2 Bilbo 39 3 Sam 8 27 sid bid day sid bid day 1 101 9/12 2 103 9/13 105 S /13 S S

9 Set-Comparison Operators
<tuple expression> IN <set expression> True if <tuple> is a member of <set> Also, NOT IN EXISTS <set expression> True if <set expression> evaluates to a set with at least one member Also, NOT EXISTS UNIQUE <set expression> True if <set expression> evaluates to a set with no duplicates; each row can appear exactly once Also, NOT UNIQUE <tuple expression> comparison op ANY <set expression> True if <set expression> contains at least one member that makes the comparison true Also, op ALL

10 Use NOT Exists for Division
Recall: X/Y means only give me X tuples that have a match in Y. Find sailors who’ve reserved all boats. X = set of sailors and Y = set of all boats with reservations. SELECT S.sname FROM Sailors S WHERE NOT EXISTS (SELECT B.bid FROM Boats B WHERE NOT EXISTS (SELECT R.bid FROM Reserves R WHERE R.bid=B.bid AND R.sid=S.sid)) Find Sailors S such that ... there is no boat B... without a reservation by Sailor S

11 Division SELECT S.sname FROM Sailors S WHERE NOT EXISTS (SELECT B.bid
FROM Boats B WHERE NOT EXISTS (SELECT R.bid FROM Reserves R WHERE R.bid=B.bid AND R.sid=S.sid)) 101 103 1 3 2 Reserves Sailors sid bid day 1 103 9/12 2 9/13 3 9/14 101 Boats R sid sname rating age 1 Frodo 7 22 2 Bilbo 39 3 Sam 8 27 bid bname color 101 Nina red 103 Pinta blue S B R S R B R S R

12 UNIQUE Find the names of sailors who’ve reserved boat #103 exactly once SELECT S.sname FROM Sailors S WHERE UNIQUE (SELECT sid, bid FROM Reserves R WHERE R.bid=103 AND S.sid=R.sid) 3 2 1 Sailors Reserves sid sname rating age 1 Frodo 7 22 2 Bilbo 39 3 Sam 8 27 sid bid day sid bid day 1 103 9/12 2 9/13 S /13 S S

13 ANY Find sailors whose rating is greater than that of some sailor called Bilbo: Correlated or uncorrelated? SELECT * FROM Sailors S WHERE S.rating > ANY(SELECT S2.rating FROM Sailors S2 WHERE S2.sname=‘Bilbo’) Uncorrelated! S1 S2 sid sname rating age 1 Frodo 7 22 2 Bilbo 39 3 Sam 8 27 sid sname rating age 2 Bilbo 39 sid sname rating age 1 Frodo 7 22 2 Bilbo 39 3 Sam 8 27

14 Aggregate Operators Very powerful; enables computations over sets of tuples SELECT COUNT (*) FROM Sailors S COUNT: returns a count of tuples in the set AVG: returns average of column values in the set SELECT AVG (S.age) FROM Sailors S WHERE S.rating=10 SUM: returns sum of column values in the set MIN, MAX: returns min (max) value of column values in a set. DISTINCT can be added to COUNT, AVG, SUM to perform computation only over distinct values. SELECT AVG(DISTINCT S.age) FROM Sailors S WHERE S.rating=10

15 Find name and age of the oldest sailor(s)
Aggregate Operators Find name and age of the oldest sailor(s) X Sailors SELECT S.sname, MAX (S.age) FROM Sailors S sid sname rating age 1 Frodo 7 22 2 Bilbo 39 3 Sam 8 27 What will the result be? Not legal syntax; no other columns allowed in SELECT clause without a GROUP BY clause (we’ll learn about those next) sname age Frodo 39 Bilbo Sam

16 Find name and age of the oldest sailor(s)
Aggregate Operators Find name and age of the oldest sailor(s) Instead: SELECT S.sname, S.age FROM Sailors S WHERE S.age = (SELECT MAX (S2.age) FROM Sailors S2) And then find the sailors(s) of that age… Find the maximum age…

17 GROUP BY and HAVING So far, we’ve seen aggregate operators applied to all tuples. What if we want to apply ops to each of several groups of tuples? Consider: Find the age of the youngest sailor for each rating level. In general, we don’t know how many rating levels exist, and what the rating values for these levels are! Suppose we know that rating values go from 1 to 10; we can write 10 queries that look like this (!): SELECT MIN (S.age) FROM Sailors S WHERE S.rating = i For i = 1, 2, ... , 10:

18 Queries With GROUP BY To generate values for a column based on groups of rows, use aggregate functions in SELECT statements with the GROUP BY clause Returning 1 row per group And finally compute aggregate function over each group… SELECT [DISTINCT] target-list FROM relation-list [WHERE qualification] GROUP BY grouping-list First select these rows… Then group them by the values in these columns… target-list contains: list of column names from grouping–list terms with aggregate operations (e.g., MIN (S.age)).

19 For each rating, find the age of the youngest sailor with age  18
Group By Example For each rating, find the age of the youngest sailor with age  18 Sailors sid sname rating age 1 Frodo 7 22 2 Bilbo 39 3 Sam 8 27 4 Pippin 21 5 Merry 17 SELECT S.rating, MIN (S.age) FROM Sailors S WHERE S.age >= 18 GROUP BY S.rating Group 1 1 Frodo 7 22 7 22 2 21 8 27 2 Bilbo 39 4 Pippin 21 Group 2 Group 3 3 Sam 8 27

20 Find the number of reservations for each red boat.
SELECT B.bid, COUNT(*)AS tot_res FROM Boats B, Reserves R WHERE R.bid=B.bid AND B.color=‘red’ GROUP BY B.bid Boats bid bname color 101 Nina red 102 Pinta blue 103 Santa Maria 103 1 101 2 Reserves sid bid day 1 102 9/12 2 103 9/13 3 101 9/14 4 2 103 9/13 3 101 9/14 4

21 Queries With GROUP BY and HAVING
SELECT [DISTINCT] target-list FROM relation-list WHERE qualification GROUP BY grouping-list HAVING group-qualification Use the HAVING clause with the GROUP BY clause to restrict which group-rows are returned in the result set

22 SELECT S.rating, MIN (S.age) FROM Sailors S WHERE S.age >= 18
Find the age of the youngest sailor with age  18, for each rating with at least 2 such sailors SELECT S.rating, MIN (S.age) FROM Sailors S WHERE S.age >= 18 GROUP BY S.rating HAVING COUNT (*) > 1 2 3 Answer

23 Sailors who have reserved all boats
sid sname rating age 1 Frodo 7 22 2 Bilbo 39 3 Sam 8 27 SELECT S.name FROM Sailors S, reserves R WHERE S.sid = R.sid GROUP BY S.name, S.sid HAVING COUNT(DISTINCT R.bid) = ( Select COUNT (*) FROM Boats) Boats bid bname color 101 Nina red 102 Pinta blue 103 Santa Maria sname sid bid Frodo 1 102 Bilbo 2 101 103 Reserves sname sid count Frodo 1 Bilbo 2 3 count 3 sid bid day 1 102 9/12 2 101 9/14 9/10 103 9/13 sname sid bid Frodo 1 102,102 Bilbo 2 101, 102, 103

24 More about Joins SELECT (column_list) FROM table_name
[INNER | {LEFT |RIGHT | FULL } OUTER] JOIN table_name ON qualification_list WHERE … Explicit join semantics needed unless it is an INNER join (INNER is default)

25 Default semantics: Inner Join
Only rows that match search conditions are returned. SELECT s.sid, s.name, r.bid FROM Sailors s INNER JOIN Reserves r ON s.sid = r.sid Returns only those sailors who have reserved boats SQL-92 also allows: FROM Sailors s NATURAL JOIN Reserves r “NATURAL” means equi-join for each pair of attributes with the same name

26 SELECT s.sid, s.name, r.bid FROM Sailors s INNER JOIN Reserves r ON s.sid = r.sid

27 Left Outer Join Left Outer Join returns all matched rows,
plus all unmatched rows from the table on the left of the join clause (use nulls in fields of non-matching tuples) SELECT s.sid, s.name, r.bid FROM Sailors s LEFT OUTER JOIN Reserves r ON s.sid = r.sid Returns all sailors & information on whether they have reserved boats

28 SELECT s.sid, s.name, r.bid FROM Sailors s LEFT OUTER JOIN Reserves r ON s.sid = r.sid

29 Right Outer Join Right Outer Join returns all matched rows, plus all unmatched rows from the table on the right of the join clause SELECT r.sid, b.bid, b.name FROM Reserves r RIGHT OUTER JOIN Boats b ON r.bid = b.bid Returns all boats & information on which ones are reserved.

30 SELECT r.sid, b.bid, b.name FROM Reserves r RIGHT OUTER JOIN Boats b ON r.bid = b.bid

31 Full Outer Join Full Outer Join returns all (matched or unmatched) rows from the tables on both sides of the join clause SELECT r.sid, b.bid, b.name FROM Reserves r FULL OUTER JOIN Boats b ON r.bid = b.bid Returns all boats & all information on reservations

32 SELECT r.sid, b.bid, b.name FROM Reserves r FULL OUTER JOIN Boats b ON r.bid = b.bid
Note: in this case it is the same as the ROJ because bid is a foreign key in reserves, so all reservations must have a corresponding tuple in boats.

33 INSERT INSERT [INTO] table_name [(column_list)] VALUES ( value_list)
<select statement> INSERT INTO Boats VALUES ( 105, ‘Clipper’, ‘purple’) INSERT INTO Boats (bid, color) VALUES (99, ‘yellow’) “bulk insert” from one table to another (must be type compatible): INSERT INTO TEMP(bid) SELECT r.bid FROM Reserves R WHERE r.sid = 22; “bulk insert” from files (in Postgres) Copy

34 DELETE & UPDATE DELETE FROM Boats WHERE color = ‘red’
DELETE [FROM] table_name [WHERE qualification] DELETE FROM Boats WHERE color = ‘red’ DELETE FROM Boats b WHERE b. bid = (SELECT r.bid FROM Reserves R WHERE r.sid = 22) Can also modify tuples using UPDATE statement. UPDATE Boats SET Color = “green” WHERE bid = 103;

35 Null Values Values are sometimes
unknown (e.g., a rating has not been assigned or inapplicable (e.g., no spouse’s name). SQL provides a special value null for such situations. The presence of null complicates many issues. E.g.: Special operators needed to check if value is/is not null. “rating>8” - true or false when rating is null? What about AND, OR and NOT connectives? Need a 3-valued logic (true, false and unknown). Meaning of constructs must be defined carefully. (e.g., WHERE clause eliminates rows that don’t evaluate to true.) New operators (in particular, outer joins) possible/needed.

36 Null Values – 3 Valued Logic
null AND true is null is null is null is null AND T F Null NULL OR T F Null NULL T F Null T T T F F F T F Null Null F Null T Null Null


Download ppt "CS 405G: Introduction to Database Systems"

Similar presentations


Ads by Google