6 Nested SQLCARTE PDF
6 Nested SQLCARTE PDF
6 Nested SQLCARTE PDF
AND AGGREGATION
CHAPTER 5 (6/E)
CHAPTER 8 (5/E)
1
LECTURE OUTLINE
More Complex SQL Retrieval Queries
• Self-Joins
• Renaming Attributes and Results
• Grouping, Aggregation, and Group Filtering
• Ordering Results
• Nested SPJ Queries
2
REVIEW OF SPJ QUERIES IN SQL
SPJ (select-project-join) queries
• SQL’s basic select-from-where queries
• Equivalent to using only , , and ⋈ (or ) in Relational Algebra
(and possibly , if attributes need to be renamed before joining)
3
RENAMING IN SQL
For convenience, include renaming (like ) as well
Aliases or tuple variables
• Provide alternative names for tables or columns
• Keyword AS is optional
4
SELF-JOINS
Renaming is mandatory if table used more than once in a query
EMPLOYEE
Fname Minit Lname Ssn Bdate Address Sex Salary Super_ssn Dno
Example
Give the last names and salaries of employees and their managers whenever
the employee earns more than the manager.
• Think of the EMPLOYEE table as two tables, one for employees and one for
managers.
E
Fname Minit Lname Ssn Bdate Address Sex Salary Super_ssn Dno
M
Fname Minit Lname Ssn Bdate Address Sex Salary Super_ssn Dno
5
AGGREGATE FUNCTIONS
Used to accumulate information from multiple tuples, forming a single-
tuple summary
Built-in aggregate functions
• COUNT, SUM, MAX, MIN, and AVG
Used in the SELECT clause
Examples:
How many movies were directed by Steven Spielberg?
SELECT COUNT(*)
FROM Film
WHERE director='Steven Spielberg‘;
• All tuples in result are counted, with duplicates!
• COUNT(title) or COUNT(director) give same result!
• COUNT(DISTINCT year) would include each year only once!
What was the total movie profit since 2010, across how many directors?
SELECT SUM(gross - budget), COUNT(DISTINCT director)
FROM Film
WHERE year >= 2010;
6
GROUPING BEFORE AGGREGATION
How can we answer a query such as
“How many films were directed by each director after 2001?”
• Need to produce a result with one tuple per director
1. Partition relation into subsets of tuples based on grouping
column(s)
2. Apply function to each such group independently
3. Produce one tuple per group
GROUP BY clause to specify grouping attributes
SELECT director, COUNT(*)
FROM Film
WHERE year > 2001
GROUP BY director;
• Every selector in SELECT clause must be a grouping column or an
aggregation function
• e.g., SELECT director, year, COUNT(*)
would not be allowed unless also grouping by year
i.e., GROUP BY director, year
7
HAVING CLAUSE
After partitioning into groups, whole partitions can be discarded.
• Provides a condition on the grouped tuples
9
ORDERING OF QUERY RESULTS
Final output of a query can be sorted by one or more column values
Use ORDER BY clause
• Keyword DESC for descending order of values
• Optionally use keyword ASC for ascending order (default)
Example Course
dept cnum instructor term
SELECT dept, term,
COUNT(DISTINCT instructor) AS num_instructors
FROM Course
GROUP BY dept, term;
ORDER BY dept, term DESC;
10
SUMMARY OF SQL QUERIES
1. Assemble all tables according to From clause (“,” means to use ).
2. Keep only tuples matching Where clause.
3. Group into blocks based on Group By clause.
4. Keep only blocks matching Having clause.
5. Create one tuple for each block using Select clause.
6. Order resulting tuples according to Order By clause.
11
NESTED QUERIES
Any table can be used in FROM clause.
select-from-where produces a table.
Thus can nest one query within another.
Example:
Give the biographical information for directors of profitable movies.
Film Person
title genre year director minutes budget gross name birth city
SELECT name, birth, city
FROM ( SELECT director
FROM Film
WHERE gross > budget) AS Profitable,
Person
WHERE director = name
12
NESTED QUERIES (CONT’D.)
Any column can be used in SELECT and WHERE clauses.
• But refers to only one tuple value at a time
select-from-where can produce a one-column table that
contains only one tuple.
Thus queries can also be nested in SELECT and WHERE clauses
Example:
Which film(s) had the highest budget?
SELECT *
FROM Film
WHERE budget = ( SELECT MAX(budget)
FROM Film);
14
USING IN FOR MEMBERSHIP TEST
Comparison operator IN
• Compares value v with a set (or bag) of values V
• Evaluates to TRUE if v is one of the elements in V
• Allows any relation in WHERE clause
15
USING IN (CONT’D.)
Use tuples of values in comparisons
• Requires parentheses
16
NESTED 1-COLUMN QUERIES
Use other comparison operators to compare a single value v
• = ANY (or = SOME) operator
• Returns TRUE if the value v is equal to some value in the set V
• Equivalent to IN
• Also available for >, >=, <, <=, and <>
• >= ALL operator
• Returns TRUE if the value v is greater than or equal to every value
in the set V
• Equivalent to =(SELECT MAX(…)…)
• Also available for =, >, <, <=, and <>
17
CORRELATED NESTED QUERIES
Correlated nested query
• Evaluated once for each tuple in the outer query
18
EXISTS AND UNIQUE FUNCTIONS
[NOT] EXISTS function
• Check whether result of correlated nested query is empty or not
• EXISTS equivalent to (SELECT COUNT(*) … ) <> 0
Customer Sale
custid name address phone saleid date custid
19
LECTURE SUMMARY
Complex SQL:
• Self joins
• Aggregate functions
• Grouping
• Sorting
• Nested queries
Relational algebra expressions can handle self joins and nested
queries with no additional operators
• Grouping, aggregations, and sorting require additional operators
21