SQL WORKSHOP::Lecture 6

18
6 6 Subqueries

Transcript of SQL WORKSHOP::Lecture 6

Page 1: SQL WORKSHOP::Lecture 6

66

SubqueriesSubqueries

Page 2: SQL WORKSHOP::Lecture 6

6-2

ObjectivesObjectives

After completing this lesson, you should After completing this lesson, you should be able to do the following:be able to do the following:

• Describe the types of problems that subqueries can solve

• Define subqueries

• List the types of subqueries

• Write single-row and multiple-row subqueries

After completing this lesson, you should After completing this lesson, you should be able to do the following:be able to do the following:

• Describe the types of problems that subqueries can solve

• Define subqueries

• List the types of subqueries

• Write single-row and multiple-row subqueries

Page 3: SQL WORKSHOP::Lecture 6

6-3

Using a Subquery to Solve a ProblemUsing a Subquery to Solve a Problem

““Who has a salary greater than Jones’?”Who has a salary greater than Jones’?”““Who has a salary greater than Jones’?”Who has a salary greater than Jones’?”

“Which employees have a salary greater than Jones’ salary?”

Main Query

??

“What is Jones’ salary?”??

Subquery

Page 4: SQL WORKSHOP::Lecture 6

6-4

SubqueriesSubqueries

• The subquery (inner query) executes once before the main query.

• The result of the subquery is used by the main query (outer query).

• The subquery (inner query) executes once before the main query.

• The result of the subquery is used by the main query (outer query).

SELECT select_listFROM tableWHERE expr operator

(SELECT select_list FROM table);

Page 5: SQL WORKSHOP::Lecture 6

6-5

2975

SQL> SELECT ename 2 FROM emp 3 WHERE sal > 4 (SELECT sal 5 FROM emp 6 WHERE empno=7566);

Using a SubqueryUsing a Subquery

ENAME----------KINGFORDSCOTT

Page 6: SQL WORKSHOP::Lecture 6

6-6

Guidelines for Using SubqueriesGuidelines for Using Subqueries

• Enclose subqueries in parentheses.

• Place subqueries on the right side of the comparison operator.

• Do not add an ORDER BY clause to a subquery.

• Use single-row operators with single-row subqueries.

• Use multiple-row operators with multiple-row subqueries.

• Enclose subqueries in parentheses.

• Place subqueries on the right side of the comparison operator.

• Do not add an ORDER BY clause to a subquery.

• Use single-row operators with single-row subqueries.

• Use multiple-row operators with multiple-row subqueries.

Page 7: SQL WORKSHOP::Lecture 6

6-7

Types of SubqueriesTypes of Subqueries• Single-row subquery• Single-row subquery

Main query

Subquery returnsreturns

CLERKCLERK

• Multiple-row subquery• Multiple-row subquery

CLERKCLERKMANAGERMANAGER

Main query

Subquery returnsreturns

• Multiple-column subquery• Multiple-column subquery

CLERK 7900CLERK 7900MANAGER 7698MANAGER 7698

Main query

Subquery returnsreturns

Page 8: SQL WORKSHOP::Lecture 6

6-8

Single-Row SubqueriesSingle-Row Subqueries

• Return only one row

• Use single-row comparison operators

• Return only one row

• Use single-row comparison operators

Operator

=

>

>=

<

<=

<>

Meaning

Equal to

Greater than

Greater than or equal to

Less than

Less than or equal to

Not equal to

Page 9: SQL WORKSHOP::Lecture 6

6-9

Executing Single-Row SubqueriesExecuting Single-Row Subqueries

CLERK

1100

ENAME JOB---------- ---------MILLER CLERK

SQL> SELECT ename, job 2 FROM emp 3 WHERE job = 4 (SELECT job 5 FROM emp 6 WHERE empno = 7369) 7 AND sal > 8 (SELECT sal 9 FROM emp 10 WHERE empno = 7876);

Page 10: SQL WORKSHOP::Lecture 6

