0% found this document useful (0 votes)
66 views50 pages

Lecture 12: SQL (Nested Queries and Aggregate Functions)

Here is a SQL query to solve this division problem: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE NOT EXISTS ( SELECT * FROM PROJECT P, DEPARTMENT D WHERE P.DNUM = D.DNUMBER AND D.DNAME = 'Research' AND NOT EXISTS ( SELECT * FROM WORKS_ON W WHERE W.ESSN = E.SSN AND W.PNO = P.PNUMBER ) ) This query finds the employee names where there does not exist a research project that the employee has not worked on, as evidenced by the nested NOT EXISTS conditions.

Uploaded by

Rana Gaballah
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
66 views50 pages

Lecture 12: SQL (Nested Queries and Aggregate Functions)

Here is a SQL query to solve this division problem: SELECT E.FNAME, E.LNAME FROM EMPLOYEE E WHERE NOT EXISTS ( SELECT * FROM PROJECT P, DEPARTMENT D WHERE P.DNUM = D.DNUMBER AND D.DNAME = 'Research' AND NOT EXISTS ( SELECT * FROM WORKS_ON W WHERE W.ESSN = E.SSN AND W.PNO = P.PNUMBER ) ) This query finds the employee names where there does not exist a research project that the employee has not worked on, as evidenced by the nested NOT EXISTS conditions.

Uploaded by

Rana Gaballah
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 50

CSE 480: Database Systems

Lecture 12: SQL (Nested queries and


Aggregate functions)

1
NESTED QUERIES

A nested query is specified


within the WHERE-clause of
the outer query

2
NESTED QUERIES

 Query: Retrieve the name and address of employees who


work for the 'Research' department

SELECT Fname, Lname, Address


FROM Employee, Department
WHERE Dname='Research' AND Dnumber=Dno;
(Non-nested query approach)

3
NESTED QUERIES

 Query: Retrieve the name and address of employees who


work for the 'Research' department

SELECT FNAME, LNAME, ADDRESS


FROM EMPLOYEE
WHERE DNO IN (SELECT DNUMBER
FROM DEPARTMENT
WHERE DNAME='Research' );
(Nested query approach)
4
Example

 Query: List the names of projects that involve an


employee whose last name is 'Smith' as a worker or as a
manager of the department that controls the project

5
NESTED QUERIES

 Query: List the names of projects that involve an


employee whose last name is 'Smith' as a worker or as a
manager of the department that controls the project

(SELECT PNAME
FROM PROJECT, DEPARTMENT, EMPLOYEE
WHERE DNUM=DNUMBER AND MGRSSN=SSN
AND LNAME='Smith')
UNION
(SELECT PNAME
FROM PROJECT, WORKS_ON, EMPLOYEE
WHERE PNUMBER=PNO AND ESSN=SSN
AND NAME='Smith');

Non-nested query approach

6
NESTED QUERIES
 Query: List the names of projects that involve an employee whose
last name is 'Smith' as a worker or as a manager of the department
that controls the project

SELECT PNAME
FROM PROJECT
WHERE PNUMBER IN
(SELECT PNUMBER
FROM PROJECT,DEPARTMENT,EMPLOYEE
WHERE DNUM=DNUMBER AND MGRSSN=SSN
AND LNAME='Smith')
OR
PNUMBER IN
(SELECT PNO
FROM WORKS_ON, EMPLOYEE
WHERE ESSN=SSN AND NAME='Smith')

Nested query approach

7
ANY, ALL, SOME

v = ANY W (e.g., Id =ANY (1,2,3))


– evaluates to TRUE if v equals to one of the elements in W

v = SOME W (e.g., Id =SOME (1,2,3))


– evaluates to TRUE if v equals to some elements in W

v > ALL W (e.g., Age >ALL (23,19,34))


– evaluates to TRUE if v is greater than all the elements in W

v < ALL W (e.g., Age <ALL (23,19,34))


– evaluates to TRUE if v is less than all the elements in W

8
NESTED QUERIES

 Query: List the names of employees whose salary is


greater than the salary of all managers

SELECT FNAME, LNAME


FROM EMPLOYEE
WHERE SALARY > ALL (SELECT SALARY
FROM DEPARTMENT,EMPLOYEE
WHERE MGRSSN=SSN);

9
THE EXISTS FUNCTION

 EXISTS is used to check whether the result of a nested


query is empty (contains no tuples)

SELECT
FROM
WHERE EXISTS V

– WHERE-clause evaluates to TRUE if V is not an empty table and


FALSE otherwise

10
THE EXISTS FUNCTION

This query will return the


names of students with
GPA > 3.0

11
THE EXISTS FUNCTION
 Query: Retrieve the name of each employee who has a dependent with the same name as the employee’s
first name.

SELEC

SELECT FNAME, LNAME


FROM EMPLOYEE
WHERE EXISTS (SELECT *
FROM DEPENDENT
Correlated WHERE SSN=ESSN AND
nested query FNAME=DEPENDENT_NAME);

12
THE EXISTS FUNCTION

 Query: Retrieve the names of employees who have no


dependents

SELECT FNAME, LNAME


