sql – subqueriesup3f/cs4750/slides/4750meet15-sql-subqueri… · 3. use one copy to keep the...

38
Fall 2020 – University of Virginia 1 © Praphamontripong © Praphamontripong SQL – Subqueries CS 4750 Database Systems [A. Silberschatz, H. F. Korth, S. Sudarshan, Database System Concepts, Ch.5.3]

Upload: others

Post on 18-Jan-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 1© Praphamontripong© Praphamontripong

SQL – Subqueries

CS 4750Database Systems

[A. Silberschatz, H. F. Korth, S. Sudarshan, Database System Concepts, Ch.5.3]

Page 2: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 2© Praphamontripong

Aggregation: Order of Actions

1. The FROM clause generates the data set

2. The WHERE clause filters the data set generated by the FROM clause

3. The GROUP BY clause aggregates the data set that was filtered by the WHERE clause (note: GROUP BY does not sort the result set)

4. The HAVING clause filters the data set that was aggregated by the GROUP BY clause

5. The SELECT clause transforms the filtered aggregated data set

6. The ORDER BY clause sorts the transformed data set

SELECT select_listFROM table_source[WHERE search_condition][GROUP BY group_by_expression][HAVING search_condition][ORDER BY order_expression [ASC | DESC] ]

Order matters

revisit

Page 3: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 3© Praphamontripong

JoinsJoin combines data across tables

• Nested-loop• Natural join (most common)• Inner join (filter Cartesian product)• Outer joins (preserve non-matching tuples)• Self join pattern

Different joining techniques can be used to achieve particular goals

lefttable

righttable

LEFT JOIN

lefttable

righttable

RIGHT JOIN

lefttable

righttable

NATURAL JOIN

lefttable

righttable

(INNER) JOIN

revisit

Page 4: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 4© Praphamontripong

Recap 1: JOINHow to get the total number of unique sailors who have reserved each boat (ordered in descending order)? Display the count, boat name, and boat id

SELECT COUNT(DISTINCT sid), bname, bid FROM Boats NATURAL JOIN Reserves GROUP BY bname, bidORDER BY COUNT(sid) DESC

Boats (bid, bname, color)Sailors (sid, sname, rating, age)Reserves (sid, bid, day)

Page 5: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 5© Praphamontripong

Recap 2: JOINHow to get the average age of sailors who have reserved each boat? Show boat name, boat id, and the average age. Order results by boat id.

SELECT bname, bid, AVG(age)FROM Sailors NATURAL JOIN Reserves NATURAL JOIN Boats GROUP BY bname, bid ORDER BY bid

Boats (bid, bname, color)Sailors (sid, sname, rating, age)Reserves (sid, bid, day)

Page 6: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 6© Praphamontripong

Recap 3: JOINHow to get the average age of sailors who have reserved each boat? Show boat name, bid, and the average age. Order results by bid. (from Recap 2)

In addition, only show the boat info where the average age of sailors who have reserved that boat is > 35 years old.

SELECT bname, bid, AVG(age)FROM Sailors NATURAL JOIN Reserves NATURAL JOIN BoatsGROUP BY bname, bidHAVING AVG(age) > 35ORDER BY bid

Boats (bid, bname, color)Sailors (sid, sname, rating, age)Reserves (sid, bid, day)

Page 7: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 7© Praphamontripong

Recap 4: Self Join

SELECT E1.job, AVG(E2.sal) AS AvgSalFROM HW_emp E1, HW_emp AS E2WHERE E1.job = E2.jobGROUP BY E1.job

HW_empempno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

Find the average salary for each job

job AvgSalAnalyst 3500.0000Clerk 1437.5000Manager 3158.3333President 6500.0000Salesman 18.0000

Idea:1. Self-join HW_emp2. Use one copy to aggregate, group by job3. Use one copy to keep the original job

(Note: The table shows sample data, not a complete set of data, refer to Assignment 3, employees.sql)

Page 8: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 8© Praphamontripong

Subqueries: Core Idea

The smaller the problem, the simpler to solve, the easier to debug

Split your problem into sub-problems

Solve them separately

Compose them

Page 9: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 9© Praphamontripong

Subqueries• Subquery = a query that is part of another query

• A subquery can have subqueries

Usage:

• Return a single constant that can be used to compute an associated value in a SELECT clause

• Return a single constant that can be compared to another value in a WHERE clause

• Return a relation that can be compared or evaluated in a WHEREclause

• Return a relation that can be used as input for another query, in a FORM clause

Page 10: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 10© Praphamontripong

