CSE 414: Section 2
A SeQueL to SQL
April 6th, 2023
Announcements
Importing Files (HW2)
First, create the table.�Then, import the data.
.mode csv� .import population.csv Population� .import gdp.csv GDP
.import /path/to/file NameOfTable
Make sure you import the tables in the order you create them so there are no foreign key constraint issues. For example, if GDP had a foreign key constraint to Population, it would be illegal to import GDP before Population.
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
Aliasing
SELECT [attribute] AS [attribute_name]
FROM [table] AS [table_name]
… [table_name].[attribute_name] …
6
Misc. Filters
LIMIT number - limits the amount of tuples returned
[ex] SELECT * FROM table LIMIT 1;
DISTINCT - only returns unique values (eliminates duplicates)
[ex] SELECT DISTINCT column_name FROM table;
7
Join Semantics
8
For more information and different types of joins see:
https://blogs.msdn.microsoft.com/craigfr/2006/08/16/summary-of-join-properties/
Nested Loop Semantics
SELECT x_1.a_1, …, x_n.a_n�FROM x_1, …, x_n�WHERE <cond>
for each tuple in x_1:
…
for each tuple in x_n:
if <cond>(x_1, …, x_n):
output(x_1.a_1, …, x_n.a_n)
9
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.
10
Where we started
FWS
(From, Where, Select)
11
And now...
FWGHOSTM
(From, Where, Group By, Having, Order By, Select)
12
Group By
13
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
...
14
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
15
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
16
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
17
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]
18
Worksheet
Question 1
SELECT * FROM A INNER JOIN B ON A.a=B.b;
SELECT * FROM A LEFT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A RIGHT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A FULL OUTER JOIN B ON A.a=B.b;
SELECT * FROM A INNER JOIN B; (Challenging question!)
20
a |
1 |
2 |
3 |
4 |
b |
3 |
4 |
5 |
4 |
Question 1
SELECT * FROM A INNER JOIN B ON A.a=B.b;
SELECT * FROM A LEFT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A RIGHT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A FULL OUTER JOIN B ON A.a=B.b;
SELECT * FROM A INNER JOIN B; (Challenging question!)
21
a | b |
3 | 3 |
4 | 4 |
Question 1
SELECT * FROM A INNER JOIN B ON A.a=B.b;
SELECT * FROM A LEFT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A RIGHT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A FULL OUTER JOIN B ON A.a=B.b;
SELECT * FROM A INNER JOIN B; (Challenging question!)
22
a | b |
1 | |
2 | |
3 | 3 |
4 | 4 |
Question 1
SELECT * FROM A INNER JOIN B ON A.a=B.b;
SELECT * FROM A LEFT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A RIGHT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A FULL OUTER JOIN B ON A.a=B.b;
SELECT * FROM A INNER JOIN B; (Challenging question!)
23
a | b |
3 | 3 |
4 | 4 |
| 5 |
| 6 |
Question 1
SELECT * FROM A INNER JOIN B ON A.a=B.b;
SELECT * FROM A LEFT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A RIGHT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A FULL OUTER JOIN B ON A.a=B.b;
SELECT * FROM A INNER JOIN B; (Challenging question!)
24
a | b |
1 | |
2 | |
3 | 3 |
4 | 4 |
| 5 |
| 6 |
Question 1
SELECT * FROM A INNER JOIN B ON A.a=B.b;
SELECT * FROM A LEFT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A RIGHT OUTER JOIN B ON A.a=B.b;
SELECT * FROM A FULL OUTER JOIN B ON A.a=B.b;
SELECT * FROM A INNER JOIN B; (Challenging question!)
25
a | b |
1 | 3 |
1 | 4 |
1 | 5 |
1 | 6 |
2 | 3 |
… | … |
4 | 6 |
Question 2
CREATE TABLE Employees (id int, bossOf int);
Suppose all employees have an id which is not null. How would we find all distinct pairs of employees with the same boss?
Question 2
CREATE TABLE Employees (id int, bossOf int);
Suppose all employees have an id which is not null. How would we find all distinct pairs of employees with the same boss?
SELECT E1.id, E2.id
FROM Employees AS E1, Employees AS E2
WHERE E1.id < E2.id AND E1.bossOf = E2.bossOf;
Question 3
CREATE TABLE Movies ( id int, name varchar(30), budget int, gross int, rating int, year int, PRIMARY KEY (id) );
CREATE TABLE Actors ( id int, name varchar(30), age int, PRIMARY KEY (id) );
CREATE TABLE ActsIn ( mid int, aid int, FOREIGN KEY (mid) REFERENCES Movies (id), FOREIGN KEY (aid) REFERENCES Actors (id) );
Movies |
Acts in |
Actor |
Question 3
What is the number of movies, and the average rating of all movies that the actor ”Patrick Stewart” has appeared in?
Question 3
What is the number of movies, and the average rating of all movies that the actor ”Patrick Stewart” has appeared in?
Question 3
What is the number of movies, and the average rating of all movies that the actor ”Patrick Stewart” has appeared in?
FROM Movies as M, ActsIn as AI, Actors as A
Question 3
What is the number of movies, and the average rating of all movies that the actor ”Patrick Stewart” has appeared in?
FROM Movies as M, ActsIn as AI, Actors as A
Question 3
What is the number of movies, and the average rating of all movies that the actor ”Patrick Stewart” has appeared in?
SELECT count(*), avg(M.rating)
FROM Movies as M, ActsIn as AI, Actors as A
Question 3
What is the number of movies, and the average rating of all movies that the actor ”Patrick Stewart” has appeared in?
SELECT count(*), avg(M.rating)
FROM Movies as M, ActsIn as AI, Actors as A
Question 3
What is the number of movies, and the average rating of all movies that the actor ”Patrick Stewart” has appeared in?
SELECT count(*), avg(M.rating)
FROM Movies as M, ActsIn as AI, Actors as A
WHERE M.id = AI.mid AND A.id = AI.aid AND A.name = “Patrick Stewart”;
Question 3
What is the minimum age of an actor who has appeared in a movie where the gross of the movie has been over $1,000,000,000?
Question 3
What is the minimum age of an actor who has appeared in a movie where the gross of the movie has been over $1,000,000,000?
SELECT min(age)
FROM Movies as M, ActsIn as AI, Actors as A
WHERE M.id = AI.mid AND AI.aid = A.id AND M.gross > 1000000000;