CHAPTER 06
Complex Queries
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 1
Chapter 6 Outline
More Complex SQL Retrieval Queries
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 3
More Complex SQL Retrieval
Queries
Additional features allow users to specify more
complex retrievals from database:
Nested queries, joined tables, and outer joins (in
the FROM clause), aggregate functions, and
grouping
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 4
Comparisons Involving NULL
SQL allows queries that check whether an
attribute value is NULL
IS or IS NOT NULL
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 7
Nested Queries, Tuples,
and Set/Multiset Comparisons
Nested queries
Complete select-from-where blocks within WHERE
clause of another query
Outer query and nested subqueries
Comparison operator IN
Compares value v with a set (or multiset) of values
V
Evaluates to TRUE if v is one of the elements in V
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 8
Nested Queries (cont’d.)
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 9
Nested Queries (cont’d.)
Use tuples of values in comparisons
Place them within parentheses
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 10
Nested Queries (cont’d.)
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 and is hence equivalent to IN
Other operators that can be combined with ANY (or
SOME): >, >=, <, <=, and <>
ALL: value must exceed all values from nested
query
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 11
Nested Queries (cont’d.)
Avoid potential errors and ambiguities
Create tuple variables (aliases) for all tables
referenced in SQL query
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 9
Correlated Nested Queries
Queries that are nested using the = or IN
comparison operator can be collapsed into one
single block: E.g., Q16 can be written as:
Q16A: SELECT E.Fname, E.Lname
FROM EMPLOYEE AS E, DEPENDENT AS D
WHERE E.Ssn=D.Essn AND E.Sex=D.Sex
AND
E.Fname=D.Dependent_name;
Correlated nested query
Evaluated once for each tuple in the outer query
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 13
The EXISTS and UNIQUE Functions
in SQL for correlating queries
EXISTS function
Check whether the result of a correlated nested
query is empty or not. They are Boolean functions
that return a TRUE or FALSE result.
EXISTS and NOT EXISTS
Typically used in conjunction with a correlated
nested query
SQL function UNIQUE(Q)
Returns TRUE if there are no duplicate tuples in
the result of query Q
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 14
USE of EXISTS
Q7:
SELECT Fname, Lname
FROM Employee
WHERE EXISTS (SELECT *
FROM DEPENDENT
WHERE Ssn= Essn)
AND EXISTS (SELECT *
FROM Department
WHERE Ssn= Mgr_Ssn)
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 15
USE OF NOT EXISTS
To achieve the “for all” (universal quantifier- see Ch.8) effect,
we use double negation this way in SQL:
Query: List first and last name of employees who work on
ALL projects controlled by Dno=5.
SELECT Fname, Lname
FROM Employee
WHERE NOT EXISTS ( (SELECT Pnumber
FROM PROJECT
WHERE Dno=5)
EXCEPT (SELECT Pno
FROM WORKS_ON
WHERE Ssn= ESsn)
The above is equivalent to double negation: List names of those
employees for whom there does NOT exist a project managed by
department no. 5 that they do NOT work on.
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 16
Double Negation to accomplish “for
all” in SQL
Q3B: SELECT Lname, Fname
FROM EMPLOYEE
WHERE NOT EXISTS ( SELECT *
FROM WORKS_ON B
WHERE ( B.Pno IN ( SELECT Pnumber
FROM PROJECT
WHERE Dnum=5 AND
NOT EXISTS (SELECT *
FROM WORKS_ON C
WHERE C.Essn=Ssn
AND C.Pno=B.Pno )));
The above is a direct rendering of: List names of those employees for whom
there does NOT exist a project managed by department no. 5 that they
do NOT work on.
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 14
Explicit Sets and Renaming of
Attributes in SQL
Can use explicit set of values in WHERE clause
Q17: SELECT DISTINCT Essn
FROM WORKS_ON
WHERE Pno IN (1, 2, 3);
Use qualifier AS followed by desired new name
Rename any attribute that appears in the result of
a query
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 18
Specifying Joined Tables in the
FROM Clause of SQL
Joined table
Permits users to specify a table resulting from a
join operation in the FROM clause of a query
The FROM clause in Q1A
Contains a single joined table. JOIN may also be
called INNER JOIN
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 19
Different Types of JOINed Tables in
SQL
Specify different types of join
NATURAL JOIN
Various types of OUTER JOIN (LEFT, RIGHT,
FULL )
NATURAL JOIN on two relations R and S
No join condition specified
Is equivalent to an implicit EQUIJOIN condition for
each pair of attributes with same name from R and
S
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 20
NATURAL JOIN
Rename attributes of one relation so it can be joined with
another using NATURAL JOIN:
Q1B: SELECT Fname, Lname, Address
FROM (EMPLOYEE NATURAL JOIN
(DEPARTMENT AS DEPT (Dname, Dno, Mssn,
Msdate)))
WHERE Dname=‘Research’;
The above works with EMPLOYEE.Dno = DEPT.Dno as an
implicit join condition
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 18
INNER and OUTER Joins
INNER JOIN (versus OUTER JOIN)
Default type of join in a joined table
Tuple is included in the result only if a matching tuple exists in
the other relation
LEFT OUTER JOIN
Every tuple in left table must appear in result
If no matching tuple
Padded with NULL values for attributes of right table
RIGHT OUTER JOIN
Every tuple in right table must appear in result
If no matching tuple
Padded with NULL values for attributes of left table
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 22
Example: LEFT OUTER JOIN
SELECT E.Lname AS Employee_Name
S.Lname AS Supervisor_Name
FROM Employee AS E LEFT OUTER JOIN EMPLOYEE AS S
ON E.Super_ssn = S.Ssn)
ALTERNATE SYNTAX:
SELECT E.Lname , S.Lname
FROM EMPLOYEE E, EMPLOYEE S
WHERE E.Super_ssn + = S.Ssn
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 20
Multiway JOIN in the FROM clause
FULL OUTER JOIN – combines result if LEFT
and RIGHT OUTER JOIN
Can nest JOIN specifications for a multiway join:
Q2A: SELECT Pnumber, Dnum, Lname, Address, Bdate
FROM ((PROJECT JOIN DEPARTMENT ON
Dnum=Dnumber) JOIN EMPLOYEE ON
Mgr_ssn=Ssn)
WHERE Plocation=‘Stafford’;
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 21
Aggregate Functions in SQL
Used to summarize information from multiple
tuples into a single-tuple summary
Built-in aggregate functions
COUNT, SUM, MAX, MIN, and AVG
Grouping
Create subgroups of tuples before summarizing
To select entire groups, HAVING clause is used
Aggregate functions can be used in the SELECT
clause or in a HAVING clause
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 22
Renaming Results of Aggregation
Following query returns a single row of computed values
from EMPLOYEE table:
Q19: SELECT SUM (Salary), MAX (Salary), MIN (Salary),
AVG (Salary)
FROM EMPLOYEE;
The result can be presented with new names:
Q19A: SELECT SUM (Salary) AS Total_Sal, MAX (Salary)
AS Highest_Sal, MIN (Salary) AS Lowest_Sal,
AVG (Salary) AS Average_Sal
FROM EMPLOYEE;
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 23
Aggregate Functions in SQL (cont’d.)
NULL values are discarded when aggregate
functions are applied to a particular column
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 24
Aggregate Functions on Booleans
SOME and ALL may be applied as functions on
Boolean Values.
SOME returns true if at least one element in the
collection is TRUE (similar to OR)
ALL returns true if all of the elements in the
collection are TRUE (similar to AND)
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 25
Grouping: The GROUP BY Clause
Partition relation into subsets of tuples
Based on grouping attribute(s)
Apply function to each such group independently
GROUP BY clause
Specifies grouping attributes
COUNT (*) counts the number of rows in the
group
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 26
Examples of GROUP BY
The grouping attribute must appear in the SELECT clause:
Q24: SELECT Dno, COUNT (*), AVG (Salary)
FROM EMPLOYEE
GROUP BY Dno;
If the grouping attribute has NULL as a possible value,
then a separate group is created for the null value (e.g.,
null Dno in the above query)
GROUP BY may be applied to the result of a JOIN:
Q25: SELECTPnumber, Pname, COUNT (*)
FROM PROJECT, WORKS_ON
WHERE Pnumber=Pno
GROUP BY Pnumber, Pname;
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 27
Grouping: The GROUP BY and
HAVING Clauses (cont’d.)
HAVING clause
Provides a condition to select or reject an entire
group:
Query 26. For each project on which more than two employees work,
retrieve the project number, the project name, and the number of
employees who work on the project.
Q26: SELECT Pnumber, Pname, COUNT (*)
FROM PROJECT, WORKS_ON
WHERE Pnumber=Pno
GROUP BY Pnumber, Pname
HAVING COUNT (*) > 2;
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 31
Combining the WHERE and the
HAVING Clause
Consider the query: we want to count the total number of
employees whose salaries exceed $40,000 in each
department, but only for departments where more than
five employees work.
INCORRECT QUERY:
SELECT Dno, COUNT (*)
FROM EMPLOYEE
WHERE Salary>40000
GROUP BY Dno
HAVING COUNT (*) > 5;
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 29
Combining the WHERE and the
HAVING Clause (continued)
Correct Specification of the Query:
Note: the WHERE clause applies tuple by tuple
whereas HAVING applies to entire group of tuples
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 30
Use of WITH
The WITH clause allows a user to define a table
that will only be used in a particular query (not
available in all SQL implementations)
Used for convenience to create a temporary
“View” and use that immediately in a query
Allows a more straightforward way of looking a
step-by-step query
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 31
Example of WITH
See an alternate approach to doing Q28:
Q28’: WITH BIGDEPTS (Dno) AS
( SELECT Dno
FROM EMPLOYEE
GROUP BY Dno
HAVING COUNT (*) > 5)
SELECT Dno, COUNT (*)
FROM EMPLOYEE
WHERE Salary>40000 AND Dno IN BIGDEPTS
GROUP BY Dno;
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 32
Use of CASE
SQL also has a CASE construct
Used when a value can be different based on
certain conditions.
Can be used in any part of an SQL query where a
value is expected
Applicable when querying, inserting or updating
tuples
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 33
EXAMPLE of use of CASE
The following example shows that employees are
receiving different raises in different departments
(A variation of the update U6)
U6’: UPDATE EMPLOYEE
SET Salary =
CASE WHEN Dno = 5THEN Salary + 2000
WHEN Dno = 4THEN Salary + 1500
WHEN Dno = 1THEN Salary + 3000
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 34
EXPANDED Block Structure of SQL
Queries
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 40
Table 7.2 Summary of SQL
Syntax
continued on next slide
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 59
Table 7.2 (continued)
Summary of SQL Syntax
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 60
Summary
Complex SQL:
Nested queries,
joined tables (in the FROM clause),
outer joins,
aggregate functions,
grouping
Copyright © 2017 Ramez Elmasri and Shamkant B. Navathe Slide 7- 61