(Recap 4 Equivalent) Subquery (SELECT)

Idea:1. Group by job2. For each tuple, compute aggregate

HW_emp

job AvgSalAnalyst 3500.0000Clerk 1437.5000Manager 3158.3333President 6500.0000Salesman 1800.0000

SELECT E1.job, (SELECT AVG(E2.sal)FROM HW_emp AS E2WHERE E1.job = E2.job) AS AvgSal

FROM HW_emp E1GROUP BY E1.job

Return a single value that can be used to compute an associated value

“Correlated” queryRecomputed for each tuple(can’t be run independently

of the outer query)empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

Find the average salary for each job

Page 11: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 11© Praphamontripong

(Recap 4 Equivalent) Subquery (FROM)

SELECT E1.job, AvgSalFROM HW_emp E1,

(SELECT job, AVG(sal) AS AvgSalFROM HW_empGROUP BY job) AS E2

WHERE E1.job = E2.job GROUP BY job

Idea:1. Compute aggregate for each job2. Join the original HW_emp

HW_empempno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

Find the average salary for each job

job AvgSalAnalyst 3500.0000Clerk 1437.5000Manager 3158.3333President 6500.0000Salesman 1800.0000

Return a relation that can be used as input for another query

“Uncorrelated” queryIndependent of outer query

Page 12: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 12© Praphamontripong

Subqueries in WHEREReturn a single value that can be compared to another value in a WHERE clause

HW_empempno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

SELECT E1.enameFROM HW_emp E1WHERE E1.sal =

(SELECT MAX(E2.sal)FROM HW_emp AS E2WHERE E1.job = E2.job)

Find employee name (or names) who earns the highest salary for each job

[more subqueries in WHERE later]

“Correlated”

enameAllenJonesScottKingFordMiller

Page 13: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 13© Praphamontripong

Subqueries in WITHReturn a temporary relation that can be used by an associated query

HW_empempno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

WITH temp AS (SELECT job, MAX(sal) AS maxSalFROM HW_empGROUP BY job)

SELECT E1.enameFROM HW_emp E1, temp AS TWHERE E1.sal = T.maxSal

Find employee name (or names) who earns the highest salary for each job

[Not supported by MySQL 5.6, 5.7 (GCP)]

“Uncorrelated”

enameAllenJonesScottKingFordMiller

Page 14: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 14© Praphamontripong

Subqueries and Set OperationsUNION

INTERSECT

EXCEPT

(sub-result1)

(sub-result2)

UNION

(sub-result1)

(sub-result2)

INTERSECT

(sub-result1)

(sub-result2)

EXCEPT

Requirements:

• Same number of columns

• Same order of columns

• Same column data types

We talked about UNION and INTERSECT. Let’s consider EXCEPT

[Not supported by MySQL 5.6, 5.7 (GCP)]

[Not supported by MySQL 5.6, 5.7 (GCP)]

Page 15: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 15© Praphamontripong

Let’s Solve A ProblemUse the following schema. Find IDs and names of all customers who have purchased products sold by company 7777 only. Do not list customers who have purchased from any other companies.

Product(pid, name, cid) -- cid is foreign key to Company.cid

Company(cid, cname, city) Customer(custId, name, city)Purchase(purchase_date, pid, custId, quantity, price)

-- pid is foreign key to Product.pid, -- custId is foreign key to Customer.custId

Assume each customer may purchase the same product multiple times

How should we solve this problem?

Page 16: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 16© Praphamontripong

Let’s Solve A Problem

Set difference (–)

(sub-result1)

(sub-result2)

EXCEPT How should we solve this problem?

(Find all customers who have purchased)

(Find all customers who have purchased from other companies, not 7777)

EXCEPT

2

1

Page 17: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 17© Praphamontripong

(Find all customers who have purchased)

(Find all customers who have purchased from other companies, not 7777)

EXCEPT

– =

Use EXCEPT to Solve the Problem

(sub-result1) (sub-result2)(difference)

2

1

Page 18: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 18© Praphamontripong

Find which companies the customers have purchased.Then, find the names of the customers

(Find all customers who have purchased)

SELECT T1.custId, T2.cidFROM Purchase T1 NATURAL JOIN Product T2GROUP BY T1.custId, T2.cid

Use EXCEPT to Solve the Problem (2)

Got all customers who have purchased.

Still need to find the names of the customers

1

Page 19: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 19© Praphamontripong

Find which companies the customers have purchasedThen, find the names of the customers

(Find all customers who have purchased)

