CSE 344: Midterm Review
SQL, Relational Algebra
Oct 24th, 2024
SQL Review
Join Types
There will be times we use inner join, full join, and left outer join.
There is never a scenario in this class we need to use a right outer join and sqlite3 does not support this operation. It also doesn’t support full outer join, which you most likely won’t need for this class.
3
SQL 3-Valued Logic
SQL has 3-valued logic
[ex] price < 25 is FALSE when price = 99
[ex] price < 25 is UNKNOWN when price = NULL
[ex] price < 25 is TRUE when price = 19
4
SQL 3-Valued Logic (con’t)
Formal definitions:
C1 AND C2 means min(C1,C2)� C1 OR C2 means max(C1,C2)� NOT C means means 1-C
The rule for SELECT ... FROM ... WHERE C is the following:� if C = TRUE then include the row in the output� if C = FALSE or C = unknown then do not include it
5
Nested Queries
Nested Queries
7
Subquery in SELECT
8
SELECT DISTINCT C.cname, (SELECT COUNT(*)
FROM Product P
WHERE P.cid = C.cid)
FROM Company C;
Subquery in SELECT
Unnest using JOIN and GROUP BY
9
SELECT C.cname, count(P.cid)
FROM Company C LEFT OUTER JOIN
Product P ON C.cid = P.cid
GROUP BY C.cname;
Nested Queries
10
Subquery in FROM
11
SELECT X.pname
FROM (SELECT *
FROM Product
WHERE price > 20) AS X
WHERE X.price < 500;
More readable: WITH <name> AS (<subquery>)
Subquery in FROM
12
WITH price_more_20 AS (
SELECT *
FROM Product
WHERE price > 20
)
SELECT X.pname
FROM price_more_20 AS X
WHERE X.price < 500;
Subquery in FROM
Unnest using WHERE
13
SELECT X.pname
FROM Product AS X
WHERE X.price < 500 AND X.price > 20;
Subquery in WHERE (example 1)
14
SELECT DISTINCT C.cname
FROM Company C
WHERE EXISTS (SELECT *
FROM Product P
WHERE C.cid = P.cid AND P.price < 200);
Subquery in WHERE (example 1)
15
SELECT DISTINCT C.cname
FROM Company C, Product P
WHERE C.cid = P.cid AND P.price < 200;
Subquery in WHERE (example 2)
16
SELECT S1.major, S1.num_of_students, S1.school_name
FROM Schools S1
WHERE S1.num_of_students >= ALL (SELECT S2.num_of_students
FROM Schools S2
WHERE S1.school_name =
S2.school_name);
Subquery in WHERE (example 2)
17
SELECT S1.major, S1.num_of_students, S2.school_name
FROM Schools S1, Schools S2
WHERE S1.school_name = S2.school_name
GROUP BY S1.major, S1.num_of_students, S2.school_name
HAVING S1.num_of_students = MAX(S2.num_of_students);
Subquery in WHERE Syntax
18
Witnessing (i.e. argmax)
Find the student(s) 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);
19
johndoe | 973 |
maryjane | 712 |
alsmith | 899 |
973 | CSE 311 |
973 | CSE 344 |
712 | CSE 311 |
899 | CSE 351 |
Witnessing (i.e. argmax) (another way)
20
WITH class_counts AS (SELECT COUNT(E1.class) AS cnt
FROM Enrolled E1
GROUP BY E1.id_num),
max_counts AS (SELECT MAX(cnt) AS max FROM class_counts)
SELECT S.stu_id
FROM Students S, Enrolled E, max_counts Emax
WHERE S.id_num = E.id_num
GROUP BY S.stu_id, Emax.max
HAVING COUNT(E.class) = Emax.max;
To Nest or Not to Nest
21
Relational Algebra Review
RA Operators
Standard:
⋂ - Intersect
⋃ - Union
⎼ - Difference
σ - Select
π - Project
⍴ - Rename
Extended:
δ - Duplicate Elim.
ɣ - Group/Agg.
τ - Sorting
Joins:
⨝ - Nat. Join
⟕ - L.O. Join
⟖ - R.O. Join
⟗ - F.O. Join
✕- Cross Product
23
Ɣ Notation
Grouping and aggregation on group:
ɣattr_1, …, attr_k, count/sum/max/min(attr) -> alias
Aggregation on the entire table:
ɣcount/sum/max/min(attr) -> alias
24
Format
25
Query Plans (Example SQL -> RA)
Select-Join-Project structure
Make this SQL query into RA (remember FWGHOS):
SELECT R.b, T.c, max(T.a) AS T_max
FROM Table_R AS R, Table_T AS T
WHERE R.b = T.b
GROUP BY R.b, T.c
HAVING max(T.a) > 99
26
Query Plans (Example SQL -> RA)
Select-Join-Project structure
Make this SQL query into RA (remember FWGHOS):
SELECT R.b, T.c, max(T.a) AS T_max
FROM Table_R AS R, Table_T AS T
WHERE R.b = T.b
GROUP BY R.b, T.c
HAVING max(T.a) > 99
27
Difference Operator
SELECT DISTINCT R.a
FROM Table_R AS R
WHERE NOT EXISTS (
SELECT *
FROM Table_S AS S
WHERE S.b = R.a
AND S.c < 15
);
28
Difference Operator
SELECT DISTINCT R.a
FROM Table_R AS R
WHERE NOT EXISTS (
SELECT *
FROM Table_S AS S
WHERE S.b = R.a
AND S.c < 15);
29
πR2.a
Difference Operator
SELECT DISTINCT R.a
FROM Table_R AS R
WHERE NOT EXISTS (
SELECT *
FROM Table_S AS S
WHERE S.b = R.a
AND S.c < 15);
Equivalent SQL:
SELECT DISTINCT * FROM Table_R R2
EXCEPT
SELECT R1.a FROM Table_R R1, Table_S S
WHERE S.c < 15 AND R1.a = S.b;
30
πR2.a
SQL TO RA
General Approach
32
Subqueries in FROM to RA
Relational Algebra
84
Subqueries in FROM to RA
Relational Algebra
85
Subqueries in FROM to RA
Relational Algebra
86
Subqueries in FROM to RA
Relational Algebra
87
Subqueries in FROM to RA
Relational Algebra
88
Subqueries in WHERE/HAVING
Relational Algebra
99
Subqueries in WHERE/HAVING
Relational Algebra
100
Subqueries in WHERE/HAVING
Relational Algebra
101
Subqueries in WHERE/HAVING
Relational Algebra
100
Subqueries in WHERE/HAVING
Relational Algebra
100