CSE 414: Section 3
(Un)Nesting Queries
October 13th, 2022
1
Joke of the Day!
2
Administrivia
3
Where we started
FWS
(From, Where, Select)
4
And now...
FWGHOSTM
(From, Where, Group By, Having, Order By, Select)
5
Group By
6
Aggregates
COUNT(attribute) - counts the number of tuples
SUM(attribute) - sums the value of the attribute among all tuples in set
MIN/MAX(attribute) - min/max value of the attribute among all tuples in the set
AVG(attribute) - avg value of the attribute among all tuples in the set
...
7
Group By - Examples
Do these queries work?
Enrolled(stu_id, course_num)
SELECT stu_id, course_num
FROM Enrolled
GROUP BY stu_id
SELECT stu_id, count(course_num)
FROM Enrolled
GROUP BY stu_id
8
| johndoe | 311 | 
| johndoe | 344 | 
| maryjane | 311 | 
| maryjane | 351 | 
| maryjane | 369 | 
Group By - Examples
Do these queries work?
Enrolled(stu_id, course_num)
SELECT stu_id, course_num
FROM Enrolled
GROUP BY stu_id
SELECT stu_id, count(course_num)
FROM Enrolled
GROUP BY stu_id
9
| johndoe | ? | 
| maryjane | ? | 
Group By - Examples
Do these queries work?
Enrolled(stu_id, course_num)
SELECT stu_id, course_num
FROM Enrolled
GROUP BY stu_id
SELECT stu_id, count(course_num)
FROM Enrolled
GROUP BY stu_id
10
| johndoe | 2 | 
| maryjane | 3 | 
| johndoe | 311 | 
| johndoe | 344 | 
| maryjane | 311 | 
| maryjane | 351 | 
| maryjane | 369 | 
Grouping and Ordering
GROUP BY [attribute], …, [attribute_n]
HAVING [predicate] - operates on groups, chooses to keep or remove the entire group
ORDER BY [attribute] [ASC/DESC]
11
RECAP: THE WITNESSING PROBLEM
12
Difference?
13
Subquery (Nested Queries)
14
Subquery in SELECT
SELECT DISTINCT C.cname, (SELECT count(*)
FROM Product P
WHERE P.cid=C.cid)
FROM Company C
15
Non-Subquery in SELECT
Unnest using JOIN and GROUP BY
SELECT C.cname, count(P.cid)
FROM Company C LEFT OUTER JOIN
Product P ON C.cid = P.cid
GROUP BY C.cname;
16
Subquery in FROM
SELECT X.pname � FROM (SELECT *
FROM Product
WHERE price > 20) AS X
WHERE X.price < 500
More readable: WITH <name> AS (<subquery>)- Saying FROM X AS (...)
17
Non-Subquery in FROM
Unnest using WHERE
SELECT X.pname � FROM Product AS X
WHERE X.price < 500 AND X.price > 20;
18
Subquery in WHERE
SELECT DISTINCT C.cname
FROM Company C
WHERE EXISTS (SELECT *� FROM Product P� WHERE C.cid = P.cid AND P.price < 200)
19
Non-Subquery in WHERE
SELECT DISTINCT C.cname
FROM Company C, Product P
WHERE C.cid = P.cid AND P.price < 200
20
Subquery in WHERE Syntax
21
To Nest or Not to Nest
22
Correlated vs. Decorrelated Subquery
23
Correlated vs. Decorrelated Subquery
24
(AGAIN) Witnessing (i.e. argmax)
Find the student who is taking the most classes.
Student(stu_id, id_num)
Enrolled(id_num, class)
SELECT S.stu_id
FROM Student S, Enrolled E
WHERE S.id_num = E.id_num
GROUP BY S.stu_id
HAVING count(E.class) >= ALL(
SELECT count(E1.class)
FROM Enrolled E1
GROUP BY E1.id_num);
25
| johndoe | 973 | 
| maryjane | 712 | 
| alsmith | 899 | 
| 973 | CSE 311 | 
| 973 | CSE 344 | 
| 712 | CSE 311 | 
| 899 | CSE 351 | 
Witnessing (i.e. argmax)
Find the student who is taking the most classes.
Student(stu_id, id_num)
Enrolled(id_num, class)
SELECT S.stu_id
FROM Student S, Enrolled E
WHERE S.id_num = E.id_num
GROUP BY S.stu_id
HAVING COUNT(E.class) = (
SELECT MAX(C) FROM (
SELECT COUNT(E1.class) AS C
FROM Enrolled E1
GROUP BY E1.id_num));
26
| johndoe | 973 | 
| maryjane | 712 | 
| alsmith | 899 | 
| 973 | CSE 311 | 
| 973 | CSE 344 | 
| 712 | CSE 311 | 
| 899 | CSE 351 | 
Alternative to “ALL”
Section Feedback Form!
27