FROM EMPLOYEE
WHERE NOT EXISTS (SELECT *
FROM DEPENDENT
WHERE SSN=ESSN);

Correlated nested query because it involves attribute of outer query


13
Division Query

Student (Id, Name)


Course (CrsCode, Dept)
Transcript (StudId, CrsCode, Grade)

Query: Find the names of students who have taken every


course offered by the CS department
Student Course Transcript
1234 Adam
2345 Bill CS101 CS 1234 CS101 2.5
3456 Cathy 2345 CS234 3.5
4567 Didi CS234 CS 1234 CS234 4.0
5678 Eva

Result Adam
14
Division Query in SQL

Student (Id, Name)


Course (CrsCode, CrsName, Dept)
Transcript (StudId, CrsCode, Semester, Grade)

Query: Find the names of students who have taken every


course offered by the CS department
SELECT Name
FROM Student
WHERE ? Student has taken ALL
the CS courses

15
Division Query in SQL

Student (Id, Name)


Course (CrsCode, CrsName, Dept)
Transcript (StudId, CrsCode, Semester, Grade)

Query: Find the names of students who have taken every


course offered by the CS department
SELECT Name
FROM Student
WHERE EXISTS (SELECT *
FROM Transcript, Course
WHERE Transcript.StudId = Student.Id
AND Transcript.CrsCode = Course.CrsCode
AND Course.Dept = ‘CS’)
This will return names of students who have taken at least 1 CS course
16
Division Query in SQL

Student (Id, Name)


Course (CrsCode, CrsName, Dept)
Transcript (StudId, CrsCode, Semester, Grade)

Query: Find the names of students who have taken every


course offered by the CS department
SELECT Name
FROM Student
WHERE ? Student has taken ALL
the CS courses

17
Division Query in SQL

Student (Id, Name)


Course (CrsCode, CrsName, Dept)
Transcript (StudId, CrsCode, Semester, Grade)

Query: Find the names of students who have taken every


course offered by the CS department
SELECT Name
FROM Student
WHERE ( Equivalent to saying “there
? are no CS courses the
student has not taken”
)

18
Division Query in SQL

Student (Id, Name)


Course (CrsCode, CrsName, Dept)
Transcript (StudId, CrsCode, Semester, Grade)

Query: Find the names of students who have taken every


course offered by the CS department
SELECT Name
FROM Student
WHERE NOT EXISTS (
A CS course the
? student has not taken
)

19
Division Query in SQL

Student (Id, Name)


Course (CrsCode, CrsName, Dept)
Transcript (StudId, CrsCode, Semester, Grade)

Query: Find the names of students who have taken every


course offered by the CS department
SELECT Name
FROM Student
WHERE NOT EXISTS (
SELECT * FROM Course
WHERE Dept = ‘CS’ Student has not taken
AND ? the CS course
)
(Student, course) combination does not exist in Transcript
20
Division Query in SQL

Student (Id, Name)


Course (CrsCode, CrsName, Dept)
Transcript (StudId, CrsCode, Semester, Grade)

Query: Find the names of students who have taken every


course offered by the CS department
SELECT Name
FROM Student
WHERE NOT EXISTS (
SELECT * FROM Course
WHERE Dept = ‘CS’
AND NOT EXISTS (
SELECT * FROM Transcript
WHERE Transcript.StudId = Student.Id
AND Transcript.Crscode = Course.Crscode
))
21
Another Possible Solution

Student (Id, Name)


Course (CrsCode, CrsName, Dept)
Transcript (StudId, CrsCode, Semester, Grade)

Query: Find the names of students who have taken every


course offered by the CS department
SELECT Name
FROM Student
WHERE NOT EXISTS (
SELECT * FROM Course
WHERE Dept = ‘CS’
AND CrsCode NOT IN (
SELECT CrsCode FROM Transcript
WHERE Transcript.StudId = Student.Id)
)

22
Division Query

 Retrieve the names of employees who work on every


project controlled by the “Research” department

23
Example: Division Query

 Retrieve the names of employees who work on every


project controlled by the “Research” department

SELECT DISTINCT E.Lname, E.Fname