SELECT T3.custId, T3.nameFROM (SELECT T1.custId, T2.cid

FROM Purchase T1 NATURAL JOIN Product T2GROUP BY T1.custId, T2.cid) T

NATURAL JOIN Customer T3

Use EXCEPT to Solve the Problem (3)1

Page 20: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 20© Praphamontripong

Find all customers who have purchased from other companiesThen, find the names of the customers

SELECT T1.custId

FROM Purchase T1 NATURAL JOIN Product T2

WHERE T2.cid <> 7777GROUP BY T1.custId

(Find all customers who have purchased from other companies, not 7777)

Use EXCEPT to Solve the Problem (4)2

Got all customers who have not purchased from 7777.

Still need to find the names of the customers

Page 21: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 21© Praphamontripong

SELECT T3.custId, T3.name

FROM (SELECT T1.custId

FROM Purchase T1 NATURAL JOIN Product T2WHERE T2.cid <> 7777

GROUP BY T1.custId) T

NATURAL JOIN Customer T3

Use EXCEPT to Solve the Problem (5)

Find all customers who have purchased from other companiesThen, find the names of the customers

(Find all customers who have purchased from other companies, not 7777)

2

Page 22: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 22© Praphamontripong

EXCEPT

(SELECT T3.custId, T3.name

FROM (SELECT T1.custIdFROM Purchase T1 NATURAL JOIN Product T2

WHERE T2.cid <> 7777

GROUP BY T1.custId) T

NATURAL JOIN Customer T3)

(SELECT T3.custId, T3.nameFROM (SELECT T1.custId, T2.cid

FROM Purchase T1 NATURAL JOIN Product T2GROUP BY T1.custId, T2.cid) T

NATURAL JOIN Customer T3)

=

Use EXCEPT to Solve the Problem (6)

2

1

Page 23: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 23© Praphamontripong

Example: UNION

UNION

(SELECT T3.custId, T3.name

FROM (SELECT T1.custIdFROM Purchase T1 NATURAL JOIN Product T2

WHERE T2.cid <> 7777

GROUP BY T1.custId) T

NATURAL JOIN Customer T3)

(SELECT T3.custId, T3.nameFROM (SELECT T1.custId, T2.cid

FROM Purchase T1 NATURAL JOIN Product T2GROUP BY T1.custId, T2.cid) T

NATURAL JOIN Customer T3)

U

=

Page 24: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 24© Praphamontripong

Example: INTERSECT

INTERSECT

(SELECT T3.custId, T3.name

FROM (SELECT T1.custIdFROM Purchase T1 NATURAL JOIN Product T2

WHERE T2.cid <> 7777

GROUP BY T1.custId) T

NATURAL JOIN Customer T3)

(SELECT T3.custId, T3.nameFROM (SELECT T1.custId, T2.cid

FROM Purchase T1 NATURAL JOIN Product T2GROUP BY T1.custId, T2.cid) T

NATURAL JOIN Customer T3)

=

Page 25: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 25© Praphamontripong

Wrap-Up• Subqueries in SELECT, FROM• Abstract immediate result using WITH • Equivalent queries• Intro to subqueries in WHERE• Subqueries and set operations

Note:• Avoid nested queries – if aiming for speed• Be careful of semantics of nested queries

• Correlated vs. Uncorrelated

What’s next? • Subqueries in WHERE• Existential and universal quantifiers• Triggers and constraints

Page 26: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 26© Praphamontripong

More Practice / Example

Page 27: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 27© Praphamontripong

Let’s Solve A Problem

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp (refer to Assignment 3, employees.sql)

Find the employee name (or employees) with the highest salary for each job title

How should we write SQL?

(Note: The table shows sample data, not a complete set of data)

Page 28: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 28© Praphamontripong

Option 1: Self-Join

ename job salFord Analyst 3500Scott Analyst 3500Miller Clerk 1700Jones Manager 3375King President 6500Allen Salesman 2000

SELECT E1.ename, E2.job, MAX(E2.sal)FROM HW_emp AS E1, HW_emp AS E2WHERE E1.job = E2.jobGROUP BY E2.job, E1.sal, E1.enameHAVING E1.sal = MAX(E2.sal);

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

Find the employee name (or employees) with the highest salary for each job title

Page 29: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 29© Praphamontripong

Option 2: Subqueries

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

Find the employee name (or employees) with the highest salary for each job title

Find max salary for each job

Then find the employee(s) with that max salary

Page 30: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 30© Praphamontripong

Find max salary for each job

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

job maxSalAnalyst 3500Clerk 1700Manager 3375President 6500Salesman 2000