6-10

Using Group Functions in a Subquery

Using Group Functions in a Subquery

800

ENAME JOB SAL---------- --------- ---------SMITH CLERK 800

SQL> SELECT ename, job, sal 2 FROM emp 3 WHERE sal = 4 (SELECT MIN(sal) 5 FROM emp);

Page 11: SQL WORKSHOP::Lecture 6

6-11

HAVING Clause with SubqueriesHAVING Clause with Subqueries

• The Oracle Server executes subqueries first.

• The Oracle Server returns results into the HAVING clause of the main query.

• The Oracle Server executes subqueries first.

• The Oracle Server returns results into the HAVING clause of the main query.

800

SQL> SELECT deptno, MIN(sal) 2 FROM emp 3 GROUP BY deptno 4 HAVING MIN(sal) > 5 (SELECT MIN(sal) 6 FROM emp 7 WHERE deptno = 20);

Page 12: SQL WORKSHOP::Lecture 6

6-12

What Is Wrong with This Statement?

What Is Wrong with This Statement?

ERROR:ORA-01427: single-row subquery returns more thanone row

no rows selected

SQL> SELECT empno, ename 2 FROM emp 3 WHERE sal = 4 (SELECT MIN(sal) 5 FROM emp 6 GROUP BY deptno);

Single-row operator with

Single-row operator with

multiple-row subquery

multiple-row subquery

Page 13: SQL WORKSHOP::Lecture 6

6-13

Will This Statement Work?Will This Statement Work?

no rows selected

Subquery returns no values

Subquery returns no values

SQL> SELECT ename, job 2 FROM emp 3 WHERE job = 4 (SELECT job 5 FROMemp 6 WHERE ename='SMYTHE');

Page 14: SQL WORKSHOP::Lecture 6

6-14

Multiple-Row SubqueriesMultiple-Row Subqueries

• Return more than one row

• Use multiple-row comparison operators

• Return more than one row

• Use multiple-row comparison operators

Operator

IN

ANY

ALL

Meaning

Equal to any member in the list

Compare value to each value returned by

the subquery

Compare value to every value returned by

the subquery

Page 15: SQL WORKSHOP::Lecture 6

6-15

Using ANY Operator in Multiple-Row Subqueries

Using ANY Operator in Multiple-Row Subqueries

9508001100

1300

EMPNO ENAME JOB--------- ---------- --------- 7654 MARTIN SALESMAN 7521 WARD SALESMAN

SQL> SELECT empno, ename, job 2 FROM emp 3 WHERE sal < ANY 4 (SELECT sal 5 FROM emp 6 WHERE job = 'CLERK') 7 AND job <> 'CLERK';

Page 16: SQL WORKSHOP::Lecture 6

6-16

Using ALL Operator in Multiple-Row Subqueries

Using ALL Operator in Multiple-Row Subqueries

2916.6667

2175

1566.6667

EMPNO ENAME JOB--------- ---------- --------- 7839 KING PRESIDENT 7566 JONES MANAGER 7902 FORD ANALYST 7788 SCOTT ANALYST

SQL> SELECT empno, ename, job 2 FROM emp 3 WHERE sal > ALL 4 (SELECT avg(sal) 5 FROM emp 6 GROUP BY deptno);

Page 17: SQL WORKSHOP::Lecture 6

6-17

SummarySummary

Subqueries are useful when a query is Subqueries are useful when a query is based on unknown values.based on unknown values.Subqueries are useful when a query is Subqueries are useful when a query is based on unknown values.based on unknown values.

SELECT select_listFROM tableWHERE expr operator

(SELECT select_list FROM table);

Page 18: SQL WORKSHOP::Lecture 6

6-18

Practice OverviewPractice Overview

• Creating subqueries to query values based on unknown criteria

• Using subqueries to find out what values exist in one set of data and not in another

• Creating subqueries to query values based on unknown criteria

• Using subqueries to find out what values exist in one set of data and not in another