FROM EMPLOYEE E
WHERE NOT EXISTS
(
A project controlled by the Research
department in which the employee had
NOT worked on

24
Example: Division Query

 Retrieve the names of employees who work on every


project controlled by the “Research” department

SELECT DISTINCT E.Lname, E.Fname


FROM EMPLOYEE E
WHERE NOT EXISTS
( SELECT P.Pnumber
FROM DEPARTMENT D, PROJECT P
WHERE D.Dnumber = P.Dnum AND D.Dname=‘Research’
AND NOT EXISTS (
(employee,project) combination
in the Works_On table
)
)

25
Example: Division Query

 Retrieve the names of employees who work on every


project controlled by the “Research” department

SELECT DISTINCT E.Lname, E.Fname


FROM EMPLOYEE E
WHERE NOT EXISTS
(SELECT P.Pnumber
FROM DEPARTMENT D, PROJECT P
WHERE D.Dnumber = P.Dnum AND D.Dname=‘Research’
AND NOT EXISTS (
SELECT *
FROM WORKS_ON W
WHERE W.ESSN=E.SSN AND P.Pnumber=W.Pno))

26
Exercise

 Find the names of projects worked on by every employee


in the Research department
– Exclude the projects worked on only by a few but not all
employees in the Research department

 Find the names of employees who work for the Research


department but do not work on all the projects controlled
by the Research department

27
Aggregate Functions

 Used to compute summary statistics for a group of tuples


in a table
 Include COUNT, SUM, MAX, MIN, and AVG

28
Aggregate Functions

 Need to be careful when dealing with NULL values

29
Aggregate Functions

 Query: Find the sum of the salaries, maximum salary, minimum


salary, and average salary of employees in the ‘Research’ department

30
Aggregate Functions

 Query: Count the number of employees who work for the 'Research'
department

31
Aggregate Functions

 Query: Count the number of employees in department number 3 who


have worked on at least one project

overestimate

32
Aggregate Functions

 Query: Count the number of employees in Department number 3


who have worked on at least one project

33
Aggregate Functions

Query: Find the id of


employees who have two
or more dependents

Cannot use aggregate function


directly in the WHERE clause

34
Aggregate Functions

Query: Find the name of


employees who have two
or more dependents

This is ok

35
Grouping Clause

 Suppose we want to apply the aggregate functions to


subgroups of tuples in a relation
– Each subgroup consists of the set of tuples that have the same
value for the grouping attribute(s)

 SQL has a GROUP BY-clause for specifying the grouping


attributes

36
Grouping Clause Example

 Query: For each department, retrieve the department


number, the number of employees in the department, and
their average salary.

SELECT DNO, COUNT (*), AVG


(SALARY)
FROM EMPLOYEE
GROUP BY DNO;

– The EMPLOYEE tuples are divided into groups, each group


having the same value for the grouping attribute DNO
 The COUNT and AVG functions are applied to each such group of
tuples separately
 The SELECT-clause includes only the grouping attribute and the
aggregate functions to be applied on each group of tuples

37
Grouping Clause Example

Effect of null value

38
Grouping Clause Example

 Query: For each project, retrieve the project number, project name,
and the number of employees who work on that project.

In this case, the grouping and


aggregate functions are applied
after joining the two relations

39
Grouping Clause Example

 Query: For each project, retrieve the project number, project name,
and number of employees from department 3 who work on the
project

40
HAVING Clause

 The HAVING-clause is used to retrieve only groups whose values of


the aggregate functions satisfy certain condition

41
HAVING Clause Example

 Query: For each project that has more than one employees work,
retrieve the project number, project name, and the number of
employees who work on that project.

42
HAVING Clause Example

 Query: For each project that has more than one employees work on
it, retrieve the project number, project name, and the number of
employees who work on that project.

43
HAVING Clause Example

 Query: For each department that has more than 1 employee, retrieve
the department name and the number of employees who are making
more than $50,000

 Answer should be: (Payroll, 1) and (Research, 1)

44
HAVING Clause

 Query: For each department that has more than 1 employee, retrieve
the department name and the number of employees who are making
more than $50,000

WRONG! This query looks for departments that have more than
1 employee making more than $50,000

45
HAVING Clause

 Query: For each department that has more than 1 employee, retrieve
the department name and the number of employees who are making
more than $50,000

46
ORDER BY Clause

 Sort tuples based on the values of some attribute(s)

 Query: Retrieve a list of employees and the projects they


work on, ordered by their department name, and within
each department, ordered alphabetically by last name and
first name.

SELECT Dname, Lname, Fname, Pname


FROM DEPARTMENT, EMPLOYEE, WORKS_ON, PROJECT
WHERE Dnumber=Dno AND SSN=ESSN
AND Pno=Pnumber
ORDER BY Dname, Lname, Fname;

 The default order is in ascending order of values


– We can also specify the keyword DESC or ASC

47
ORDER BY Clause

 Query: Retrieve a list of employees and the projects they


work on, ordered by their department name, and within
each department, ordered alphabetically by salary (in
descending order)

SELECT Dname, Lname, Fname, Pname


FROM DEPARTMENT, EMPLOYEE, WORKS_ON, PROJECT
WHERE Dnumber=Dno AND SSN=ESSN
AND Pno=Pnumber
ORDER BY Dname ASC, Salary DESC;

48
Summary of SQL Queries
SELECT <attribute list>
FROM <table list>
[WHERE <condition>]
[GROUP BY <grouping attribute(s)>]
[HAVING <group condition>]
[ORDER BY <attribute list>]

 SELECT-clause lists the attributes/functions to be retrieved


 FROM-clause specifies all relations (or aliases) needed in the query
but not those needed in nested queries
 WHERE-clause specifies the conditions for selection and join of
tuples from the relations specified in the FROM-clause
 GROUP BY specifies grouping attributes
 HAVING specifies a condition for selection of groups
 ORDER BY specifies an order for displaying the result of a query

 A query is evaluated by first applying the WHERE-clause, then


GROUP BY and HAVING, and finally the SELECT-clause
49
Limit (in MySQL)

 Find the name and salary of the highest paid employee

50

You might also like