SELECT E1.job, MAX(E1.sal) AS maxSalFROM HW_emp E1GROUP BY E1.job;

Option 2: Subqueries

Page 31: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 31© Praphamontripong

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

job maxSalAnalyst 3500Clerk 1700Manager 3375President 6500Salesman 2000

JOIN(on matching attributes)

ename job salFord Analyst 3500Scott Analyst 3500Miller Clerk 1700Jones Manager 3375King President 6500Allen Salesman 2000

How should we write SQL

for this?

SELECT E1.job, MAX(E1.sal) AS maxSalFROM HW_emp E1GROUP BY E1.job;

Option 2: Subqueries

Page 32: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 32© Praphamontripong

SELECT E2.job, MAX(E2.sal) AS maxSalFROM HW_emp E2GROUP BY E2.job;

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

job maxSalAnalyst 3500Clerk 1700Manager 3375President 6500Salesman 2000

SELECT *FROM , WHERE .job = .job;

2121

SELECT * FROM HW_emp

JOIN(on matching attributes)

2

1

Option 2: Subqueries

Page 33: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 33© Praphamontripong

SELECT *FROM , WHERE .job = .job;

2121

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

job maxSalAnalyst 3500Clerk 1700Manager 3375President 6500Salesman 2000

JOIN(on matching attributes)

2

1

Option 2: Subqueries

SELECT *FROM HW_emp E1,

(SELECT E2.job, MAX(E2.sal) AS maxSalFROM HW_emp E2GROUP BY E2.job) T1

WHERE E1.job = T1.job

Page 34: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 34© Praphamontripong

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

job maxSalAnalyst 3500Clerk 1700Manager 3375President 6500Salesman 2000

JOIN(on matching attributes)

SELECT E1.ename, E1.job, E1.sal, T1.maxSalFROM HW_emp E1,

(SELECT E2.job, MAX(E2.sal) AS maxSalFROM HW_emp E2GROUP BY E2.job) T1

WHERE E1.job = T1.job

2

1

3

Option 2: Subqueries

Page 35: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 35© Praphamontripong

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

job maxSalAnalyst 3500Clerk 1700Manager 3375President 6500Salesman 2000

JOIN(on matching attributes)

2

1SELECT E2.ename, E2.job, E2.sal, T1.maxSalFROM HW_emp E2,

(SELECT E1.job, MAX(E1.sal) AS maxSalFROM HW_emp E1GROUP BY E1.job) T1

WHERE E2.job = T1.job 3

SELECT T2.ename, T2.job, T2.salFROM T2WHERE T2.sal = T1.maxSal

3

Option 2: Subqueries

Page 36: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 36© Praphamontripong

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

job maxSalAnalyst 3500Clerk 1700Manager 3375President 6500Salesman 2000

JOIN(on matching attributes)

2

1

SELECT T2.ename, T2.job, T2.sal

FROM

WHERE T2.sal = T2.maxSal

(SELECT E2.ename, E2.job, E2.sal, T1.maxSal

FROM HW_emp E2,(SELECT E1.job, MAX(E1.sal) AS maxSalFROM HW_emp E1GROUP BY E1.job) T1

WHERE E2.job = T1.job) T2

Option 2: Subqueries

Page 37: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 37© Praphamontripong

Option 3: WITH Clause

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

Find the employee name (or employees) with the highest salary for each job title

Find max salary for each job

Then find the employee(s) with that max salary

Page 38: SQL – Subqueriesup3f/cs4750/slides/4750meet15-SQL-subqueri… · 3. Use one copy to keep the original job Use one copy to keep the original job (Note: The table shows sample data,

Fall 2020 – University of Virginia 38© Praphamontripong

empno ename job sal7369 Smith Clerk 12007499 Allen Salesman 20007521 Ward Salesman 16507566 Jones Manager 33757654 Martin Salesman 16507698 Blake Manager 32507782 Clark Manager 28507788 Scott Analyst 35007839 King President 65007844 Turner Salesman 19007876 Adams Clerk 15007900 James Clerk 13507902 Ford Analyst 35007934 Miller Clerk 1700

HW_emp

job maxSalAnalyst 3500Clerk 1700Manager 3375President 6500Salesman 2000

JOIN(on matching attributes)

2

1

WITH MaxSal AS(SELECT job, MAX(sal) AS salaryFROM HW_empGROUP BY job)

SELECT E1.ename, E1.job, E1.sal FROM HW_emp AS E1, MaxSal AS AWHERE E1.job = A.job

AND E1.sal = A.salary

Option 3: WITH ClauseAbstract immediate result

using WITH clause